diff --git a/contrib/media/updf_newlib/SYSCALL/include/menuet/os.h b/contrib/media/updf_newlib/SYSCALL/include/menuet/os.h new file mode 100755 index 000000000..726d8d3f9 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/include/menuet/os.h @@ -0,0 +1,218 @@ +#ifndef __GLIBC__MENUET_OS_H +#define __GLIBC__MENUET_OS_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char __u8; +typedef unsigned short __u16; +typedef unsigned long __u32; + +#pragma pack(push,1) + +void __menuet__define_window(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize, + __u32 body_color,__u32 grab_color,__u32 frame_color); +void __menuet__window_redraw(int status); +void __menuet__putpixel(__u32 x,__u32 y,__u32 color); +int __menuet__getkey(void); +__u32 __menuet__getsystemclock(void); +void __menuet__write_text(__u16 x,__u16 y,__u32 color,char * text,int len); +void __menuet__delay100(int m); +__u32 __menuet__open(char * name,char * data); +void __menuet__save(char * name,char * data,__u32 count); +void __menuet__putimage(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,char * image); +void __menuet__make_button(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize, + int id,__u32 color); +int __menuet__get_button_id(void); +int __menuet__wait_for_event(void); +int __menuet__check_for_event(void); +void __menuet__bar(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,__u32 color); +void __menuet__sys_exit(void); +void * __menuet__exec_thread(void (* func_ptr)(void),__u32 stack_size,int * retp); +void __menuet__idle(void); + +void __menuet__exec_ramdisk(char * filename,char * args,...); +void __menuet__exec_hd(char * filename,char * args,...); + +struct process_table_entry +{ + __u32 cpu_usage; + __u16 pos_in_windowing_stack; + __u16 win_stack_val_at_ecx; + __u16 reserved1; + char name[12]; + __u32 memstart; + __u32 memused; + __u32 pid; + __u32 winx_start,winy_start; + __u32 winx_size,winy_size; + __u16 thread_state; + __u16 reserved2; + __u32 client_left,client_top,client_width,client_height; + __u8 window_state; + __u8 reserved3[1024-71]; +}; + +#define PID_WHOAMI (-1) + +int __menuet__get_process_table(struct process_table_entry * proctab,int pid); +void __menuet__get_screen_max(__u16 * x,__u16 * y); + +#define BTYPE_TILE 1 +#define BTYPE_STRETCH 2 + +void __menuet__set_background_size(__u32 xsz,__u32 ysz); +void __menuet__write_background_mem(__u32 pos,__u32 color); +void __menuet__draw_background(void); +void __menuet__set_background_draw_type(int type); +void __menuet__background_blockmove(char * src_ptr,__u32 bgr_dst,__u32 count); + +void __menuet__reset_mpu401(void); +void __menuet__write_mpu401(__u8 d); + +__u32 __menuet__get_date(void); + +void __menuet__line(__u16 x1,__u16 y1,__u16 x2,__u16 y2,__u32 color); + +void __menuet__set_bitfield_for_wanted_events(__u32 ev); + +#define EVENT_REDRAW 0x00000001 +#define EVENT_KEY 0x00000002 +#define EVENT_BUTTON 0x00000004 +#define EVENT_END_REQUEST 0x00000008 +#define EVENT_DESKTOP_BACK_DRAW 0x00000010 +#define EVENT_MOUSE_CHANGE 0x00000020 +#define EVENT_IPC 0x00000040 +#define EVENT_MOUSE_CURSOR_MASK 0x40000000 // the window does not receive mouse events if cursor outside window +#define EVENT_MOUSE_WINDOW_MASK 0x80000000 // inactive window does not receive mouse events + +__u32 __menuet__get_irq_owner(__u32 irq); +int __menuet__get_data_read_by_irq(__u32 irq,__u32 * num_bytes_in_buf,__u8 * data); +int __menuet__send_data_to_device(__u16 port,__u8 val); +void __menuet__program_irq(void * intr_table,__u32 irq_num); +int __menuet__reserve_irq(int irqno); +int __menuet__free_irq(int irqno); +int __menuet__reserve_port_area(__u32 start,__u32 end); +int __menuet__free_port_area(__u32 start,__u32 end); + + +#define NAME_LEN 512 + +#define STC_READ 0 +#define STC_WRITE 1 +#define STC_APPEND 2 + +struct systree_info +{ + __u32 command; + __u32 file_offset_low; + __u32 file_offset_high; + __u32 size; + __u32 data_pointer; + char _zero; + const char* nameptr; +}; + +struct systree_info2 +{ + __u32 command; + __u32 file_offset_low; + __u32 file_offset_high; + __u32 size; + __u32 data_pointer; + char name[NAME_LEN]; +}; + +struct bdfe_time +{ + __u8 seconds; + __u8 minutes; + __u8 hours; + __u8 reserved; +}; +struct bdfe_date +{ + __u8 day; + __u8 month; + __u16 year; +}; +struct bdfe_item +{ + __u32 attr; + __u8 nametype; + __u8 reserved[3]; + struct bdfe_time ctime; + struct bdfe_date cdate; + struct bdfe_time atime; + struct bdfe_date adate; + struct bdfe_time mtime; + struct bdfe_date mdate; + __u32 filesize_low; + __u32 filesize_high; +}; + +int __kolibri__system_tree_access(struct systree_info * info); +int __kolibri__system_tree_access2(struct systree_info2 * info); + +int __fslayer_open(char * name,int flags); +int __fslayer_close(int fd); +int __fslayer_lseek(int fd,int pos,int seek_type); +int __fslayer_tell(int fd); +int __fslayer_read(int fd,void * buffer,__u32 count); +int __fslayer_write(int fd,void * buffer,__u32 count); + +typedef struct +{ + __u8 lock; + __u8 resvd[3]; + __u32 ptr_to_fmsg_pos; + /* Below is for message */ + __u32 sender_pid; + __u32 msg_length; +} msgrcva_t /*__attribute__((packed))*/; + +void send_message(int pid,void * msg_ptr,int message_size); +void define_receive_area(msgrcva_t * rcva_ptr,int size); + +void __menuet__sound_load_block(char * blockptr); +void __menuet__sound_play_block(void); + +void __menuet__dga_get_caps(int * xres,int * yres,int * bpp,int * bpscan); + +void get_pci_version(__u8 * major,__u8 * minor); +void pci_get_last_bus(__u8 * last_bus); +void get_pci_access_mechanism(__u8 * mechanism); + +void pci_write_config_byte(__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u8 val); +void pci_write_config_word(__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u16 val); +void pci_write_config_dword(__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u32 val); +__u8 pci_read_config_byte(__u8 bus,__u8 dev,__u8 fn,__u8 reg); +__u16 pci_read_config_word(__u8 bus,__u8 dev,__u8 fn,__u8 reg); +__u32 pci_read_config_dword(__u8 bus,__u8 dev,__u8 fn,__u8 reg); + +typedef struct{ + char* name; + void* pointer; +} IMP_ENTRY; +typedef const IMP_ENTRY* IMP_TABLE; +IMP_TABLE __kolibri__cofflib_load(const char*); +__u32 __kolibri__cofflib_getproc(IMP_TABLE, const char*); +//int __kolibri__cofflib_link(FUNC*, IMP_TABLE); + +static __inline__ void __menuet__debug_out_byte(const char ch){ + __asm__ __volatile__ ("int $0x40"::"a"(63L),"b"(1L),"c"((__u8)ch)); +} +void __menuet__debug_out(const char* str); + +#define TIME_GETH(x) ((x)&0x000000FF) +#define TIME_GETM(x) ((((x)&0x00FF00)>>8)&0xFF) +#define TIME_GETS(x) ((((x)&0xFF0000)>>16)&0xFF) + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/contrib/media/updf_newlib/SYSCALL/src/Makefile b/contrib/media/updf_newlib/SYSCALL/src/Makefile new file mode 100755 index 000000000..195d54007 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/Makefile @@ -0,0 +1,22 @@ +CC = kos32-gcc +LD = kos32-ld + +SDK_DIR = $(abspath ../../../../sdk) + +CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 + +INCLUDES = -I ../include -I $(SDK_DIR)/sources/newlib/libc/include + +SYSCALL_SRC := $(notdir $(wildcard *.c)) +OBJECTS = $(patsubst %.c, %.o, $(SYSCALL_SRC)) + +default: $(patsubst %.c,%.o,$(SYSCALL_SRC)) + ar rcs libsyscall.a *.o + rm *.o + mv libsyscall.a ../../lib + +%.o : %.c Makefile $(SYSCALL_SRC) + $(CC) $(CFLAGS) $(INCLUDES) -o $@ $< + +clean: + rm *.o diff --git a/contrib/media/updf_newlib/SYSCALL/src/backgr.c b/contrib/media/updf_newlib/SYSCALL/src/backgr.c new file mode 100755 index 000000000..f9aa07fbf --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/backgr.c @@ -0,0 +1,26 @@ +#include + +void __menuet__set_background_size(__u32 xsz,__u32 ysz) +{ + __asm__ __volatile__("int $0x40"::"a"(15),"b"(1),"c"(xsz),"d"(ysz)); +} + +void __menuet__write_background_mem(__u32 pos,__u32 color) +{ + __asm__ __volatile__("int $0x40"::"a"(15),"b"(2),"c"(pos),"d"(color)); +} + +void __menuet__draw_background(void) +{ + __asm__ __volatile__("int $0x40"::"a"(15),"b"(3)); +} + +void __menuet__set_background_draw_type(int type) +{ + __asm__ __volatile__("int $0x40"::"a"(15),"b"(3),"c"(type)); +} + +void __menuet__background_blockmove(char * src_ptr,__u32 bgr_dst,__u32 count) +{ + __asm__ __volatile__("int $0x40"::"a"(15),"b"(3),"c"(src_ptr),"d"(bgr_dst),"S"(count)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/bar.c b/contrib/media/updf_newlib/SYSCALL/src/bar.c new file mode 100755 index 000000000..828ad043f --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/bar.c @@ -0,0 +1,9 @@ +#include + +void __menuet__bar(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,__u32 color) +{ + __u32 a,b; + a=(x1<<16)|xsize; + b=(y1<<16)|ysize; + __asm__ __volatile__("int $0x40"::"a"(13),"b"(a),"c"(b),"d"(color)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/button.c b/contrib/media/updf_newlib/SYSCALL/src/button.c new file mode 100755 index 000000000..25af0cfce --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/button.c @@ -0,0 +1,17 @@ +#include + +void __menuet__make_button(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize, + int id,__u32 color) +{ + __u32 a,b; + a=(x1<<16)|xsize; + b=(y1<<16)|ysize; + __asm__ __volatile__("int $0x40"::"a"(8),"b"(a),"c"(b),"d"(id),"S"(color)); +} + +int __menuet__get_button_id(void) +{ + __u16 __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(17)); + if((__ret & 0xFF)==0) return (__ret>>8)&0xFF; else return -1; +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/clock.c b/contrib/media/updf_newlib/SYSCALL/src/clock.c new file mode 100755 index 000000000..38b2e582a --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/clock.c @@ -0,0 +1,8 @@ +#include + +__u32 __menuet__getsystemclock(void) +{ + __u32 __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(3)); + return __ret; +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/cofflib.c b/contrib/media/updf_newlib/SYSCALL/src/cofflib.c new file mode 100755 index 000000000..9b3cfe553 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/cofflib.c @@ -0,0 +1,15 @@ +#include +#include +#include + +IMP_TABLE __kolibri__cofflib_load(const char* name){ + __asm__ __volatile__("int $0x40"::"a"(68L),"b"(19L),"c"((__u32)name)); +} + +__u32 __kolibri__cofflib_getproc(IMP_TABLE lib, const char* name){ + if(!name || !name[0]) return 0; + int i; + for(i = 0; lib[i].name && strcmp(name, lib[i].name); i++); + if(lib[i].name) return (__u32)lib[i].pointer; + else return 0; +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/date.c b/contrib/media/updf_newlib/SYSCALL/src/date.c new file mode 100755 index 000000000..a2ca956fd --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/date.c @@ -0,0 +1,8 @@ +#include + +__u32 __menuet__get_date(void) +{ + __u32 __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(29)); + return __ret; +} \ No newline at end of file diff --git a/contrib/media/updf_newlib/SYSCALL/src/debug.c b/contrib/media/updf_newlib/SYSCALL/src/debug.c new file mode 100755 index 000000000..d3916bb8a --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/debug.c @@ -0,0 +1,5 @@ +#include +void __menuet__debug_out(const char* str){ + while(*str) + __menuet__debug_out_byte(*str++); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/delay.c b/contrib/media/updf_newlib/SYSCALL/src/delay.c new file mode 100755 index 000000000..91365b248 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/delay.c @@ -0,0 +1,11 @@ +#include + +void __menuet__delay100(int m) +{ + __asm__ __volatile__("int $0x40"::"a"(5),"b"(m)); +} + +void __menuet__idle(void) +{ + __menuet__delay100(10); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/dga.c b/contrib/media/updf_newlib/SYSCALL/src/dga.c new file mode 100755 index 000000000..7b1386d42 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/dga.c @@ -0,0 +1,19 @@ +#include + +void __menuet__dga_get_caps(int * xres,int * yres,int * bpp,int * bpscan) +{ + int p; + __asm__ __volatile__("int $0x40":"=a"(p):"0"(61),"b"(1)); + if(xres) *xres=(p>>16)&0xFFFF; + if(yres) *yres=p & 0xFFFF; + if(bpp) + { + __asm__ __volatile__("int $0x40":"=a"(p):"0"(61),"b"(2)); + *bpp=p; + } + if(bpscan) + { + __asm__ __volatile__("int $0x40":"=a"(p):"0"(61),"b"(3)); + *bpscan=p; + } +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/event.c b/contrib/media/updf_newlib/SYSCALL/src/event.c new file mode 100755 index 000000000..f5c8fc5f0 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/event.c @@ -0,0 +1,20 @@ +#include + +int __menuet__wait_for_event(void) +{ + __u32 __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(10)); + return __ret; +} + +int __menuet__check_for_event(void) +{ + __u32 __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(11)); + return __ret; +} + +void __menuet__set_bitfield_for_wanted_events(__u32 ev) +{ + __asm__ __volatile__("int $0x40"::"a"(40),"b"(ev)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/exit.c b/contrib/media/updf_newlib/SYSCALL/src/exit.c new file mode 100755 index 000000000..e893e5bf4 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/exit.c @@ -0,0 +1,6 @@ +#include + +void __menuet__sys_exit(void) +{ + __asm__ __volatile__("int $0x40"::"a"(0xFFFFFFFF)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/file.c b/contrib/media/updf_newlib/SYSCALL/src/file.c new file mode 100755 index 000000000..e6e462ebf --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/file.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +__u32 __menuet__open(char * name,char * data) +{ + __u32 __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(6),"b"((__u32)name),"c"(0),"d"(0xFFFFFFFF),"S"((__u32)data)); + return __ret; +} + +void __menuet__save(char * name,char * data,__u32 count) +{ + __asm__ __volatile__("int $0x40"::"a"(33),"b"((__u32)name),"c"((__u32)data),"d"(count),"S"(0)); +} + +void __menuet__exec_ramdisk(char * filename,char * args,...) +{ + va_list argz; + char buffer[1024]; + memset(buffer,0,1024); + if(args) + { + va_start(argz,args); + vsprintf(buffer,args,argz); + } + va_end(argz); + __asm__ __volatile__("int $0x40"::"a"(19),"b"(filename),"c"((args ? buffer : NULL))); +} + +void __menuet__exec_hd(char * filename,char * args,...) +{ + va_list argz; + char buffer[1024]; + char work_area[0xFFFF]; + memset(buffer,0,1024); + if(args) + { + va_start(argz,args); + vsprintf(buffer,args,argz); + } + va_end(argz); + __asm__ __volatile__("int $0x40"::"a"(19),"b"(filename),"c"(args ? buffer : NULL),"d"(work_area)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/image.c b/contrib/media/updf_newlib/SYSCALL/src/image.c new file mode 100755 index 000000000..5f7daa131 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/image.c @@ -0,0 +1,9 @@ +#include + +void __menuet__putimage(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,char * image) +{ + __u32 a,b; + a=(xsize<<16)|ysize; + b=(x1<<16)|y1; + __asm__ __volatile__("int $0x40"::"a"(7),"b"(image),"c"(a),"d"(b)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/ipc.c b/contrib/media/updf_newlib/SYSCALL/src/ipc.c new file mode 100755 index 000000000..1cd818d82 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/ipc.c @@ -0,0 +1,11 @@ +#include + +void send_message(int pid,void * msg_ptr,int message_size) +{ + __asm__ __volatile__("int $0x40"::"a"(60),"b"(2),"c"(pid),"d"(msg_ptr),"S"(message_size)); +} + +void define_receive_area(msgrcva_t * rcva_ptr,int size) +{ + __asm__ __volatile__("int $0x40"::"a"(60),"b"(1),"c"(rcva_ptr),"d"(size)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/irq.c b/contrib/media/updf_newlib/SYSCALL/src/irq.c new file mode 100755 index 000000000..372322501 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/irq.c @@ -0,0 +1,62 @@ +#include + +__u32 __menuet__get_irq_owner(__u32 irq) +{ + __u32 __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(41),"b"(irq)); + return __ret; +} + +int __menuet__get_data_read_by_irq(__u32 irq,__u32 * num_bytes_in_buf,__u8 * data) +{ + __u32 a,b,c; + __asm__ __volatile__("int $0x40":"=a"(a),"=b"(b),"=c"(c):"0"(42),"1"(irq)); + if(num_bytes_in_buf) *num_bytes_in_buf=a; + if(data) *data=b & 0xFF; + return c; +} + +int __menuet__send_data_to_device(__u16 port,__u8 val) +{ + int __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(43),"b"(port),"c"(val)); + return __ret; +} + +void __menuet__program_irq(void * intr_table,__u32 irq_num) +{ + __asm__ __volatile__("int $0x40"::"a"(44),"b"(intr_table),"c"(irq_num)); +} + +int __menuet__reserve_irq(int irqno) +{ + int __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(45),"b"(0),"c"(irqno)); + return __ret; +} + +int __menuet__free_irq(int irqno) +{ + int __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(45),"b"(1),"c"(irqno)); + return __ret; +} + +int __menuet__reserve_port_area(__u32 start,__u32 end) +{ + int __ret; + __asm__("int $0x40":"=a"(__ret):"a"(45),"b"(0),"c"(start),"d"(end)); + return __ret; +} + +int __menuet__free_port_area(__u32 start,__u32 end) +{ + int __ret; + __asm__("int $0x40":"=a"(__ret):"a"(45),"b"(1),"c"(start),"d"(end)); + return __ret; +} + +void __menuet__define_app_internal_intrs(void * intr_table) +{ + __asm__("int $0x40"::"a"(49),"b"(0),"c"(intr_table)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/keyb.c b/contrib/media/updf_newlib/SYSCALL/src/keyb.c new file mode 100755 index 000000000..10f05b4ba --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/keyb.c @@ -0,0 +1,8 @@ +#include + +int __menuet__getkey(void) +{ + __u16 __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(2)); + if(!(__ret & 0xFF)) return (__ret>>8)&0xFF; else return 0; +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/line.c b/contrib/media/updf_newlib/SYSCALL/src/line.c new file mode 100755 index 000000000..d5aff6b36 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/line.c @@ -0,0 +1,9 @@ +#include + +void __menuet__line(__u16 x1,__u16 y1,__u16 x2,__u16 y2,__u32 color) +{ + __u32 b,c; + b=(x1<<16)|x1; + c=(y1<<16)|y2; + __asm__ __volatile__("int $0x40"::"a"(38),"b"(b),"c"(c),"d"(color)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/mpu401.c b/contrib/media/updf_newlib/SYSCALL/src/mpu401.c new file mode 100755 index 000000000..14a25ab48 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/mpu401.c @@ -0,0 +1,11 @@ +#include + +void __menuet__reset_mpu401(void) +{ + __asm__ __volatile__("int $0x40"::"a"(20),"b"(1)); +} + +void __menuet__write_mpu401(__u8 d) +{ + __asm__ __volatile__("int $0x40"::"a"(20),"b"(2),"c"(d)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/param.c b/contrib/media/updf_newlib/SYSCALL/src/param.c new file mode 100755 index 000000000..18de968c9 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/param.c @@ -0,0 +1,7 @@ +#include + +#define APP_PARAM_SZ (1024) +#define APP_PATH_SZ (1024) + +char __menuet__app_param_area[APP_PARAM_SZ]; +char __menuet__app_path_area[APP_PATH_SZ]; diff --git a/contrib/media/updf_newlib/SYSCALL/src/pci.c b/contrib/media/updf_newlib/SYSCALL/src/pci.c new file mode 100755 index 000000000..13c9e8bf7 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/pci.c @@ -0,0 +1,50 @@ +#include + +#define PCI_FN 62 + +void get_pci_version(__u8 * major,__u8 * minor) +{ + int r; + __asm__ __volatile__("int $0x40":"=a"(r):"0"(PCI_FN),"b"(0)); + *minor=r&0xFF; + *major=(r>>8)&0xFF; +} + +void pci_get_last_bus(__u8 * last_bus) +{ + __asm__ __volatile__("int $0x40":"=a"(*last_bus):"0"(PCI_FN),"b"(1)); +} + +void get_pci_access_mechanism(__u8 * mechanism) +{ + __asm__ __volatile__("int $0x40":"=a"(*mechanism):"0"(PCI_FN),"b"(2)); +} + +#define read_config(x,c,bits) \ + __u##bits pci_read_config_##x (__u8 bus,__u8 dev,__u8 fn,__u8 reg) \ + { \ + __u##bits __ret; \ + __u16 cx; \ + __u16 bx; \ + cx=(((fn&7)|(((dev)&~7)<<3))<<8)|reg; \ + bx=(bus<<8)|(c); \ + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(PCI_FN),"b"(bx),"c"(cx)); \ + return __ret; \ + } + +#define write_config(x,c,bits) \ + void pci_write_config_##x (__u8 bus,__u8 dev,__u8 fn,__u8 reg,__u##bits val) \ + { \ + __u16 cx,bx; \ + cx=(((fn&7)|(((dev)&~7)<<3))<<8)|reg; \ + bx=(bus<<8)|(c); \ + __asm__ __volatile__("int $0x40"::"a"(PCI_FN),"b"(bx),"c"(cx),"d"(val)); \ + } + +#define rw_config(x,c,bits) \ + read_config(x,4+c,bits) \ + write_config(x,7+c,bits) + +rw_config(byte,0,8) +rw_config(word,1,16) +rw_config(dword,2,32) diff --git a/contrib/media/updf_newlib/SYSCALL/src/pixel.c b/contrib/media/updf_newlib/SYSCALL/src/pixel.c new file mode 100755 index 000000000..ed7d34f02 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/pixel.c @@ -0,0 +1,6 @@ +#include + +void __menuet__putpixel(__u32 x,__u32 y,__u32 color) +{ + __asm__ __volatile__("int $0x40"::"a"(1),"b"(x),"c"(y),"d"(color)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/process.c b/contrib/media/updf_newlib/SYSCALL/src/process.c new file mode 100755 index 000000000..98bb31099 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/process.c @@ -0,0 +1,8 @@ +#include + +int __menuet__get_process_table(struct process_table_entry * proctab,int pid) +{ + int __ret; + __asm__ __volatile__("int $0x40":"=a"(__ret):"0"(9),"b"((__u32)proctab),"c"(pid)); + return __ret; +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/screen.c b/contrib/media/updf_newlib/SYSCALL/src/screen.c new file mode 100755 index 000000000..8d3e30c8c --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/screen.c @@ -0,0 +1,9 @@ +#include + +void __menuet__get_screen_max(__u16 * x,__u16 * y) +{ + __u32 v; + __asm__ __volatile__("int $0x40":"=a"(v):"0"(14)); + if(x) *x=v>>16; + if(y) *y=v & 0xFFFF; +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/sound.c b/contrib/media/updf_newlib/SYSCALL/src/sound.c new file mode 100755 index 000000000..2fee9b156 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/sound.c @@ -0,0 +1,11 @@ +#include + +void __menuet__sound_load_block(char * blockptr) +{ + __asm__ __volatile__("int $0x40"::"a"(55),"b"(0),"c"(blockptr)); +} + +void __menuet__sound_play_block(void) +{ + __asm__ __volatile__("int $0x40"::"a"(55),"b"(1)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/systree.c b/contrib/media/updf_newlib/SYSCALL/src/systree.c new file mode 100755 index 000000000..77411a5e4 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/systree.c @@ -0,0 +1,16 @@ +#include + +int __kolibri__system_tree_access(struct systree_info * info) +{ + int __ret; + int d0; + __asm__ __volatile__("int $0x40":"=a"(__ret),"=&b"(d0):"0"(70),"1"((__u32)info)); + return __ret; +} +int __kolibri__system_tree_access2(struct systree_info2 * info) +{ + int __ret; + int d0; + __asm__ __volatile__("int $0x40":"=a"(__ret),"=&b"(d0):"0"(70),"1"((__u32)info)); + return __ret; +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/text.c b/contrib/media/updf_newlib/SYSCALL/src/text.c new file mode 100755 index 000000000..7769d8888 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/text.c @@ -0,0 +1,6 @@ +#include + +void __menuet__write_text(__u16 x,__u16 y,__u32 color,char * text,int len) +{ + __asm__ __volatile__("int $0x40"::"a"(4),"b"((x<<16)|y),"c"(color),"d"((__u32)text),"S"(len)); +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/thread.c b/contrib/media/updf_newlib/SYSCALL/src/thread.c new file mode 100755 index 000000000..cf15b66f8 --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/thread.c @@ -0,0 +1,12 @@ +#include +#include +#include + +void * __menuet__exec_thread(void (* func_ptr)(void),__u32 stack_size,int * retp) +{ + void * __stk, * __ret; + __ret=__stk=malloc(stack_size); + __stk+=stack_size-1; + __asm__ __volatile__("int $0x40":"=a"(*retp):"0"(51L),"b"(1L),"c"((__u32)func_ptr),"d"((__u32)__stk)); + return __ret; +} diff --git a/contrib/media/updf_newlib/SYSCALL/src/window.c b/contrib/media/updf_newlib/SYSCALL/src/window.c new file mode 100755 index 000000000..5ab0db8db --- /dev/null +++ b/contrib/media/updf_newlib/SYSCALL/src/window.c @@ -0,0 +1,16 @@ +#include + +void __menuet__define_window(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize, + __u32 body_color,__u32 grab_color,__u32 frame_color) +{ + __u32 a,b; + a=(x1<<16)|xsize; + b=(y1<<16)|ysize; + __asm__ __volatile__("int $0x40"::"a"(0),"b"(a),"c"(b),"d"(body_color),"S"(grab_color), + "D"(frame_color)); +} + +void __menuet__window_redraw(int status) +{ + __asm__ __volatile__("int $0x40"::"a"(12),"b"(status)); +} diff --git a/contrib/media/updf_newlib/apps/Makefile b/contrib/media/updf_newlib/apps/Makefile new file mode 100755 index 000000000..346ae6247 --- /dev/null +++ b/contrib/media/updf_newlib/apps/Makefile @@ -0,0 +1,21 @@ +CC = kos32-gcc +LD = kos32-ld + +SDK_DIR = $(abspath ../../../sdk) +LDFLAGS = -static -nostdlib -T $(SDK_DIR)/sources/newlib/app.lds --image-base 0 + +CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 + +INCLUDES = -I ../SYSCALL/include -I $(SDK_DIR)/sources/newlib/libc/include -I $(SDK_DIR)/sources/freetype/include -I $(SDK_DIR)/sources/zlib -I ../include -I ../fitz -I ../pdf +LIBPATH = -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib -L ../lib + +APPS_SRC := $(notdir $(wildcard *.c)) +OBJECTS = $(patsubst %.c, %.o, $(APPS_SRC)) + +default: $(patsubst %.c,%.o,$(APPS_SRC)) + $(LD) $(LDFLAGS) $(LIBPATH) -o mupdf $(OBJECTS) -lmupdf -lfreetype -lfitz -lgcc -lfitz -ldraw -ljpeg -ljbig2dec -lfreetype -lc.dll -lopenjpeg -lz -lc -lsyscall --subsystem native + objcopy mupdf -O binary + + +%.o : %.c Makefile $(APPS_SRC) + $(CC) $(CFLAGS) $(INCLUDES) -o $@ $< diff --git a/contrib/media/updf_newlib/apps/icons/allbtns.h b/contrib/media/updf_newlib/apps/icons/allbtns.h new file mode 100755 index 000000000..8f457b0d0 --- /dev/null +++ b/contrib/media/updf_newlib/apps/icons/allbtns.h @@ -0,0 +1,940 @@ +// 26x144 + +unsigned char toolbar_image[14976] = { + 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, + 0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA5, 0xA5, 0xA5, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, 0xB0, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, 0xB0, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xA5, 0xA5, + 0xA5, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA5, 0xA5, 0xA5, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xA5, 0xA5, 0xA5, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5, + 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, + 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, + 0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x98, 0x98, 0x98, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x98, 0x98, 0x98, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEC, 0xEC, 0xEC, 0x87, 0x87, + 0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xB1, 0xB1, 0xB1, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, + 0xB1, 0xB1, 0xB1, 0x87, 0x87, 0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xEC, 0xEC, 0xEC, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEC, 0xEC, 0xEC, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xC2, + 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xEC, 0xEC, 0xEC, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0x87, 0x87, 0x87, 0x76, 0x76, 0x76, 0xDB, 0xDB, 0xDB, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xDB, 0xDB, 0xDB, 0x76, 0x76, 0x76, 0x87, 0x87, 0x87, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, + 0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F, + 0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86, 0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, + 0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0, 0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3, + 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0xF3, 0xF3, 0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3, 0xF3, 0xF3, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, + 0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, 0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0, + 0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F, 0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86, + 0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1, 0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1, + 0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0x86, 0x86, 0x86, 0x75, 0x75, 0x75, 0xD9, 0xD9, 0xD9, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xD9, 0xD9, 0xD9, 0x75, 0x75, 0x75, 0x86, 0x86, 0x86, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xEA, 0xEA, 0xEA, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0, + 0xC0, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xEA, 0xEA, 0xEA, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xEA, 0xEA, 0xEA, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86, 0x86, 0x86, 0xAF, 0xAF, 0xAF, + 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xAF, 0xAF, 0xAF, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86, + 0x86, 0x86, 0xEA, 0xEA, 0xEA, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0, 0xC0, 0x97, 0x97, 0x97, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, + 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x97, 0x97, 0x97, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5, + 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, + 0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x98, 0x98, 0x98, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x98, 0x98, 0x98, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEC, 0xEC, 0xEC, 0x87, 0x87, + 0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xB1, 0xB1, 0xB1, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, + 0xB1, 0xB1, 0xB1, 0x87, 0x87, 0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xEC, 0xEC, 0xEC, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEC, 0xEC, 0xEC, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xC2, + 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xEC, 0xEC, 0xEC, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0x87, 0x87, 0x87, 0x76, 0x76, 0x76, 0xDB, 0xDB, 0xDB, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xDB, 0xDB, 0xDB, 0x76, 0x76, 0x76, 0x87, 0x87, 0x87, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, + 0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F, + 0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86, 0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, + 0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0, 0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3, + 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0xF3, 0xF3, 0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3, 0xF3, 0xF3, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, + 0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, 0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0, + 0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F, 0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86, + 0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1, 0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1, + 0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0x86, 0x86, 0x86, 0x75, 0x75, 0x75, 0xD9, 0xD9, 0xD9, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xD9, 0xD9, 0xD9, 0x75, 0x75, 0x75, 0x86, 0x86, 0x86, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xEA, 0xEA, 0xEA, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0, + 0xC0, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xEA, 0xEA, 0xEA, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xEA, 0xEA, 0xEA, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86, 0x86, 0x86, 0xAF, 0xAF, 0xAF, + 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xAF, 0xAF, 0xAF, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86, + 0x86, 0x86, 0xEA, 0xEA, 0xEA, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0, 0xC0, 0x97, 0x97, 0x97, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, + 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x97, 0x97, 0x97, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5, + 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, + 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, + 0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x98, 0x98, 0x98, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x98, 0x98, 0x98, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x87, 0x87, + 0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xB1, 0xB1, 0xB1, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, + 0xB1, 0xB1, 0xB1, 0x87, 0x87, 0x87, 0x6E, 0x6E, 0x6E, 0x87, 0x87, 0x87, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xC2, + 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0x87, 0x87, 0x87, 0x76, 0x76, 0x76, 0xDB, 0xDB, 0xDB, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xDB, 0xDB, 0xDB, 0x76, 0x76, 0x76, 0x87, 0x87, 0x87, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, + 0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0x8F, 0x8F, 0x8F, 0x87, 0x87, 0x87, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xC2, 0xC2, 0xC2, 0x6E, 0x6E, 0x6E, 0xC2, 0xC2, 0xC2, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F, + 0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86, 0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, + 0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0, 0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, + 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xC9, 0xC9, 0xC9, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, + 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xC9, 0xC9, 0xC9, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0xB0, 0xB0, 0xB0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xB0, + 0xB0, 0xB0, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0x8F, 0x8F, 0x8F, 0x86, 0x86, 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x86, 0x86, 0x86, + 0x8F, 0x8F, 0x8F, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1, 0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xC1, 0xC1, 0xC1, 0x6E, 0x6E, 0x6E, 0xC1, 0xC1, + 0xC1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0x86, 0x86, 0x86, 0x75, 0x75, 0x75, 0xD9, 0xD9, 0xD9, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xD9, 0xD9, 0xD9, 0x75, 0x75, 0x75, 0x86, 0x86, 0x86, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0, + 0xC0, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86, 0x86, 0x86, 0xAF, 0xAF, 0xAF, + 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xAF, 0xAF, 0xAF, 0x86, 0x86, 0x86, 0x6D, 0x6D, 0x6D, 0x86, + 0x86, 0x86, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xC0, 0xC0, 0xC0, 0x97, 0x97, 0x97, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, + 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x97, 0x97, 0x97, 0xC0, 0xC0, 0xC0, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5, + 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, + 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, + 0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA7, 0xA7, 0xA7, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0x94, 0x94, 0x94, 0x67, 0x67, 0x67, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEF, 0xEF, 0xEF, 0x83, 0x83, 0x83, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xE1, 0xE1, 0xE1, 0x77, 0x77, 0x77, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x72, 0x72, 0x72, 0x8C, 0x8C, 0x8C, 0xB7, 0xB7, 0xB7, 0xED, 0xED, + 0xED, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xD1, 0xD1, + 0xD1, 0x6F, 0x6F, 0x6F, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x6A, 0x6A, 0x6A, 0xAD, + 0xAD, 0xAD, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xBD, 0xBD, 0xBD, 0x68, 0x68, 0x68, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x8E, 0x8E, 0x8E, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xBD, 0xBD, 0xBD, 0x68, 0x68, 0x68, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0xA2, 0xA2, 0xA2, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xD1, 0xD1, 0xD1, 0x6F, 0x6F, 0x6F, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0xE3, 0xE3, 0xE3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xE1, 0xE1, 0xE1, 0x77, 0x77, 0x77, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0xAB, 0xAB, 0xAB, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0x83, 0x83, 0x83, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0xD1, 0xD1, 0xD1, 0x9A, 0x9A, 0x9A, 0x67, 0x67, 0x67, 0x86, 0x86, + 0x86, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x94, 0x94, + 0x94, 0x67, 0x67, 0x67, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xB9, 0xB9, 0xB9, 0x71, 0x71, 0x71, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA7, + 0xA7, 0xA7, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x8B, 0x8B, 0x8B, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5, + 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, + 0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA7, 0xA7, + 0xA7, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x67, 0x67, 0x67, 0x94, + 0x94, 0x94, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x83, 0x83, 0x83, 0xEF, 0xEF, 0xEF, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xED, 0xED, 0xED, 0xB7, 0xB7, 0xB7, 0x8C, + 0x8C, 0x8C, 0x72, 0x72, 0x72, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x77, 0x77, 0x77, 0xE1, 0xE1, 0xE1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xAD, 0xAD, 0xAD, 0x6A, 0x6A, 0x6A, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x6F, 0x6F, 0x6F, 0xD1, 0xD1, 0xD1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x8E, + 0x8E, 0x8E, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0xBD, 0xBD, 0xBD, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA2, 0xA2, 0xA2, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x68, 0x68, 0x68, 0xBD, 0xBD, 0xBD, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xE3, 0xE3, 0xE3, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x6F, 0x6F, 0x6F, 0xD1, + 0xD1, 0xD1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xAB, 0xAB, 0xAB, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x77, 0x77, 0x77, 0xE1, 0xE1, 0xE1, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0x86, 0x86, 0x86, 0x67, 0x67, 0x67, 0x9A, 0x9A, 0x9A, 0xD1, 0xD1, 0xD1, 0xEF, 0xEF, 0xEF, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x83, 0x83, 0x83, 0xEF, 0xEF, 0xEF, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x71, + 0x71, 0x71, 0xB9, 0xB9, 0xB9, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x67, 0x67, 0x67, 0x94, 0x94, 0x94, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0x8B, 0x8B, 0x8B, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA7, 0xA7, 0xA7, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5, + 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, + 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, + 0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEF, 0xEF, + 0xEF, 0xA0, 0xA0, 0xA0, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, + 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x8E, + 0x8E, 0x8E, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEF, 0xEF, 0xEF, 0x73, + 0x73, 0x73, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x83, 0x83, 0x83, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x83, 0x83, 0x83, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x83, 0x83, 0x83, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xDC, 0xDC, 0xDC, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xDC, 0xDC, 0xDC, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, + 0xBE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xBE, 0xBE, 0xBE, + 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xF5, 0xF5, 0xF5, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF5, 0xF5, 0xF5, 0x81, 0x81, 0x81, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0xB4, 0xB4, 0xB4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF5, 0xF5, 0xF5, 0x77, 0x77, 0x77, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xA0, 0xA0, 0xA0, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF5, 0xF5, 0xF5, 0x73, 0x73, 0x73, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x97, 0x97, 0x97, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF4, 0xF4, 0xF4, 0x6E, 0x6E, 0x6E, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x8A, 0x8A, 0x8A, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xEC, 0xEC, 0xEC, 0x6C, 0x6C, 0x6C, 0x81, 0x81, 0x81, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xD8, 0xD8, 0xD8, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5, + 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2, 0xA5, 0xA5, + 0xA5, 0xEE, 0xEE, 0xEE, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEE, 0xEE, 0xEE, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x8E, 0x8E, 0x8E, 0x79, 0x79, 0x79, 0x79, 0x79, + 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, + 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x9C, 0x9C, 0x9C, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x83, 0x83, 0x83, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x73, 0x73, 0x73, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x83, 0x83, 0x83, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0x83, 0x83, 0x83, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, + 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xF4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xDA, 0xDA, 0xDA, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xEF, 0xEF, 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xEF, 0xEF, + 0xEF, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xEF, 0xEF, 0xEF, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xEB, 0xEB, 0xEB, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, + 0xBE, 0xBE, 0xF5, 0xF5, 0xF5, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF5, + 0xF5, 0xF5, 0x81, 0x81, 0x81, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xB4, 0xB4, 0xB4, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF5, 0xF5, 0xF5, 0x77, 0x77, 0x77, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xA0, 0xA0, 0xA0, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF5, 0xF5, 0xF5, 0x73, 0x73, 0x73, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6C, 0x6C, 0x6C, 0x97, 0x97, 0x97, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF4, 0xF4, 0xF4, 0x6E, 0x6E, 0x6E, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x8A, 0x8A, + 0x8A, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xEC, 0xEC, 0xEC, 0x6C, 0x6C, 0x6C, 0x81, 0x81, 0x81, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xD8, 0xD8, 0xD8, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, + 0xF2, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xE9, 0xE9, 0xE9, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, + 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xEC, 0xE9, 0xE9, 0xE9, 0xA5, + 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA5, 0xA5, 0xA5, 0xC2, 0xC2, 0xC2 +}; \ No newline at end of file diff --git a/contrib/media/updf_newlib/apps/kolibri.c b/contrib/media/updf_newlib/apps/kolibri.c new file mode 100755 index 000000000..47583f8b6 --- /dev/null +++ b/contrib/media/updf_newlib/apps/kolibri.c @@ -0,0 +1,485 @@ +#include "kolibri.h" +#include "string.h" + + +extern char KOL_PATH[256]; +extern char KOL_PARAM[256]; +extern char KOL_DIR[256]; + + +void kol_exit() +{ +asm volatile ("int $0x40"::"a"(-1)); +} + + +void kol_sleep(unsigned d) +{ +asm volatile ("int $0x40"::"a"(5), "b"(d)); +} + + +// define a window +// x, y - position; w, h - size; cs - color and style; c - caption; b - boder +void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned cs, unsigned b, char *t) +{ +asm volatile ("int $0x40"::"a"(0), "b"(x*65536+w), "c"(y*65536+h), "d"(cs), "D"(t), "S"(b) ); +} + + +void kol_wnd_move(unsigned x, unsigned y) +{ +asm volatile ("int $0x40"::"a"(67), "b"(x), "c"(y), "d"(-1), "S"(-1)); +} + + +void kol_event_mask(unsigned e) +{ +asm volatile ("int $0x40"::"a"(40), "b"(e)); +} + + +unsigned kol_event_wait() +{ +asm volatile ("int $0x40"::"a"(10)); +} + + +unsigned kol_event_wait_time(unsigned time) +{ +asm volatile ("int $0x40"::"a"(23), "b"(time)); +} + + +unsigned kol_event_check() +{ +asm volatile ("int $0x40"::"a"(11)); +} + + +inline void __attribute__((__always_inline__)) kol_paint_start() +{ +asm volatile ("int $0x40"::"a"(12), "b"(1)); +} + + +inline void __attribute__((__always_inline__)) kol_paint_end() +{ +asm volatile ("int $0x40"::"a"(12), "b"(2)); +} + + +void kol_paint_pixel(unsigned x, unsigned y, unsigned c) +{ +asm volatile ("int $0x40"::"a"(1), "b"(x), "c"(y), "d"(c)); +} + + +void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c) +{ +asm volatile ("int $0x40"::"a"(13), "b"(x*65536+w), "c"(y*65536+h), "d"(c)); +} + + +void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c) +{ +asm volatile ("int $0x40"::"a"(38), "b"(x1*65536+x2), "c"(y1*65536+y2), "d"(c)); +} + + +void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c) +{ +asm volatile ("int $0x40"::"a"(4), "b"(x*65536+y), "c"(c), "d"(s)); +} + + +void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d) +{ +asm volatile ("int $0x40"::"a"(7), "c"(w*65536+h), "d"(x*65536+y), "b"(d)); +} + + +void kol_paint_image_24(unsigned x, unsigned y, unsigned w, unsigned h, char *d) +{ +asm volatile ("int $0x40"::"a"(65), "b"(d), "c"(w*65536+h), "d"(x*65536+y), "S"(32)); +} + + +unsigned kol_key_get() +{ +asm volatile ("int $0x40"::"a"(2)); +} + + +unsigned kol_key_control() +{ +asm volatile ("int $0x40"::"a"(66), "b"(3)); +} + + +void kol_key_lang_set(unsigned lang) +{ +asm volatile ("int $0x40"::"a"(21), "b"(2), "c"(9), "d"(lang)); +} + + +unsigned kol_key_lang_get() +{ +asm volatile ("int $0x40"::"a"(26), "b"(2), "c"(9)); +} + + +void kol_key_mode_set(unsigned mode) +{ +asm volatile ("int $0x40"::"a"(66), "b"(1), "c"(mode)); +} + + +unsigned kol_key_mode_get() +{ +asm volatile ("int $0x40"::"a"(66), "b"(2)); +} + + +unsigned kol_btn_get() +{ +asm volatile ("int $0x40"::"a"(17)); +} + + +void kol_btn_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned d, unsigned c) +{ +asm volatile ("int $0x40"::"a"(8), "b"(x*65536+w), "c"(y*65536+h), "d"(d), "S"(c)); +} + + +void kol_btn_type(unsigned t) +{ +asm volatile ("int $0x40"::"a"(48), "b"(1), "c"(t)); +} + + +void kol_wnd_caption(char *s) +{ +asm volatile ("int $0x40"::"a"(71), "b"(1), "c"(s)); +} + + +unsigned kol_mouse_pos() +{ +asm volatile ("int $0x40"::"a"(37), "b"(0)); +} + + +unsigned kol_mouse_posw() +{ +asm volatile ("int $0x40"::"a"(37), "b"(1)); +} + + +unsigned kol_mouse_btn() +{ +asm volatile ("int $0x40"::"a"(37), "b"(2)); +} + + +void kol_board_putc(char c) +{ +asm volatile ("int $0x40"::"a"(63), "b"(1), "c"(c)); +} + + +void kol_board_puts(char *s) +{ +unsigned i; +i = 0; +while (*(s+i)) + { + asm volatile ("int $0x40"::"a"(63), "b"(1), "c"(*(s+i))); + i++; + } +} + + +void kol_board_puti(int n) +{ +char c; + +if ( n > 1 ) + kol_board_puti(n / 10); + +c = n % 10 + '0'; +asm volatile ("int $0x40"::"a"(63), "b"(1), "c"(c)); + +} + + +int kol_file_70(kol_struct70 *k) +{ +asm volatile ("int $0x40"::"a"(70), "b"(k)); +} + + +kol_struct_import* kol_cofflib_load(char *name) +{ +asm volatile ("int $0x40"::"a"(68), "b"(19), "c"(name)); +} + + +void* kol_cofflib_procload (kol_struct_import *imp, char *name) +{ +int i; +for (i=0;;i++) + if ( NULL == ((imp+i) -> name)) + break; + else + if ( 0 == strcmp(name, (imp+i)->name) ) + return (imp+i)->data; +return NULL; +} + + +unsigned kol_cofflib_procnum (kol_struct_import *imp) +{ +unsigned i, n; + +for (i=n=0;;i++) + if ( NULL == ((imp+i) -> name)) + break; + else + n++; + +return n; +} + + +void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n) +{ +unsigned i; +*name = 0; + +for (i=0;;i++) + if ( NULL == ((imp+i) -> name)) + break; + else + if ( i == n ) + { + strcpy(name, ((imp+i)->name)); + break; + } + +} + + +unsigned kol_system_cpufreq() +{ +asm volatile ("int $0x40"::"a"(18), "b"(5)); +} + + +unsigned kol_system_mem() +{ +asm volatile ("int $0x40"::"a"(18), "b"(17)); +} + + +unsigned kol_system_memfree() +{ +asm volatile ("int $0x40"::"a"(18), "b"(16)); +} + + +unsigned kol_system_time_get() +{ +asm volatile ("int $0x40"::"a"(3)); +} + + +unsigned kol_system_date_get() +{ +asm volatile ("int $0x40"::"a"(29)); +} + + +unsigned kol_system_end(unsigned param) +{ +asm volatile ("int $0x40"::"a"(18), "b"(9), "c"(param)); +} + + +void kol_path_file2dir(char *dir, char *fname) +{ +unsigned i; +strcpy (dir, fname); +for ( i = strlen(dir);; --i) + if ( '/' == dir[i]) + { + dir[i] = '\0'; + return; + } +} + + +void kol_path_full(char *full, char *fname) +{ +char temp[256]; + +switch (*fname) + { + + case '/': + strncpy(temp, fname+1, 2); + temp[2]=0; + if ( (!strcmp("rd", temp)) || (!strcmp("hd", temp)) || (!strcmp("cd", temp)) ) + strcpy (full, fname); + break; + + case '.': + break; + + default: + break; + + }; + +} + + + +inline void __attribute__((__always_inline__)) kol_screen_wait_rr() +{ +asm volatile ("int $0x40"::"a"(18), "b"(14)); +} + + + +void kol_screen_get_size(unsigned *w, unsigned *h) +{ +unsigned size; +asm volatile ("int $0x40":"=a"(size):"a"(14)); +*w = size / 65536; +*h = size % 65536; +} + + + +unsigned kol_skin_height() +{ +asm volatile ("int $0x40"::"a"(48), "b"(4)); +} + + +unsigned kol_thread_start(unsigned start, unsigned stack) +{ +asm volatile ("int $0x40"::"a"(51), "b"(1), "c"(start), "d"(stack)); +} + + +unsigned kol_time_tick() +{ +asm volatile ("int $0x40"::"a"(26), "b"(9)); +} + + +unsigned kol_sound_speaker(char data[]) +{ +asm volatile ("movl %0, %%esi"::"a"(data)); +asm volatile ("int $0x40"::"a"(55), "b"(55)); +} + + +unsigned kol_process_info(unsigned slot, char buf1k[]) +{ +asm volatile ("int $0x40"::"a"(9), "b"(buf1k), "c"(slot)); +} + + +int kol_process_kill_pid(unsigned process) +{ +asm volatile ("int $0x40"::"a"(18), "b"(18), "c"(process)); +} + +int kol_kill_process(unsigned process) +{ +asm volatile ("int $0x40"::"a"(18), "b"(2), "c"(process)); +} + +void kol_get_kernel_ver(char buff16b[]) +{ +asm volatile ("int $0x40"::"a"(18), "b"(13), "c"(buff16b)); +} + +int kol_buffer_open(char name[], int mode, int size, char **buf) +{ +int error; +asm volatile ("int $0x40":"=a"(*buf), "=d"(error):"a"(68), "b"(22), "c"(name), "d"(size), "S"(mode)); +return error; +} + +void kol_buffer_close(char name[]) +{ +asm volatile ("int $0x40"::"a"(68), "b"(23), "c"(name)); +} + +int kol_clip_num() +{ +asm volatile ("int $0x40"::"a"(54), "b"(0)); +} + +char* kol_clip_get(int n) +{ +asm volatile ("int $0x40"::"a"(54), "b"(1), "c"(n)); +} + +int kol_clip_set(int n, char buffer[]) +{ +asm volatile ("int $0x40"::"a"(54), "b"(2), "c"(n), "d"(buffer)); +} + +int kos_random(int num) +{ + srand(kol_time_tick()); + return rand() % num; +} + +int kos_get_mouse_wheels(void) +{ + int val; + asm ("int $0x40":"=a"(val):"a"(37),"b"(7)); + return val; +}; + + +struct blit_call +{ + int dstx; + int dsty; + int w; + int h; + + int srcx; + int srcy; + int srcw; + int srch; + + unsigned char *d; + int stride; +}; + +void kos_blit(int dstx, int dsty, int w, int h, int srcx, + int srcy,int srcw, int srch, int stride, char *d) +{ + struct blit_call image; + image.dstx=dstx; + image.dsty=dsty; + image.w=w; + image.h=h; + image.srcx=srcx; + image.srcy=srcy; + image.srcw=srcw; + image.srch=srch; + image.stride=stride; + image.d=d; + asm ("int $0x40"::"a"(73),"b"(0),"c"(&image)); +} + diff --git a/contrib/media/updf_newlib/apps/kolibri.h b/contrib/media/updf_newlib/apps/kolibri.h new file mode 100755 index 000000000..6da79c023 --- /dev/null +++ b/contrib/media/updf_newlib/apps/kolibri.h @@ -0,0 +1,145 @@ + +#define NULL ((void*)0) + +#define SHM_OPEN 0 +#define SHM_OPEN_ALWAYS 0x04 +#define SHM_CREATE 0x08 +#define SHM_READ 0x00 +#define SHM_WRITE 0x01 + +#define E_NOTFOUND 5 +#define E_ACCESS 10 +#define E_NOMEM 30 +#define E_PARAM 33 + +#define FILENAME_MAX 1024 + +#define BT_DEL 0x80000000 +#define BT_HIDE 0x40000000 +#define BT_NOFRAME 0x20000000 + +#define evReDraw 1 +#define evKey 2 +#define evButton 3 +#define evMouse 6 +#define evNetwork 8 + +#define ASCII_KEY_LEFT 176 +#define ASCII_KEY_RIGHT 179 +#define ASCII_KEY_DOWN 177 +#define ASCII_KEY_UP 178 +#define ASCII_KEY_HOME 180 +#define ASCII_KEY_END 181 +#define ASCII_KEY_PGDN 183 +#define ASCII_KEY_PGUP 184 + +#define ASCII_KEY_BS 8 +#define ASCII_KEY_TAB 9 +#define ASCII_KEY_ENTER 13 +#define ASCII_KEY_ESC 27 +#define ASCII_KEY_DEL 182 +#define ASCII_KEY_INS 185 +#define ASCII_KEY_SPACE 032 + +#pragma pack(push,1) +typedef struct +{ +unsigned p00; +unsigned p04; +unsigned p08; +unsigned p12; +unsigned p16; +char p20; +char *p21; +} kol_struct70; +#pragma pack(pop) + + +#pragma pack(push,1) +typedef struct +{ +unsigned p00; +char p04; +char p05[3]; +unsigned p08; +unsigned p12; +unsigned p16; +unsigned p20; +unsigned p24; +unsigned p28; +unsigned long long p32; +unsigned p40; +} kol_struct_BDVK; +#pragma pack(pop) + + +#pragma pack(push,1) +typedef struct +{ +char *name; +void *data; +} kol_struct_import; +#pragma pack(pop) + + +void kol_exit(); +void kol_sleep(unsigned d); +void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned cs, unsigned b, char *t); +void kol_wnd_move(unsigned x, unsigned y); +void kol_wnd_caption(char *s); +void kol_event_mask(unsigned e); +unsigned kol_event_wait(); +unsigned kol_event_wait_time(unsigned time); +unsigned kol_event_check(); +void kol_paint_start(); +void kol_paint_end(); +void kol_paint_pixel(unsigned x, unsigned y, unsigned c); +void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c); +void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c); +void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c); +void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d); +void kol_paint_image_pal(unsigned x, unsigned y, unsigned w, unsigned h, char *buf, unsigned bits, unsigned palette); +unsigned kol_key_get(); +unsigned kol_key_control(); +void kol_key_lang_set(unsigned lang); +unsigned kol_key_lang_get(); +void kol_key_mode_set(unsigned mode); +unsigned kol_key_mode_get(); +void kol_paint_image_24(unsigned x, unsigned y, unsigned w, unsigned h, char *d); +unsigned kol_btn_get(); +void kol_btn_type(unsigned t); +unsigned kol_mouse_pos(); +unsigned kol_mouse_posw(); +unsigned kol_mouse_btn(); +void kol_board_putc(char c); +void kol_board_puts(char *s); +void kol_board_puti(int n); +int kol_file_70(kol_struct70 *k); +kol_struct_import* kol_cofflib_load(char *name); +void* kol_cofflib_procload (kol_struct_import *imp, char *name); +unsigned kol_cofflib_procnum (kol_struct_import *imp); +void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n); +unsigned kol_system_end(unsigned param); +unsigned kol_system_cpufreq(); +unsigned kol_system_mem(); +unsigned kol_system_memfree(); +unsigned kol_system_time_get(); +unsigned kol_system_date_get(); +void kol_path_file2dir(char *dir, char *fname); +void kol_path_full(char *full, char *fname); +void kol_screen_wait_rr(); +void kol_screen_get_size(unsigned *w, unsigned *h); +unsigned kol_skin_height(); +unsigned kol_thread_start(unsigned start, unsigned stack); +unsigned kol_time_tick(); +unsigned kol_sound_speaker(char data[]); +unsigned kol_process_info(unsigned slot, char buf1k[]); +int kol_process_kill_pid(unsigned process); +void kol_get_kernel_ver(char buff16b[]); +int kol_kill_process(unsigned process); +int kol_buffer_open(char name[], int mode, int size, char **buf); +void kol_buffer_close(char name[]); +int kol_clip_num(); +char* kol_clip_get(int n); +int kol_clip_set(int n, char buffer[]); + diff --git a/contrib/media/updf_newlib/apps/kos_main.c b/contrib/media/updf_newlib/apps/kos_main.c new file mode 100755 index 000000000..c0b9f3d9c --- /dev/null +++ b/contrib/media/updf_newlib/apps/kos_main.c @@ -0,0 +1,468 @@ +// getrusage +#include "resource.h" + +#include +#define _WIN32 +#include "fitz.h" +#include "mupdf.h" +#include "pdfapp.h" +#include "icons/allbtns.h" +#include "kolibri.h" + +void run_app() +{ + return; +} + +/*==== DATA ====*/ + +static char Title[1024] = "uPDF"; +static pdfapp_t gapp; +char debugstr[256]; +char do_not_blit=0; + +#define TOOLBAR_HEIGHT 34 +struct process_table_entry Form; + +#define DOCUMENT_BORDER 0x979797 +#define DOCUMENT_BG 0xABABAB + +#define SCROLL_H 25 + +short show_area_w = 65; +short show_area_x; + +char key_mode_enter_page_number; +int new_page_number; + +static short window_center, draw_h, draw_w; + +const char *help[] = { + "Keys:", + " ", + "PageUp - go to previous page", + "PageDown - go to next page", + "Home - go to first page", + "End - go to last page", + "Down arrow - scroll current page down", + "Up arrow - scroll current page up", + "+/- - zoom in/out", + "[ or l - rotate page 90 deg to the left", + "] or r - rotate page 90 deg to the right", + "g - grayscale on/off", + " ", + "Press Escape to hide help", + 0 +}; + +/*==== CODE ====*/ + + +// not implemented yet +void wincursor(pdfapp_t *app, int curs) { } +void winhelp(pdfapp_t *app) { } +void winresize(pdfapp_t *app, int w, int h) { } +void windocopy(pdfapp_t *app) { } +void winopenuri(pdfapp_t *app, char *buf) { } +void winrepaintsearch(pdfapp_t *app) { } + + +void winwarn(pdfapp_t *app, char *msg) +{ + fprintf(stderr, "mupdf: %s\n", msg); +} + + +void winerror(pdfapp_t *app, fz_error error) +{ + fz_catch(error, "aborting"); + exit(1); +} + + +char *winpassword(pdfapp_t *app, char *filename) +{ + char *r = ""; + return r; + random(); +} + + +void wintitle(pdfapp_t *app, char *s) +{ + char* param = *(char**)0x1C; + sprintf(Title,"%s - uPDF", strrchr(param, '/') + 1 ); +} + + +void winreloadfile(pdfapp_t *app) +{ + //pdfapp_close(app); + //pdfapp_open(app, filename, 0, 1); +} + +void winclose(pdfapp_t *app) +{ + pdfapp_close(&gapp); + __menuet__sys_exit(); +} + +void RunOpenApp() +{ + RunApp("/sys/lod", "*pdf* ./mupdf"); +} + + +void winrepaint(pdfapp_t *app) +{ + winblit(&gapp); +} + + +void winblit(pdfapp_t *app) +{ + + if (do_not_blit) return; + + if (key_mode_enter_page_number==1) HandleNewPageNumber(0); else DrawPagination(); + + if (Form.client_width > gapp.image->w) window_center = (Form.client_width - gapp.image->w) / 2; else window_center = 0; + + gapp.panx = 0; + if (gapp.image->n == 4) { + kos_blit(window_center + Form.client_left, + Form.client_top + TOOLBAR_HEIGHT, + Form.client_width, + Form.client_height - TOOLBAR_HEIGHT, + gapp.panx, + gapp.pany, + gapp.image->w, + gapp.image->h, + gapp.image->w * gapp.image->n, + gapp.image->samples + ); + } + else if (gapp.image->n == 2) + { + int i = gapp.image->w*gapp.image->h; + unsigned char *color = malloc(i*4); + if (color != NULL) + { + unsigned char *s = gapp.image->samples; + unsigned char *d = color; + for (; i > 0 ; i--) + { + d[2] = d[1] = d[0] = *s++; + d[3] = *s++; + d += 4; + } + kos_blit(window_center + Form.client_left, + Form.client_top + TOOLBAR_HEIGHT, + Form.client_width, + Form.client_height - TOOLBAR_HEIGHT, + gapp.panx, + gapp.pany, + gapp.image->w, + gapp.image->h, + gapp.image->w * 4, + color + ); + free(color); + } + } +} + + +void DrawPageSides(void) +{ + if (gapp.image->h < Form.client_height - TOOLBAR_HEIGHT) { + draw_h = gapp.image->h - gapp.pany; + } else { + draw_h = Form.client_height - TOOLBAR_HEIGHT; + } + + if (gapp.image->w < Form.client_width) { + window_center = (Form.client_width - gapp.image->w) / 2; + draw_w = gapp.image->w + 2; + kol_paint_bar(0, TOOLBAR_HEIGHT, window_center-1, Form.client_height - TOOLBAR_HEIGHT, DOCUMENT_BG); + kol_paint_bar(window_center-1, TOOLBAR_HEIGHT, 1, draw_h, DOCUMENT_BORDER); + kol_paint_bar(window_center + gapp.image->w, TOOLBAR_HEIGHT, 1, draw_h, DOCUMENT_BORDER); + kol_paint_bar(window_center + gapp.image->w+1, TOOLBAR_HEIGHT, Form.client_width - window_center - gapp.image->w - 1, Form.client_height - TOOLBAR_HEIGHT, DOCUMENT_BG); + } else { + window_center = 1; + draw_w = Form.client_width; + } + + kol_paint_bar(window_center - 1, gapp.image->h - gapp.pany + TOOLBAR_HEIGHT, draw_w, 1, DOCUMENT_BORDER); + kol_paint_bar(window_center - 1, gapp.image->h - gapp.pany + TOOLBAR_HEIGHT + 1, + draw_w, Form.client_height - gapp.image->h - TOOLBAR_HEIGHT + gapp.pany - 1, DOCUMENT_BG); +} + + +void GetNewPageNumber(void) +{ + new_page_number = gapp.pageno; + key_mode_enter_page_number = 1; + HandleNewPageNumber(0); +} + +void HandleNewPageNumber(unsigned char key) +{ + char label_new_page[8]; + + if ((key >= '0') && (key <= '9')) + { + new_page_number = new_page_number * 10 + key - '0'; + } + if (key == ASCII_KEY_BS) + { + new_page_number /= 10; + } + if (key == ASCII_KEY_ENTER) + { + ApplyNewPageNumber(); + return; + } + if (key==ASCII_KEY_ESC) + { + key_mode_enter_page_number = 0; + DrawWindow(); + return; + } + + itoa(new_page_number, label_new_page, 10); + strcat(label_new_page, "_"); + kol_paint_bar(show_area_x, 6, show_area_w, 22, 0xFDF88E); + __menuet__write_text(show_area_x + show_area_w/2 - strlen(label_new_page)*6/2, 14, 0x000000, label_new_page, strlen(label_new_page)); + + if (new_page_number > gapp.pagecount) ApplyNewPageNumber(); +} + +void ApplyNewPageNumber(void) +{ + key_mode_enter_page_number = 0; + gapp.pageno = new_page_number -1; + pdfapp_onkey(&gapp, ']'); +} + +void DrawPagination(void) +{ + char pages_display[12]; + kol_paint_bar(show_area_x, 6, show_area_w, 22, 0xF4F4F4); + sprintf (pages_display, "%d/%d", gapp.pageno, gapp.pagecount); + __menuet__write_text(show_area_x + show_area_w/2 - strlen(pages_display)*6/2, 14, 0x000000, pages_display, strlen(pages_display)); +} + +void DrawToolbarButton(int x, char image_id) +{ + __menuet__make_button(x, 5, 26-1, 24-1, 10 + image_id + BT_HIDE, 0); + __menuet__putimage(x, 5, 26, 24, image_id * 24 * 26 * 3 + toolbar_image); +} + +void DrawWindow(void) +{ + kol_paint_bar(0, 0, Form.client_width, TOOLBAR_HEIGHT - 1, 0xe1e1e1); // bar on the top (buttons holder) + kol_paint_bar(0, TOOLBAR_HEIGHT - 1, Form.client_width, 1, 0x7F7F7F); + DrawToolbarButton(8,0); //open_folder + DrawToolbarButton(42,1); //magnify - + DrawToolbarButton(67,2); //magnify + + DrawToolbarButton(101,6); //rotate left + DrawToolbarButton(126,7); //rotate right + DrawToolbarButton(Form.client_width - 160,3); //show help + show_area_x = Form.client_width - show_area_w - 34; + DrawToolbarButton(show_area_x - 26,4); //prev page + DrawToolbarButton(show_area_x + show_area_w,5); //nex page + __menuet__make_button(show_area_x-1, 5, show_area_w+1, 23, 20 + BT_HIDE, 0xA4A4A4); + kol_paint_bar(show_area_x, 5, show_area_w, 1, 0xA4A4A4); + kol_paint_bar(show_area_x, 28, show_area_w, 1, 0xA4A4A4); + winblit(&gapp); + DrawPageSides(); +} + + +/* Actions */ + +void PageScrollDown(void) +{ + //pdfapp_onkey(&gapp, 'k'); //move down + if (gapp.image->h - gapp.pany - SCROLL_H < Form.client_height - TOOLBAR_HEIGHT) + { + pdfapp_onkey(&gapp, '.'); + } + else { + gapp.pany += SCROLL_H; + winblit(&gapp); + } +} + + +void PageScrollUp(void) +{ + //pdfapp_onkey(&gapp, 'j'); //move up + if (gapp.pany >= SCROLL_H) { + gapp.pany -= SCROLL_H; + winblit(&gapp); + } + else { + //not very nice way of using do_not_blit, but it simple + if (gapp.pageno == 1) return; + do_not_blit = 1; + pdfapp_onkey(&gapp, ','); + do_not_blit = 0; + gapp.pany = gapp.image->h - SCROLL_H - Form.client_height + TOOLBAR_HEIGHT; + if (gapp.pany < 0) gapp.pany = 0; + //sprintf (debugstr, "gapp.pany: %d \n", gapp.pany); + //kol_board_puts(debugstr); + winblit(&gapp); + } +} + +void RunApp(char app[], char param[]) +{ + kol_struct70 r; + r.p00 = 7; + r.p04 = 0; + r.p08 = param; + r.p12 = 0; + r.p16 = 0; + r.p20 = 0; + r.p21 = app; + kol_file_70(&r); +} + + +void PageZoomIn(void) +{ + pdfapp_onkey(&gapp, '+'); + DrawPageSides(); +} + + +void PageZoomOut(void) +{ + pdfapp_onkey(&gapp, '-'); + DrawPageSides(); +} + +void PageRotateLeft(void) +{ + pdfapp_onkey(&gapp, 'L'); + DrawPageSides(); +} + +void PageRotateRight(void) +{ + pdfapp_onkey(&gapp, 'R'); + DrawPageSides(); +} + +int main (void) +{ + char ii, mouse_wheels_state; + char* original_command_line = *(char**)0x1C; + + if (*original_command_line == 0) { + kol_board_puts("uPDF: no param set, showing OpenDialog"); + RunOpenApp(); + __menuet__sys_exit(); + } + + kol_board_puts(original_command_line); + kol_board_puts("\n"); + + char buf[128]; + int resolution = 72; + int pageno = 1; + fz_accelerate(); + kol_board_puts("PDF init\n"); + pdfapp_init(&gapp); + gapp.scrw = 600; + gapp.scrh = 400; + gapp.resolution = resolution; + gapp.pageno = pageno; + kol_board_puts("PDF Open\n"); + pdfapp_open(&gapp, original_command_line, 0, 0); + kol_board_puts("PDF Opened\n"); + wintitle(&gapp, 0); + + kol_board_puts("Inital paint\n"); + + int butt, key, screen_max_x, screen_max_y; + __menuet__get_screen_max(&screen_max_x, &screen_max_y); + __menuet__set_bitfield_for_wanted_events(EVENT_REDRAW+EVENT_KEY+EVENT_BUTTON+EVENT_MOUSE_CHANGE); + + for(;;) + { + + switch(__menuet__wait_for_event()) + { + case evReDraw: + // gapp.shrinkwrap = 2; + __menuet__window_redraw(1); + __menuet__define_window(screen_max_x / 2 - 350-50+kos_random(50), + screen_max_y / 2 - 300-50+kos_random(50), + 700, 600, 0x73000000, 0x800000FF, Title); + __menuet__window_redraw(2); + __menuet__get_process_table(&Form, PID_WHOAMI); + if (Form.window_state > 2) continue; //fix rolled up + Form.client_width++; //fix for Menuet kernel bug + Form.client_height++; //fix for Menuet kernel bug + DrawWindow(); + break; + + case evKey: + key = __menuet__getkey(); + if (key_mode_enter_page_number) + { + HandleNewPageNumber(key); + break; + } + if (key==ASCII_KEY_ESC) DrawWindow(); //close help + if (key==ASCII_KEY_PGDN) pdfapp_onkey(&gapp, ']'); + if (key==ASCII_KEY_PGUP) pdfapp_onkey(&gapp, '['); + if (key==ASCII_KEY_HOME) pdfapp_onkey(&gapp, 'g'); + if (key==ASCII_KEY_END ) pdfapp_onkey(&gapp, 'G'); + if (key=='g' ) pdfapp_onkey(&gapp, 'c'); + if ((key=='[' ) || (key=='l')) PageRotateLeft(); + if ((key==']' ) || (key=='r')) PageRotateRight(); + if (key==ASCII_KEY_DOWN ) PageScrollDown(); + if (key==ASCII_KEY_UP ) PageScrollUp(); + if (key=='-') PageZoomOut(); + if ((key=='=') || (key=='+')) PageZoomIn(); + break; + + case evButton: + butt = __menuet__get_button_id(); + if(butt==1) __menuet__sys_exit(); + if(butt==10) RunOpenApp(); + if(butt==11) PageZoomOut(); //magnify - + if(butt==12) PageZoomIn(); //magnify + + if(butt==13) //show help + { + kol_paint_bar(0, TOOLBAR_HEIGHT, Form.client_width, Form.client_height - TOOLBAR_HEIGHT, 0xF2F2F2); + __menuet__write_text(20, TOOLBAR_HEIGHT + 20 , 0x90000000, "uPDF for KolibriOS v1.2", 0); + __menuet__write_text(21, TOOLBAR_HEIGHT + 20 , 0x90000000, "uPDF for KolibriOS v1.2", 0); + for (ii=0; help[ii]!=0; ii++) { + __menuet__write_text(20, TOOLBAR_HEIGHT + 60 + ii * 15, 0x80000000, help[ii], 0); + } + } + if(butt==14) pdfapp_onkey(&gapp, '['); //previous page + if(butt==15) pdfapp_onkey(&gapp, ']'); //next page + if(butt==16) PageRotateLeft(); + if(butt==17) PageRotateRight(); + if(butt==20) GetNewPageNumber(); + break; + + case evMouse: + if (mouse_wheels_state = kos_get_mouse_wheels()) + { + if (mouse_wheels_state==1) { PageScrollDown(); PageScrollDown(); } + if (mouse_wheels_state==-1) { PageScrollUp(); PageScrollUp(); } + } + //sprintf (debugstr, "mouse_wheels_state: %d \n", mouse_wheels_state); + //kol_board_puts(debugstr); + //pdfapp_onmouse(&gapp, int x, int y, int btn, int modifiers, int state) + break; + } + } +} diff --git a/contrib/media/updf_newlib/apps/pdfapp.c b/contrib/media/updf_newlib/apps/pdfapp.c new file mode 100755 index 000000000..0b5ae5cd9 --- /dev/null +++ b/contrib/media/updf_newlib/apps/pdfapp.c @@ -0,0 +1,1171 @@ +#include "fitz.h" +#include "mupdf.h" +#include "pdfapp.h" + +// #include /* for tolower() */ + +#define ZOOMSTEP 1.142857 +#define BEYOND_THRESHHOLD 40 + +enum panning +{ + DONT_PAN = 0, + PAN_TO_TOP, + PAN_TO_BOTTOM +}; + +static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repaint); + +static void pdfapp_warn(pdfapp_t *app, const char *fmt, ...) +{ + char buf[1024]; + va_list ap; + va_start(ap, fmt); + vsprintf(buf, fmt, ap); + va_end(ap); + winwarn(app, buf); +} + +static void pdfapp_error(pdfapp_t *app, fz_error error) +{ + winerror(app, error); +} + +char *pdfapp_version(pdfapp_t *app) +{ + return + "MuPDF 0.9\n" + "Copyright 2006-2011 Artifex Sofware, Inc.\n"; +} + +char *pdfapp_usage(pdfapp_t *app) +{ + return " "; + /* + "L\t\t-- rotate left\n" + "R\t\t-- rotate right\n" + "h\t\t-- scroll left\n" + "j down\t\t-- scroll down\n" + "k up\t\t-- scroll up\n" + "l\t\t-- scroll right\n" + "+\t\t-- zoom in\n" + "-\t\t-- zoom out\n" + "w\t\t-- shrinkwrap\n" + "r\t\t-- reload file\n" + ". pgdn right space\t-- next page\n" + ", pgup left b\t-- previous page\n" + ">\t\t-- next 10 pages\n" + "<\t\t-- back 10 pages\n" + "m\t\t-- mark page for snap back\n" + "t\t\t-- pop back to latest mark\n" + "1m\t\t-- mark page in register 1\n" + "1t\t\t-- go to page in register 1\n" + "123g\t\t-- go to page 123\n" + "/\t\t-- search for text\n" + "n\t\t-- find next search result\n" + "N\t\t-- find previous search result\n" + "c\t\t-- toggle between color and grayscale\n" + ; + */ +} + +void pdfapp_init(pdfapp_t *app) +{ + memset(app, 0, sizeof(pdfapp_t)); + app->scrw = 640; + app->scrh = 480; + app->resolution = 72; +} + +void pdfapp_invert(pdfapp_t *app, fz_bbox rect) +{ + unsigned char *p; + int x, y, n; + + int x0 = CLAMP(rect.x0 - app->image->x, 0, app->image->w - 1); + int x1 = CLAMP(rect.x1 - app->image->x, 0, app->image->w - 1); + int y0 = CLAMP(rect.y0 - app->image->y, 0, app->image->h - 1); + int y1 = CLAMP(rect.y1 - app->image->y, 0, app->image->h - 1); + + for (y = y0; y < y1; y++) + { + p = app->image->samples + (y * app->image->w + x0) * app->image->n; + for (x = x0; x < x1; x++) + { + for (n = app->image->n; n > 0; n--, p++) + *p = 255 - *p; + } + } +} + +static void pdfapp_open_pdf(pdfapp_t *app, char *filename, int fd) +{ + fz_error error; + fz_stream *file; + char *password = ""; + fz_obj *obj; + fz_obj *info; + + /* + * Open PDF and load xref table + */ +__menuet__debug_out("FZ OPEN\n"); + //file = fz_open_fd(fd); + __menuet__debug_out("FZ ready\n"); + error = pdf_open_xref(&app->xref, filename, NULL); + if (error){ + __menuet__debug_out("FZ can't open\n"); + pdfapp_error(app, fz_rethrow(error, "cannot open document '%s'", filename));} + fz_close(file); + + /* + * Handle encrypted PDF files + */ +/* + if (pdf_needs_password(app->xref)) + { + int okay = pdf_authenticate_password(app->xref, password); + while (!okay) + { + password = winpassword(app, filename); + if (!password) + exit(1); + okay = pdf_authenticate_password(app->xref, password); + if (!okay) + pdfapp_warn(app, "Invalid password."); + } + } + * */ + + /* + * Load meta information + */ + +/* + app->outline = pdf_load_outline(app->xref); + + app->doctitle = filename; + if (strrchr(app->doctitle, '\\')) + app->doctitle = strrchr(app->doctitle, '\\') + 1; + if (strrchr(app->doctitle, '/')) + app->doctitle = strrchr(app->doctitle, '/') + 1; + info = fz_dict_gets(app->xref->trailer, "Info"); + if (info) + { + obj = fz_dict_gets(info, "Title"); + if (obj) + app->doctitle = pdf_to_utf8(obj); + } */ + + /* + * Start at first page + */ + __menuet__debug_out("Start at first page\n"); + + error = pdf_load_page_tree(app->xref); + if (error) { + __menuet__debug_out("Can't load tree\n"); + pdfapp_error(app, fz_rethrow(error, "cannot load page tree"));} + +__menuet__debug_out("Page counter\n"); + app->pagecount = pdf_count_pages(app->xref); + __menuet__debug_out("All is set!\n"); +} + +void pdfapp_open(pdfapp_t *app, char *filename, int fd, int reload) +{ + pdfapp_open_pdf(app, filename, fd); + + app->cache = fz_new_glyph_cache(); + + if (app->pageno < 1) + app->pageno = 1; + if (app->pageno > app->pagecount) + app->pageno = app->pagecount; + if (app->resolution < MINRES) + app->resolution = MINRES; + if (app->resolution > MAXRES) + app->resolution = MAXRES; + + if (!reload) + { + app->shrinkwrap = 1; + app->rotate = 0; + app->panx = 0; + app->pany = 0; + } + + pdfapp_showpage(app, 1, 1, 1); +} + +void pdfapp_close(pdfapp_t *app) +{ + if (app->cache) + fz_free_glyph_cache(app->cache); + app->cache = NULL; + + if (app->image) + fz_drop_pixmap(app->image); + app->image = NULL; + + if (app->outline) + pdf_free_outline(app->outline); + app->outline = NULL; + + if (app->xref) + { + if (app->xref->store) + pdf_free_store(app->xref->store); + app->xref->store = NULL; + + pdf_free_xref(app->xref); + app->xref = NULL; + } + + fz_flush_warnings(); +} + +static fz_matrix pdfapp_viewctm(pdfapp_t *app) +{ + fz_matrix ctm; + ctm = fz_identity; + ctm = fz_concat(ctm, fz_translate(0, -app->page_bbox.y1)); + if (app->xref) + ctm = fz_concat(ctm, fz_scale(app->resolution/72.0f, -app->resolution/72.0f)); + else + ctm = fz_concat(ctm, fz_scale(app->resolution/96.0f, app->resolution/96.0f)); + ctm = fz_concat(ctm, fz_rotate(app->rotate + app->page_rotate)); + return ctm; +} + +static void pdfapp_panview(pdfapp_t *app, int newx, int newy) +{ + if (newx < 0) + newx = 0; + if (newy < 0) + newy = 0; + + if (newx + app->image->w < app->winw) + newx = app->winw - app->image->w; + if (newy + app->image->h < app->winh) + newy = app->winh - app->image->h; + + if (app->winw >= app->image->w) + newx = (app->winw - app->image->w) / 2; + if (app->winh >= app->image->h) + newy = (app->winh - app->image->h) / 2; + + if (newx != app->panx || newy != app->pany) + winrepaint(app); + + if (newy > app->image->h) { + + app->pageno++; + + + if (app->pageno > app->pagecount) + app->pageno = app->pagecount; + + + newy = 0; + app->pany = newy; + + pdfapp_showpage(app, 1, 1, 1); + } + + app->panx = newx; + app->pany = newy; +} + +static void pdfapp_loadpage_pdf(pdfapp_t *app) +{ + pdf_page *page; + fz_error error; + fz_device *mdev; + + error = pdf_load_page(&page, app->xref, app->pageno - 1); + if (error) + pdfapp_error(app, error); + + app->page_bbox = page->mediabox; + app->page_rotate = page->rotate; + app->page_links = page->links; + page->links = NULL; + + /* Create display list */ + app->page_list = fz_new_display_list(); + mdev = fz_new_list_device(app->page_list); + error = pdf_run_page(app->xref, page, mdev, fz_identity); + if (error) + { + error = fz_rethrow(error, "cannot draw page %d in '%s'", app->pageno, app->doctitle); + pdfapp_error(app, error); + } + fz_free_device(mdev); + + pdf_free_page(page); + + pdf_age_store(app->xref->store, 3); +} + +static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repaint) +{ + char buf[256]; + fz_device *idev; + fz_device *tdev; + fz_colorspace *colorspace; + fz_matrix ctm; + fz_bbox bbox; + + wincursor(app, WAIT); + + if (loadpage) + { + if (app->page_list) + fz_free_display_list(app->page_list); + if (app->page_text) + fz_free_text_span(app->page_text); + if (app->page_links) + pdf_free_link(app->page_links); + + if (app->xref) + pdfapp_loadpage_pdf(app); + + /* Zero search hit position */ + app->hit = -1; + app->hitlen = 0; + + /* Extract text */ + app->page_text = fz_new_text_span(); + tdev = fz_new_text_device(app->page_text); + fz_execute_display_list(app->page_list, tdev, fz_identity, fz_infinite_bbox); + fz_free_device(tdev); + } + + if (drawpage) + { + sprintf(buf, "%s - %d/%d (%d dpi)", app->doctitle, + app->pageno, app->pagecount, app->resolution); + wintitle(app, buf); + + ctm = pdfapp_viewctm(app); + bbox = fz_round_rect(fz_transform_rect(ctm, app->page_bbox)); + + /* Draw */ + if (app->image) + fz_drop_pixmap(app->image); + if (app->grayscale) + colorspace = fz_device_gray; + else +//#ifdef _WIN32 + colorspace = fz_device_bgr; +//#else + // colorspace = fz_device_rgb; +//#endif + app->image = fz_new_pixmap_with_rect(colorspace, bbox); + fz_clear_pixmap_with_color(app->image, 255); + idev = fz_new_draw_device(app->cache, app->image); + fz_execute_display_list(app->page_list, idev, ctm, bbox); + fz_free_device(idev); + } + + if (repaint) + { + pdfapp_panview(app, app->panx, app->pany); + + if (app->shrinkwrap) + { + __menuet__debug_out ("SHRINK\n"); + int w = app->image->w; + int h = app->image->h; + if (app->winw == w) + app->panx = 0; + if (app->winh == h) + app->pany = 0; + if (w > app->scrw * 90 / 100) + w = app->scrw * 90 / 100; + if (h > app->scrh * 90 / 100) + h = app->scrh * 90 / 100; + if (w != app->winw || h != app->winh) + winresize(app, w, h); + } + + winrepaint(app); + + wincursor(app, ARROW); + } + + fz_flush_warnings(); +} + +static void pdfapp_gotouri(pdfapp_t *app, fz_obj *uri) +{ + char *buf; + buf = fz_malloc(fz_to_str_len(uri) + 1); + memcpy(buf, fz_to_str_buf(uri), fz_to_str_len(uri)); + buf[fz_to_str_len(uri)] = 0; + winopenuri(app, buf); + fz_free(buf); +} + +static void pdfapp_gotopage(pdfapp_t *app, fz_obj *obj) +{ + int number; + + number = pdf_find_page_number(app->xref, obj); + if (number < 0) + return; + + if (app->histlen + 1 == 256) + { + memmove(app->hist, app->hist + 1, sizeof(int) * 255); + app->histlen --; + } + app->hist[app->histlen++] = app->pageno; + app->pageno = number + 1; + pdfapp_showpage(app, 1, 1, 1); +} + +static inline fz_bbox bboxcharat(fz_text_span *span, int idx) +{ + int ofs = 0; + while (span) + { + if (idx < ofs + span->len) + return span->text[idx - ofs].bbox; + if (span->eol) + { + if (idx == ofs + span->len) + return fz_empty_bbox; + ofs ++; + } + ofs += span->len; + span = span->next; + } + return fz_empty_bbox; +} + +void pdfapp_inverthit(pdfapp_t *app) +{ + fz_bbox hitbox, bbox; + fz_matrix ctm; + int i; + + if (app->hit < 0) + return; + + hitbox = fz_empty_bbox; + ctm = pdfapp_viewctm(app); + + for (i = app->hit; i < app->hit + app->hitlen; i++) + { + bbox = bboxcharat(app->page_text, i); + if (fz_is_empty_rect(bbox)) + { + if (!fz_is_empty_rect(hitbox)) + pdfapp_invert(app, fz_transform_bbox(ctm, hitbox)); + hitbox = fz_empty_bbox; + } + else + { + hitbox = fz_union_bbox(hitbox, bbox); + } + } + + if (!fz_is_empty_rect(hitbox)) + pdfapp_invert(app, fz_transform_bbox(ctm, hitbox)); +} + +static inline int charat(fz_text_span *span, int idx) +{ + int ofs = 0; + while (span) + { + if (idx < ofs + span->len) + return span->text[idx - ofs].c; + if (span->eol) + { + if (idx == ofs + span->len) + return ' '; + ofs ++; + } + ofs += span->len; + span = span->next; + } + return 0; +} + +static int textlen(fz_text_span *span) +{ + int len = 0; + while (span) + { + len += span->len; + if (span->eol) + len ++; + span = span->next; + } + return len; +} + +static int match(char *s, fz_text_span *span, int n) +{ + int orig = n; + int c; + while ((c = *s++)) + { + if (c == ' ' && charat(span, n) == ' ') + { + while (charat(span, n) == ' ') + n++; + } + else + { + if (tolower(c) != tolower(charat(span, n))) + return 0; + n++; + } + } + return n - orig; +} + +static void pdfapp_searchforward(pdfapp_t *app, enum panning *panto) +{ + int matchlen; + int test; + int len; + int startpage; + + wincursor(app, WAIT); + + startpage = app->pageno; + + do + { + len = textlen(app->page_text); + + if (app->hit >= 0) + test = app->hit + strlen(app->search); + else + test = 0; + + while (test < len) + { + matchlen = match(app->search, app->page_text, test); + if (matchlen) + { + app->hit = test; + app->hitlen = matchlen; + wincursor(app, HAND); + winrepaint(app); + return; + } + test++; + } + + app->pageno++; + if (app->pageno > app->pagecount) + app->pageno = 1; + + pdfapp_showpage(app, 1, 0, 0); + *panto = PAN_TO_TOP; + + } while (app->pageno != startpage); + + if (app->pageno == startpage) + { + pdfapp_warn(app, "String '%s' not found.", app->search); + winrepaintsearch(app); + } + else + winrepaint(app); + + wincursor(app, HAND); +} + +static void pdfapp_searchbackward(pdfapp_t *app, enum panning *panto) +{ + int matchlen; + int test; + int len; + int startpage; + + wincursor(app, WAIT); + + startpage = app->pageno; + + do + { + len = textlen(app->page_text); + + if (app->hit >= 0) + test = app->hit - 1; + else + test = len; + + while (test >= 0) + { + matchlen = match(app->search, app->page_text, test); + if (matchlen) + { + app->hit = test; + app->hitlen = matchlen; + wincursor(app, HAND); + winrepaint(app); + return; + } + test--; + } + + app->pageno--; + if (app->pageno < 1) + app->pageno = app->pagecount; + + pdfapp_showpage(app, 1, 0, 0); + *panto = PAN_TO_BOTTOM; + + } while (app->pageno != startpage); + + if (app->pageno == startpage) + { + pdfapp_warn(app, "String '%s' not found.", app->search); + winrepaintsearch(app); + } + else + winrepaint(app); + + wincursor(app, HAND); +} + +void pdfapp_onresize(pdfapp_t *app, int w, int h) +{ + if (app->winw != w || app->winh != h) + { + app->winw = w; + app->winh = h; + pdfapp_panview(app, app->panx, app->pany); + winrepaint(app); + } +} + +void pdfapp_onkey(pdfapp_t *app, int c) +{ + int oldpage = app->pageno; + enum panning panto = PAN_TO_TOP; + int loadpage = 1; + + if (app->isediting) + { + int n = strlen(app->search); + if (c < ' ') + { + if (c == '\b' && n > 0) + { + app->search[n - 1] = 0; + winrepaintsearch(app); + } + if (c == '\n' || c == '\r') + { + app->isediting = 0; + if (n > 0) + { + winrepaintsearch(app); + pdfapp_onkey(app, 'n'); + } + else + winrepaint(app); + } + if (c == '\033') + { + app->isediting = 0; + winrepaint(app); + } + } + else + { + if (n + 2 < sizeof app->search) + { + app->search[n] = c; + app->search[n + 1] = 0; + winrepaintsearch(app); + } + } + return; + } + + /* + * Save numbers typed for later + */ + + if (c >= '0' && c <= '9') + { + app->number[app->numberlen++] = c; + app->number[app->numberlen] = '\0'; + } + + switch (c) + { + + case '?': + winhelp(app); + break; + + case 'q': + winclose(app); + break; + + /* + * Zoom and rotate + */ + + case '+': + case '=': + app->resolution *= ZOOMSTEP; + if (app->resolution > MAXRES) + app->resolution = MAXRES; + pdfapp_showpage(app, 0, 1, 1); + break; + case '-': + app->resolution /= ZOOMSTEP; + if (app->resolution < MINRES) + app->resolution = MINRES; + pdfapp_showpage(app, 0, 1, 1); + break; + + case 'L': + app->rotate -= 90; + pdfapp_showpage(app, 0, 1, 1); + break; + case 'R': + app->rotate += 90; + pdfapp_showpage(app, 0, 1, 1); + break; + + case 'c': + app->grayscale ^= 1; + pdfapp_showpage(app, 0, 1, 1); + break; + +#ifndef NDEBUG + case 'a': + app->rotate -= 15; + pdfapp_showpage(app, 0, 1, 1); + break; + case 's': + app->rotate += 15; + pdfapp_showpage(app, 0, 1, 1); + break; +#endif + + /* + * Pan view, but dont need to repaint image + */ + + case 'w': + app->shrinkwrap = 1; + app->panx = app->pany = 0; + pdfapp_showpage(app, 0, 0, 1); + break; + + case 'h': + app->panx += app->image->w / 10; + pdfapp_showpage(app, 0, 0, 1); + break; + + case 'j': + app->pany -= app->image->h / 10; + pdfapp_showpage(app, 0, 0, 1); + break; + + case 'k': + app->pany += app->image->h / 10; + pdfapp_showpage(app, 0, 0, 1); + break; + + case 'l': + app->panx -= app->image->w / 10; + pdfapp_showpage(app, 0, 0, 1); + break; + + /* + * Page navigation + */ + + case 'g': + case '\n': + case '\r': + if (app->numberlen > 0) + app->pageno = atoi(app->number); + else + app->pageno = 1; + break; + + case 'G': + app->pageno = app->pagecount; + break; + + case 'm': + if (app->numberlen > 0) + { + int idx = atoi(app->number); + + if (idx >= 0 && idx < nelem(app->marks)) + app->marks[idx] = app->pageno; + } + else + { + if (app->histlen + 1 == 256) + { + memmove(app->hist, app->hist + 1, sizeof(int) * 255); + app->histlen --; + } + app->hist[app->histlen++] = app->pageno; + } + break; + + case 't': + if (app->numberlen > 0) + { + int idx = atoi(app->number); + + if (idx >= 0 && idx < nelem(app->marks)) + if (app->marks[idx] > 0) + app->pageno = app->marks[idx]; + } + else if (app->histlen > 0) + app->pageno = app->hist[--app->histlen]; + break; + + /* + * Back and forth ... + */ + + case ',': + panto = PAN_TO_BOTTOM; + if (app->numberlen > 0) + app->pageno -= atoi(app->number); + else + app->pageno--; + break; + + case '.': + panto = PAN_TO_TOP; + if (app->numberlen > 0) + app->pageno += atoi(app->number); + else + app->pageno++; + break; + + case 'b': + panto = DONT_PAN; + if (app->numberlen > 0) + app->pageno -= atoi(app->number); + else + app->pageno--; + break; + + case ' ': + panto = DONT_PAN; + if (app->numberlen > 0) + app->pageno += atoi(app->number); + else + app->pageno++; + break; + +case ']': + panto = PAN_TO_TOP; + app->pageno++; + break; + +case '[': + panto = PAN_TO_TOP; + app->pageno--; + break; + + + case '<': + panto = PAN_TO_TOP; + app->pageno -= 10; + break; + case '>': + panto = PAN_TO_TOP; + app->pageno += 10; + break; + + /* + * Reloading the file... + */ + + case 'r': + panto = DONT_PAN; + oldpage = -1; + winreloadfile(app); + break; + + /* + * Searching + */ + + case '/': + app->isediting = 1; + app->search[0] = 0; + app->hit = -1; + app->hitlen = 0; + winrepaintsearch(app); + break; + + case 'n': + pdfapp_searchforward(app, &panto); + loadpage = 0; + break; + + case 'N': + pdfapp_searchbackward(app, &panto); + loadpage = 0; + break; + + } + + if (c < '0' || c > '9') + app->numberlen = 0; + + if (app->pageno < 1) + app->pageno = 1; + if (app->pageno > app->pagecount) + app->pageno = app->pagecount; + + if (app->pageno != oldpage) + { + switch (panto) + { + case PAN_TO_TOP: + app->pany = 0; + break; + case PAN_TO_BOTTOM: + app->pany = -2000; + break; + case DONT_PAN: + break; + } + pdfapp_showpage(app, loadpage, 1, 1); + } +} + +void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int state) +{ + pdf_link *link; + fz_matrix ctm; + fz_point p; + + p.x = x - app->panx + app->image->x; + p.y = y - app->pany + app->image->y; + + ctm = pdfapp_viewctm(app); + ctm = fz_invert_matrix(ctm); + + p = fz_transform_point(ctm, p); + + for (link = app->page_links; link; link = link->next) + { + if (p.x >= link->rect.x0 && p.x <= link->rect.x1) + if (p.y >= link->rect.y0 && p.y <= link->rect.y1) + break; + } + + if (link) + { + wincursor(app, HAND); + if (btn == 1 && state == 1) + { + if (link->kind == PDF_LINK_URI) + pdfapp_gotouri(app, link->dest); + else if (link->kind == PDF_LINK_GOTO) + pdfapp_gotopage(app, fz_array_get(link->dest, 0)); /* [ pageobj ... ] */ + return; + } + } + else + { + wincursor(app, ARROW); + } + + if (state == 1) + { + if (btn == 1 && !app->iscopying) + { + app->ispanning = 1; + app->selx = x; + app->sely = y; + app->beyondy = 0; + } + if (btn == 3 && !app->ispanning) + { + app->iscopying = 1; + app->selx = x; + app->sely = y; + app->selr.x0 = x; + app->selr.x1 = x; + app->selr.y0 = y; + app->selr.y1 = y; + } + if (btn == 4 || btn == 5) /* scroll wheel */ + { + int dir = btn == 4 ? 1 : -1; + app->ispanning = app->iscopying = 0; + if (modifiers & (1<<2)) + { + /* zoom in/out if ctrl is pressed */ + if (dir > 0) + app->resolution *= ZOOMSTEP; + else + app->resolution /= ZOOMSTEP; + if (app->resolution > MAXRES) + app->resolution = MAXRES; + if (app->resolution < MINRES) + app->resolution = MINRES; + pdfapp_showpage(app, 0, 1, 1); + } + else + { + /* scroll up/down, or left/right if + shift is pressed */ + int isx = (modifiers & (1<<0)); + int xstep = isx ? 20 * dir : 0; + int ystep = !isx ? 20 * dir : 0; + pdfapp_panview(app, app->panx + xstep, app->pany + ystep); + } + } + } + + else if (state == -1) + { + if (app->iscopying) + { + app->iscopying = 0; + app->selr.x0 = MIN(app->selx, x) - app->panx + app->image->x; + app->selr.x1 = MAX(app->selx, x) - app->panx + app->image->x; + app->selr.y0 = MIN(app->sely, y) - app->pany + app->image->y; + app->selr.y1 = MAX(app->sely, y) - app->pany + app->image->y; + winrepaint(app); + if (app->selr.x0 < app->selr.x1 && app->selr.y0 < app->selr.y1) + windocopy(app); + } + if (app->ispanning) + app->ispanning = 0; + } + + else if (app->ispanning) + { + int newx = app->panx + x - app->selx; + int newy = app->pany + y - app->sely; + /* Scrolling beyond limits implies flipping pages */ + /* Are we requested to scroll beyond limits? */ + if (newy + app->image->h < app->winh || newy > 0) + { + /* Yes. We can assume that deltay != 0 */ + int deltay = y - app->sely; + /* Check whether the panning has occured in the + * direction that we are already crossing the + * limit it. If not, we can conclude that we + * have switched ends of the page and will thus + * start over counting. + */ + if( app->beyondy == 0 || (app->beyondy ^ deltay) >= 0 ) + { + /* Updating how far we are beyond and + * flipping pages if beyond threshhold + */ + app->beyondy += deltay; + if (app->beyondy > BEYOND_THRESHHOLD) + { + if( app->pageno > 1 ) + { + app->pageno--; + pdfapp_showpage(app, 1, 1, 1); + newy = -app->image->h; + } + app->beyondy = 0; + } + else if (app->beyondy < -BEYOND_THRESHHOLD) + { + if( app->pageno < app->pagecount ) + { + app->pageno++; + pdfapp_showpage(app, 1, 1, 1); + newy = 0; + } + app->beyondy = 0; + } + } + else + app->beyondy = 0; + } + /* Although at this point we've already determined that + * or that no scrolling will be performed in + * y-direction, the x-direction has not yet been taken + * care off. Therefore + */ + pdfapp_panview(app, newx, newy); + + app->selx = x; + app->sely = y; + } + + else if (app->iscopying) + { + app->selr.x0 = MIN(app->selx, x) - app->panx + app->image->x; + app->selr.x1 = MAX(app->selx, x) - app->panx + app->image->x; + app->selr.y0 = MIN(app->sely, y) - app->pany + app->image->y; + app->selr.y1 = MAX(app->sely, y) - app->pany + app->image->y; + winrepaint(app); + } + +} + +void pdfapp_oncopy(pdfapp_t *app, unsigned short *ucsbuf, int ucslen) +{ + fz_bbox hitbox; + fz_matrix ctm; + fz_text_span *span; + int c, i, p; + int seen; + + int x0 = app->selr.x0; + int x1 = app->selr.x1; + int y0 = app->selr.y0; + int y1 = app->selr.y1; + + ctm = pdfapp_viewctm(app); + + p = 0; + for (span = app->page_text; span; span = span->next) + { + seen = 0; + + for (i = 0; i < span->len; i++) + { + hitbox = fz_transform_bbox(ctm, span->text[i].bbox); + c = span->text[i].c; + if (c < 32) + c = '?'; + if (hitbox.x1 >= x0 && hitbox.x0 <= x1 && hitbox.y1 >= y0 && hitbox.y0 <= y1) + { + if (p < ucslen - 1) + ucsbuf[p++] = c; + seen = 1; + } + } + + if (seen && span->eol) + { +#ifdef _WIN32 + if (p < ucslen - 1) + ucsbuf[p++] = '\r'; +#endif + if (p < ucslen - 1) + ucsbuf[p++] = '\n'; + } + } + + ucsbuf[p] = 0; +} diff --git a/contrib/media/updf_newlib/apps/pdfapp.h b/contrib/media/updf_newlib/apps/pdfapp.h new file mode 100755 index 000000000..8efb4d387 --- /dev/null +++ b/contrib/media/updf_newlib/apps/pdfapp.h @@ -0,0 +1,104 @@ +/* + * Utility object for handling a pdf application / view + * Takes care of PDF loading and displaying and navigation, + * uses a number of callbacks to the GUI app. + */ + +#define MINRES 54 +#define MAXRES 300 + +typedef struct pdfapp_s pdfapp_t; + +enum { ARROW, HAND, WAIT }; + +extern void winwarn(pdfapp_t*, char *s); +extern void winerror(pdfapp_t*, fz_error error); +extern void wintitle(pdfapp_t*, char *title); +extern void winresize(pdfapp_t*, int w, int h); +extern void winrepaint(pdfapp_t*); +extern void winrepaintsearch(pdfapp_t*); +extern char *winpassword(pdfapp_t*, char *filename); +extern void winopenuri(pdfapp_t*, char *s); +extern void wincursor(pdfapp_t*, int curs); +extern void windocopy(pdfapp_t*); +extern void winreloadfile(pdfapp_t*); +extern void windrawstring(pdfapp_t*, int x, int y, char *s); +extern void winclose(pdfapp_t*); +extern void winhelp(pdfapp_t*); + +struct pdfapp_s +{ + /* current document params */ + char *doctitle; + pdf_xref *xref; + pdf_outline *outline; + + int pagecount; + fz_glyph_cache *cache; + + /* current view params */ + int resolution; + int rotate; + fz_pixmap *image; + int grayscale; + + /* current page params */ + int pageno; + fz_rect page_bbox; + float page_rotate; + fz_display_list *page_list; + fz_text_span *page_text; + pdf_link *page_links; + + /* snapback history */ + int hist[256]; + int histlen; + int marks[10]; + + /* window system sizes */ + int winw, winh; + int scrw, scrh; + int shrinkwrap; + + /* event handling state */ + char number[256]; + int numberlen; + + int ispanning; + int panx, pany; + + int iscopying; + int selx, sely; + /* TODO - While sely keeps track of the relative change in + * cursor position between two ticks/events, beyondy shall keep + * track of the relative change in cursor position from the + * point where the user hits a scrolling limit. This is ugly. + * Used in pdfapp.c:pdfapp_onmouse. + */ + int beyondy; + fz_bbox selr; + + /* search state */ + int isediting; + char search[512]; + int hit; + int hitlen; + + /* client context storage */ + void *userdata; +}; + +void pdfapp_init(pdfapp_t *app); +void pdfapp_open(pdfapp_t *app, char *filename, int fd, int reload); +void pdfapp_close(pdfapp_t *app); + +char *pdfapp_version(pdfapp_t *app); +char *pdfapp_usage(pdfapp_t *app); + +void pdfapp_onkey(pdfapp_t *app, int c); +void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int state); +void pdfapp_oncopy(pdfapp_t *app, unsigned short *ucsbuf, int ucslen); +void pdfapp_onresize(pdfapp_t *app, int w, int h); + +void pdfapp_invert(pdfapp_t *app, fz_bbox rect); +void pdfapp_inverthit(pdfapp_t *app); diff --git a/contrib/media/updf_newlib/apps/resource.h b/contrib/media/updf_newlib/apps/resource.h new file mode 100755 index 000000000..58b369f11 --- /dev/null +++ b/contrib/media/updf_newlib/apps/resource.h @@ -0,0 +1,70 @@ +#ifndef __dj_include_sys_resource_h_ +#define __dj_include_sys_resource_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __dj_ENFORCE_ANSI_FREESTANDING + +#ifndef __STRICT_ANSI__ + +#ifndef _POSIX_SOURCE + +#include + +#define RUSAGE_SELF 0 /* calling process */ +#define RUSAGE_CHILDREN -1 /* terminated child processes */ + +struct rusage { + struct timeval ru_utime; /* user time used */ + struct timeval ru_stime; /* system time used */ + long ru_maxrss; /* integral max resident set size */ + long ru_ixrss; /* integral shared text memory size */ + long ru_idrss; /* integral unshared data size */ + long ru_isrss; /* integral unshared stack size */ + long ru_minflt; /* page reclaims */ + long ru_majflt; /* page faults */ + long ru_nswap; /* swaps */ + long ru_inblock; /* block input operations */ + long ru_oublock; /* block output operations */ + long ru_msgsnd; /* messages sent */ + long ru_msgrcv; /* messages received */ + long ru_nsignals; /* signals received */ + long ru_nvcsw; /* voluntary context switches */ + long ru_nivcsw; /* involuntary context switches */ +}; + +#define RLIMIT_CPU 0 /* cpu time in milliseconds */ +#define RLIMIT_FSIZE 1 /* maximum file size */ +#define RLIMIT_DATA 2 /* data size */ +#define RLIMIT_STACK 3 /* stack size */ +#define RLIMIT_CORE 4 /* core file size */ +#define RLIMIT_RSS 5 /* resident set size */ +#define RLIMIT_MEMLOCK 6 /* locked-in-memory address space */ +#define RLIMIT_NPROC 7 /* number of processes */ +#define RLIMIT_NOFILE 8 /* number of open files */ + +#define RLIM_NLIMITS 9 /* number of resource limits */ +#define RLIM_INFINITY ((long) ((1UL << 31) - 1UL)) + +struct rlimit { + long rlim_cur; /* current (soft) limit */ + long rlim_max; /* maximum value for rlim_cur */ +}; + +/// ZAGLUSHKA /// +int getrusage(int _who, struct rusage *_rusage) {}; + +#endif /* !_POSIX_SOURCE */ +#endif /* !__STRICT_ANSI__ */ +#endif /* !__dj_ENFORCE_ANSI_FREESTANDING */ + +#ifndef __dj_ENFORCE_FUNCTION_CALLS +#endif /* !__dj_ENFORCE_FUNCTION_CALLS */ + +#ifdef __cplusplus +} +#endif + +#endif /* !__dj_include_sys_resource_h_ */ diff --git a/contrib/media/updf_newlib/draw/Makefile b/contrib/media/updf_newlib/draw/Makefile new file mode 100755 index 000000000..d79cb9aa8 --- /dev/null +++ b/contrib/media/updf_newlib/draw/Makefile @@ -0,0 +1,21 @@ +CC = kos32-gcc +LD = kos32-ld + +SDK_DIR = $(abspath ../../../sdk) +LDFLAGS = -call_shared -nostdlib -T $(SDK_DIR)/sources/newlib/app-dynamic.lds --image-base 0 + +CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 + +INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I ../fitz +LIBPATH = -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib + +DRAW_SRC := $(notdir $(wildcard *.c)) +OBJECTS = $(patsubst %.c, %.o, $(DRAW_SRC)) + +default: $(patsubst %.c,%.o,$(DRAW_SRC)) + ar rcs libdraw.a $(OBJECTS) + rm *.o + mv libdraw.a ../lib + +%.o : %.c Makefile $(DRAW_SRC) + $(CC) $(CFLAGS) $(INCLUDES) -o $@ $< diff --git a/contrib/media/updf_newlib/draw/arch_arm.c b/contrib/media/updf_newlib/draw/arch_arm.c new file mode 100755 index 000000000..55016a8bd --- /dev/null +++ b/contrib/media/updf_newlib/draw/arch_arm.c @@ -0,0 +1,232 @@ +/* + * ARM specific render optims live here + */ + +#include "fitz.h" + +typedef unsigned char byte; + +/* always surround cpu specific code with HAVE_XXX */ +#ifdef ARCH_ARM + +/* from imagescalearm.s */ +extern void fz_srow4_arm(byte *src, byte *dst, int w, int denom); +extern void fz_scol4_arm(byte *src, byte *dst, int w, int denom); + +static void +path_w4i1o4_arm(byte * restrict rgba, byte * restrict src, byte cov, int len, byte * restrict dst) +{ + /* The ARM code here is a hand coded implementation of the optimized C version. */ + + if (len <= 0) + return; + + asm volatile( + "ldr %0, [%0] @ %0 = rgba \n" + "mov r11,#0 \n" + "mov r8, #0xFF00 \n" + "mov r14,%0,lsr #24 @ r14= alpha \n" + "orr %0, %0, #0xFF000000 @ %0 = rgba |= 0xFF000000 \n" + "orr r8, r8, r8, LSL #16 @ r8 = 0xFF00FF00 \n" + "adds r14,r14,r14,LSR #7 @ r14 = alpha += alpha>>7 \n" + "beq 9f @ if (alpha == 0) bale \n" + "and r6, %0, r8 @ r6 = ga<<8 \n" + "bic %0, %0, r8 @ %0 = rb \n" + "mov r6, r6, LSR #8 @ r6 = ga \n" + "cmp r14,#256 @ if (alpha == 256) \n" + "beq 4f @ no-alpha loop \n" + "B 2f @ enter the loop \n" + "1: @ Loop used for when coverage*alpha == 0 \n" + "subs %3, %3, #1 @ len-- \n" + "ble 9f \n" + "2: \n" + "ldrb r12,[%1] @ r12= *src \n" + "ldr r9, [%4], #4 @ r9 = drb = *dst32++ \n" + "strb r11,[%1], #1 @ r11= *src++ = 0 \n" + "add %2, r12, %2 @ %2 = cov += r12 \n" + "ands %2, %2, #255 @ %2 = cov &= 255 \n" + "beq 1b @ if coverage == 0 loop back \n" + "add r10,%2, %2, LSR #7 @ r10= ca = cov+(cov>>7) \n" + "mul r10,r14,r10 @ r10= ca *= alpha \n" + "and r7, r8, r9 @ r7 = dga = drb & MASK \n" + "mov r10,r10,LSR #8 @ r10= ca >>= 8 \n" + "and r9, r8, r9, LSL #8 @ r9 = drb = (drb<<8) & MASK \n" + "sub r12,r6, r7, LSR #8 @ r12= cga = ga - (dga>>8) \n" + "sub r5, %0, r9, LSR #8 @ r5 = crb = rb - (drb>>8) \n" + "mla r7, r12,r10,r7 @ r7 = dga += cga * ca \n" + "subs %3, %3, #1 @ len-- \n" + "mla r9, r5, r10,r9 @ r9 = drb += crb * ca \n" + "and r7, r8, r7 @ r7 = dga &= MASK \n" + "and r9, r8, r9 @ r9 = drb &= MASK \n" + "orr r9, r7, r9, LSR #8 @ r9 = drb = dga | (drb>>8) \n" + "str r9, [%4, #-4] @ dst32[-1] = r9 \n" + "bgt 2b \n" + "b 9f \n" + "@ --- Solid alpha loop --------------------------------------- \n" + "3: @ Loop used when coverage == 256 \n" + "orr r9, %0, r6, LSL #8 @ r9 = rgba \n" + "str r9, [%4, #-4] @ dst32[-1] = r9 \n" + "4: @ Loop used for when coverage*alpha == 0 \n" + "subs %3, %3, #1 @ len-- \n" + "ble 9f \n" + "5: \n" + "ldrb r12,[%1] @ r12= *src \n" + "ldr r9, [%4], #4 @ r9 = drb = *dst32++ \n" + "strb r11,[%1], #1 @ r11= *src++ = 0 \n" + "add %2, r12, %2 @ %2 = cov += r12 \n" + "ands %2, %2, #255 @ %2 = cov &= 255 \n" + "beq 4b @ if coverage == 0 loop back \n" + "cmp %2, #255 @ if coverage == solid \n" + "beq 3b @ loop back \n" + "add r10,%2, %2, LSR #7 @ r10= ca = cov+(cov>>7) \n" + "and r7, r8, r9 @ r7 = dga = drb & MASK \n" + "and r9, r8, r9, LSL #8 @ r9 = dga = (drb<<8) & MASK \n" + "sub r12,r6, r7, LSR #8 @ r12= cga = ga - (dga>>8) \n" + "sub r5, %0, r9, LSR #8 @ r5 = crb = rb - (drb>>8) \n" + "mla r7, r12,r10,r7 @ r7 = dga += cga * ca \n" + "subs %3, %3, #1 @ len-- \n" + "mla r9, r5, r10,r9 @ r9 = drb += crb * ca \n" + "and r7, r8, r7 @ r7 = dga &= MASK \n" + "and r9, r8, r9 @ r9 = drb &= MASK \n" + "orr r9, r7, r9, LSR #8 @ r9 = drb = dga | (drb>>8) \n" + "str r9, [%4, #-4] @ dst32[-1] = r9 \n" + "bgt 5b \n" + "9: @ End \n" + : + "+r" (rgba), + "+r" (src), + "+r" (cov), + "+r" (len), + "+r" (dst) + : + : + "r5","r6","r7","r8","r9","r10","r11","r12","r14","memory","cc" + ); +} + +static void load_tile8_arm(byte * restrict src, int sw, byte * restrict dst, int dw, int w, int h, int pad) +{ + if ((h == 0) || (w == 0)) + return; + + switch (pad) + { + case 0: + while (h--) + { + memcpy(dst, src, w); + src += sw; + dst += dw; + } + break; + + case 1: + sw -= w; + dw -= w<<1; + asm volatile( + "MOV r11,#255 \n" + "1: \n" + "MOV r5, %[w] @ r5 = x = w \n" + "2: \n" + "LDRB r4, [%[src]], #1 @ r4 = *src++ \n" + "SUBS r5, r5, #1 \n" + "STRB r4, [%[dst]], #1 @ *dst++ = r4 \n" + "STRB r11,[%[dst]], #1 @ *dst++ = 255 \n" + "BGT 2b \n" + "ADD %[src],%[src],%[sw] @ src += sw \n" + "ADD %[dst],%[dst],%[dw] @ dst += dw \n" + "SUBS %[h],%[h],#1 \n" + "BGT 1b \n" + : + [src] "+r" (src), + [sw] "+r" (sw), + [dst] "+r" (dst), + [dw] "+r" (dw), + [h] "+r" (h), + [w] "+r" (w) + : + : + "r4","r5","r11","memory","cc" + ); + break; + + case 3: + sw -= w; + asm volatile( + "MOV r11,#255 \n" + "1: \n" + "MOV r5, %[w] @ r5 = x = w \n" + "MOV r8, %[dst] @ r8 = dp = dst \n" + "2: \n" + "LDRB r4, [%[src]], #1 @ r4 = *src++ \n" + "LDRB r6, [%[src]], #1 @ r6 = *src++ \n" + "LDRB r7, [%[src]], #1 @ r7 = *src++ \n" + "SUBS r5, r5, #3 \n" + "STRB r4, [r8], #1 @ *dp++ = r4 \n" + "STRB r6, [r8], #1 @ *dp++ = r6 \n" + "STRB r7, [r8], #1 @ *dp++ = r7 \n" + "STRB r11,[r8], #1 @ *dp++ = 255 \n" + "BGT 2b \n" + "ADD %[src],%[src],%[sw] @ src += sw \n" + "ADD %[dst],%[dst],%[dw] @ dst += dw \n" + "SUBS %[h],%[h],#1 \n" + "BGT 1b \n" + : + [src] "+r" (src), + [sw] "+r" (sw), + [dst] "+r" (dst), + [dw] "+r" (dw), + [h] "+r" (h), + [w] "+r" (w) + : + : + "r4","r5","r6","r7","r8","r11","memory","cc" + ); + break; + + default: + sw -= w; + asm volatile( + "mov r9,#255 \n" + "1: \n" + "mov r7, %[dst] @ r7 = dp = dst \n" + "mov r8, #1 @ r8 = tpad = 1 \n" + "mov r14,%[w] @ r11= x = w \n" + "2: \n" + "ldrb r10,[%[src]],#1 \n" + "subs r8, r8, #1 \n" + "moveq r8, %[pad] \n" + "streqb r9, [r7], #1 \n" + "strb r10,[r7], #1 \n" + "subs r14,r14, #1 \n" + "bgt 2b \n" + "add %[src],%[src],%[sw] \n" + "add %[dst],%[dst],%[dw] \n" + "subs %[h], %[h], #1 \n" + "bgt 1b \n" + : + [src] "+r" (src), + [sw] "+r" (sw), + [dst] "+r" (dst), + [dw] "+r" (dw), + [h] "+r" (h), + [w] "+r" (w), + [pad] "+r" (pad) + : + : + "r7","r8","r9","r10","r14","memory","cc" + ); + break; + } +} + +void +fz_accelerate_arch(void) +{ + fz_path_w4i1o4 = path_w4i1o4_arm; + fz_loadtile8 = load_tile8_arm; + fz_srow4 = fz_srow4_arm; + fz_scol4 = fz_scol4_arm; +} + +#endif diff --git a/contrib/media/updf_newlib/draw/arch_port.c b/contrib/media/updf_newlib/draw/arch_port.c new file mode 100755 index 000000000..fa5890b5f --- /dev/null +++ b/contrib/media/updf_newlib/draw/arch_port.c @@ -0,0 +1,486 @@ +#include "fitz.h" + +typedef unsigned char byte; + +/* These C implementations use SWAR (SIMD-within-a-register) techniques. */ + +#if 0 /* TODO: move into porterduff.c functions */ + +#define MASK 0xFF00FF00; + +static void +path_w4i1o4_32bit(byte *rgba, + byte * restrict src, byte cov, int len, byte * restrict dst) +{ + /* COLOR * coverage + DST * (256-coverage) = (COLOR - DST)*coverage + DST*256 */ + unsigned int *dst32 = (unsigned int *)(void *)dst; + int alpha = rgba[3]; + unsigned int rb = rgba[0] | (rgba[2] << 16); + unsigned int ga = rgba[1] | 0xFF0000; + + if (alpha == 0) + return; + + if (alpha != 255) + { + alpha += alpha>>7; /* alpha is now in the 0...256 range */ + while (len--) + { + unsigned int ca, drb, dga, crb, cga; + cov += *src; *src++ = 0; + ca = cov + (cov>>7); /* ca is in 0...256 range */ + ca = (ca*alpha)>>8; /* ca is is in 0...256 range */ + drb = *dst32++; + if (ca != 0) + { + dga = drb & MASK; + drb = (drb<<8) & MASK; + cga = ga - (dga>>8); + crb = rb - (drb>>8); + dga += cga * ca; + drb += crb * ca; + dga &= MASK; + drb &= MASK; + drb = dga | (drb>>8); + dst32[-1] = drb; + } + } + } + else + { + while (len--) + { + unsigned int ca, drb, dga, crb, cga; + cov += *src; *src++ = 0; + ca = cov + (cov>>7); /* ca is in 0...256 range */ + drb = *dst32++; + if (ca == 0) + continue; + if (ca == 255) + { + drb = (ga<<8) | rb; + } + else + { + dga = drb & MASK; + drb = (drb<<8) & MASK; + cga = ga - (dga>>8); + crb = rb - (drb>>8); + dga += cga * ca; + drb += crb * ca; + dga &= MASK; + drb &= MASK; + drb = dga |(drb>>8); + } + dst32[-1] = drb; + } + } +} + +static void +text_w4i1o4_32bit(byte *rgba, + byte * restrict src, int srcw, + byte * restrict dst, int dstw, int w0, int h) +{ + unsigned int *dst32 = (unsigned int *)(void *)dst; + unsigned int alpha = rgba[3]; + unsigned int rb = rgba[0] | (rgba[2] << 16); + unsigned int ga = rgba[1] | 0xFF0000; + + if (alpha == 0) + return; + + srcw -= w0; + dstw = (dstw>>2)-w0; + + if (alpha != 255) + { + alpha += alpha>>7; /* alpha is now in the 0...256 range */ + while (h--) + { + int w = w0; + while (w--) + { + unsigned int ca, drb, dga, crb, cga; + ca = *src++; + drb = *dst32++; + ca += ca>>7; + ca = (ca*alpha)>>8; + if (ca == 0) + continue; + dga = drb & MASK; + drb = (drb<<8) & MASK; + cga = ga - (dga>>8); + crb = rb - (drb>>8); + dga += cga * ca; + drb += crb * ca; + dga &= MASK; + drb &= MASK; + drb = dga | (drb>>8); + dst32[-1] = drb; + } + src += srcw; + dst32 += dstw; + } + } + else + { + while (h--) + { + int w = w0; + while (w--) + { + unsigned int ca, drb, dga, crb, cga; + ca = *src++; + drb = *dst32++; + ca += ca>>7; + if (ca == 0) + continue; + dga = drb & MASK; + drb = (drb<<8) & MASK; + cga = ga - (dga>>8); + crb = rb - (drb>>8); + dga += cga * ca; + drb += crb * ca; + dga &= MASK; + drb &= MASK; + drb = dga | (drb>>8); + dst32[-1] = drb; + } + src += srcw; + dst32 += dstw; + } + } +} + +static void +img_4o4_32bit(byte * restrict src, byte cov, int len, byte * restrict dst, + fz_pixmap *image, int u, int v, int fa, int fb) +{ + unsigned int *dst32 = (unsigned int *)(void *)dst; + unsigned int *samples = (unsigned int *)(void *)image->samples; + int w = image->w; + int h = image->h-1; + + while (len--) + { + unsigned int a, a1, d, d1; + int sa; + cov += *src; *src = 0; src++; + /* (a,a1) = sampleargb(samples, w, h, u, v, argb); */ + { + int ui, ui1, vi, vi1, ud, vd; + unsigned int b, b1, c, c1; + ui1 = 1; + ui = u >> 16; + if (ui < 0) + { + ui = 0; + ui1 = 0; + } + else if (ui >= w-1) + { + ui = w-1; + ui1 = 0; + } + vi1 = w; + vi = v >> 16; + if (vi < 0) + { + vi = 0; + vi1 = 0; + } + else if (vi >= h) + { + vi = h; + vi1 = 0; + } + ui += vi*w; + a = samples[ui]; + b = samples[ui + ui1]; + c = samples[ui + vi1]; + d = samples[ui + ui1 + vi1]; + ud = (u>>8) & 0xFF; + vd = (v>>8) & 0xFF; + ud = FZ_EXPAND(ud); + vd = FZ_EXPAND(vd); + /* (a,a1) = blend(a,b,ud) */ + a1 = a & MASK; + a = (a<<8) & MASK; + b1 = (b>>8) & ~MASK; + b = b & ~MASK; + a = ((b -(a >>8)) * ud + a ) & MASK; + a1 = ((b1-(a1>>8)) * ud + a1) & MASK; + /* (c,c1) = blend(c,d,ud) */ + c1 = c & MASK; + c = (c<<8) & MASK; + d1 = (d>>8) & ~MASK; + d = d & ~MASK; + c = ((d -(c >>8)) * ud + c ) & MASK; + c1 = ((d1-(c1>>8)) * ud + c1) & MASK; + /* (a,a1) = blend((a,a1),(c,c1),vd) */ + a = (((c >>8)-(a >>8)) * vd + a ) & MASK; + a1 = (((c1>>8)-(a1>>8)) * vd + a1) & MASK; + } + sa = (a1>>24); + sa = FZ_COMBINE(FZ_EXPAND(sa), FZ_EXPAND(cov)); + a1 |= 0xFF000000; + d = *dst32++; + d1 = d & MASK; + d = (d<<8) & MASK; + a = (((a >>8)-(d >>8)) * sa + d ) & MASK; + a1 = (((a1>>8)-(d1>>8)) * sa + d1) & MASK; + dst32[-1] = (a>>8) | a1; + u += fa; + v += fb; + } +} + +static void +img_w4i1o4_32bit(byte *rgba, byte * restrict src, byte cov, int len, + byte * restrict dst, fz_pixmap *image, int u, int v, int fa, int fb) +{ + byte *samples = image->samples; + int w = image->w; + int h = image->h-1; + int alpha = FZ_EXPAND(rgba[3]); + unsigned int rb = rgba[0] | (rgba[2] << 16); + unsigned int ga = rgba[1] | 0xFF0000; + unsigned int *dst32 = (unsigned int *)(void *)dst; + + if (alpha == 0) + return; + if (alpha != 256) + { + while (len--) + { + unsigned int ca, drb, dga, crb, cga; + unsigned int a, b; + cov += *src; *src = 0; src++; + drb = *dst32++; + ca = FZ_COMBINE(FZ_EXPAND(cov), alpha); + if (ca != 0) + { + int ui, ui1, vi, vi1, ud, vd; + /* a = samplemask(samples, w, h, u, v); */ + ui1 = 1; + ui = u >> 16; + if (ui < 0) + { + ui = 0; + ui1 = 0; + } + else if (ui >= w-1) + { + ui = w-1; + ui1 = 0; + } + vi1 = w; + vi = v >> 16; + if (vi < 0) + { + vi = 0; + vi1 = 0; + } + else if (vi >= h) + { + vi = h; + vi1 = 0; + } + ui += vi*w; + a = samples[ui]; + b = samples[ui + ui1]; + a |= samples[ui + vi1]<<16; + b |= samples[ui + ui1 + vi1]<<16; + ud = (u>>8) & 0xFF; + vd = (v>>8) & 0xFF; + ud = FZ_EXPAND(ud); + vd = FZ_EXPAND(vd); + /* a = blend(a,b,ud) */ + a = ((b-a) * ud + (a<<8)) & MASK; + /* a = blend(a,a>>16,vd) */ + a = (((a>>24)-(a>>8)) * vd + a); + a = (a>>8) & 0xFF; + ca = FZ_COMBINE(ca, FZ_EXPAND(a)); + } + if (ca != 0) + { + dga = drb & MASK; + drb = (drb<<8) & MASK; + cga = ga - (dga>>8); + crb = rb - (drb>>8); + dga += cga * ca; + drb += crb * ca; + dga &= MASK; + drb &= MASK; + drb = dga | (drb>>8); + dst32[-1] = drb; + } + u += fa; + v += fb; + } + } + else + { + while (len--) + { + unsigned int ca, drb, dga, crb, cga; + unsigned int a, b; + cov += *src; *src = 0; src++; + drb = *dst32++; + if (cov != 0) + { + int ui, ui1, vi, vi1, ud, vd; + /* a = samplemask(samples, w, h, u, v); */ + ui1 = 1; + ui = u >> 16; + if (ui < 0) + { + ui = 0; + ui1 = 0; + } + else if (ui >= w-1) + { + ui = w-1; + ui1 = 0; + } + vi1 = w; + vi = v >> 16; + if (vi < 0) + { + vi = 0; + vi1 = 0; + } + else if (vi >= h) + { + vi = h; + vi1 = 0; + } + ui += vi*w; + a = samples[ui]; + b = samples[ui + ui1]; + a |= samples[ui + vi1]<<16; + b |= samples[ui + ui1 + vi1]<<16; + ud = (u>>8) & 0xFF; + vd = (v>>8) & 0xFF; + ud = FZ_EXPAND(ud); + vd = FZ_EXPAND(vd); + /* a = blend(a,b,ud) */ + a = ((b-a) * ud + (a<<8)) & MASK; + /* a = blend(a,a>>16,vd) */ + a = (((a>>24)-(a>>8)) * vd + a); + a = (a>>8) & 0xFF; + ca = FZ_COMBINE(FZ_EXPAND(cov),FZ_EXPAND(a)); + if (ca != 0) + { + if (ca == 256) + { + drb = (ga<<8) | rb; + } + else + { + dga = drb & MASK; + drb = (drb<<8) & MASK; + cga = ga - (dga>>8); + crb = rb - (drb>>8); + dga += cga * ca; + drb += crb * ca; + dga &= MASK; + drb &= MASK; + drb = dga | (drb>>8); + } + dst32[-1] = drb; + } + } + u += fa; + v += fb; + } + } +} + +static void +img_1o1_32bit(byte * restrict src, byte cov, int len, byte * restrict dst, + fz_pixmap *image, int u, int v, int fa, int fb) +{ + byte *samples = image->samples; + int w = image->w; + int h = image->h-1; + + while (len--) + { + unsigned int a, b; + cov += *src; *src = 0; src++; + if (cov != 0) + { + int ui, ui1, vi, vi1, ud, vd; + /* sa = samplemask(samples, w, h, u, v); */ + ui1 = 1; + ui = u >> 16; + if (ui < 0) + { + ui = 0; + ui1 = 0; + } + else if (ui >= w-1) + { + ui = w-1; + ui1 = 0; + } + vi1 = w; + vi = v >> 16; + if (vi < 0) + { + vi = 0; + vi1 = 0; + } + else if (vi >= h) + { + vi = h; + vi1 = 0; + } + ui += vi*w; + a = samples[ui]; + b = samples[ui + ui1]; + a |= samples[ui + vi1]<<16; + b |= samples[ui + ui1 + vi1]<<16; + ud = (u>>8) & 0xFF; + vd = (v>>8) & 0xFF; + ud = FZ_EXPAND(ud); + vd = FZ_EXPAND(vd); + /* a = blend(a,b,ud) */ + a = ((b-a) * ud + (a<<8)) & MASK; + /* a = blend(a,a>>16,vd) */ + a = (((a>>24)-(a>>8)) * vd + a); + a = (a>>8) & 0xFF; + a = FZ_COMBINE(FZ_EXPAND(a), FZ_EXPAND(cov)); + if (a != 0) + { + if (a == 256) + dst[0] = 255; + else + dst[0] = FZ_BLEND(255, dst[0], a); + } + } + dst++; + u += fa; + v += fb; + } +} + +#endif + +void fz_accelerate(void) +{ + if (sizeof(int) == 4 && sizeof(unsigned int) == 4 && !fz_is_big_endian()) + { +// fz_path_w4i1o4 = path_w4i1o4_32bit; +// fz_text_w4i1o4 = text_w4i1o4_32bit; +// fz_img_4o4 = img_4o4_32bit; +// fz_img_w4i1o4 = img_w4i1o4_32bit; +// fz_img_1o1 = img_1o1_32bit; + } + +#ifdef HAVE_CPUDEP + fz_accelerate_arch(); +#endif +} diff --git a/contrib/media/updf_newlib/draw/draw_affine.c b/contrib/media/updf_newlib/draw/draw_affine.c new file mode 100755 index 000000000..95d28beac --- /dev/null +++ b/contrib/media/updf_newlib/draw/draw_affine.c @@ -0,0 +1,588 @@ +#include "fitz.h" + +typedef unsigned char byte; + +static inline float roundup(float x) +{ + return (x < 0) ? floorf(x) : ceilf(x); +} + +static inline int lerp(int a, int b, int t) +{ + return a + (((b - a) * t) >> 16); +} + +static inline int bilerp(int a, int b, int c, int d, int u, int v) +{ + return lerp(lerp(a, b, u), lerp(c, d, u), v); +} + +static inline byte *sample_nearest(byte *s, int w, int h, int n, int u, int v) +{ + if (u < 0) u = 0; + if (v < 0) v = 0; + if (u >= w) u = w - 1; + if (v >= h) v = h - 1; + return s + (v * w + u) * n; +} + +/* Blend premultiplied source image in constant alpha over destination */ + +static inline void +fz_paint_affine_alpha_N_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *hp) +{ + int k; + int n1 = n-1; + + while (w--) + { + int ui = u >> 16; + int vi = v >> 16; + if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) + { + int uf = u & 0xffff; + int vf = v & 0xffff; + byte *a = sample_nearest(sp, sw, sh, n, ui, vi); + byte *b = sample_nearest(sp, sw, sh, n, ui+1, vi); + byte *c = sample_nearest(sp, sw, sh, n, ui, vi+1); + byte *d = sample_nearest(sp, sw, sh, n, ui+1, vi+1); + int xa = bilerp(a[n1], b[n1], c[n1], d[n1], uf, vf); + int t; + xa = fz_mul255(xa, alpha); + t = 255 - xa; + for (k = 0; k < n1; k++) + { + int x = bilerp(a[k], b[k], c[k], d[k], uf, vf); + dp[k] = fz_mul255(x, alpha) + fz_mul255(dp[k], t); + } + dp[n1] = xa + fz_mul255(dp[n1], t); + if (hp) + hp[0] = xa + fz_mul255(hp[n1], t); + } + dp += n; + if (hp) + hp++; + u += fa; + v += fb; + } +} + +/* Special case code for gray -> rgb */ +static inline void +fz_paint_affine_alpha_g2rgb_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int alpha, byte *hp) +{ + while (w--) + { + int ui = u >> 16; + int vi = v >> 16; + if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) + { + int uf = u & 0xffff; + int vf = v & 0xffff; + byte *a = sample_nearest(sp, sw, sh, 2, ui, vi); + byte *b = sample_nearest(sp, sw, sh, 2, ui+1, vi); + byte *c = sample_nearest(sp, sw, sh, 2, ui, vi+1); + byte *d = sample_nearest(sp, sw, sh, 2, ui+1, vi+1); + int y = bilerp(a[1], b[1], c[1], d[1], uf, vf); + int x = bilerp(a[0], b[0], c[0], d[0], uf, vf); + int t; + x = fz_mul255(x, alpha); + y = fz_mul255(y, alpha); + t = 255 - y; + dp[0] = x + fz_mul255(dp[0], t); + dp[1] = x + fz_mul255(dp[1], t); + dp[2] = x + fz_mul255(dp[2], t); + dp[3] = y + fz_mul255(dp[3], t); + if (hp) + hp[0] = y + fz_mul255(hp[0], t); + } + dp += 4; + if (hp) + hp++; + u += fa; + v += fb; + } +} + +static inline void +fz_paint_affine_alpha_N_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *hp) +{ + int k; + int n1 = n-1; + + while (w--) + { + int ui = u >> 16; + int vi = v >> 16; + if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) + { + byte *sample = sp + ((vi * sw + ui) * n); + int a = fz_mul255(sample[n-1], alpha); + int t = 255 - a; + for (k = 0; k < n1; k++) + dp[k] = fz_mul255(sample[k], alpha) + fz_mul255(dp[k], t); + dp[n1] = a + fz_mul255(dp[n1], t); + if (hp) + hp[0] = a + fz_mul255(hp[n1], t); + } + dp += n; + if (hp) + hp++; + u += fa; + v += fb; + } +} + +static inline void +fz_paint_affine_alpha_g2rgb_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int alpha, byte *hp) +{ + while (w--) + { + int ui = u >> 16; + int vi = v >> 16; + if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) + { + byte *sample = sp + ((vi * sw + ui) * 2); + int x = fz_mul255(sample[0], alpha); + int a = fz_mul255(sample[1], alpha); + int t = 255 - a; + dp[0] = x + fz_mul255(dp[0], t); + dp[1] = x + fz_mul255(dp[1], t); + dp[2] = x + fz_mul255(dp[2], t); + dp[3] = a + fz_mul255(dp[3], t); + if (hp) + hp[0] = a + fz_mul255(hp[0], t); + } + dp += 4; + if (hp) + hp++; + u += fa; + v += fb; + } +} + +/* Blend premultiplied source image over destination */ + +static inline void +fz_paint_affine_N_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, byte *hp) +{ + int k; + int n1 = n-1; + + while (w--) + { + int ui = u >> 16; + int vi = v >> 16; + if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) + { + int uf = u & 0xffff; + int vf = v & 0xffff; + byte *a = sample_nearest(sp, sw, sh, n, ui, vi); + byte *b = sample_nearest(sp, sw, sh, n, ui+1, vi); + byte *c = sample_nearest(sp, sw, sh, n, ui, vi+1); + byte *d = sample_nearest(sp, sw, sh, n, ui+1, vi+1); + int y = bilerp(a[n1], b[n1], c[n1], d[n1], uf, vf); + int t = 255 - y; + for (k = 0; k < n1; k++) + { + int x = bilerp(a[k], b[k], c[k], d[k], uf, vf); + dp[k] = x + fz_mul255(dp[k], t); + } + dp[n1] = y + fz_mul255(dp[n1], t); + if (hp) + hp[0] = y + fz_mul255(hp[0], t); + } + dp += n; + if (hp) + hp++; + u += fa; + v += fb; + } +} + +static inline void +fz_paint_affine_solid_g2rgb_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, byte *hp) +{ + while (w--) + { + int ui = u >> 16; + int vi = v >> 16; + if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) + { + int uf = u & 0xffff; + int vf = v & 0xffff; + byte *a = sample_nearest(sp, sw, sh, 2, ui, vi); + byte *b = sample_nearest(sp, sw, sh, 2, ui+1, vi); + byte *c = sample_nearest(sp, sw, sh, 2, ui, vi+1); + byte *d = sample_nearest(sp, sw, sh, 2, ui+1, vi+1); + int y = bilerp(a[1], b[1], c[1], d[1], uf, vf); + int t = 255 - y; + int x = bilerp(a[0], b[0], c[0], d[0], uf, vf); + dp[0] = x + fz_mul255(dp[0], t); + dp[1] = x + fz_mul255(dp[1], t); + dp[2] = x + fz_mul255(dp[2], t); + dp[3] = y + fz_mul255(dp[3], t); + if (hp) + hp[0] = y + fz_mul255(hp[0], t); + } + dp += 4; + if (hp) + hp++; + u += fa; + v += fb; + } +} + +static inline void +fz_paint_affine_N_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, byte *hp) +{ + int k; + int n1 = n-1; + + while (w--) + { + int ui = u >> 16; + int vi = v >> 16; + if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) + { + byte *sample = sp + ((vi * sw + ui) * n); + int a = sample[n1]; + int t = 255 - a; + for (k = 0; k < n1; k++) + dp[k] = sample[k] + fz_mul255(dp[k], t); + dp[n1] = a + fz_mul255(dp[n1], t); + if (hp) + hp[0] = a + fz_mul255(hp[0], t); + } + dp += n; + if (hp) + hp++; + u += fa; + v += fb; + } +} + +static inline void +fz_paint_affine_solid_g2rgb_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, byte *hp) +{ + while (w--) + { + int ui = u >> 16; + int vi = v >> 16; + if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) + { + byte *sample = sp + ((vi * sw + ui) * 2); + int x = sample[0]; + int a = sample[1]; + int t = 255 - a; + dp[0] = x + fz_mul255(dp[0], t); + dp[1] = x + fz_mul255(dp[1], t); + dp[2] = x + fz_mul255(dp[2], t); + dp[3] = a + fz_mul255(dp[3], t); + if (hp) + hp[0] = a + fz_mul255(hp[0], t); + } + dp += 4; + if (hp) + hp++; + u += fa; + v += fb; + } +} + +/* Blend non-premultiplied color in source image mask over destination */ + +static inline void +fz_paint_affine_color_N_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, byte *color, byte *hp) +{ + int n1 = n - 1; + int sa = color[n1]; + int k; + + while (w--) + { + int ui = u >> 16; + int vi = v >> 16; + if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) + { + int uf = u & 0xffff; + int vf = v & 0xffff; + byte *a = sample_nearest(sp, sw, sh, 1, ui, vi); + byte *b = sample_nearest(sp, sw, sh, 1, ui+1, vi); + byte *c = sample_nearest(sp, sw, sh, 1, ui, vi+1); + byte *d = sample_nearest(sp, sw, sh, 1, ui+1, vi+1); + int ma = bilerp(a[0], b[0], c[0], d[0], uf, vf); + int masa = FZ_COMBINE(FZ_EXPAND(ma), sa); + for (k = 0; k < n1; k++) + dp[k] = FZ_BLEND(color[k], dp[k], masa); + dp[n1] = FZ_BLEND(255, dp[n1], masa); + if (hp) + hp[0] = FZ_BLEND(255, hp[0], masa); + } + dp += n; + if (hp) + hp++; + u += fa; + v += fb; + } +} + +static inline void +fz_paint_affine_color_N_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, byte *color, byte *hp) +{ + int n1 = n-1; + int sa = color[n1]; + int k; + + while (w--) + { + int ui = u >> 16; + int vi = v >> 16; + if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) + { + int ma = sp[vi * sw + ui]; + int masa = FZ_COMBINE(FZ_EXPAND(ma), sa); + for (k = 0; k < n1; k++) + dp[k] = FZ_BLEND(color[k], dp[k], masa); + dp[n1] = FZ_BLEND(255, dp[n1], masa); + if (hp) + hp[n1] = FZ_BLEND(255, hp[n1], masa); + } + dp += n; + if (hp) + hp++; + u += fa; + v += fb; + } +} + +static void +fz_paint_affine_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *color/*unused*/, byte *hp) +{ + if (alpha == 255) + { + switch (n) + { + case 1: fz_paint_affine_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 1, hp); break; + case 2: fz_paint_affine_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 2, hp); break; + case 4: fz_paint_affine_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 4, hp); break; + default: fz_paint_affine_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, n, hp); break; + } + } + else if (alpha > 0) + { + switch (n) + { + case 1: fz_paint_affine_alpha_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 1, alpha, hp); break; + case 2: fz_paint_affine_alpha_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 2, alpha, hp); break; + case 4: fz_paint_affine_alpha_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 4, alpha, hp); break; + default: fz_paint_affine_alpha_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, n, alpha, hp); break; + } + } +} + +static void +fz_paint_affine_g2rgb_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *color/*unused*/, byte *hp) +{ + if (alpha == 255) + { + fz_paint_affine_solid_g2rgb_lerp(dp, sp, sw, sh, u, v, fa, fb, w, hp); + } + else if (alpha > 0) + { + fz_paint_affine_alpha_g2rgb_lerp(dp, sp, sw, sh, u, v, fa, fb, w, alpha, hp); + } +} + +static void +fz_paint_affine_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *color/*unused */, byte *hp) +{ + if (alpha == 255) + { + switch (n) + { + case 1: fz_paint_affine_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 1, hp); break; + case 2: fz_paint_affine_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 2, hp); break; + case 4: fz_paint_affine_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 4, hp); break; + default: fz_paint_affine_N_near(dp, sp, sw, sh, u, v, fa, fb, w, n, hp); break; + } + } + else if (alpha > 0) + { + switch (n) + { + case 1: fz_paint_affine_alpha_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 1, alpha, hp); break; + case 2: fz_paint_affine_alpha_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 2, alpha, hp); break; + case 4: fz_paint_affine_alpha_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 4, alpha, hp); break; + default: fz_paint_affine_alpha_N_near(dp, sp, sw, sh, u, v, fa, fb, w, n, alpha, hp); break; + } + } +} + +static void +fz_paint_affine_g2rgb_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *color/*unused*/, byte *hp) +{ + if (alpha == 255) + { + fz_paint_affine_solid_g2rgb_near(dp, sp, sw, sh, u, v, fa, fb, w, hp); + } + else if (alpha > 0) + { + fz_paint_affine_alpha_g2rgb_near(dp, sp, sw, sh, u, v, fa, fb, w, alpha, hp); + } +} + +static void +fz_paint_affine_color_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha/*unused*/, byte *color, byte *hp) +{ + switch (n) + { + case 2: fz_paint_affine_color_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 2, color, hp); break; + case 4: fz_paint_affine_color_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, 4, color, hp); break; + default: fz_paint_affine_color_N_lerp(dp, sp, sw, sh, u, v, fa, fb, w, n, color, hp); break; + } +} + +static void +fz_paint_affine_color_near(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha/*unused*/, byte *color, byte *hp) +{ + switch (n) + { + case 2: fz_paint_affine_color_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 2, color, hp); break; + case 4: fz_paint_affine_color_N_near(dp, sp, sw, sh, u, v, fa, fb, w, 4, color, hp); break; + default: fz_paint_affine_color_N_near(dp, sp, sw, sh, u, v, fa, fb, w, n, color, hp); break; + } +} + +/* Draw an image with an affine transform on destination */ + +static void +fz_paint_image_imp(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, byte *color, int alpha) +{ + byte *dp, *sp, *hp; + int u, v, fa, fb, fc, fd; + int x, y, w, h; + int sw, sh, n, hw; + fz_matrix inv; + fz_bbox bbox; + int dolerp; + void (*paintfn)(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *color, byte *hp); + + /* grid fit the image */ + if (fz_is_rectilinear(ctm)) + { + ctm.a = roundup(ctm.a); + ctm.b = roundup(ctm.b); + ctm.c = roundup(ctm.c); + ctm.d = roundup(ctm.d); + ctm.e = floorf(ctm.e); + ctm.f = floorf(ctm.f); + } + + /* turn on interpolation for upscaled and non-rectilinear transforms */ + dolerp = 0; + if (!fz_is_rectilinear(ctm)) + dolerp = 1; + if (sqrtf(ctm.a * ctm.a + ctm.b * ctm.b) > img->w) + dolerp = 1; + if (sqrtf(ctm.c * ctm.c + ctm.d * ctm.d) > img->h) + dolerp = 1; + + /* except when we shouldn't, at large magnifications */ + if (!img->interpolate) + { + if (sqrtf(ctm.a * ctm.a + ctm.b * ctm.b) > img->w * 2) + dolerp = 0; + if (sqrtf(ctm.c * ctm.c + ctm.d * ctm.d) > img->h * 2) + dolerp = 0; + } + + bbox = fz_round_rect(fz_transform_rect(ctm, fz_unit_rect)); + bbox = fz_intersect_bbox(bbox, scissor); + x = bbox.x0; + y = bbox.y0; + w = bbox.x1 - bbox.x0; + h = bbox.y1 - bbox.y0; + + /* map from screen space (x,y) to image space (u,v) */ + inv = fz_scale(1.0f / img->w, -1.0f / img->h); + inv = fz_concat(inv, fz_translate(0, 1)); + inv = fz_concat(inv, ctm); + inv = fz_invert_matrix(inv); + + fa = inv.a * 65536; + fb = inv.b * 65536; + fc = inv.c * 65536; + fd = inv.d * 65536; + + /* Calculate initial texture positions. Do a half step to start. */ + u = (fa * x) + (fc * y) + inv.e * 65536 + ((fa + fc) >> 1); + v = (fb * x) + (fd * y) + inv.f * 65536 + ((fb + fd) >> 1); + + dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n; + n = dst->n; + sp = img->samples; + sw = img->w; + sh = img->h; + if (shape) + { + hw = shape->w; + hp = shape->samples + ((y - shape->y) * hw) + x - dst->x; + } + else + { + hw = 0; + hp = NULL; + } + + /* TODO: if (fb == 0 && fa == 1) call fz_paint_span */ + + if (dst->n == 4 && img->n == 2) + { + assert(color == NULL); + if (dolerp) + paintfn = fz_paint_affine_g2rgb_lerp; + else + paintfn = fz_paint_affine_g2rgb_near; + } + else + { + if (dolerp) + { + if (color) + paintfn = fz_paint_affine_color_lerp; + else + paintfn = fz_paint_affine_lerp; + } + else + { + if (color) + paintfn = fz_paint_affine_color_near; + else + paintfn = fz_paint_affine_near; + } + } + + while (h--) + { + paintfn(dp, sp, sw, sh, u, v, fa, fb, w, n, alpha, color, hp); + dp += dst->w * n; + hp += hw; + u += fc; + v += fd; + } +} + +void +fz_paint_image_with_color(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, byte *color) +{ + assert(img->n == 1); + fz_paint_image_imp(dst, scissor, shape, img, ctm, color, 255); +} + +void +fz_paint_image(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, int alpha) +{ + assert(dst->n == img->n || (dst->n == 4 && img->n == 2)); + fz_paint_image_imp(dst, scissor, shape, img, ctm, NULL, alpha); +} diff --git a/contrib/media/updf_newlib/draw/draw_blend.c b/contrib/media/updf_newlib/draw/draw_blend.c new file mode 100755 index 000000000..2f72ec9cf --- /dev/null +++ b/contrib/media/updf_newlib/draw/draw_blend.c @@ -0,0 +1,567 @@ +#include "fitz.h" + +/* PDF 1.4 blend modes. These are slow. */ + +typedef unsigned char byte; + +static const char *fz_blendmode_names[] = +{ + "Normal", + "Multiply", + "Screen", + "Overlay", + "Darken", + "Lighten", + "ColorDodge", + "ColorBurn", + "HardLight", + "SoftLight", + "Difference", + "Exclusion", + "Hue", + "Saturation", + "Color", + "Luminosity", +}; + +int fz_find_blendmode(char *name) +{ + int i; + for (i = 0; i < nelem(fz_blendmode_names); i++) + if (!strcmp(name, fz_blendmode_names[i])) + return i; + return FZ_BLEND_NORMAL; +} + +char *fz_blendmode_name(int blendmode) +{ + if (blendmode >= 0 && blendmode < nelem(fz_blendmode_names)) + return (char*)fz_blendmode_names[blendmode]; + return "Normal"; +} + +/* Separable blend modes */ + +static inline int fz_screen_byte(int b, int s) +{ + return b + s - fz_mul255(b, s); +} + +static inline int fz_hard_light_byte(int b, int s) +{ + int s2 = s << 1; + if (s <= 127) + return fz_mul255(b, s2); + else + return fz_screen_byte(b, s2 - 255); +} + +static inline int fz_overlay_byte(int b, int s) +{ + return fz_hard_light_byte(s, b); /* note swapped order */ +} + +static inline int fz_darken_byte(int b, int s) +{ + return MIN(b, s); +} + +static inline int fz_lighten_byte(int b, int s) +{ + return MAX(b, s); +} + +static inline int fz_color_dodge_byte(int b, int s) +{ + s = 255 - s; + if (b == 0) + return 0; + else if (b >= s) + return 255; + else + return (0x1fe * b + s) / (s << 1); +} + +static inline int fz_color_burn_byte(int b, int s) +{ + b = 255 - b; + if (b == 0) + return 255; + else if (b >= s) + return 0; + else + return 0xff - (0x1fe * b + s) / (s << 1); +} + +static inline int fz_soft_light_byte(int b, int s) +{ + /* review this */ + if (s < 128) { + return b - fz_mul255(fz_mul255((255 - (s<<1)), b), 255 - b); + } + else { + int dbd; + if (b < 64) + dbd = fz_mul255(fz_mul255((b << 4) - 12, b) + 4, b); + else + dbd = (int)sqrtf(255.0f * b); + return b + fz_mul255(((s<<1) - 255), (dbd - b)); + } +} + +static inline int fz_difference_byte(int b, int s) +{ + return ABS(b - s); +} + +static inline int fz_exclusion_byte(int b, int s) +{ + return b + s - (fz_mul255(b, s)<<1); +} + +/* Non-separable blend modes */ + +static void +fz_luminosity_rgb(int *rd, int *gd, int *bd, int rb, int gb, int bb, int rs, int gs, int bs) +{ + int delta, scale; + int r, g, b, y; + + /* 0.3, 0.59, 0.11 in fixed point */ + delta = ((rs - rb) * 77 + (gs - gb) * 151 + (bs - bb) * 28 + 0x80) >> 8; + r = rb + delta; + g = gb + delta; + b = bb + delta; + + if ((r | g | b) & 0x100) + { + y = (rs * 77 + gs * 151 + bs * 28 + 0x80) >> 8; + if (delta > 0) + { + int max; + max = MAX(r, MAX(g, b)); + scale = ((255 - y) << 16) / (max - y); + } + else + { + int min; + min = MIN(r, MIN(g, b)); + scale = (y << 16) / (y - min); + } + r = y + (((r - y) * scale + 0x8000) >> 16); + g = y + (((g - y) * scale + 0x8000) >> 16); + b = y + (((b - y) * scale + 0x8000) >> 16); + } + + *rd = r; + *gd = g; + *bd = b; +} + +static void +fz_saturation_rgb(int *rd, int *gd, int *bd, int rb, int gb, int bb, int rs, int gs, int bs) +{ + int minb, maxb; + int mins, maxs; + int y; + int scale; + int r, g, b; + + minb = MIN(rb, MIN(gb, bb)); + maxb = MAX(rb, MAX(gb, bb)); + if (minb == maxb) + { + /* backdrop has zero saturation, avoid divide by 0 */ + *rd = gb; + *gd = gb; + *bd = gb; + return; + } + + mins = MIN(rs, MIN(gs, bs)); + maxs = MAX(rs, MAX(gs, bs)); + + scale = ((maxs - mins) << 16) / (maxb - minb); + y = (rb * 77 + gb * 151 + bb * 28 + 0x80) >> 8; + r = y + ((((rb - y) * scale) + 0x8000) >> 16); + g = y + ((((gb - y) * scale) + 0x8000) >> 16); + b = y + ((((bb - y) * scale) + 0x8000) >> 16); + + if ((r | g | b) & 0x100) + { + int scalemin, scalemax; + int min, max; + + min = MIN(r, MIN(g, b)); + max = MAX(r, MAX(g, b)); + + if (min < 0) + scalemin = (y << 16) / (y - min); + else + scalemin = 0x10000; + + if (max > 255) + scalemax = ((255 - y) << 16) / (max - y); + else + scalemax = 0x10000; + + scale = MIN(scalemin, scalemax); + r = y + (((r - y) * scale + 0x8000) >> 16); + g = y + (((g - y) * scale + 0x8000) >> 16); + b = y + (((b - y) * scale + 0x8000) >> 16); + } + + *rd = r; + *gd = g; + *bd = b; +} + +static void +fz_color_rgb(int *rr, int *rg, int *rb, int br, int bg, int bb, int sr, int sg, int sb) +{ + fz_luminosity_rgb(rr, rg, rb, sr, sg, sb, br, bg, bb); +} + +static void +fz_hue_rgb(int *rr, int *rg, int *rb, int br, int bg, int bb, int sr, int sg, int sb) +{ + int tr, tg, tb; + fz_luminosity_rgb(&tr, &tg, &tb, sr, sg, sb, br, bg, bb); + fz_saturation_rgb(rr, rg, rb, tr, tg, tb, br, bg, bb); +} + +/* Blending loops */ + +void +fz_blend_separable(byte * restrict bp, byte * restrict sp, int n, int w, int blendmode) +{ + int k; + int n1 = n - 1; + while (w--) + { + int sa = sp[n1]; + int ba = bp[n1]; + int saba = fz_mul255(sa, ba); + + /* ugh, division to get non-premul components */ + int invsa = sa ? 255 * 256 / sa : 0; + int invba = ba ? 255 * 256 / ba : 0; + + for (k = 0; k < n1; k++) + { + int sc = (sp[k] * invsa) >> 8; + int bc = (bp[k] * invba) >> 8; + int rc; + + switch (blendmode) + { + default: + case FZ_BLEND_NORMAL: rc = sc; break; + case FZ_BLEND_MULTIPLY: rc = fz_mul255(bc, sc); break; + case FZ_BLEND_SCREEN: rc = fz_screen_byte(bc, sc); break; + case FZ_BLEND_OVERLAY: rc = fz_overlay_byte(bc, sc); break; + case FZ_BLEND_DARKEN: rc = fz_darken_byte(bc, sc); break; + case FZ_BLEND_LIGHTEN: rc = fz_lighten_byte(bc, sc); break; + case FZ_BLEND_COLOR_DODGE: rc = fz_color_dodge_byte(bc, sc); break; + case FZ_BLEND_COLOR_BURN: rc = fz_color_burn_byte(bc, sc); break; + case FZ_BLEND_HARD_LIGHT: rc = fz_hard_light_byte(bc, sc); break; + case FZ_BLEND_SOFT_LIGHT: rc = fz_soft_light_byte(bc, sc); break; + case FZ_BLEND_DIFFERENCE: rc = fz_difference_byte(bc, sc); break; + case FZ_BLEND_EXCLUSION: rc = fz_exclusion_byte(bc, sc); break; + } + + bp[k] = fz_mul255(255 - sa, bp[k]) + fz_mul255(255 - ba, sp[k]) + fz_mul255(saba, rc); + } + + bp[k] = ba + sa - saba; + + sp += n; + bp += n; + } +} + +void +fz_blend_nonseparable(byte * restrict bp, byte * restrict sp, int w, int blendmode) +{ + while (w--) + { + int rr, rg, rb; + + int sa = sp[3]; + int ba = bp[3]; + int saba = fz_mul255(sa, ba); + + /* ugh, division to get non-premul components */ + int invsa = sa ? 255 * 256 / sa : 0; + int invba = ba ? 255 * 256 / ba : 0; + + int sr = (sp[0] * invsa) >> 8; + int sg = (sp[1] * invsa) >> 8; + int sb = (sp[2] * invsa) >> 8; + + int br = (bp[0] * invba) >> 8; + int bg = (bp[1] * invba) >> 8; + int bb = (bp[2] * invba) >> 8; + + switch (blendmode) + { + default: + case FZ_BLEND_HUE: + fz_hue_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb); + break; + case FZ_BLEND_SATURATION: + fz_saturation_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb); + break; + case FZ_BLEND_COLOR: + fz_color_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb); + break; + case FZ_BLEND_LUMINOSITY: + fz_luminosity_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb); + break; + } + + bp[0] = fz_mul255(255 - sa, bp[0]) + fz_mul255(255 - ba, sp[0]) + fz_mul255(saba, rr); + bp[1] = fz_mul255(255 - sa, bp[1]) + fz_mul255(255 - ba, sp[1]) + fz_mul255(saba, rg); + bp[2] = fz_mul255(255 - sa, bp[2]) + fz_mul255(255 - ba, sp[2]) + fz_mul255(saba, rb); + bp[3] = ba + sa - saba; + + sp += 4; + bp += 4; + } +} + +static void +fz_blend_separable_nonisolated(byte * restrict bp, byte * restrict sp, int n, int w, int blendmode, byte * restrict hp, int alpha) +{ + int k; + int n1 = n - 1; + + if (alpha == 255 && blendmode == 0) + { + /* In this case, the uncompositing and the recompositing + * cancel one another out, and it's just a simple copy. */ + /* FIXME: Maybe we can avoid using the shape plane entirely + * and just copy? */ + while (w--) + { + int ha = fz_mul255(*hp++, alpha); /* ha = shape_alpha */ + /* If ha == 0 then leave everything unchanged */ + if (ha != 0) + { + for (k = 0; k < n; k++) + { + bp[k] = sp[k]; + } + } + + sp += n; + bp += n; + } + return; + } + while (w--) + { + int ha = *hp++; + int haa = fz_mul255(ha, alpha); /* ha = shape_alpha */ + /* If haa == 0 then leave everything unchanged */ + if (haa != 0) + { + int sa = sp[n1]; + int ba = bp[n1]; + int baha = fz_mul255(ba, haa); + + /* ugh, division to get non-premul components */ + int invsa = sa ? 255 * 256 / sa : 0; + int invba = ba ? 255 * 256 / ba : 0; + + /* Calculate result_alpha */ + int ra = bp[n1] = ba - baha + haa; + + /* Because we are a non-isolated group, we need to + * 'uncomposite' before we blend (recomposite). + * We assume that normal blending has been done inside + * the group, so: ra.rc = (1-ha).bc + ha.sc + * A bit of rearrangement, and that gives us that: + * sc = (ra.rc - bc)/ha + bc + * Now, the result of the blend was stored in src, so: + */ + int invha = ha ? 255 * 256 / ha : 0; + + if (ra != 0) for (k = 0; k < n1; k++) + { + int sc = (sp[k] * invsa) >> 8; + int bc = (bp[k] * invba) >> 8; + int rc; + + /* Uncomposite */ + sc = (((sc-bc)*invha)>>8) + bc; + if (sc < 0) sc = 0; + if (sc > 255) sc = 255; + + switch (blendmode) + { + default: + case FZ_BLEND_NORMAL: rc = sc; break; + case FZ_BLEND_MULTIPLY: rc = fz_mul255(bc, sc); break; + case FZ_BLEND_SCREEN: rc = fz_screen_byte(bc, sc); break; + case FZ_BLEND_OVERLAY: rc = fz_overlay_byte(bc, sc); break; + case FZ_BLEND_DARKEN: rc = fz_darken_byte(bc, sc); break; + case FZ_BLEND_LIGHTEN: rc = fz_lighten_byte(bc, sc); break; + case FZ_BLEND_COLOR_DODGE: rc = fz_color_dodge_byte(bc, sc); break; + case FZ_BLEND_COLOR_BURN: rc = fz_color_burn_byte(bc, sc); break; + case FZ_BLEND_HARD_LIGHT: rc = fz_hard_light_byte(bc, sc); break; + case FZ_BLEND_SOFT_LIGHT: rc = fz_soft_light_byte(bc, sc); break; + case FZ_BLEND_DIFFERENCE: rc = fz_difference_byte(bc, sc); break; + case FZ_BLEND_EXCLUSION: rc = fz_exclusion_byte(bc, sc); break; + } + rc = fz_mul255(255 - haa, bc) + fz_mul255(fz_mul255(255 - ba, sc), haa) + fz_mul255(baha, rc); + if (rc < 0) rc = 0; + if (rc > 255) rc = 255; + bp[k] = fz_mul255(rc, ra); + } + } + + sp += n; + bp += n; + } +} + +static void +fz_blend_nonseparable_nonisolated(byte * restrict bp, byte * restrict sp, int w, int blendmode, byte * restrict hp, int alpha) +{ + while (w--) + { + int ha = *hp++; + int haa = fz_mul255(ha, alpha); + if (haa != 0) + { + int sa = sp[3]; + int ba = bp[3]; + int baha = fz_mul255(ba, haa); + + /* Calculate result_alpha */ + int ra = bp[3] = ba - baha + haa; + if (ra != 0) + { + /* Because we are a non-isolated group, we + * need to 'uncomposite' before we blend + * (recomposite). We assume that normal + * blending has been done inside the group, + * so: ra.rc = (1-ha).bc + ha.sc + * A bit of rearrangement, and that gives us + * that: sc = (ra.rc - bc)/ha + bc + * Now, the result of the blend was stored in + * src, so: */ + int invha = ha ? 255 * 256 / ha : 0; + + int rr, rg, rb; + + /* ugh, division to get non-premul components */ + int invsa = sa ? 255 * 256 / sa : 0; + int invba = ba ? 255 * 256 / ba : 0; + + int sr = (sp[0] * invsa) >> 8; + int sg = (sp[1] * invsa) >> 8; + int sb = (sp[2] * invsa) >> 8; + + int br = (bp[0] * invba) >> 8; + int bg = (bp[1] * invba) >> 8; + int bb = (bp[2] * invba) >> 8; + + /* Uncomposite */ + sr = (((sr-br)*invha)>>8) + br; + sg = (((sg-bg)*invha)>>8) + bg; + sb = (((sb-bb)*invha)>>8) + bb; + + switch (blendmode) + { + default: + case FZ_BLEND_HUE: + fz_hue_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb); + break; + case FZ_BLEND_SATURATION: + fz_saturation_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb); + break; + case FZ_BLEND_COLOR: + fz_color_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb); + break; + case FZ_BLEND_LUMINOSITY: + fz_luminosity_rgb(&rr, &rg, &rb, br, bg, bb, sr, sg, sb); + break; + } + + rr = fz_mul255(255 - haa, bp[0]) + fz_mul255(fz_mul255(255 - ba, sr), haa) + fz_mul255(baha, rr); + rg = fz_mul255(255 - haa, bp[1]) + fz_mul255(fz_mul255(255 - ba, sg), haa) + fz_mul255(baha, rg); + rb = fz_mul255(255 - haa, bp[2]) + fz_mul255(fz_mul255(255 - ba, sb), haa) + fz_mul255(baha, rb); + bp[0] = fz_mul255(ra, rr); + bp[1] = fz_mul255(ra, rg); + bp[2] = fz_mul255(ra, rb); + } + } + + sp += 4; + bp += 4; + } +} + +void +fz_blend_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha, int blendmode, int isolated, fz_pixmap *shape) +{ + unsigned char *sp, *dp; + fz_bbox bbox; + int x, y, w, h, n; + + /* TODO: fix this hack! */ + if (isolated && alpha < 255) + { + sp = src->samples; + n = src->w * src->h * src->n; + while (n--) + { + *sp = fz_mul255(*sp, alpha); + sp++; + } + } + + bbox = fz_bound_pixmap(dst); + bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(src)); + + x = bbox.x0; + y = bbox.y0; + w = bbox.x1 - bbox.x0; + h = bbox.y1 - bbox.y0; + + n = src->n; + sp = src->samples + ((y - src->y) * src->w + (x - src->x)) * n; + dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * n; + + assert(src->n == dst->n); + + if (!isolated) + { + unsigned char *hp = shape->samples + (y - shape->y) * shape->w + (x - shape->x); + + while (h--) + { + if (n == 4 && blendmode >= FZ_BLEND_HUE) + fz_blend_nonseparable_nonisolated(dp, sp, w, blendmode, hp, alpha); + else + fz_blend_separable_nonisolated(dp, sp, n, w, blendmode, hp, alpha); + sp += src->w * n; + dp += dst->w * n; + hp += shape->w; + } + } + else + { + while (h--) + { + if (n == 4 && blendmode >= FZ_BLEND_HUE) + fz_blend_nonseparable(dp, sp, w, blendmode); + else + fz_blend_separable(dp, sp, n, w, blendmode); + sp += src->w * n; + dp += dst->w * n; + } + } +} diff --git a/contrib/media/updf_newlib/draw/draw_device.c b/contrib/media/updf_newlib/draw/draw_device.c new file mode 100755 index 000000000..76b552766 --- /dev/null +++ b/contrib/media/updf_newlib/draw/draw_device.c @@ -0,0 +1,1582 @@ +#include "fitz.h" + +#define QUANT(x,a) (((int)((x) * (a))) / (a)) +#define HSUBPIX 5.0 +#define VSUBPIX 5.0 + +#define STACK_SIZE 96 + +/* Enable the following to attempt to support knockout and/or isolated + * blending groups. This code is known to give incorrect results currently + * so disabled by default. See bug 692377. */ +#undef ATTEMPT_KNOCKOUT_AND_ISOLATED + +/* Enable the following to help debug group blending. */ +#undef DUMP_GROUP_BLENDS + +/* Note #1: At various points in this code (notably when clipping with non + * rectangular masks), we create a new (empty) destination pixmap. We then + * render this pixmap, then plot it back into the original destination + * through a mask. This works well for normal blending, but falls down for + * non-zero blending modes; effectively we are forcing ourselves to use an + * isolated group. + * + * The fix for this would be to copy the contents from the underlying dest + * into the newly created dest. This would enable us to use a non + * FZ_BLEND_ISOLATED blendmode. Unfortunately, tt would break tiling, as + * we could no longer render once and blend back multiple times. + */ + + +typedef struct fz_draw_device_s fz_draw_device; + +enum { + FZ_DRAWDEV_FLAGS_TYPE3 = 1, +}; + +struct fz_draw_device_s +{ + fz_glyph_cache *cache; + fz_gel *gel; + + fz_pixmap *dest; + fz_pixmap *shape; + fz_bbox scissor; + + int flags; + int top; + int blendmode; + struct { + fz_bbox scissor; + fz_pixmap *dest; + fz_pixmap *mask; + fz_pixmap *shape; + int blendmode; + int luminosity; + float alpha; + fz_matrix ctm; + float xstep, ystep; + fz_rect area; + } stack[STACK_SIZE]; +}; + +#ifdef DUMP_GROUP_BLENDS +static int group_dump_count = 0; + +static void fz_dump_blend(fz_pixmap *pix, const char *s) +{ + char name[80]; + + if (pix == NULL) + return; + + sprintf(name, "dump%02d.png", group_dump_count); + if (s) + printf("%s%02d", s, group_dump_count); + group_dump_count++; + + fz_write_png(pix, name, (pix->n > 1)); +} + +static void dump_spaces(int x, const char *s) +{ + int i; + for (i = 0; i < x; i++) + printf(" "); + printf("%s", s); +} + +#endif + +static void fz_knockout_begin(void *user) +{ + fz_draw_device *dev = user; + fz_bbox bbox; + fz_pixmap *dest, *shape; + int isolated = dev->blendmode & FZ_BLEND_ISOLATED; + + if ((dev->blendmode & FZ_BLEND_KNOCKOUT) == 0) + return; + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + + bbox = fz_bound_pixmap(dev->dest); + bbox = fz_intersect_bbox(bbox, dev->scissor); + dest = fz_new_pixmap_with_rect(dev->dest->colorspace, bbox); + + if (isolated) + { + fz_clear_pixmap(dest); + } + else + { + fz_pixmap *prev; + int i = dev->top; + do + prev = dev->stack[--i].dest; + while (prev == NULL); + fz_copy_pixmap_rect(dest, prev, bbox); + } + + if (dev->blendmode == 0 && isolated) + { + /* We can render direct to any existing shape plane. If there + * isn't one, we don't need to make one. */ + shape = dev->shape; + } + else + { + shape = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(shape); + } + dev->stack[dev->top].blendmode = dev->blendmode; + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].dest = dev->dest; + dev->stack[dev->top].shape = dev->shape; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Knockout begin\n"); +#endif + dev->top++; + + dev->scissor = bbox; + dev->dest = dest; + dev->shape = shape; + dev->blendmode &= ~FZ_BLEND_MODEMASK; +} + +static void fz_knockout_end(void *user) +{ + fz_draw_device *dev = user; + fz_pixmap *group = dev->dest; + fz_pixmap *shape = dev->shape; + int blendmode; + int isolated; + + if ((dev->blendmode & FZ_BLEND_KNOCKOUT) == 0) + return; + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + + if (dev->top > 0) + { + dev->top--; + blendmode = dev->blendmode & FZ_BLEND_MODEMASK; + isolated = dev->blendmode & FZ_BLEND_ISOLATED; + dev->blendmode = dev->stack[dev->top].blendmode; + dev->shape = dev->stack[dev->top].shape; + dev->dest = dev->stack[dev->top].dest; + dev->scissor = dev->stack[dev->top].scissor; + +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, ""); + fz_dump_blend(group, "Blending "); + if (shape) + fz_dump_blend(shape, "/"); + fz_dump_blend(dev->dest, " onto "); + if (dev->shape) + fz_dump_blend(dev->shape, "/"); + if (blendmode != 0) + printf(" (blend %d)", blendmode); + if (isolated != 0) + printf(" (isolated)"); + printf(" (knockout)"); +#endif + if ((blendmode == 0) && (shape == NULL)) + fz_paint_pixmap(dev->dest, group, 255); + else + fz_blend_pixmap(dev->dest, group, 255, blendmode, isolated, shape); + + fz_drop_pixmap(group); + if (shape != dev->shape) + { + if (dev->shape) + { + fz_paint_pixmap(dev->shape, shape, 255); + } + fz_drop_pixmap(shape); + } +#ifdef DUMP_GROUP_BLENDS + fz_dump_blend(dev->dest, " to get "); + if (dev->shape) + fz_dump_blend(dev->shape, "/"); + printf("\n"); +#endif + } +} + +static void +fz_draw_fill_path(void *user, fz_path *path, int even_odd, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + float expansion = fz_matrix_expansion(ctm); + float flatness = 0.3f / expansion; + unsigned char colorbv[FZ_MAX_COLORS + 1]; + float colorfv[FZ_MAX_COLORS]; + fz_bbox bbox; + int i; + + fz_reset_gel(dev->gel, dev->scissor); + fz_flatten_fill_path(dev->gel, path, ctm, flatness); + fz_sort_gel(dev->gel); + + bbox = fz_bound_gel(dev->gel); + bbox = fz_intersect_bbox(bbox, dev->scissor); + + if (fz_is_empty_rect(bbox)) + return; + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); + + fz_convert_color(colorspace, color, model, colorfv); + for (i = 0; i < model->n; i++) + colorbv[i] = colorfv[i] * 255; + colorbv[i] = alpha * 255; + + fz_scan_convert(dev->gel, even_odd, bbox, dev->dest, colorbv); + if (dev->shape) + { + fz_reset_gel(dev->gel, dev->scissor); + fz_flatten_fill_path(dev->gel, path, ctm, flatness); + fz_sort_gel(dev->gel); + + colorbv[0] = alpha * 255; + fz_scan_convert(dev->gel, even_odd, bbox, dev->shape, colorbv); + } + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_end(dev); +} + +static void +fz_draw_stroke_path(void *user, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + float expansion = fz_matrix_expansion(ctm); + float flatness = 0.3f / expansion; + float linewidth = stroke->linewidth; + unsigned char colorbv[FZ_MAX_COLORS + 1]; + float colorfv[FZ_MAX_COLORS]; + fz_bbox bbox; + int i; + + if (linewidth * expansion < 0.1f) + linewidth = 1 / expansion; + + fz_reset_gel(dev->gel, dev->scissor); + if (stroke->dash_len > 0) + fz_flatten_dash_path(dev->gel, path, stroke, ctm, flatness, linewidth); + else + fz_flatten_stroke_path(dev->gel, path, stroke, ctm, flatness, linewidth); + fz_sort_gel(dev->gel); + + bbox = fz_bound_gel(dev->gel); + bbox = fz_intersect_bbox(bbox, dev->scissor); + + if (fz_is_empty_rect(bbox)) + return; + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); + + fz_convert_color(colorspace, color, model, colorfv); + for (i = 0; i < model->n; i++) + colorbv[i] = colorfv[i] * 255; + colorbv[i] = alpha * 255; + + fz_scan_convert(dev->gel, 0, bbox, dev->dest, colorbv); + if (dev->shape) + { + fz_reset_gel(dev->gel, dev->scissor); + if (stroke->dash_len > 0) + fz_flatten_dash_path(dev->gel, path, stroke, ctm, flatness, linewidth); + else + fz_flatten_stroke_path(dev->gel, path, stroke, ctm, flatness, linewidth); + fz_sort_gel(dev->gel); + + colorbv[0] = 255; + fz_scan_convert(dev->gel, 0, bbox, dev->shape, colorbv); + } + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_end(dev); +} + +static void +fz_draw_clip_path(void *user, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + float expansion = fz_matrix_expansion(ctm); + float flatness = 0.3f / expansion; + fz_pixmap *mask, *dest, *shape; + fz_bbox bbox; + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + + fz_reset_gel(dev->gel, dev->scissor); + fz_flatten_fill_path(dev->gel, path, ctm, flatness); + fz_sort_gel(dev->gel); + + bbox = fz_bound_gel(dev->gel); + bbox = fz_intersect_bbox(bbox, dev->scissor); + if (rect) + bbox = fz_intersect_bbox(bbox, fz_round_rect(*rect)); + + if (fz_is_empty_rect(bbox) || fz_is_rect_gel(dev->gel)) + { + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].mask = NULL; + dev->stack[dev->top].dest = NULL; + dev->stack[dev->top].shape = dev->shape; + dev->stack[dev->top].blendmode = dev->blendmode; + dev->scissor = bbox; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Clip (rectangular) begin\n"); +#endif + dev->top++; + return; + } + + mask = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(mask); + dest = fz_new_pixmap_with_rect(model, bbox); + /* FIXME: See note #1 */ + fz_clear_pixmap(dest); + if (dev->shape) + { + shape = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(shape); + } + else + shape = NULL; + + fz_scan_convert(dev->gel, even_odd, bbox, mask, NULL); + + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].mask = mask; + dev->stack[dev->top].dest = dev->dest; + dev->stack[dev->top].shape = dev->shape; + /* FIXME: See note #1 */ + dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED; + dev->scissor = bbox; + dev->dest = dest; + dev->shape = shape; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Clip (non-rectangular) begin\n"); +#endif + dev->top++; +} + +static void +fz_draw_clip_stroke_path(void *user, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + float expansion = fz_matrix_expansion(ctm); + float flatness = 0.3f / expansion; + float linewidth = stroke->linewidth; + fz_pixmap *mask, *dest, *shape; + fz_bbox bbox; + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + + if (linewidth * expansion < 0.1f) + linewidth = 1 / expansion; + + fz_reset_gel(dev->gel, dev->scissor); + if (stroke->dash_len > 0) + fz_flatten_dash_path(dev->gel, path, stroke, ctm, flatness, linewidth); + else + fz_flatten_stroke_path(dev->gel, path, stroke, ctm, flatness, linewidth); + fz_sort_gel(dev->gel); + + bbox = fz_bound_gel(dev->gel); + bbox = fz_intersect_bbox(bbox, dev->scissor); + if (rect) + bbox = fz_intersect_bbox(bbox, fz_round_rect(*rect)); + + mask = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(mask); + dest = fz_new_pixmap_with_rect(model, bbox); + /* FIXME: See note #1 */ + fz_clear_pixmap(dest); + if (dev->shape) + { + shape = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(shape); + } + else + shape = NULL; + + if (!fz_is_empty_rect(bbox)) + fz_scan_convert(dev->gel, 0, bbox, mask, NULL); + + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].mask = mask; + dev->stack[dev->top].dest = dev->dest; + dev->stack[dev->top].shape = dev->shape; + /* FIXME: See note #1 */ + dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED; + dev->scissor = bbox; + dev->dest = dest; + dev->shape = shape; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Clip (stroke) begin\n"); +#endif + dev->top++; +} + +static void +draw_glyph(unsigned char *colorbv, fz_pixmap *dst, fz_pixmap *msk, + int xorig, int yorig, fz_bbox scissor) +{ + unsigned char *dp, *mp; + fz_bbox bbox; + int x, y, w, h; + + bbox = fz_bound_pixmap(msk); + bbox.x0 += xorig; + bbox.y0 += yorig; + bbox.x1 += xorig; + bbox.y1 += yorig; + + bbox = fz_intersect_bbox(bbox, scissor); /* scissor < dst */ + x = bbox.x0; + y = bbox.y0; + w = bbox.x1 - bbox.x0; + h = bbox.y1 - bbox.y0; + + mp = msk->samples + ((y - msk->y - yorig) * msk->w + (x - msk->x - xorig)); + dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n; + + assert(msk->n == 1); + + while (h--) + { + if (dst->colorspace) + fz_paint_span_with_color(dp, mp, dst->n, w, colorbv); + else + fz_paint_span(dp, mp, 1, w, 255); + dp += dst->w * dst->n; + mp += msk->w; + } +} + +static void +fz_draw_fill_text(void *user, fz_text *text, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + unsigned char colorbv[FZ_MAX_COLORS + 1]; + unsigned char shapebv; + float colorfv[FZ_MAX_COLORS]; + fz_matrix tm, trm; + fz_pixmap *glyph; + int i, x, y, gid; + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); + + fz_convert_color(colorspace, color, model, colorfv); + for (i = 0; i < model->n; i++) + colorbv[i] = colorfv[i] * 255; + colorbv[i] = alpha * 255; + shapebv = 255; + + tm = text->trm; + + for (i = 0; i < text->len; i++) + { + gid = text->items[i].gid; + if (gid < 0) + continue; + + tm.e = text->items[i].x; + tm.f = text->items[i].y; + trm = fz_concat(tm, ctm); + x = floorf(trm.e); + y = floorf(trm.f); + trm.e = QUANT(trm.e - floorf(trm.e), HSUBPIX); + trm.f = QUANT(trm.f - floorf(trm.f), VSUBPIX); + + glyph = fz_render_glyph(dev->cache, text->font, gid, trm, model); + if (glyph) + { + if (glyph->n == 1) + { + draw_glyph(colorbv, dev->dest, glyph, x, y, dev->scissor); + if (dev->shape) + draw_glyph(&shapebv, dev->shape, glyph, x, y, dev->scissor); + } + else + { + fz_matrix ctm = {glyph->w, 0.0, 0.0, -glyph->h, x + glyph->x, y + glyph->y + glyph->h}; + fz_paint_image(dev->dest, dev->scissor, dev->shape, glyph, ctm, alpha * 255); + } + fz_drop_pixmap(glyph); + } + } + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_end(dev); +} + +static void +fz_draw_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + unsigned char colorbv[FZ_MAX_COLORS + 1]; + float colorfv[FZ_MAX_COLORS]; + fz_matrix tm, trm; + fz_pixmap *glyph; + int i, x, y, gid; + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); + + fz_convert_color(colorspace, color, model, colorfv); + for (i = 0; i < model->n; i++) + colorbv[i] = colorfv[i] * 255; + colorbv[i] = alpha * 255; + + tm = text->trm; + + for (i = 0; i < text->len; i++) + { + gid = text->items[i].gid; + if (gid < 0) + continue; + + tm.e = text->items[i].x; + tm.f = text->items[i].y; + trm = fz_concat(tm, ctm); + x = floorf(trm.e); + y = floorf(trm.f); + trm.e = QUANT(trm.e - floorf(trm.e), HSUBPIX); + trm.f = QUANT(trm.f - floorf(trm.f), VSUBPIX); + + glyph = fz_render_stroked_glyph(dev->cache, text->font, gid, trm, ctm, stroke); + if (glyph) + { + draw_glyph(colorbv, dev->dest, glyph, x, y, dev->scissor); + if (dev->shape) + draw_glyph(colorbv, dev->shape, glyph, x, y, dev->scissor); + fz_drop_pixmap(glyph); + } + } + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_end(dev); +} + +static void +fz_draw_clip_text(void *user, fz_text *text, fz_matrix ctm, int accumulate) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + fz_bbox bbox; + fz_pixmap *mask, *dest, *shape; + fz_matrix tm, trm; + fz_pixmap *glyph; + int i, x, y, gid; + + /* If accumulate == 0 then this text object is guaranteed complete */ + /* If accumulate == 1 then this text object is the first (or only) in a sequence */ + /* If accumulate == 2 then this text object is a continuation */ + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + + if (accumulate == 0) + { + /* make the mask the exact size needed */ + bbox = fz_round_rect(fz_bound_text(text, ctm)); + bbox = fz_intersect_bbox(bbox, dev->scissor); + } + else + { + /* be conservative about the size of the mask needed */ + bbox = dev->scissor; + } + + if (accumulate == 0 || accumulate == 1) + { + mask = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(mask); + dest = fz_new_pixmap_with_rect(model, bbox); + /* FIXME: See note #1 */ + fz_clear_pixmap(dest); + if (dev->shape) + { + shape = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(shape); + } + else + shape = NULL; + + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].mask = mask; + dev->stack[dev->top].dest = dev->dest; + dev->stack[dev->top].shape = dev->shape; + /* FIXME: See note #1 */ + dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED; + dev->scissor = bbox; + dev->dest = dest; + dev->shape = shape; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Clip (text) begin\n"); +#endif + dev->top++; + } + else + { + mask = dev->stack[dev->top-1].mask; + } + + if (!fz_is_empty_rect(bbox)) + { + tm = text->trm; + + for (i = 0; i < text->len; i++) + { + gid = text->items[i].gid; + if (gid < 0) + continue; + + tm.e = text->items[i].x; + tm.f = text->items[i].y; + trm = fz_concat(tm, ctm); + x = floorf(trm.e); + y = floorf(trm.f); + trm.e = QUANT(trm.e - floorf(trm.e), HSUBPIX); + trm.f = QUANT(trm.f - floorf(trm.f), VSUBPIX); + + glyph = fz_render_glyph(dev->cache, text->font, gid, trm, model); + if (glyph) + { + draw_glyph(NULL, mask, glyph, x, y, bbox); + if (dev->shape) + draw_glyph(NULL, dev->shape, glyph, x, y, bbox); + fz_drop_pixmap(glyph); + } + } + } +} + +static void +fz_draw_clip_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + fz_bbox bbox; + fz_pixmap *mask, *dest, *shape; + fz_matrix tm, trm; + fz_pixmap *glyph; + int i, x, y, gid; + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + + /* make the mask the exact size needed */ + bbox = fz_round_rect(fz_bound_text(text, ctm)); + bbox = fz_intersect_bbox(bbox, dev->scissor); + + mask = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(mask); + dest = fz_new_pixmap_with_rect(model, bbox); + /* FIXME: See note #1 */ + fz_clear_pixmap(dest); + if (dev->shape) + { + shape = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(shape); + } + else + shape = dev->shape; + + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].mask = mask; + dev->stack[dev->top].dest = dev->dest; + dev->stack[dev->top].shape = dev->shape; + /* FIXME: See note #1 */ + dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED; + dev->scissor = bbox; + dev->dest = dest; + dev->shape = shape; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Clip (stroke text) begin\n"); +#endif + dev->top++; + + if (!fz_is_empty_rect(bbox)) + { + tm = text->trm; + + for (i = 0; i < text->len; i++) + { + gid = text->items[i].gid; + if (gid < 0) + continue; + + tm.e = text->items[i].x; + tm.f = text->items[i].y; + trm = fz_concat(tm, ctm); + x = floorf(trm.e); + y = floorf(trm.f); + trm.e = QUANT(trm.e - floorf(trm.e), HSUBPIX); + trm.f = QUANT(trm.f - floorf(trm.f), VSUBPIX); + + glyph = fz_render_stroked_glyph(dev->cache, text->font, gid, trm, ctm, stroke); + if (glyph) + { + draw_glyph(NULL, mask, glyph, x, y, bbox); + if (dev->shape) + draw_glyph(NULL, dev->shape, glyph, x, y, bbox); + fz_drop_pixmap(glyph); + } + } + } +} + +static void +fz_draw_ignore_text(void *user, fz_text *text, fz_matrix ctm) +{ +} + +static void +fz_draw_fill_shade(void *user, fz_shade *shade, fz_matrix ctm, float alpha) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + fz_pixmap *dest = dev->dest; + fz_rect bounds; + fz_bbox bbox, scissor; + float colorfv[FZ_MAX_COLORS]; + unsigned char colorbv[FZ_MAX_COLORS + 1]; + + bounds = fz_bound_shade(shade, ctm); + bbox = fz_intersect_bbox(fz_round_rect(bounds), dev->scissor); + scissor = dev->scissor; + + // TODO: proper clip by shade->bbox + + if (fz_is_empty_rect(bbox)) + return; + + if (!model) + { + fz_warn("cannot render shading directly to an alpha mask"); + return; + } + + if (alpha < 1) + { + dest = fz_new_pixmap_with_rect(dev->dest->colorspace, bbox); + fz_clear_pixmap(dest); + } + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); + + if (shade->use_background) + { + unsigned char *s; + int x, y, n, i; + fz_convert_color(shade->colorspace, shade->background, model, colorfv); + for (i = 0; i < model->n; i++) + colorbv[i] = colorfv[i] * 255; + colorbv[i] = 255; + + n = dest->n; + for (y = scissor.y0; y < scissor.y1; y++) + { + s = dest->samples + ((scissor.x0 - dest->x) + (y - dest->y) * dest->w) * dest->n; + for (x = scissor.x0; x < scissor.x1; x++) + { + for (i = 0; i < n; i++) + *s++ = colorbv[i]; + } + } + if (dev->shape) + { + for (y = scissor.y0; y < scissor.y1; y++) + { + s = dev->shape->samples + (scissor.x0 - dev->shape->x) + (y - dev->shape->y) * dev->shape->w; + for (x = scissor.x0; x < scissor.x1; x++) + { + *s++ = 255; + } + } + } + } + + fz_paint_shade(shade, ctm, dest, bbox); + if (dev->shape) + fz_clear_pixmap_rect_with_color(dev->shape, 255, bbox); + + if (alpha < 1) + { + fz_paint_pixmap(dev->dest, dest, alpha * 255); + fz_drop_pixmap(dest); + } + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_end(dev); +} + +static fz_pixmap * +fz_transform_pixmap(fz_pixmap *image, fz_matrix *ctm, int x, int y, int dx, int dy, int gridfit) +{ + fz_pixmap *scaled; + + if (ctm->a != 0 && ctm->b == 0 && ctm->c == 0 && ctm->d != 0) + { + /* Unrotated or X-flip or Y-flip or XY-flip */ + scaled = fz_scale_pixmap_gridfit(image, ctm->e, ctm->f, ctm->a, ctm->d, gridfit); + if (scaled == NULL) + return NULL; + ctm->a = scaled->w; + ctm->d = scaled->h; + ctm->e = scaled->x; + ctm->f = scaled->y; + return scaled; + } + + if (ctm->a == 0 && ctm->b != 0 && ctm->c != 0 && ctm->d == 0) + { + /* Other orthogonal flip/rotation cases */ + scaled = fz_scale_pixmap_gridfit(image, ctm->f, ctm->e, ctm->b, ctm->c, gridfit); + if (scaled == NULL) + return NULL; + ctm->b = scaled->w; + ctm->c = scaled->h; + ctm->f = scaled->x; + ctm->e = scaled->y; + return scaled; + } + + /* Downscale, non rectilinear case */ + if (dx > 0 && dy > 0) + { + scaled = fz_scale_pixmap(image, 0, 0, (float)dx, (float)dy); + return scaled; + } + + return NULL; +} + +static void +fz_draw_fill_image(void *user, fz_pixmap *image, fz_matrix ctm, float alpha) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + fz_pixmap *converted = NULL; + fz_pixmap *scaled = NULL; + int after; + int dx, dy; + + if (!model) + { + fz_warn("cannot render image directly to an alpha mask"); + return; + } + + if (image->w == 0 || image->h == 0) + return; + + /* convert images with more components (cmyk->rgb) before scaling */ + /* convert images with fewer components (gray->rgb after scaling */ + /* convert images with expensive colorspace transforms after scaling */ + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); + + after = 0; + if (image->colorspace == fz_device_gray) + after = 1; + + if (image->colorspace != model && !after) + { + converted = fz_new_pixmap_with_rect(model, fz_bound_pixmap(image)); + fz_convert_pixmap(image, converted); + image = converted; + } + + dx = sqrtf(ctm.a * ctm.a + ctm.b * ctm.b); + dy = sqrtf(ctm.c * ctm.c + ctm.d * ctm.d); + if (dx < image->w && dy < image->h) + { + int gridfit = alpha == 1.0f && !(dev->flags & FZ_DRAWDEV_FLAGS_TYPE3); + scaled = fz_transform_pixmap(image, &ctm, dev->dest->x, dev->dest->y, dx, dy, gridfit); + if (scaled == NULL) + { + if (dx < 1) + dx = 1; + if (dy < 1) + dy = 1; + scaled = fz_scale_pixmap(image, image->x, image->y, dx, dy); + } + if (scaled != NULL) + image = scaled; + } + + if (image->colorspace != model) + { + if ((image->colorspace == fz_device_gray && model == fz_device_rgb) || + (image->colorspace == fz_device_gray && model == fz_device_bgr)) + { + /* We have special case rendering code for gray -> rgb/bgr */ + } + else + { + converted = fz_new_pixmap_with_rect(model, fz_bound_pixmap(image)); + fz_convert_pixmap(image, converted); + image = converted; + } + } + + fz_paint_image(dev->dest, dev->scissor, dev->shape, image, ctm, alpha * 255); + + if (scaled) + fz_drop_pixmap(scaled); + if (converted) + fz_drop_pixmap(converted); + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_end(dev); +} + +static void +fz_draw_fill_image_mask(void *user, fz_pixmap *image, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + unsigned char colorbv[FZ_MAX_COLORS + 1]; + float colorfv[FZ_MAX_COLORS]; + fz_pixmap *scaled = NULL; + int dx, dy; + int i; + + if (image->w == 0 || image->h == 0) + return; + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); + + dx = sqrtf(ctm.a * ctm.a + ctm.b * ctm.b); + dy = sqrtf(ctm.c * ctm.c + ctm.d * ctm.d); + if (dx < image->w && dy < image->h) + { + int gridfit = alpha == 1.0f && !(dev->flags & FZ_DRAWDEV_FLAGS_TYPE3); + scaled = fz_transform_pixmap(image, &ctm, dev->dest->x, dev->dest->y, dx, dy, gridfit); + if (scaled == NULL) + { + if (dx < 1) + dx = 1; + if (dy < 1) + dy = 1; + scaled = fz_scale_pixmap(image, image->x, image->y, dx, dy); + } + if (scaled != NULL) + image = scaled; + } + + fz_convert_color(colorspace, color, model, colorfv); + for (i = 0; i < model->n; i++) + colorbv[i] = colorfv[i] * 255; + colorbv[i] = alpha * 255; + + fz_paint_image_with_color(dev->dest, dev->scissor, dev->shape, image, ctm, colorbv); + + if (scaled) + fz_drop_pixmap(scaled); + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); +} + +static void +fz_draw_clip_image_mask(void *user, fz_pixmap *image, fz_rect *rect, fz_matrix ctm) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + fz_bbox bbox; + fz_pixmap *mask, *dest, *shape; + fz_pixmap *scaled = NULL; + int dx, dy; + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Clip (image mask) begin\n"); +#endif + + if (image->w == 0 || image->h == 0) + { + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].mask = NULL; + dev->stack[dev->top].dest = NULL; + dev->stack[dev->top].blendmode = dev->blendmode; + dev->scissor = fz_empty_bbox; + dev->top++; + return; + } + + bbox = fz_round_rect(fz_transform_rect(ctm, fz_unit_rect)); + bbox = fz_intersect_bbox(bbox, dev->scissor); + if (rect) + bbox = fz_intersect_bbox(bbox, fz_round_rect(*rect)); + + mask = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(mask); + dest = fz_new_pixmap_with_rect(model, bbox); + /* FIXME: See note #1 */ + fz_clear_pixmap(dest); + if (dev->shape) + { + shape = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(shape); + } + else + shape = NULL; + + dx = sqrtf(ctm.a * ctm.a + ctm.b * ctm.b); + dy = sqrtf(ctm.c * ctm.c + ctm.d * ctm.d); + if (dx < image->w && dy < image->h) + { + int gridfit = !(dev->flags & FZ_DRAWDEV_FLAGS_TYPE3); + scaled = fz_transform_pixmap(image, &ctm, dev->dest->x, dev->dest->y, dx, dy, gridfit); + if (scaled == NULL) + { + if (dx < 1) + dx = 1; + if (dy < 1) + dy = 1; + scaled = fz_scale_pixmap(image, image->x, image->y, dx, dy); + } + if (scaled != NULL) + image = scaled; + } + + fz_paint_image(mask, bbox, dev->shape, image, ctm, 255); + + if (scaled) + fz_drop_pixmap(scaled); + + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].mask = mask; + dev->stack[dev->top].dest = dev->dest; + dev->stack[dev->top].shape = dev->shape; + /* FIXME: See note #1 */ + dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED; + dev->scissor = bbox; + dev->dest = dest; + dev->shape = shape; + dev->top++; +} + +static void +fz_draw_pop_clip(void *user) +{ + fz_draw_device *dev = user; + fz_pixmap *mask, *dest, *shape; + if (dev->top > 0) + { + dev->top--; + dev->scissor = dev->stack[dev->top].scissor; + mask = dev->stack[dev->top].mask; + dest = dev->stack[dev->top].dest; + shape = dev->stack[dev->top].shape; + dev->blendmode = dev->stack[dev->top].blendmode; + + /* We can get here with mask == NULL if the clipping actually + * resolved to a rectangle earlier. In this case, we will + * have a dest, and the shape will be unchanged. + */ + if (mask) + { + assert(dest); + +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, ""); + fz_dump_blend(dev->dest, "Clipping "); + if (dev->shape) + fz_dump_blend(dev->shape, "/"); + fz_dump_blend(dest, " onto "); + if (shape) + fz_dump_blend(shape, "/"); + fz_dump_blend(mask, " with "); +#endif + fz_paint_pixmap_with_mask(dest, dev->dest, mask); + if (shape != NULL) + { + assert(shape != dev->shape); + fz_paint_pixmap_with_mask(shape, dev->shape, mask); + fz_drop_pixmap(dev->shape); + dev->shape = shape; + } + fz_drop_pixmap(mask); + fz_drop_pixmap(dev->dest); + dev->dest = dest; +#ifdef DUMP_GROUP_BLENDS + fz_dump_blend(dev->dest, " to get "); + if (dev->shape) + fz_dump_blend(dev->shape, "/"); + printf("\n"); +#endif + } + else + { +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Clip End\n"); +#endif + assert(dest == NULL); + assert(shape == dev->shape); + } + } +} + +static void +fz_draw_begin_mask(void *user, fz_rect rect, int luminosity, fz_colorspace *colorspace, float *colorfv) +{ + fz_draw_device *dev = user; + fz_pixmap *dest; + fz_pixmap *shape = dev->shape; + fz_bbox bbox; + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + + bbox = fz_round_rect(rect); + bbox = fz_intersect_bbox(bbox, dev->scissor); + dest = fz_new_pixmap_with_rect(fz_device_gray, bbox); + if (dev->shape) + { + /* FIXME: If we ever want to support AIS true, then we + * probably want to create a shape pixmap here, using: + * shape = fz_new_pixmap_with_rect(NULL, bbox); + * then, in the end_mask code, we create the mask from this + * rather than dest. + */ + shape = NULL; + } + + if (luminosity) + { + float bc; + if (!colorspace) + colorspace = fz_device_gray; + fz_convert_color(colorspace, colorfv, fz_device_gray, &bc); + fz_clear_pixmap_with_color(dest, bc * 255); + if (shape) + fz_clear_pixmap_with_color(shape, 255); + } + else + { + fz_clear_pixmap(dest); + if (shape) + fz_clear_pixmap(shape); + } + + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].dest = dev->dest; + dev->stack[dev->top].luminosity = luminosity; + dev->stack[dev->top].shape = dev->shape; + dev->stack[dev->top].blendmode = dev->blendmode; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Mask begin\n"); +#endif + dev->top++; + + dev->scissor = bbox; + dev->dest = dest; + dev->shape = shape; +} + +static void +fz_draw_end_mask(void *user) +{ + fz_draw_device *dev = user; + fz_pixmap *mask = dev->dest; + fz_pixmap *maskshape = dev->shape; + fz_pixmap *temp, *dest; + fz_bbox bbox; + int luminosity; + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + + if (dev->top > 0) + { + /* pop soft mask buffer */ + dev->top--; + luminosity = dev->stack[dev->top].luminosity; + dev->scissor = dev->stack[dev->top].scissor; + dev->dest = dev->stack[dev->top].dest; + dev->shape = dev->stack[dev->top].shape; + + /* convert to alpha mask */ + temp = fz_alpha_from_gray(mask, luminosity); + fz_drop_pixmap(mask); + fz_drop_pixmap(maskshape); + + /* create new dest scratch buffer */ + bbox = fz_bound_pixmap(temp); + dest = fz_new_pixmap_with_rect(dev->dest->colorspace, bbox); + /* FIXME: See note #1 */ + fz_clear_pixmap(dest); + + /* push soft mask as clip mask */ + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].mask = temp; + dev->stack[dev->top].dest = dev->dest; + /* FIXME: See note #1 */ + dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED; + /* If we have a shape, then it'll need to be masked with the + * clip mask when we pop. So create a new shape now. */ + if (dev->shape) + { + dev->stack[dev->top].shape = dev->shape; + dev->shape = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(dev->shape); + } + dev->scissor = bbox; + dev->dest = dest; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Mask -> Clip\n"); +#endif + dev->top++; + } +} + +static void +fz_draw_begin_group(void *user, fz_rect rect, int isolated, int knockout, int blendmode, float alpha) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + fz_bbox bbox; + fz_pixmap *dest, *shape; + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); + + bbox = fz_round_rect(rect); + bbox = fz_intersect_bbox(bbox, dev->scissor); + dest = fz_new_pixmap_with_rect(model, bbox); + +#ifndef ATTEMPT_KNOCKOUT_AND_ISOLATED + knockout = 0; + isolated = 1; +#endif + + if (isolated) + { + fz_clear_pixmap(dest); + } + else + { + fz_copy_pixmap_rect(dest, dev->dest, bbox); + } + + if (blendmode == 0 && alpha == 1.0 && isolated) + { + /* We can render direct to any existing shape plane. If there + * isn't one, we don't need to make one. */ + shape = dev->shape; + } + else + { + shape = fz_new_pixmap_with_rect(NULL, bbox); + fz_clear_pixmap(shape); + } + + dev->stack[dev->top].alpha = alpha; + dev->stack[dev->top].blendmode = dev->blendmode; + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].dest = dev->dest; + dev->stack[dev->top].shape = dev->shape; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Group Begin\n"); +#endif + dev->top++; + + dev->scissor = bbox; + dev->dest = dest; + dev->shape = shape; + dev->blendmode = blendmode | (isolated ? FZ_BLEND_ISOLATED : 0) | (knockout ? FZ_BLEND_KNOCKOUT : 0); +} + +static void +fz_draw_end_group(void *user) +{ + fz_draw_device *dev = user; + fz_pixmap *group = dev->dest; + fz_pixmap *shape = dev->shape; + int blendmode; + int isolated; + float alpha; + + if (dev->top > 0) + { + dev->top--; + alpha = dev->stack[dev->top].alpha; + blendmode = dev->blendmode & FZ_BLEND_MODEMASK; + isolated = dev->blendmode & FZ_BLEND_ISOLATED; + dev->blendmode = dev->stack[dev->top].blendmode; + dev->shape = dev->stack[dev->top].shape; + dev->dest = dev->stack[dev->top].dest; + dev->scissor = dev->stack[dev->top].scissor; + +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, ""); + fz_dump_blend(group, "Blending "); + if (shape) + fz_dump_blend(shape, "/"); + fz_dump_blend(dev->dest, " onto "); + if (dev->shape) + fz_dump_blend(dev->shape, "/"); + if (alpha != 1.0f) + printf(" (alpha %g)", alpha); + if (blendmode != 0) + printf(" (blend %d)", blendmode); + if (isolated != 0) + printf(" (isolated)"); + if (blendmode & FZ_BLEND_KNOCKOUT) + printf(" (knockout)"); +#endif + if ((blendmode == 0) && (shape == NULL)) + fz_paint_pixmap(dev->dest, group, alpha * 255); + else + fz_blend_pixmap(dev->dest, group, alpha * 255, blendmode, isolated, shape); + + fz_drop_pixmap(group); + if (shape != dev->shape) + { + if (dev->shape) + { + fz_paint_pixmap(dev->shape, shape, alpha * 255); + } + fz_drop_pixmap(shape); + } +#ifdef DUMP_GROUP_BLENDS + fz_dump_blend(dev->dest, " to get "); + if (dev->shape) + fz_dump_blend(dev->shape, "/"); + printf("\n"); +#endif + } + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_end(dev); +} + +static void +fz_draw_begin_tile(void *user, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm) +{ + fz_draw_device *dev = user; + fz_colorspace *model = dev->dest->colorspace; + fz_pixmap *dest; + fz_bbox bbox; + + /* area, view, xstep, ystep are in pattern space */ + /* ctm maps from pattern space to device space */ + + if (dev->top == STACK_SIZE) + { + fz_warn("assert: too many buffers on stack"); + return; + } + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); + + bbox = fz_round_rect(fz_transform_rect(ctm, view)); + dest = fz_new_pixmap_with_rect(model, bbox); + /* FIXME: See note #1 */ + fz_clear_pixmap(dest); + + dev->stack[dev->top].scissor = dev->scissor; + dev->stack[dev->top].dest = dev->dest; + dev->stack[dev->top].shape = dev->shape; + /* FIXME: See note #1 */ + dev->stack[dev->top].blendmode = dev->blendmode | FZ_BLEND_ISOLATED; + dev->stack[dev->top].xstep = xstep; + dev->stack[dev->top].ystep = ystep; + dev->stack[dev->top].area = area; + dev->stack[dev->top].ctm = ctm; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Tile begin\n"); +#endif + dev->top++; + + dev->scissor = bbox; + dev->dest = dest; +} + +static void +fz_draw_end_tile(void *user) +{ + fz_draw_device *dev = user; + fz_pixmap *tile = dev->dest; + float xstep, ystep; + fz_matrix ctm, ttm; + fz_rect area; + int x0, y0, x1, y1, x, y; + + if (dev->top > 0) + { + dev->top--; +#ifdef DUMP_GROUP_BLENDS + dump_spaces(dev->top, "Tile end\n"); +#endif + xstep = dev->stack[dev->top].xstep; + ystep = dev->stack[dev->top].ystep; + area = dev->stack[dev->top].area; + ctm = dev->stack[dev->top].ctm; + dev->scissor = dev->stack[dev->top].scissor; + dev->dest = dev->stack[dev->top].dest; + dev->blendmode = dev->stack[dev->top].blendmode; + + + x0 = floorf(area.x0 / xstep); + y0 = floorf(area.y0 / ystep); + x1 = ceilf(area.x1 / xstep); + y1 = ceilf(area.y1 / ystep); + + ctm.e = tile->x; + ctm.f = tile->y; + + for (y = y0; y < y1; y++) + { + for (x = x0; x < x1; x++) + { + ttm = fz_concat(fz_translate(x * xstep, y * ystep), ctm); + tile->x = ttm.e; + tile->y = ttm.f; + fz_paint_pixmap_with_rect(dev->dest, tile, 255, dev->scissor); + } + } + + fz_drop_pixmap(tile); + } + + if (dev->blendmode & FZ_BLEND_KNOCKOUT) + fz_knockout_begin(dev); +} + +static void +fz_draw_free_user(void *user) +{ + fz_draw_device *dev = user; + /* TODO: pop and free the stacks */ + if (dev->top > 0) + fz_warn("items left on stack in draw device: %d", dev->top); + fz_free_gel(dev->gel); + fz_free(dev); +} + +fz_device * +fz_new_draw_device(fz_glyph_cache *cache, fz_pixmap *dest) +{ + fz_device *dev; + fz_draw_device *ddev = fz_malloc(sizeof(fz_draw_device)); + ddev->cache = cache; + ddev->gel = fz_new_gel(); + ddev->dest = dest; + ddev->shape = NULL; + ddev->top = 0; + ddev->blendmode = 0; + ddev->flags = 0; + + ddev->scissor.x0 = dest->x; + ddev->scissor.y0 = dest->y; + ddev->scissor.x1 = dest->x + dest->w; + ddev->scissor.y1 = dest->y + dest->h; + + dev = fz_new_device(ddev); + dev->free_user = fz_draw_free_user; + + dev->fill_path = fz_draw_fill_path; + dev->stroke_path = fz_draw_stroke_path; + dev->clip_path = fz_draw_clip_path; + dev->clip_stroke_path = fz_draw_clip_stroke_path; + + dev->fill_text = fz_draw_fill_text; + dev->stroke_text = fz_draw_stroke_text; + dev->clip_text = fz_draw_clip_text; + dev->clip_stroke_text = fz_draw_clip_stroke_text; + dev->ignore_text = fz_draw_ignore_text; + + dev->fill_image_mask = fz_draw_fill_image_mask; + dev->clip_image_mask = fz_draw_clip_image_mask; + dev->fill_image = fz_draw_fill_image; + dev->fill_shade = fz_draw_fill_shade; + + dev->pop_clip = fz_draw_pop_clip; + + dev->begin_mask = fz_draw_begin_mask; + dev->end_mask = fz_draw_end_mask; + dev->begin_group = fz_draw_begin_group; + dev->end_group = fz_draw_end_group; + + dev->begin_tile = fz_draw_begin_tile; + dev->end_tile = fz_draw_end_tile; + + return dev; +} + +fz_device * +fz_new_draw_device_type3(fz_glyph_cache *cache, fz_pixmap *dest) +{ + fz_device *dev = fz_new_draw_device(cache, dest); + fz_draw_device *ddev = dev->user; + ddev->flags |= FZ_DRAWDEV_FLAGS_TYPE3; + return dev; +} diff --git a/contrib/media/updf_newlib/draw/draw_edge.c b/contrib/media/updf_newlib/draw/draw_edge.c new file mode 100755 index 000000000..123c3268d --- /dev/null +++ b/contrib/media/updf_newlib/draw/draw_edge.c @@ -0,0 +1,735 @@ +#include "fitz.h" + +#define BBOX_MIN -(1<<20) +#define BBOX_MAX (1<<20) + +/* divide and floor towards -inf */ +static inline int fz_idiv(int a, int b) +{ + return a < 0 ? (a - b + 1) / b : a / b; +} + +/* If AA_BITS is defined, then we assume constant N bits of antialiasing. We + * will attempt to provide at least that number of bits of accuracy in the + * antialiasing (to a maximum of 8). If it is defined to be 0 then no + * antialiasing is done. If it is undefined to we will leave the antialiasing + * accuracy as a run time choice. + */ + +#ifndef AA_BITS +#define AA_SCALE(x) ((x * fz_aa_scale) >> 8) +static int fz_aa_hscale = 17; +static int fz_aa_vscale = 15; +static int fz_aa_scale = 256; +static int fz_aa_level = 8; + +#elif AA_BITS > 6 +#define AA_SCALE(x) (x) +#define fz_aa_hscale 17 +#define fz_aa_vscale 15 +#define fz_aa_level 8 + +#elif AA_BITS > 4 +#define AA_SCALE(x) ((x * 255) >> 6) +#define fz_aa_hscale 8 +#define fz_aa_vscale 8 +#define fz_aa_level 6 + +#elif AA_BITS > 2 +#define AA_SCALE(x) (x * 17) +#define fz_aa_hscale 5 +#define fz_aa_vscale 3 +#define fz_aa_level 4 + +#elif AA_BITS > 0 +#define AA_SCALE(x) ((x * 255) >> 2) +#define fz_aa_hscale 2 +#define fz_aa_vscale 2 +#define fz_aa_level 2 + +#else +#define AA_SCALE(x) (x * 255) +#define fz_aa_hscale 1 +#define fz_aa_vscale 1 +#define fz_aa_level 0 + +#endif + +int +fz_get_aa_level(void) +{ + return fz_aa_level; +} + +void +fz_set_aa_level(int level) +{ +#ifdef AA_BITS + fz_warn("anti-aliasing was compiled with a fixed precision of %d bits", fz_aa_level); +#else + if (level > 6) + { + fz_aa_hscale = 17; + fz_aa_vscale = 15; + fz_aa_level = 8; + } + else if (level > 4) + { + fz_aa_hscale = 8; + fz_aa_vscale = 8; + fz_aa_level = 6; + } + else if (level > 2) + { + fz_aa_hscale = 5; + fz_aa_vscale = 3; + fz_aa_level = 4; + } + else if (level > 0) + { + fz_aa_hscale = 2; + fz_aa_vscale = 2; + fz_aa_level = 2; + } + else + { + fz_aa_hscale = 1; + fz_aa_vscale = 1; + fz_aa_level = 0; + } + fz_aa_scale = 0xFF00 / (fz_aa_hscale * fz_aa_vscale); +#endif +} + +/* + * Global Edge List -- list of straight path segments for scan conversion + * + * Stepping along the edges is with bresenham's line algorithm. + * + * See Mike Abrash -- Graphics Programming Black Book (notably chapter 40) + */ + +typedef struct fz_edge_s fz_edge; + +struct fz_edge_s +{ + int x, e, h, y; + int adj_up, adj_down; + int xmove; + int xdir, ydir; /* -1 or +1 */ +}; + +struct fz_gel_s +{ + fz_bbox clip; + fz_bbox bbox; + int cap, len; + fz_edge *edges; + int acap, alen; + fz_edge **active; +}; + +fz_gel * +fz_new_gel(void) +{ + fz_gel *gel; + + gel = fz_malloc(sizeof(fz_gel)); + gel->cap = 512; + gel->len = 0; + gel->edges = fz_calloc(gel->cap, sizeof(fz_edge)); + + gel->clip.x0 = gel->clip.y0 = BBOX_MAX; + gel->clip.x1 = gel->clip.y1 = BBOX_MIN; + + gel->bbox.x0 = gel->bbox.y0 = BBOX_MAX; + gel->bbox.x1 = gel->bbox.y1 = BBOX_MIN; + + gel->acap = 64; + gel->alen = 0; + gel->active = fz_calloc(gel->acap, sizeof(fz_edge*)); + + return gel; +} + +void +fz_reset_gel(fz_gel *gel, fz_bbox clip) +{ + if (fz_is_infinite_rect(clip)) + { + gel->clip.x0 = gel->clip.y0 = BBOX_MAX; + gel->clip.x1 = gel->clip.y1 = BBOX_MIN; + } + else { + gel->clip.x0 = clip.x0 * fz_aa_hscale; + gel->clip.x1 = clip.x1 * fz_aa_hscale; + gel->clip.y0 = clip.y0 * fz_aa_vscale; + gel->clip.y1 = clip.y1 * fz_aa_vscale; + } + + gel->bbox.x0 = gel->bbox.y0 = BBOX_MAX; + gel->bbox.x1 = gel->bbox.y1 = BBOX_MIN; + + gel->len = 0; +} + +void +fz_free_gel(fz_gel *gel) +{ + fz_free(gel->active); + fz_free(gel->edges); + fz_free(gel); +} + +fz_bbox +fz_bound_gel(fz_gel *gel) +{ + fz_bbox bbox; + if (gel->len == 0) + return fz_empty_bbox; + bbox.x0 = fz_idiv(gel->bbox.x0, fz_aa_hscale); + bbox.y0 = fz_idiv(gel->bbox.y0, fz_aa_vscale); + bbox.x1 = fz_idiv(gel->bbox.x1, fz_aa_hscale) + 1; + bbox.y1 = fz_idiv(gel->bbox.y1, fz_aa_vscale) + 1; + return bbox; +} + +enum { INSIDE, OUTSIDE, LEAVE, ENTER }; + +#define clip_lerp_y(v,m,x0,y0,x1,y1,t) clip_lerp_x(v,m,y0,x0,y1,x1,t) + +static int +clip_lerp_x(int val, int m, int x0, int y0, int x1, int y1, int *out) +{ + int v0out = m ? x0 > val : x0 < val; + int v1out = m ? x1 > val : x1 < val; + + if (v0out + v1out == 0) + return INSIDE; + + if (v0out + v1out == 2) + return OUTSIDE; + + if (v1out) + { + *out = y0 + (y1 - y0) * (val - x0) / (x1 - x0); + return LEAVE; + } + + else + { + *out = y1 + (y0 - y1) * (val - x1) / (x0 - x1); + return ENTER; + } +} + +static void +fz_insert_gel_raw(fz_gel *gel, int x0, int y0, int x1, int y1) +{ + fz_edge *edge; + int dx, dy; + int winding; + int width; + int tmp; + + if (y0 == y1) + return; + + if (y0 > y1) { + winding = -1; + tmp = x0; x0 = x1; x1 = tmp; + tmp = y0; y0 = y1; y1 = tmp; + } + else + winding = 1; + + if (x0 < gel->bbox.x0) gel->bbox.x0 = x0; + if (x0 > gel->bbox.x1) gel->bbox.x1 = x0; + if (x1 < gel->bbox.x0) gel->bbox.x0 = x1; + if (x1 > gel->bbox.x1) gel->bbox.x1 = x1; + + if (y0 < gel->bbox.y0) gel->bbox.y0 = y0; + if (y1 > gel->bbox.y1) gel->bbox.y1 = y1; + + if (gel->len + 1 == gel->cap) { + gel->cap = gel->cap + 512; + gel->edges = fz_realloc(gel->edges, gel->cap, sizeof(fz_edge)); + } + + edge = &gel->edges[gel->len++]; + + dy = y1 - y0; + dx = x1 - x0; + width = ABS(dx); + + edge->xdir = dx > 0 ? 1 : -1; + edge->ydir = winding; + edge->x = x0; + edge->y = y0; + edge->h = dy; + edge->adj_down = dy; + + /* initial error term going l->r and r->l */ + if (dx >= 0) + edge->e = 0; + else + edge->e = -dy + 1; + + /* y-major edge */ + if (dy >= width) { + edge->xmove = 0; + edge->adj_up = width; + } + + /* x-major edge */ + else { + edge->xmove = (width / dy) * edge->xdir; + edge->adj_up = width % dy; + } +} + +void +fz_insert_gel(fz_gel *gel, float fx0, float fy0, float fx1, float fy1) +{ + int x0, y0, x1, y1; + int d, v; + + fx0 = floorf(fx0 * fz_aa_hscale); + fx1 = floorf(fx1 * fz_aa_hscale); + fy0 = floorf(fy0 * fz_aa_vscale); + fy1 = floorf(fy1 * fz_aa_vscale); + + x0 = CLAMP(fx0, BBOX_MIN, BBOX_MAX); + y0 = CLAMP(fy0, BBOX_MIN, BBOX_MAX); + x1 = CLAMP(fx1, BBOX_MIN, BBOX_MAX); + y1 = CLAMP(fy1, BBOX_MIN, BBOX_MAX); + + d = clip_lerp_y(gel->clip.y0, 0, x0, y0, x1, y1, &v); + if (d == OUTSIDE) return; + if (d == LEAVE) { y1 = gel->clip.y0; x1 = v; } + if (d == ENTER) { y0 = gel->clip.y0; x0 = v; } + + d = clip_lerp_y(gel->clip.y1, 1, x0, y0, x1, y1, &v); + if (d == OUTSIDE) return; + if (d == LEAVE) { y1 = gel->clip.y1; x1 = v; } + if (d == ENTER) { y0 = gel->clip.y1; x0 = v; } + + d = clip_lerp_x(gel->clip.x0, 0, x0, y0, x1, y1, &v); + if (d == OUTSIDE) { + x0 = x1 = gel->clip.x0; + } + if (d == LEAVE) { + fz_insert_gel_raw(gel, gel->clip.x0, v, gel->clip.x0, y1); + x1 = gel->clip.x0; + y1 = v; + } + if (d == ENTER) { + fz_insert_gel_raw(gel, gel->clip.x0, y0, gel->clip.x0, v); + x0 = gel->clip.x0; + y0 = v; + } + + d = clip_lerp_x(gel->clip.x1, 1, x0, y0, x1, y1, &v); + if (d == OUTSIDE) { + x0 = x1 = gel->clip.x1; + } + if (d == LEAVE) { + fz_insert_gel_raw(gel, gel->clip.x1, v, gel->clip.x1, y1); + x1 = gel->clip.x1; + y1 = v; + } + if (d == ENTER) { + fz_insert_gel_raw(gel, gel->clip.x1, y0, gel->clip.x1, v); + x0 = gel->clip.x1; + y0 = v; + } + + fz_insert_gel_raw(gel, x0, y0, x1, y1); +} + +void +fz_sort_gel(fz_gel *gel) +{ + fz_edge *a = gel->edges; + int n = gel->len; + + int h, i, k; + fz_edge t; + + h = 1; + if (n < 14) { + h = 1; + } + else { + while (h < n) + h = 3 * h + 1; + h /= 3; + h /= 3; + } + + while (h > 0) + { + for (i = 0; i < n; i++) { + t = a[i]; + k = i - h; + /* TODO: sort on y major, x minor */ + while (k >= 0 && a[k].y > t.y) { + a[k + h] = a[k]; + k -= h; + } + a[k + h] = t; + } + + h /= 3; + } +} + +int +fz_is_rect_gel(fz_gel *gel) +{ + /* a rectangular path is converted into two vertical edges of identical height */ + if (gel->len == 2) + { + fz_edge *a = gel->edges + 0; + fz_edge *b = gel->edges + 1; + return a->y == b->y && a->h == b->h && + a->xmove == 0 && a->adj_up == 0 && + b->xmove == 0 && b->adj_up == 0; + } + return 0; +} + +/* + * Active Edge List -- keep track of active edges while sweeping + */ + +static void +sort_active(fz_edge **a, int n) +{ + int h, i, k; + fz_edge *t; + + h = 1; + if (n < 14) { + h = 1; + } + else { + while (h < n) + h = 3 * h + 1; + h /= 3; + h /= 3; + } + + while (h > 0) + { + for (i = 0; i < n; i++) { + t = a[i]; + k = i - h; + while (k >= 0 && a[k]->x > t->x) { + a[k + h] = a[k]; + k -= h; + } + a[k + h] = t; + } + + h /= 3; + } +} + +static void +insert_active(fz_gel *gel, int y, int *e) +{ + /* insert edges that start here */ + while (*e < gel->len && gel->edges[*e].y == y) { + if (gel->alen + 1 == gel->acap) { + int newcap = gel->acap + 64; + fz_edge **newactive = fz_realloc(gel->active, newcap, sizeof(fz_edge*)); + gel->active = newactive; + gel->acap = newcap; + } + gel->active[gel->alen++] = &gel->edges[(*e)++]; + } + + /* shell-sort the edges by increasing x */ + sort_active(gel->active, gel->alen); +} + +static void +advance_active(fz_gel *gel) +{ + fz_edge *edge; + int i = 0; + + while (i < gel->alen) + { + edge = gel->active[i]; + + edge->h --; + + /* terminator! */ + if (edge->h == 0) { + gel->active[i] = gel->active[--gel->alen]; + } + + else { + edge->x += edge->xmove; + edge->e += edge->adj_up; + if (edge->e > 0) { + edge->x += edge->xdir; + edge->e -= edge->adj_down; + } + i ++; + } + } +} + +/* + * Anti-aliased scan conversion. + */ + +static inline void add_span_aa(int *list, int x0, int x1, int xofs) +{ + int x0pix, x0sub; + int x1pix, x1sub; + + if (x0 == x1) + return; + + /* x between 0 and width of bbox */ + x0 -= xofs; + x1 -= xofs; + + x0pix = x0 / fz_aa_hscale; + x0sub = x0 % fz_aa_hscale; + x1pix = x1 / fz_aa_hscale; + x1sub = x1 % fz_aa_hscale; + + if (x0pix == x1pix) + { + list[x0pix] += x1sub - x0sub; + list[x0pix+1] += x0sub - x1sub; + } + + else + { + list[x0pix] += fz_aa_hscale - x0sub; + list[x0pix+1] += x0sub; + list[x1pix] += x1sub - fz_aa_hscale; + list[x1pix+1] += -x1sub; + } +} + +static inline void non_zero_winding_aa(fz_gel *gel, int *list, int xofs) +{ + int winding = 0; + int x = 0; + int i; + for (i = 0; i < gel->alen; i++) + { + if (!winding && (winding + gel->active[i]->ydir)) + x = gel->active[i]->x; + if (winding && !(winding + gel->active[i]->ydir)) + add_span_aa(list, x, gel->active[i]->x, xofs); + winding += gel->active[i]->ydir; + } +} + +static inline void even_odd_aa(fz_gel *gel, int *list, int xofs) +{ + int even = 0; + int x = 0; + int i; + for (i = 0; i < gel->alen; i++) + { + if (!even) + x = gel->active[i]->x; + else + add_span_aa(list, x, gel->active[i]->x, xofs); + even = !even; + } +} + +static inline void undelta_aa(unsigned char * restrict out, int * restrict in, int n) +{ + int d = 0; + while (n--) + { + d += *in++; + *out++ = AA_SCALE(d); + } +} + +static inline void blit_aa(fz_pixmap *dst, int x, int y, + unsigned char *mp, int w, unsigned char *color) +{ + unsigned char *dp; + dp = dst->samples + ( (y - dst->y) * dst->w + (x - dst->x) ) * dst->n; + if (color) + fz_paint_span_with_color(dp, mp, dst->n, w, color); + else + fz_paint_span(dp, mp, 1, w, 255); +} + +static void +fz_scan_convert_aa(fz_gel *gel, int eofill, fz_bbox clip, + fz_pixmap *dst, unsigned char *color) +{ + unsigned char *alphas; + int *deltas; + int y, e; + int yd, yc; + + int xmin = fz_idiv(gel->bbox.x0, fz_aa_hscale); + int xmax = fz_idiv(gel->bbox.x1, fz_aa_hscale) + 1; + + int xofs = xmin * fz_aa_hscale; + + int skipx = clip.x0 - xmin; + int clipn = clip.x1 - clip.x0; + + if (gel->len == 0) + return; + + assert(clip.x0 >= xmin); + assert(clip.x1 <= xmax); + + alphas = fz_malloc(xmax - xmin + 1); + deltas = fz_malloc((xmax - xmin + 1) * sizeof(int)); + memset(deltas, 0, (xmax - xmin + 1) * sizeof(int)); + + e = 0; + y = gel->edges[0].y; + yc = fz_idiv(y, fz_aa_vscale); + yd = yc; + + while (gel->alen > 0 || e < gel->len) + { + yc = fz_idiv(y, fz_aa_vscale); + if (yc != yd) + { + if (yd >= clip.y0 && yd < clip.y1) + { + undelta_aa(alphas, deltas, skipx + clipn); + blit_aa(dst, xmin + skipx, yd, alphas + skipx, clipn, color); + memset(deltas, 0, (skipx + clipn) * sizeof(int)); + } + } + yd = yc; + + insert_active(gel, y, &e); + + if (yd >= clip.y0 && yd < clip.y1) + { + if (eofill) + even_odd_aa(gel, deltas, xofs); + else + non_zero_winding_aa(gel, deltas, xofs); + } + + advance_active(gel); + + if (gel->alen > 0) + y ++; + else if (e < gel->len) + y = gel->edges[e].y; + } + + if (yd >= clip.y0 && yd < clip.y1) + { + undelta_aa(alphas, deltas, skipx + clipn); + blit_aa(dst, xmin + skipx, yd, alphas + skipx, clipn, color); + } + + fz_free(deltas); + fz_free(alphas); +} + +/* + * Sharp (not anti-aliased) scan conversion + */ + +static inline void blit_sharp(int x0, int x1, int y, + fz_bbox clip, fz_pixmap *dst, unsigned char *color) +{ + unsigned char *dp; + x0 = CLAMP(x0, dst->x, dst->x + dst->w); + x1 = CLAMP(x1, dst->x, dst->x + dst->w); + if (x0 < x1) + { + dp = dst->samples + ( (y - dst->y) * dst->w + (x0 - dst->x) ) * dst->n; + if (color) + fz_paint_solid_color(dp, dst->n, x1 - x0, color); + else + fz_paint_solid_alpha(dp, x1 - x0, 255); + } +} + +static inline void non_zero_winding_sharp(fz_gel *gel, int y, + fz_bbox clip, fz_pixmap *dst, unsigned char *color) +{ + int winding = 0; + int x = 0; + int i; + for (i = 0; i < gel->alen; i++) + { + if (!winding && (winding + gel->active[i]->ydir)) + x = gel->active[i]->x; + if (winding && !(winding + gel->active[i]->ydir)) + blit_sharp(x, gel->active[i]->x, y, clip, dst, color); + winding += gel->active[i]->ydir; + } +} + +static inline void even_odd_sharp(fz_gel *gel, int y, + fz_bbox clip, fz_pixmap *dst, unsigned char *color) +{ + int even = 0; + int x = 0; + int i; + for (i = 0; i < gel->alen; i++) + { + if (!even) + x = gel->active[i]->x; + else + blit_sharp(x, gel->active[i]->x, y, clip, dst, color); + even = !even; + } +} + +static void +fz_scan_convert_sharp(fz_gel *gel, int eofill, fz_bbox clip, + fz_pixmap *dst, unsigned char *color) +{ + int e = 0; + int y = gel->edges[0].y; + + while (gel->alen > 0 || e < gel->len) + { + insert_active(gel, y, &e); + + if (y >= clip.y0 && y < clip.y1) + { + if (eofill) + even_odd_sharp(gel, y, clip, dst, color); + else + non_zero_winding_sharp(gel, y, clip, dst, color); + } + + advance_active(gel); + + if (gel->alen > 0) + y ++; + else if (e < gel->len) + y = gel->edges[e].y; + } +} + +void +fz_scan_convert(fz_gel *gel, int eofill, fz_bbox clip, + fz_pixmap *dst, unsigned char *color) +{ + if (fz_aa_level > 0) + fz_scan_convert_aa(gel, eofill, clip, dst, color); + else + fz_scan_convert_sharp(gel, eofill, clip, dst, color); +} diff --git a/contrib/media/updf_newlib/draw/draw_glyph.c b/contrib/media/updf_newlib/draw/draw_glyph.c new file mode 100755 index 000000000..95f3955d8 --- /dev/null +++ b/contrib/media/updf_newlib/draw/draw_glyph.c @@ -0,0 +1,134 @@ +#include "fitz.h" + +#define MAX_FONT_SIZE 1000 +#define MAX_GLYPH_SIZE 256 +#define MAX_CACHE_SIZE (1024*1024) + +typedef struct fz_glyph_key_s fz_glyph_key; + +struct fz_glyph_cache_s +{ + fz_hash_table *hash; + int total; +}; + +struct fz_glyph_key_s +{ + fz_font *font; + int a, b; + int c, d; + unsigned short gid; + unsigned char e, f; +}; + +fz_glyph_cache * +fz_new_glyph_cache(void) +{ + fz_glyph_cache *cache; + + cache = fz_malloc(sizeof(fz_glyph_cache)); + cache->hash = fz_new_hash_table(509, sizeof(fz_glyph_key)); + cache->total = 0; + + return cache; +} + +static void +fz_evict_glyph_cache(fz_glyph_cache *cache) +{ + fz_glyph_key *key; + fz_pixmap *pixmap; + int i; + + for (i = 0; i < fz_hash_len(cache->hash); i++) + { + key = fz_hash_get_key(cache->hash, i); + if (key->font) + fz_drop_font(key->font); + pixmap = fz_hash_get_val(cache->hash, i); + if (pixmap) + fz_drop_pixmap(pixmap); + } + + cache->total = 0; + + fz_empty_hash(cache->hash); +} + +void +fz_free_glyph_cache(fz_glyph_cache *cache) +{ + fz_evict_glyph_cache(cache); + fz_free_hash(cache->hash); + fz_free(cache); +} + +fz_pixmap * +fz_render_stroked_glyph(fz_glyph_cache *cache, fz_font *font, int gid, fz_matrix trm, fz_matrix ctm, fz_stroke_state *stroke) +{ + if (font->ft_face) + return fz_render_ft_stroked_glyph(font, gid, trm, ctm, stroke); + return fz_render_glyph(cache, font, gid, trm, NULL); +} + +fz_pixmap * +fz_render_glyph(fz_glyph_cache *cache, fz_font *font, int gid, fz_matrix ctm, fz_colorspace *model) +{ + fz_glyph_key key; + fz_pixmap *val; + float size = fz_matrix_expansion(ctm); + + if (size > MAX_FONT_SIZE) + { + /* TODO: this case should be handled by rendering glyph as a path fill */ + fz_warn("font size too large (%g), not rendering glyph", size); + return NULL; + } + + memset(&key, 0, sizeof key); + key.font = font; + key.gid = gid; + key.a = ctm.a * 65536; + key.b = ctm.b * 65536; + key.c = ctm.c * 65536; + key.d = ctm.d * 65536; + key.e = (ctm.e - floorf(ctm.e)) * 256; + key.f = (ctm.f - floorf(ctm.f)) * 256; + + val = fz_hash_find(cache->hash, &key); + if (val) + return fz_keep_pixmap(val); + + ctm.e = floorf(ctm.e) + key.e / 256.0f; + ctm.f = floorf(ctm.f) + key.f / 256.0f; + + if (font->ft_face) + { + val = fz_render_ft_glyph(font, gid, ctm); + } + else if (font->t3procs) + { + val = fz_render_t3_glyph(font, gid, ctm, model); + } + else + { + fz_warn("assert: uninitialized font structure"); + return NULL; + } + + if (val) + { + if (val->w < MAX_GLYPH_SIZE && val->h < MAX_GLYPH_SIZE) + { + if (cache->total + val->w * val->h > MAX_CACHE_SIZE) + fz_evict_glyph_cache(cache); + fz_keep_font(key.font); + fz_hash_insert(cache->hash, &key, val); + cache->total += val->w * val->h; + return fz_keep_pixmap(val); + } + return val; + } + + return NULL; +} diff --git a/contrib/media/updf_newlib/draw/draw_mesh.c b/contrib/media/updf_newlib/draw/draw_mesh.c new file mode 100755 index 000000000..4254cb649 --- /dev/null +++ b/contrib/media/updf_newlib/draw/draw_mesh.c @@ -0,0 +1,574 @@ +#include "fitz.h" + +/* + * polygon clipping + */ + +enum { IN, OUT, ENTER, LEAVE }; +enum { MAXV = 3 + 4 }; +enum { MAXN = 2 + FZ_MAX_COLORS }; + +static int clipx(float val, int ismax, float *v1, float *v2, int n) +{ + float t; + int i; + int v1o = ismax ? v1[0] > val : v1[0] < val; + int v2o = ismax ? v2[0] > val : v2[0] < val; + if (v1o + v2o == 0) + return IN; + if (v1o + v2o == 2) + return OUT; + if (v2o) + { + t = (val - v1[0]) / (v2[0] - v1[0]); + v2[0] = val; + v2[1] = v1[1] + t * (v2[1] - v1[1]); + for (i = 2; i < n; i++) + v2[i] = v1[i] + t * (v2[i] - v1[i]); + return LEAVE; + } + else + { + t = (val - v2[0]) / (v1[0] - v2[0]); + v1[0] = val; + v1[1] = v2[1] + t * (v1[1] - v2[1]); + for (i = 2; i < n; i++) + v1[i] = v2[i] + t * (v1[i] - v2[i]); + return ENTER; + } +} + +static int clipy(float val, int ismax, float *v1, float *v2, int n) +{ + float t; + int i; + int v1o = ismax ? v1[1] > val : v1[1] < val; + int v2o = ismax ? v2[1] > val : v2[1] < val; + if (v1o + v2o == 0) + return IN; + if (v1o + v2o == 2) + return OUT; + if (v2o) + { + t = (val - v1[1]) / (v2[1] - v1[1]); + v2[0] = v1[0] + t * (v2[0] - v1[0]); + v2[1] = val; + for (i = 2; i < n; i++) + v2[i] = v1[i] + t * (v2[i] - v1[i]); + return LEAVE; + } + else + { + t = (val - v2[1]) / (v1[1] - v2[1]); + v1[0] = v2[0] + t * (v1[0] - v2[0]); + v1[1] = val; + for (i = 2; i < n; i++) + v1[i] = v2[i] + t * (v1[i] - v2[i]); + return ENTER; + } +} + +static inline void copy_vert(float *dst, float *src, int n) +{ + while (n--) + *dst++ = *src++; +} + +static int clip_poly(float src[MAXV][MAXN], + float dst[MAXV][MAXN], int len, int n, + float val, int isy, int ismax) +{ + float cv1[MAXN]; + float cv2[MAXN]; + int v1, v2, cp; + int r; + + v1 = len - 1; + cp = 0; + + for (v2 = 0; v2 < len; v2++) + { + copy_vert(cv1, src[v1], n); + copy_vert(cv2, src[v2], n); + + if (isy) + r = clipy(val, ismax, cv1, cv2, n); + else + r = clipx(val, ismax, cv1, cv2, n); + + switch (r) + { + case IN: + copy_vert(dst[cp++], cv2, n); + break; + case OUT: + break; + case LEAVE: + copy_vert(dst[cp++], cv2, n); + break; + case ENTER: + copy_vert(dst[cp++], cv1, n); + copy_vert(dst[cp++], cv2, n); + break; + } + v1 = v2; + } + + return cp; +} + +/* + * gouraud shaded polygon scan conversion + */ + +static void paint_scan(fz_pixmap *pix, int y, int x1, int x2, int *v1, int *v2, int n) +{ + unsigned char *p = pix->samples + ((y - pix->y) * pix->w + (x1 - pix->x)) * pix->n; + int v[FZ_MAX_COLORS]; + int dv[FZ_MAX_COLORS]; + int w = x2 - x1; + int k; + + assert(w >= 0); + assert(y >= pix->y); + assert(y < pix->y + pix->h); + assert(x1 >= pix->x); + assert(x2 <= pix->x + pix->w); + + if (w == 0) + return; + + for (k = 0; k < n; k++) + { + v[k] = v1[k]; + dv[k] = (v2[k] - v1[k]) / w; + } + + while (w--) + { + for (k = 0; k < n; k++) + { + *p++ = v[k] >> 16; + v[k] += dv[k]; + } + *p++ = 255; + } +} + +static int find_next(int gel[MAXV][MAXN], int len, int a, int *s, int *e, int d) +{ + int b; + + while (1) + { + b = a + d; + if (b == len) + b = 0; + if (b == -1) + b = len - 1; + + if (gel[b][1] == gel[a][1]) + { + a = b; + continue; + } + + if (gel[b][1] > gel[a][1]) + { + *s = a; + *e = b; + return 0; + } + + return 1; + } +} + +static void load_edge(int gel[MAXV][MAXN], int s, int e, int *ael, int *del, int n) +{ + int swp, k, dy; + + if (gel[s][1] > gel[e][1]) + { + swp = s; s = e; e = swp; + } + + dy = gel[e][1] - gel[s][1]; + + ael[0] = gel[s][0]; + del[0] = (gel[e][0] - gel[s][0]) / dy; + for (k = 2; k < n; k++) + { + ael[k] = gel[s][k]; + del[k] = (gel[e][k] - gel[s][k]) / dy; + } +} + +static inline void step_edge(int *ael, int *del, int n) +{ + int k; + ael[0] += del[0]; + for (k = 2; k < n; k++) + ael[k] += del[k]; +} + +static void +fz_paint_triangle(fz_pixmap *pix, float *av, float *bv, float *cv, int n, fz_bbox bbox) +{ + float poly[MAXV][MAXN]; + float temp[MAXV][MAXN]; + float cx0 = bbox.x0; + float cy0 = bbox.y0; + float cx1 = bbox.x1; + float cy1 = bbox.y1; + + int gel[MAXV][MAXN]; + int ael[2][MAXN]; + int del[2][MAXN]; + int y, s0, s1, e0, e1; + int top, bot, len; + + int i, k; + + copy_vert(poly[0], av, n); + copy_vert(poly[1], bv, n); + copy_vert(poly[2], cv, n); + + len = clip_poly(poly, temp, 3, n, cx0, 0, 0); + len = clip_poly(temp, poly, len, n, cx1, 0, 1); + len = clip_poly(poly, temp, len, n, cy0, 1, 0); + len = clip_poly(temp, poly, len, n, cy1, 1, 1); + + if (len < 3) + return; + + for (i = 0; i < len; i++) + { + gel[i][0] = floorf(poly[i][0] + 0.5f) * 65536; /* trunc and fix */ + gel[i][1] = floorf(poly[i][1] + 0.5f); /* y is not fixpoint */ + for (k = 2; k < n; k++) + gel[i][k] = poly[i][k] * 65536; /* fix with precision */ + } + + top = bot = 0; + for (i = 0; i < len; i++) + { + if (gel[i][1] < gel[top][1]) + top = i; + if (gel[i][1] > gel[bot][1]) + bot = i; + } + + if (gel[bot][1] - gel[top][1] == 0) + return; + + y = gel[top][1]; + + if (find_next(gel, len, top, &s0, &e0, 1)) + return; + if (find_next(gel, len, top, &s1, &e1, -1)) + return; + + load_edge(gel, s0, e0, ael[0], del[0], n); + load_edge(gel, s1, e1, ael[1], del[1], n); + + while (1) + { + int x0 = ael[0][0] >> 16; + int x1 = ael[1][0] >> 16; + + if (ael[0][0] < ael[1][0]) + paint_scan(pix, y, x0, x1, ael[0]+2, ael[1]+2, n-2); + else + paint_scan(pix, y, x1, x0, ael[1]+2, ael[0]+2, n-2); + + step_edge(ael[0], del[0], n); + step_edge(ael[1], del[1], n); + y ++; + + if (y >= gel[e0][1]) + { + if (find_next(gel, len, e0, &s0, &e0, 1)) + return; + load_edge(gel, s0, e0, ael[0], del[0], n); + } + + if (y >= gel[e1][1]) + { + if (find_next(gel, len, e1, &s1, &e1, -1)) + return; + load_edge(gel, s1, e1, ael[1], del[1], n); + } + } +} + +static void +fz_paint_quad(fz_pixmap *pix, + fz_point p0, fz_point p1, fz_point p2, fz_point p3, + float c0, float c1, float c2, float c3, + int n, fz_bbox bbox) +{ + float v[4][3]; + + v[0][0] = p0.x; + v[0][1] = p0.y; + v[0][2] = c0; + + v[1][0] = p1.x; + v[1][1] = p1.y; + v[1][2] = c1; + + v[2][0] = p2.x; + v[2][1] = p2.y; + v[2][2] = c2; + + v[3][0] = p3.x; + v[3][1] = p3.y; + v[3][2] = c3; + + fz_paint_triangle(pix, v[0], v[2], v[3], n, bbox); + fz_paint_triangle(pix, v[0], v[3], v[1], n, bbox); +} + +/* + * linear, radial and mesh painting + */ + +#define HUGENUM 32000 /* how far to extend axial/radial shadings */ +#define RADSEGS 32 /* how many segments to generate for radial meshes */ + +static fz_point +fz_point_on_circle(fz_point p, float r, float theta) +{ + p.x = p.x + cosf(theta) * r; + p.y = p.y + sinf(theta) * r; + + return p; +} + +static void +fz_paint_linear(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox) +{ + fz_point p0, p1; + fz_point v0, v1, v2, v3; + fz_point e0, e1; + float theta; + + p0.x = shade->mesh[0]; + p0.y = shade->mesh[1]; + p0 = fz_transform_point(ctm, p0); + + p1.x = shade->mesh[3]; + p1.y = shade->mesh[4]; + p1 = fz_transform_point(ctm, p1); + + theta = atan2f(p1.y - p0.y, p1.x - p0.x); + theta += (float)M_PI * 0.5f; + + v0 = fz_point_on_circle(p0, HUGENUM, theta); + v1 = fz_point_on_circle(p1, HUGENUM, theta); + v2 = fz_point_on_circle(p0, -HUGENUM, theta); + v3 = fz_point_on_circle(p1, -HUGENUM, theta); + + fz_paint_quad(dest, v0, v1, v2, v3, 0, 255, 0, 255, 3, bbox); + + if (shade->extend[0]) + { + e0.x = v0.x - (p1.x - p0.x) * HUGENUM; + e0.y = v0.y - (p1.y - p0.y) * HUGENUM; + + e1.x = v2.x - (p1.x - p0.x) * HUGENUM; + e1.y = v2.y - (p1.y - p0.y) * HUGENUM; + + fz_paint_quad(dest, e0, e1, v0, v2, 0, 0, 0, 0, 3, bbox); + } + + if (shade->extend[1]) + { + e0.x = v1.x + (p1.x - p0.x) * HUGENUM; + e0.y = v1.y + (p1.y - p0.y) * HUGENUM; + + e1.x = v3.x + (p1.x - p0.x) * HUGENUM; + e1.y = v3.y + (p1.y - p0.y) * HUGENUM; + + fz_paint_quad(dest, e0, e1, v1, v3, 255, 255, 255, 255, 3, bbox); + } +} + +static void +fz_paint_annulus(fz_matrix ctm, + fz_point p0, float r0, float c0, + fz_point p1, float r1, float c1, + fz_pixmap *dest, fz_bbox bbox) +{ + fz_point t0, t1, t2, t3, b0, b1, b2, b3; + float theta, step; + int i; + + theta = atan2f(p1.y - p0.y, p1.x - p0.x); + step = (float)M_PI * 2 / RADSEGS; + + for (i = 0; i < RADSEGS / 2; i++) + { + t0 = fz_point_on_circle(p0, r0, theta + i * step); + t1 = fz_point_on_circle(p0, r0, theta + i * step + step); + t2 = fz_point_on_circle(p1, r1, theta + i * step); + t3 = fz_point_on_circle(p1, r1, theta + i * step + step); + b0 = fz_point_on_circle(p0, r0, theta - i * step); + b1 = fz_point_on_circle(p0, r0, theta - i * step - step); + b2 = fz_point_on_circle(p1, r1, theta - i * step); + b3 = fz_point_on_circle(p1, r1, theta - i * step - step); + + t0 = fz_transform_point(ctm, t0); + t1 = fz_transform_point(ctm, t1); + t2 = fz_transform_point(ctm, t2); + t3 = fz_transform_point(ctm, t3); + b0 = fz_transform_point(ctm, b0); + b1 = fz_transform_point(ctm, b1); + b2 = fz_transform_point(ctm, b2); + b3 = fz_transform_point(ctm, b3); + + fz_paint_quad(dest, t0, t1, t2, t3, c0, c0, c1, c1, 3, bbox); + fz_paint_quad(dest, b0, b1, b2, b3, c0, c0, c1, c1, 3, bbox); + } +} + +static void +fz_paint_radial(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox) +{ + fz_point p0, p1; + float r0, r1; + fz_point e; + float er, rs; + + p0.x = shade->mesh[0]; + p0.y = shade->mesh[1]; + r0 = shade->mesh[2]; + + p1.x = shade->mesh[3]; + p1.y = shade->mesh[4]; + r1 = shade->mesh[5]; + + if (shade->extend[0]) + { + if (r0 < r1) + rs = r0 / (r0 - r1); + else + rs = -HUGENUM; + + e.x = p0.x + (p1.x - p0.x) * rs; + e.y = p0.y + (p1.y - p0.y) * rs; + er = r0 + (r1 - r0) * rs; + + fz_paint_annulus(ctm, e, er, 0, p0, r0, 0, dest, bbox); + } + + fz_paint_annulus(ctm, p0, r0, 0, p1, r1, 255, dest, bbox); + + if (shade->extend[1]) + { + if (r0 > r1) + rs = r1 / (r1 - r0); + else + rs = -HUGENUM; + + e.x = p1.x + (p0.x - p1.x) * rs; + e.y = p1.y + (p0.y - p1.y) * rs; + er = r1 + (r0 - r1) * rs; + + fz_paint_annulus(ctm, p1, r1, 255, e, er, 255, dest, bbox); + } +} + +static void +fz_paint_mesh(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox) +{ + float tri[3][MAXN]; + fz_point p; + float *mesh; + int ntris; + int i, k; + + mesh = shade->mesh; + + if (shade->use_function) + ntris = shade->mesh_len / 9; + else + ntris = shade->mesh_len / ((2 + shade->colorspace->n) * 3); + + while (ntris--) + { + for (k = 0; k < 3; k++) + { + p.x = *mesh++; + p.y = *mesh++; + p = fz_transform_point(ctm, p); + tri[k][0] = p.x; + tri[k][1] = p.y; + if (shade->use_function) + tri[k][2] = *mesh++ * 255; + else + { + fz_convert_color(shade->colorspace, mesh, dest->colorspace, tri[k] + 2); + for (i = 0; i < dest->colorspace->n; i++) + tri[k][i + 2] *= 255; + mesh += shade->colorspace->n; + } + } + fz_paint_triangle(dest, tri[0], tri[1], tri[2], 2 + dest->colorspace->n, bbox); + } +} + +void +fz_paint_shade(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox) +{ + unsigned char clut[256][FZ_MAX_COLORS]; + fz_pixmap *temp, *conv; + float color[FZ_MAX_COLORS]; + int i, k; + + ctm = fz_concat(shade->matrix, ctm); + + if (shade->use_function) + { + for (i = 0; i < 256; i++) + { + fz_convert_color(shade->colorspace, shade->function[i], dest->colorspace, color); + for (k = 0; k < dest->colorspace->n; k++) + clut[i][k] = color[k] * 255; + clut[i][k] = shade->function[i][shade->colorspace->n] * 255; + } + conv = fz_new_pixmap_with_rect(dest->colorspace, bbox); + temp = fz_new_pixmap_with_rect(fz_device_gray, bbox); + fz_clear_pixmap(temp); + } + else + { + temp = dest; + } + + switch (shade->type) + { + case FZ_LINEAR: fz_paint_linear(shade, ctm, temp, bbox); break; + case FZ_RADIAL: fz_paint_radial(shade, ctm, temp, bbox); break; + case FZ_MESH: fz_paint_mesh(shade, ctm, temp, bbox); break; + } + + if (shade->use_function) + { + unsigned char *s = temp->samples; + unsigned char *d = conv->samples; + int len = temp->w * temp->h; + while (len--) + { + int v = *s++; + int a = fz_mul255(*s++, clut[v][conv->n - 1]); + for (k = 0; k < conv->n - 1; k++) + *d++ = fz_mul255(clut[v][k], a); + *d++ = a; + } + fz_paint_pixmap(dest, conv, 255); + fz_drop_pixmap(conv); + fz_drop_pixmap(temp); + } +} diff --git a/contrib/media/updf_newlib/draw/draw_paint.c b/contrib/media/updf_newlib/draw/draw_paint.c new file mode 100755 index 000000000..3b02b8709 --- /dev/null +++ b/contrib/media/updf_newlib/draw/draw_paint.c @@ -0,0 +1,471 @@ +#include "fitz.h" + +/* + +The functions in this file implement various flavours of Porter-Duff blending. + +We take the following as definitions: + + Cx = Color (from plane x) + ax = Alpha (from plane x) + cx = Cx.ax = Premultiplied color (from plane x) + +The general PorterDuff blending equation is: + + Blend Z = X op Y cz = Fx.cx + Fy. cy where Fx and Fy depend on op + +The two operations we use in this file are: '(X in Y) over Z' and +'S over Z'. The definitions of the 'over' and 'in' operations are as +follows: + + For S over Z, Fs = 1, Fz = 1-as + For X in Y, Fx = ay, Fy = 0 + +We have 2 choices; we can either work with premultiplied data, or non +premultiplied data. Our + +First the premultiplied case: + + Let S = (X in Y) + Let R = (X in Y) over Z = S over Z + + cs = cx.Fx + cy.Fy (where Fx = ay, Fy = 0) + = cx.ay + as = ax.Fx + ay.Fy + = ax.ay + + cr = cs.Fs + cz.Fz (where Fs = 1, Fz = 1-as) + = cs + cz.(1-as) + = cx.ay + cz.(1-ax.ay) + ar = as.Fs + az.Fz + = as + az.(1-as) + = ax.ay + az.(1-ax.ay) + +This has various nice properties, like not needing any divisions, and +being symmetric in color and alpha, so this is what we use. Because we +went through the pain of deriving the non premultiplied forms, we list +them here too, though they are not used. + +Non Pre-multiplied case: + + Cs.as = Fx.Cx.ax + Fy.Cy.ay (where Fx = ay, Fy = 0) + = Cx.ay.ax + Cs = (Cx.ay.ax)/(ay.ax) + = Cx + Cr.ar = Fs.Cs.as + Fz.Cz.az (where Fs = 1, Fz = 1-as) + = Cs.as + (1-as).Cz.az + = Cx.ax.ay + Cz.az.(1-ax.ay) + Cr = (Cx.ax.ay + Cz.az.(1-ax.ay))/(ax.ay + az.(1-ax-ay)) + +Much more complex, it seems. However, if we could restrict ourselves to +the case where we were always plotting onto an opaque background (i.e. +az = 1), then: + + Cr = Cx.(ax.ay) + Cz.(1-ax.ay) + = (Cx-Cz)*(1-ax.ay) + Cz (a single MLA operation) + ar = 1 + +Sadly, this is not true in the general case, so we abandon this effort +and stick to using the premultiplied form. + +*/ + +typedef unsigned char byte; + +/* These are used by the non-aa scan converter */ + +void +fz_paint_solid_alpha(byte * restrict dp, int w, int alpha) +{ + int t = FZ_EXPAND(255 - alpha); + while (w--) + { + *dp = alpha + FZ_COMBINE(*dp, t); + dp ++; + } +} + +void +fz_paint_solid_color(byte * restrict dp, int n, int w, byte *color) +{ + int n1 = n - 1; + int sa = FZ_EXPAND(color[n1]); + int k; + while (w--) + { + int ma = FZ_COMBINE(FZ_EXPAND(255), sa); + for (k = 0; k < n1; k++) + dp[k] = FZ_BLEND(color[k], dp[k], ma); + dp[k] = FZ_BLEND(255, dp[k], ma); + dp += n; + } +} + +/* Blend a non-premultiplied color in mask over destination */ + +static inline void +fz_paint_span_with_color_2(byte * restrict dp, byte * restrict mp, int w, byte *color) +{ + int sa = FZ_EXPAND(color[1]); + int g = color[0]; + while (w--) + { + int ma = *mp++; + ma = FZ_COMBINE(FZ_EXPAND(ma), sa); + dp[0] = FZ_BLEND(g, dp[0], ma); + dp[1] = FZ_BLEND(255, dp[1], ma); + dp += 2; + } +} + +static inline void +fz_paint_span_with_color_4(byte * restrict dp, byte * restrict mp, int w, byte *color) +{ + int sa = FZ_EXPAND(color[3]); + int r = color[0]; + int g = color[1]; + int b = color[2]; + while (w--) + { + int ma = *mp++; + ma = FZ_COMBINE(FZ_EXPAND(ma), sa); + dp[0] = FZ_BLEND(r, dp[0], ma); + dp[1] = FZ_BLEND(g, dp[1], ma); + dp[2] = FZ_BLEND(b, dp[2], ma); + dp[3] = FZ_BLEND(255, dp[3], ma); + dp += 4; + } +} + +static inline void +fz_paint_span_with_color_N(byte * restrict dp, byte * restrict mp, int n, int w, byte *color) +{ + int n1 = n - 1; + int sa = FZ_EXPAND(color[n1]); + int k; + while (w--) + { + int ma = *mp++; + ma = FZ_COMBINE(FZ_EXPAND(ma), sa); + for (k = 0; k < n1; k++) + dp[k] = FZ_BLEND(color[k], dp[k], ma); + dp[k] = FZ_BLEND(255, dp[k], ma); + dp += n; + } +} + +void +fz_paint_span_with_color(byte * restrict dp, byte * restrict mp, int n, int w, byte *color) +{ + switch (n) + { + case 2: fz_paint_span_with_color_2(dp, mp, w, color); break; + case 4: fz_paint_span_with_color_4(dp, mp, w, color); break; + default: fz_paint_span_with_color_N(dp, mp, n, w, color); break; + } +} + +/* Blend source in mask over destination */ + +static inline void +fz_paint_span_with_mask_2(byte * restrict dp, byte * restrict sp, byte * restrict mp, int w) +{ + while (w--) + { + int masa; + int ma = *mp++; + ma = FZ_EXPAND(ma); + masa = FZ_COMBINE(sp[1], ma); + masa = 255 - masa; + masa = FZ_EXPAND(masa); + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + } +} + +static inline void +fz_paint_span_with_mask_4(byte * restrict dp, byte * restrict sp, byte * restrict mp, int w) +{ + while (w--) + { + int masa; + int ma = *mp++; + ma = FZ_EXPAND(ma); + masa = FZ_COMBINE(sp[3], ma); + masa = 255 - masa; + masa = FZ_EXPAND(masa); + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + } +} + +static inline void +fz_paint_span_with_mask_N(byte * restrict dp, byte * restrict sp, byte * restrict mp, int n, int w) +{ + while (w--) + { + int k = n; + int masa; + int ma = *mp++; + ma = FZ_EXPAND(ma); + masa = FZ_COMBINE(sp[n-1], ma); + masa = 255-masa; + masa = FZ_EXPAND(masa); + while (k--) + { + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + } + } +} + +static void +fz_paint_span_with_mask(byte * restrict dp, byte * restrict sp, byte * restrict mp, int n, int w) +{ + switch (n) + { + case 2: fz_paint_span_with_mask_2(dp, sp, mp, w); break; + case 4: fz_paint_span_with_mask_4(dp, sp, mp, w); break; + default: fz_paint_span_with_mask_N(dp, sp, mp, n, w); break; + } +} + +/* Blend source in constant alpha over destination */ + +static inline void +fz_paint_span_2_with_alpha(byte * restrict dp, byte * restrict sp, int w, int alpha) +{ + alpha = FZ_EXPAND(alpha); + while (w--) + { + int masa = FZ_COMBINE(sp[1], alpha); + *dp = FZ_BLEND(*sp, *dp, masa); + dp++; sp++; + *dp = FZ_BLEND(*sp, *dp, masa); + dp++; sp++; + } +} + +static inline void +fz_paint_span_4_with_alpha(byte * restrict dp, byte * restrict sp, int w, int alpha) +{ + alpha = FZ_EXPAND(alpha); + while (w--) + { + int masa = FZ_COMBINE(sp[3], alpha); + *dp = FZ_BLEND(*sp, *dp, masa); + sp++; dp++; + *dp = FZ_BLEND(*sp, *dp, masa); + sp++; dp++; + *dp = FZ_BLEND(*sp, *dp, masa); + sp++; dp++; + *dp = FZ_BLEND(*sp, *dp, masa); + sp++; dp++; + } +} + +static inline void +fz_paint_span_N_with_alpha(byte * restrict dp, byte * restrict sp, int n, int w, int alpha) +{ + alpha = FZ_EXPAND(alpha); + while (w--) + { + int masa = FZ_COMBINE(sp[n-1], alpha); + int k = n; + while (k--) + { + *dp = FZ_BLEND(*sp++, *dp, masa); + dp++; + } + } +} + +/* Blend source over destination */ + +static inline void +fz_paint_span_1(byte * restrict dp, byte * restrict sp, int w) +{ + while (w--) + { + int t = FZ_EXPAND(255 - sp[0]); + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp ++; + } +} + +static inline void +fz_paint_span_2(byte * restrict dp, byte * restrict sp, int w) +{ + while (w--) + { + int t = FZ_EXPAND(255 - sp[1]); + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + } +} + +static inline void +fz_paint_span_4(byte * restrict dp, byte * restrict sp, int w) +{ + while (w--) + { + int t = FZ_EXPAND(255 - sp[3]); + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + } +} + +static inline void +fz_paint_span_N(byte * restrict dp, byte * restrict sp, int n, int w) +{ + while (w--) + { + int k = n; + int t = FZ_EXPAND(255 - sp[n-1]); + while (k--) + { + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + } + } +} + +void +fz_paint_span(byte * restrict dp, byte * restrict sp, int n, int w, int alpha) +{ + if (alpha == 255) + { + switch (n) + { + case 1: fz_paint_span_1(dp, sp, w); break; + case 2: fz_paint_span_2(dp, sp, w); break; + case 4: fz_paint_span_4(dp, sp, w); break; + default: fz_paint_span_N(dp, sp, n, w); break; + } + } + else if (alpha > 0) + { + switch (n) + { + case 2: fz_paint_span_2_with_alpha(dp, sp, w, alpha); break; + case 4: fz_paint_span_4_with_alpha(dp, sp, w, alpha); break; + default: fz_paint_span_N_with_alpha(dp, sp, n, w, alpha); break; + } + } +} + +/* + * Pixmap blending functions + */ + +void +fz_paint_pixmap_with_rect(fz_pixmap *dst, fz_pixmap *src, int alpha, fz_bbox bbox) +{ + unsigned char *sp, *dp; + int x, y, w, h, n; + + assert(dst->n == src->n); + + bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(dst)); + bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(src)); + + x = bbox.x0; + y = bbox.y0; + w = bbox.x1 - bbox.x0; + h = bbox.y1 - bbox.y0; + if ((w | h) == 0) + return; + + n = src->n; + sp = src->samples + ((y - src->y) * src->w + (x - src->x)) * src->n; + dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n; + + while (h--) + { + fz_paint_span(dp, sp, n, w, alpha); + sp += src->w * n; + dp += dst->w * n; + } +} + +void +fz_paint_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha) +{ + unsigned char *sp, *dp; + fz_bbox bbox; + int x, y, w, h, n; + + assert(dst->n == src->n); + + bbox = fz_bound_pixmap(dst); + bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(src)); + + x = bbox.x0; + y = bbox.y0; + w = bbox.x1 - bbox.x0; + h = bbox.y1 - bbox.y0; + if ((w | h) == 0) + return; + + n = src->n; + sp = src->samples + ((y - src->y) * src->w + (x - src->x)) * src->n; + dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n; + + while (h--) + { + fz_paint_span(dp, sp, n, w, alpha); + sp += src->w * n; + dp += dst->w * n; + } +} + +void +fz_paint_pixmap_with_mask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk) +{ + unsigned char *sp, *dp, *mp; + fz_bbox bbox; + int x, y, w, h, n; + + assert(dst->n == src->n); + assert(msk->n == 1); + + bbox = fz_bound_pixmap(dst); + bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(src)); + bbox = fz_intersect_bbox(bbox, fz_bound_pixmap(msk)); + + x = bbox.x0; + y = bbox.y0; + w = bbox.x1 - bbox.x0; + h = bbox.y1 - bbox.y0; + if ((w | h) == 0) + return; + + n = src->n; + sp = src->samples + ((y - src->y) * src->w + (x - src->x)) * src->n; + mp = msk->samples + ((y - msk->y) * msk->w + (x - msk->x)) * msk->n; + dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n; + + while (h--) + { + fz_paint_span_with_mask(dp, sp, mp, n, w); + sp += src->w * n; + dp += dst->w * n; + mp += msk->w; + } +} diff --git a/contrib/media/updf_newlib/draw/draw_path.c b/contrib/media/updf_newlib/draw/draw_path.c new file mode 100755 index 000000000..efa881eff --- /dev/null +++ b/contrib/media/updf_newlib/draw/draw_path.c @@ -0,0 +1,807 @@ +#include "fitz.h" + +#define MAX_DEPTH 8 + +enum { BUTT = 0, ROUND = 1, SQUARE = 2, TRIANGLE = 3, MITER = 0, BEVEL = 2 }; + +static void +line(fz_gel *gel, fz_matrix *ctm, float x0, float y0, float x1, float y1) +{ + float tx0 = ctm->a * x0 + ctm->c * y0 + ctm->e; + float ty0 = ctm->b * x0 + ctm->d * y0 + ctm->f; + float tx1 = ctm->a * x1 + ctm->c * y1 + ctm->e; + float ty1 = ctm->b * x1 + ctm->d * y1 + ctm->f; + fz_insert_gel(gel, tx0, ty0, tx1, ty1); +} + +static void +bezier(fz_gel *gel, fz_matrix *ctm, float flatness, + float xa, float ya, + float xb, float yb, + float xc, float yc, + float xd, float yd, int depth) +{ + float dmax; + float xab, yab; + float xbc, ybc; + float xcd, ycd; + float xabc, yabc; + float xbcd, ybcd; + float xabcd, yabcd; + + /* termination check */ + dmax = ABS(xa - xb); + dmax = MAX(dmax, ABS(ya - yb)); + dmax = MAX(dmax, ABS(xd - xc)); + dmax = MAX(dmax, ABS(yd - yc)); + if (dmax < flatness || depth >= MAX_DEPTH) + { + line(gel, ctm, xa, ya, xd, yd); + return; + } + + xab = xa + xb; + yab = ya + yb; + xbc = xb + xc; + ybc = yb + yc; + xcd = xc + xd; + ycd = yc + yd; + + xabc = xab + xbc; + yabc = yab + ybc; + xbcd = xbc + xcd; + ybcd = ybc + ycd; + + xabcd = xabc + xbcd; + yabcd = yabc + ybcd; + + xab *= 0.5f; yab *= 0.5f; + xbc *= 0.5f; ybc *= 0.5f; + xcd *= 0.5f; ycd *= 0.5f; + + xabc *= 0.25f; yabc *= 0.25f; + xbcd *= 0.25f; ybcd *= 0.25f; + + xabcd *= 0.125f; yabcd *= 0.125f; + + bezier(gel, ctm, flatness, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1); + bezier(gel, ctm, flatness, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1); +} + +void +fz_flatten_fill_path(fz_gel *gel, fz_path *path, fz_matrix ctm, float flatness) +{ + float x1, y1, x2, y2, x3, y3; + float cx = 0; + float cy = 0; + float bx = 0; + float by = 0; + int i = 0; + + while (i < path->len) + { + switch (path->items[i++].k) + { + case FZ_MOVETO: + /* implicit closepath before moveto */ + if (i && (cx != bx || cy != by)) + line(gel, &ctm, cx, cy, bx, by); + x1 = path->items[i++].v; + y1 = path->items[i++].v; + cx = bx = x1; + cy = by = y1; + break; + + case FZ_LINETO: + x1 = path->items[i++].v; + y1 = path->items[i++].v; + line(gel, &ctm, cx, cy, x1, y1); + cx = x1; + cy = y1; + break; + + case FZ_CURVETO: + x1 = path->items[i++].v; + y1 = path->items[i++].v; + x2 = path->items[i++].v; + y2 = path->items[i++].v; + x3 = path->items[i++].v; + y3 = path->items[i++].v; + bezier(gel, &ctm, flatness, cx, cy, x1, y1, x2, y2, x3, y3, 0); + cx = x3; + cy = y3; + break; + + case FZ_CLOSE_PATH: + line(gel, &ctm, cx, cy, bx, by); + cx = bx; + cy = by; + break; + } + } + + if (i && (cx != bx || cy != by)) + line(gel, &ctm, cx, cy, bx, by); +} + +struct sctx +{ + fz_gel *gel; + fz_matrix *ctm; + float flatness; + + int linejoin; + float linewidth; + float miterlimit; + fz_point beg[2]; + fz_point seg[2]; + int sn, bn; + int dot; + + float *dash_list; + float dash_phase; + int dash_len; + int toggle, cap; + int offset; + float phase; + fz_point cur; +}; + +static void +fz_add_line(struct sctx *s, float x0, float y0, float x1, float y1) +{ + float tx0 = s->ctm->a * x0 + s->ctm->c * y0 + s->ctm->e; + float ty0 = s->ctm->b * x0 + s->ctm->d * y0 + s->ctm->f; + float tx1 = s->ctm->a * x1 + s->ctm->c * y1 + s->ctm->e; + float ty1 = s->ctm->b * x1 + s->ctm->d * y1 + s->ctm->f; + fz_insert_gel(s->gel, tx0, ty0, tx1, ty1); +} + +static void +fz_add_arc(struct sctx *s, + float xc, float yc, + float x0, float y0, + float x1, float y1) +{ + float th0, th1, r; + float theta; + float ox, oy, nx, ny; + int n, i; + + r = fabsf(s->linewidth); + theta = 2 * (float)M_SQRT2 * sqrtf(s->flatness / r); + th0 = atan2f(y0, x0); + th1 = atan2f(y1, x1); + + if (r > 0) + { + if (th0 < th1) + th0 += (float)M_PI * 2; + n = ceilf((th0 - th1) / theta); + } + else + { + if (th1 < th0) + th1 += (float)M_PI * 2; + n = ceilf((th1 - th0) / theta); + } + + ox = x0; + oy = y0; + for (i = 1; i < n; i++) + { + theta = th0 + (th1 - th0) * i / n; + nx = cosf(theta) * r; + ny = sinf(theta) * r; + fz_add_line(s, xc + ox, yc + oy, xc + nx, yc + ny); + ox = nx; + oy = ny; + } + + fz_add_line(s, xc + ox, yc + oy, xc + x1, yc + y1); +} + +static void +fz_add_line_stroke(struct sctx *s, fz_point a, fz_point b) +{ + float dx = b.x - a.x; + float dy = b.y - a.y; + float scale = s->linewidth / sqrtf(dx * dx + dy * dy); + float dlx = dy * scale; + float dly = -dx * scale; + fz_add_line(s, a.x - dlx, a.y - dly, b.x - dlx, b.y - dly); + fz_add_line(s, b.x + dlx, b.y + dly, a.x + dlx, a.y + dly); +} + +static void +fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c) +{ + float miterlimit = s->miterlimit; + float linewidth = s->linewidth; + int linejoin = s->linejoin; + float dx0, dy0; + float dx1, dy1; + float dlx0, dly0; + float dlx1, dly1; + float dmx, dmy; + float dmr2; + float scale; + float cross; + + dx0 = b.x - a.x; + dy0 = b.y - a.y; + + dx1 = c.x - b.x; + dy1 = c.y - b.y; + + if (dx0 * dx0 + dy0 * dy0 < FLT_EPSILON) + linejoin = BEVEL; + if (dx1 * dx1 + dy1 * dy1 < FLT_EPSILON) + linejoin = BEVEL; + + scale = linewidth / sqrtf(dx0 * dx0 + dy0 * dy0); + dlx0 = dy0 * scale; + dly0 = -dx0 * scale; + + scale = linewidth / sqrtf(dx1 * dx1 + dy1 * dy1); + dlx1 = dy1 * scale; + dly1 = -dx1 * scale; + + cross = dx1 * dy0 - dx0 * dy1; + + dmx = (dlx0 + dlx1) * 0.5f; + dmy = (dly0 + dly1) * 0.5f; + dmr2 = dmx * dmx + dmy * dmy; + + if (cross * cross < FLT_EPSILON && dx0 * dx1 + dy0 * dy1 >= 0) + linejoin = BEVEL; + + if (linejoin == MITER) + if (dmr2 * miterlimit * miterlimit < linewidth * linewidth) + linejoin = BEVEL; + + if (linejoin == BEVEL) + { + fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dlx1, b.y - dly1); + fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0); + } + + if (linejoin == MITER) + { + scale = linewidth * linewidth / dmr2; + dmx *= scale; + dmy *= scale; + + if (cross < 0) + { + fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dlx1, b.y - dly1); + fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dmx, b.y + dmy); + fz_add_line(s, b.x + dmx, b.y + dmy, b.x + dlx0, b.y + dly0); + } + else + { + fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0); + fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dmx, b.y - dmy); + fz_add_line(s, b.x - dmx, b.y - dmy, b.x - dlx1, b.y - dly1); + } + } + + if (linejoin == ROUND) + { + if (cross < 0) + { + fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dlx1, b.y - dly1); + fz_add_arc(s, b.x, b.y, dlx1, dly1, dlx0, dly0); + } + else + { + fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0); + fz_add_arc(s, b.x, b.y, -dlx0, -dly0, -dlx1, -dly1); + } + } +} + +static void +fz_add_line_cap(struct sctx *s, fz_point a, fz_point b, int linecap) +{ + float flatness = s->flatness; + float linewidth = s->linewidth; + + float dx = b.x - a.x; + float dy = b.y - a.y; + + float scale = linewidth / sqrtf(dx * dx + dy * dy); + float dlx = dy * scale; + float dly = -dx * scale; + + if (linecap == BUTT) + fz_add_line(s, b.x - dlx, b.y - dly, b.x + dlx, b.y + dly); + + if (linecap == ROUND) + { + int i; + int n = ceilf((float)M_PI / (2.0f * (float)M_SQRT2 * sqrtf(flatness / linewidth))); + float ox = b.x - dlx; + float oy = b.y - dly; + for (i = 1; i < n; i++) + { + float theta = (float)M_PI * i / n; + float cth = cosf(theta); + float sth = sinf(theta); + float nx = b.x - dlx * cth - dly * sth; + float ny = b.y - dly * cth + dlx * sth; + fz_add_line(s, ox, oy, nx, ny); + ox = nx; + oy = ny; + } + fz_add_line(s, ox, oy, b.x + dlx, b.y + dly); + } + + if (linecap == SQUARE) + { + fz_add_line(s, b.x - dlx, b.y - dly, + b.x - dlx - dly, b.y - dly + dlx); + fz_add_line(s, b.x - dlx - dly, b.y - dly + dlx, + b.x + dlx - dly, b.y + dly + dlx); + fz_add_line(s, b.x + dlx - dly, b.y + dly + dlx, + b.x + dlx, b.y + dly); + } + + if (linecap == TRIANGLE) + { + float mx = -dly; + float my = dlx; + fz_add_line(s, b.x - dlx, b.y - dly, b.x + mx, b.y + my); + fz_add_line(s, b.x + mx, b.y + my, b.x + dlx, b.y + dly); + } +} + +static void +fz_add_line_dot(struct sctx *s, fz_point a) +{ + float flatness = s->flatness; + float linewidth = s->linewidth; + int n = ceilf((float)M_PI / ((float)M_SQRT2 * sqrtf(flatness / linewidth))); + float ox = a.x - linewidth; + float oy = a.y; + int i; + + for (i = 1; i < n; i++) + { + float theta = (float)M_PI * 2 * i / n; + float cth = cosf(theta); + float sth = sinf(theta); + float nx = a.x - cth * linewidth; + float ny = a.y + sth * linewidth; + fz_add_line(s, ox, oy, nx, ny); + ox = nx; + oy = ny; + } + + fz_add_line(s, ox, oy, a.x - linewidth, a.y); +} + +static void +fz_stroke_flush(struct sctx *s, int start_cap, int end_cap) +{ + if (s->sn == 2) + { + fz_add_line_cap(s, s->beg[1], s->beg[0], start_cap); + fz_add_line_cap(s, s->seg[0], s->seg[1], end_cap); + } + else if (s->dot) + { + fz_add_line_dot(s, s->beg[0]); + } +} + +static void +fz_stroke_moveto(struct sctx *s, fz_point cur) +{ + s->seg[0] = cur; + s->beg[0] = cur; + s->sn = 1; + s->bn = 1; + s->dot = 0; +} + +static void +fz_stroke_lineto(struct sctx *s, fz_point cur) +{ + float dx = cur.x - s->seg[s->sn-1].x; + float dy = cur.y - s->seg[s->sn-1].y; + + if (dx * dx + dy * dy < FLT_EPSILON) + { + if (s->cap == ROUND || s->dash_list) + s->dot = 1; + return; + } + + fz_add_line_stroke(s, s->seg[s->sn-1], cur); + + if (s->sn == 2) + { + fz_add_line_join(s, s->seg[0], s->seg[1], cur); + s->seg[0] = s->seg[1]; + s->seg[1] = cur; + } + + if (s->sn == 1) + s->seg[s->sn++] = cur; + if (s->bn == 1) + s->beg[s->bn++] = cur; +} + +static void +fz_stroke_closepath(struct sctx *s) +{ + if (s->sn == 2) + { + fz_stroke_lineto(s, s->beg[0]); + if (s->seg[1].x == s->beg[0].x && s->seg[1].y == s->beg[0].y) + fz_add_line_join(s, s->seg[0], s->beg[0], s->beg[1]); + else + fz_add_line_join(s, s->seg[1], s->beg[0], s->beg[1]); + } + else if (s->dot) + { + fz_add_line_dot(s, s->beg[0]); + } + + s->seg[0] = s->beg[0]; + s->bn = 1; + s->sn = 1; + s->dot = 0; +} + +static void +fz_stroke_bezier(struct sctx *s, + float xa, float ya, + float xb, float yb, + float xc, float yc, + float xd, float yd, int depth) +{ + float dmax; + float xab, yab; + float xbc, ybc; + float xcd, ycd; + float xabc, yabc; + float xbcd, ybcd; + float xabcd, yabcd; + + /* termination check */ + dmax = ABS(xa - xb); + dmax = MAX(dmax, ABS(ya - yb)); + dmax = MAX(dmax, ABS(xd - xc)); + dmax = MAX(dmax, ABS(yd - yc)); + if (dmax < s->flatness || depth >= MAX_DEPTH) + { + fz_point p; + p.x = xd; + p.y = yd; + fz_stroke_lineto(s, p); + return; + } + + xab = xa + xb; + yab = ya + yb; + xbc = xb + xc; + ybc = yb + yc; + xcd = xc + xd; + ycd = yc + yd; + + xabc = xab + xbc; + yabc = yab + ybc; + xbcd = xbc + xcd; + ybcd = ybc + ycd; + + xabcd = xabc + xbcd; + yabcd = yabc + ybcd; + + xab *= 0.5f; yab *= 0.5f; + xbc *= 0.5f; ybc *= 0.5f; + xcd *= 0.5f; ycd *= 0.5f; + + xabc *= 0.25f; yabc *= 0.25f; + xbcd *= 0.25f; ybcd *= 0.25f; + + xabcd *= 0.125f; yabcd *= 0.125f; + + fz_stroke_bezier(s, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1); + fz_stroke_bezier(s, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1); +} + +void +fz_flatten_stroke_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth) +{ + struct sctx s; + fz_point p0, p1, p2, p3; + int i; + + s.gel = gel; + s.ctm = &ctm; + s.flatness = flatness; + + s.linejoin = stroke->linejoin; + s.linewidth = linewidth * 0.5f; /* hairlines use a different value from the path value */ + s.miterlimit = stroke->miterlimit; + s.sn = 0; + s.bn = 0; + s.dot = 0; + + s.dash_list = NULL; + s.dash_phase = 0; + s.dash_len = 0; + s.toggle = 0; + s.offset = 0; + s.phase = 0; + + s.cap = stroke->start_cap; + + i = 0; + + if (path->len > 0 && path->items[0].k != FZ_MOVETO) + { + fz_warn("assert: path must begin with moveto"); + return; + } + + p0.x = p0.y = 0; + + while (i < path->len) + { + switch (path->items[i++].k) + { + case FZ_MOVETO: + p1.x = path->items[i++].v; + p1.y = path->items[i++].v; + fz_stroke_flush(&s, stroke->start_cap, stroke->end_cap); + fz_stroke_moveto(&s, p1); + p0 = p1; + break; + + case FZ_LINETO: + p1.x = path->items[i++].v; + p1.y = path->items[i++].v; + fz_stroke_lineto(&s, p1); + p0 = p1; + break; + + case FZ_CURVETO: + p1.x = path->items[i++].v; + p1.y = path->items[i++].v; + p2.x = path->items[i++].v; + p2.y = path->items[i++].v; + p3.x = path->items[i++].v; + p3.y = path->items[i++].v; + fz_stroke_bezier(&s, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0); + p0 = p3; + break; + + case FZ_CLOSE_PATH: + fz_stroke_closepath(&s); + break; + } + } + + fz_stroke_flush(&s, stroke->start_cap, stroke->end_cap); +} + +static void +fz_dash_moveto(struct sctx *s, fz_point a, int start_cap, int end_cap) +{ + s->toggle = 1; + s->offset = 0; + s->phase = s->dash_phase; + + while (s->phase >= s->dash_list[s->offset]) + { + s->toggle = !s->toggle; + s->phase -= s->dash_list[s->offset]; + s->offset ++; + if (s->offset == s->dash_len) + s->offset = 0; + } + + s->cur = a; + + if (s->toggle) + { + fz_stroke_flush(s, s->cap, end_cap); + s->cap = start_cap; + fz_stroke_moveto(s, a); + } +} + +static void +fz_dash_lineto(struct sctx *s, fz_point b, int dash_cap) +{ + float dx, dy; + float total, used, ratio; + fz_point a; + fz_point m; + + a = s->cur; + dx = b.x - a.x; + dy = b.y - a.y; + total = sqrtf(dx * dx + dy * dy); + used = 0; + + while (total - used > s->dash_list[s->offset] - s->phase) + { + used += s->dash_list[s->offset] - s->phase; + ratio = used / total; + m.x = a.x + ratio * dx; + m.y = a.y + ratio * dy; + + if (s->toggle) + { + fz_stroke_lineto(s, m); + } + else + { + fz_stroke_flush(s, s->cap, dash_cap); + s->cap = dash_cap; + fz_stroke_moveto(s, m); + } + + s->toggle = !s->toggle; + s->phase = 0; + s->offset ++; + if (s->offset == s->dash_len) + s->offset = 0; + } + + s->phase += total - used; + + s->cur = b; + + if (s->toggle) + { + fz_stroke_lineto(s, b); + } +} + +static void +fz_dash_bezier(struct sctx *s, + float xa, float ya, + float xb, float yb, + float xc, float yc, + float xd, float yd, int depth, + int dash_cap) +{ + float dmax; + float xab, yab; + float xbc, ybc; + float xcd, ycd; + float xabc, yabc; + float xbcd, ybcd; + float xabcd, yabcd; + + /* termination check */ + dmax = ABS(xa - xb); + dmax = MAX(dmax, ABS(ya - yb)); + dmax = MAX(dmax, ABS(xd - xc)); + dmax = MAX(dmax, ABS(yd - yc)); + if (dmax < s->flatness || depth >= MAX_DEPTH) + { + fz_point p; + p.x = xd; + p.y = yd; + fz_dash_lineto(s, p, dash_cap); + return; + } + + xab = xa + xb; + yab = ya + yb; + xbc = xb + xc; + ybc = yb + yc; + xcd = xc + xd; + ycd = yc + yd; + + xabc = xab + xbc; + yabc = yab + ybc; + xbcd = xbc + xcd; + ybcd = ybc + ycd; + + xabcd = xabc + xbcd; + yabcd = yabc + ybcd; + + xab *= 0.5f; yab *= 0.5f; + xbc *= 0.5f; ybc *= 0.5f; + xcd *= 0.5f; ycd *= 0.5f; + + xabc *= 0.25f; yabc *= 0.25f; + xbcd *= 0.25f; ybcd *= 0.25f; + + xabcd *= 0.125f; yabcd *= 0.125f; + + fz_dash_bezier(s, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1, dash_cap); + fz_dash_bezier(s, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1, dash_cap); +} + +void +fz_flatten_dash_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth) +{ + struct sctx s; + fz_point p0, p1, p2, p3, beg; + float phase_len; + int i; + + s.gel = gel; + s.ctm = &ctm; + s.flatness = flatness; + + s.linejoin = stroke->linejoin; + s.linewidth = linewidth * 0.5f; + s.miterlimit = stroke->miterlimit; + s.sn = 0; + s.bn = 0; + s.dot = 0; + + s.dash_list = stroke->dash_list; + s.dash_phase = stroke->dash_phase; + s.dash_len = stroke->dash_len; + s.toggle = 0; + s.offset = 0; + s.phase = 0; + + s.cap = stroke->start_cap; + + if (path->len > 0 && path->items[0].k != FZ_MOVETO) + { + fz_warn("assert: path must begin with moveto"); + return; + } + + phase_len = 0; + for (i = 0; i < stroke->dash_len; i++) + phase_len += stroke->dash_list[i]; + if (phase_len < 0.01f || phase_len < stroke->linewidth * 0.5f) + { + fz_flatten_stroke_path(gel, path, stroke, ctm, flatness, linewidth); + return; + } + + p0.x = p0.y = 0; + i = 0; + + while (i < path->len) + { + switch (path->items[i++].k) + { + case FZ_MOVETO: + p1.x = path->items[i++].v; + p1.y = path->items[i++].v; + fz_dash_moveto(&s, p1, stroke->start_cap, stroke->end_cap); + beg = p0 = p1; + break; + + case FZ_LINETO: + p1.x = path->items[i++].v; + p1.y = path->items[i++].v; + fz_dash_lineto(&s, p1, stroke->dash_cap); + p0 = p1; + break; + + case FZ_CURVETO: + p1.x = path->items[i++].v; + p1.y = path->items[i++].v; + p2.x = path->items[i++].v; + p2.y = path->items[i++].v; + p3.x = path->items[i++].v; + p3.y = path->items[i++].v; + fz_dash_bezier(&s, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0, stroke->dash_cap); + p0 = p3; + break; + + case FZ_CLOSE_PATH: + fz_dash_lineto(&s, beg, stroke->dash_cap); + p0 = p1 = beg; + break; + } + } + + fz_stroke_flush(&s, s.cap, stroke->end_cap); +} diff --git a/contrib/media/updf_newlib/draw/draw_scale.c b/contrib/media/updf_newlib/draw/draw_scale.c new file mode 100755 index 000000000..427512ced --- /dev/null +++ b/contrib/media/updf_newlib/draw/draw_scale.c @@ -0,0 +1,1250 @@ +/* +This code does smooth scaling of a pixmap. + +This function returns a new pixmap representing the area starting at (0,0) +given by taking the source pixmap src, scaling it to width w, and height h, +and then positioning it at (frac(x),frac(y)). +*/ + +#include "fitz.h" + +/* Do we special case handling of single pixel high/wide images? The + * 'purest' handling is given by not special casing them, but certain + * files that use such images 'stack' them to give full images. Not + * special casing them results in then being fainter and giving noticable + * rounding errors. + */ +#define SINGLE_PIXEL_SPECIALS + +#ifdef DEBUG_SCALING +#ifdef WIN32 +#include +static void debug_print(const char *fmt, ...) +{ + va_list args; + char text[256]; + va_start(args, fmt); + vsprintf(text, fmt, args); + va_end(args); + OutputDebugStringA(text); + printf(text); +} +#else +static void debug_print(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} +#endif +#endif +#ifdef DEBUG_SCALING +#define DBUG(A) debug_print A +#else +#define DBUG(A) do {} while(0==1) +#endif + +/* +Consider a row of source samples, src, of width src_w, positioned at x, +scaled to width dst_w. + +src[i] is centred at: x + (i + 0.5)*dst_w/src_w + +Therefore the distance between the centre of the jth output pixel and +the centre of the ith source sample is: + +dist[j,i] = j + 0.5 - (x + (i + 0.5)*dst_w/src_w) + +When scaling up, therefore: + +dst[j] = SUM(filter(dist[j,i]) * src[i]) + (for all ints i) + +This can be simplified by noticing that filters are only non zero within +a given filter width (henceforth called W). So: + +dst[j] = SUM(filter(dist[j,i]) * src[i]) + (for ints i, s.t. (j*src_w/dst_w)-W < i < (j*src_w/dst_w)+W) + +When scaling down, each filtered source sample is stretched to be wider +to avoid aliasing issues. This effectively reduces the distance between +centres. + +dst[j] = SUM(filter(dist[j,i] * F) * F * src[i]) + (where F = dst_w/src_w) + (for ints i, s.t. (j-W)/F < i < (j+W)/F) + +*/ + +typedef struct fz_scale_filter_s fz_scale_filter; + +struct fz_scale_filter_s +{ + int width; + float (*fn)(fz_scale_filter *, float); +}; + +/* Image scale filters */ + +static float +triangle(fz_scale_filter *filter, float f) +{ + if (f >= 1) + return 0; + return 1-f; +} + +static float +box(fz_scale_filter *filter, float f) +{ + if (f >= 0.5f) + return 0; + return 1; +} + +static float +simple(fz_scale_filter *filter, float x) +{ + if (x >= 1) + return 0; + return 1 + (2*x - 3)*x*x; +} + +static float +lanczos2(fz_scale_filter *filter, float x) +{ + if (x >= 2) + return 0; + return sinf(M_PI*x) * sinf(M_PI*x/2) / (M_PI*x) / (M_PI*x/2); +} + +static float +lanczos3(fz_scale_filter *filter, float f) +{ + if (f >= 3) + return 0; + return sinf(M_PI*f) * sinf(M_PI*f/3) / (M_PI*f) / (M_PI*f/3); +} + +/* +The Mitchell family of filters is defined: + + f(x) = 1 { (12-9B-6C)x^3 + (-18+12B+6C)x^2 + (6-2B) for x < 1 + - { + 6 { (-B-6C)x^3+(6B+30C)x^2+(-12B-48C)x+(8B+24C) for 1<=x<=2 + +The 'best' ones lie along the line B+2C = 1. +The literature suggests that B=1/3, C=1/3 is best. + + f(x) = 1 { (12-3-2)x^3 - (-18+4+2)x^2 + (16/3) for x < 1 + - { + 6 { (-7/3)x^3 + 12x^2 - 20x + (32/3) for 1<=x<=2 + + f(x) = 1 { 21x^3 - 36x^2 + 16 for x < 1 + - { + 18{ -7x^3 + 36x^2 - 60x + 32 for 1<=x<=2 +*/ + +static float +mitchell(fz_scale_filter *filter, float x) +{ + if (x >= 2) + return 0; + if (x >= 1) + return (32 + x*(-60 + x*(36 - 7*x)))/18; + return (16 + x*x*(-36 + 21*x))/18; +} + +fz_scale_filter fz_scale_filter_box = { 1, box }; +fz_scale_filter fz_scale_filter_triangle = { 1, triangle }; +fz_scale_filter fz_scale_filter_simple = { 1, simple }; +fz_scale_filter fz_scale_filter_lanczos2 = { 2, lanczos2 }; +fz_scale_filter fz_scale_filter_lanczos3 = { 3, lanczos3 }; +fz_scale_filter fz_scale_filter_mitchell = { 2, mitchell }; + +/* +We build ourselves a set of tables to contain the precalculated weights +for a given set of scale settings. + +The first dst_w entries in index are the index into index of the +sets of weight for each destination pixel. + +Each of the sets of weights is a set of values consisting of: + the minimum source pixel index used for this destination pixel + the number of weights used for this destination pixel + the weights themselves + +So to calculate dst[i] we do the following: + + weights = &index[index[i]]; + min = *weights++; + len = *weights++; + dst[i] = 0; + while (--len > 0) + dst[i] += src[min++] * *weights++ + +in addition, we guarantee that at the end of this process weights will now +point to the weights value for dst pixel i+1. + +In the simplest version of this algorithm, we would scale the whole image +horizontally first into a temporary buffer, then scale that temporary +buffer again vertically to give us our result. Using such a simple +algorithm would mean that could use the same style of weights for both +horizontal and vertical scaling. + +Unfortunately, this would also require a large temporary buffer, +particularly in the case where we are scaling up. + +We therefore modify the algorithm as follows; we scale scanlines from the +source image horizontally into a temporary buffer, until we have all the +contributors for a given output scanline. We then produce that output +scanline from the temporary buffer. In this way we restrict the height +of the temporary buffer to a small fraction of the final size. + +Unfortunately, this means that the pseudo code for recombining a +scanline of fully scaled pixels is as follows: + + weights = &index[index[y]]; + min = *weights++; + len = *weights++; + for (x=0 to dst_w) + min2 = min + len2 = len + weights2 = weights + dst[x] = 0; + while (--len2 > 0) + dst[x] += temp[x][(min2++) % tmp_buf_height] * *weights2++ + +i.e. it requires a % operation for every source pixel - this is typically +expensive. + +To avoid this, we alter the order in which vertical weights are stored, +so that they are ordered in the same order as the temporary buffer lines +would appear. This simplifies the algorithm to: + + weights = &index[index[y]]; + min = *weights++; + len = *weights++; + for (x=0 to dst_w) + min2 = 0 + len2 = len + weights2 = weights + dst[x] = 0; + while (--len2 > 0) + dst[x] += temp[i][min2++] * *weights2++ + +This means that len may be larger than it needs to be (due to the +possible inclusion of a zero weight row or two), but in practise this +is only an increase of 1 or 2 at worst. + +We implement this by generating the weights as normal (but ensuring we +leave enough space) and then reordering afterwards. + +*/ + +typedef struct fz_weights_s fz_weights; + +struct fz_weights_s +{ + int count; + int max_len; + int n; + int flip; + int new_line; + int index[1]; +}; + +static fz_weights * +new_weights(fz_scale_filter *filter, int src_w, float dst_w, int dst_w_i, int n, int flip) +{ + int max_len; + fz_weights *weights; + + if (src_w > dst_w) + { + /* Scaling down, so there will be a maximum of + * 2*filterwidth*src_w/dst_w src pixels + * contributing to each dst pixel. */ + max_len = (int)ceilf((2 * filter->width * src_w)/dst_w); + if (max_len > src_w) + max_len = src_w; + } + else + { + /* Scaling up, so there will be a maximum of + * 2*filterwidth src pixels contributing to each dst pixel. + */ + max_len = 2 * filter->width; + } + /* We need the size of the struct, + * plus dst_w*sizeof(int) for the index + * plus (2+max_len)*sizeof(int) for the weights + * plus room for an extra set of weights for reordering. + */ + weights = fz_malloc(sizeof(*weights)+(max_len+3)*(dst_w_i+1)*sizeof(int)); + if (weights == NULL) + return NULL; + weights->count = -1; + weights->max_len = max_len; + weights->index[0] = dst_w_i; + weights->n = n; + weights->flip = flip; + return weights; +} + +static void +init_weights(fz_weights *weights, int j) +{ + int index; + + assert(weights->count == j-1); + weights->count++; + weights->new_line = 1; + if (j == 0) + index = weights->index[0]; + else + { + index = weights->index[j-1]; + index += 2 + weights->index[index+1]; + } + weights->index[j] = index; /* row pointer */ + weights->index[index] = 0; /* min */ + weights->index[index+1] = 0; /* len */ +} + +static void +add_weight(fz_weights *weights, int j, int i, fz_scale_filter *filter, + float x, float F, float G, int src_w, float dst_w) +{ + float dist = j - x + 0.5f - ((i + 0.5f)*dst_w/src_w); + float f; + int min, len, index, weight; + + dist *= G; + if (dist < 0) + dist = -dist; + f = filter->fn(filter, dist)*F; + weight = (int)(256*f+0.5f); + if (weight == 0) + return; + + /* wrap i back into range */ +#ifdef MIRROR_WRAP + do + { + if (i < 0) + i = -1-i; + else if (i >= src_w) + i = 2*src_w-1-i; + else + break; + } + while (1); +#elif defined(WRAP) + if (i < 0) + i = 0; + else if (i >= src_w) + i = src_w-1; +#else + if (i < 0) + { + i = 0; + weight = 0; + } + else if (i >= src_w) + { + i = src_w-1; + weight = 0; + } + if (weight == 0) + return; +#endif + + DBUG(("add_weight[%d][%d] = %d(%g) dist=%g\n",j,i,weight,f,dist)); + + if (weights->new_line) + { + /* New line */ + weights->new_line = 0; + index = weights->index[j]; /* row pointer */ + weights->index[index] = i; /* min */ + weights->index[index+1] = 0; /* len */ + } + index = weights->index[j]; + min = weights->index[index++]; + len = weights->index[index++]; + while (i < min) + { + /* This only happens in rare cases, but we need to insert + * one earlier. In exceedingly rare cases we may need to + * insert more than one earlier. */ + int k; + + for (k = len; k > 0; k--) + { + weights->index[index+k] = weights->index[index+k-1]; + } + weights->index[index] = 0; + min--; + len++; + weights->index[index-2] = min; + weights->index[index-1] = len; + } + if (i-min >= len) + { + /* The usual case */ + while (i-min >= ++len) + { + weights->index[index+len-1] = 0; + } + assert(len-1 == i-min); + weights->index[index+i-min] = weight; + weights->index[index-1] = len; + assert(len <= weights->max_len); + } + else + { + /* Infrequent case */ + weights->index[index+i-min] += weight; + } +} + +static void +reorder_weights(fz_weights *weights, int j, int src_w) +{ + int idx = weights->index[j]; + int min = weights->index[idx++]; + int len = weights->index[idx++]; + int max = weights->max_len; + int tmp = idx+max; + int i, off; + + /* Copy into the temporary area */ + memcpy(&weights->index[tmp], &weights->index[idx], sizeof(int)*len); + + /* Pad out if required */ + assert(len <= max); + assert(min+len <= src_w); + off = 0; + if (len < max) + { + memset(&weights->index[tmp+len], 0, sizeof(int)*(max-len)); + len = max; + if (min + len > src_w) + { + off = min + len - src_w; + min = src_w - len; + weights->index[idx-2] = min; + } + weights->index[idx-1] = len; + } + + /* Copy back into the proper places */ + for (i = 0; i < len; i++) + { + weights->index[idx+((min+i+off) % max)] = weights->index[tmp+i]; + } +} + +/* Due to rounding and edge effects, the sums for the weights sometimes don't + * add up to 256. This causes visible rendering effects. Therefore, we take + * pains to ensure that they 1) never exceed 256, and 2) add up to exactly + * 256 for all pixels that are completely covered. See bug #691629. */ +static void +check_weights(fz_weights *weights, int j, int w, float x, float wf) +{ + int idx, len; + int sum = 0; + int max = -256; + int maxidx = 0; + int i; + + idx = weights->index[j]; + idx++; /* min */ + len = weights->index[idx++]; + + for(i=0; i < len; i++) + { + int v = weights->index[idx++]; + sum += v; + if (v > max) + { + max = v; + maxidx = idx; + } + } + /* If we aren't the first or last pixel, OR if the sum is too big + * then adjust it. */ + if (((j != 0) && (j != w-1)) || (sum > 256)) + weights->index[maxidx-1] += 256-sum; + /* Otherwise, if we are the first pixel, and it's fully covered, then + * adjust it. */ + else if ((j == 0) && (x < 0.0001F) && (sum != 256)) + weights->index[maxidx-1] += 256-sum; + /* Finally, if we are the last pixel, and it's fully covered, then + * adjust it. */ + else if ((j == w-1) && ((float)w-wf < 0.0001F) && (sum != 256)) + weights->index[maxidx-1] += 256-sum; + DBUG(("total weight %d = %d\n", j, sum)); +} + +static fz_weights * +make_weights(int src_w, float x, float dst_w, fz_scale_filter *filter, int vertical, int dst_w_int, int n, int flip) +{ + fz_weights *weights; + float F, G; + float window; + int j; + + if (dst_w < src_w) + { + /* Scaling down */ + F = dst_w / src_w; + G = 1; + } + else + { + /* Scaling up */ + F = 1; + G = src_w / dst_w; + } + window = filter->width / F; + DBUG(("make_weights src_w=%d x=%g dst_w=%g dst_w_int=%d F=%g window=%g\n", src_w, x, dst_w, dst_w_int, F, window)); + weights = new_weights(filter, src_w, dst_w, dst_w_int, n, flip); + if (weights == NULL) + return NULL; + for (j = 0; j < dst_w_int; j++) + { + /* find the position of the centre of dst[j] in src space */ + float centre = (j - x + 0.5f)*src_w/dst_w - 0.5f; + int l, r; + l = ceilf(centre - window); + r = floorf(centre + window); + DBUG(("%d: centre=%g l=%d r=%d\n", j, centre, l, r)); + init_weights(weights, j); + for (; l <= r; l++) + { + add_weight(weights, j, l, filter, x, F, G, src_w, dst_w); + } + check_weights(weights, j, dst_w_int, x, dst_w); + if (vertical) + { + reorder_weights(weights, j, src_w); + } + } + weights->count++; /* weights->count = dst_w_int now */ + return weights; +} + +static void +scale_row_to_temp(int *dst, unsigned char *src, fz_weights *weights) +{ + int *contrib = &weights->index[weights->index[0]]; + int len, i, j, n; + unsigned char *min; + + n = weights->n; + if (weights->flip) + { + dst += (weights->count-1)*n; + for (i=weights->count; i > 0; i--) + { + min = &src[n * *contrib++]; + len = *contrib++; + for (j = 0; j < n; j++) + dst[j] = 0; + while (len-- > 0) + { + for (j = n; j > 0; j--) + *dst++ += *min++ * *contrib; + dst -= n; + contrib++; + } + dst -= n; + } + } + else + { + for (i=weights->count; i > 0; i--) + { + min = &src[n * *contrib++]; + len = *contrib++; + for (j = 0; j < n; j++) + dst[j] = 0; + while (len-- > 0) + { + for (j = n; j > 0; j--) + *dst++ += *min++ * *contrib; + dst -= n; + contrib++; + } + dst += n; + } + } +} + +static void +scale_row_to_temp1(int *dst, unsigned char *src, fz_weights *weights) +{ + int *contrib = &weights->index[weights->index[0]]; + int len, i; + unsigned char *min; + + assert(weights->n == 1); + if (weights->flip) + { + dst += weights->count; + for (i=weights->count; i > 0; i--) + { + int val = 0; + min = &src[*contrib++]; + len = *contrib++; + while (len-- > 0) + { + val += *min++ * *contrib++; + } + *--dst = val; + } + } + else + { + for (i=weights->count; i > 0; i--) + { + int val = 0; + min = &src[*contrib++]; + len = *contrib++; + while (len-- > 0) + { + val += *min++ * *contrib++; + } + *dst++ = val; + } + } +} + +static void +scale_row_to_temp2(int *dst, unsigned char *src, fz_weights *weights) +{ + int *contrib = &weights->index[weights->index[0]]; + int len, i; + unsigned char *min; + + assert(weights->n == 2); + if (weights->flip) + { + dst += 2*weights->count; + for (i=weights->count; i > 0; i--) + { + int c1 = 0; + int c2 = 0; + min = &src[2 * *contrib++]; + len = *contrib++; + while (len-- > 0) + { + c1 += *min++ * *contrib; + c2 += *min++ * *contrib++; + } + *--dst = c2; + *--dst = c1; + } + } + else + { + for (i=weights->count; i > 0; i--) + { + int c1 = 0; + int c2 = 0; + min = &src[2 * *contrib++]; + len = *contrib++; + while (len-- > 0) + { + c1 += *min++ * *contrib; + c2 += *min++ * *contrib++; + } + *dst++ = c1; + *dst++ = c2; + } + } +} + +static void +scale_row_to_temp4(int *dst, unsigned char *src, fz_weights *weights) +{ + int *contrib = &weights->index[weights->index[0]]; +#ifndef ARCH_ARM + int len, i; + unsigned char *min; +#endif + + assert(weights->n == 4); + if (weights->flip) + { + dst += 4*weights->count; +#ifdef ARCH_ARM + asm volatile( + "1:" + "ldr r4, [%2], #4 @ r4 = *contrib++ \n" + "ldr r9, [%2], #4 @ r9 = len = *contrib++ \n" + "mov r5, #0 @ r5 = r = 0 \n" + "mov r6, #0 @ r6 = g = 0 \n" + "mov r7, #0 @ r7 = b = 0 \n" + "mov r8, #0 @ r8 = a = 0 \n" + "add r4, %1, r4, LSL #2 @ r4 = min = &src[4*r4] \n" + "cmp r9, #0 @ while (len-- > 0) \n" + "beq 3f @ { \n" + "2: \n" + "ldr r10,[%2], #4 @ r10 = *contrib++ \n" + "ldrb r11,[r4], #1 @ r11 = *min++ \n" + "ldrb r12,[r4], #1 @ r12 = *min++ \n" + "ldrb r14,[r4], #1 @ r14 = *min++ \n" + "mla r5, r10,r11,r5 @ r += r11 * r10 \n" + "ldrb r11,[r4], #1 @ r11 = *min++ \n" + "mla r6, r10,r12,r6 @ g += r12 * r10 \n" + "mla r7, r10,r14,r7 @ b += r14 * r10 \n" + "mla r8, r10,r11,r8 @ a += r11 * r10 \n" + "subs r9, r9, #1 @ r9 = len-- \n" + "bgt 2b @ } \n" + "stmdb %0!,{r5,r6,r7,r8} @ *--dst=a;*--dst=b; \n" + "3: @ *--dst=g;*--dst=r; \n" + "subs %3, %3, #1 @ i-- \n" + "bgt 1b @ \n" + : + : + "r" (dst), + "r" (src), + "r" (contrib), + "r" (weights->count) + : + "r4","r5","r6","r7","r8","r9","r10","r11","r12","r14", + "memory","cc" + ); +#else + for (i=weights->count; i > 0; i--) + { + int r = 0; + int g = 0; + int b = 0; + int a = 0; + min = &src[4 * *contrib++]; + len = *contrib++; + while (len-- > 0) + { + r += *min++ * *contrib; + g += *min++ * *contrib; + b += *min++ * *contrib; + a += *min++ * *contrib++; + } + *--dst = a; + *--dst = b; + *--dst = g; + *--dst = r; + } +#endif + } + else + { +#ifdef ARCH_ARM + asm volatile( + "1:" + "ldr r4, [%2], #4 @ r4 = *contrib++ \n" + "ldr r9, [%2], #4 @ r9 = len = *contrib++ \n" + "mov r5, #0 @ r5 = r = 0 \n" + "mov r6, #0 @ r6 = g = 0 \n" + "mov r7, #0 @ r7 = b = 0 \n" + "mov r8, #0 @ r8 = a = 0 \n" + "add r4, %1, r4, LSL #2 @ r4 = min = &src[4*r4] \n" + "cmp r9, #0 @ while (len-- > 0) \n" + "beq 3f @ { \n" + "2: \n" + "ldr r10,[%2], #4 @ r10 = *contrib++ \n" + "ldrb r11,[r4], #1 @ r11 = *min++ \n" + "ldrb r12,[r4], #1 @ r12 = *min++ \n" + "ldrb r14,[r4], #1 @ r14 = *min++ \n" + "mla r5, r10,r11,r5 @ r += r11 * r10 \n" + "ldrb r11,[r4], #1 @ r11 = *min++ \n" + "mla r6, r10,r12,r6 @ g += r12 * r10 \n" + "mla r7, r10,r14,r7 @ b += r14 * r10 \n" + "mla r8, r10,r11,r8 @ a += r11 * r10 \n" + "subs r9, r9, #1 @ r9 = len-- \n" + "bgt 2b @ } \n" + "stmia %0!,{r5,r6,r7,r8} @ *dst++=r;*dst++=g; \n" + "3: @ *dst++=b;*dst++=a; \n" + "subs %3, %3, #1 @ i-- \n" + "bgt 1b @ \n" + : + : + "r" (dst), + "r" (src), + "r" (contrib), + "r" (weights->count) + : + "r4","r5","r6","r7","r8","r9","r10","r11","r12","r14", + "memory","cc" + ); +#else + for (i=weights->count; i > 0; i--) + { + int r = 0; + int g = 0; + int b = 0; + int a = 0; + min = &src[4 * *contrib++]; + len = *contrib++; + while (len-- > 0) + { + r += *min++ * *contrib; + g += *min++ * *contrib; + b += *min++ * *contrib; + a += *min++ * *contrib++; + } + *dst++ = r; + *dst++ = g; + *dst++ = b; + *dst++ = a; + } +#endif + } +} + +static void +scale_row_from_temp(unsigned char *dst, int *src, fz_weights *weights, int width, int row) +{ + int *contrib = &weights->index[weights->index[row]]; + int len, x; + + contrib++; /* Skip min */ + len = *contrib++; + for (x=width; x > 0; x--) + { + int *min = src; + int val = 0; + int len2 = len; + int *contrib2 = contrib; + + while (len2-- > 0) + { + val += *min * *contrib2++; + min += width; + } + val = (val+(1<<15))>>16; + if (val < 0) + val = 0; + else if (val > 255) + val = 255; + *dst++ = val; + src++; + } +} + +#ifdef SINGLE_PIXEL_SPECIALS +static void +duplicate_single_pixel(unsigned char *dst, unsigned char *src, int n, int w, int h) +{ + int i; + + for (i = n; i > 0; i--) + *dst++ = *src++; + for (i = (w*h-1)*n; i > 0; i--) + { + *dst = dst[-n]; + dst++; + } +} + +static void +scale_single_row(unsigned char *dst, unsigned char *src, fz_weights *weights, int src_w, int h) +{ + int *contrib = &weights->index[weights->index[0]]; + int min, len, i, j, val, n; + int tmp[FZ_MAX_COLORS]; + + n = weights->n; + /* Scale a single row */ + if (weights->flip) + { + dst += (weights->count-1)*n; + for (i=weights->count; i > 0; i--) + { + min = *contrib++; + len = *contrib++; + min *= n; + for (j = 0; j < n; j++) + tmp[j] = 0; + while (len-- > 0) + { + for (j = 0; j < n; j++) + tmp[j] += src[min++] * *contrib; + contrib++; + } + for (j = 0; j < n; j++) + { + val = (tmp[j]+(1<<7))>>8; + if (val < 0) + val = 0; + else if (val > 255) + val = 255; + *dst++ = val; + } + dst -= 2*n; + } + dst += n * (weights->count+1); + } + else + { + for (i=weights->count; i > 0; i--) + { + min = *contrib++; + len = *contrib++; + min *= n; + for (j = 0; j < n; j++) + tmp[j] = 0; + while (len-- > 0) + { + for (j = 0; j < n; j++) + tmp[j] += src[min++] * *contrib; + contrib++; + } + for (j = 0; j < n; j++) + { + val = (tmp[j]+(1<<7))>>8; + if (val < 0) + val = 0; + else if (val > 255) + val = 255; + *dst++ = val; + } + } + } + /* And then duplicate it h times */ + n *= weights->count; + while (--h > 0) + { + memcpy(dst, dst-n, n); + dst += n; + } +} + +static void +scale_single_col(unsigned char *dst, unsigned char *src, fz_weights *weights, int src_w, int n, int w, int flip_y) +{ + int *contrib = &weights->index[weights->index[0]]; + int min, len, i, j, val; + int tmp[FZ_MAX_COLORS]; + + if (flip_y) + { + src_w = (src_w-1)*n; + w = (w-1)*n; + for (i=weights->count; i > 0; i--) + { + /* Scale the next pixel in the column */ + min = *contrib++; + len = *contrib++; + min = src_w-min*n; + for (j = 0; j < n; j++) + tmp[j] = 0; + while (len-- > 0) + { + for (j = 0; j < n; j++) + tmp[j] += src[src_w-min+j] * *contrib; + contrib++; + } + for (j = 0; j < n; j++) + { + val = (tmp[j]+(1<<7))>>8; + if (val < 0) + val = 0; + else if (val > 255) + val = 255; + *dst++ = val; + } + /* And then duplicate it across the row */ + for (j = w; j > 0; j--) + { + *dst = dst[-n]; + dst++; + } + } + } + else + { + w = (w-1)*n; + for (i=weights->count; i > 0; i--) + { + /* Scale the next pixel in the column */ + min = *contrib++; + len = *contrib++; + min *= n; + for (j = 0; j < n; j++) + tmp[j] = 0; + while (len-- > 0) + { + for (j = 0; j < n; j++) + tmp[j] += src[min++] * *contrib; + contrib++; + } + for (j = 0; j < n; j++) + { + val = (tmp[j]+(1<<7))>>8; + if (val < 0) + val = 0; + else if (val > 255) + val = 255; + *dst++ = val; + } + /* And then duplicate it across the row */ + for (j = w; j > 0; j--) + { + *dst = dst[-n]; + dst++; + } + } + } +} +#endif /* SINGLE_PIXEL_SPECIALS */ + +fz_pixmap * +fz_scale_pixmap_gridfit(fz_pixmap *src, float x, float y, float w, float h, int gridfit) +{ + if (gridfit) { + float n; + if (w > 0) { + /* Adjust the left hand edge, leftwards to a pixel boundary */ + n = (float)(int)x; /* n is now on a pixel boundary */ + if (n > x) /* Ensure it's the pixel boundary BELOW x */ + n -= 1.0f; + w += x-n; /* width gets wider as x >= n */ + x = n; + /* Adjust the right hand edge rightwards to a pixel boundary */ + n = (float)(int)w; /* n is now the integer width <= w */ + if (n != w) /* If w isn't an integer already, bump it */ + w = 1.0f + n;/* up to the next integer. */ + } else { + /* Adjust the right hand edge, rightwards to a pixel boundary */ + n = (float)(int)x; /* n is now on a pixel boundary */ + if (n > x) /* Ensure it's the pixel boundary <= x */ + n -= 1.0f; + if (n != x) /* If x isn't on a pixel boundary already, */ + n += 1.0f; /* make n be the pixel boundary above x. */ + w -= n-x; /* Expand width (more negative!) as n >= x */ + x = n; + /* Adjust the left hand edge leftwards to a pixel boundary */ + n = (float)(int)w; + if (n != w) + w = n - 1.0f; + } + if (h > 0) { + /* Adjust the bottom edge, downwards to a pixel boundary */ + n = (float)(int)y; /* n is now on a pixel boundary */ + if (n > y) /* Ensure it's the pixel boundary BELOW y */ + n -= 1.0f; + h += y-n; /* height gets larger as y >= n */ + y = n; + /* Adjust the top edge upwards to a pixel boundary */ + n = (float)(int)h; /* n is now the integer height <= h */ + if (n != h) /* If h isn't an integer already, bump it */ + h = 1.0f + n;/* up to the next integer. */ + } else { + /* Adjust the top edge, upwards to a pixel boundary */ + n = (float)(int)y; /* n is now on a pixel boundary */ + if (n > y) /* Ensure it's the pixel boundary <= y */ + n -= 1.0f; + if (n != y) /* If y isn't on a pixel boundary already, */ + n += 1.0f; /* make n be the pixel boundary above y. */ + h -= n-y; /* Expand height (more negative!) as n >= y */ + y = n; + /* Adjust the bottom edge downwards to a pixel boundary */ + n = (float)(int)h; + if (n != h) + h = n - 1.0f; + } + } + return fz_scale_pixmap(src, x, y, w, h); +} + +fz_pixmap * +fz_scale_pixmap(fz_pixmap *src, float x, float y, float w, float h) +{ + fz_scale_filter *filter = &fz_scale_filter_simple; + fz_weights *contrib_rows = NULL; + fz_weights *contrib_cols = NULL; + fz_pixmap *output = NULL; + int *temp = NULL; + int max_row, temp_span, temp_rows, row; + int dst_w_int, dst_h_int, dst_x_int, dst_y_int; + int flip_x, flip_y; + + DBUG(("Scale: (%d,%d) to (%g,%g) at (%g,%g)\n",src->w,src->h,w,h,x,y)); + + /* Find the destination bbox, width/height, and sub pixel offset, + * allowing for whether we're flipping or not. */ + /* Note that the x and y sub pixel offsets here are different. + * The (x,y) position given describes where the bottom left corner + * of the source image should be mapped to (i.e. where (0,h) in image + * space ends up, not the more logical and sane (0,0)). Also there + * are differences in the way we scale horizontally and vertically. + * When scaling rows horizontally, we always read forwards through + * the source, and store either forwards or in reverse as required. + * When scaling vertically, we always store out forwards, but may + * feed source rows in in a different order. + * + * Consider the image rectange 'r' to which the image is mapped, + * and the (possibly) larger rectangle 'R', given by expanding 'r' to + * complete pixels. + * + * x can either be r.xmin-R.xmin or R.xmax-r.xmax depending on whether + * the image is x flipped or not. Whatever happens 0 <= x < 1. + * y is always R.ymax - r.ymax. + */ + /* dst_x_int is calculated to be the left of the scaled image, and + * x (the sub_pixel_offset) is the distance in from either the left + * or right pixel expanded edge. */ + flip_x = (w < 0); + if (flip_x) + { + float tmp; + w = -w; + dst_x_int = floor(x-w); + tmp = ceilf(x); + dst_w_int = (int)tmp; + x = tmp - x; + dst_w_int -= dst_x_int; + } + else + { + dst_x_int = floor(x); + x -= (float)dst_x_int; + dst_w_int = (int)ceilf(x + w); + } + flip_y = (h < 0); + /* dst_y_int is calculated to be the bottom of the scaled image, but + * y (the sub pixel offset) has to end up being the value at the top. + */ + if (flip_y) + { + h = -h; + dst_y_int = floor(y-h); + dst_h_int = (int)ceilf(y) - dst_y_int; + } else { + dst_y_int = floor(y); + y += h; + dst_h_int = (int)ceilf(y) - dst_y_int; + } + /* y is the top edge position in floats. We want it to be the + * distance down from the next pixel boundary. */ + y = ceilf(y) - y; + + DBUG(("Result image: (%d,%d) at (%d,%d) (subpix=%g,%g)\n", dst_w_int, dst_h_int, dst_x_int, dst_y_int, x, y)); + + /* Step 1: Calculate the weights for columns and rows */ +#ifdef SINGLE_PIXEL_SPECIALS + if (src->w == 1) + { + contrib_cols = NULL; + } + else +#endif /* SINGLE_PIXEL_SPECIALS */ + { + contrib_cols = make_weights(src->w, x, w, filter, 0, dst_w_int, src->n, flip_x); + if (contrib_cols == NULL) + goto cleanup; + } +#ifdef SINGLE_PIXEL_SPECIALS + if (src->h == 1) + { + contrib_rows = NULL; + } + else +#endif /* SINGLE_PIXEL_SPECIALS */ + { + contrib_rows = make_weights(src->h, y, h, filter, 1, dst_h_int, src->n, flip_y); + if (contrib_rows == NULL) + goto cleanup; + } + + assert(contrib_cols == NULL || contrib_cols->count == dst_w_int); + assert(contrib_rows == NULL || contrib_rows->count == dst_h_int); + output = fz_new_pixmap(src->colorspace, dst_w_int, dst_h_int); + output->x = dst_x_int; + output->y = dst_y_int; + + /* Step 2: Apply the weights */ +#ifdef SINGLE_PIXEL_SPECIALS + if (contrib_rows == NULL) + { + /* Only 1 source pixel high. */ + if (contrib_cols == NULL) + { + /* Only 1 pixel in the entire image! */ + duplicate_single_pixel(output->samples, src->samples, src->n, dst_w_int, dst_h_int); + } + else + { + /* Scale the row once, then copy it. */ + scale_single_row(output->samples, src->samples, contrib_cols, src->w, dst_h_int); + } + } + else if (contrib_cols == NULL) + { + /* Only 1 source pixel wide. Scale the col and duplicate. */ + scale_single_col(output->samples, src->samples, contrib_rows, src->h, src->n, dst_w_int, flip_y); + } + else +#endif /* SINGLE_PIXEL_SPECIALS */ + { + void (*row_scale)(int *dst, unsigned char *src, fz_weights *weights); + + temp_span = contrib_cols->count * src->n; + temp_rows = contrib_rows->max_len; + if (temp_span <= 0 || temp_rows > INT_MAX / temp_span) + goto cleanup; + temp = fz_calloc(temp_span*temp_rows, sizeof(int)); + if (temp == NULL) + goto cleanup; + switch (src->n) + { + default: + row_scale = scale_row_to_temp; + break; + case 1: /* Image mask case */ + row_scale = scale_row_to_temp1; + break; + case 2: /* Greyscale with alpha case */ + row_scale = scale_row_to_temp2; + break; + case 4: /* RGBA */ + row_scale = scale_row_to_temp4; + break; + } + max_row = 0; + for (row = 0; row < contrib_rows->count; row++) + { + /* + Which source rows do we need to have scaled into the + temporary buffer in order to be able to do the final + scale? + */ + int row_index = contrib_rows->index[row]; + int row_min = contrib_rows->index[row_index++]; + int row_len = contrib_rows->index[row_index++]; + while (max_row < row_min+row_len) + { + /* Scale another row */ + assert(max_row < src->h); + DBUG(("scaling row %d to temp\n", max_row)); + (*row_scale)(&temp[temp_span*(max_row % temp_rows)], &src->samples[(flip_y ? (src->h-1-max_row): max_row)*src->w*src->n], contrib_cols); + max_row++; + } + + DBUG(("scaling row %d from temp\n", row)); + scale_row_from_temp(&output->samples[row*output->w*output->n], temp, contrib_rows, temp_span, row); + } + fz_free(temp); + } + +cleanup: + fz_free(contrib_rows); + fz_free(contrib_cols); + return output; +} diff --git a/contrib/media/updf_newlib/draw/draw_unpack.c b/contrib/media/updf_newlib/draw/draw_unpack.c new file mode 100755 index 000000000..b60de3b8c --- /dev/null +++ b/contrib/media/updf_newlib/draw/draw_unpack.c @@ -0,0 +1,235 @@ +#include "fitz.h" + +/* Unpack image samples and optionally pad pixels with opaque alpha */ + +#define get1(buf,x) ((buf[x >> 3] >> ( 7 - (x & 7) ) ) & 1 ) +#define get2(buf,x) ((buf[x >> 2] >> ( ( 3 - (x & 3) ) << 1 ) ) & 3 ) +#define get4(buf,x) ((buf[x >> 1] >> ( ( 1 - (x & 1) ) << 2 ) ) & 15 ) +#define get8(buf,x) (buf[x]) +#define get16(buf,x) (buf[x << 1]) + +static unsigned char get1_tab_1[256][8]; +static unsigned char get1_tab_1p[256][16]; +static unsigned char get1_tab_255[256][8]; +static unsigned char get1_tab_255p[256][16]; + +static void +init_get1_tables(void) +{ + static int once = 0; + unsigned char bits[1]; + int i, k, x; + + /* TODO: mutex lock here */ + + if (once) + return; + + for (i = 0; i < 256; i++) + { + bits[0] = i; + for (k = 0; k < 8; k++) + { + x = get1(bits, k); + + get1_tab_1[i][k] = x; + get1_tab_1p[i][k * 2] = x; + get1_tab_1p[i][k * 2 + 1] = 255; + + get1_tab_255[i][k] = x * 255; + get1_tab_255p[i][k * 2] = x * 255; + get1_tab_255p[i][k * 2 + 1] = 255; + } + } + + once = 1; +} + +void +fz_unpack_tile(fz_pixmap *dst, unsigned char * restrict src, int n, int depth, int stride, int scale) +{ + int pad, x, y, k; + int w = dst->w; + + pad = 0; + if (dst->n > n) + pad = 255; + + if (depth == 1) + init_get1_tables(); + + if (scale == 0) + { + switch (depth) + { + case 1: scale = 255; break; + case 2: scale = 85; break; + case 4: scale = 17; break; + } + } + + for (y = 0; y < dst->h; y++) + { + unsigned char *sp = src + y * stride; + unsigned char *dp = dst->samples + y * (dst->w * dst->n); + + /* Specialized loops */ + + if (n == 1 && depth == 1 && scale == 1 && !pad) + { + int w3 = w >> 3; + for (x = 0; x < w3; x++) + { + memcpy(dp, get1_tab_1[*sp++], 8); + dp += 8; + } + x = x << 3; + if (x < w) + memcpy(dp, get1_tab_1[*sp], w - x); + } + + else if (n == 1 && depth == 1 && scale == 255 && !pad) + { + int w3 = w >> 3; + for (x = 0; x < w3; x++) + { + memcpy(dp, get1_tab_255[*sp++], 8); + dp += 8; + } + x = x << 3; + if (x < w) + memcpy(dp, get1_tab_255[*sp], w - x); + } + + else if (n == 1 && depth == 1 && scale == 1 && pad) + { + int w3 = w >> 3; + for (x = 0; x < w3; x++) + { + memcpy(dp, get1_tab_1p[*sp++], 16); + dp += 16; + } + x = x << 3; + if (x < w) + memcpy(dp, get1_tab_1p[*sp], (w - x) << 1); + } + + else if (n == 1 && depth == 1 && scale == 255 && pad) + { + int w3 = w >> 3; + for (x = 0; x < w3; x++) + { + memcpy(dp, get1_tab_255p[*sp++], 16); + dp += 16; + } + x = x << 3; + if (x < w) + memcpy(dp, get1_tab_255p[*sp], (w - x) << 1); + } + + else if (depth == 8 && !pad) + { + int len = w * n; + while (len--) + *dp++ = *sp++; + } + + else if (depth == 8 && pad) + { + for (x = 0; x < w; x++) + { + for (k = 0; k < n; k++) + *dp++ = *sp++; + *dp++ = 255; + } + } + + else + { + int b = 0; + for (x = 0; x < w; x++) + { + for (k = 0; k < n; k++) + { + switch (depth) + { + case 1: *dp++ = get1(sp, b) * scale; break; + case 2: *dp++ = get2(sp, b) * scale; break; + case 4: *dp++ = get4(sp, b) * scale; break; + case 8: *dp++ = get8(sp, b); break; + case 16: *dp++ = get16(sp, b); break; + } + b++; + } + if (pad) + *dp++ = 255; + } + } + } +} + +/* Apply decode array */ + +void +fz_decode_indexed_tile(fz_pixmap *pix, float *decode, int maxval) +{ + int add[FZ_MAX_COLORS]; + int mul[FZ_MAX_COLORS]; + unsigned char *p = pix->samples; + int len = pix->w * pix->h; + int n = pix->n - 1; + int needed; + int k; + + needed = 0; + for (k = 0; k < n; k++) + { + int min = decode[k * 2] * 256; + int max = decode[k * 2 + 1] * 256; + add[k] = min; + mul[k] = (max - min) / maxval; + needed |= min != 0 || max != maxval * 256; + } + + if (!needed) + return; + + while (len--) + { + for (k = 0; k < n; k++) + p[k] = (add[k] + (((p[k] << 8) * mul[k]) >> 8)) >> 8; + p += n + 1; + } +} + +void +fz_decode_tile(fz_pixmap *pix, float *decode) +{ + int add[FZ_MAX_COLORS]; + int mul[FZ_MAX_COLORS]; + unsigned char *p = pix->samples; + int len = pix->w * pix->h; + int n = MAX(1, pix->n - 1); + int needed; + int k; + + needed = 0; + for (k = 0; k < n; k++) + { + int min = decode[k * 2] * 255; + int max = decode[k * 2 + 1] * 255; + add[k] = min; + mul[k] = max - min; + needed |= min != 0 || max != 255; + } + + if (!needed) + return; + + while (len--) + { + for (k = 0; k < n; k++) + p[k] = add[k] + fz_mul255(p[k], mul[k]); + p += pix->n; + } +} diff --git a/contrib/media/updf_newlib/fitz/Makefile b/contrib/media/updf_newlib/fitz/Makefile new file mode 100755 index 000000000..2fff0a4f0 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/Makefile @@ -0,0 +1,19 @@ +CC = kos32-gcc +LD = kos32-ld + +SDK_DIR = $(abspath ../../../sdk) + +CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 + +INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I $(SDK_DIR)/sources/freetype/include -I /media/maxim/E22406D62406AE1B/SVNKOS/contrib/sdk/sources/zlib -I ../libopenjpeg -I ../include + +FITZ_SRC := $(notdir $(wildcard *.c)) +OBJECTS = $(patsubst %.c, %.o, $(FITZ_SRC)) + +default: $(patsubst %.c,%.o,$(FITZ_SRC)) + ar rcs libfitz.a *.o + rm *.o + mv libfitz.a ../lib + +%.o : %.c Makefile $(FITZ_SRC) + $(CC) $(CFLAGS) $(INCLUDES) -o $@ $< diff --git a/contrib/media/updf_newlib/fitz/base_error.c b/contrib/media/updf_newlib/fitz/base_error.c new file mode 100755 index 000000000..a0efa2900 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/base_error.c @@ -0,0 +1,159 @@ +#include "fitz.h" + +enum { LINE_LEN = 160, LINE_COUNT = 25 }; + +static char warn_message[LINE_LEN] = ""; +static int warn_count = 0; + +void fz_flush_warnings(void) +{ + if (warn_count > 1) + fprintf(stderr, "warning: ... repeated %d times ...\n", warn_count); + warn_message[0] = 0; + warn_count = 0; +} + +void fz_warn(char *fmt, ...) +{ + va_list ap; + char buf[LINE_LEN]; + + va_start(ap, fmt); + vsnprintf(buf, sizeof buf, fmt, ap); + va_end(ap); + + if (!strcmp(buf, warn_message)) + { + warn_count++; + } + else + { + fz_flush_warnings(); + fprintf(stderr, "warning: %s\n", buf); + fz_strlcpy(warn_message, buf, sizeof warn_message); + warn_count = 1; + } +} + +static char error_message[LINE_COUNT][LINE_LEN]; +static int error_count = 0; + +static void +fz_emit_error(char what, char *location, char *message) +{ + fz_flush_warnings(); + + fprintf(stderr, "%c %s%s\n", what, location, message); + + if (error_count < LINE_COUNT) + { + fz_strlcpy(error_message[error_count], location, LINE_LEN); + fz_strlcat(error_message[error_count], message, LINE_LEN); + error_count++; + } +} + +int +fz_get_error_count(void) +{ + return error_count; +} + +char * +fz_get_error_line(int n) +{ + return error_message[n]; +} + +fz_error +fz_throw_imp(const char *file, int line, const char *func, char *fmt, ...) +{ + va_list ap; + char one[LINE_LEN], two[LINE_LEN]; + + error_count = 0; + + snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func); + va_start(ap, fmt); + vsnprintf(two, sizeof two, fmt, ap); + va_end(ap); + + fz_emit_error('+', one, two); + + return -1; +} + +fz_error +fz_rethrow_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...) +{ + va_list ap; + char one[LINE_LEN], two[LINE_LEN]; + + snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func); + va_start(ap, fmt); + vsnprintf(two, sizeof two, fmt, ap); + va_end(ap); + + fz_emit_error('|', one, two); + + return cause; +} + +void +fz_catch_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...) +{ + va_list ap; + char one[LINE_LEN], two[LINE_LEN]; + + snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func); + va_start(ap, fmt); + vsnprintf(two, sizeof two, fmt, ap); + va_end(ap); + + fz_emit_error('\\', one, two); +} + +fz_error +fz_throw_impx(char *fmt, ...) +{ + va_list ap; + char buf[LINE_LEN]; + + error_count = 0; + + va_start(ap, fmt); + vsnprintf(buf, sizeof buf, fmt, ap); + va_end(ap); + + fz_emit_error('+', "", buf); + + return -1; +} + +fz_error +fz_rethrow_impx(fz_error cause, char *fmt, ...) +{ + va_list ap; + char buf[LINE_LEN]; + + va_start(ap, fmt); + vsnprintf(buf, sizeof buf, fmt, ap); + va_end(ap); + + fz_emit_error('|', "", buf); + + return cause; +} + +void +fz_catch_impx(fz_error cause, char *fmt, ...) +{ + va_list ap; + char buf[LINE_LEN]; + + va_start(ap, fmt); + vsnprintf(buf, sizeof buf, fmt, ap); + va_end(ap); + + fz_emit_error('\\', "", buf); +} diff --git a/contrib/media/updf_newlib/fitz/base_geometry.c b/contrib/media/updf_newlib/fitz/base_geometry.c new file mode 100755 index 000000000..00a85c9bc --- /dev/null +++ b/contrib/media/updf_newlib/fitz/base_geometry.c @@ -0,0 +1,268 @@ +#include "fitz.h" + +#define MAX4(a,b,c,d) MAX(MAX(a,b), MAX(c,d)) +#define MIN4(a,b,c,d) MIN(MIN(a,b), MIN(c,d)) + +/* Matrices, points and affine transformations */ + +const fz_matrix fz_identity = { 1, 0, 0, 1, 0, 0 }; + +fz_matrix +fz_concat(fz_matrix one, fz_matrix two) +{ + fz_matrix dst; + dst.a = one.a * two.a + one.b * two.c; + dst.b = one.a * two.b + one.b * two.d; + dst.c = one.c * two.a + one.d * two.c; + dst.d = one.c * two.b + one.d * two.d; + dst.e = one.e * two.a + one.f * two.c + two.e; + dst.f = one.e * two.b + one.f * two.d + two.f; + return dst; +} + +fz_matrix +fz_scale(float sx, float sy) +{ + fz_matrix m; + m.a = sx; m.b = 0; + m.c = 0; m.d = sy; + m.e = 0; m.f = 0; + return m; +} + +fz_matrix +fz_shear(float h, float v) +{ + fz_matrix m; + m.a = 1; m.b = v; + m.c = h; m.d = 1; + m.e = 0; m.f = 0; + return m; +} + +fz_matrix +fz_rotate(float theta) +{ + fz_matrix m; + float s; + float c; + + while (theta < 0) + theta += 360; + while (theta >= 360) + theta -= 360; + + if (fabsf(0 - theta) < FLT_EPSILON) + { + s = 0; + c = 1; + } + else if (fabsf(90.0f - theta) < FLT_EPSILON) + { + s = 1; + c = 0; + } + else if (fabsf(180.0f - theta) < FLT_EPSILON) + { + s = 0; + c = -1; + } + else if (fabsf(270.0f - theta) < FLT_EPSILON) + { + s = -1; + c = 0; + } + else + { + s = sinf(theta * (float)M_PI / 180); + c = cosf(theta * (float)M_PI / 180); + } + + m.a = c; m.b = s; + m.c = -s; m.d = c; + m.e = 0; m.f = 0; + return m; +} + +fz_matrix +fz_translate(float tx, float ty) +{ + fz_matrix m; + m.a = 1; m.b = 0; + m.c = 0; m.d = 1; + m.e = tx; m.f = ty; + return m; +} + +fz_matrix +fz_invert_matrix(fz_matrix src) +{ + fz_matrix dst; + float rdet = 1 / (src.a * src.d - src.b * src.c); + dst.a = src.d * rdet; + dst.b = -src.b * rdet; + dst.c = -src.c * rdet; + dst.d = src.a * rdet; + dst.e = -src.e * dst.a - src.f * dst.c; + dst.f = -src.e * dst.b - src.f * dst.d; + return dst; +} + +int +fz_is_rectilinear(fz_matrix m) +{ + return (fabsf(m.b) < FLT_EPSILON && fabsf(m.c) < FLT_EPSILON) || + (fabsf(m.a) < FLT_EPSILON && fabsf(m.d) < FLT_EPSILON); +} + +float +fz_matrix_expansion(fz_matrix m) +{ + return sqrtf(fabsf(m.a * m.d - m.b * m.c)); +} + +fz_point +fz_transform_point(fz_matrix m, fz_point p) +{ + fz_point t; + t.x = p.x * m.a + p.y * m.c + m.e; + t.y = p.x * m.b + p.y * m.d + m.f; + return t; +} + +fz_point +fz_transform_vector(fz_matrix m, fz_point p) +{ + fz_point t; + t.x = p.x * m.a + p.y * m.c; + t.y = p.x * m.b + p.y * m.d; + return t; +} + +/* Rectangles and bounding boxes */ + +const fz_rect fz_infinite_rect = { 1, 1, -1, -1 }; +const fz_rect fz_empty_rect = { 0, 0, 0, 0 }; +const fz_rect fz_unit_rect = { 0, 0, 1, 1 }; + +const fz_bbox fz_infinite_bbox = { 1, 1, -1, -1 }; +const fz_bbox fz_empty_bbox = { 0, 0, 0, 0 }; +const fz_bbox fz_unit_bbox = { 0, 0, 1, 1 }; + +fz_bbox +fz_round_rect(fz_rect f) +{ + fz_bbox i; + i.x0 = floorf(f.x0 + 0.001f); /* adjust by 0.001 to compensate for precision errors */ + i.y0 = floorf(f.y0 + 0.001f); + i.x1 = ceilf(f.x1 - 0.001f); + i.y1 = ceilf(f.y1 - 0.001f); + return i; +} + +fz_rect +fz_intersect_rect(fz_rect a, fz_rect b) +{ + fz_rect r; + if (fz_is_infinite_rect(a)) return b; + if (fz_is_infinite_rect(b)) return a; + if (fz_is_empty_rect(a)) return fz_empty_rect; + if (fz_is_empty_rect(b)) return fz_empty_rect; + r.x0 = MAX(a.x0, b.x0); + r.y0 = MAX(a.y0, b.y0); + r.x1 = MIN(a.x1, b.x1); + r.y1 = MIN(a.y1, b.y1); + return (r.x1 < r.x0 || r.y1 < r.y0) ? fz_empty_rect : r; +} + +fz_rect +fz_union_rect(fz_rect a, fz_rect b) +{ + fz_rect r; + if (fz_is_infinite_rect(a)) return a; + if (fz_is_infinite_rect(b)) return b; + if (fz_is_empty_rect(a)) return b; + if (fz_is_empty_rect(b)) return a; + r.x0 = MIN(a.x0, b.x0); + r.y0 = MIN(a.y0, b.y0); + r.x1 = MAX(a.x1, b.x1); + r.y1 = MAX(a.y1, b.y1); + return r; +} + +fz_bbox +fz_intersect_bbox(fz_bbox a, fz_bbox b) +{ + fz_bbox r; + if (fz_is_infinite_rect(a)) return b; + if (fz_is_infinite_rect(b)) return a; + if (fz_is_empty_rect(a)) return fz_empty_bbox; + if (fz_is_empty_rect(b)) return fz_empty_bbox; + r.x0 = MAX(a.x0, b.x0); + r.y0 = MAX(a.y0, b.y0); + r.x1 = MIN(a.x1, b.x1); + r.y1 = MIN(a.y1, b.y1); + return (r.x1 < r.x0 || r.y1 < r.y0) ? fz_empty_bbox : r; +} + +fz_bbox +fz_union_bbox(fz_bbox a, fz_bbox b) +{ + fz_bbox r; + if (fz_is_infinite_rect(a)) return a; + if (fz_is_infinite_rect(b)) return b; + if (fz_is_empty_rect(a)) return b; + if (fz_is_empty_rect(b)) return a; + r.x0 = MIN(a.x0, b.x0); + r.y0 = MIN(a.y0, b.y0); + r.x1 = MAX(a.x1, b.x1); + r.y1 = MAX(a.y1, b.y1); + return r; +} + +fz_rect +fz_transform_rect(fz_matrix m, fz_rect r) +{ + fz_point s, t, u, v; + + if (fz_is_infinite_rect(r)) + return r; + + s.x = r.x0; s.y = r.y0; + t.x = r.x0; t.y = r.y1; + u.x = r.x1; u.y = r.y1; + v.x = r.x1; v.y = r.y0; + s = fz_transform_point(m, s); + t = fz_transform_point(m, t); + u = fz_transform_point(m, u); + v = fz_transform_point(m, v); + r.x0 = MIN4(s.x, t.x, u.x, v.x); + r.y0 = MIN4(s.y, t.y, u.y, v.y); + r.x1 = MAX4(s.x, t.x, u.x, v.x); + r.y1 = MAX4(s.y, t.y, u.y, v.y); + return r; +} + +fz_bbox +fz_transform_bbox(fz_matrix m, fz_bbox b) +{ + fz_point s, t, u, v; + + if (fz_is_infinite_bbox(b)) + return b; + + s.x = b.x0; s.y = b.y0; + t.x = b.x0; t.y = b.y1; + u.x = b.x1; u.y = b.y1; + v.x = b.x1; v.y = b.y0; + s = fz_transform_point(m, s); + t = fz_transform_point(m, t); + u = fz_transform_point(m, u); + v = fz_transform_point(m, v); + b.x0 = MIN4(s.x, t.x, u.x, v.x); + b.y0 = MIN4(s.y, t.y, u.y, v.y); + b.x1 = MAX4(s.x, t.x, u.x, v.x); + b.y1 = MAX4(s.y, t.y, u.y, v.y); + return b; + +} diff --git a/contrib/media/updf_newlib/fitz/base_getopt.c b/contrib/media/updf_newlib/fitz/base_getopt.c new file mode 100755 index 000000000..2c198ba1e --- /dev/null +++ b/contrib/media/updf_newlib/fitz/base_getopt.c @@ -0,0 +1,66 @@ +/* + * This is a version of the public domain getopt implementation by + * Henry Spencer originally posted to net.sources. + * + * This file is in the public domain. + */ + +#include +#include + +#define getopt fz_getopt +#define optarg fz_optarg +#define optind fz_optind + +char *optarg; /* Global argument pointer. */ +int optind = 0; /* Global argv index. */ + +static char *scan = NULL; /* Private scan pointer. */ + +int +getopt(int argc, char *argv[], char *optstring) +{ + char c; + char *place; + + optarg = NULL; + + if (scan == NULL || *scan == '\0') { + if (optind == 0) + optind++; + + if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') + return EOF; + if (argv[optind][1] == '-' && argv[optind][2] == '\0') { + optind++; + return EOF; + } + + scan = argv[optind]+1; + optind++; + } + + c = *scan++; + place = strchr(optstring, c); + + if (place == NULL || c == ':') { + fprintf(stderr, "%s: unknown option -%c\n", argv[0], c); + return '?'; + } + + place++; + if (*place == ':') { + if (*scan != '\0') { + optarg = scan; + scan = NULL; + } else if( optind < argc ) { + optarg = argv[optind]; + optind++; + } else { + fprintf(stderr, "%s: option requires argument -%c\n", argv[0], c); + return ':'; + } + } + + return c; +} diff --git a/contrib/media/updf_newlib/fitz/base_hash.c b/contrib/media/updf_newlib/fitz/base_hash.c new file mode 100755 index 000000000..fcfc1f611 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/base_hash.c @@ -0,0 +1,241 @@ +#include "fitz.h" + +/* +Simple hashtable with open adressing linear probe. +Unlike text book examples, removing entries works +correctly in this implementation, so it wont start +exhibiting bad behaviour if entries are inserted +and removed frequently. +*/ + +enum { MAX_KEY_LEN = 48 }; +typedef struct fz_hash_entry_s fz_hash_entry; + +struct fz_hash_entry_s +{ + unsigned char key[MAX_KEY_LEN]; + void *val; +}; + +struct fz_hash_table_s +{ + int keylen; + int size; + int load; + fz_hash_entry *ents; +}; + +static unsigned hash(unsigned char *s, int len) +{ + unsigned val = 0; + int i; + for (i = 0; i < len; i++) + { + val += s[i]; + val += (val << 10); + val ^= (val >> 6); + } + val += (val << 3); + val ^= (val >> 11); + val += (val << 15); + return val; +} + +fz_hash_table * +fz_new_hash_table(int initialsize, int keylen) +{ + fz_hash_table *table; + + assert(keylen <= MAX_KEY_LEN); + + table = fz_malloc(sizeof(fz_hash_table)); + table->keylen = keylen; + table->size = initialsize; + table->load = 0; + table->ents = fz_calloc(table->size, sizeof(fz_hash_entry)); + memset(table->ents, 0, sizeof(fz_hash_entry) * table->size); + + return table; +} + +void +fz_empty_hash(fz_hash_table *table) +{ + table->load = 0; + memset(table->ents, 0, sizeof(fz_hash_entry) * table->size); +} + +int +fz_hash_len(fz_hash_table *table) +{ + return table->size; +} + +void * +fz_hash_get_key(fz_hash_table *table, int idx) +{ + return table->ents[idx].key; +} + +void * +fz_hash_get_val(fz_hash_table *table, int idx) +{ + return table->ents[idx].val; +} + +void +fz_free_hash(fz_hash_table *table) +{ + fz_free(table->ents); + fz_free(table); +} + +static void +fz_resize_hash(fz_hash_table *table, int newsize) +{ + fz_hash_entry *oldents = table->ents; + int oldsize = table->size; + int oldload = table->load; + int i; + + if (newsize < oldload * 8 / 10) + { + fz_throw("assert: resize hash too small"); + return; + } + + table->ents = fz_calloc(newsize, sizeof(fz_hash_entry)); + memset(table->ents, 0, sizeof(fz_hash_entry) * newsize); + table->size = newsize; + table->load = 0; + + for (i = 0; i < oldsize; i++) + { + if (oldents[i].val) + { + fz_hash_insert(table, oldents[i].key, oldents[i].val); + } + } + + fz_free(oldents); +} + +void * +fz_hash_find(fz_hash_table *table, void *key) +{ + fz_hash_entry *ents = table->ents; + unsigned size = table->size; + unsigned pos = hash(key, table->keylen) % size; + + while (1) + { + if (!ents[pos].val) + return NULL; + + if (memcmp(key, ents[pos].key, table->keylen) == 0) + return ents[pos].val; + + pos = (pos + 1) % size; + } +} + +void +fz_hash_insert(fz_hash_table *table, void *key, void *val) +{ + fz_hash_entry *ents; + unsigned size; + unsigned pos; + + if (table->load > table->size * 8 / 10) + { + fz_resize_hash(table, table->size * 2); + } + + ents = table->ents; + size = table->size; + pos = hash(key, table->keylen) % size; + + while (1) + { + if (!ents[pos].val) + { + memcpy(ents[pos].key, key, table->keylen); + ents[pos].val = val; + table->load ++; + return; + } + + if (memcmp(key, ents[pos].key, table->keylen) == 0) + fz_warn("assert: overwrite hash slot"); + + pos = (pos + 1) % size; + } +} + +void +fz_hash_remove(fz_hash_table *table, void *key) +{ + fz_hash_entry *ents = table->ents; + unsigned size = table->size; + unsigned pos = hash(key, table->keylen) % size; + unsigned hole, look, code; + + while (1) + { + if (!ents[pos].val) + { + fz_warn("assert: remove inexistant hash entry"); + return; + } + + if (memcmp(key, ents[pos].key, table->keylen) == 0) + { + ents[pos].val = NULL; + + hole = pos; + look = (hole + 1) % size; + + while (ents[look].val) + { + code = hash(ents[look].key, table->keylen) % size; + if ((code <= hole && hole < look) || + (look < code && code <= hole) || + (hole < look && look < code)) + { + ents[hole] = ents[look]; + ents[look].val = NULL; + hole = look; + } + + look = (look + 1) % size; + } + + table->load --; + + return; + } + + pos = (pos + 1) % size; + } +} + +void +fz_debug_hash(fz_hash_table *table) +{ + int i, k; + + printf("cache load %d / %d\n", table->load, table->size); + + for (i = 0; i < table->size; i++) + { + if (!table->ents[i].val) + printf("table % 4d: empty\n", i); + else + { + printf("table % 4d: key=", i); + for (k = 0; k < MAX_KEY_LEN; k++) + printf("%02x", ((char*)table->ents[i].key)[k]); + printf(" val=$%p\n", table->ents[i].val); + } + } +} diff --git a/contrib/media/updf_newlib/fitz/base_memory.c b/contrib/media/updf_newlib/fitz/base_memory.c new file mode 100755 index 000000000..f1b668ebe --- /dev/null +++ b/contrib/media/updf_newlib/fitz/base_memory.c @@ -0,0 +1,77 @@ +#include "fitz.h" + +void * +fz_malloc(int size) +{ + void *p = malloc(size); + if (!p) + { + fprintf(stderr, "fatal error: out of memory\n"); + abort(); + } + return p; +} + +void * +fz_calloc(int count, int size) +{ + void *p; + + if (count == 0 || size == 0) + return 0; + + if (count < 0 || size < 0 || count > INT_MAX / size) + { + fprintf(stderr, "fatal error: out of memory (integer overflow)\n"); + abort(); + } + + p = malloc(count * size); + if (!p) + { + fprintf(stderr, "fatal error: out of memory\n"); + abort(); + } + return p; +} + +void * +fz_realloc(void *p, int count, int size) +{ + void *np; + + if (count == 0 || size == 0) + { + fz_free(p); + return 0; + } + + if (count < 0 || size < 0 || count > INT_MAX / size) + { + fprintf(stderr, "fatal error: out of memory (integer overflow)\n"); + abort(); + } + + np = realloc(p, count * size); + if (np == NULL) + { + fprintf(stderr, "fatal error: out of memory\n"); + abort(); + } + return np; +} + +void +fz_free(void *p) +{ + free(p); +} + +char * +fz_strdup(char *s) +{ + int len = strlen(s) + 1; + char *ns = fz_malloc(len); + memcpy(ns, s, len); + return ns; +} diff --git a/contrib/media/updf_newlib/fitz/base_object.c b/contrib/media/updf_newlib/fitz/base_object.c new file mode 100755 index 000000000..5c20767a2 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/base_object.c @@ -0,0 +1,802 @@ +#include "fitz.h" + +typedef enum fz_objkind_e +{ + FZ_NULL, + FZ_BOOL, + FZ_INT, + FZ_REAL, + FZ_STRING, + FZ_NAME, + FZ_ARRAY, + FZ_DICT, + FZ_INDIRECT +} fz_objkind; + +struct keyval +{ + fz_obj *k; + fz_obj *v; +}; + +struct fz_obj_s +{ + int refs; + fz_objkind kind; + union + { + int b; + int i; + float f; + struct { + unsigned short len; + char buf[1]; + } s; + char n[1]; + struct { + int len; + int cap; + fz_obj **items; + } a; + struct { + char sorted; + int len; + int cap; + struct keyval *items; + } d; + struct { + int num; + int gen; + struct pdf_xref_s *xref; + } r; + } u; +}; + +static fz_obj *fz_resolve_indirect_null(fz_obj *ref) +{ + return ref; +} + +fz_obj* (*fz_resolve_indirect)(fz_obj*) = fz_resolve_indirect_null; + +fz_obj * +fz_new_null(void) +{ + fz_obj *obj = fz_malloc(sizeof(fz_obj)); + obj->refs = 1; + obj->kind = FZ_NULL; + return obj; +} + +fz_obj * +fz_new_bool(int b) +{ + fz_obj *obj = fz_malloc(sizeof(fz_obj)); + obj->refs = 1; + obj->kind = FZ_BOOL; + obj->u.b = b; + return obj; +} + +fz_obj * +fz_new_int(int i) +{ + fz_obj *obj = fz_malloc(sizeof(fz_obj)); + obj->refs = 1; + obj->kind = FZ_INT; + obj->u.i = i; + return obj; +} + +fz_obj * +fz_new_real(float f) +{ + fz_obj *obj = fz_malloc(sizeof(fz_obj)); + obj->refs = 1; + obj->kind = FZ_REAL; + obj->u.f = f; + return obj; +} + +fz_obj * +fz_new_string(char *str, int len) +{ + fz_obj *obj = fz_malloc(offsetof(fz_obj, u.s.buf) + len + 1); + obj->refs = 1; + obj->kind = FZ_STRING; + obj->u.s.len = len; + memcpy(obj->u.s.buf, str, len); + obj->u.s.buf[len] = '\0'; + return obj; +} + +fz_obj * +fz_new_name(char *str) +{ + fz_obj *obj = fz_malloc(offsetof(fz_obj, u.n) + strlen(str) + 1); + obj->refs = 1; + obj->kind = FZ_NAME; + strcpy(obj->u.n, str); + return obj; +} + +fz_obj * +fz_new_indirect(int num, int gen, void *xref) +{ + fz_obj *obj = fz_malloc(sizeof(fz_obj)); + obj->refs = 1; + obj->kind = FZ_INDIRECT; + obj->u.r.num = num; + obj->u.r.gen = gen; + obj->u.r.xref = xref; + return obj; +} + +fz_obj * +fz_keep_obj(fz_obj *obj) +{ + assert(obj != NULL); + obj->refs ++; + return obj; +} + +int fz_is_indirect(fz_obj *obj) +{ + return obj ? obj->kind == FZ_INDIRECT : 0; +} + +int fz_is_null(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + return obj ? obj->kind == FZ_NULL : 0; +} + +int fz_is_bool(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + return obj ? obj->kind == FZ_BOOL : 0; +} + +int fz_is_int(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + return obj ? obj->kind == FZ_INT : 0; +} + +int fz_is_real(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + return obj ? obj->kind == FZ_REAL : 0; +} + +int fz_is_string(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + return obj ? obj->kind == FZ_STRING : 0; +} + +int fz_is_name(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + return obj ? obj->kind == FZ_NAME : 0; +} + +int fz_is_array(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + return obj ? obj->kind == FZ_ARRAY : 0; +} + +int fz_is_dict(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + return obj ? obj->kind == FZ_DICT : 0; +} + +int fz_to_bool(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + if (fz_is_bool(obj)) + return obj->u.b; + return 0; +} + +int fz_to_int(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + if (fz_is_int(obj)) + return obj->u.i; + if (fz_is_real(obj)) + return obj->u.f; + return 0; +} + +float fz_to_real(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + if (fz_is_real(obj)) + return obj->u.f; + if (fz_is_int(obj)) + return obj->u.i; + return 0; +} + +char *fz_to_name(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + if (fz_is_name(obj)) + return obj->u.n; + return ""; +} + +char *fz_to_str_buf(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + if (fz_is_string(obj)) + return obj->u.s.buf; + return ""; +} + +int fz_to_str_len(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + if (fz_is_string(obj)) + return obj->u.s.len; + return 0; +} + +/* for use by pdf_crypt_obj_imp to decrypt AES string in place */ +void fz_set_str_len(fz_obj *obj, int newlen) +{ + obj = fz_resolve_indirect(obj); + if (fz_is_string(obj)) + if (newlen < obj->u.s.len) + obj->u.s.len = newlen; +} + +int fz_to_num(fz_obj *obj) +{ + if (fz_is_indirect(obj)) + return obj->u.r.num; + return 0; +} + +int fz_to_gen(fz_obj *obj) +{ + if (fz_is_indirect(obj)) + return obj->u.r.gen; + return 0; +} + +void *fz_get_indirect_xref(fz_obj *obj) +{ + if (fz_is_indirect(obj)) + return obj->u.r.xref; + return NULL; +} + +int +fz_objcmp(fz_obj *a, fz_obj *b) +{ + int i; + + if (a == b) + return 0; + + if (!a || !b) + return 1; + + if (a->kind != b->kind) + return 1; + + switch (a->kind) + { + case FZ_NULL: + return 0; + + case FZ_BOOL: + return a->u.b - b->u.b; + + case FZ_INT: + return a->u.i - b->u.i; + + case FZ_REAL: + if (a->u.f < b->u.f) + return -1; + if (a->u.f > b->u.f) + return 1; + return 0; + + case FZ_STRING: + if (a->u.s.len < b->u.s.len) + { + if (memcmp(a->u.s.buf, b->u.s.buf, a->u.s.len) <= 0) + return -1; + return 1; + } + if (a->u.s.len > b->u.s.len) + { + if (memcmp(a->u.s.buf, b->u.s.buf, b->u.s.len) >= 0) + return 1; + return -1; + } + return memcmp(a->u.s.buf, b->u.s.buf, a->u.s.len); + + case FZ_NAME: + return strcmp(a->u.n, b->u.n); + + case FZ_INDIRECT: + if (a->u.r.num == b->u.r.num) + return a->u.r.gen - b->u.r.gen; + return a->u.r.num - b->u.r.num; + + case FZ_ARRAY: + if (a->u.a.len != b->u.a.len) + return a->u.a.len - b->u.a.len; + for (i = 0; i < a->u.a.len; i++) + if (fz_objcmp(a->u.a.items[i], b->u.a.items[i])) + return 1; + return 0; + + case FZ_DICT: + if (a->u.d.len != b->u.d.len) + return a->u.d.len - b->u.d.len; + for (i = 0; i < a->u.d.len; i++) + { + if (fz_objcmp(a->u.d.items[i].k, b->u.d.items[i].k)) + return 1; + if (fz_objcmp(a->u.d.items[i].v, b->u.d.items[i].v)) + return 1; + } + return 0; + + } + return 1; +} + +static char * +fz_objkindstr(fz_obj *obj) +{ + if (obj == NULL) + return ""; + switch (obj->kind) + { + case FZ_NULL: return "null"; + case FZ_BOOL: return "boolean"; + case FZ_INT: return "integer"; + case FZ_REAL: return "real"; + case FZ_STRING: return "string"; + case FZ_NAME: return "name"; + case FZ_ARRAY: return "array"; + case FZ_DICT: return "dictionary"; + case FZ_INDIRECT: return "reference"; + } + return ""; +} + +fz_obj * +fz_new_array(int initialcap) +{ + fz_obj *obj; + int i; + + obj = fz_malloc(sizeof(fz_obj)); + obj->refs = 1; + obj->kind = FZ_ARRAY; + + obj->u.a.len = 0; + obj->u.a.cap = initialcap > 1 ? initialcap : 6; + + obj->u.a.items = fz_calloc(obj->u.a.cap, sizeof(fz_obj*)); + for (i = 0; i < obj->u.a.cap; i++) + obj->u.a.items[i] = NULL; + + return obj; +} + +fz_obj * +fz_copy_array(fz_obj *obj) +{ + fz_obj *new; + int i; + + if (fz_is_indirect(obj) || !fz_is_array(obj)) + fz_warn("assert: not an array (%s)", fz_objkindstr(obj)); + + new = fz_new_array(fz_array_len(obj)); + for (i = 0; i < fz_array_len(obj); i++) + fz_array_push(new, fz_array_get(obj, i)); + + return new; +} + +int +fz_array_len(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + if (!fz_is_array(obj)) + return 0; + return obj->u.a.len; +} + +fz_obj * +fz_array_get(fz_obj *obj, int i) +{ + obj = fz_resolve_indirect(obj); + + if (!fz_is_array(obj)) + return NULL; + + if (i < 0 || i >= obj->u.a.len) + return NULL; + + return obj->u.a.items[i]; +} + +void +fz_array_put(fz_obj *obj, int i, fz_obj *item) +{ + obj = fz_resolve_indirect(obj); + + if (!fz_is_array(obj)) + fz_warn("assert: not an array (%s)", fz_objkindstr(obj)); + else if (i < 0) + fz_warn("assert: index %d < 0", i); + else if (i >= obj->u.a.len) + fz_warn("assert: index %d > length %d", i, obj->u.a.len); + else + { + if (obj->u.a.items[i]) + fz_drop_obj(obj->u.a.items[i]); + obj->u.a.items[i] = fz_keep_obj(item); + } +} + +void +fz_array_push(fz_obj *obj, fz_obj *item) +{ + obj = fz_resolve_indirect(obj); + + if (!fz_is_array(obj)) + fz_warn("assert: not an array (%s)", fz_objkindstr(obj)); + else + { + if (obj->u.a.len + 1 > obj->u.a.cap) + { + int i; + obj->u.a.cap = (obj->u.a.cap * 3) / 2; + obj->u.a.items = fz_realloc(obj->u.a.items, obj->u.a.cap, sizeof(fz_obj*)); + for (i = obj->u.a.len ; i < obj->u.a.cap; i++) + obj->u.a.items[i] = NULL; + } + obj->u.a.items[obj->u.a.len] = fz_keep_obj(item); + obj->u.a.len++; + } +} + +void +fz_array_insert(fz_obj *obj, fz_obj *item) +{ + obj = fz_resolve_indirect(obj); + + if (!fz_is_array(obj)) + fz_warn("assert: not an array (%s)", fz_objkindstr(obj)); + else + { + if (obj->u.a.len + 1 > obj->u.a.cap) + { + int i; + obj->u.a.cap = (obj->u.a.cap * 3) / 2; + obj->u.a.items = fz_realloc(obj->u.a.items, obj->u.a.cap, sizeof(fz_obj*)); + for (i = obj->u.a.len ; i < obj->u.a.cap; i++) + obj->u.a.items[i] = NULL; + } + memmove(obj->u.a.items + 1, obj->u.a.items, obj->u.a.len * sizeof(fz_obj*)); + obj->u.a.items[0] = fz_keep_obj(item); + obj->u.a.len++; + } +} + +/* dicts may only have names as keys! */ + +static int keyvalcmp(const void *ap, const void *bp) +{ + const struct keyval *a = ap; + const struct keyval *b = bp; + return strcmp(fz_to_name(a->k), fz_to_name(b->k)); +} + +fz_obj * +fz_new_dict(int initialcap) +{ + fz_obj *obj; + int i; + + obj = fz_malloc(sizeof(fz_obj)); + obj->refs = 1; + obj->kind = FZ_DICT; + + obj->u.d.sorted = 1; + obj->u.d.len = 0; + obj->u.d.cap = initialcap > 1 ? initialcap : 10; + + obj->u.d.items = fz_calloc(obj->u.d.cap, sizeof(struct keyval)); + for (i = 0; i < obj->u.d.cap; i++) + { + obj->u.d.items[i].k = NULL; + obj->u.d.items[i].v = NULL; + } + + return obj; +} + +fz_obj * +fz_copy_dict(fz_obj *obj) +{ + fz_obj *new; + int i; + + if (fz_is_indirect(obj) || !fz_is_dict(obj)) + fz_throw("assert: not a dict (%s)", fz_objkindstr(obj)); + + new = fz_new_dict(fz_dict_len(obj)); + for (i = 0; i < fz_dict_len(obj); i++) + fz_dict_put(new, fz_dict_get_key(obj, i), fz_dict_get_val(obj, i)); + + return new; +} + +int +fz_dict_len(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + if (!fz_is_dict(obj)) + return 0; + return obj->u.d.len; +} + +fz_obj * +fz_dict_get_key(fz_obj *obj, int i) +{ + obj = fz_resolve_indirect(obj); + + if (!fz_is_dict(obj)) + return NULL; + + if (i < 0 || i >= obj->u.d.len) + return NULL; + + return obj->u.d.items[i].k; +} + +fz_obj * +fz_dict_get_val(fz_obj *obj, int i) +{ + obj = fz_resolve_indirect(obj); + + if (!fz_is_dict(obj)) + return NULL; + + if (i < 0 || i >= obj->u.d.len) + return NULL; + + return obj->u.d.items[i].v; +} + +static int +fz_dict_finds(fz_obj *obj, char *key) +{ + if (obj->u.d.sorted) + { + int l = 0; + int r = obj->u.d.len - 1; + while (l <= r) + { + int m = (l + r) >> 1; + int c = -strcmp(fz_to_name(obj->u.d.items[m].k), key); + if (c < 0) + r = m - 1; + else if (c > 0) + l = m + 1; + else + return m; + } + } + + else + { + int i; + for (i = 0; i < obj->u.d.len; i++) + if (strcmp(fz_to_name(obj->u.d.items[i].k), key) == 0) + return i; + } + + return -1; +} + +fz_obj * +fz_dict_gets(fz_obj *obj, char *key) +{ + int i; + + obj = fz_resolve_indirect(obj); + + if (!fz_is_dict(obj)) + return NULL; + + i = fz_dict_finds(obj, key); + if (i >= 0) + return obj->u.d.items[i].v; + + return NULL; +} + +fz_obj * +fz_dict_get(fz_obj *obj, fz_obj *key) +{ + if (fz_is_name(key)) + return fz_dict_gets(obj, fz_to_name(key)); + return NULL; +} + +fz_obj * +fz_dict_getsa(fz_obj *obj, char *key, char *abbrev) +{ + fz_obj *v; + v = fz_dict_gets(obj, key); + if (v) + return v; + return fz_dict_gets(obj, abbrev); +} + +void +fz_dict_put(fz_obj *obj, fz_obj *key, fz_obj *val) +{ + char *s; + int i; + + obj = fz_resolve_indirect(obj); + + if (!fz_is_dict(obj)) + { + fz_warn("assert: not a dict (%s)", fz_objkindstr(obj)); + return; + } + + if (fz_is_name(key)) + s = fz_to_name(key); + else + { + fz_warn("assert: key is not a name (%s)", fz_objkindstr(obj)); + return; + } + + if (!val) + { + fz_warn("assert: val does not exist for key (%s)", s); + return; + } + + i = fz_dict_finds(obj, s); + if (i >= 0) + { + fz_drop_obj(obj->u.d.items[i].v); + obj->u.d.items[i].v = fz_keep_obj(val); + return; + } + + if (obj->u.d.len + 1 > obj->u.d.cap) + { + obj->u.d.cap = (obj->u.d.cap * 3) / 2; + obj->u.d.items = fz_realloc(obj->u.d.items, obj->u.d.cap, sizeof(struct keyval)); + for (i = obj->u.d.len; i < obj->u.d.cap; i++) + { + obj->u.d.items[i].k = NULL; + obj->u.d.items[i].v = NULL; + } + } + + /* borked! */ + if (obj->u.d.len) + if (strcmp(fz_to_name(obj->u.d.items[obj->u.d.len - 1].k), s) > 0) + obj->u.d.sorted = 0; + + obj->u.d.items[obj->u.d.len].k = fz_keep_obj(key); + obj->u.d.items[obj->u.d.len].v = fz_keep_obj(val); + obj->u.d.len ++; +} + +void +fz_dict_puts(fz_obj *obj, char *key, fz_obj *val) +{ + fz_obj *keyobj = fz_new_name(key); + fz_dict_put(obj, keyobj, val); + fz_drop_obj(keyobj); +} + +void +fz_dict_dels(fz_obj *obj, char *key) +{ + obj = fz_resolve_indirect(obj); + + if (!fz_is_dict(obj)) + fz_warn("assert: not a dict (%s)", fz_objkindstr(obj)); + else + { + int i = fz_dict_finds(obj, key); + if (i >= 0) + { + fz_drop_obj(obj->u.d.items[i].k); + fz_drop_obj(obj->u.d.items[i].v); + obj->u.d.sorted = 0; + obj->u.d.items[i] = obj->u.d.items[obj->u.d.len-1]; + obj->u.d.len --; + } + } +} + +void +fz_dict_del(fz_obj *obj, fz_obj *key) +{ + if (fz_is_name(key)) + fz_dict_dels(obj, fz_to_name(key)); + else + fz_warn("assert: key is not a name (%s)", fz_objkindstr(obj)); +} + +void +fz_sort_dict(fz_obj *obj) +{ + obj = fz_resolve_indirect(obj); + if (!fz_is_dict(obj)) + return; + if (!obj->u.d.sorted) + { + qsort(obj->u.d.items, obj->u.d.len, sizeof(struct keyval), keyvalcmp); + obj->u.d.sorted = 1; + } +} + +static void +fz_free_array(fz_obj *obj) +{ + int i; + + for (i = 0; i < obj->u.a.len; i++) + if (obj->u.a.items[i]) + fz_drop_obj(obj->u.a.items[i]); + + fz_free(obj->u.a.items); + fz_free(obj); +} + +static void +fz_free_dict(fz_obj *obj) +{ + int i; + + for (i = 0; i < obj->u.d.len; i++) { + if (obj->u.d.items[i].k) + fz_drop_obj(obj->u.d.items[i].k); + if (obj->u.d.items[i].v) + fz_drop_obj(obj->u.d.items[i].v); + } + + fz_free(obj->u.d.items); + fz_free(obj); +} + +void +fz_drop_obj(fz_obj *obj) +{ + assert(obj != NULL); + if (--obj->refs == 0) + { + if (obj->kind == FZ_ARRAY) + fz_free_array(obj); + else if (obj->kind == FZ_DICT) + fz_free_dict(obj); + else + fz_free(obj); + } +} diff --git a/contrib/media/updf_newlib/fitz/base_string.c b/contrib/media/updf_newlib/fitz/base_string.c new file mode 100755 index 000000000..76748e20f --- /dev/null +++ b/contrib/media/updf_newlib/fitz/base_string.c @@ -0,0 +1,265 @@ +#include "fitz.h" + +int +fz_is_big_endian(void) +{ + static const int one = 1; + return *(char*)&one == 0; +} + +char * +fz_strsep(char **stringp, const char *delim) +{ + char *ret = *stringp; + if (ret == NULL) return NULL; + if ((*stringp = strpbrk(*stringp, delim)) != NULL) + *((*stringp)++) = '\0'; + return ret; +} + +int +fz_strlcpy(char *dst, const char *src, int siz) +{ + register char *d = dst; + register const char *s = src; + register int n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) { + do { + if ((*d++ = *s++) == 0) + break; + } while (--n != 0); + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} + +int +fz_strlcat(char *dst, const char *src, int siz) +{ + register char *d = dst; + register const char *s = src; + register int n = siz; + int dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (*d != '\0' && n-- != 0) + d++; + dlen = d - dst; + n = siz - dlen; + + if (n == 0) + return dlen + strlen(s); + while (*s != '\0') { + if (n != 1) { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; + + return dlen + (s - src); /* count does not include NUL */ +} + +enum +{ + UTFmax = 4, /* maximum bytes per rune */ + Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ + Runeself = 0x80, /* rune and UTF sequences are the same (<) */ + Runeerror = 0xFFFD, /* decoding error in UTF */ + Runemax = 0x10FFFF, /* maximum rune value */ +}; + +enum +{ + Bit1 = 7, + Bitx = 6, + Bit2 = 5, + Bit3 = 4, + Bit4 = 3, + Bit5 = 2, + + T1 = ((1<<(Bit1+1))-1) ^ 0xFF, /* 0000 0000 */ + Tx = ((1<<(Bitx+1))-1) ^ 0xFF, /* 1000 0000 */ + T2 = ((1<<(Bit2+1))-1) ^ 0xFF, /* 1100 0000 */ + T3 = ((1<<(Bit3+1))-1) ^ 0xFF, /* 1110 0000 */ + T4 = ((1<<(Bit4+1))-1) ^ 0xFF, /* 1111 0000 */ + T5 = ((1<<(Bit5+1))-1) ^ 0xFF, /* 1111 1000 */ + + Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0111 1111 */ + Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0111 1111 1111 */ + Rune3 = (1<<(Bit3+2*Bitx))-1, /* 1111 1111 1111 1111 */ + Rune4 = (1<<(Bit4+3*Bitx))-1, /* 0001 1111 1111 1111 1111 1111 */ + + Maskx = (1< T1 + */ + c = *(unsigned char*)str; + if(c < Tx) { + *rune = c; + return 1; + } + + /* + * two character sequence + * 0080-07FF => T2 Tx + */ + c1 = *(unsigned char*)(str+1) ^ Tx; + if(c1 & Testx) + goto bad; + if(c < T3) { + if(c < T2) + goto bad; + l = ((c << Bitx) | c1) & Rune2; + if(l <= Rune1) + goto bad; + *rune = l; + return 2; + } + + /* + * three character sequence + * 0800-FFFF => T3 Tx Tx + */ + c2 = *(unsigned char*)(str+2) ^ Tx; + if(c2 & Testx) + goto bad; + if(c < T4) { + l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3; + if(l <= Rune2) + goto bad; + *rune = l; + return 3; + } + + /* + * four character sequence (21-bit value) + * 10000-1FFFFF => T4 Tx Tx Tx + */ + c3 = *(unsigned char*)(str+3) ^ Tx; + if (c3 & Testx) + goto bad; + if (c < T5) { + l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c3) & Rune4; + if (l <= Rune3) + goto bad; + *rune = l; + return 4; + } + /* + * Support for 5-byte or longer UTF-8 would go here, but + * since we don't have that, we'll just fall through to bad. + */ + + /* + * bad decoding + */ +bad: + *rune = Bad; + return 1; +} + +int +runetochar(char *str, int *rune) +{ + /* Runes are signed, so convert to unsigned for range check. */ + unsigned long c; + + /* + * one character sequence + * 00000-0007F => 00-7F + */ + c = *rune; + if(c <= Rune1) { + str[0] = c; + return 1; + } + + /* + * two character sequence + * 0080-07FF => T2 Tx + */ + if(c <= Rune2) { + str[0] = T2 | (c >> 1*Bitx); + str[1] = Tx | (c & Maskx); + return 2; + } + + /* + * If the Rune is out of range, convert it to the error rune. + * Do this test here because the error rune encodes to three bytes. + * Doing it earlier would duplicate work, since an out of range + * Rune wouldn't have fit in one or two bytes. + */ + if (c > Runemax) + c = Runeerror; + + /* + * three character sequence + * 0800-FFFF => T3 Tx Tx + */ + if (c <= Rune3) { + str[0] = T3 | (c >> 2*Bitx); + str[1] = Tx | ((c >> 1*Bitx) & Maskx); + str[2] = Tx | (c & Maskx); + return 3; + } + + /* + * four character sequence (21-bit value) + * 10000-1FFFFF => T4 Tx Tx Tx + */ + str[0] = T4 | (c >> 3*Bitx); + str[1] = Tx | ((c >> 2*Bitx) & Maskx); + str[2] = Tx | ((c >> 1*Bitx) & Maskx); + str[3] = Tx | (c & Maskx); + return 4; +} + +int +runelen(int c) +{ + char str[10]; + return runetochar(str, &c); +} + +float fz_atof(const char *s) +{ + double d; + + /* The errno voodoo here checks for us reading numbers that are too + * big to fit into a double. The checks for FLT_MAX ensure that we + * don't read a number that's OK as a double and then become invalid + * as we convert to a float. */ + errno = 0; + d = strtod(s, NULL); + if (errno == ERANGE || d > FLT_MAX || d < -FLT_MAX) { + /* Return 1.0, as it's a small known value that won't cause a + * divide by 0. */ + return 1.0; + } + return (float)d; +} diff --git a/contrib/media/updf_newlib/fitz/base_time.c b/contrib/media/updf_newlib/fitz/base_time.c new file mode 100755 index 000000000..a369099ca --- /dev/null +++ b/contrib/media/updf_newlib/fitz/base_time.c @@ -0,0 +1,42 @@ +#ifdef _WIN32 + +#include +#include +#include + +#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) +#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 +#else +#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL +#endif + +struct timeval; + +int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + FILETIME ft; + unsigned __int64 tmpres = 0; + + if (tv) + { + GetSystemTimeAsFileTime(&ft); + + tmpres |= ft.dwHighDateTime; + tmpres <<= 32; + tmpres |= ft.dwLowDateTime; + + tmpres /= 10; /*convert into microseconds*/ + /*converting file time to unix epoch*/ + tmpres -= DELTA_EPOCH_IN_MICROSECS; + tv->tv_sec = (long)(tmpres / 1000000UL); + tv->tv_usec = (long)(tmpres % 1000000UL); + } + + return 0; +} + +#else + +void fz_gettimeofday_dummy() { } + +#endif diff --git a/contrib/media/updf_newlib/fitz/crypt_aes.c b/contrib/media/updf_newlib/fitz/crypt_aes.c new file mode 100755 index 000000000..afdff0fe6 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/crypt_aes.c @@ -0,0 +1,565 @@ +/* + * FIPS-197 compliant AES implementation + * + * Copyright (C) 2006-2007 Christophe Devine + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code _must_ retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form may or may not reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of XySSL nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * The AES block cipher was designed by Vincent Rijmen and Joan Daemen. + * + * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf + * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf + */ + +#include "fitz.h" + +#define aes_context fz_aes + +/* AES block cipher implementation from XYSSL */ + +/* + * 32-bit integer manipulation macros (little endian) + */ +#ifndef GET_ULONG_LE +#define GET_ULONG_LE(n,b,i) \ +{ \ + (n) = ( (unsigned long) (b)[(i)] ) \ + | ( (unsigned long) (b)[(i) + 1] << 8 ) \ + | ( (unsigned long) (b)[(i) + 2] << 16 ) \ + | ( (unsigned long) (b)[(i) + 3] << 24 ); \ +} +#endif + +#ifndef PUT_ULONG_LE +#define PUT_ULONG_LE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \ +} +#endif + +/* + * Forward S-box & tables + */ +static unsigned char FSb[256]; +static unsigned long FT0[256]; +static unsigned long FT1[256]; +static unsigned long FT2[256]; +static unsigned long FT3[256]; + +/* + * Reverse S-box & tables + */ +static unsigned char RSb[256]; +static unsigned long RT0[256]; +static unsigned long RT1[256]; +static unsigned long RT2[256]; +static unsigned long RT3[256]; + +/* + * Round constants + */ +static unsigned long RCON[10]; + +/* + * Tables generation code + */ +#define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 ) +#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) ) +#define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 ) + +static int aes_init_done = 0; + +static void aes_gen_tables( void ) +{ + int i, x, y, z; + int pow[256]; + int log[256]; + + /* + * compute pow and log tables over GF(2^8) + */ + for( i = 0, x = 1; i < 256; i++ ) + { + pow[i] = x; + log[x] = i; + x = ( x ^ XTIME( x ) ) & 0xFF; + } + + /* + * calculate the round constants + */ + for( i = 0, x = 1; i < 10; i++ ) + { + RCON[i] = (unsigned long) x; + x = XTIME( x ) & 0xFF; + } + + /* + * generate the forward and reverse S-boxes + */ + FSb[0x00] = 0x63; + RSb[0x63] = 0x00; + + for( i = 1; i < 256; i++ ) + { + x = pow[255 - log[i]]; + + y = x; y = ( (y << 1) | (y >> 7) ) & 0xFF; + x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF; + x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF; + x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF; + x ^= y ^ 0x63; + + FSb[i] = (unsigned char) x; + RSb[x] = (unsigned char) i; + } + + /* + * generate the forward and reverse tables + */ + for( i = 0; i < 256; i++ ) + { + x = FSb[i]; + y = XTIME( x ) & 0xFF; + z = ( y ^ x ) & 0xFF; + + FT0[i] = ( (unsigned long) y ) ^ + ( (unsigned long) x << 8 ) ^ + ( (unsigned long) x << 16 ) ^ + ( (unsigned long) z << 24 ); + + FT1[i] = ROTL8( FT0[i] ); + FT2[i] = ROTL8( FT1[i] ); + FT3[i] = ROTL8( FT2[i] ); + + x = RSb[i]; + + RT0[i] = ( (unsigned long) MUL( 0x0E, x ) ) ^ + ( (unsigned long) MUL( 0x09, x ) << 8 ) ^ + ( (unsigned long) MUL( 0x0D, x ) << 16 ) ^ + ( (unsigned long) MUL( 0x0B, x ) << 24 ); + + RT1[i] = ROTL8( RT0[i] ); + RT2[i] = ROTL8( RT1[i] ); + RT3[i] = ROTL8( RT2[i] ); + } +} + +/* + * AES key schedule (encryption) + */ +void aes_setkey_enc( aes_context *ctx, const unsigned char *key, int keysize ) +{ + int i; + unsigned long *RK; + +#if !defined(XYSSL_AES_ROM_TABLES) + if( aes_init_done == 0 ) + { + aes_gen_tables(); + aes_init_done = 1; + } +#endif + + switch( keysize ) + { + case 128: ctx->nr = 10; break; + case 192: ctx->nr = 12; break; + case 256: ctx->nr = 14; break; + default : return; + } + +#if defined(PADLOCK_ALIGN16) + ctx->rk = RK = PADLOCK_ALIGN16( ctx->buf ); +#else + ctx->rk = RK = ctx->buf; +#endif + + for( i = 0; i < (keysize >> 5); i++ ) + { + GET_ULONG_LE( RK[i], key, i << 2 ); + } + + switch( ctx->nr ) + { + case 10: + + for( i = 0; i < 10; i++, RK += 4 ) + { + RK[4] = RK[0] ^ RCON[i] ^ + ( FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^ + ( FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^ + ( FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^ + ( FSb[ ( RK[3] ) & 0xFF ] << 24 ); + + RK[5] = RK[1] ^ RK[4]; + RK[6] = RK[2] ^ RK[5]; + RK[7] = RK[3] ^ RK[6]; + } + break; + + case 12: + + for( i = 0; i < 8; i++, RK += 6 ) + { + RK[6] = RK[0] ^ RCON[i] ^ + ( FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^ + ( FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^ + ( FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^ + ( FSb[ ( RK[5] ) & 0xFF ] << 24 ); + + RK[7] = RK[1] ^ RK[6]; + RK[8] = RK[2] ^ RK[7]; + RK[9] = RK[3] ^ RK[8]; + RK[10] = RK[4] ^ RK[9]; + RK[11] = RK[5] ^ RK[10]; + } + break; + + case 14: + + for( i = 0; i < 7; i++, RK += 8 ) + { + RK[8] = RK[0] ^ RCON[i] ^ + ( FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^ + ( FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^ + ( FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^ + ( FSb[ ( RK[7] ) & 0xFF ] << 24 ); + + RK[9] = RK[1] ^ RK[8]; + RK[10] = RK[2] ^ RK[9]; + RK[11] = RK[3] ^ RK[10]; + + RK[12] = RK[4] ^ + ( FSb[ ( RK[11] ) & 0xFF ] ) ^ + ( FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^ + ( FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^ + ( FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 ); + + RK[13] = RK[5] ^ RK[12]; + RK[14] = RK[6] ^ RK[13]; + RK[15] = RK[7] ^ RK[14]; + } + break; + + default: + + break; + } +} + +/* + * AES key schedule (decryption) + */ +void aes_setkey_dec( aes_context *ctx, const unsigned char *key, int keysize ) +{ + int i, j; + aes_context cty; + unsigned long *RK; + unsigned long *SK; + + switch( keysize ) + { + case 128: ctx->nr = 10; break; + case 192: ctx->nr = 12; break; + case 256: ctx->nr = 14; break; + default : return; + } + +#if defined(PADLOCK_ALIGN16) + ctx->rk = RK = PADLOCK_ALIGN16( ctx->buf ); +#else + ctx->rk = RK = ctx->buf; +#endif + + aes_setkey_enc( &cty, key, keysize ); + SK = cty.rk + cty.nr * 4; + + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + + for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 ) + { + for( j = 0; j < 4; j++, SK++ ) + { + *RK++ = RT0[ FSb[ ( *SK ) & 0xFF ] ] ^ + RT1[ FSb[ ( *SK >> 8 ) & 0xFF ] ] ^ + RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^ + RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ]; + } + } + + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + + memset( &cty, 0, sizeof( aes_context ) ); +} + +#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ +{ \ + X0 = *RK++ ^ FT0[ ( Y0 ) & 0xFF ] ^ \ + FT1[ ( Y1 >> 8 ) & 0xFF ] ^ \ + FT2[ ( Y2 >> 16 ) & 0xFF ] ^ \ + FT3[ ( Y3 >> 24 ) & 0xFF ]; \ + \ + X1 = *RK++ ^ FT0[ ( Y1 ) & 0xFF ] ^ \ + FT1[ ( Y2 >> 8 ) & 0xFF ] ^ \ + FT2[ ( Y3 >> 16 ) & 0xFF ] ^ \ + FT3[ ( Y0 >> 24 ) & 0xFF ]; \ + \ + X2 = *RK++ ^ FT0[ ( Y2 ) & 0xFF ] ^ \ + FT1[ ( Y3 >> 8 ) & 0xFF ] ^ \ + FT2[ ( Y0 >> 16 ) & 0xFF ] ^ \ + FT3[ ( Y1 >> 24 ) & 0xFF ]; \ + \ + X3 = *RK++ ^ FT0[ ( Y3 ) & 0xFF ] ^ \ + FT1[ ( Y0 >> 8 ) & 0xFF ] ^ \ + FT2[ ( Y1 >> 16 ) & 0xFF ] ^ \ + FT3[ ( Y2 >> 24 ) & 0xFF ]; \ +} + +#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ +{ \ + X0 = *RK++ ^ RT0[ ( Y0 ) & 0xFF ] ^ \ + RT1[ ( Y3 >> 8 ) & 0xFF ] ^ \ + RT2[ ( Y2 >> 16 ) & 0xFF ] ^ \ + RT3[ ( Y1 >> 24 ) & 0xFF ]; \ + \ + X1 = *RK++ ^ RT0[ ( Y1 ) & 0xFF ] ^ \ + RT1[ ( Y0 >> 8 ) & 0xFF ] ^ \ + RT2[ ( Y3 >> 16 ) & 0xFF ] ^ \ + RT3[ ( Y2 >> 24 ) & 0xFF ]; \ + \ + X2 = *RK++ ^ RT0[ ( Y2 ) & 0xFF ] ^ \ + RT1[ ( Y1 >> 8 ) & 0xFF ] ^ \ + RT2[ ( Y0 >> 16 ) & 0xFF ] ^ \ + RT3[ ( Y3 >> 24 ) & 0xFF ]; \ + \ + X3 = *RK++ ^ RT0[ ( Y3 ) & 0xFF ] ^ \ + RT1[ ( Y2 >> 8 ) & 0xFF ] ^ \ + RT2[ ( Y1 >> 16 ) & 0xFF ] ^ \ + RT3[ ( Y0 >> 24 ) & 0xFF ]; \ +} + +/* + * AES-ECB block encryption/decryption + */ +void aes_crypt_ecb( aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16] ) +{ + int i; + unsigned long *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; + +#if defined(XYSSL_PADLOCK_C) && defined(XYSSL_HAVE_X86) + if( padlock_supports( PADLOCK_ACE ) ) + { + if( padlock_xcryptecb( ctx, mode, input, output ) == 0 ) + return; + } +#endif + + RK = ctx->rk; + + GET_ULONG_LE( X0, input, 0 ); X0 ^= *RK++; + GET_ULONG_LE( X1, input, 4 ); X1 ^= *RK++; + GET_ULONG_LE( X2, input, 8 ); X2 ^= *RK++; + GET_ULONG_LE( X3, input, 12 ); X3 ^= *RK++; + + if( mode == AES_DECRYPT ) + { + for( i = (ctx->nr >> 1) - 1; i > 0; i-- ) + { + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); + AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); + } + + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); + + X0 = *RK++ ^ ( RSb[ ( Y0 ) & 0xFF ] ) ^ + ( RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ + ( RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ + ( RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); + + X1 = *RK++ ^ ( RSb[ ( Y1 ) & 0xFF ] ) ^ + ( RSb[ ( Y0 >>8 ) & 0xFF ] << 8 ) ^ + ( RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ + ( RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); + + X2 = *RK++ ^ ( RSb[ ( Y2 ) & 0xFF ] ) ^ + ( RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ + ( RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ + ( RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); + + X3 = *RK++ ^ ( RSb[ ( Y3 ) & 0xFF ] ) ^ + ( RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ + ( RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ + ( RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); + } + else /* AES_ENCRYPT */ + { + for( i = (ctx->nr >> 1) - 1; i > 0; i-- ) + { + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); + AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); + } + + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); + + X0 = *RK++ ^ ( FSb[ ( Y0 ) & 0xFF ] ) ^ + ( FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ + ( FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ + ( FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); + + X1 = *RK++ ^ ( FSb[ ( Y1 ) & 0xFF ] ) ^ + ( FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ + ( FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ + ( FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); + + X2 = *RK++ ^ ( FSb[ ( Y2 ) & 0xFF ] ) ^ + ( FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ + ( FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ + ( FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); + + X3 = *RK++ ^ ( FSb[ ( Y3 ) & 0xFF ] ) ^ + ( FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ + ( FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ + ( FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); + } + + PUT_ULONG_LE( X0, output, 0 ); + PUT_ULONG_LE( X1, output, 4 ); + PUT_ULONG_LE( X2, output, 8 ); + PUT_ULONG_LE( X3, output, 12 ); +} + +/* + * AES-CBC buffer encryption/decryption + */ +void aes_crypt_cbc( aes_context *ctx, + int mode, + int length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ) +{ + int i; + unsigned char temp[16]; + +#if defined(XYSSL_PADLOCK_C) && defined(XYSSL_HAVE_X86) + if( padlock_supports( PADLOCK_ACE ) ) + { + if( padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 ) + return; + } +#endif + + if( mode == AES_DECRYPT ) + { + while( length > 0 ) + { + memcpy( temp, input, 16 ); + aes_crypt_ecb( ctx, mode, input, output ); + + for( i = 0; i < 16; i++ ) + output[i] = (unsigned char)( output[i] ^ iv[i] ); + + memcpy( iv, temp, 16 ); + + input += 16; + output += 16; + length -= 16; + } + } + else + { + while( length > 0 ) + { + for( i = 0; i < 16; i++ ) + output[i] = (unsigned char)( input[i] ^ iv[i] ); + + aes_crypt_ecb( ctx, mode, output, output ); + memcpy( iv, output, 16 ); + + input += 16; + output += 16; + length -= 16; + } + } +} + +/* + * AES-CFB buffer encryption/decryption + */ +void aes_crypt_cfb( aes_context *ctx, + int mode, + int length, + int *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ) +{ + int c, n = *iv_off; + + if( mode == AES_DECRYPT ) + { + while( length-- ) + { + if( n == 0 ) + aes_crypt_ecb( ctx, AES_ENCRYPT, iv, iv ); + + c = *input++; + *output++ = (unsigned char)( c ^ iv[n] ); + iv[n] = (unsigned char) c; + + n = (n + 1) & 0x0F; + } + } + else + { + while( length-- ) + { + if( n == 0 ) + aes_crypt_ecb( ctx, AES_ENCRYPT, iv, iv ); + + iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); + + n = (n + 1) & 0x0F; + } + } + + *iv_off = n; +} diff --git a/contrib/media/updf_newlib/fitz/crypt_arc4.c b/contrib/media/updf_newlib/fitz/crypt_arc4.c new file mode 100755 index 000000000..72871386a --- /dev/null +++ b/contrib/media/updf_newlib/fitz/crypt_arc4.c @@ -0,0 +1,98 @@ +/* This code illustrates a sample implementation + * of the Arcfour algorithm + * Copyright (c) April 29, 1997 Kalle Kaukonen. + * All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that this copyright + * notice and disclaimer are retained. + * + * THIS SOFTWARE IS PROVIDED BY KALLE KAUKONEN AND CONTRIBUTORS ``AS + * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALLE + * KAUKONEN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "fitz.h" + +void +fz_arc4_init(fz_arc4 *arc4, const unsigned char *key, const unsigned keylen) +{ + unsigned int t, u; + unsigned int keyindex; + unsigned int stateindex; + unsigned char *state; + unsigned int counter; + + state = arc4->state; + + arc4->x = 0; + arc4->y = 0; + + for (counter = 0; counter < 256; counter++) + { + state[counter] = counter; + } + + keyindex = 0; + stateindex = 0; + + for (counter = 0; counter < 256; counter++) + { + t = state[counter]; + stateindex = (stateindex + key[keyindex] + t) & 0xff; + u = state[stateindex]; + + state[stateindex] = t; + state[counter] = u; + + if (++keyindex >= keylen) + { + keyindex = 0; + } + } +} + +static unsigned char +fz_arc4_next(fz_arc4 *arc4) +{ + unsigned int x; + unsigned int y; + unsigned int sx, sy; + unsigned char *state; + + state = arc4->state; + + x = (arc4->x + 1) & 0xff; + sx = state[x]; + y = (sx + arc4->y) & 0xff; + sy = state[y]; + + arc4->x = x; + arc4->y = y; + + state[y] = sx; + state[x] = sy; + + return state[(sx + sy) & 0xff]; +} + +void +fz_arc4_encrypt(fz_arc4 *arc4, unsigned char *dest, const unsigned char *src, const unsigned len) +{ + unsigned int i; + for (i = 0; i < len; i++) + { + unsigned char x; + x = fz_arc4_next(arc4); + dest[i] = src[i] ^ x; + } +} diff --git a/contrib/media/updf_newlib/fitz/crypt_md5.c b/contrib/media/updf_newlib/fitz/crypt_md5.c new file mode 100755 index 000000000..ba2571c4e --- /dev/null +++ b/contrib/media/updf_newlib/fitz/crypt_md5.c @@ -0,0 +1,272 @@ +/* +MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + +Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. +All rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. +*/ + +#include "fitz.h" + +/* Constants for MD5Transform routine */ +enum +{ + S11 = 7, S12 = 12, S13 = 17, S14 = 22, + S21 = 5, S22 = 9, S23 = 14, S24 = 20, + S31 = 4, S32 = 11, S33 = 16, S34 = 23, + S41 = 6, S42 = 10, S43 = 15, S44 = 21 +}; + +static void encode(unsigned char *, const unsigned int *, const unsigned); +static void decode(unsigned int *, const unsigned char *, const unsigned); +static void transform(unsigned int state[4], const unsigned char block[64]); + +static unsigned char padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE rotates x left n bits */ +#define ROTATE(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. + * Rotation is separate from addition to prevent recomputation. + */ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (unsigned int)(ac); \ + (a) = ROTATE ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (unsigned int)(ac); \ + (a) = ROTATE ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (unsigned int)(ac); \ + (a) = ROTATE ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (unsigned int)(ac); \ + (a) = ROTATE ((a), (s)); \ + (a) += (b); \ + } + +static void encode(unsigned char *output, const unsigned int *input, const unsigned len) +{ + unsigned i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + { + output[j] = (unsigned char)(input[i] & 0xff); + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + } +} + +static void decode(unsigned int *output, const unsigned char *input, const unsigned len) +{ + unsigned i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + { + output[i] = ((unsigned int)input[j]) | + (((unsigned int)input[j+1]) << 8) | + (((unsigned int)input[j+2]) << 16) | + (((unsigned int)input[j+3]) << 24); + } +} + +static void transform(unsigned int state[4], const unsigned char block[64]) +{ + unsigned int a = state[0]; + unsigned int b = state[1]; + unsigned int c = state[2]; + unsigned int d = state[3]; + unsigned int x[16]; + + decode(x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x02441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x04881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information */ + memset(x, 0, sizeof (x)); +} + +/* MD5 initialization. Begins an MD5 operation, writing a new context. */ +void fz_md5_init(fz_md5 *context) +{ + context->count[0] = context->count[1] = 0; + + /* Load magic initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* MD5 block update operation. Continues an MD5 message-digest operation, + * processing another message block, and updating the context. + */ +void fz_md5_update(fz_md5 *context, const unsigned char *input, const unsigned inlen) +{ + unsigned i, index, partlen; + + /* Compute number of bytes mod 64 */ + index = (unsigned)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + context->count[0] += (unsigned int) inlen << 3; + if (context->count[0] < (unsigned int) inlen << 3) + context->count[1] ++; + context->count[1] += (unsigned int) inlen >> 29; + + partlen = 64 - index; + + /* Transform as many times as possible. */ + if (inlen >= partlen) + { + memcpy(context->buffer + index, input, partlen); + transform(context->state, context->buffer); + + for (i = partlen; i + 63 < inlen; i += 64) + transform(context->state, input + i); + + index = 0; + } + else + { + i = 0; + } + + /* Buffer remaining input */ + memcpy(context->buffer + index, input + i, inlen - i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + * the message digest and zeroizing the context. + */ +void fz_md5_final(fz_md5 *context, unsigned char digest[16]) +{ + unsigned char bits[8]; + unsigned index, padlen; + + /* Save number of bits */ + encode(bits, context->count, 8); + + /* Pad out to 56 mod 64 */ + index = (unsigned)((context->count[0] >> 3) & 0x3f); + padlen = index < 56 ? 56 - index : 120 - index; + fz_md5_update(context, padding, padlen); + + /* Append length (before padding) */ + fz_md5_update(context, bits, 8); + + /* Store state in digest */ + encode(digest, context->state, 16); + + /* Zeroize sensitive information */ + memset(context, 0, sizeof(fz_md5)); +} diff --git a/contrib/media/updf_newlib/fitz/crypt_sha2.c b/contrib/media/updf_newlib/fitz/crypt_sha2.c new file mode 100755 index 000000000..f17146c6f --- /dev/null +++ b/contrib/media/updf_newlib/fitz/crypt_sha2.c @@ -0,0 +1,182 @@ +/* +This code is based on the code found from 7-Zip, which has a modified +version of the SHA-256 found from Crypto++ . +The code was modified a little to fit into liblzma and fitz. + +This file has been put into the public domain. +You can do whatever you want with this file. +*/ + +#include "fitz.h" + +static inline int isbigendian(void) +{ + static const int one = 1; + return *(char*)&one == 0; +} + +static inline unsigned int bswap32(unsigned int num) +{ + if (!isbigendian()) + { + return ( (((num) << 24)) + | (((num) << 8) & 0x00FF0000) + | (((num) >> 8) & 0x0000FF00) + | (((num) >> 24)) ); + } + return num; +} + +/* At least on x86, GCC is able to optimize this to a rotate instruction. */ +#define rotr_32(num, amount) ((num) >> (amount) | (num) << (32 - (amount))) + +#define blk0(i) (W[i] = data[i]) +#define blk2(i) (W[i & 15] += s1(W[(i - 2) & 15]) + W[(i - 7) & 15] \ + + s0(W[(i - 15) & 15])) + +#define Ch(x, y, z) (z ^ (x & (y ^ z))) +#define Maj(x, y, z) ((x & y) | (z & (x | y))) + +#define a(i) T[(0 - i) & 7] +#define b(i) T[(1 - i) & 7] +#define c(i) T[(2 - i) & 7] +#define d(i) T[(3 - i) & 7] +#define e(i) T[(4 - i) & 7] +#define f(i) T[(5 - i) & 7] +#define g(i) T[(6 - i) & 7] +#define h(i) T[(7 - i) & 7] + +#define R(i) \ + h(i) += S1(e(i)) + Ch(e(i), f(i), g(i)) + SHA256_K[i + j] \ + + (j ? blk2(i) : blk0(i)); \ + d(i) += h(i); \ + h(i) += S0(a(i)) + Maj(a(i), b(i), c(i)) + +#define S0(x) (rotr_32(x, 2) ^ rotr_32(x, 13) ^ rotr_32(x, 22)) +#define S1(x) (rotr_32(x, 6) ^ rotr_32(x, 11) ^ rotr_32(x, 25)) +#define s0(x) (rotr_32(x, 7) ^ rotr_32(x, 18) ^ (x >> 3)) +#define s1(x) (rotr_32(x, 17) ^ rotr_32(x, 19) ^ (x >> 10)) + +static const unsigned int SHA256_K[64] = { + 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, + 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, + 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, + 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, + 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, + 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, + 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, + 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, + 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, + 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, + 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, + 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, + 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, + 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, + 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, + 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, +}; + +static void +transform(unsigned int state[8], const unsigned int data_xe[16]) +{ + unsigned int data[16]; + unsigned int W[16]; + unsigned int T[8]; + unsigned int j; + + /* ensure big-endian integers */ + for (j = 0; j < 16; j++) + data[j] = bswap32(data_xe[j]); + + /* Copy state[] to working vars. */ + memcpy(T, state, sizeof(T)); + + /* 64 operations, partially loop unrolled */ + for (j = 0; j < 64; j += 16) { + R( 0); R( 1); R( 2); R( 3); + R( 4); R( 5); R( 6); R( 7); + R( 8); R( 9); R(10); R(11); + R(12); R(13); R(14); R(15); + } + + /* Add the working vars back into state[]. */ + state[0] += a(0); + state[1] += b(0); + state[2] += c(0); + state[3] += d(0); + state[4] += e(0); + state[5] += f(0); + state[6] += g(0); + state[7] += h(0); +} + +void fz_sha256_init(fz_sha256 *context) +{ + context->count[0] = context->count[1] = 0; + + context->state[0] = 0x6A09E667; + context->state[1] = 0xBB67AE85; + context->state[2] = 0x3C6EF372; + context->state[3] = 0xA54FF53A; + context->state[4] = 0x510E527F; + context->state[5] = 0x9B05688C; + context->state[6] = 0x1F83D9AB; + context->state[7] = 0x5BE0CD19; +} + +void fz_sha256_update(fz_sha256 *context, const unsigned char *input, unsigned int inlen) +{ + /* Copy the input data into a properly aligned temporary buffer. + * This way we can be called with arbitrarily sized buffers + * (no need to be multiple of 64 bytes), and the code works also + * on architectures that don't allow unaligned memory access. */ + while (inlen > 0) + { + const unsigned int copy_start = context->count[0] & 0x3F; + unsigned int copy_size = 64 - copy_start; + if (copy_size > inlen) + copy_size = inlen; + + memcpy(context->buffer.u8 + copy_start, input, copy_size); + + input += copy_size; + inlen -= copy_size; + context->count[0] += copy_size; + /* carry overflow from low to high */ + if (context->count[0] < copy_size) + context->count[1]++; + + if ((context->count[0] & 0x3F) == 0) + transform(context->state, context->buffer.u32); + } +} + +void fz_sha256_final(fz_sha256 *context, unsigned char digest[32]) +{ + /* Add padding as described in RFC 3174 (it describes SHA-1 but + * the same padding style is used for SHA-256 too). */ + unsigned int j = context->count[0] & 0x3F; + context->buffer.u8[j++] = 0x80; + + while (j != 56) + { + if (j == 64) + { + transform(context->state, context->buffer.u32); + j = 0; + } + context->buffer.u8[j++] = 0x00; + } + + /* Convert the message size from bytes to bits. */ + context->count[1] = (context->count[1] << 3) + (context->count[0] >> 29); + context->count[0] = context->count[0] << 3; + + context->buffer.u32[14] = bswap32(context->count[1]); + context->buffer.u32[15] = bswap32(context->count[0]); + transform(context->state, context->buffer.u32); + + for (j = 0; j < 8; j++) + ((unsigned int *)digest)[j] = bswap32(context->state[j]); + memset(context, 0, sizeof(fz_sha256)); +} diff --git a/contrib/media/updf_newlib/fitz/dev_bbox.c b/contrib/media/updf_newlib/fitz/dev_bbox.c new file mode 100755 index 000000000..179ff030c --- /dev/null +++ b/contrib/media/updf_newlib/fitz/dev_bbox.c @@ -0,0 +1,82 @@ +#include "fitz.h" + +/* TODO: add clip stack and use to intersect bboxes */ + +static void +fz_bbox_fill_path(void *user, fz_path *path, int even_odd, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_bbox *result = user; + fz_bbox bbox = fz_round_rect(fz_bound_path(path, NULL, ctm)); + *result = fz_union_bbox(*result, bbox); +} + +static void +fz_bbox_stroke_path(void *user, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_bbox *result = user; + fz_bbox bbox = fz_round_rect(fz_bound_path(path, stroke, ctm)); + *result = fz_union_bbox(*result, bbox); +} + +static void +fz_bbox_fill_text(void *user, fz_text *text, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_bbox *result = user; + fz_bbox bbox = fz_round_rect(fz_bound_text(text, ctm)); + *result = fz_union_bbox(*result, bbox); +} + +static void +fz_bbox_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_bbox *result = user; + fz_bbox bbox = fz_round_rect(fz_bound_text(text, ctm)); + *result = fz_union_bbox(*result, bbox); +} + +static void +fz_bbox_fill_shade(void *user, fz_shade *shade, fz_matrix ctm, float alpha) +{ + fz_bbox *result = user; + fz_bbox bbox = fz_round_rect(fz_bound_shade(shade, ctm)); + *result = fz_union_bbox(*result, bbox); +} + +static void +fz_bbox_fill_image(void *user, fz_pixmap *image, fz_matrix ctm, float alpha) +{ + fz_bbox *result = user; + fz_bbox bbox = fz_round_rect(fz_transform_rect(ctm, fz_unit_rect)); + *result = fz_union_bbox(*result, bbox); +} + +static void +fz_bbox_fill_image_mask(void *user, fz_pixmap *image, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_bbox_fill_image(user, image, ctm, alpha); +} + +fz_device * +fz_new_bbox_device(fz_bbox *result) +{ + fz_device *dev; + + dev = fz_new_device(result); + + dev->fill_path = fz_bbox_fill_path; + dev->stroke_path = fz_bbox_stroke_path; + dev->fill_text = fz_bbox_fill_text; + dev->stroke_text = fz_bbox_stroke_text; + dev->fill_shade = fz_bbox_fill_shade; + dev->fill_image = fz_bbox_fill_image; + dev->fill_image_mask = fz_bbox_fill_image_mask; + + *result = fz_empty_bbox; + + return dev; +} diff --git a/contrib/media/updf_newlib/fitz/dev_list.c b/contrib/media/updf_newlib/fitz/dev_list.c new file mode 100755 index 000000000..955824f93 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/dev_list.c @@ -0,0 +1,660 @@ +#include "fitz.h" + +typedef struct fz_display_node_s fz_display_node; + +#define STACK_SIZE 96 + +typedef enum fz_display_command_e +{ + FZ_CMD_FILL_PATH, + FZ_CMD_STROKE_PATH, + FZ_CMD_CLIP_PATH, + FZ_CMD_CLIP_STROKE_PATH, + FZ_CMD_FILL_TEXT, + FZ_CMD_STROKE_TEXT, + FZ_CMD_CLIP_TEXT, + FZ_CMD_CLIP_STROKE_TEXT, + FZ_CMD_IGNORE_TEXT, + FZ_CMD_FILL_SHADE, + FZ_CMD_FILL_IMAGE, + FZ_CMD_FILL_IMAGE_MASK, + FZ_CMD_CLIP_IMAGE_MASK, + FZ_CMD_POP_CLIP, + FZ_CMD_BEGIN_MASK, + FZ_CMD_END_MASK, + FZ_CMD_BEGIN_GROUP, + FZ_CMD_END_GROUP, + FZ_CMD_BEGIN_TILE, + FZ_CMD_END_TILE +} fz_display_command; + +struct fz_display_node_s +{ + fz_display_command cmd; + fz_display_node *next; + fz_rect rect; + union { + fz_path *path; + fz_text *text; + fz_shade *shade; + fz_pixmap *image; + int blendmode; + } item; + fz_stroke_state *stroke; + int flag; /* even_odd, accumulate, isolated/knockout... */ + fz_matrix ctm; + fz_colorspace *colorspace; + float alpha; + float color[FZ_MAX_COLORS]; +}; + +struct fz_display_list_s +{ + fz_display_node *first; + fz_display_node *last; + + int top; + struct { + fz_rect *update; + fz_rect rect; + } stack[STACK_SIZE]; + int tiled; +}; + +enum { ISOLATED = 1, KNOCKOUT = 2 }; + +static fz_display_node * +fz_new_display_node(fz_display_command cmd, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_display_node *node; + int i; + + node = fz_malloc(sizeof(fz_display_node)); + node->cmd = cmd; + node->next = NULL; + node->rect = fz_empty_rect; + node->item.path = NULL; + node->stroke = NULL; + node->flag = 0; + node->ctm = ctm; + if (colorspace) + { + node->colorspace = fz_keep_colorspace(colorspace); + if (color) + { + for (i = 0; i < node->colorspace->n; i++) + node->color[i] = color[i]; + } + } + else + { + node->colorspace = NULL; + } + node->alpha = alpha; + + return node; +} + +static fz_stroke_state * +fz_clone_stroke_state(fz_stroke_state *stroke) +{ + fz_stroke_state *newstroke = fz_malloc(sizeof(fz_stroke_state)); + *newstroke = *stroke; + return newstroke; +} + +static void +fz_append_display_node(fz_display_list *list, fz_display_node *node) +{ + switch (node->cmd) + { + case FZ_CMD_CLIP_PATH: + case FZ_CMD_CLIP_STROKE_PATH: + case FZ_CMD_CLIP_IMAGE_MASK: + if (list->top < STACK_SIZE) + { + list->stack[list->top].update = &node->rect; + list->stack[list->top].rect = fz_empty_rect; + } + list->top++; + break; + case FZ_CMD_END_MASK: + case FZ_CMD_CLIP_TEXT: + case FZ_CMD_CLIP_STROKE_TEXT: + if (list->top < STACK_SIZE) + { + list->stack[list->top].update = NULL; + list->stack[list->top].rect = fz_empty_rect; + } + list->top++; + break; + case FZ_CMD_BEGIN_TILE: + list->tiled++; + if (list->top > 0 && list->top < STACK_SIZE) + { + list->stack[list->top-1].rect = fz_infinite_rect; + } + break; + case FZ_CMD_END_TILE: + list->tiled--; + break; + case FZ_CMD_END_GROUP: + break; + case FZ_CMD_POP_CLIP: + if (list->top > STACK_SIZE) + { + list->top--; + node->rect = fz_infinite_rect; + } + else if (list->top > 0) + { + fz_rect *update; + list->top--; + update = list->stack[list->top].update; + if (list->tiled == 0) + { + if (update != NULL) + { + *update = fz_intersect_rect(*update, list->stack[list->top].rect); + node->rect = *update; + } + else + node->rect = list->stack[list->top].rect; + } + else + node->rect = fz_infinite_rect; + } + /* fallthrough */ + default: + if (list->top > 0 && list->tiled == 0 && list->top <= STACK_SIZE) + list->stack[list->top-1].rect = fz_union_rect(list->stack[list->top-1].rect, node->rect); + break; + } + if (!list->first) + { + list->first = node; + list->last = node; + } + else + { + list->last->next = node; + list->last = node; + } +} + +static void +fz_free_display_node(fz_display_node *node) +{ + switch (node->cmd) + { + case FZ_CMD_FILL_PATH: + case FZ_CMD_STROKE_PATH: + case FZ_CMD_CLIP_PATH: + case FZ_CMD_CLIP_STROKE_PATH: + fz_free_path(node->item.path); + break; + case FZ_CMD_FILL_TEXT: + case FZ_CMD_STROKE_TEXT: + case FZ_CMD_CLIP_TEXT: + case FZ_CMD_CLIP_STROKE_TEXT: + case FZ_CMD_IGNORE_TEXT: + fz_free_text(node->item.text); + break; + case FZ_CMD_FILL_SHADE: + fz_drop_shade(node->item.shade); + break; + case FZ_CMD_FILL_IMAGE: + case FZ_CMD_FILL_IMAGE_MASK: + case FZ_CMD_CLIP_IMAGE_MASK: + fz_drop_pixmap(node->item.image); + break; + case FZ_CMD_POP_CLIP: + case FZ_CMD_BEGIN_MASK: + case FZ_CMD_END_MASK: + case FZ_CMD_BEGIN_GROUP: + case FZ_CMD_END_GROUP: + case FZ_CMD_BEGIN_TILE: + case FZ_CMD_END_TILE: + break; + } + if (node->stroke) + fz_free(node->stroke); + if (node->colorspace) + fz_drop_colorspace(node->colorspace); + fz_free(node); +} + +static void +fz_list_fill_path(void *user, fz_path *path, int even_odd, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_FILL_PATH, ctm, colorspace, color, alpha); + node->rect = fz_bound_path(path, NULL, ctm); + node->item.path = fz_clone_path(path); + node->flag = even_odd; + fz_append_display_node(user, node); +} + +static void +fz_list_stroke_path(void *user, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_STROKE_PATH, ctm, colorspace, color, alpha); + node->rect = fz_bound_path(path, stroke, ctm); + node->item.path = fz_clone_path(path); + node->stroke = fz_clone_stroke_state(stroke); + fz_append_display_node(user, node); +} + +static void +fz_list_clip_path(void *user, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_CLIP_PATH, ctm, NULL, NULL, 0); + node->rect = fz_bound_path(path, NULL, ctm); + if (rect != NULL) + node->rect = fz_intersect_rect(node->rect, *rect); + node->item.path = fz_clone_path(path); + node->flag = even_odd; + fz_append_display_node(user, node); +} + +static void +fz_list_clip_stroke_path(void *user, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_CLIP_STROKE_PATH, ctm, NULL, NULL, 0); + node->rect = fz_bound_path(path, stroke, ctm); + if (rect != NULL) + node->rect = fz_intersect_rect(node->rect, *rect); + node->item.path = fz_clone_path(path); + node->stroke = fz_clone_stroke_state(stroke); + fz_append_display_node(user, node); +} + +static void +fz_list_fill_text(void *user, fz_text *text, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_FILL_TEXT, ctm, colorspace, color, alpha); + node->rect = fz_bound_text(text, ctm); + node->item.text = fz_clone_text(text); + fz_append_display_node(user, node); +} + +static void +fz_list_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_STROKE_TEXT, ctm, colorspace, color, alpha); + node->rect = fz_bound_text(text, ctm); + node->item.text = fz_clone_text(text); + node->stroke = fz_clone_stroke_state(stroke); + fz_append_display_node(user, node); +} + +static void +fz_list_clip_text(void *user, fz_text *text, fz_matrix ctm, int accumulate) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_CLIP_TEXT, ctm, NULL, NULL, 0); + node->rect = fz_bound_text(text, ctm); + node->item.text = fz_clone_text(text); + node->flag = accumulate; + /* when accumulating, be conservative about culling */ + if (accumulate) + node->rect = fz_infinite_rect; + fz_append_display_node(user, node); +} + +static void +fz_list_clip_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_CLIP_STROKE_TEXT, ctm, NULL, NULL, 0); + node->rect = fz_bound_text(text, ctm); + node->item.text = fz_clone_text(text); + node->stroke = fz_clone_stroke_state(stroke); + fz_append_display_node(user, node); +} + +static void +fz_list_ignore_text(void *user, fz_text *text, fz_matrix ctm) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_IGNORE_TEXT, ctm, NULL, NULL, 0); + node->rect = fz_bound_text(text, ctm); + node->item.text = fz_clone_text(text); + fz_append_display_node(user, node); +} + +static void +fz_list_pop_clip(void *user) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_POP_CLIP, fz_identity, NULL, NULL, 0); + fz_append_display_node(user, node); +} + +static void +fz_list_fill_shade(void *user, fz_shade *shade, fz_matrix ctm, float alpha) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_FILL_SHADE, ctm, NULL, NULL, alpha); + node->rect = fz_bound_shade(shade, ctm); + node->item.shade = fz_keep_shade(shade); + fz_append_display_node(user, node); +} + +static void +fz_list_fill_image(void *user, fz_pixmap *image, fz_matrix ctm, float alpha) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_FILL_IMAGE, ctm, NULL, NULL, alpha); + node->rect = fz_transform_rect(ctm, fz_unit_rect); + node->item.image = fz_keep_pixmap(image); + fz_append_display_node(user, node); +} + +static void +fz_list_fill_image_mask(void *user, fz_pixmap *image, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_FILL_IMAGE_MASK, ctm, colorspace, color, alpha); + node->rect = fz_transform_rect(ctm, fz_unit_rect); + node->item.image = fz_keep_pixmap(image); + fz_append_display_node(user, node); +} + +static void +fz_list_clip_image_mask(void *user, fz_pixmap *image, fz_rect *rect, fz_matrix ctm) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_CLIP_IMAGE_MASK, ctm, NULL, NULL, 0); + node->rect = fz_transform_rect(ctm, fz_unit_rect); + if (rect != NULL) + node->rect = fz_intersect_rect(node->rect, *rect); + node->item.image = fz_keep_pixmap(image); + fz_append_display_node(user, node); +} + +static void +fz_list_begin_mask(void *user, fz_rect rect, int luminosity, fz_colorspace *colorspace, float *color) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_BEGIN_MASK, fz_identity, colorspace, color, 0); + node->rect = rect; + node->flag = luminosity; + fz_append_display_node(user, node); +} + +static void +fz_list_end_mask(void *user) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_END_MASK, fz_identity, NULL, NULL, 0); + fz_append_display_node(user, node); +} + +static void +fz_list_begin_group(void *user, fz_rect rect, int isolated, int knockout, int blendmode, float alpha) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_BEGIN_GROUP, fz_identity, NULL, NULL, alpha); + node->rect = rect; + node->item.blendmode = blendmode; + node->flag |= isolated ? ISOLATED : 0; + node->flag |= knockout ? KNOCKOUT : 0; + fz_append_display_node(user, node); +} + +static void +fz_list_end_group(void *user) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_END_GROUP, fz_identity, NULL, NULL, 0); + fz_append_display_node(user, node); +} + +static void +fz_list_begin_tile(void *user, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_BEGIN_TILE, ctm, NULL, NULL, 0); + node->rect = area; + node->color[0] = xstep; + node->color[1] = ystep; + node->color[2] = view.x0; + node->color[3] = view.y0; + node->color[4] = view.x1; + node->color[5] = view.y1; + fz_append_display_node(user, node); +} + +static void +fz_list_end_tile(void *user) +{ + fz_display_node *node; + node = fz_new_display_node(FZ_CMD_END_TILE, fz_identity, NULL, NULL, 0); + fz_append_display_node(user, node); +} + +fz_device * +fz_new_list_device(fz_display_list *list) +{ + fz_device *dev = fz_new_device(list); + + dev->fill_path = fz_list_fill_path; + dev->stroke_path = fz_list_stroke_path; + dev->clip_path = fz_list_clip_path; + dev->clip_stroke_path = fz_list_clip_stroke_path; + + dev->fill_text = fz_list_fill_text; + dev->stroke_text = fz_list_stroke_text; + dev->clip_text = fz_list_clip_text; + dev->clip_stroke_text = fz_list_clip_stroke_text; + dev->ignore_text = fz_list_ignore_text; + + dev->fill_shade = fz_list_fill_shade; + dev->fill_image = fz_list_fill_image; + dev->fill_image_mask = fz_list_fill_image_mask; + dev->clip_image_mask = fz_list_clip_image_mask; + + dev->pop_clip = fz_list_pop_clip; + + dev->begin_mask = fz_list_begin_mask; + dev->end_mask = fz_list_end_mask; + dev->begin_group = fz_list_begin_group; + dev->end_group = fz_list_end_group; + + dev->begin_tile = fz_list_begin_tile; + dev->end_tile = fz_list_end_tile; + + return dev; +} + +fz_display_list * +fz_new_display_list(void) +{ + fz_display_list *list = fz_malloc(sizeof(fz_display_list)); + list->first = NULL; + list->last = NULL; + list->top = 0; + list->tiled = 0; + return list; +} + +void +fz_free_display_list(fz_display_list *list) +{ + fz_display_node *node = list->first; + while (node) + { + fz_display_node *next = node->next; + fz_free_display_node(node); + node = next; + } + fz_free(list); +} + +void +fz_execute_display_list(fz_display_list *list, fz_device *dev, fz_matrix top_ctm, fz_bbox scissor) +{ + fz_display_node *node; + fz_matrix ctm; + fz_rect rect; + fz_bbox bbox; + int clipped = 0; + int tiled = 0; + int empty; + + if (!fz_is_infinite_bbox(scissor)) + { + /* add some fuzz at the edges, as especially glyph rects + * are sometimes not actually completely bounding the glyph */ + scissor.x0 -= 20; scissor.y0 -= 20; + scissor.x1 += 20; scissor.y1 += 20; + } + + for (node = list->first; node; node = node->next) + { + /* cull objects to draw using a quick visibility test */ + + if (tiled || node->cmd == FZ_CMD_BEGIN_TILE || node->cmd == FZ_CMD_END_TILE) + { + empty = 0; + } + else + { + bbox = fz_round_rect(fz_transform_rect(top_ctm, node->rect)); + bbox = fz_intersect_bbox(bbox, scissor); + empty = fz_is_empty_bbox(bbox); + } + + if (clipped || empty) + { + switch (node->cmd) + { + case FZ_CMD_CLIP_PATH: + case FZ_CMD_CLIP_STROKE_PATH: + case FZ_CMD_CLIP_TEXT: + case FZ_CMD_CLIP_STROKE_TEXT: + case FZ_CMD_CLIP_IMAGE_MASK: + case FZ_CMD_BEGIN_MASK: + case FZ_CMD_BEGIN_GROUP: + clipped++; + continue; + case FZ_CMD_POP_CLIP: + case FZ_CMD_END_GROUP: + if (!clipped) + goto visible; + clipped--; + continue; + case FZ_CMD_END_MASK: + if (!clipped) + goto visible; + continue; + default: + continue; + } + } + +visible: + ctm = fz_concat(node->ctm, top_ctm); + + switch (node->cmd) + { + case FZ_CMD_FILL_PATH: + fz_fill_path(dev, node->item.path, node->flag, ctm, + node->colorspace, node->color, node->alpha); + break; + case FZ_CMD_STROKE_PATH: + fz_stroke_path(dev, node->item.path, node->stroke, ctm, + node->colorspace, node->color, node->alpha); + break; + case FZ_CMD_CLIP_PATH: + { + fz_rect trect = fz_transform_rect(top_ctm, node->rect); + fz_clip_path(dev, node->item.path, &trect, node->flag, ctm); + break; + } + case FZ_CMD_CLIP_STROKE_PATH: + { + fz_rect trect = fz_transform_rect(top_ctm, node->rect); + fz_clip_stroke_path(dev, node->item.path, &trect, node->stroke, ctm); + break; + } + case FZ_CMD_FILL_TEXT: + fz_fill_text(dev, node->item.text, ctm, + node->colorspace, node->color, node->alpha); + break; + case FZ_CMD_STROKE_TEXT: + fz_stroke_text(dev, node->item.text, node->stroke, ctm, + node->colorspace, node->color, node->alpha); + break; + case FZ_CMD_CLIP_TEXT: + fz_clip_text(dev, node->item.text, ctm, node->flag); + break; + case FZ_CMD_CLIP_STROKE_TEXT: + fz_clip_stroke_text(dev, node->item.text, node->stroke, ctm); + break; + case FZ_CMD_IGNORE_TEXT: + fz_ignore_text(dev, node->item.text, ctm); + break; + case FZ_CMD_FILL_SHADE: + fz_fill_shade(dev, node->item.shade, ctm, node->alpha); + break; + case FZ_CMD_FILL_IMAGE: + fz_fill_image(dev, node->item.image, ctm, node->alpha); + break; + case FZ_CMD_FILL_IMAGE_MASK: + fz_fill_image_mask(dev, node->item.image, ctm, + node->colorspace, node->color, node->alpha); + break; + case FZ_CMD_CLIP_IMAGE_MASK: + { + fz_rect trect = fz_transform_rect(top_ctm, node->rect); + fz_clip_image_mask(dev, node->item.image, &trect, ctm); + break; + } + case FZ_CMD_POP_CLIP: + fz_pop_clip(dev); + break; + case FZ_CMD_BEGIN_MASK: + rect = fz_transform_rect(top_ctm, node->rect); + fz_begin_mask(dev, rect, node->flag, node->colorspace, node->color); + break; + case FZ_CMD_END_MASK: + fz_end_mask(dev); + break; + case FZ_CMD_BEGIN_GROUP: + rect = fz_transform_rect(top_ctm, node->rect); + fz_begin_group(dev, rect, + (node->flag & ISOLATED) != 0, (node->flag & KNOCKOUT) != 0, + node->item.blendmode, node->alpha); + break; + case FZ_CMD_END_GROUP: + fz_end_group(dev); + break; + case FZ_CMD_BEGIN_TILE: + tiled++; + rect.x0 = node->color[2]; + rect.y0 = node->color[3]; + rect.x1 = node->color[4]; + rect.y1 = node->color[5]; + fz_begin_tile(dev, node->rect, rect, + node->color[0], node->color[1], ctm); + break; + case FZ_CMD_END_TILE: + tiled--; + fz_end_tile(dev); + break; + } + } +} diff --git a/contrib/media/updf_newlib/fitz/dev_null.c b/contrib/media/updf_newlib/fitz/dev_null.c new file mode 100755 index 000000000..508be7e0d --- /dev/null +++ b/contrib/media/updf_newlib/fitz/dev_null.c @@ -0,0 +1,165 @@ +#include "fitz.h" + +fz_device * +fz_new_device(void *user) +{ + fz_device *dev = fz_malloc(sizeof(fz_device)); + memset(dev, 0, sizeof(fz_device)); + dev->hints = 0; + dev->flags = 0; + dev->user = user; + return dev; +} + +void +fz_free_device(fz_device *dev) +{ + if (dev->free_user) + dev->free_user(dev->user); + fz_free(dev); +} + +void +fz_fill_path(fz_device *dev, fz_path *path, int even_odd, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + if (dev->fill_path) + dev->fill_path(dev->user, path, even_odd, ctm, colorspace, color, alpha); +} + +void +fz_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + if (dev->stroke_path) + dev->stroke_path(dev->user, path, stroke, ctm, colorspace, color, alpha); +} + +void +fz_clip_path(fz_device *dev, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm) +{ + if (dev->clip_path) + dev->clip_path(dev->user, path, rect, even_odd, ctm); +} + +void +fz_clip_stroke_path(fz_device *dev, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm) +{ + if (dev->clip_stroke_path) + dev->clip_stroke_path(dev->user, path, rect, stroke, ctm); +} + +void +fz_fill_text(fz_device *dev, fz_text *text, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + if (dev->fill_text) + dev->fill_text(dev->user, text, ctm, colorspace, color, alpha); +} + +void +fz_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + if (dev->stroke_text) + dev->stroke_text(dev->user, text, stroke, ctm, colorspace, color, alpha); +} + +void +fz_clip_text(fz_device *dev, fz_text *text, fz_matrix ctm, int accumulate) +{ + if (dev->clip_text) + dev->clip_text(dev->user, text, ctm, accumulate); +} + +void +fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm) +{ + if (dev->clip_stroke_text) + dev->clip_stroke_text(dev->user, text, stroke, ctm); +} + +void +fz_ignore_text(fz_device *dev, fz_text *text, fz_matrix ctm) +{ + if (dev->ignore_text) + dev->ignore_text(dev->user, text, ctm); +} + +void +fz_pop_clip(fz_device *dev) +{ + if (dev->pop_clip) + dev->pop_clip(dev->user); +} + +void +fz_fill_shade(fz_device *dev, fz_shade *shade, fz_matrix ctm, float alpha) +{ + if (dev->fill_shade) + dev->fill_shade(dev->user, shade, ctm, alpha); +} + +void +fz_fill_image(fz_device *dev, fz_pixmap *image, fz_matrix ctm, float alpha) +{ + if (dev->fill_image) + dev->fill_image(dev->user, image, ctm, alpha); +} + +void +fz_fill_image_mask(fz_device *dev, fz_pixmap *image, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + if (dev->fill_image_mask) + dev->fill_image_mask(dev->user, image, ctm, colorspace, color, alpha); +} + +void +fz_clip_image_mask(fz_device *dev, fz_pixmap *image, fz_rect *rect, fz_matrix ctm) +{ + if (dev->clip_image_mask) + dev->clip_image_mask(dev->user, image, rect, ctm); +} + +void +fz_begin_mask(fz_device *dev, fz_rect area, int luminosity, fz_colorspace *colorspace, float *bc) +{ + if (dev->begin_mask) + dev->begin_mask(dev->user, area, luminosity, colorspace, bc); +} + +void +fz_end_mask(fz_device *dev) +{ + if (dev->end_mask) + dev->end_mask(dev->user); +} + +void +fz_begin_group(fz_device *dev, fz_rect area, int isolated, int knockout, int blendmode, float alpha) +{ + if (dev->begin_group) + dev->begin_group(dev->user, area, isolated, knockout, blendmode, alpha); +} + +void +fz_end_group(fz_device *dev) +{ + if (dev->end_group) + dev->end_group(dev->user); +} + +void +fz_begin_tile(fz_device *dev, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm) +{ + if (dev->begin_tile) + dev->begin_tile(dev->user, area, view, xstep, ystep, ctm); +} + +void +fz_end_tile(fz_device *dev) +{ + if (dev->end_tile) + dev->end_tile(dev->user); +} diff --git a/contrib/media/updf_newlib/fitz/dev_text.c b/contrib/media/updf_newlib/fitz/dev_text.c new file mode 100755 index 000000000..139c3eed7 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/dev_text.c @@ -0,0 +1,418 @@ +#include "fitz.h" + +#define LINE_DIST 0.9f +#define SPACE_DIST 0.2f + +#include +#include FT_FREETYPE_H +#include FT_ADVANCES_H + +typedef struct fz_text_device_s fz_text_device; + +struct fz_text_device_s +{ + fz_point point; + fz_text_span *head; + fz_text_span *span; +}; + +fz_text_span * +fz_new_text_span(void) +{ + fz_text_span *span; + span = fz_malloc(sizeof(fz_text_span)); + span->font = NULL; + span->wmode = 0; + span->size = 0; + span->len = 0; + span->cap = 0; + span->text = NULL; + span->next = NULL; + span->eol = 0; + return span; +} + +void +fz_free_text_span(fz_text_span *span) +{ + if (span->font) + fz_drop_font(span->font); + if (span->next) + fz_free_text_span(span->next); + fz_free(span->text); + fz_free(span); +} + +static void +fz_add_text_char_imp(fz_text_span *span, int c, fz_bbox bbox) +{ + if (span->len + 1 >= span->cap) + { + span->cap = span->cap > 1 ? (span->cap * 3) / 2 : 80; + span->text = fz_realloc(span->text, span->cap, sizeof(fz_text_char)); + } + span->text[span->len].c = c; + span->text[span->len].bbox = bbox; + span->len ++; +} + +static fz_bbox +fz_split_bbox(fz_bbox bbox, int i, int n) +{ + float w = (float)(bbox.x1 - bbox.x0) / n; + float x0 = bbox.x0; + bbox.x0 = x0 + i * w; + bbox.x1 = x0 + (i + 1) * w; + return bbox; +} + +static void +fz_add_text_char(fz_text_span **last, fz_font *font, float size, int wmode, int c, fz_bbox bbox) +{ + fz_text_span *span = *last; + + if (!span->font) + { + span->font = fz_keep_font(font); + span->size = size; + } + + if ((span->font != font || span->size != size || span->wmode != wmode) && c != 32) + { + span = fz_new_text_span(); + span->font = fz_keep_font(font); + span->size = size; + span->wmode = wmode; + (*last)->next = span; + *last = span; + } + + switch (c) + { + case -1: /* ignore when one unicode character maps to multiple glyphs */ + break; + case 0xFB00: /* ff */ + fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 2)); + fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 1, 2)); + break; + case 0xFB01: /* fi */ + fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 2)); + fz_add_text_char_imp(span, 'i', fz_split_bbox(bbox, 1, 2)); + break; + case 0xFB02: /* fl */ + fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 2)); + fz_add_text_char_imp(span, 'l', fz_split_bbox(bbox, 1, 2)); + break; + case 0xFB03: /* ffi */ + fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 3)); + fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 1, 3)); + fz_add_text_char_imp(span, 'i', fz_split_bbox(bbox, 2, 3)); + break; + case 0xFB04: /* ffl */ + fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 3)); + fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 1, 3)); + fz_add_text_char_imp(span, 'l', fz_split_bbox(bbox, 2, 3)); + break; + case 0xFB05: /* long st */ + case 0xFB06: /* st */ + fz_add_text_char_imp(span, 's', fz_split_bbox(bbox, 0, 2)); + fz_add_text_char_imp(span, 't', fz_split_bbox(bbox, 1, 2)); + break; + default: + fz_add_text_char_imp(span, c, bbox); + break; + } +} + +static void +fz_divide_text_chars(fz_text_span **last, int n, fz_bbox bbox) +{ + fz_text_span *span = *last; + int i, x; + x = span->len - n; + if (x >= 0) + for (i = 0; i < n; i++) + span->text[x + i].bbox = fz_split_bbox(bbox, i, n); +} + +static void +fz_add_text_newline(fz_text_span **last, fz_font *font, float size, int wmode) +{ + fz_text_span *span; + span = fz_new_text_span(); + span->font = fz_keep_font(font); + span->size = size; + span->wmode = wmode; + (*last)->eol = 1; + (*last)->next = span; + *last = span; +} + +void +fz_debug_text_span_xml(fz_text_span *span) +{ + char buf[10]; + int c, n, k, i; + + printf("\n", + span->font ? span->font->name : "NULL", span->size, span->wmode, span->eol); + + for (i = 0; i < span->len; i++) + { + printf("\ttext[i].c; + if (c < 128) + putchar(c); + else + { + n = runetochar(buf, &c); + for (k = 0; k < n; k++) + putchar(buf[k]); + } + printf("\" bbox=\"%d %d %d %d\" />\n", + span->text[i].bbox.x0, + span->text[i].bbox.y0, + span->text[i].bbox.x1, + span->text[i].bbox.y1); + } + + printf("\n"); + + if (span->next) + fz_debug_text_span_xml(span->next); +} + +void +fz_debug_text_span(fz_text_span *span) +{ + char buf[10]; + int c, n, k, i; + + for (i = 0; i < span->len; i++) + { + c = span->text[i].c; + if (c < 128) + putchar(c); + else + { + n = runetochar(buf, &c); + for (k = 0; k < n; k++) + putchar(buf[k]); + } + } + + if (span->eol) + putchar('\n'); + + if (span->next) + fz_debug_text_span(span->next); +} + +static void +fz_text_extract_span(fz_text_span **last, fz_text *text, fz_matrix ctm, fz_point *pen) +{ + fz_font *font = text->font; + FT_Face face = font->ft_face; + fz_matrix tm = text->trm; + fz_matrix trm; + float size; + float adv; + fz_rect rect; + fz_point dir, ndir; + fz_point delta, ndelta; + float dist, dot; + float ascender = 1; + float descender = 0; + int multi; + int i, err; + + if (text->len == 0) + return; + + if (font->ft_face) + { + err = FT_Set_Char_Size(font->ft_face, 64, 64, 72, 72); + if (err) + fz_warn("freetype set character size: %s", ft_error_string(err)); + ascender = (float)face->ascender / face->units_per_EM; + descender = (float)face->descender / face->units_per_EM; + } + + rect = fz_empty_rect; + + if (text->wmode == 0) + { + dir.x = 1; + dir.y = 0; + } + else + { + dir.x = 0; + dir.y = 1; + } + + tm.e = 0; + tm.f = 0; + trm = fz_concat(tm, ctm); + dir = fz_transform_vector(trm, dir); + dist = sqrtf(dir.x * dir.x + dir.y * dir.y); + ndir.x = dir.x / dist; + ndir.y = dir.y / dist; + + size = fz_matrix_expansion(trm); + + multi = 1; + + for (i = 0; i < text->len; i++) + { + if (text->items[i].gid < 0) + { + fz_add_text_char(last, font, size, text->wmode, text->items[i].ucs, fz_round_rect(rect)); + multi ++; + fz_divide_text_chars(last, multi, fz_round_rect(rect)); + continue; + } + multi = 1; + + /* Calculate new pen location and delta */ + tm.e = text->items[i].x; + tm.f = text->items[i].y; + trm = fz_concat(tm, ctm); + + delta.x = pen->x - trm.e; + delta.y = pen->y - trm.f; + if (pen->x == -1 && pen->y == -1) + delta.x = delta.y = 0; + + dist = sqrtf(delta.x * delta.x + delta.y * delta.y); + + /* Add space and newlines based on pen movement */ + if (dist > 0) + { + ndelta.x = delta.x / dist; + ndelta.y = delta.y / dist; + dot = ndelta.x * ndir.x + ndelta.y * ndir.y; + + if (dist > size * LINE_DIST) + { + fz_add_text_newline(last, font, size, text->wmode); + } + else if (fabsf(dot) > 0.95f && dist > size * SPACE_DIST) + { + if ((*last)->len > 0 && (*last)->text[(*last)->len - 1].c != ' ') + { + fz_rect spacerect; + spacerect.x0 = -0.2f; + spacerect.y0 = 0; + spacerect.x1 = 0; + spacerect.y1 = 1; + spacerect = fz_transform_rect(trm, spacerect); + fz_add_text_char(last, font, size, text->wmode, ' ', fz_round_rect(spacerect)); + } + } + } + + /* Calculate bounding box and new pen position based on font metrics */ + if (font->ft_face) + { + FT_Fixed ftadv = 0; + int mask = FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_TRANSFORM; + + /* TODO: freetype returns broken vertical metrics */ + /* if (text->wmode) mask |= FT_LOAD_VERTICAL_LAYOUT; */ + + FT_Get_Advance(font->ft_face, text->items[i].gid, mask, &ftadv); + adv = ftadv / 65536.0f; + + rect.x0 = 0; + rect.y0 = descender; + rect.x1 = adv; + rect.y1 = ascender; + } + else + { + adv = font->t3widths[text->items[i].gid]; + rect.x0 = 0; + rect.y0 = descender; + rect.x1 = adv; + rect.y1 = ascender; + } + + rect = fz_transform_rect(trm, rect); + pen->x = trm.e + dir.x * adv; + pen->y = trm.f + dir.y * adv; + + fz_add_text_char(last, font, size, text->wmode, text->items[i].ucs, fz_round_rect(rect)); + } +} + +static void +fz_text_fill_text(void *user, fz_text *text, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_text_device *tdev = user; + fz_text_extract_span(&tdev->span, text, ctm, &tdev->point); +} + +static void +fz_text_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_text_device *tdev = user; + fz_text_extract_span(&tdev->span, text, ctm, &tdev->point); +} + +static void +fz_text_clip_text(void *user, fz_text *text, fz_matrix ctm, int accumulate) +{ + fz_text_device *tdev = user; + fz_text_extract_span(&tdev->span, text, ctm, &tdev->point); +} + +static void +fz_text_clip_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm) +{ + fz_text_device *tdev = user; + fz_text_extract_span(&tdev->span, text, ctm, &tdev->point); +} + +static void +fz_text_ignore_text(void *user, fz_text *text, fz_matrix ctm) +{ + fz_text_device *tdev = user; + fz_text_extract_span(&tdev->span, text, ctm, &tdev->point); +} + +static void +fz_text_free_user(void *user) +{ + fz_text_device *tdev = user; + + tdev->span->eol = 1; + + /* TODO: unicode NFC normalization */ + /* TODO: bidi logical reordering */ + + fz_free(tdev); +} + +fz_device * +fz_new_text_device(fz_text_span *root) +{ + fz_device *dev; + fz_text_device *tdev = fz_malloc(sizeof(fz_text_device)); + tdev->head = root; + tdev->span = root; + tdev->point.x = -1; + tdev->point.y = -1; + + dev = fz_new_device(tdev); + dev->hints = FZ_IGNORE_IMAGE | FZ_IGNORE_SHADE; + dev->free_user = fz_text_free_user; + dev->fill_text = fz_text_fill_text; + dev->stroke_text = fz_text_stroke_text; + dev->clip_text = fz_text_clip_text; + dev->clip_stroke_text = fz_text_clip_stroke_text; + dev->ignore_text = fz_text_ignore_text; + return dev; +} diff --git a/contrib/media/updf_newlib/fitz/dev_trace.c b/contrib/media/updf_newlib/fitz/dev_trace.c new file mode 100755 index 000000000..03e05f918 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/dev_trace.c @@ -0,0 +1,305 @@ +#include "fitz.h" + +static void +fz_trace_matrix(fz_matrix ctm) +{ + printf("matrix=\"%g %g %g %g %g %g\" ", + ctm.a, ctm.b, ctm.c, ctm.d, ctm.e, ctm.f); +} + +static void +fz_trace_color(fz_colorspace *colorspace, float *color, float alpha) +{ + int i; + printf("colorspace=\"%s\" color=\"", colorspace->name); + for (i = 0; i < colorspace->n; i++) + printf("%s%g", i == 0 ? "" : " ", color[i]); + printf("\" "); + if (alpha < 1) + printf("alpha=\"%g\" ", alpha); +} + +static void +fz_trace_path(fz_path *path, int indent) +{ + float x, y; + int i = 0; + int n; + while (i < path->len) + { + for (n = 0; n < indent; n++) + putchar(' '); + switch (path->items[i++].k) + { + case FZ_MOVETO: + x = path->items[i++].v; + y = path->items[i++].v; + printf("\n", x, y); + break; + case FZ_LINETO: + x = path->items[i++].v; + y = path->items[i++].v; + printf("\n", x, y); + break; + case FZ_CURVETO: + x = path->items[i++].v; + y = path->items[i++].v; + printf("items[i++].v; + y = path->items[i++].v; + printf("x2=\"%g\" y2=\"%g\" ", x, y); + x = path->items[i++].v; + y = path->items[i++].v; + printf("x3=\"%g\" y3=\"%g\" />\n", x, y); + break; + case FZ_CLOSE_PATH: + printf("\n"); + break; + } + } +} + +static void +fz_trace_fill_path(void *user, fz_path *path, int even_odd, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + printf("\n"); + fz_trace_path(path, 0); + printf("\n"); +} + +static void +fz_trace_stroke_path(void *user, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + int i; + + printf("linewidth); + printf("miterlimit=\"%g\" ", stroke->miterlimit); + printf("linecap=\"%d,%d,%d\" ", stroke->start_cap, stroke->dash_cap, stroke->end_cap); + printf("linejoin=\"%d\" ", stroke->linejoin); + + if (stroke->dash_len) + { + printf("dash_phase=\"%g\" dash=\"", stroke->dash_phase); + for (i = 0; i < stroke->dash_len; i++) + printf("%g ", stroke->dash_list[i]); + printf("\""); + } + + fz_trace_color(colorspace, color, alpha); + fz_trace_matrix(ctm); + printf(">\n"); + + fz_trace_path(path, 0); + + printf("\n"); +} + +static void +fz_trace_clip_path(void *user, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm) +{ + printf("\n", + rect->x0, rect->y0, rect->x1, rect->y1); + fz_trace_path(path, 0); + printf("\n"); +} + +static void +fz_trace_clip_stroke_path(void *user, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm) +{ + printf("\n"); + fz_trace_path(path, 0); + printf("\n"); +} + +static void +fz_trace_fill_text(void *user, fz_text *text, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + printf("font->name, text->wmode); + fz_trace_color(colorspace, color, alpha); + fz_trace_matrix(fz_concat(ctm, text->trm)); + printf(">\n"); + fz_debug_text(text, 0); + printf("\n"); +} + +static void +fz_trace_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + printf("font->name, text->wmode); + fz_trace_color(colorspace, color, alpha); + fz_trace_matrix(fz_concat(ctm, text->trm)); + printf(">\n"); + fz_debug_text(text, 0); + printf("\n"); +} + +static void +fz_trace_clip_text(void *user, fz_text *text, fz_matrix ctm, int accumulate) +{ + printf("font->name, text->wmode); + printf("accumulate=\"%d\" ", accumulate); + fz_trace_matrix(fz_concat(ctm, text->trm)); + printf(">\n"); + fz_debug_text(text, 0); + printf("\n"); +} + +static void +fz_trace_clip_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm) +{ + printf("font->name, text->wmode); + fz_trace_matrix(fz_concat(ctm, text->trm)); + printf(">\n"); + fz_debug_text(text, 0); + printf("\n"); +} + +static void +fz_trace_ignore_text(void *user, fz_text *text, fz_matrix ctm) +{ + printf("font->name, text->wmode); + fz_trace_matrix(fz_concat(ctm, text->trm)); + printf(">\n"); + fz_debug_text(text, 0); + printf("\n"); +} + +static void +fz_trace_fill_image(void *user, fz_pixmap *image, fz_matrix ctm, float alpha) +{ + printf("\n"); +} + +static void +fz_trace_fill_shade(void *user, fz_shade *shade, fz_matrix ctm, float alpha) +{ + printf("\n"); +} + +static void +fz_trace_fill_image_mask(void *user, fz_pixmap *image, fz_matrix ctm, +fz_colorspace *colorspace, float *color, float alpha) +{ + printf("\n"); +} + +static void +fz_trace_clip_image_mask(void *user, fz_pixmap *image, fz_rect *rect, fz_matrix ctm) +{ + printf("\n"); +} + +static void +fz_trace_pop_clip(void *user) +{ + printf("\n"); +} + +static void +fz_trace_begin_mask(void *user, fz_rect bbox, int luminosity, fz_colorspace *colorspace, float *color) +{ + printf("\n"); +} + +static void +fz_trace_end_mask(void *user) +{ + printf("\n"); +} + +static void +fz_trace_begin_group(void *user, fz_rect bbox, int isolated, int knockout, int blendmode, float alpha) +{ + printf("\n", + bbox.x0, bbox.y0, bbox.x1, bbox.y1, + isolated, knockout, fz_blendmode_name(blendmode), alpha); +} + +static void +fz_trace_end_group(void *user) +{ + printf("\n"); +} + +static void +fz_trace_begin_tile(void *user, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm) +{ + printf("\n"); +} + +static void +fz_trace_end_tile(void *user) +{ + printf("\n"); +} + +fz_device *fz_new_trace_device(void) +{ + fz_device *dev = fz_new_device(NULL); + + dev->fill_path = fz_trace_fill_path; + dev->stroke_path = fz_trace_stroke_path; + dev->clip_path = fz_trace_clip_path; + dev->clip_stroke_path = fz_trace_clip_stroke_path; + + dev->fill_text = fz_trace_fill_text; + dev->stroke_text = fz_trace_stroke_text; + dev->clip_text = fz_trace_clip_text; + dev->clip_stroke_text = fz_trace_clip_stroke_text; + dev->ignore_text = fz_trace_ignore_text; + + dev->fill_shade = fz_trace_fill_shade; + dev->fill_image = fz_trace_fill_image; + dev->fill_image_mask = fz_trace_fill_image_mask; + dev->clip_image_mask = fz_trace_clip_image_mask; + + dev->pop_clip = fz_trace_pop_clip; + + dev->begin_mask = fz_trace_begin_mask; + dev->end_mask = fz_trace_end_mask; + dev->begin_group = fz_trace_begin_group; + dev->end_group = fz_trace_end_group; + + dev->begin_tile = fz_trace_begin_tile; + dev->end_tile = fz_trace_end_tile; + + return dev; +} diff --git a/contrib/media/updf_newlib/fitz/filt_basic.c b/contrib/media/updf_newlib/fitz/filt_basic.c new file mode 100755 index 000000000..feb13076b --- /dev/null +++ b/contrib/media/updf_newlib/fitz/filt_basic.c @@ -0,0 +1,504 @@ +#include "fitz.h" + +/* Pretend we have a filter that just copies data forever */ + +fz_stream * +fz_open_copy(fz_stream *chain) +{ + return fz_keep_stream(chain); +} + +/* Null filter copies a specified amount of data */ + +struct null_filter +{ + fz_stream *chain; + int remain; +}; + +static int +read_null(fz_stream *stm, unsigned char *buf, int len) +{ + struct null_filter *state = stm->state; + int amount = MIN(len, state->remain); + int n = fz_read(state->chain, buf, amount); + if (n < 0) + return fz_rethrow(n, "read error in null filter"); + state->remain -= n; + return n; +} + +static void +close_null(fz_stream *stm) +{ + struct null_filter *state = stm->state; + fz_close(state->chain); + fz_free(state); +} + +fz_stream * +fz_open_null(fz_stream *chain, int len) +{ + struct null_filter *state; + + state = fz_malloc(sizeof(struct null_filter)); + state->chain = chain; + state->remain = len; + + return fz_new_stream(state, read_null, close_null); +} + +/* ASCII Hex Decode */ + +typedef struct fz_ahxd_s fz_ahxd; + +struct fz_ahxd_s +{ + fz_stream *chain; + int eod; +}; + +static inline int iswhite(int a) +{ + switch (a) { + case '\n': case '\r': case '\t': case ' ': + case '\0': case '\f': case '\b': case 0177: + return 1; + } + return 0; +} + +static inline int ishex(int a) +{ + return (a >= 'A' && a <= 'F') || + (a >= 'a' && a <= 'f') || + (a >= '0' && a <= '9'); +} + +static inline int unhex(int a) +{ + if (a >= 'A' && a <= 'F') return a - 'A' + 0xA; + if (a >= 'a' && a <= 'f') return a - 'a' + 0xA; + if (a >= '0' && a <= '9') return a - '0'; + return 0; +} + +static int +read_ahxd(fz_stream *stm, unsigned char *buf, int len) +{ + fz_ahxd *state = stm->state; + unsigned char *p = buf; + unsigned char *ep = buf + len; + int a, b, c, odd; + + odd = 0; + + while (p < ep) + { + if (state->eod) + return p - buf; + + c = fz_read_byte(state->chain); + if (c < 0) + return p - buf; + + if (ishex(c)) + { + if (!odd) + { + a = unhex(c); + odd = 1; + } + else + { + b = unhex(c); + *p++ = (a << 4) | b; + odd = 0; + } + } + else if (c == '>') + { + if (odd) + *p++ = (a << 4); + state->eod = 1; + } + else if (!iswhite(c)) + { + return fz_throw("bad data in ahxd: '%c'", c); + } + } + + return p - buf; +} + +static void +close_ahxd(fz_stream *stm) +{ + fz_ahxd *state = stm->state; + fz_close(state->chain); + fz_free(state); +} + +fz_stream * +fz_open_ahxd(fz_stream *chain) +{ + fz_ahxd *state; + + state = fz_malloc(sizeof(fz_ahxd)); + state->chain = chain; + state->eod = 0; + + return fz_new_stream(state, read_ahxd, close_ahxd); +} + +/* ASCII 85 Decode */ + +typedef struct fz_a85d_s fz_a85d; + +struct fz_a85d_s +{ + fz_stream *chain; + unsigned char bp[4]; + unsigned char *rp, *wp; + int eod; +}; + +static int +read_a85d(fz_stream *stm, unsigned char *buf, int len) +{ + fz_a85d *state = stm->state; + unsigned char *p = buf; + unsigned char *ep = buf + len; + int count = 0; + int word = 0; + int c; + + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; + + while (p < ep) + { + if (state->eod) + return p - buf; + + c = fz_read_byte(state->chain); + if (c < 0) + return p - buf; + + if (c >= '!' && c <= 'u') + { + if (count == 4) + { + word = word * 85 + (c - '!'); + + state->bp[0] = (word >> 24) & 0xff; + state->bp[1] = (word >> 16) & 0xff; + state->bp[2] = (word >> 8) & 0xff; + state->bp[3] = (word) & 0xff; + state->rp = state->bp; + state->wp = state->bp + 4; + + word = 0; + count = 0; + } + else + { + word = word * 85 + (c - '!'); + count ++; + } + } + + else if (c == 'z' && count == 0) + { + state->bp[0] = 0; + state->bp[1] = 0; + state->bp[2] = 0; + state->bp[3] = 0; + state->rp = state->bp; + state->wp = state->bp + 4; + } + + else if (c == '~') + { + c = fz_read_byte(state->chain); + if (c != '>') + fz_warn("bad eod marker in a85d"); + + switch (count) { + case 0: + break; + case 1: + return fz_throw("partial final byte in a85d"); + case 2: + word = word * (85 * 85 * 85) + 0xffffff; + state->bp[0] = word >> 24; + state->rp = state->bp; + state->wp = state->bp + 1; + break; + case 3: + word = word * (85 * 85) + 0xffff; + state->bp[0] = word >> 24; + state->bp[1] = word >> 16; + state->rp = state->bp; + state->wp = state->bp + 2; + break; + case 4: + word = word * 85 + 0xff; + state->bp[0] = word >> 24; + state->bp[1] = word >> 16; + state->bp[2] = word >> 8; + state->rp = state->bp; + state->wp = state->bp + 3; + break; + } + state->eod = 1; + } + + else if (!iswhite(c)) + { + return fz_throw("bad data in a85d: '%c'", c); + } + + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; + } + + return p - buf; +} + +static void +close_a85d(fz_stream *stm) +{ + fz_a85d *state = stm->state; + fz_close(state->chain); + fz_free(state); +} + +fz_stream * +fz_open_a85d(fz_stream *chain) +{ + fz_a85d *state; + + state = fz_malloc(sizeof(fz_a85d)); + state->chain = chain; + state->rp = state->bp; + state->wp = state->bp; + state->eod = 0; + + return fz_new_stream(state, read_a85d, close_a85d); +} + +/* Run Length Decode */ + +typedef struct fz_rld_s fz_rld; + +struct fz_rld_s +{ + fz_stream *chain; + int run, n, c; +}; + +static int +read_rld(fz_stream *stm, unsigned char *buf, int len) +{ + fz_rld *state = stm->state; + unsigned char *p = buf; + unsigned char *ep = buf + len; + + while (p < ep) + { + if (state->run == 128) + return p - buf; + + if (state->n == 0) + { + state->run = fz_read_byte(state->chain); + if (state->run < 0) + state->run = 128; + if (state->run < 128) + state->n = state->run + 1; + if (state->run > 128) + { + state->n = 257 - state->run; + state->c = fz_read_byte(state->chain); + if (state->c < 0) + return fz_throw("premature end of data in run length decode"); + } + } + + if (state->run < 128) + { + while (p < ep && state->n) + { + int c = fz_read_byte(state->chain); + if (c < 0) + return fz_throw("premature end of data in run length decode"); + *p++ = c; + state->n--; + } + } + + if (state->run > 128) + { + while (p < ep && state->n) + { + *p++ = state->c; + state->n--; + } + } + } + + return p - buf; +} + +static void +close_rld(fz_stream *stm) +{ + fz_rld *state = stm->state; + fz_close(state->chain); + fz_free(state); +} + +fz_stream * +fz_open_rld(fz_stream *chain) +{ + fz_rld *state; + + state = fz_malloc(sizeof(fz_rld)); + state->chain = chain; + state->run = 0; + state->n = 0; + state->c = 0; + + return fz_new_stream(state, read_rld, close_rld); +} + +/* RC4 Filter */ + +typedef struct fz_arc4c_s fz_arc4c; + +struct fz_arc4c_s +{ + fz_stream *chain; + fz_arc4 arc4; +}; + +static int +read_arc4(fz_stream *stm, unsigned char *buf, int len) +{ + fz_arc4c *state = stm->state; + int n; + + n = fz_read(state->chain, buf, len); + if (n < 0) + return fz_rethrow(n, "read error in arc4 filter"); + + fz_arc4_encrypt(&state->arc4, buf, buf, n); + + return n; +} + +static void +close_arc4(fz_stream *stm) +{ + fz_arc4c *state = stm->state; + fz_close(state->chain); + fz_free(state); +} + +fz_stream * +fz_open_arc4(fz_stream *chain, unsigned char *key, unsigned keylen) +{ + fz_arc4c *state; + + state = fz_malloc(sizeof(fz_arc4c)); + state->chain = chain; + fz_arc4_init(&state->arc4, key, keylen); + + return fz_new_stream(state, read_arc4, close_arc4); +} + +/* AES Filter */ + +typedef struct fz_aesd_s fz_aesd; + +struct fz_aesd_s +{ + fz_stream *chain; + fz_aes aes; + unsigned char iv[16]; + int ivcount; + unsigned char bp[16]; + unsigned char *rp, *wp; +}; + +static int +read_aesd(fz_stream *stm, unsigned char *buf, int len) +{ + fz_aesd *state = stm->state; + unsigned char *p = buf; + unsigned char *ep = buf + len; + + while (state->ivcount < 16) + { + int c = fz_read_byte(state->chain); + if (c < 0) + return fz_throw("premature end in aes filter"); + state->iv[state->ivcount++] = c; + } + + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; + + while (p < ep) + { + int n = fz_read(state->chain, state->bp, 16); + if (n < 0) + return fz_rethrow(n, "read error in aes filter"); + else if (n == 0) + return p - buf; + else if (n < 16) + return fz_throw("partial block in aes filter"); + + aes_crypt_cbc(&state->aes, AES_DECRYPT, 16, state->iv, state->bp, state->bp); + state->rp = state->bp; + state->wp = state->bp + 16; + + /* strip padding at end of file */ + if (fz_is_eof(state->chain)) + { + int pad = state->bp[15]; + if (pad < 1 || pad > 16) + return fz_throw("aes padding out of range: %d", pad); + state->wp -= pad; + } + + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; + } + + return p - buf; +} + +static void +close_aesd(fz_stream *stm) +{ + fz_aesd *state = stm->state; + fz_close(state->chain); + fz_free(state); +} + +fz_stream * +fz_open_aesd(fz_stream *chain, unsigned char *key, unsigned keylen) +{ + fz_aesd *state; + + state = fz_malloc(sizeof(fz_aesd)); + state->chain = chain; + aes_setkey_dec(&state->aes, key, keylen * 8); + state->ivcount = 0; + state->rp = state->bp; + state->wp = state->bp; + + return fz_new_stream(state, read_aesd, close_aesd); +} diff --git a/contrib/media/updf_newlib/fitz/filt_dctd.c b/contrib/media/updf_newlib/fitz/filt_dctd.c new file mode 100755 index 000000000..0e24b794d --- /dev/null +++ b/contrib/media/updf_newlib/fitz/filt_dctd.c @@ -0,0 +1,221 @@ +#include "fitz.h" + +#include +#include + +typedef struct fz_dctd_s fz_dctd; + +struct fz_dctd_s +{ + fz_stream *chain; + int color_transform; + int init; + int stride; + unsigned char *scanline; + unsigned char *rp, *wp; + struct jpeg_decompress_struct cinfo; + struct jpeg_source_mgr srcmgr; + struct jpeg_error_mgr errmgr; + jmp_buf jb; + char msg[JMSG_LENGTH_MAX]; +}; + +static void error_exit(j_common_ptr cinfo) +{ + fz_dctd *state = cinfo->client_data; + cinfo->err->format_message(cinfo, state->msg); + longjmp(state->jb, 1); +} + +static void init_source(j_decompress_ptr cinfo) +{ + /* nothing to do */ +} + +static void term_source(j_decompress_ptr cinfo) +{ + /* nothing to do */ +} + +static boolean fill_input_buffer(j_decompress_ptr cinfo) +{ + struct jpeg_source_mgr *src = cinfo->src; + fz_dctd *state = cinfo->client_data; + fz_stream *chain = state->chain; + + chain->rp = chain->wp; + fz_fill_buffer(chain); + src->next_input_byte = chain->rp; + src->bytes_in_buffer = chain->wp - chain->rp; + + if (src->bytes_in_buffer == 0) + { + static unsigned char eoi[2] = { 0xFF, JPEG_EOI }; + fz_warn("premature end of file in jpeg"); + src->next_input_byte = eoi; + src->bytes_in_buffer = 2; + } + + return 1; +} + +static void skip_input_data(j_decompress_ptr cinfo, long num_bytes) +{ + struct jpeg_source_mgr *src = cinfo->src; + if (num_bytes > 0) + { + while ((size_t)num_bytes > src->bytes_in_buffer) + { + num_bytes -= src->bytes_in_buffer; + (void) src->fill_input_buffer(cinfo); + } + src->next_input_byte += num_bytes; + src->bytes_in_buffer -= num_bytes; + } +} + +static int +read_dctd(fz_stream *stm, unsigned char *buf, int len) +{ + fz_dctd *state = stm->state; + j_decompress_ptr cinfo = &state->cinfo; + unsigned char *p = buf; + unsigned char *ep = buf + len; + + if (setjmp(state->jb)) + { + if (cinfo->src) + state->chain->rp = state->chain->wp - cinfo->src->bytes_in_buffer; + return fz_throw("jpeg error: %s", state->msg); + } + + if (!state->init) + { + cinfo->client_data = state; + cinfo->err = &state->errmgr; + jpeg_std_error(cinfo->err); + cinfo->err->error_exit = error_exit; + jpeg_create_decompress(cinfo); + + cinfo->src = &state->srcmgr; + cinfo->src->init_source = init_source; + cinfo->src->fill_input_buffer = fill_input_buffer; + cinfo->src->skip_input_data = skip_input_data; + cinfo->src->resync_to_restart = jpeg_resync_to_restart; + cinfo->src->term_source = term_source; + cinfo->src->next_input_byte = state->chain->rp; + cinfo->src->bytes_in_buffer = state->chain->wp - state->chain->rp; + + jpeg_read_header(cinfo, 1); + + /* speed up jpeg decoding a bit */ + cinfo->dct_method = JDCT_FASTEST; + cinfo->do_fancy_upsampling = FALSE; + + /* default value if ColorTransform is not set */ + if (state->color_transform == -1) + { + if (state->cinfo.num_components == 3) + state->color_transform = 1; + else + state->color_transform = 0; + } + + if (cinfo->saw_Adobe_marker) + state->color_transform = cinfo->Adobe_transform; + + /* Guess the input colorspace, and set output colorspace accordingly */ + switch (cinfo->num_components) + { + case 3: + if (state->color_transform) + cinfo->jpeg_color_space = JCS_YCbCr; + else + cinfo->jpeg_color_space = JCS_RGB; + break; + case 4: + if (state->color_transform) + cinfo->jpeg_color_space = JCS_YCCK; + else + cinfo->jpeg_color_space = JCS_CMYK; + break; + } + + jpeg_start_decompress(cinfo); + + state->stride = cinfo->output_width * cinfo->output_components; + state->scanline = fz_malloc(state->stride); + state->rp = state->scanline; + state->wp = state->scanline; + + state->init = 1; + } + + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; + + while (p < ep) + { + if (cinfo->output_scanline == cinfo->output_height) + break; + + if (p + state->stride <= ep) + { + jpeg_read_scanlines(cinfo, &p, 1); + p += state->stride; + } + else + { + jpeg_read_scanlines(cinfo, &state->scanline, 1); + state->rp = state->scanline; + state->wp = state->scanline + state->stride; + } + + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; + } + + return p - buf; +} + +static void +close_dctd(fz_stream *stm) +{ + fz_dctd *state = stm->state; + + if (setjmp(state->jb)) + { + state->chain->rp = state->chain->wp - state->cinfo.src->bytes_in_buffer; + fz_warn("jpeg error: %s", state->msg); + goto skip; + } + + if (state->init) + jpeg_finish_decompress(&state->cinfo); + +skip: + state->chain->rp = state->chain->wp - state->cinfo.src->bytes_in_buffer; + jpeg_destroy_decompress(&state->cinfo); + fz_free(state->scanline); + fz_close(state->chain); + fz_free(state); +} + +fz_stream * +fz_open_dctd(fz_stream *chain, fz_obj *params) +{ + fz_dctd *state; + fz_obj *obj; + + state = fz_malloc(sizeof(fz_dctd)); + memset(state, 0, sizeof(fz_dctd)); + state->chain = chain; + state->color_transform = -1; /* unset */ + state->init = 0; + + obj = fz_dict_gets(params, "ColorTransform"); + if (obj) + state->color_transform = fz_to_int(obj); + + return fz_new_stream(state, read_dctd, close_dctd); +} diff --git a/contrib/media/updf_newlib/fitz/filt_faxd.c b/contrib/media/updf_newlib/fitz/filt_faxd.c new file mode 100755 index 000000000..dcf56cf3e --- /dev/null +++ b/contrib/media/updf_newlib/fitz/filt_faxd.c @@ -0,0 +1,731 @@ +#include "fitz.h" + +/* Fax G3/G4 decoder */ + +/* TODO: uncompressed */ + +/* + the first 2^(initialbits) entries map bit patterns to decodes + let's say initial_bits is 8 for the sake of example + and that the code is 1001 + that means that entries 0x90 .. 0x9f have the entry { val, 4 } + because those are all the bytes that start with the code + and the 4 is the length of the code +... if (n_bits > initial_bits) ... + anyway, in that case, it basically points to a mini table + the n_bits is the maximum length of all codes beginning with that byte + so 2^(n_bits - initial_bits) is the size of the mini-table + peter came up with this, and it makes sense +*/ + +typedef struct cfd_node_s cfd_node; + +struct cfd_node_s +{ + short val; + short nbits; +}; + +enum +{ + cfd_white_initial_bits = 8, + cfd_black_initial_bits = 7, + cfd_2d_initial_bits = 7, + cfd_uncompressed_initial_bits = 6 /* must be 6 */ +}; + +/* non-run codes in tables */ +enum +{ + ERROR = -1, + ZEROS = -2, /* EOL follows, possibly with more padding first */ + UNCOMPRESSED = -3 +}; + +/* semantic codes for cf_2d_decode */ +enum +{ + P = -4, + H = -5, + VR3 = 0, + VR2 = 1, + VR1 = 2, + V0 = 3, + VL1 = 4, + VL2 = 5, + VL3 = 6 +}; + +/* White decoding table. */ +const cfd_node cf_white_decode[] = { + {256,12},{272,12},{29,8},{30,8},{45,8},{46,8},{22,7},{22,7}, + {23,7},{23,7},{47,8},{48,8},{13,6},{13,6},{13,6},{13,6},{20,7}, + {20,7},{33,8},{34,8},{35,8},{36,8},{37,8},{38,8},{19,7},{19,7}, + {31,8},{32,8},{1,6},{1,6},{1,6},{1,6},{12,6},{12,6},{12,6},{12,6}, + {53,8},{54,8},{26,7},{26,7},{39,8},{40,8},{41,8},{42,8},{43,8}, + {44,8},{21,7},{21,7},{28,7},{28,7},{61,8},{62,8},{63,8},{0,8}, + {320,8},{384,8},{10,5},{10,5},{10,5},{10,5},{10,5},{10,5},{10,5}, + {10,5},{11,5},{11,5},{11,5},{11,5},{11,5},{11,5},{11,5},{11,5}, + {27,7},{27,7},{59,8},{60,8},{288,9},{290,9},{18,7},{18,7},{24,7}, + {24,7},{49,8},{50,8},{51,8},{52,8},{25,7},{25,7},{55,8},{56,8}, + {57,8},{58,8},{192,6},{192,6},{192,6},{192,6},{1664,6},{1664,6}, + {1664,6},{1664,6},{448,8},{512,8},{292,9},{640,8},{576,8},{294,9}, + {296,9},{298,9},{300,9},{302,9},{256,7},{256,7},{2,4},{2,4},{2,4}, + {2,4},{2,4},{2,4},{2,4},{2,4},{2,4},{2,4},{2,4},{2,4},{2,4},{2,4}, + {2,4},{2,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4}, + {3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{128,5},{128,5},{128,5}, + {128,5},{128,5},{128,5},{128,5},{128,5},{8,5},{8,5},{8,5},{8,5}, + {8,5},{8,5},{8,5},{8,5},{9,5},{9,5},{9,5},{9,5},{9,5},{9,5},{9,5}, + {9,5},{16,6},{16,6},{16,6},{16,6},{17,6},{17,6},{17,6},{17,6}, + {4,4},{4,4},{4,4},{4,4},{4,4},{4,4},{4,4},{4,4},{4,4},{4,4},{4,4}, + {4,4},{4,4},{4,4},{4,4},{4,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4}, + {5,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4}, + {14,6},{14,6},{14,6},{14,6},{15,6},{15,6},{15,6},{15,6},{64,5}, + {64,5},{64,5},{64,5},{64,5},{64,5},{64,5},{64,5},{6,4},{6,4}, + {6,4},{6,4},{6,4},{6,4},{6,4},{6,4},{6,4},{6,4},{6,4},{6,4},{6,4}, + {6,4},{6,4},{6,4},{7,4},{7,4},{7,4},{7,4},{7,4},{7,4},{7,4},{7,4}, + {7,4},{7,4},{7,4},{7,4},{7,4},{7,4},{7,4},{7,4},{-2,3},{-2,3}, + {-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}, + {-1,0},{-1,0},{-1,0},{-1,0},{-3,4},{1792,3},{1792,3},{1984,4}, + {2048,4},{2112,4},{2176,4},{2240,4},{2304,4},{1856,3},{1856,3}, + {1920,3},{1920,3},{2368,4},{2432,4},{2496,4},{2560,4},{1472,1}, + {1536,1},{1600,1},{1728,1},{704,1},{768,1},{832,1},{896,1}, + {960,1},{1024,1},{1088,1},{1152,1},{1216,1},{1280,1},{1344,1}, + {1408,1} +}; + +/* Black decoding table. */ +const cfd_node cf_black_decode[] = { + {128,12},{160,13},{224,12},{256,12},{10,7},{11,7},{288,12},{12,7}, + {9,6},{9,6},{8,6},{8,6},{7,5},{7,5},{7,5},{7,5},{6,4},{6,4},{6,4}, + {6,4},{6,4},{6,4},{6,4},{6,4},{5,4},{5,4},{5,4},{5,4},{5,4},{5,4}, + {5,4},{5,4},{1,3},{1,3},{1,3},{1,3},{1,3},{1,3},{1,3},{1,3},{1,3}, + {1,3},{1,3},{1,3},{1,3},{1,3},{1,3},{1,3},{4,3},{4,3},{4,3},{4,3}, + {4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3}, + {4,3},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2}, + {3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2}, + {3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2},{3,2}, + {2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2}, + {2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2}, + {2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2},{2,2}, + {-2,4},{-2,4},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}, + {-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-3,5},{1792,4}, + {1792,4},{1984,5},{2048,5},{2112,5},{2176,5},{2240,5},{2304,5}, + {1856,4},{1856,4},{1920,4},{1920,4},{2368,5},{2432,5},{2496,5}, + {2560,5},{18,3},{18,3},{18,3},{18,3},{18,3},{18,3},{18,3},{18,3}, + {52,5},{52,5},{640,6},{704,6},{768,6},{832,6},{55,5},{55,5}, + {56,5},{56,5},{1280,6},{1344,6},{1408,6},{1472,6},{59,5},{59,5}, + {60,5},{60,5},{1536,6},{1600,6},{24,4},{24,4},{24,4},{24,4}, + {25,4},{25,4},{25,4},{25,4},{1664,6},{1728,6},{320,5},{320,5}, + {384,5},{384,5},{448,5},{448,5},{512,6},{576,6},{53,5},{53,5}, + {54,5},{54,5},{896,6},{960,6},{1024,6},{1088,6},{1152,6},{1216,6}, + {64,3},{64,3},{64,3},{64,3},{64,3},{64,3},{64,3},{64,3},{13,1}, + {13,1},{13,1},{13,1},{13,1},{13,1},{13,1},{13,1},{13,1},{13,1}, + {13,1},{13,1},{13,1},{13,1},{13,1},{13,1},{23,4},{23,4},{50,5}, + {51,5},{44,5},{45,5},{46,5},{47,5},{57,5},{58,5},{61,5},{256,5}, + {16,3},{16,3},{16,3},{16,3},{17,3},{17,3},{17,3},{17,3},{48,5}, + {49,5},{62,5},{63,5},{30,5},{31,5},{32,5},{33,5},{40,5},{41,5}, + {22,4},{22,4},{14,1},{14,1},{14,1},{14,1},{14,1},{14,1},{14,1}, + {14,1},{14,1},{14,1},{14,1},{14,1},{14,1},{14,1},{14,1},{14,1}, + {15,2},{15,2},{15,2},{15,2},{15,2},{15,2},{15,2},{15,2},{128,5}, + {192,5},{26,5},{27,5},{28,5},{29,5},{19,4},{19,4},{20,4},{20,4}, + {34,5},{35,5},{36,5},{37,5},{38,5},{39,5},{21,4},{21,4},{42,5}, + {43,5},{0,3},{0,3},{0,3},{0,3} +}; + +/* 2-D decoding table. */ +const cfd_node cf_2d_decode[] = { + {128,11},{144,10},{6,7},{0,7},{5,6},{5,6},{1,6},{1,6},{-4,4}, + {-4,4},{-4,4},{-4,4},{-4,4},{-4,4},{-4,4},{-4,4},{-5,3},{-5,3}, + {-5,3},{-5,3},{-5,3},{-5,3},{-5,3},{-5,3},{-5,3},{-5,3},{-5,3}, + {-5,3},{-5,3},{-5,3},{-5,3},{-5,3},{4,3},{4,3},{4,3},{4,3},{4,3}, + {4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3},{4,3}, + {2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{2,3}, + {2,3},{2,3},{2,3},{2,3},{2,3},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1}, + {3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1}, + {3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1}, + {3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1}, + {3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1}, + {3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1}, + {3,1},{3,1},{3,1},{-2,4},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}, + {-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}, + {-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-3,3} +}; + +/* Uncompresssed decoding table. */ +const cfd_node cf_uncompressed_decode[] = { + {64,12},{5,6},{4,5},{4,5},{3,4},{3,4},{3,4},{3,4},{2,3},{2,3}, + {2,3},{2,3},{2,3},{2,3},{2,3},{2,3},{1,2},{1,2},{1,2},{1,2},{1,2}, + {1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2}, + {0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1}, + {0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1}, + {0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1}, + {-1,0},{-1,0},{8,6},{9,6},{6,5},{6,5},{7,5},{7,5},{4,4},{4,4}, + {4,4},{4,4},{5,4},{5,4},{5,4},{5,4},{2,3},{2,3},{2,3},{2,3},{2,3}, + {2,3},{2,3},{2,3},{3,3},{3,3},{3,3},{3,3},{3,3},{3,3},{3,3},{3,3}, + {0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}, + {0,2},{0,2},{0,2},{0,2},{0,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2}, + {1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2},{1,2} +}; + +/* bit magic */ + +static inline int getbit(const unsigned char *buf, int x) +{ + return ( buf[x >> 3] >> ( 7 - (x & 7) ) ) & 1; +} + +static int +find_changing(const unsigned char *line, int x, int w) +{ + int a, b; + + if (!line) + return w; + + if (x == -1) + { + a = 0; + x = 0; + } + else + { + a = getbit(line, x); + x++; + } + + while (x < w) + { + b = getbit(line, x); + if (a != b) + break; + x++; + } + + return x; +} + +static int +find_changing_color(const unsigned char *line, int x, int w, int color) +{ + if (!line) + return w; + + x = find_changing(line, x, w); + + if (x < w && getbit(line, x) != color) + x = find_changing(line, x, w); + + return x; +} + +static const unsigned char lm[8] = { + 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01 +}; + +static const unsigned char rm[8] = { + 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE +}; + +static inline void setbits(unsigned char *line, int x0, int x1) +{ + int a0, a1, b0, b1, a; + + a0 = x0 >> 3; + a1 = x1 >> 3; + + b0 = x0 & 7; + b1 = x1 & 7; + + if (a0 == a1) + { + if (b1) + line[a0] |= lm[b0] & rm[b1]; + } + else + { + line[a0] |= lm[b0]; + for (a = a0 + 1; a < a1; a++) + line[a] = 0xFF; + if (b1) + line[a1] |= rm[b1]; + } +} + +typedef struct fz_faxd_s fz_faxd; + +enum +{ + STATE_NORMAL, /* neutral state, waiting for any code */ + STATE_MAKEUP, /* got a 1d makeup code, waiting for terminating code */ + STATE_EOL, /* at eol, needs output buffer space */ + STATE_H1, STATE_H2, /* in H part 1 and 2 (both makeup and terminating codes) */ + STATE_DONE /* all done */ +}; + +struct fz_faxd_s +{ + fz_stream *chain; + + int k; + int end_of_line; + int encoded_byte_align; + int columns; + int rows; + int end_of_block; + int black_is_1; + + int stride; + int ridx; + + int bidx; + unsigned int word; + + int stage; + + int a, c, dim, eolc; + unsigned char *ref; + unsigned char *dst; + unsigned char *rp, *wp; +}; + +static inline void eat_bits(fz_faxd *fax, int nbits) +{ + fax->word <<= nbits; + fax->bidx += nbits; +} + +static int +fill_bits(fz_faxd *fax) +{ + while (fax->bidx >= 8) + { + int c = fz_read_byte(fax->chain); + if (c == EOF) + return EOF; + fax->bidx -= 8; + fax->word |= c << fax->bidx; + } + return 0; +} + +static int +get_code(fz_faxd *fax, const cfd_node *table, int initialbits) +{ + unsigned int word = fax->word; + int tidx = word >> (32 - initialbits); + int val = table[tidx].val; + int nbits = table[tidx].nbits; + + if (nbits > initialbits) + { + int mask = (1 << (32 - initialbits)) - 1; + tidx = val + ((word & mask) >> (32 - nbits)); + val = table[tidx].val; + nbits = initialbits + table[tidx].nbits; + } + + eat_bits(fax, nbits); + + return val; +} + +/* decode one 1d code */ +static fz_error +dec1d(fz_faxd *fax) +{ + int code; + + if (fax->a == -1) + fax->a = 0; + + if (fax->c) + code = get_code(fax, cf_black_decode, cfd_black_initial_bits); + else + code = get_code(fax, cf_white_decode, cfd_white_initial_bits); + + if (code == UNCOMPRESSED) + return fz_throw("uncompressed data in faxd"); + + if (code < 0) + return fz_throw("negative code in 1d faxd"); + + if (fax->a + code > fax->columns) + return fz_throw("overflow in 1d faxd"); + + if (fax->c) + setbits(fax->dst, fax->a, fax->a + code); + + fax->a += code; + + if (code < 64) + { + fax->c = !fax->c; + fax->stage = STATE_NORMAL; + } + else + fax->stage = STATE_MAKEUP; + + return fz_okay; +} + +/* decode one 2d code */ +static fz_error +dec2d(fz_faxd *fax) +{ + int code, b1, b2; + + if (fax->stage == STATE_H1 || fax->stage == STATE_H2) + { + if (fax->a == -1) + fax->a = 0; + + if (fax->c) + code = get_code(fax, cf_black_decode, cfd_black_initial_bits); + else + code = get_code(fax, cf_white_decode, cfd_white_initial_bits); + + if (code == UNCOMPRESSED) + return fz_throw("uncompressed data in faxd"); + + if (code < 0) + return fz_throw("negative code in 2d faxd"); + + if (fax->a + code > fax->columns) + return fz_throw("overflow in 2d faxd"); + + if (fax->c) + setbits(fax->dst, fax->a, fax->a + code); + + fax->a += code; + + if (code < 64) + { + fax->c = !fax->c; + if (fax->stage == STATE_H1) + fax->stage = STATE_H2; + else if (fax->stage == STATE_H2) + fax->stage = STATE_NORMAL; + } + + return fz_okay; + } + + code = get_code(fax, cf_2d_decode, cfd_2d_initial_bits); + + switch (code) + { + case H: + fax->stage = STATE_H1; + break; + + case P: + b1 = find_changing_color(fax->ref, fax->a, fax->columns, !fax->c); + if (b1 >= fax->columns) + b2 = fax->columns; + else + b2 = find_changing(fax->ref, b1, fax->columns); + if (fax->c) setbits(fax->dst, fax->a, b2); + fax->a = b2; + break; + + case V0: + b1 = find_changing_color(fax->ref, fax->a, fax->columns, !fax->c); + if (fax->c) setbits(fax->dst, fax->a, b1); + fax->a = b1; + fax->c = !fax->c; + break; + + case VR1: + b1 = 1 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c); + if (b1 >= fax->columns) b1 = fax->columns; + if (fax->c) setbits(fax->dst, fax->a, b1); + fax->a = b1; + fax->c = !fax->c; + break; + + case VR2: + b1 = 2 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c); + if (b1 >= fax->columns) b1 = fax->columns; + if (fax->c) setbits(fax->dst, fax->a, b1); + fax->a = b1; + fax->c = !fax->c; + break; + + case VR3: + b1 = 3 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c); + if (b1 >= fax->columns) b1 = fax->columns; + if (fax->c) setbits(fax->dst, fax->a, b1); + fax->a = b1; + fax->c = !fax->c; + break; + + case VL1: + b1 = -1 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c); + if (b1 < 0) b1 = 0; + if (fax->c) setbits(fax->dst, fax->a, b1); + fax->a = b1; + fax->c = !fax->c; + break; + + case VL2: + b1 = -2 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c); + if (b1 < 0) b1 = 0; + if (fax->c) setbits(fax->dst, fax->a, b1); + fax->a = b1; + fax->c = !fax->c; + break; + + case VL3: + b1 = -3 + find_changing_color(fax->ref, fax->a, fax->columns, !fax->c); + if (b1 < 0) b1 = 0; + if (fax->c) setbits(fax->dst, fax->a, b1); + fax->a = b1; + fax->c = !fax->c; + break; + + case UNCOMPRESSED: + return fz_throw("uncompressed data in faxd"); + + case ERROR: + return fz_throw("invalid code in 2d faxd"); + + default: + return fz_throw("invalid code in 2d faxd (%d)", code); + } + + return 0; +} + +static int +read_faxd(fz_stream *stm, unsigned char *buf, int len) +{ + fz_faxd *fax = stm->state; + unsigned char *p = buf; + unsigned char *ep = buf + len; + unsigned char *tmp; + fz_error error; + + if (fax->stage == STATE_DONE) + return 0; + + if (fax->stage == STATE_EOL) + goto eol; + +loop: + + if (fill_bits(fax)) + { + if (fax->bidx > 31) + { + if (fax->a > 0) + goto eol; + goto rtc; + } + } + + if ((fax->word >> (32 - 12)) == 0) + { + eat_bits(fax, 1); + goto loop; + } + + if ((fax->word >> (32 - 12)) == 1) + { + eat_bits(fax, 12); + fax->eolc ++; + + if (fax->k > 0) + { + if (fax->a == -1) + fax->a = 0; + if ((fax->word >> (32 - 1)) == 1) + fax->dim = 1; + else + fax->dim = 2; + eat_bits(fax, 1); + } + } + else if (fax->k > 0 && fax->a == -1) + { + fax->a = 0; + if ((fax->word >> (32 - 1)) == 1) + fax->dim = 1; + else + fax->dim = 2; + eat_bits(fax, 1); + } + else if (fax->dim == 1) + { + fax->eolc = 0; + error = dec1d(fax); + if (error) + return fz_rethrow(error, "cannot decode 1d code"); + } + else if (fax->dim == 2) + { + fax->eolc = 0; + error = dec2d(fax); + if (error) + return fz_rethrow(error, "cannot decode 2d code"); + } + + /* no eol check after makeup codes nor in the middle of an H code */ + if (fax->stage == STATE_MAKEUP || fax->stage == STATE_H1 || fax->stage == STATE_H2) + goto loop; + + /* check for eol conditions */ + if (fax->eolc || fax->a >= fax->columns) + { + if (fax->a > 0) + goto eol; + if (fax->eolc == (fax->k < 0 ? 2 : 6)) + goto rtc; + } + + goto loop; + +eol: + fax->stage = STATE_EOL; + + if (fax->black_is_1) + { + while (fax->rp < fax->wp && p < ep) + *p++ = *fax->rp++; + } + else + { + while (fax->rp < fax->wp && p < ep) + *p++ = *fax->rp++ ^ 0xff; + } + + if (fax->rp < fax->wp) + return p - buf; + + tmp = fax->ref; + fax->ref = fax->dst; + fax->dst = tmp; + memset(fax->dst, 0, fax->stride); + + fax->rp = fax->dst; + fax->wp = fax->dst + fax->stride; + + fax->stage = STATE_NORMAL; + fax->c = 0; + fax->a = -1; + fax->ridx ++; + + if (!fax->end_of_block && fax->rows) + { + if (fax->ridx >= fax->rows) + goto rtc; + } + + /* we have not read dim from eol, make a guess */ + if (fax->k > 0 && !fax->eolc && fax->a == -1) + { + if (fax->ridx % fax->k == 0) + fax->dim = 1; + else + fax->dim = 2; + } + + /* if end_of_line & encoded_byte_align, EOLs are *not* optional */ + if (fax->encoded_byte_align) + { + if (fax->end_of_line) + eat_bits(fax, (12 - fax->bidx) & 7); + else + eat_bits(fax, (8 - fax->bidx) & 7); + } + + /* no more space in output, don't decode the next row yet */ + if (p == buf + len) + return p - buf; + + goto loop; + +rtc: + fax->stage = STATE_DONE; + return p - buf; +} + +static void +close_faxd(fz_stream *stm) +{ + fz_faxd *fax = stm->state; + int i; + + /* if we read any extra bytes, try to put them back */ + i = (32 - fax->bidx) / 8; + while (i--) + fz_unread_byte(fax->chain); + + fz_close(fax->chain); + fz_free(fax->ref); + fz_free(fax->dst); + fz_free(fax); +} + +fz_stream * +fz_open_faxd(fz_stream *chain, fz_obj *params) +{ + fz_faxd *fax; + fz_obj *obj; + + fax = fz_malloc(sizeof(fz_faxd)); + fax->chain = chain; + + fax->ref = NULL; + fax->dst = NULL; + + fax->k = 0; + fax->end_of_line = 0; + fax->encoded_byte_align = 0; + fax->columns = 1728; + fax->rows = 0; + fax->end_of_block = 1; + fax->black_is_1 = 0; + + obj = fz_dict_gets(params, "K"); + if (obj) fax->k = fz_to_int(obj); + + obj = fz_dict_gets(params, "EndOfLine"); + if (obj) fax->end_of_line = fz_to_bool(obj); + + obj = fz_dict_gets(params, "EncodedByteAlign"); + if (obj) fax->encoded_byte_align = fz_to_bool(obj); + + obj = fz_dict_gets(params, "Columns"); + if (obj) fax->columns = fz_to_int(obj); + + obj = fz_dict_gets(params, "Rows"); + if (obj) fax->rows = fz_to_int(obj); + + obj = fz_dict_gets(params, "EndOfBlock"); + if (obj) fax->end_of_block = fz_to_bool(obj); + + obj = fz_dict_gets(params, "BlackIs1"); + if (obj) fax->black_is_1 = fz_to_bool(obj); + + fax->stride = ((fax->columns - 1) >> 3) + 1; + fax->ridx = 0; + fax->bidx = 32; + fax->word = 0; + + fax->stage = STATE_NORMAL; + fax->a = -1; + fax->c = 0; + fax->dim = fax->k < 0 ? 2 : 1; + fax->eolc = 0; + + fax->ref = fz_malloc(fax->stride); + fax->dst = fz_malloc(fax->stride); + fax->rp = fax->dst; + fax->wp = fax->dst + fax->stride; + + memset(fax->ref, 0, fax->stride); + memset(fax->dst, 0, fax->stride); + + return fz_new_stream(fax, read_faxd, close_faxd); +} diff --git a/contrib/media/updf_newlib/fitz/filt_flate.c b/contrib/media/updf_newlib/fitz/filt_flate.c new file mode 100755 index 000000000..e7d4c9f7a --- /dev/null +++ b/contrib/media/updf_newlib/fitz/filt_flate.c @@ -0,0 +1,103 @@ +#include "fitz.h" + +#include + +typedef struct fz_flate_s fz_flate; + +struct fz_flate_s +{ + fz_stream *chain; + z_stream z; +}; + +static void *zalloc(void *opaque, unsigned int items, unsigned int size) +{ + return fz_calloc(items, size); +} + +static void zfree(void *opaque, void *ptr) +{ + fz_free(ptr); +} + +static int +read_flated(fz_stream *stm, unsigned char *outbuf, int outlen) +{ + fz_flate *state = stm->state; + fz_stream *chain = state->chain; + z_streamp zp = &state->z; + int code; + + zp->next_out = outbuf; + zp->avail_out = outlen; + + while (zp->avail_out > 0) + { + if (chain->rp == chain->wp) + fz_fill_buffer(chain); + + zp->next_in = chain->rp; + zp->avail_in = chain->wp - chain->rp; + + code = inflate(zp, Z_SYNC_FLUSH); + + chain->rp = chain->wp - zp->avail_in; + + if (code == Z_STREAM_END) + { + return outlen - zp->avail_out; + } + else if (code == Z_BUF_ERROR) + { + fz_warn("premature end of data in flate filter"); + return outlen - zp->avail_out; + } + else if (code == Z_DATA_ERROR && zp->avail_in == 0) + { + fz_warn("ignoring zlib error: %s", zp->msg); + return outlen - zp->avail_out; + } + else if (code != Z_OK) + { + return fz_throw("zlib error: %s", zp->msg); + } + } + + return outlen - zp->avail_out; +} + +static void +close_flated(fz_stream *stm) +{ + fz_flate *state = stm->state; + int code; + + code = inflateEnd(&state->z); + if (code != Z_OK) + fz_warn("zlib error: inflateEnd: %s", state->z.msg); + + fz_close(state->chain); + fz_free(state); +} + +fz_stream * +fz_open_flated(fz_stream *chain) +{ + fz_flate *state; + int code; + + state = fz_malloc(sizeof(fz_flate)); + state->chain = chain; + + state->z.zalloc = zalloc; + state->z.zfree = zfree; + state->z.opaque = NULL; + state->z.next_in = NULL; + state->z.avail_in = 0; + + code = inflateInit(&state->z); + if (code != Z_OK) + fz_warn("zlib error: inflateInit: %s", state->z.msg); + + return fz_new_stream(state, read_flated, close_flated); +} diff --git a/contrib/media/updf_newlib/fitz/filt_jbig2d.c b/contrib/media/updf_newlib/fitz/filt_jbig2d.c new file mode 100755 index 000000000..4dbe542c5 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/filt_jbig2d.c @@ -0,0 +1,103 @@ +#include "fitz.h" + +#ifdef _WIN32 /* Microsoft Visual C++ */ + +typedef signed char int8_t; +typedef short int int16_t; +typedef int int32_t; +typedef __int64 int64_t; + +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned int uint32_t; + +#else +#include +#endif + +#include + +typedef struct fz_jbig2d_s fz_jbig2d; + +struct fz_jbig2d_s +{ + fz_stream *chain; + Jbig2Ctx *ctx; + Jbig2GlobalCtx *gctx; + Jbig2Image *page; + int idx; +}; + +static void +close_jbig2d(fz_stream *stm) +{ + fz_jbig2d *state = stm->state; + if (state->page) + jbig2_release_page(state->ctx, state->page); + if (state->gctx) + jbig2_global_ctx_free(state->gctx); + jbig2_ctx_free(state->ctx); + fz_close(state->chain); + fz_free(state); +} + +static int +read_jbig2d(fz_stream *stm, unsigned char *buf, int len) +{ + fz_jbig2d *state = stm->state; + unsigned char tmp[4096]; + unsigned char *p = buf; + unsigned char *ep = buf + len; + unsigned char *s; + int x, w, n; + + if (!state->page) + { + while (1) + { + n = fz_read(state->chain, tmp, sizeof tmp); + if (n < 0) + return fz_rethrow(n, "read error in jbig2 filter"); + if (n == 0) + break; + jbig2_data_in(state->ctx, tmp, n); + } + + jbig2_complete_page(state->ctx); + + state->page = jbig2_page_out(state->ctx); + if (!state->page) + return fz_throw("jbig2_page_out failed"); + } + + s = state->page->data; + w = state->page->height * state->page->stride; + x = state->idx; + while (p < ep && x < w) + *p++ = s[x++] ^ 0xff; + state->idx = x; + + return p - buf; +} + +fz_stream * +fz_open_jbig2d(fz_stream *chain, fz_buffer *globals) +{ + fz_jbig2d *state; + + state = fz_malloc(sizeof(fz_jbig2d)); + state->chain = chain; + state->ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, NULL, NULL, NULL); + state->gctx = NULL; + state->page = NULL; + state->idx = 0; + + if (globals) + { + jbig2_data_in(state->ctx, globals->data, globals->len); + state->gctx = jbig2_make_global_ctx(state->ctx); + state->ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, state->gctx, NULL, NULL); + } + + return fz_new_stream(state, read_jbig2d, close_jbig2d); +} diff --git a/contrib/media/updf_newlib/fitz/filt_jpxd.c b/contrib/media/updf_newlib/fitz/filt_jpxd.c new file mode 100755 index 000000000..765aad297 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/filt_jpxd.c @@ -0,0 +1,153 @@ +#include "fitz.h" + +#define OPJ_STATIC +#include + +static void fz_opj_error_callback(const char *msg, void *client_data) +{ + fprintf(stderr, "openjpeg error: %s", msg); +} + +static void fz_opj_warning_callback(const char *msg, void *client_data) +{ + fprintf(stderr, "openjpeg warning: %s", msg); +} + +static void fz_opj_info_callback(const char *msg, void *client_data) +{ + /* fprintf(stderr, "openjpeg info: %s", msg); */ +} + +fz_error +fz_load_jpx_image(fz_pixmap **imgp, unsigned char *data, int size, fz_colorspace *defcs) +{ + fz_pixmap *img; + opj_event_mgr_t evtmgr; + opj_dparameters_t params; + opj_dinfo_t *info; + opj_cio_t *cio; + opj_image_t *jpx; + fz_colorspace *colorspace; + unsigned char *p; + int format; + int a, n, w, h, depth, sgnd; + int x, y, k, v; + + if (size < 2) + return fz_throw("not enough data to determine image format"); + + /* Check for SOC marker -- if found we have a bare J2K stream */ + if (data[0] == 0xFF && data[1] == 0x4F) + format = CODEC_J2K; + else + format = CODEC_JP2; + + memset(&evtmgr, 0, sizeof(evtmgr)); + evtmgr.error_handler = fz_opj_error_callback; + evtmgr.warning_handler = fz_opj_warning_callback; + evtmgr.info_handler = fz_opj_info_callback; + + opj_set_default_decoder_parameters(¶ms); + + info = opj_create_decompress(format); + opj_set_event_mgr((opj_common_ptr)info, &evtmgr, stderr); + opj_setup_decoder(info, ¶ms); + + cio = opj_cio_open((opj_common_ptr)info, data, size); + + jpx = opj_decode(info, cio); + + opj_cio_close(cio); + opj_destroy_decompress(info); + + if (!jpx) + return fz_throw("opj_decode failed"); + + for (k = 1; k < jpx->numcomps; k++) + { + if (jpx->comps[k].w != jpx->comps[0].w) + return fz_throw("image components have different width"); + if (jpx->comps[k].h != jpx->comps[0].h) + return fz_throw("image components have different height"); + if (jpx->comps[k].prec != jpx->comps[0].prec) + return fz_throw("image components have different precision"); + } + + n = jpx->numcomps; + w = jpx->comps[0].w; + h = jpx->comps[0].h; + depth = jpx->comps[0].prec; + sgnd = jpx->comps[0].sgnd; + + if (jpx->color_space == CLRSPC_SRGB && n == 4) { n = 3; a = 1; } + else if (jpx->color_space == CLRSPC_SYCC && n == 4) { n = 3; a = 1; } + else if (n == 2) { n = 1; a = 1; } + else if (n > 4) { n = 4; a = 1; } + else { a = 0; } + + if (defcs) + { + if (defcs->n == n) + { + colorspace = defcs; + } + else + { + fz_warn("jpx file and dict colorspaces do not match"); + defcs = NULL; + } + } + + if (!defcs) + { + switch (n) + { + case 1: colorspace = fz_device_gray; break; + case 3: colorspace = fz_device_rgb; break; + case 4: colorspace = fz_device_cmyk; break; + } + } + + img = fz_new_pixmap_with_limit(colorspace, w, h); + if (!img) + { + opj_image_destroy(jpx); + return fz_throw("out of memory"); + } + + p = img->samples; + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + for (k = 0; k < n + a; k++) + { + v = jpx->comps[k].data[y * w + x]; + if (sgnd) + v = v + (1 << (depth - 1)); + if (depth > 8) + v = v >> (depth - 8); + *p++ = v; + } + if (!a) + *p++ = 255; + } + } + + if (a) + { + if (n == 4) + { + fz_pixmap *tmp = fz_new_pixmap(fz_device_rgb, w, h); + fz_convert_pixmap(img, tmp); + fz_drop_pixmap(img); + img = tmp; + } + fz_premultiply_pixmap(img); + } + + opj_image_destroy(jpx); + + *imgp = img; + return fz_okay; +} diff --git a/contrib/media/updf_newlib/fitz/filt_lzwd.c b/contrib/media/updf_newlib/fitz/filt_lzwd.c new file mode 100755 index 000000000..942e5837d --- /dev/null +++ b/contrib/media/updf_newlib/fitz/filt_lzwd.c @@ -0,0 +1,206 @@ +#include "fitz.h" + +/* TODO: error checking */ + +enum +{ + MIN_BITS = 9, + MAX_BITS = 12, + NUM_CODES = (1 << MAX_BITS), + LZW_CLEAR = 256, + LZW_EOD = 257, + LZW_FIRST = 258, + MAX_LENGTH = 4097 +}; + +typedef struct lzw_code_s lzw_code; + +struct lzw_code_s +{ + int prev; /* prev code (in string) */ + unsigned short length; /* string len, including this token */ + unsigned char value; /* data value */ + unsigned char first_char; /* first token of string */ +}; + +typedef struct fz_lzwd_s fz_lzwd; + +struct fz_lzwd_s +{ + fz_stream *chain; + int eod; + + int early_change; + + int code_bits; /* num bits/code */ + int code; /* current code */ + int old_code; /* previously recognized code */ + int next_code; /* next free entry */ + + lzw_code table[NUM_CODES]; + + unsigned char bp[MAX_LENGTH]; + unsigned char *rp, *wp; +}; + +static int +read_lzwd(fz_stream *stm, unsigned char *buf, int len) +{ + fz_lzwd *lzw = stm->state; + lzw_code *table = lzw->table; + unsigned char *p = buf; + unsigned char *ep = buf + len; + unsigned char *s; + int codelen; + + int code_bits = lzw->code_bits; + int code = lzw->code; + int old_code = lzw->old_code; + int next_code = lzw->next_code; + + while (lzw->rp < lzw->wp && p < ep) + *p++ = *lzw->rp++; + + while (p < ep) + { + if (lzw->eod) + return 0; + + code = fz_read_bits(lzw->chain, code_bits); + + if (fz_is_eof_bits(lzw->chain)) + { + lzw->eod = 1; + break; + } + + if (code == LZW_EOD) + { + lzw->eod = 1; + break; + } + + if (code == LZW_CLEAR) + { + code_bits = MIN_BITS; + next_code = LZW_FIRST; + old_code = -1; + continue; + } + + /* if stream starts without a clear code, old_code is undefined... */ + if (old_code == -1) + { + old_code = code; + } + else + { + /* add new entry to the code table */ + table[next_code].prev = old_code; + table[next_code].first_char = table[old_code].first_char; + table[next_code].length = table[old_code].length + 1; + if (code < next_code) + table[next_code].value = table[code].first_char; + else if (code == next_code) + table[next_code].value = table[next_code].first_char; + else + fz_warn("out of range code encountered in lzw decode"); + + next_code ++; + + if (next_code > (1 << code_bits) - lzw->early_change - 1) + { + code_bits ++; + if (code_bits > MAX_BITS) + code_bits = MAX_BITS; /* FIXME */ + } + + old_code = code; + } + + /* code maps to a string, copy to output (in reverse...) */ + if (code > 255) + { + codelen = table[code].length; + lzw->rp = lzw->bp; + lzw->wp = lzw->bp + codelen; + + assert(codelen < MAX_LENGTH); + + s = lzw->wp; + do { + *(--s) = table[code].value; + code = table[code].prev; + } while (code >= 0 && s > lzw->bp); + } + + /* ... or just a single character */ + else + { + lzw->bp[0] = code; + lzw->rp = lzw->bp; + lzw->wp = lzw->bp + 1; + } + + /* copy to output */ + while (lzw->rp < lzw->wp && p < ep) + *p++ = *lzw->rp++; + } + + lzw->code_bits = code_bits; + lzw->code = code; + lzw->old_code = old_code; + lzw->next_code = next_code; + + return p - buf; +} + +static void +close_lzwd(fz_stream *stm) +{ + fz_lzwd *lzw = stm->state; + fz_close(lzw->chain); + fz_free(lzw); +} + +fz_stream * +fz_open_lzwd(fz_stream *chain, fz_obj *params) +{ + fz_lzwd *lzw; + fz_obj *obj; + int i; + + lzw = fz_malloc(sizeof(fz_lzwd)); + lzw->chain = chain; + lzw->eod = 0; + lzw->early_change = 1; + + obj = fz_dict_gets(params, "EarlyChange"); + if (obj) + lzw->early_change = !!fz_to_int(obj); + + for (i = 0; i < 256; i++) + { + lzw->table[i].value = i; + lzw->table[i].first_char = i; + lzw->table[i].length = 1; + lzw->table[i].prev = -1; + } + + for (i = 256; i < NUM_CODES; i++) + { + lzw->table[i].value = 0; + lzw->table[i].first_char = 0; + lzw->table[i].length = 0; + lzw->table[i].prev = -1; + } + + lzw->code_bits = MIN_BITS; + lzw->code = -1; + lzw->next_code = LZW_FIRST; + lzw->old_code = -1; + lzw->rp = lzw->bp; + lzw->wp = lzw->bp; + + return fz_new_stream(lzw, read_lzwd, close_lzwd); +} diff --git a/contrib/media/updf_newlib/fitz/filt_predict.c b/contrib/media/updf_newlib/fitz/filt_predict.c new file mode 100755 index 000000000..94f2718a4 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/filt_predict.c @@ -0,0 +1,243 @@ +#include "fitz.h" + +/* TODO: check if this works with 16bpp images */ + +enum { MAXC = 32 }; + +typedef struct fz_predict_s fz_predict; + +struct fz_predict_s +{ + fz_stream *chain; + + int predictor; + int columns; + int colors; + int bpc; + + int stride; + int bpp; + unsigned char *in; + unsigned char *out; + unsigned char *ref; + unsigned char *rp, *wp; +}; + +static inline int getcomponent(unsigned char *line, int x, int bpc) +{ + switch (bpc) + { + case 1: return (line[x >> 3] >> ( 7 - (x & 7) ) ) & 1; + case 2: return (line[x >> 2] >> ( ( 3 - (x & 3) ) << 1 ) ) & 3; + case 4: return (line[x >> 1] >> ( ( 1 - (x & 1) ) << 2 ) ) & 15; + case 8: return line[x]; + } + return 0; +} + + +static inline void putcomponent(unsigned char *buf, int x, int bpc, int value) +{ + switch (bpc) + { + case 1: buf[x >> 3] |= value << (7 - (x & 7)); break; + case 2: buf[x >> 2] |= value << ((3 - (x & 3)) << 1); break; + case 4: buf[x >> 1] |= value << ((1 - (x & 1)) << 2); break; + case 8: buf[x] = value; break; + } +} + +static inline int paeth(int a, int b, int c) +{ + /* The definitions of ac and bc are correct, not a typo. */ + int ac = b - c, bc = a - c, abcc = ac + bc; + int pa = ABS(ac); + int pb = ABS(bc); + int pc = ABS(abcc); + return pa <= pb && pa <= pc ? a : pb <= pc ? b : c; +} + +static void +fz_predict_tiff(fz_predict *state, unsigned char *out, unsigned char *in, int len) +{ + int left[MAXC]; + int i, k; + + for (k = 0; k < state->colors; k++) + left[k] = 0; + + for (i = 0; i < state->columns; i++) + { + for (k = 0; k < state->colors; k++) + { + int a = getcomponent(in, i * state->colors + k, state->bpc); + int b = a + left[k]; + int c = b % (1 << state->bpc); + putcomponent(out, i * state->colors + k, state->bpc, c); + left[k] = c; + } + } +} + +static void +fz_predict_png(fz_predict *state, unsigned char *out, unsigned char *in, int len, int predictor) +{ + int bpp = state->bpp; + int i; + unsigned char *ref = state->ref; + + switch (predictor) + { + case 0: + memcpy(out, in, len); + break; + case 1: + for (i = bpp; i > 0; i--) + { + *out++ = *in++; + } + for (i = len - bpp; i > 0; i--) + { + *out = *in++ + out[-bpp]; + out++; + } + break; + case 2: + for (i = bpp; i > 0; i--) + { + *out++ = *in++ + *ref++; + } + for (i = len - bpp; i > 0; i--) + { + *out++ = *in++ + *ref++; + } + break; + case 3: + for (i = bpp; i > 0; i--) + { + *out++ = *in++ + (*ref++) / 2; + } + for (i = len - bpp; i > 0; i--) + { + *out = *in++ + (out[-bpp] + *ref++) / 2; + out++; + } + break; + case 4: + for (i = bpp; i > 0; i--) + { + *out++ = *in++ + paeth(0, *ref++, 0); + } + for (i = len - bpp; i > 0; i --) + { + *out = *in++ + paeth(out[-bpp], *ref, ref[-bpp]); + ref++; + out++; + } + break; + } +} + +static int +read_predict(fz_stream *stm, unsigned char *buf, int len) +{ + fz_predict *state = stm->state; + unsigned char *p = buf; + unsigned char *ep = buf + len; + int ispng = state->predictor >= 10; + int n; + + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; + + while (p < ep) + { + n = fz_read(state->chain, state->in, state->stride + ispng); + if (n < 0) + return fz_rethrow(n, "read error in prediction filter"); + if (n == 0) + return p - buf; + + if (state->predictor == 1) + memcpy(state->out, state->in, n); + else if (state->predictor == 2) + fz_predict_tiff(state, state->out, state->in, n); + else + { + fz_predict_png(state, state->out, state->in + 1, n - 1, state->in[0]); + memcpy(state->ref, state->out, state->stride); + } + + state->rp = state->out; + state->wp = state->out + n - ispng; + + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; + } + + return p - buf; +} + +static void +close_predict(fz_stream *stm) +{ + fz_predict *state = stm->state; + fz_close(state->chain); + fz_free(state->in); + fz_free(state->out); + fz_free(state->ref); + fz_free(state); +} + +fz_stream * +fz_open_predict(fz_stream *chain, fz_obj *params) +{ + fz_predict *state; + fz_obj *obj; + + state = fz_malloc(sizeof(fz_predict)); + state->chain = chain; + + state->predictor = 1; + state->columns = 1; + state->colors = 1; + state->bpc = 8; + + obj = fz_dict_gets(params, "Predictor"); + if (obj) + state->predictor = fz_to_int(obj); + + if (state->predictor != 1 && state->predictor != 2 && + state->predictor != 10 && state->predictor != 11 && + state->predictor != 12 && state->predictor != 13 && + state->predictor != 14 && state->predictor != 15) + { + fz_warn("invalid predictor: %d", state->predictor); + state->predictor = 1; + } + + obj = fz_dict_gets(params, "Columns"); + if (obj) + state->columns = fz_to_int(obj); + + obj = fz_dict_gets(params, "Colors"); + if (obj) + state->colors = fz_to_int(obj); + + obj = fz_dict_gets(params, "BitsPerComponent"); + if (obj) + state->bpc = fz_to_int(obj); + + state->stride = (state->bpc * state->colors * state->columns + 7) / 8; + state->bpp = (state->bpc * state->colors + 7) / 8; + + state->in = fz_malloc(state->stride + 1); + state->out = fz_malloc(state->stride); + state->ref = fz_malloc(state->stride); + state->rp = state->out; + state->wp = state->out; + + memset(state->ref, 0, state->stride); + + return fz_new_stream(state, read_predict, close_predict); +} diff --git a/contrib/media/updf_newlib/fitz/fitz.h b/contrib/media/updf_newlib/fitz/fitz.h new file mode 100755 index 000000000..dff6b8d4c --- /dev/null +++ b/contrib/media/updf_newlib/fitz/fitz.h @@ -0,0 +1,1120 @@ +#ifndef _FITZ_H_ +#define _FITZ_H_ + +/* + * Include the standard libc headers. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include /* INT_MAX & co */ +#include /* FLT_EPSILON */ +#include /* O_RDONLY & co */ + +#define nelem(x) (sizeof(x)/sizeof((x)[0])) + +#define ABS(x) ( (x) < 0 ? -(x) : (x) ) +#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) +#define MAX(a,b) ( (a) > (b) ? (a) : (b) ) +#define CLAMP(x,a,b) ( (x) > (b) ? (b) : ( (x) < (a) ? (a) : (x) ) ) + +/* + * Some differences in libc can be smoothed over + */ + +#ifdef _MSC_VER /* Microsoft Visual C */ + +#pragma warning( disable: 4244 ) /* conversion from X to Y, possible loss of data */ +#pragma warning( disable: 4996 ) /* The POSIX name for this item is deprecated */ +#pragma warning( disable: 4996 ) /* This function or variable may be unsafe */ + +#include + +int gettimeofday(struct timeval *tv, struct timezone *tz); + +#define snprintf _snprintf +#define strtoll _strtoi64 + +#else /* Unix or close enough */ + +#include + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 +#endif + +/* + * Variadic macros, inline and restrict keywords + */ + +#if __STDC_VERSION__ == 199901L /* C99 */ + +#define fz_throw(...) fz_throw_imp(__FILE__, __LINE__, __func__, __VA_ARGS__) +#define fz_rethrow(cause, ...) fz_rethrow_imp(__FILE__, __LINE__, __func__, cause, __VA_ARGS__) +#define fz_catch(cause, ...) fz_catch_imp(__FILE__, __LINE__, __func__, cause, __VA_ARGS__) + +#elif _MSC_VER >= 1500 /* MSVC 9 or newer */ + +#define inline __inline +#define restrict __restrict +#define fz_throw(...) fz_throw_imp(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__) +#define fz_rethrow(cause, ...) fz_rethrow_imp(__FILE__, __LINE__, __FUNCTION__, cause, __VA_ARGS__) +#define fz_catch(cause, ...) fz_catch_imp(__FILE__, __LINE__, __FUNCTION__, cause, __VA_ARGS__) + +#elif __GNUC__ >= 3 /* GCC 3 or newer */ + +#define inline __inline +#define restrict __restrict +#define fz_throw(fmt...) fz_throw_imp(__FILE__, __LINE__, __FUNCTION__, fmt) +#define fz_rethrow(cause, fmt...) fz_rethrow_imp(__FILE__, __LINE__, __FUNCTION__, cause, fmt) +#define fz_catch(cause, fmt...) fz_catch_imp(__FILE__, __LINE__, __FUNCTION__, cause, fmt) + +#else /* Unknown or ancient */ + +#define inline +#define restrict +#define fz_throw fz_throw_impx +#define fz_rethrow fz_rethrow_impx +#define fz_catch fz_catch_impx + +#endif + +/* + * GCC can do type checking of printf strings + */ + +#ifndef __printflike +#if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7 +#define __printflike(fmtarg, firstvararg) \ + __attribute__((__format__ (__printf__, fmtarg, firstvararg))) +#else +#define __printflike(fmtarg, firstvararg) +#endif +#endif + +/* + * Error handling + */ + +typedef int fz_error; + +#define fz_okay ((fz_error)0) + +void fz_warn(char *fmt, ...) __printflike(1, 2); +void fz_flush_warnings(void); + +fz_error fz_throw_imp(const char *file, int line, const char *func, char *fmt, ...) __printflike(4, 5); +fz_error fz_rethrow_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...) __printflike(5, 6); +void fz_catch_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...) __printflike(5, 6); + +fz_error fz_throw_impx(char *fmt, ...) __printflike(1, 2); +fz_error fz_rethrow_impx(fz_error cause, char *fmt, ...) __printflike(2, 3); +void fz_catch_impx(fz_error cause, char *fmt, ...) __printflike(2, 3); + +/* extract the last error stack trace */ +int fz_get_error_count(void); +char *fz_get_error_line(int n); + +/* + * Basic runtime and utility functions + */ + +/* memory allocation */ +void *fz_malloc(int size); +void *fz_calloc(int count, int size); +void *fz_realloc(void *p, int count, int size); +void fz_free(void *p); +char *fz_strdup(char *s); + +/* runtime (hah!) test for endian-ness */ +int fz_is_big_endian(void); + +/* safe string functions */ +char *fz_strsep(char **stringp, const char *delim); +int fz_strlcpy(char *dst, const char *src, int n); +int fz_strlcat(char *dst, const char *src, int n); + +/* Range checking atof */ +float fz_atof(const char *s); + +/* utf-8 encoding and decoding */ +int chartorune(int *rune, char *str); +int runetochar(char *str, int *rune); +int runelen(int c); + +/* getopt */ +extern int fz_getopt(int nargc, char * const *nargv, const char *ostr); +extern int fz_optind; +extern char *fz_optarg; + +/* + * Generic hash-table with fixed-length keys. + */ + +typedef struct fz_hash_table_s fz_hash_table; + +fz_hash_table *fz_new_hash_table(int initialsize, int keylen); +void fz_debug_hash(fz_hash_table *table); +void fz_empty_hash(fz_hash_table *table); +void fz_free_hash(fz_hash_table *table); + +void *fz_hash_find(fz_hash_table *table, void *key); +void fz_hash_insert(fz_hash_table *table, void *key, void *val); +void fz_hash_remove(fz_hash_table *table, void *key); + +int fz_hash_len(fz_hash_table *table); +void *fz_hash_get_key(fz_hash_table *table, int idx); +void *fz_hash_get_val(fz_hash_table *table, int idx); + +/* + * Math and geometry + */ + +/* Multiply scaled two integers in the 0..255 range */ +static inline int fz_mul255(int a, int b) +{ + /* see Jim Blinn's book "Dirty Pixels" for how this works */ + int x = a * b + 128; + x += x >> 8; + return x >> 8; +} + +/* Expand a value A from the 0...255 range to the 0..256 range */ +#define FZ_EXPAND(A) ((A)+((A)>>7)) + +/* Combine values A (in any range) and B (in the 0..256 range), + * to give a single value in the same range as A was. */ +#define FZ_COMBINE(A,B) (((A)*(B))>>8) + +/* Combine values A and C (in the same (any) range) and B and D (in the + * 0..256 range), to give a single value in the same range as A and C were. */ +#define FZ_COMBINE2(A,B,C,D) (FZ_COMBINE((A), (B)) + FZ_COMBINE((C), (D))) + +/* Blend SRC and DST (in the same range) together according to + * AMOUNT (in the 0...256 range). */ +#define FZ_BLEND(SRC, DST, AMOUNT) ((((SRC)-(DST))*(AMOUNT) + ((DST)<<8))>>8) + +typedef struct fz_matrix_s fz_matrix; +typedef struct fz_point_s fz_point; +typedef struct fz_rect_s fz_rect; +typedef struct fz_bbox_s fz_bbox; + +extern const fz_rect fz_unit_rect; +extern const fz_rect fz_empty_rect; +extern const fz_rect fz_infinite_rect; + +extern const fz_bbox fz_unit_bbox; +extern const fz_bbox fz_empty_bbox; +extern const fz_bbox fz_infinite_bbox; + +#define fz_is_empty_rect(r) ((r).x0 == (r).x1) +#define fz_is_infinite_rect(r) ((r).x0 > (r).x1) +#define fz_is_empty_bbox(b) ((b).x0 == (b).x1) +#define fz_is_infinite_bbox(b) ((b).x0 > (b).x1) + +struct fz_matrix_s +{ + float a, b, c, d, e, f; +}; + +struct fz_point_s +{ + float x, y; +}; + +struct fz_rect_s +{ + float x0, y0; + float x1, y1; +}; + +struct fz_bbox_s +{ + int x0, y0; + int x1, y1; +}; + +extern const fz_matrix fz_identity; + +fz_matrix fz_concat(fz_matrix one, fz_matrix two); +fz_matrix fz_scale(float sx, float sy); +fz_matrix fz_shear(float sx, float sy); +fz_matrix fz_rotate(float theta); +fz_matrix fz_translate(float tx, float ty); +fz_matrix fz_invert_matrix(fz_matrix m); +int fz_is_rectilinear(fz_matrix m); +float fz_matrix_expansion(fz_matrix m); + +fz_bbox fz_round_rect(fz_rect r); +fz_bbox fz_intersect_bbox(fz_bbox a, fz_bbox b); +fz_rect fz_intersect_rect(fz_rect a, fz_rect b); +fz_bbox fz_union_bbox(fz_bbox a, fz_bbox b); +fz_rect fz_union_rect(fz_rect a, fz_rect b); + +fz_point fz_transform_point(fz_matrix m, fz_point p); +fz_point fz_transform_vector(fz_matrix m, fz_point p); +fz_rect fz_transform_rect(fz_matrix m, fz_rect r); +fz_bbox fz_transform_bbox(fz_matrix m, fz_bbox b); + +/* + * Basic crypto functions. + * Independent of the rest of fitz. + * For further encapsulation in filters, or not. + */ + +/* md5 digests */ + +typedef struct fz_md5_s fz_md5; + +struct fz_md5_s +{ + unsigned int state[4]; + unsigned int count[2]; + unsigned char buffer[64]; +}; + +void fz_md5_init(fz_md5 *state); +void fz_md5_update(fz_md5 *state, const unsigned char *input, unsigned inlen); +void fz_md5_final(fz_md5 *state, unsigned char digest[16]); + +/* sha-256 digests */ + +typedef struct fz_sha256_s fz_sha256; + +struct fz_sha256_s +{ + unsigned int state[8]; + unsigned int count[2]; + union { + unsigned char u8[64]; + unsigned int u32[16]; + } buffer; +}; + +void fz_sha256_init(fz_sha256 *state); +void fz_sha256_update(fz_sha256 *state, const unsigned char *input, unsigned int inlen); +void fz_sha256_final(fz_sha256 *state, unsigned char digest[32]); + +/* arc4 crypto */ + +typedef struct fz_arc4_s fz_arc4; + +struct fz_arc4_s +{ + unsigned x; + unsigned y; + unsigned char state[256]; +}; + +void fz_arc4_init(fz_arc4 *state, const unsigned char *key, unsigned len); +void fz_arc4_encrypt(fz_arc4 *state, unsigned char *dest, const unsigned char *src, unsigned len); + +/* AES block cipher implementation from XYSSL */ + +typedef struct fz_aes_s fz_aes; + +#define AES_DECRYPT 0 +#define AES_ENCRYPT 1 + +struct fz_aes_s +{ + int nr; /* number of rounds */ + unsigned long *rk; /* AES round keys */ + unsigned long buf[68]; /* unaligned data */ +}; + +void aes_setkey_enc( fz_aes *ctx, const unsigned char *key, int keysize ); +void aes_setkey_dec( fz_aes *ctx, const unsigned char *key, int keysize ); +void aes_crypt_cbc( fz_aes *ctx, int mode, int length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ); + +/* + * Dynamic objects. + * The same type of objects as found in PDF and PostScript. + * Used by the filters and the mupdf parser. + */ + +typedef struct fz_obj_s fz_obj; + +extern fz_obj* (*fz_resolve_indirect)(fz_obj*); + +fz_obj *fz_new_null(void); +fz_obj *fz_new_bool(int b); +fz_obj *fz_new_int(int i); +fz_obj *fz_new_real(float f); +fz_obj *fz_new_name(char *str); +fz_obj *fz_new_string(char *str, int len); +fz_obj *fz_new_indirect(int num, int gen, void *xref); + +fz_obj *fz_new_array(int initialcap); +fz_obj *fz_new_dict(int initialcap); +fz_obj *fz_copy_array(fz_obj *array); +fz_obj *fz_copy_dict(fz_obj *dict); + +fz_obj *fz_keep_obj(fz_obj *obj); +void fz_drop_obj(fz_obj *obj); + +/* type queries */ +int fz_is_null(fz_obj *obj); +int fz_is_bool(fz_obj *obj); +int fz_is_int(fz_obj *obj); +int fz_is_real(fz_obj *obj); +int fz_is_name(fz_obj *obj); +int fz_is_string(fz_obj *obj); +int fz_is_array(fz_obj *obj); +int fz_is_dict(fz_obj *obj); +int fz_is_indirect(fz_obj *obj); + +int fz_objcmp(fz_obj *a, fz_obj *b); + +/* safe, silent failure, no error reporting */ +int fz_to_bool(fz_obj *obj); +int fz_to_int(fz_obj *obj); +float fz_to_real(fz_obj *obj); +char *fz_to_name(fz_obj *obj); +char *fz_to_str_buf(fz_obj *obj); +int fz_to_str_len(fz_obj *obj); +int fz_to_num(fz_obj *obj); +int fz_to_gen(fz_obj *obj); + +int fz_array_len(fz_obj *array); +fz_obj *fz_array_get(fz_obj *array, int i); +void fz_array_put(fz_obj *array, int i, fz_obj *obj); +void fz_array_push(fz_obj *array, fz_obj *obj); +void fz_array_insert(fz_obj *array, fz_obj *obj); + +int fz_dict_len(fz_obj *dict); +fz_obj *fz_dict_get_key(fz_obj *dict, int idx); +fz_obj *fz_dict_get_val(fz_obj *dict, int idx); +fz_obj *fz_dict_get(fz_obj *dict, fz_obj *key); +fz_obj *fz_dict_gets(fz_obj *dict, char *key); +fz_obj *fz_dict_getsa(fz_obj *dict, char *key, char *abbrev); +void fz_dict_put(fz_obj *dict, fz_obj *key, fz_obj *val); +void fz_dict_puts(fz_obj *dict, char *key, fz_obj *val); +void fz_dict_del(fz_obj *dict, fz_obj *key); +void fz_dict_dels(fz_obj *dict, char *key); +void fz_sort_dict(fz_obj *dict); + +int fz_fprint_obj(FILE *fp, fz_obj *obj, int tight); +void fz_debug_obj(fz_obj *obj); +void fz_debug_ref(fz_obj *obj); + +void fz_set_str_len(fz_obj *obj, int newlen); /* private */ +void *fz_get_indirect_xref(fz_obj *obj); /* private */ + +/* + * Data buffers. + */ + +typedef struct fz_buffer_s fz_buffer; + +struct fz_buffer_s +{ + int refs; + unsigned char *data; + int cap, len; +}; + +fz_buffer *fz_new_buffer(int size); +fz_buffer *fz_keep_buffer(fz_buffer *buf); +void fz_drop_buffer(fz_buffer *buf); + +void fz_resize_buffer(fz_buffer *buf, int size); +void fz_grow_buffer(fz_buffer *buf); + +/* + * Buffered reader. + * Only the data between rp and wp is valid data. + */ + +typedef struct fz_stream_s fz_stream; + +struct fz_stream_s +{ + int refs; + int error; + int eof; + int pos; + int avail; + int bits; + unsigned char *bp, *rp, *wp, *ep; + void *state; + int (*read)(fz_stream *stm, unsigned char *buf, int len); + void (*close)(fz_stream *stm); + void (*seek)(fz_stream *stm, int offset, int whence); + unsigned char buf[4096]; +}; + +fz_stream *fz_open_fd(int file); +fz_stream *fz_open_file(const char *filename); +fz_stream *fz_open_file_w(const wchar_t *filename); /* only on win32 */ +fz_stream *fz_open_buffer(fz_buffer *buf); +fz_stream *fz_open_memory(unsigned char *data, int len); +void fz_close(fz_stream *stm); + +fz_stream *fz_new_stream(void*, int(*)(fz_stream*, unsigned char*, int), void(*)(fz_stream *)); +fz_stream *fz_keep_stream(fz_stream *stm); +void fz_fill_buffer(fz_stream *stm); + +int fz_tell(fz_stream *stm); +void fz_seek(fz_stream *stm, int offset, int whence); + +int fz_read(fz_stream *stm, unsigned char *buf, int len); +void fz_read_line(fz_stream *stm, char *buf, int max); +fz_error fz_read_all(fz_buffer **bufp, fz_stream *stm, int initial); + +static inline int fz_read_byte(fz_stream *stm) +{ + if (stm->rp == stm->wp) + { + fz_fill_buffer(stm); + return stm->rp < stm->wp ? *stm->rp++ : EOF; + } + return *stm->rp++; +} + +static inline int fz_peek_byte(fz_stream *stm) +{ + if (stm->rp == stm->wp) + { + fz_fill_buffer(stm); + return stm->rp < stm->wp ? *stm->rp : EOF; + } + return *stm->rp; +} + +static inline void fz_unread_byte(fz_stream *stm) +{ + if (stm->rp > stm->bp) + stm->rp--; +} + +static inline int fz_is_eof(fz_stream *stm) +{ + if (stm->rp == stm->wp) + { + if (stm->eof) + return 1; + return fz_peek_byte(stm) == EOF; + } + return 0; +} + +static inline unsigned int fz_read_bits(fz_stream *stm, int n) +{ + unsigned int x; + + if (n <= stm->avail) + { + stm->avail -= n; + x = (stm->bits >> stm->avail) & ((1 << n) - 1); + } + else + { + x = stm->bits & ((1 << stm->avail) - 1); + n -= stm->avail; + stm->avail = 0; + + while (n > 8) + { + x = (x << 8) | fz_read_byte(stm); + n -= 8; + } + + if (n > 0) + { + stm->bits = fz_read_byte(stm); + stm->avail = 8 - n; + x = (x << n) | (stm->bits >> stm->avail); + } + } + + return x; +} + +static inline void fz_sync_bits(fz_stream *stm) +{ + stm->avail = 0; +} + +static inline int fz_is_eof_bits(fz_stream *stm) +{ + return fz_is_eof(stm) && (stm->avail == 0 || stm->bits == EOF); +} + +/* + * Data filters. + */ + +fz_stream *fz_open_copy(fz_stream *chain); +fz_stream *fz_open_null(fz_stream *chain, int len); +fz_stream *fz_open_arc4(fz_stream *chain, unsigned char *key, unsigned keylen); +fz_stream *fz_open_aesd(fz_stream *chain, unsigned char *key, unsigned keylen); +fz_stream *fz_open_a85d(fz_stream *chain); +fz_stream *fz_open_ahxd(fz_stream *chain); +fz_stream *fz_open_rld(fz_stream *chain); +fz_stream *fz_open_dctd(fz_stream *chain, fz_obj *param); +fz_stream *fz_open_faxd(fz_stream *chain, fz_obj *param); +fz_stream *fz_open_flated(fz_stream *chain); +fz_stream *fz_open_lzwd(fz_stream *chain, fz_obj *param); +fz_stream *fz_open_predict(fz_stream *chain, fz_obj *param); +fz_stream *fz_open_jbig2d(fz_stream *chain, fz_buffer *global); + +/* + * Resources and other graphics related objects. + */ + +enum { FZ_MAX_COLORS = 32 }; + +int fz_find_blendmode(char *name); +char *fz_blendmode_name(int blendmode); + +/* + * Pixmaps have n components per pixel. the last is always alpha. + * premultiplied alpha when rendering, but non-premultiplied for colorspace + * conversions and rescaling. + */ + +typedef struct fz_pixmap_s fz_pixmap; +typedef struct fz_colorspace_s fz_colorspace; + +struct fz_pixmap_s +{ + int refs; + int x, y, w, h, n; + fz_pixmap *mask; /* explicit soft/image mask */ + int interpolate; + int xres, yres; + fz_colorspace *colorspace; + unsigned char *samples; + int free_samples; +}; + +/* will return NULL if soft limit is exceeded */ +fz_pixmap *fz_new_pixmap_with_limit(fz_colorspace *colorspace, int w, int h); + +fz_pixmap *fz_new_pixmap_with_data(fz_colorspace *colorspace, int w, int h, unsigned char *samples); +fz_pixmap *fz_new_pixmap_with_rect(fz_colorspace *, fz_bbox bbox); +fz_pixmap *fz_new_pixmap_with_rect_and_data(fz_colorspace *, fz_bbox bbox, unsigned char *samples); +fz_pixmap *fz_new_pixmap(fz_colorspace *, int w, int h); +fz_pixmap *fz_keep_pixmap(fz_pixmap *pix); +void fz_drop_pixmap(fz_pixmap *pix); +void fz_clear_pixmap(fz_pixmap *pix); +void fz_clear_pixmap_with_color(fz_pixmap *pix, int value); +void fz_clear_pixmap_rect_with_color(fz_pixmap *pix, int value, fz_bbox r); +void fz_copy_pixmap_rect(fz_pixmap *dest, fz_pixmap *src, fz_bbox r); +void fz_premultiply_pixmap(fz_pixmap *pix); +fz_pixmap *fz_alpha_from_gray(fz_pixmap *gray, int luminosity); +fz_bbox fz_bound_pixmap(fz_pixmap *pix); +void fz_invert_pixmap(fz_pixmap *pix); +void fz_gamma_pixmap(fz_pixmap *pix, float gamma); + +fz_pixmap *fz_scale_pixmap(fz_pixmap *src, float x, float y, float w, float h); +fz_pixmap *fz_scale_pixmap_gridfit(fz_pixmap *src, float x, float y, float w, float h, int gridfit); + +fz_error fz_write_pnm(fz_pixmap *pixmap, char *filename); +fz_error fz_write_pam(fz_pixmap *pixmap, char *filename, int savealpha); +fz_error fz_write_png(fz_pixmap *pixmap, char *filename, int savealpha); + +fz_error fz_load_jpx_image(fz_pixmap **imgp, unsigned char *data, int size, fz_colorspace *dcs); + +/* + * Bitmaps have 1 component per bit. Only used for creating halftoned versions + * of contone buffers, and saving out. Samples are stored msb first, akin to + * pbms. + */ + +typedef struct fz_bitmap_s fz_bitmap; + +struct fz_bitmap_s +{ + int refs; + int w, h, stride, n; + unsigned char *samples; +}; + +fz_bitmap *fz_new_bitmap(int w, int h, int n); +fz_bitmap *fz_keep_bitmap(fz_bitmap *bit); +void fz_clear_bitmap(fz_bitmap *bit); +void fz_drop_bitmap(fz_bitmap *bit); + +fz_error fz_write_pbm(fz_bitmap *bitmap, char *filename); + +/* + * A halftone is a set of threshold tiles, one per component. Each threshold + * tile is a pixmap, possibly of varying sizes and phases. + */ + +typedef struct fz_halftone_s fz_halftone; + +struct fz_halftone_s +{ + int refs; + int n; + fz_pixmap *comp[1]; +}; + +fz_halftone *fz_new_halftone(int num_comps); +fz_halftone *fz_get_default_halftone(int num_comps); +fz_halftone *fz_keep_halftone(fz_halftone *half); +void fz_drop_halftone(fz_halftone *half); + +fz_bitmap *fz_halftone_pixmap(fz_pixmap *pix, fz_halftone *ht); + +/* + * Colorspace resources. + */ + +extern fz_colorspace *fz_device_gray; +extern fz_colorspace *fz_device_rgb; +extern fz_colorspace *fz_device_bgr; +extern fz_colorspace *fz_device_cmyk; + +struct fz_colorspace_s +{ + int refs; + char name[16]; + int n; + void (*to_rgb)(fz_colorspace *, float *src, float *rgb); + void (*from_rgb)(fz_colorspace *, float *rgb, float *dst); + void (*free_data)(fz_colorspace *); + void *data; +}; + +fz_colorspace *fz_new_colorspace(char *name, int n); +fz_colorspace *fz_keep_colorspace(fz_colorspace *colorspace); +void fz_drop_colorspace(fz_colorspace *colorspace); + +void fz_convert_color(fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *dstv); +void fz_convert_pixmap(fz_pixmap *src, fz_pixmap *dst); + +fz_colorspace *fz_find_device_colorspace(char *name); + +/* + * Fonts come in two variants: + * Regular fonts are handled by FreeType. + * Type 3 fonts have callbacks to the interpreter. + */ + +struct fz_device_s; + +typedef struct fz_font_s fz_font; +char *ft_error_string(int err); + +struct fz_font_s +{ + int refs; + char name[32]; + + void *ft_face; /* has an FT_Face if used */ + int ft_substitute; /* ... substitute metrics */ + int ft_bold; /* ... synthesize bold */ + int ft_italic; /* ... synthesize italic */ + int ft_hint; /* ... force hinting for DynaLab fonts */ + + /* origin of font data */ + char *ft_file; + unsigned char *ft_data; + int ft_size; + + fz_matrix t3matrix; + fz_obj *t3resources; + fz_buffer **t3procs; /* has 256 entries if used */ + float *t3widths; /* has 256 entries if used */ + void *t3xref; /* a pdf_xref for the callback */ + fz_error (*t3run)(void *xref, fz_obj *resources, fz_buffer *contents, + struct fz_device_s *dev, fz_matrix ctm); + + fz_rect bbox; + + /* substitute metrics */ + int width_count; + int *width_table; +}; + +fz_font *fz_new_type3_font(char *name, fz_matrix matrix); + +fz_error fz_new_font_from_memory(fz_font **fontp, unsigned char *data, int len, int index); +fz_error fz_new_font_from_file(fz_font **fontp, char *path, int index); + +fz_font *fz_keep_font(fz_font *font); +void fz_drop_font(fz_font *font); + +void fz_debug_font(fz_font *font); +void fz_set_font_bbox(fz_font *font, float xmin, float ymin, float xmax, float ymax); + +/* + * Vector path buffer. + * It can be stroked and dashed, or be filled. + * It has a fill rule (nonzero or even_odd). + * + * When rendering, they are flattened, stroked and dashed straight + * into the Global Edge List. + */ + +typedef struct fz_path_s fz_path; +typedef struct fz_stroke_state_s fz_stroke_state; + +typedef union fz_path_item_s fz_path_item; + +typedef enum fz_path_item_kind_e +{ + FZ_MOVETO, + FZ_LINETO, + FZ_CURVETO, + FZ_CLOSE_PATH +} fz_path_item_kind; + +union fz_path_item_s +{ + fz_path_item_kind k; + float v; +}; + +struct fz_path_s +{ + int len, cap; + fz_path_item *items; +}; + +struct fz_stroke_state_s +{ + int start_cap, dash_cap, end_cap; + int linejoin; + float linewidth; + float miterlimit; + float dash_phase; + int dash_len; + float dash_list[32]; +}; + +fz_path *fz_new_path(void); +void fz_moveto(fz_path*, float x, float y); +void fz_lineto(fz_path*, float x, float y); +void fz_curveto(fz_path*, float, float, float, float, float, float); +void fz_curvetov(fz_path*, float, float, float, float); +void fz_curvetoy(fz_path*, float, float, float, float); +void fz_closepath(fz_path*); +void fz_free_path(fz_path *path); + +void fz_transform_path(fz_path *path, fz_matrix transform); + +fz_path *fz_clone_path(fz_path *old); + +fz_rect fz_bound_path(fz_path *path, fz_stroke_state *stroke, fz_matrix ctm); +void fz_debug_path(fz_path *, int indent); + +/* + * Text buffer. + * + * The trm field contains the a, b, c and d coefficients. + * The e and f coefficients come from the individual elements, + * together they form the transform matrix for the glyph. + * + * Glyphs are referenced by glyph ID. + * The Unicode text equivalent is kept in a separate array + * with indexes into the glyph array. + */ + +typedef struct fz_text_s fz_text; +typedef struct fz_text_item_s fz_text_item; + +struct fz_text_item_s +{ + float x, y; + int gid; /* -1 for one gid to many ucs mappings */ + int ucs; /* -1 for one ucs to many gid mappings */ +}; + +struct fz_text_s +{ + fz_font *font; + fz_matrix trm; + int wmode; + int len, cap; + fz_text_item *items; +}; + +fz_text *fz_new_text(fz_font *face, fz_matrix trm, int wmode); +void fz_add_text(fz_text *text, int gid, int ucs, float x, float y); +void fz_free_text(fz_text *text); +void fz_debug_text(fz_text*, int indent); +fz_rect fz_bound_text(fz_text *text, fz_matrix ctm); +fz_text *fz_clone_text(fz_text *old); + +/* + * The shading code uses gouraud shaded triangle meshes. + */ + +enum +{ + FZ_LINEAR, + FZ_RADIAL, + FZ_MESH, +}; + +typedef struct fz_shade_s fz_shade; + +struct fz_shade_s +{ + int refs; + + fz_rect bbox; /* can be fz_infinite_rect */ + fz_colorspace *colorspace; + + fz_matrix matrix; /* matrix from pattern dict */ + int use_background; /* background color for fills but not 'sh' */ + float background[FZ_MAX_COLORS]; + + int use_function; + float function[256][FZ_MAX_COLORS + 1]; + + int type; /* linear, radial, mesh */ + int extend[2]; + + int mesh_len; + int mesh_cap; + float *mesh; /* [x y 0], [x y r], [x y t] or [x y c1 ... cn] */ +}; + +fz_shade *fz_keep_shade(fz_shade *shade); +void fz_drop_shade(fz_shade *shade); +void fz_debug_shade(fz_shade *shade); + +fz_rect fz_bound_shade(fz_shade *shade, fz_matrix ctm); +void fz_paint_shade(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox); + +/* + * Glyph cache + */ + +typedef struct fz_glyph_cache_s fz_glyph_cache; + +fz_glyph_cache *fz_new_glyph_cache(void); +fz_pixmap *fz_render_ft_glyph(fz_font *font, int cid, fz_matrix trm); +fz_pixmap *fz_render_t3_glyph(fz_font *font, int cid, fz_matrix trm, fz_colorspace *model); +fz_pixmap *fz_render_ft_stroked_glyph(fz_font *font, int gid, fz_matrix trm, fz_matrix ctm, fz_stroke_state *state); +fz_pixmap *fz_render_glyph(fz_glyph_cache*, fz_font*, int, fz_matrix, fz_colorspace *model); +fz_pixmap *fz_render_stroked_glyph(fz_glyph_cache*, fz_font*, int, fz_matrix, fz_matrix, fz_stroke_state *stroke); +void fz_free_glyph_cache(fz_glyph_cache *); + +/* + * Scan converter + */ + +int fz_get_aa_level(void); +void fz_set_aa_level(int bits); + +typedef struct fz_gel_s fz_gel; + +fz_gel *fz_new_gel(void); +void fz_insert_gel(fz_gel *gel, float x0, float y0, float x1, float y1); +void fz_reset_gel(fz_gel *gel, fz_bbox clip); +void fz_sort_gel(fz_gel *gel); +fz_bbox fz_bound_gel(fz_gel *gel); +void fz_free_gel(fz_gel *gel); +int fz_is_rect_gel(fz_gel *gel); + +void fz_scan_convert(fz_gel *gel, int eofill, fz_bbox clip, fz_pixmap *pix, unsigned char *colorbv); + +void fz_flatten_fill_path(fz_gel *gel, fz_path *path, fz_matrix ctm, float flatness); +void fz_flatten_stroke_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth); +void fz_flatten_dash_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth); + +/* + * The device interface. + */ + +enum +{ + /* Hints */ + FZ_IGNORE_IMAGE = 1, + FZ_IGNORE_SHADE = 2, + + /* Flags */ + FZ_CHARPROC_MASK = 1, + FZ_CHARPROC_COLOR = 2, +}; + +typedef struct fz_device_s fz_device; + +struct fz_device_s +{ + int hints; + int flags; + + void *user; + void (*free_user)(void *); + + void (*fill_path)(void *, fz_path *, int even_odd, fz_matrix, fz_colorspace *, float *color, float alpha); + void (*stroke_path)(void *, fz_path *, fz_stroke_state *, fz_matrix, fz_colorspace *, float *color, float alpha); + void (*clip_path)(void *, fz_path *, fz_rect *rect, int even_odd, fz_matrix); + void (*clip_stroke_path)(void *, fz_path *, fz_rect *rect, fz_stroke_state *, fz_matrix); + + void (*fill_text)(void *, fz_text *, fz_matrix, fz_colorspace *, float *color, float alpha); + void (*stroke_text)(void *, fz_text *, fz_stroke_state *, fz_matrix, fz_colorspace *, float *color, float alpha); + void (*clip_text)(void *, fz_text *, fz_matrix, int accumulate); + void (*clip_stroke_text)(void *, fz_text *, fz_stroke_state *, fz_matrix); + void (*ignore_text)(void *, fz_text *, fz_matrix); + + void (*fill_shade)(void *, fz_shade *shd, fz_matrix ctm, float alpha); + void (*fill_image)(void *, fz_pixmap *img, fz_matrix ctm, float alpha); + void (*fill_image_mask)(void *, fz_pixmap *img, fz_matrix ctm, fz_colorspace *, float *color, float alpha); + void (*clip_image_mask)(void *, fz_pixmap *img, fz_rect *rect, fz_matrix ctm); + + void (*pop_clip)(void *); + + void (*begin_mask)(void *, fz_rect, int luminosity, fz_colorspace *, float *bc); + void (*end_mask)(void *); + void (*begin_group)(void *, fz_rect, int isolated, int knockout, int blendmode, float alpha); + void (*end_group)(void *); + + void (*begin_tile)(void *, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm); + void (*end_tile)(void *); +}; + +void fz_fill_path(fz_device *dev, fz_path *path, int even_odd, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha); +void fz_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha); +void fz_clip_path(fz_device *dev, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm); +void fz_clip_stroke_path(fz_device *dev, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm); +void fz_fill_text(fz_device *dev, fz_text *text, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha); +void fz_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha); +void fz_clip_text(fz_device *dev, fz_text *text, fz_matrix ctm, int accumulate); +void fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm); +void fz_ignore_text(fz_device *dev, fz_text *text, fz_matrix ctm); +void fz_pop_clip(fz_device *dev); +void fz_fill_shade(fz_device *dev, fz_shade *shade, fz_matrix ctm, float alpha); +void fz_fill_image(fz_device *dev, fz_pixmap *image, fz_matrix ctm, float alpha); +void fz_fill_image_mask(fz_device *dev, fz_pixmap *image, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha); +void fz_clip_image_mask(fz_device *dev, fz_pixmap *image, fz_rect *rect, fz_matrix ctm); +void fz_begin_mask(fz_device *dev, fz_rect area, int luminosity, fz_colorspace *colorspace, float *bc); +void fz_end_mask(fz_device *dev); +void fz_begin_group(fz_device *dev, fz_rect area, int isolated, int knockout, int blendmode, float alpha); +void fz_end_group(fz_device *dev); +void fz_begin_tile(fz_device *dev, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm); +void fz_end_tile(fz_device *dev); + +fz_device *fz_new_device(void *user); +void fz_free_device(fz_device *dev); + +fz_device *fz_new_trace_device(void); +fz_device *fz_new_bbox_device(fz_bbox *bboxp); +fz_device *fz_new_draw_device(fz_glyph_cache *cache, fz_pixmap *dest); +fz_device *fz_new_draw_device_type3(fz_glyph_cache *cache, fz_pixmap *dest); + +/* + * Text extraction device + */ + +typedef struct fz_text_span_s fz_text_span; +typedef struct fz_text_char_s fz_text_char; + +struct fz_text_char_s +{ + int c; + fz_bbox bbox; +}; + +struct fz_text_span_s +{ + fz_font *font; + float size; + int wmode; + int len, cap; + fz_text_char *text; + fz_text_span *next; + int eol; +}; + +fz_text_span *fz_new_text_span(void); +void fz_free_text_span(fz_text_span *line); +void fz_debug_text_span(fz_text_span *line); +void fz_debug_text_span_xml(fz_text_span *span); + +fz_device *fz_new_text_device(fz_text_span *text); + +/* + * Display list device -- record and play back device commands. + */ + +typedef struct fz_display_list_s fz_display_list; + +fz_display_list *fz_new_display_list(void); +void fz_free_display_list(fz_display_list *list); +fz_device *fz_new_list_device(fz_display_list *list); +void fz_execute_display_list(fz_display_list *list, fz_device *dev, fz_matrix ctm, fz_bbox area); + +/* + * Plotting functions. + */ + +void fz_accelerate(void); +void fz_accelerate_arch(void); + +void fz_decode_tile(fz_pixmap *pix, float *decode); +void fz_decode_indexed_tile(fz_pixmap *pix, float *decode, int maxval); +void fz_unpack_tile(fz_pixmap *dst, unsigned char * restrict src, int n, int depth, int stride, int scale); + +void fz_paint_solid_alpha(unsigned char * restrict dp, int w, int alpha); +void fz_paint_solid_color(unsigned char * restrict dp, int n, int w, unsigned char *color); + +void fz_paint_span(unsigned char * restrict dp, unsigned char * restrict sp, int n, int w, int alpha); +void fz_paint_span_with_color(unsigned char * restrict dp, unsigned char * restrict mp, int n, int w, unsigned char *color); + +void fz_paint_image(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, int alpha); +void fz_paint_image_with_color(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, unsigned char *colorbv); + +void fz_paint_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha); +void fz_paint_pixmap_with_mask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk); +void fz_paint_pixmap_with_rect(fz_pixmap *dst, fz_pixmap *src, int alpha, fz_bbox bbox); + +void fz_blend_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha, int blendmode, int isolated, fz_pixmap *shape); + +enum +{ + /* PDF 1.4 -- standard separable */ + FZ_BLEND_NORMAL, + FZ_BLEND_MULTIPLY, + FZ_BLEND_SCREEN, + FZ_BLEND_OVERLAY, + FZ_BLEND_DARKEN, + FZ_BLEND_LIGHTEN, + FZ_BLEND_COLOR_DODGE, + FZ_BLEND_COLOR_BURN, + FZ_BLEND_HARD_LIGHT, + FZ_BLEND_SOFT_LIGHT, + FZ_BLEND_DIFFERENCE, + FZ_BLEND_EXCLUSION, + + /* PDF 1.4 -- standard non-separable */ + FZ_BLEND_HUE, + FZ_BLEND_SATURATION, + FZ_BLEND_COLOR, + FZ_BLEND_LUMINOSITY, + + /* For packing purposes */ + FZ_BLEND_MODEMASK = 15, + FZ_BLEND_ISOLATED = 16, + FZ_BLEND_KNOCKOUT = 32 +}; + +#endif diff --git a/contrib/media/updf_newlib/fitz/lrintf.c b/contrib/media/updf_newlib/fitz/lrintf.c new file mode 100755 index 000000000..36975e139 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/lrintf.c @@ -0,0 +1,5 @@ +#include +/* +long long int lrintf(float x) { + return floor(x); +}*/ diff --git a/contrib/media/updf_newlib/fitz/obj_print.c b/contrib/media/updf_newlib/fitz/obj_print.c new file mode 100755 index 000000000..30b34d95e --- /dev/null +++ b/contrib/media/updf_newlib/fitz/obj_print.c @@ -0,0 +1,335 @@ +#include "fitz.h" + +struct fmt +{ + char *buf; + int cap; + int len; + int indent; + int tight; + int col; + int sep; + int last; +}; + +static void fmt_obj(struct fmt *fmt, fz_obj *obj); + +static inline int iswhite(int ch) +{ + return + ch == '\000' || + ch == '\011' || + ch == '\012' || + ch == '\014' || + ch == '\015' || + ch == '\040'; +} + +static inline int isdelim(int ch) +{ + return ch == '(' || ch == ')' || + ch == '<' || ch == '>' || + ch == '[' || ch == ']' || + ch == '{' || ch == '}' || + ch == '/' || + ch == '%'; +} + +static inline void fmt_putc(struct fmt *fmt, int c) +{ + if (fmt->sep && !isdelim(fmt->last) && !isdelim(c)) { + fmt->sep = 0; + fmt_putc(fmt, ' '); + } + fmt->sep = 0; + + if (fmt->buf && fmt->len < fmt->cap) + fmt->buf[fmt->len] = c; + + if (c == '\n') + fmt->col = 0; + else + fmt->col ++; + + fmt->len ++; + + fmt->last = c; +} + +static inline void fmt_indent(struct fmt *fmt) +{ + int i = fmt->indent; + while (i--) { + fmt_putc(fmt, ' '); + fmt_putc(fmt, ' '); + } +} + +static inline void fmt_puts(struct fmt *fmt, char *s) +{ + while (*s) + fmt_putc(fmt, *s++); +} + +static inline void fmt_sep(struct fmt *fmt) +{ + fmt->sep = 1; +} + +static void fmt_str(struct fmt *fmt, fz_obj *obj) +{ + char *s = fz_to_str_buf(obj); + int n = fz_to_str_len(obj); + int i, c; + + fmt_putc(fmt, '('); + for (i = 0; i < n; i++) + { + c = (unsigned char)s[i]; + if (c == '\n') + fmt_puts(fmt, "\\n"); + else if (c == '\r') + fmt_puts(fmt, "\\r"); + else if (c == '\t') + fmt_puts(fmt, "\\t"); + else if (c == '\b') + fmt_puts(fmt, "\\b"); + else if (c == '\f') + fmt_puts(fmt, "\\f"); + else if (c == '(') + fmt_puts(fmt, "\\("); + else if (c == ')') + fmt_puts(fmt, "\\)"); + else if (c < 32 || c >= 127) { + char buf[16]; + fmt_putc(fmt, '\\'); + sprintf(buf, "%03o", c); + fmt_puts(fmt, buf); + } + else + fmt_putc(fmt, c); + } + fmt_putc(fmt, ')'); +} + +static void fmt_hex(struct fmt *fmt, fz_obj *obj) +{ + char *s = fz_to_str_buf(obj); + int n = fz_to_str_len(obj); + int i, b, c; + + fmt_putc(fmt, '<'); + for (i = 0; i < n; i++) { + b = (unsigned char) s[i]; + c = (b >> 4) & 0x0f; + fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); + c = (b) & 0x0f; + fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); + } + fmt_putc(fmt, '>'); +} + +static void fmt_name(struct fmt *fmt, fz_obj *obj) +{ + unsigned char *s = (unsigned char *) fz_to_name(obj); + int i, c; + + fmt_putc(fmt, '/'); + + for (i = 0; s[i]; i++) + { + if (isdelim(s[i]) || iswhite(s[i]) || + s[i] == '#' || s[i] < 32 || s[i] >= 127) + { + fmt_putc(fmt, '#'); + c = (s[i] >> 4) & 0xf; + fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); + c = s[i] & 0xf; + fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA); + } + else + { + fmt_putc(fmt, s[i]); + } + } +} + +static void fmt_array(struct fmt *fmt, fz_obj *obj) +{ + int i; + + if (fmt->tight) { + fmt_putc(fmt, '['); + for (i = 0; i < fz_array_len(obj); i++) { + fmt_obj(fmt, fz_array_get(obj, i)); + fmt_sep(fmt); + } + fmt_putc(fmt, ']'); + } + else { + fmt_puts(fmt, "[ "); + for (i = 0; i < fz_array_len(obj); i++) { + if (fmt->col > 60) { + fmt_putc(fmt, '\n'); + fmt_indent(fmt); + } + fmt_obj(fmt, fz_array_get(obj, i)); + fmt_putc(fmt, ' '); + } + fmt_putc(fmt, ']'); + fmt_sep(fmt); + } +} + +static void fmt_dict(struct fmt *fmt, fz_obj *obj) +{ + int i; + fz_obj *key, *val; + + if (fmt->tight) { + fmt_puts(fmt, "<<"); + for (i = 0; i < fz_dict_len(obj); i++) { + fmt_obj(fmt, fz_dict_get_key(obj, i)); + fmt_sep(fmt); + fmt_obj(fmt, fz_dict_get_val(obj, i)); + fmt_sep(fmt); + } + fmt_puts(fmt, ">>"); + } + else { + fmt_puts(fmt, "<<\n"); + fmt->indent ++; + for (i = 0; i < fz_dict_len(obj); i++) { + key = fz_dict_get_key(obj, i); + val = fz_dict_get_val(obj, i); + fmt_indent(fmt); + fmt_obj(fmt, key); + fmt_putc(fmt, ' '); + if (!fz_is_indirect(val) && fz_is_array(val)) + fmt->indent ++; + fmt_obj(fmt, val); + fmt_putc(fmt, '\n'); + if (!fz_is_indirect(val) && fz_is_array(val)) + fmt->indent --; + } + fmt->indent --; + fmt_indent(fmt); + fmt_puts(fmt, ">>"); + } +} + +static void fmt_obj(struct fmt *fmt, fz_obj *obj) +{ + char buf[256]; + + if (!obj) + fmt_puts(fmt, ""); + else if (fz_is_indirect(obj)) + { + sprintf(buf, "%d %d R", fz_to_num(obj), fz_to_gen(obj)); + fmt_puts(fmt, buf); + } + else if (fz_is_null(obj)) + fmt_puts(fmt, "null"); + else if (fz_is_bool(obj)) + fmt_puts(fmt, fz_to_bool(obj) ? "true" : "false"); + else if (fz_is_int(obj)) + { + sprintf(buf, "%d", fz_to_int(obj)); + fmt_puts(fmt, buf); + } + else if (fz_is_real(obj)) + { + sprintf(buf, "%g", fz_to_real(obj)); + if (strchr(buf, 'e')) /* bad news! */ + sprintf(buf, fabsf(fz_to_real(obj)) > 1 ? "%1.1f" : "%1.8f", fz_to_real(obj)); + fmt_puts(fmt, buf); + } + else if (fz_is_string(obj)) + { + char *str = fz_to_str_buf(obj); + int len = fz_to_str_len(obj); + int added = 0; + int i, c; + for (i = 0; i < len; i++) { + c = (unsigned char)str[i]; + if (strchr("()\\\n\r\t\b\f", c)) + added ++; + else if (c < 32 || c >= 127) + added += 3; + } + if (added < len) + fmt_str(fmt, obj); + else + fmt_hex(fmt, obj); + } + else if (fz_is_name(obj)) + fmt_name(fmt, obj); + else if (fz_is_array(obj)) + fmt_array(fmt, obj); + else if (fz_is_dict(obj)) + fmt_dict(fmt, obj); + else + fmt_puts(fmt, ""); +} + +static int +fz_sprint_obj(char *s, int n, fz_obj *obj, int tight) +{ + struct fmt fmt; + + fmt.indent = 0; + fmt.col = 0; + fmt.sep = 0; + fmt.last = 0; + + fmt.tight = tight; + fmt.buf = s; + fmt.cap = n; + fmt.len = 0; + fmt_obj(&fmt, obj); + + if (fmt.buf && fmt.len < fmt.cap) + fmt.buf[fmt.len] = '\0'; + + return fmt.len; +} + +int +fz_fprint_obj(FILE *fp, fz_obj *obj, int tight) +{ + char buf[1024]; + char *ptr; + int n; + + n = fz_sprint_obj(NULL, 0, obj, tight); + if ((n + 1) < sizeof buf) + { + fz_sprint_obj(buf, sizeof buf, obj, tight); + fputs(buf, fp); + fputc('\n', fp); + } + else + { + ptr = fz_malloc(n + 1); + fz_sprint_obj(ptr, n + 1, obj, tight); + fputs(ptr, fp); + fputc('\n', fp); + fz_free(ptr); + } + return n; +} + +void +fz_debug_obj(fz_obj *obj) +{ + fz_fprint_obj(stdout, obj, 0); +} + +void +fz_debug_ref(fz_obj *ref) +{ + fz_obj *obj; + obj = fz_resolve_indirect(ref); + fz_debug_obj(obj); +} diff --git a/contrib/media/updf_newlib/fitz/res_bitmap.c b/contrib/media/updf_newlib/fitz/res_bitmap.c new file mode 100755 index 000000000..0b852af24 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/res_bitmap.c @@ -0,0 +1,76 @@ +#include "fitz.h" + +fz_bitmap * +fz_new_bitmap(int w, int h, int n) +{ + fz_bitmap *bit; + + bit = fz_malloc(sizeof(fz_bitmap)); + bit->refs = 1; + bit->w = w; + bit->h = h; + bit->n = n; + /* Span is 32 bit aligned. We may want to make this 64 bit if we + * use SSE2 etc. */ + bit->stride = ((n * w + 31) & ~31) >> 3; + + bit->samples = fz_calloc(h, bit->stride); + + return bit; +} + +fz_bitmap * +fz_keep_bitmap(fz_bitmap *pix) +{ + pix->refs++; + return pix; +} + +void +fz_drop_bitmap(fz_bitmap *bit) +{ + if (bit && --bit->refs == 0) + { + fz_free(bit->samples); + fz_free(bit); + } +} + +void +fz_clear_bitmap(fz_bitmap *bit) +{ + memset(bit->samples, 0, bit->stride * bit->h); +} + +/* + * Write bitmap to PBM file + */ + +fz_error +fz_write_pbm(fz_bitmap *bitmap, char *filename) +{ + FILE *fp; + unsigned char *p; + int h, bytestride; + + fp = fopen(filename, "wb"); + if (!fp) + return fz_throw("cannot open file '%s': %s", filename, strerror(errno)); + + assert(bitmap->n == 1); + + fprintf(fp, "P4\n%d %d\n", bitmap->w, bitmap->h); + + p = bitmap->samples; + + h = bitmap->h; + bytestride = (bitmap->w + 7) >> 3; + while (h--) + { + fwrite(p, 1, bytestride, fp); + p += bitmap->stride; + } + + fclose(fp); + return fz_okay; +} diff --git a/contrib/media/updf_newlib/fitz/res_colorspace.c b/contrib/media/updf_newlib/fitz/res_colorspace.c new file mode 100755 index 000000000..47df2b344 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/res_colorspace.c @@ -0,0 +1,685 @@ +#include "fitz.h" + +#define SLOWCMYK + +fz_colorspace * +fz_new_colorspace(char *name, int n) +{ + fz_colorspace *cs = fz_malloc(sizeof(fz_colorspace)); + cs->refs = 1; + fz_strlcpy(cs->name, name, sizeof cs->name); + cs->n = n; + cs->to_rgb = NULL; + cs->from_rgb = NULL; + cs->free_data = NULL; + cs->data = NULL; + return cs; +} + +fz_colorspace * +fz_keep_colorspace(fz_colorspace *cs) +{ + if (cs->refs < 0) + return cs; + cs->refs ++; + return cs; +} + +void +fz_drop_colorspace(fz_colorspace *cs) +{ + if (cs && cs->refs < 0) + return; + if (cs && --cs->refs == 0) + { + if (cs->free_data && cs->data) + cs->free_data(cs); + fz_free(cs); + } +} + +/* Device colorspace definitions */ + +static void gray_to_rgb(fz_colorspace *cs, float *gray, float *rgb) +{ + rgb[0] = gray[0]; + rgb[1] = gray[0]; + rgb[2] = gray[0]; +} + +static void rgb_to_gray(fz_colorspace *cs, float *rgb, float *gray) +{ + float r = rgb[0]; + float g = rgb[1]; + float b = rgb[2]; + gray[0] = r * 0.3f + g * 0.59f + b * 0.11f; +} + +static void rgb_to_rgb(fz_colorspace *cs, float *rgb, float *xyz) +{ + xyz[0] = rgb[0]; + xyz[1] = rgb[1]; + xyz[2] = rgb[2]; +} + +static void bgr_to_rgb(fz_colorspace *cs, float *bgr, float *rgb) +{ + rgb[0] = bgr[2]; + rgb[1] = bgr[1]; + rgb[2] = bgr[0]; +} + +static void rgb_to_bgr(fz_colorspace *cs, float *rgb, float *bgr) +{ + bgr[0] = rgb[2]; + bgr[1] = rgb[1]; + bgr[2] = rgb[0]; +} + +static void cmyk_to_rgb(fz_colorspace *cs, float *cmyk, float *rgb) +{ +#ifdef SLOWCMYK /* from poppler */ + float c = cmyk[0], m = cmyk[1], y = cmyk[2], k = cmyk[3]; + float c1 = 1 - c, m1 = 1 - m, y1 = 1 - y, k1 = 1 - k; + float r, g, b, x; + + /* this is a matrix multiplication, unrolled for performance */ + x = c1 * m1 * y1 * k1; /* 0 0 0 0 */ + r = g = b = x; + x = c1 * m1 * y1 * k; /* 0 0 0 1 */ + r += 0.1373 * x; + g += 0.1216 * x; + b += 0.1255 * x; + x = c1 * m1 * y * k1; /* 0 0 1 0 */ + r += x; + g += 0.9490 * x; + x = c1 * m1 * y * k; /* 0 0 1 1 */ + r += 0.1098 * x; + g += 0.1020 * x; + x = c1 * m * y1 * k1; /* 0 1 0 0 */ + r += 0.9255 * x; + b += 0.5490 * x; + x = c1 * m * y1 * k; /* 0 1 0 1 */ + r += 0.1412 * x; + x = c1 * m * y * k1; /* 0 1 1 0 */ + r += 0.9294 * x; + g += 0.1098 * x; + b += 0.1412 * x; + x = c1 * m * y * k; /* 0 1 1 1 */ + r += 0.1333 * x; + x = c * m1 * y1 * k1; /* 1 0 0 0 */ + g += 0.6784 * x; + b += 0.9373 * x; + x = c * m1 * y1 * k; /* 1 0 0 1 */ + g += 0.0588 * x; + b += 0.1412 * x; + x = c * m1 * y * k1; /* 1 0 1 0 */ + g += 0.6510 * x; + b += 0.3137 * x; + x = c * m1 * y * k; /* 1 0 1 1 */ + g += 0.0745 * x; + x = c * m * y1 * k1; /* 1 1 0 0 */ + r += 0.1804 * x; + g += 0.1922 * x; + b += 0.5725 * x; + x = c * m * y1 * k; /* 1 1 0 1 */ + b += 0.0078 * x; + x = c * m * y * k1; /* 1 1 1 0 */ + r += 0.2118 * x; + g += 0.2119 * x; + b += 0.2235 * x; + + rgb[0] = CLAMP(r, 0, 1); + rgb[1] = CLAMP(g, 0, 1); + rgb[2] = CLAMP(b, 0, 1); +#else + rgb[0] = 1 - MIN(1, cmyk[0] + cmyk[3]); + rgb[1] = 1 - MIN(1, cmyk[1] + cmyk[3]); + rgb[2] = 1 - MIN(1, cmyk[2] + cmyk[3]); +#endif +} + +static void rgb_to_cmyk(fz_colorspace *cs, float *rgb, float *cmyk) +{ + float c, m, y, k; + c = 1 - rgb[0]; + m = 1 - rgb[1]; + y = 1 - rgb[2]; + k = MIN(c, MIN(m, y)); + cmyk[0] = c - k; + cmyk[1] = m - k; + cmyk[2] = y - k; + cmyk[3] = k; +} + +static fz_colorspace k_device_gray = { -1, "DeviceGray", 1, gray_to_rgb, rgb_to_gray }; +static fz_colorspace k_device_rgb = { -1, "DeviceRGB", 3, rgb_to_rgb, rgb_to_rgb }; +static fz_colorspace k_device_bgr = { -1, "DeviceRGB", 3, bgr_to_rgb, rgb_to_bgr }; +static fz_colorspace k_device_cmyk = { -1, "DeviceCMYK", 4, cmyk_to_rgb, rgb_to_cmyk }; + +fz_colorspace *fz_device_gray = &k_device_gray; +fz_colorspace *fz_device_rgb = &k_device_rgb; +fz_colorspace *fz_device_bgr = &k_device_bgr; +fz_colorspace *fz_device_cmyk = &k_device_cmyk; + +fz_colorspace * +fz_find_device_colorspace(char *name) +{ + if (!strcmp(name, "DeviceGray")) + return fz_device_gray; + if (!strcmp(name, "DeviceRGB")) + return fz_device_rgb; + if (!strcmp(name, "DeviceBGR")) + return fz_device_bgr; + if (!strcmp(name, "DeviceCMYK")) + return fz_device_cmyk; + fz_warn("unknown device colorspace: %s", name); + return NULL; +} + +/* Fast pixmap color conversions */ + +static void fast_gray_to_rgb(fz_pixmap *src, fz_pixmap *dst) +{ + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + int n = src->w * src->h; + while (n--) + { + d[0] = s[0]; + d[1] = s[0]; + d[2] = s[0]; + d[3] = s[1]; + s += 2; + d += 4; + } +} + +static void fast_gray_to_cmyk(fz_pixmap *src, fz_pixmap *dst) +{ + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + int n = src->w * src->h; + while (n--) + { + d[0] = 0; + d[1] = 0; + d[2] = 0; + d[3] = s[0]; + d[4] = s[1]; + s += 2; + d += 5; + } +} + +static void fast_rgb_to_gray(fz_pixmap *src, fz_pixmap *dst) +{ + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + int n = src->w * src->h; + while (n--) + { + d[0] = ((s[0]+1) * 77 + (s[1]+1) * 150 + (s[2]+1) * 28) >> 8; + d[1] = s[3]; + s += 4; + d += 2; + } +} + +static void fast_bgr_to_gray(fz_pixmap *src, fz_pixmap *dst) +{ + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + int n = src->w * src->h; + while (n--) + { + d[0] = ((s[0]+1) * 28 + (s[1]+1) * 150 + (s[2]+1) * 77) >> 8; + d[1] = s[3]; + s += 4; + d += 2; + } +} + +static void fast_rgb_to_cmyk(fz_pixmap *src, fz_pixmap *dst) +{ + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + int n = src->w * src->h; + while (n--) + { + unsigned char c = 255 - s[0]; + unsigned char m = 255 - s[1]; + unsigned char y = 255 - s[2]; + unsigned char k = MIN(c, MIN(m, y)); + d[0] = c - k; + d[1] = m - k; + d[2] = y - k; + d[3] = k; + d[4] = s[3]; + s += 4; + d += 5; + } +} + +static void fast_bgr_to_cmyk(fz_pixmap *src, fz_pixmap *dst) +{ + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + int n = src->w * src->h; + while (n--) + { + unsigned char c = 255 - s[2]; + unsigned char m = 255 - s[1]; + unsigned char y = 255 - s[0]; + unsigned char k = MIN(c, MIN(m, y)); + d[0] = c - k; + d[1] = m - k; + d[2] = y - k; + d[3] = k; + d[4] = s[3]; + s += 4; + d += 5; + } +} + +static void fast_cmyk_to_gray(fz_pixmap *src, fz_pixmap *dst) +{ + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + int n = src->w * src->h; + while (n--) + { + unsigned char c = fz_mul255(s[0], 77); + unsigned char m = fz_mul255(s[1], 150); + unsigned char y = fz_mul255(s[2], 28); + d[0] = 255 - MIN(c + m + y + s[3], 255); + d[1] = s[4]; + s += 5; + d += 2; + } +} + +static void fast_cmyk_to_rgb(fz_pixmap *src, fz_pixmap *dst) +{ + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + int n = src->w * src->h; + while (n--) + { +#ifdef SLOWCMYK + float cmyk[4], rgb[3]; + cmyk[0] = s[0] / 255.0f; + cmyk[1] = s[1] / 255.0f; + cmyk[2] = s[2] / 255.0f; + cmyk[3] = s[3] / 255.0f; + cmyk_to_rgb(NULL, cmyk, rgb); + d[0] = rgb[0] * 255; + d[1] = rgb[1] * 255; + d[2] = rgb[2] * 255; +#else + d[0] = 255 - MIN(s[0] + s[3], 255); + d[1] = 255 - MIN(s[1] + s[3], 255); + d[2] = 255 - MIN(s[2] + s[3], 255); +#endif + d[3] = s[4]; + s += 5; + d += 4; + } +} + +static void fast_cmyk_to_bgr(fz_pixmap *src, fz_pixmap *dst) +{ + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + int n = src->w * src->h; + while (n--) + { +#ifdef SLOWCMYK + float cmyk[4], rgb[3]; + cmyk[0] = s[0] / 255.0f; + cmyk[1] = s[1] / 255.0f; + cmyk[2] = s[2] / 255.0f; + cmyk[3] = s[3] / 255.0f; + cmyk_to_rgb(NULL, cmyk, rgb); + d[0] = rgb[2] * 255; + d[1] = rgb[1] * 255; + d[2] = rgb[0] * 255; +#else + d[0] = 255 - MIN(s[2] + s[3], 255); + d[1] = 255 - MIN(s[1] + s[3], 255); + d[2] = 255 - MIN(s[0] + s[3], 255); +#endif + d[3] = s[4]; + s += 5; + d += 4; + } +} + +static void fast_rgb_to_bgr(fz_pixmap *src, fz_pixmap *dst) +{ + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + int n = src->w * src->h; + while (n--) + { + d[0] = s[2]; + d[1] = s[1]; + d[2] = s[0]; + d[3] = s[3]; + s += 4; + d += 4; + } +} + +static void +fz_std_conv_pixmap(fz_pixmap *src, fz_pixmap *dst) +{ + float srcv[FZ_MAX_COLORS]; + float dstv[FZ_MAX_COLORS]; + int srcn, dstn; + int y, x, k, i; + + fz_colorspace *ss = src->colorspace; + fz_colorspace *ds = dst->colorspace; + + unsigned char *s = src->samples; + unsigned char *d = dst->samples; + + assert(src->w == dst->w && src->h == dst->h); + assert(src->n == ss->n + 1); + assert(dst->n == ds->n + 1); + + srcn = ss->n; + dstn = ds->n; + + /* Special case for Lab colorspace (scaling of components to float) */ + if (!strcmp(ss->name, "Lab") && srcn == 3) + { + for (y = 0; y < src->h; y++) + { + for (x = 0; x < src->w; x++) + { + srcv[0] = *s++ / 255.0f * 100; + srcv[1] = *s++ - 128; + srcv[2] = *s++ - 128; + + fz_convert_color(ss, srcv, ds, dstv); + + for (k = 0; k < dstn; k++) + *d++ = dstv[k] * 255; + + *d++ = *s++; + } + } + } + + /* Brute-force for small images */ + else if (src->w * src->h < 256) + { + for (y = 0; y < src->h; y++) + { + for (x = 0; x < src->w; x++) + { + for (k = 0; k < srcn; k++) + srcv[k] = *s++ / 255.0f; + + fz_convert_color(ss, srcv, ds, dstv); + + for (k = 0; k < dstn; k++) + *d++ = dstv[k] * 255; + + *d++ = *s++; + } + } + } + + /* 1-d lookup table for separation and similar colorspaces */ + else if (srcn == 1) + { + unsigned char lookup[FZ_MAX_COLORS * 256]; + + for (i = 0; i < 256; i++) + { + srcv[0] = i / 255.0f; + fz_convert_color(ss, srcv, ds, dstv); + for (k = 0; k < dstn; k++) + lookup[i * dstn + k] = dstv[k] * 255; + } + + for (y = 0; y < src->h; y++) + { + for (x = 0; x < src->w; x++) + { + i = *s++; + for (k = 0; k < dstn; k++) + *d++ = lookup[i * dstn + k]; + *d++ = *s++; + } + } + } + + /* Memoize colors using a hash table for the general case */ + else + { + fz_hash_table *lookup; + unsigned char *color; + + lookup = fz_new_hash_table(509, srcn); + + for (y = 0; y < src->h; y++) + { + for (x = 0; x < src->w; x++) + { + color = fz_hash_find(lookup, s); + if (color) + { + memcpy(d, color, dstn); + s += srcn; + d += dstn; + *d++ = *s++; + } + else + { + for (k = 0; k < srcn; k++) + srcv[k] = *s++ / 255.0f; + fz_convert_color(ss, srcv, ds, dstv); + for (k = 0; k < dstn; k++) + *d++ = dstv[k] * 255; + + fz_hash_insert(lookup, s - srcn, d - dstn); + + *d++ = *s++; + } + } + } + + fz_free_hash(lookup); + } +} + +void +fz_convert_pixmap(fz_pixmap *sp, fz_pixmap *dp) +{ + fz_colorspace *ss = sp->colorspace; + fz_colorspace *ds = dp->colorspace; + + assert(ss && ds); + + if (sp->mask) + dp->mask = fz_keep_pixmap(sp->mask); + dp->interpolate = sp->interpolate; + + if (ss == fz_device_gray) + { + if (ds == fz_device_rgb) fast_gray_to_rgb(sp, dp); + else if (ds == fz_device_bgr) fast_gray_to_rgb(sp, dp); /* bgr == rgb here */ + else if (ds == fz_device_cmyk) fast_gray_to_cmyk(sp, dp); + else fz_std_conv_pixmap(sp, dp); + } + + else if (ss == fz_device_rgb) + { + if (ds == fz_device_gray) fast_rgb_to_gray(sp, dp); + else if (ds == fz_device_bgr) fast_rgb_to_bgr(sp, dp); + else if (ds == fz_device_cmyk) fast_rgb_to_cmyk(sp, dp); + else fz_std_conv_pixmap(sp, dp); + } + + else if (ss == fz_device_bgr) + { + if (ds == fz_device_gray) fast_bgr_to_gray(sp, dp); + else if (ds == fz_device_rgb) fast_rgb_to_bgr(sp, dp); /* bgr = rgb here */ + else if (ds == fz_device_cmyk) fast_bgr_to_cmyk(sp, dp); + else fz_std_conv_pixmap(sp, dp); + } + + else if (ss == fz_device_cmyk) + { + if (ds == fz_device_gray) fast_cmyk_to_gray(sp, dp); + else if (ds == fz_device_bgr) fast_cmyk_to_bgr(sp, dp); + else if (ds == fz_device_rgb) fast_cmyk_to_rgb(sp, dp); + else fz_std_conv_pixmap(sp, dp); + } + + else fz_std_conv_pixmap(sp, dp); +} + +/* Convert a single color */ + +static void +fz_std_conv_color(fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *dstv) +{ + float rgb[3]; + int i; + + if (srcs != dsts) + { + assert(srcs->to_rgb && dsts->from_rgb); + srcs->to_rgb(srcs, srcv, rgb); + dsts->from_rgb(dsts, rgb, dstv); + for (i = 0; i < dsts->n; i++) + dstv[i] = CLAMP(dstv[i], 0, 1); + } + else + { + for (i = 0; i < srcs->n; i++) + dstv[i] = srcv[i]; + } +} + +void +fz_convert_color(fz_colorspace *ss, float *sv, fz_colorspace *ds, float *dv) +{ + if (ss == fz_device_gray) + { + if ((ds == fz_device_rgb) || (ds == fz_device_bgr)) + { + dv[0] = sv[0]; + dv[1] = sv[0]; + dv[2] = sv[0]; + } + else if (ds == fz_device_cmyk) + { + dv[0] = 0; + dv[1] = 0; + dv[2] = 0; + dv[3] = sv[0]; + } + else + fz_std_conv_color(ss, sv, ds, dv); + } + + else if (ss == fz_device_rgb) + { + if (ds == fz_device_gray) + { + dv[0] = sv[0] * 0.3f + sv[1] * 0.59f + sv[2] * 0.11f; + } + else if (ds == fz_device_bgr) + { + dv[0] = sv[2]; + dv[1] = sv[1]; + dv[2] = sv[0]; + } + else if (ds == fz_device_cmyk) + { + float c = 1 - sv[0]; + float m = 1 - sv[1]; + float y = 1 - sv[2]; + float k = MIN(c, MIN(m, y)); + dv[0] = c - k; + dv[1] = m - k; + dv[2] = y - k; + dv[3] = k; + } + else + fz_std_conv_color(ss, sv, ds, dv); + } + + else if (ss == fz_device_bgr) + { + if (ds == fz_device_gray) + { + dv[0] = sv[0] * 0.11f + sv[1] * 0.59f + sv[2] * 0.3f; + } + else if (ds == fz_device_bgr) + { + dv[0] = sv[2]; + dv[1] = sv[1]; + dv[2] = sv[0]; + } + else if (ds == fz_device_cmyk) + { + float c = 1 - sv[2]; + float m = 1 - sv[1]; + float y = 1 - sv[0]; + float k = MIN(c, MIN(m, y)); + dv[0] = c - k; + dv[1] = m - k; + dv[2] = y - k; + dv[3] = k; + } + else + fz_std_conv_color(ss, sv, ds, dv); + } + + else if (ss == fz_device_cmyk) + { + if (ds == fz_device_gray) + { + float c = sv[0] * 0.3f; + float m = sv[1] * 0.59f; + float y = sv[2] * 0.11f; + dv[0] = 1 - MIN(c + m + y + sv[3], 1); + } + else if (ds == fz_device_rgb) + { +#ifdef SLOWCMYK + cmyk_to_rgb(NULL, sv, dv); +#else + dv[0] = 1 - MIN(sv[0] + sv[3], 1); + dv[1] = 1 - MIN(sv[1] + sv[3], 1); + dv[2] = 1 - MIN(sv[2] + sv[3], 1); +#endif + } + else if (ds == fz_device_bgr) + { +#ifdef SLOWCMYK + float rgb[3]; + cmyk_to_rgb(NULL, sv, rgb); + dv[0] = rgb[2]; + dv[1] = rgb[1]; + dv[2] = rgb[0]; +#else + dv[0] = 1 - MIN(sv[2] + sv[3], 1); + dv[1] = 1 - MIN(sv[1] + sv[3], 1); + dv[2] = 1 - MIN(sv[0] + sv[3], 1); +#endif + } + else + fz_std_conv_color(ss, sv, ds, dv); + } + + else + fz_std_conv_color(ss, sv, ds, dv); +} diff --git a/contrib/media/updf_newlib/fitz/res_font.c b/contrib/media/updf_newlib/fitz/res_font.c new file mode 100755 index 000000000..ffee1d46d --- /dev/null +++ b/contrib/media/updf_newlib/fitz/res_font.c @@ -0,0 +1,609 @@ +#include "fitz.h" + +#include +#include FT_FREETYPE_H +#include FT_STROKER_H + +static void fz_finalize_freetype(void); + +static fz_font * +fz_new_font(char *name) +{ + fz_font *font; + + font = fz_malloc(sizeof(fz_font)); + font->refs = 1; + + if (name) + fz_strlcpy(font->name, name, sizeof font->name); + else + fz_strlcpy(font->name, "(null)", sizeof font->name); + + font->ft_face = NULL; + font->ft_substitute = 0; + font->ft_bold = 0; + font->ft_italic = 0; + font->ft_hint = 0; + + font->ft_file = NULL; + font->ft_data = NULL; + font->ft_size = 0; + + font->t3matrix = fz_identity; + font->t3resources = NULL; + font->t3procs = NULL; + font->t3widths = NULL; + font->t3xref = NULL; + font->t3run = NULL; + + font->bbox.x0 = 0; + font->bbox.y0 = 0; + font->bbox.x1 = 1000; + font->bbox.y1 = 1000; + + font->width_count = 0; + font->width_table = NULL; + + return font; +} + +fz_font * +fz_keep_font(fz_font *font) +{ + font->refs ++; + return font; +} + +void +fz_drop_font(fz_font *font) +{ + int fterr; + int i; + + if (font && --font->refs == 0) + { + if (font->t3procs) + { + if (font->t3resources) + fz_drop_obj(font->t3resources); + for (i = 0; i < 256; i++) + if (font->t3procs[i]) + fz_drop_buffer(font->t3procs[i]); + fz_free(font->t3procs); + fz_free(font->t3widths); + } + + if (font->ft_face) + { + fterr = FT_Done_Face((FT_Face)font->ft_face); + if (fterr) + fz_warn("freetype finalizing face: %s", ft_error_string(fterr)); + fz_finalize_freetype(); + } + + if (font->ft_file) + fz_free(font->ft_file); + if (font->ft_data) + fz_free(font->ft_data); + + if (font->width_table) + fz_free(font->width_table); + + fz_free(font); + } +} + +void +fz_set_font_bbox(fz_font *font, float xmin, float ymin, float xmax, float ymax) +{ + font->bbox.x0 = xmin; + font->bbox.y0 = ymin; + font->bbox.x1 = xmax; + font->bbox.y1 = ymax; +} + +/* + * Freetype hooks + */ + +static FT_Library fz_ftlib = NULL; +static int fz_ftlib_refs = 0; + +#undef __FTERRORS_H__ +#define FT_ERRORDEF(e, v, s) { (e), (s) }, +#define FT_ERROR_START_LIST +#define FT_ERROR_END_LIST { 0, NULL } + +struct ft_error +{ + int err; + char *str; +}; + +static const struct ft_error ft_errors[] = +{ +#include FT_ERRORS_H +}; + +char *ft_error_string(int err) +{ + const struct ft_error *e; + + for (e = ft_errors; e->str != NULL; e++) + if (e->err == err) + return e->str; + + return "Unknown error"; +} + +static fz_error +fz_init_freetype(void) +{ + int fterr; + int maj, min, pat; + + if (fz_ftlib) + { + fz_ftlib_refs++; + return fz_okay; + } + + fterr = FT_Init_FreeType(&fz_ftlib); + if (fterr) + return fz_throw("cannot init freetype: %s", ft_error_string(fterr)); + + FT_Library_Version(fz_ftlib, &maj, &min, &pat); + if (maj == 2 && min == 1 && pat < 7) + { + fterr = FT_Done_FreeType(fz_ftlib); + if (fterr) + fz_warn("freetype finalizing: %s", ft_error_string(fterr)); + return fz_throw("freetype version too old: %d.%d.%d", maj, min, pat); + } + + fz_ftlib_refs++; + return fz_okay; +} + +static void +fz_finalize_freetype(void) +{ + int fterr; + + if (--fz_ftlib_refs == 0) + { + fterr = FT_Done_FreeType(fz_ftlib); + if (fterr) + fz_warn("freetype finalizing: %s", ft_error_string(fterr)); + fz_ftlib = NULL; + } +} + +fz_error +fz_new_font_from_file(fz_font **fontp, char *path, int index) +{ + FT_Face face; + fz_error error; + fz_font *font; + int fterr; + + error = fz_init_freetype(); + if (error) + return fz_rethrow(error, "cannot init freetype library"); + + fterr = FT_New_Face(fz_ftlib, path, index, &face); + if (fterr) + return fz_throw("freetype: cannot load font: %s", ft_error_string(fterr)); + + font = fz_new_font(face->family_name); + font->ft_face = face; + font->bbox.x0 = face->bbox.xMin * 1000 / face->units_per_EM; + font->bbox.y0 = face->bbox.yMin * 1000 / face->units_per_EM; + font->bbox.x1 = face->bbox.xMax * 1000 / face->units_per_EM; + font->bbox.y1 = face->bbox.yMax * 1000 / face->units_per_EM; + + *fontp = font; + return fz_okay; +} + +fz_error +fz_new_font_from_memory(fz_font **fontp, unsigned char *data, int len, int index) +{ + FT_Face face; + fz_error error; + fz_font *font; + int fterr; + + error = fz_init_freetype(); + if (error) + return fz_rethrow(error, "cannot init freetype library"); + + fterr = FT_New_Memory_Face(fz_ftlib, data, len, index, &face); + if (fterr) + return fz_throw("freetype: cannot load font: %s", ft_error_string(fterr)); + + font = fz_new_font(face->family_name); + font->ft_face = face; + font->bbox.x0 = face->bbox.xMin * 1000 / face->units_per_EM; + font->bbox.y0 = face->bbox.yMin * 1000 / face->units_per_EM; + font->bbox.x1 = face->bbox.xMax * 1000 / face->units_per_EM; + font->bbox.y1 = face->bbox.yMax * 1000 / face->units_per_EM; + + *fontp = font; + return fz_okay; +} + +static fz_matrix +fz_adjust_ft_glyph_width(fz_font *font, int gid, fz_matrix trm) +{ + /* Fudge the font matrix to stretch the glyph if we've substituted the font. */ + if (font->ft_substitute && gid < font->width_count) + { + FT_Error fterr; + int subw; + int realw; + float scale; + + /* TODO: use FT_Get_Advance */ + fterr = FT_Set_Char_Size(font->ft_face, 1000, 1000, 72, 72); + if (fterr) + fz_warn("freetype setting character size: %s", ft_error_string(fterr)); + + fterr = FT_Load_Glyph(font->ft_face, gid, + FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM); + if (fterr) + fz_warn("freetype failed to load glyph: %s", ft_error_string(fterr)); + + realw = ((FT_Face)font->ft_face)->glyph->metrics.horiAdvance; + subw = font->width_table[gid]; + if (realw) + scale = (float) subw / realw; + else + scale = 1; + + return fz_concat(fz_scale(scale, 1), trm); + } + + return trm; +} + +static fz_pixmap * +fz_copy_ft_bitmap(int left, int top, FT_Bitmap *bitmap) +{ + fz_pixmap *pixmap; + int y; + + pixmap = fz_new_pixmap(NULL, bitmap->width, bitmap->rows); + pixmap->x = left; + pixmap->y = top - bitmap->rows; + + if (bitmap->pixel_mode == FT_PIXEL_MODE_MONO) + { + for (y = 0; y < pixmap->h; y++) + { + unsigned char *out = pixmap->samples + y * pixmap->w; + unsigned char *in = bitmap->buffer + (pixmap->h - y - 1) * bitmap->pitch; + unsigned char bit = 0x80; + int w = pixmap->w; + while (w--) + { + *out++ = (*in & bit) ? 255 : 0; + bit >>= 1; + if (bit == 0) + { + bit = 0x80; + in++; + } + } + } + } + else + { + for (y = 0; y < pixmap->h; y++) + { + memcpy(pixmap->samples + y * pixmap->w, + bitmap->buffer + (pixmap->h - y - 1) * bitmap->pitch, + pixmap->w); + } + } + + return pixmap; +} + +fz_pixmap * +fz_render_ft_glyph(fz_font *font, int gid, fz_matrix trm) +{ + FT_Face face = font->ft_face; + FT_Matrix m; + FT_Vector v; + FT_Error fterr; + + trm = fz_adjust_ft_glyph_width(font, gid, trm); + + if (font->ft_italic) + trm = fz_concat(fz_shear(0.3f, 0), trm); + + /* + Freetype mutilates complex glyphs if they are loaded + with FT_Set_Char_Size 1.0. it rounds the coordinates + before applying transformation. to get more precision in + freetype, we shift part of the scale in the matrix + into FT_Set_Char_Size instead + */ + + m.xx = trm.a * 64; /* should be 65536 */ + m.yx = trm.b * 64; + m.xy = trm.c * 64; + m.yy = trm.d * 64; + v.x = trm.e * 64; + v.y = trm.f * 64; + + fterr = FT_Set_Char_Size(face, 65536, 65536, 72, 72); /* should be 64, 64 */ + if (fterr) + fz_warn("freetype setting character size: %s", ft_error_string(fterr)); + FT_Set_Transform(face, &m, &v); + + if (fz_get_aa_level() == 0) + { + /* If you really want grid fitting, enable this code. */ + float scale = fz_matrix_expansion(trm); + m.xx = trm.a * 65536 / scale; + m.xy = trm.b * 65536 / scale; + m.yx = trm.c * 65536 / scale; + m.yy = trm.d * 65536 / scale; + v.x = 0; + v.y = 0; + + fterr = FT_Set_Char_Size(face, 64 * scale, 64 * scale, 72, 72); + if (fterr) + fz_warn("freetype setting character size: %s", ft_error_string(fterr)); + FT_Set_Transform(face, &m, &v); + fterr = FT_Load_Glyph(face, gid, FT_LOAD_NO_BITMAP | FT_LOAD_TARGET_MONO); + if (fterr) + fz_warn("freetype load glyph (gid %d): %s", gid, ft_error_string(fterr)); + } + else if (font->ft_hint) + { + /* + Enable hinting, but keep the huge char size so that + it is hinted for a character. This will in effect nullify + the effect of grid fitting. This form of hinting should + only be used for DynaLab and similar tricky TrueType fonts, + so that we get the correct outline shape. + */ + fterr = FT_Load_Glyph(face, gid, FT_LOAD_NO_BITMAP); + if (fterr) + fz_warn("freetype load glyph (gid %d): %s", gid, ft_error_string(fterr)); + } + else + { + fterr = FT_Load_Glyph(face, gid, FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING); + if (fterr) + { + fz_warn("freetype load glyph (gid %d): %s", gid, ft_error_string(fterr)); + return NULL; + } + } + + if (font->ft_bold) + { + float strength = fz_matrix_expansion(trm) * 0.04f; + FT_Outline_Embolden(&face->glyph->outline, strength * 64); + FT_Outline_Translate(&face->glyph->outline, -strength * 32, -strength * 32); + } + + fterr = FT_Render_Glyph(face->glyph, fz_get_aa_level() > 0 ? FT_RENDER_MODE_NORMAL : FT_RENDER_MODE_MONO); + if (fterr) + { + fz_warn("freetype render glyph (gid %d): %s", gid, ft_error_string(fterr)); + return NULL; + } + + return fz_copy_ft_bitmap(face->glyph->bitmap_left, face->glyph->bitmap_top, &face->glyph->bitmap); +} + +fz_pixmap * +fz_render_ft_stroked_glyph(fz_font *font, int gid, fz_matrix trm, fz_matrix ctm, fz_stroke_state *state) +{ + FT_Face face = font->ft_face; + float expansion = fz_matrix_expansion(ctm); + int linewidth = state->linewidth * expansion * 64 / 2; + FT_Matrix m; + FT_Vector v; + FT_Error fterr; + FT_Stroker stroker; + FT_Glyph glyph; + FT_BitmapGlyph bitmap; + fz_pixmap *pixmap; + + trm = fz_adjust_ft_glyph_width(font, gid, trm); + + if (font->ft_italic) + trm = fz_concat(fz_shear(0.3f, 0), trm); + + m.xx = trm.a * 64; /* should be 65536 */ + m.yx = trm.b * 64; + m.xy = trm.c * 64; + m.yy = trm.d * 64; + v.x = trm.e * 64; + v.y = trm.f * 64; + + fterr = FT_Set_Char_Size(face, 65536, 65536, 72, 72); /* should be 64, 64 */ + if (fterr) + { + fz_warn("FT_Set_Char_Size: %s", ft_error_string(fterr)); + return NULL; + } + + FT_Set_Transform(face, &m, &v); + + fterr = FT_Load_Glyph(face, gid, FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING); + if (fterr) + { + fz_warn("FT_Load_Glyph(gid %d): %s", gid, ft_error_string(fterr)); + return NULL; + } + + fterr = FT_Stroker_New(fz_ftlib, &stroker); + if (fterr) + { + fz_warn("FT_Stroker_New: %s", ft_error_string(fterr)); + return NULL; + } + + FT_Stroker_Set(stroker, linewidth, state->start_cap, state->linejoin, state->miterlimit * 65536); + + fterr = FT_Get_Glyph(face->glyph, &glyph); + if (fterr) + { + fz_warn("FT_Get_Glyph: %s", ft_error_string(fterr)); + FT_Stroker_Done(stroker); + return NULL; + } + + fterr = FT_Glyph_Stroke(&glyph, stroker, 1); + if (fterr) + { + fz_warn("FT_Glyph_Stroke: %s", ft_error_string(fterr)); + FT_Done_Glyph(glyph); + FT_Stroker_Done(stroker); + return NULL; + } + + FT_Stroker_Done(stroker); + + fterr = FT_Glyph_To_Bitmap(&glyph, fz_get_aa_level() > 0 ? FT_RENDER_MODE_NORMAL : FT_RENDER_MODE_MONO, 0, 1); + if (fterr) + { + fz_warn("FT_Glyph_To_Bitmap: %s", ft_error_string(fterr)); + FT_Done_Glyph(glyph); + return NULL; + } + + bitmap = (FT_BitmapGlyph)glyph; + pixmap = fz_copy_ft_bitmap(bitmap->left, bitmap->top, &bitmap->bitmap); + FT_Done_Glyph(glyph); + + return pixmap; +} + +/* + * Type 3 fonts... + */ + +fz_font * +fz_new_type3_font(char *name, fz_matrix matrix) +{ + fz_font *font; + int i; + + font = fz_new_font(name); + font->t3procs = fz_calloc(256, sizeof(fz_buffer*)); + font->t3widths = fz_calloc(256, sizeof(float)); + + font->t3matrix = matrix; + for (i = 0; i < 256; i++) + { + font->t3procs[i] = NULL; + font->t3widths[i] = 0; + } + + return font; +} + +fz_pixmap * +fz_render_t3_glyph(fz_font *font, int gid, fz_matrix trm, fz_colorspace *model) +{ + fz_error error; + fz_matrix ctm; + fz_buffer *contents; + fz_bbox bbox; + fz_device *dev; + fz_glyph_cache *cache; + fz_pixmap *glyph; + fz_pixmap *result; + + if (gid < 0 || gid > 255) + return NULL; + + contents = font->t3procs[gid]; + if (!contents) + return NULL; + + ctm = fz_concat(font->t3matrix, trm); + dev = fz_new_bbox_device(&bbox); + error = font->t3run(font->t3xref, font->t3resources, contents, dev, ctm); + if (error) + fz_catch(error, "cannot draw type3 glyph"); + + if (dev->flags & FZ_CHARPROC_MASK) + { + if (dev->flags & FZ_CHARPROC_COLOR) + fz_warn("type3 glyph claims to be both masked and colored"); + model = NULL; + } + else if (dev->flags & FZ_CHARPROC_COLOR) + { + if (model == NULL) + fz_warn("colored type3 glyph wanted in masked context"); + } + else + { + fz_warn("type3 glyph doesn't specify masked or colored"); + model = NULL; /* Treat as masked */ + } + + fz_free_device(dev); + + bbox.x0--; + bbox.y0--; + bbox.x1++; + bbox.y1++; + + glyph = fz_new_pixmap_with_rect(model ? model : fz_device_gray, bbox); + fz_clear_pixmap(glyph); + + cache = fz_new_glyph_cache(); + dev = fz_new_draw_device_type3(cache, glyph); + error = font->t3run(font->t3xref, font->t3resources, contents, dev, ctm); + if (error) + fz_catch(error, "cannot draw type3 glyph"); + fz_free_device(dev); + fz_free_glyph_cache(cache); + + if (model == NULL) + { + result = fz_alpha_from_gray(glyph, 0); + fz_drop_pixmap(glyph); + } + else + result = glyph; + + return result; +} + +void +fz_debug_font(fz_font *font) +{ + printf("font '%s' {\n", font->name); + + if (font->ft_face) + { + printf("\tfreetype face %p\n", font->ft_face); + if (font->ft_substitute) + printf("\tsubstitute font\n"); + } + + if (font->t3procs) + { + printf("\ttype3 matrix [%g %g %g %g]\n", + font->t3matrix.a, font->t3matrix.b, + font->t3matrix.c, font->t3matrix.d); + } + + printf("\tbbox [%g %g %g %g]\n", + font->bbox.x0, font->bbox.y0, + font->bbox.x1, font->bbox.y1); + + printf("}\n"); +} diff --git a/contrib/media/updf_newlib/fitz/res_halftone.c b/contrib/media/updf_newlib/fitz/res_halftone.c new file mode 100755 index 000000000..e45454ea7 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/res_halftone.c @@ -0,0 +1,190 @@ +#include "fitz.h" + +fz_halftone * +fz_new_halftone(int comps) +{ + fz_halftone *ht; + int i; + + ht = fz_malloc(sizeof(fz_halftone) + (comps-1)*sizeof(fz_pixmap *)); + ht->refs = 1; + ht->n = comps; + for (i = 0; i < comps; i++) + ht->comp[i] = NULL; + + return ht; +} + +fz_halftone * +fz_keep_halftone(fz_halftone *ht) +{ + ht->refs++; + return ht; +} + +void +fz_drop_halftone(fz_halftone *ht) +{ + int i; + + if (!ht || --ht->refs != 0) + return; + for (i = 0; i < ht->n; i++) + fz_drop_pixmap(ht->comp[i]); + fz_free(ht); +} + +/* Default mono halftone, lifted from Ghostscript. */ +static unsigned char mono_ht[] = +{ + 0x0E, 0x8E, 0x2E, 0xAE, 0x06, 0x86, 0x26, 0xA6, 0x0C, 0x8C, 0x2C, 0xAC, 0x04, 0x84, 0x24, 0xA4, + 0xCE, 0x4E, 0xEE, 0x6E, 0xC6, 0x46, 0xE6, 0x66, 0xCC, 0x4C, 0xEC, 0x6C, 0xC4, 0x44, 0xE4, 0x64, + 0x3E, 0xBE, 0x1E, 0x9E, 0x36, 0xB6, 0x16, 0x96, 0x3C, 0xBC, 0x1C, 0x9C, 0x34, 0xB4, 0x14, 0x94, + 0xFE, 0x7E, 0xDE, 0x5E, 0xF6, 0x76, 0xD6, 0x56, 0xFC, 0x7C, 0xDC, 0x5C, 0xF4, 0x74, 0xD4, 0x54, + 0x01, 0x81, 0x21, 0xA1, 0x09, 0x89, 0x29, 0xA9, 0x03, 0x83, 0x23, 0xA3, 0x0B, 0x8B, 0x2B, 0xAB, + 0xC1, 0x41, 0xE1, 0x61, 0xC9, 0x49, 0xE9, 0x69, 0xC3, 0x43, 0xE3, 0x63, 0xCB, 0x4B, 0xEB, 0x6B, + 0x31, 0xB1, 0x11, 0x91, 0x39, 0xB9, 0x19, 0x99, 0x33, 0xB3, 0x13, 0x93, 0x3B, 0xBB, 0x1B, 0x9B, + 0xF1, 0x71, 0xD1, 0x51, 0xF9, 0x79, 0xD9, 0x59, 0xF3, 0x73, 0xD3, 0x53, 0xFB, 0x7B, 0xDB, 0x5B, + 0x0D, 0x8D, 0x2D, 0xAD, 0x05, 0x85, 0x25, 0xA5, 0x0F, 0x8F, 0x2F, 0xAF, 0x07, 0x87, 0x27, 0xA7, + 0xCD, 0x4D, 0xED, 0x6D, 0xC5, 0x45, 0xE5, 0x65, 0xCF, 0x4F, 0xEF, 0x6F, 0xC7, 0x47, 0xE7, 0x67, + 0x3D, 0xBD, 0x1D, 0x9D, 0x35, 0xB5, 0x15, 0x95, 0x3F, 0xBF, 0x1F, 0x9F, 0x37, 0xB7, 0x17, 0x97, + 0xFD, 0x7D, 0xDD, 0x5D, 0xF5, 0x75, 0xD5, 0x55, 0xFF, 0x7F, 0xDF, 0x5F, 0xF7, 0x77, 0xD7, 0x57, + 0x02, 0x82, 0x22, 0xA2, 0x0A, 0x8A, 0x2A, 0xAA, 0x00, 0x80, 0x20, 0xA0, 0x08, 0x88, 0x28, 0xA8, + 0xC2, 0x42, 0xE2, 0x62, 0xCA, 0x4A, 0xEA, 0x6A, 0xC0, 0x40, 0xE0, 0x60, 0xC8, 0x48, 0xE8, 0x68, + 0x32, 0xB2, 0x12, 0x92, 0x3A, 0xBA, 0x1A, 0x9A, 0x30, 0xB0, 0x10, 0x90, 0x38, 0xB8, 0x18, 0x98, + 0xF2, 0x72, 0xD2, 0x52, 0xFA, 0x7A, 0xDA, 0x5A, 0xF0, 0x70, 0xD0, 0x50, 0xF8, 0x78, 0xD8, 0x58 +}; + +fz_halftone *fz_get_default_halftone(int num_comps) +{ + fz_halftone *ht = fz_new_halftone(num_comps); + assert(num_comps == 1); /* Only support 1 component for now */ + ht->comp[0] = fz_new_pixmap_with_data(NULL, 16, 16, mono_ht); + return ht; +} + +/* Finally, code to actually perform halftoning. */ +static void make_ht_line(unsigned char *buf, fz_halftone *ht, int x, int y, int w) +{ + /* FIXME: There is a potential optimisation here; in the case where + * the LCM of the halftone tile widths is smaller than w, we could + * form just one 'LCM' run, then copy it repeatedly. + */ + int k, n; + n = ht->n; + for (k = 0; k < n; k++) + { + fz_pixmap *tile = ht->comp[k]; + unsigned char *b = buf++; + unsigned char *t; + unsigned char *tbase; + int px = x + tile->x; + int py = y + tile->y; + int tw = tile->w; + int th = tile->h; + int w2 = w; + int len; + px = px % tw; + if (px < 0) + px += tw; + py = py % th; + if (py < 0) + py += th; + + assert(tile->n == 1); + + /* Left hand section; from x to tile width */ + tbase = tile->samples + py * tw; + t = tbase + px; + len = tw - px; + if (len > w2) + len = w2; + w2 -= len; + while (len--) + { + *b = *t++; + b += n; + } + + /* Centre section - complete copies */ + w2 -= tw; + while (w2 >= 0) + { + len = tw; + t = tbase; + while (len--) + { + *b = *t++; + b += n; + } + w2 -= tw; + } + w2 += tw; + + /* Right hand section - stragglers */ + t = tbase; + while (w2--) + { + *b = *t++; + b += n; + } + } +} + +/* Inner mono thresholding code */ +static void do_threshold_1(unsigned char *ht_line, unsigned char *pixmap, unsigned char *out, int w) +{ + int bit = 0x80; + int h = 0; + + do + { + if (*pixmap < *ht_line++) + h |= bit; + pixmap += 2; /* Skip the alpha */ + bit >>= 1; + if (bit == 0) + { + *out++ = h; + h = 0; + bit = 0x80; + } + + } + while (--w); + if (bit != 0x80) + *out++ = h; +} + +fz_bitmap *fz_halftone_pixmap(fz_pixmap *pix, fz_halftone *ht) +{ + fz_bitmap *out; + unsigned char *ht_line, *o, *p; + int w, h, x, y, n, pstride, ostride; + + if (pix == NULL || ht == NULL) + return NULL; + + assert(pix->n == 2); /* Mono + Alpha */ + + n = pix->n-1; /* Remove alpha */ + ht_line = fz_malloc(pix->w * n); + out = fz_new_bitmap(pix->w, pix->h, n); + o = out->samples; + p = pix->samples; + + h = pix->h; + x = pix->x; + y = pix->y; + w = pix->w; + ostride = out->stride; + pstride = pix->w * pix->n; + while (h--) + { + make_ht_line(ht_line, ht, x, y++, w); + do_threshold_1(ht_line, p, o, w); + o += ostride; + p += pstride; + } + return out; +} diff --git a/contrib/media/updf_newlib/fitz/res_path.c b/contrib/media/updf_newlib/fitz/res_path.c new file mode 100755 index 000000000..328e5ac10 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/res_path.c @@ -0,0 +1,262 @@ +#include "fitz.h" + +fz_path * +fz_new_path(void) +{ + fz_path *path; + + path = fz_malloc(sizeof(fz_path)); + path->len = 0; + path->cap = 0; + path->items = NULL; + + return path; +} + +fz_path * +fz_clone_path(fz_path *old) +{ + fz_path *path; + + path = fz_malloc(sizeof(fz_path)); + path->len = old->len; + path->cap = old->len; + path->items = fz_calloc(path->cap, sizeof(fz_path_item)); + memcpy(path->items, old->items, sizeof(fz_path_item) * path->len); + + return path; +} + +void +fz_free_path(fz_path *path) +{ + fz_free(path->items); + fz_free(path); +} + +static void +grow_path(fz_path *path, int n) +{ + if (path->len + n < path->cap) + return; + while (path->len + n > path->cap) + path->cap = path->cap + 36; + path->items = fz_realloc(path->items, path->cap, sizeof(fz_path_item)); +} + +void +fz_moveto(fz_path *path, float x, float y) +{ + grow_path(path, 3); + path->items[path->len++].k = FZ_MOVETO; + path->items[path->len++].v = x; + path->items[path->len++].v = y; +} + +void +fz_lineto(fz_path *path, float x, float y) +{ + if (path->len == 0) + { + fz_warn("lineto with no current point"); + return; + } + grow_path(path, 3); + path->items[path->len++].k = FZ_LINETO; + path->items[path->len++].v = x; + path->items[path->len++].v = y; +} + +void +fz_curveto(fz_path *path, + float x1, float y1, + float x2, float y2, + float x3, float y3) +{ + if (path->len == 0) + { + fz_warn("curveto with no current point"); + return; + } + grow_path(path, 7); + path->items[path->len++].k = FZ_CURVETO; + path->items[path->len++].v = x1; + path->items[path->len++].v = y1; + path->items[path->len++].v = x2; + path->items[path->len++].v = y2; + path->items[path->len++].v = x3; + path->items[path->len++].v = y3; +} + +void +fz_curvetov(fz_path *path, float x2, float y2, float x3, float y3) +{ + float x1, y1; + if (path->len == 0) + { + fz_warn("curvetov with no current point"); + return; + } + x1 = path->items[path->len-2].v; + y1 = path->items[path->len-1].v; + fz_curveto(path, x1, y1, x2, y2, x3, y3); +} + +void +fz_curvetoy(fz_path *path, float x1, float y1, float x3, float y3) +{ + fz_curveto(path, x1, y1, x3, y3, x3, y3); +} + +void +fz_closepath(fz_path *path) +{ + if (path->len == 0) + { + fz_warn("closepath with no current point"); + return; + } + grow_path(path, 1); + path->items[path->len++].k = FZ_CLOSE_PATH; +} + +static inline fz_rect bound_expand(fz_rect r, fz_point p) +{ + if (p.x < r.x0) r.x0 = p.x; + if (p.y < r.y0) r.y0 = p.y; + if (p.x > r.x1) r.x1 = p.x; + if (p.y > r.y1) r.y1 = p.y; + return r; +} + +fz_rect +fz_bound_path(fz_path *path, fz_stroke_state *stroke, fz_matrix ctm) +{ + fz_point p; + fz_rect r = fz_empty_rect; + int i = 0; + + if (path->len) + { + p.x = path->items[1].v; + p.y = path->items[2].v; + p = fz_transform_point(ctm, p); + r.x0 = r.x1 = p.x; + r.y0 = r.y1 = p.y; + } + + while (i < path->len) + { + switch (path->items[i++].k) + { + case FZ_CURVETO: + p.x = path->items[i++].v; + p.y = path->items[i++].v; + r = bound_expand(r, fz_transform_point(ctm, p)); + p.x = path->items[i++].v; + p.y = path->items[i++].v; + r = bound_expand(r, fz_transform_point(ctm, p)); + p.x = path->items[i++].v; + p.y = path->items[i++].v; + r = bound_expand(r, fz_transform_point(ctm, p)); + break; + case FZ_MOVETO: + case FZ_LINETO: + p.x = path->items[i++].v; + p.y = path->items[i++].v; + r = bound_expand(r, fz_transform_point(ctm, p)); + break; + case FZ_CLOSE_PATH: + break; + } + } + + if (stroke) + { + float miterlength = stroke->miterlimit; + float linewidth = stroke->linewidth; + float expand = MAX(miterlength, linewidth) * 0.5f; + r.x0 -= expand; + r.y0 -= expand; + r.x1 += expand; + r.y1 += expand; + } + + return r; +} + +void +fz_transform_path(fz_path *path, fz_matrix ctm) +{ + fz_point p; + int k, i = 0; + + while (i < path->len) + { + switch (path->items[i++].k) + { + case FZ_CURVETO: + for (k = 0; k < 3; k++) + { + p.x = path->items[i].v; + p.y = path->items[i+1].v; + p = fz_transform_point(ctm, p); + path->items[i].v = p.x; + path->items[i+1].v = p.y; + i += 2; + } + break; + case FZ_MOVETO: + case FZ_LINETO: + p.x = path->items[i].v; + p.y = path->items[i+1].v; + p = fz_transform_point(ctm, p); + path->items[i].v = p.x; + path->items[i+1].v = p.y; + i += 2; + break; + case FZ_CLOSE_PATH: + break; + } + } +} + +void +fz_debug_path(fz_path *path, int indent) +{ + float x, y; + int i = 0; + int n; + while (i < path->len) + { + for (n = 0; n < indent; n++) + putchar(' '); + switch (path->items[i++].k) + { + case FZ_MOVETO: + x = path->items[i++].v; + y = path->items[i++].v; + printf("%g %g m\n", x, y); + break; + case FZ_LINETO: + x = path->items[i++].v; + y = path->items[i++].v; + printf("%g %g l\n", x, y); + break; + case FZ_CURVETO: + x = path->items[i++].v; + y = path->items[i++].v; + printf("%g %g ", x, y); + x = path->items[i++].v; + y = path->items[i++].v; + printf("%g %g ", x, y); + x = path->items[i++].v; + y = path->items[i++].v; + printf("%g %g c\n", x, y); + break; + case FZ_CLOSE_PATH: + printf("h\n"); + break; + } + } +} diff --git a/contrib/media/updf_newlib/fitz/res_pixmap.c b/contrib/media/updf_newlib/fitz/res_pixmap.c new file mode 100755 index 000000000..83f46526e --- /dev/null +++ b/contrib/media/updf_newlib/fitz/res_pixmap.c @@ -0,0 +1,519 @@ +#include "fitz.h" + +static int fz_memory_limit = 256 << 20; +static int fz_memory_used = 0; + +fz_pixmap * +fz_new_pixmap_with_data(fz_colorspace *colorspace, int w, int h, unsigned char *samples) +{ + fz_pixmap *pix; + + pix = fz_malloc(sizeof(fz_pixmap)); + pix->refs = 1; + pix->x = 0; + pix->y = 0; + pix->w = w; + pix->h = h; + pix->mask = NULL; + pix->interpolate = 1; + pix->xres = 96; + pix->yres = 96; + pix->colorspace = NULL; + pix->n = 1; + + if (colorspace) + { + pix->colorspace = fz_keep_colorspace(colorspace); + pix->n = 1 + colorspace->n; + } + + if (samples) + { + pix->samples = samples; + pix->free_samples = 0; + } + else + { + fz_memory_used += pix->w * pix->h * pix->n; + pix->samples = fz_calloc(pix->h, pix->w * pix->n); + pix->free_samples = 1; + } + + return pix; +} + +fz_pixmap * +fz_new_pixmap_with_limit(fz_colorspace *colorspace, int w, int h) +{ + int n = colorspace ? colorspace->n + 1 : 1; + int size = w * h * n; + if (fz_memory_used + size > fz_memory_limit) + { + fz_warn("pixmap memory exceeds soft limit %dM + %dM > %dM", + fz_memory_used/(1<<20), size/(1<<20), fz_memory_limit/(1<<20)); + return NULL; + } + return fz_new_pixmap_with_data(colorspace, w, h, NULL); +} + +fz_pixmap * +fz_new_pixmap(fz_colorspace *colorspace, int w, int h) +{ + return fz_new_pixmap_with_data(colorspace, w, h, NULL); +} + +fz_pixmap * +fz_new_pixmap_with_rect(fz_colorspace *colorspace, fz_bbox r) +{ + fz_pixmap *pixmap; + pixmap = fz_new_pixmap(colorspace, r.x1 - r.x0, r.y1 - r.y0); + pixmap->x = r.x0; + pixmap->y = r.y0; + return pixmap; +} + +fz_pixmap * +fz_new_pixmap_with_rect_and_data(fz_colorspace *colorspace, fz_bbox r, unsigned char *samples) +{ + fz_pixmap *pixmap; + pixmap = fz_new_pixmap_with_data(colorspace, r.x1 - r.x0, r.y1 - r.y0, samples); + pixmap->x = r.x0; + pixmap->y = r.y0; + return pixmap; +} + +fz_pixmap * +fz_keep_pixmap(fz_pixmap *pix) +{ + pix->refs++; + return pix; +} + +void +fz_drop_pixmap(fz_pixmap *pix) +{ + if (pix && --pix->refs == 0) + { + fz_memory_used -= pix->w * pix->h * pix->n; + if (pix->mask) + fz_drop_pixmap(pix->mask); + if (pix->colorspace) + fz_drop_colorspace(pix->colorspace); + if (pix->free_samples) + fz_free(pix->samples); + fz_free(pix); + } +} + +fz_bbox +fz_bound_pixmap(fz_pixmap *pix) +{ + fz_bbox bbox; + bbox.x0 = pix->x; + bbox.y0 = pix->y; + bbox.x1 = pix->x + pix->w; + bbox.y1 = pix->y + pix->h; + return bbox; +} + +void +fz_clear_pixmap(fz_pixmap *pix) +{ + memset(pix->samples, 0, pix->w * pix->h * pix->n); +} + +void +fz_clear_pixmap_with_color(fz_pixmap *pix, int value) +{ + if (value == 255) + memset(pix->samples, 255, pix->w * pix->h * pix->n); + else + { + int k, x, y; + unsigned char *s = pix->samples; + for (y = 0; y < pix->h; y++) + { + for (x = 0; x < pix->w; x++) + { + for (k = 0; k < pix->n - 1; k++) + *s++ = value; + *s++ = 255; + } + } + } +} + +void +fz_copy_pixmap_rect(fz_pixmap *dest, fz_pixmap *src, fz_bbox r) +{ + const unsigned char *srcp; + unsigned char *destp; + int y, w, destspan, srcspan; + + r = fz_intersect_bbox(r, fz_bound_pixmap(dest)); + r = fz_intersect_bbox(r, fz_bound_pixmap(src)); + w = r.x1 - r.x0; + y = r.y1 - r.y0; + if (w <= 0 || y <= 0) + return; + + w *= src->n; + srcspan = src->w * src->n; + srcp = src->samples + srcspan * (r.y0 - src->y) + src->n * (r.x0 - src->x); + destspan = dest->w * dest->n; + destp = dest->samples + destspan * (r.y0 - dest->y) + dest->n * (r.x0 - dest->x); + do + { + memcpy(destp, srcp, w); + srcp += srcspan; + destp += destspan; + } + while (--y); +} + +void +fz_clear_pixmap_rect_with_color(fz_pixmap *dest, int value, fz_bbox r) +{ + unsigned char *destp; + int x, y, w, k, destspan; + + r = fz_intersect_bbox(r, fz_bound_pixmap(dest)); + w = r.x1 - r.x0; + y = r.y1 - r.y0; + if (w <= 0 || y <= 0) + return; + + destspan = dest->w * dest->n; + destp = dest->samples + destspan * (r.y0 - dest->y) + dest->n * (r.x0 - dest->x); + if (value == 255) + do + { + memset(destp, 255, w * dest->n); + destp += destspan; + } + while (--y); + else + do + { + unsigned char *s = destp; + for (x = 0; x < w; x++) + { + for (k = 0; k < dest->n - 1; k++) + *s++ = value; + *s++ = 255; + } + destp += destspan; + } + while (--y); +} + +void +fz_premultiply_pixmap(fz_pixmap *pix) +{ + unsigned char *s = pix->samples; + unsigned char a; + int k, x, y; + + for (y = 0; y < pix->h; y++) + { + for (x = 0; x < pix->w; x++) + { + a = s[pix->n - 1]; + for (k = 0; k < pix->n - 1; k++) + s[k] = fz_mul255(s[k], a); + s += pix->n; + } + } +} + +fz_pixmap * +fz_alpha_from_gray(fz_pixmap *gray, int luminosity) +{ + fz_pixmap *alpha; + unsigned char *sp, *dp; + int len; + + assert(gray->n == 2); + + alpha = fz_new_pixmap_with_rect(NULL, fz_bound_pixmap(gray)); + dp = alpha->samples; + sp = gray->samples; + if (!luminosity) + sp ++; + + len = gray->w * gray->h; + while (len--) + { + *dp++ = sp[0]; + sp += 2; + } + + return alpha; +} + +void +fz_invert_pixmap(fz_pixmap *pix) +{ + unsigned char *s = pix->samples; + int k, x, y; + + for (y = 0; y < pix->h; y++) + { + for (x = 0; x < pix->w; x++) + { + for (k = 0; k < pix->n - 1; k++) + s[k] = 255 - s[k]; + s += pix->n; + } + } +} + +void +fz_gamma_pixmap(fz_pixmap *pix, float gamma) +{ + unsigned char gamma_map[256]; + unsigned char *s = pix->samples; + int k, x, y; + + for (k = 0; k < 256; k++) + gamma_map[k] = pow(k / 255.0f, gamma) * 255; + + for (y = 0; y < pix->h; y++) + { + for (x = 0; x < pix->w; x++) + { + for (k = 0; k < pix->n - 1; k++) + s[k] = gamma_map[s[k]]; + s += pix->n; + } + } +} + +/* + * Write pixmap to PNM file (without alpha channel) + */ + +fz_error +fz_write_pnm(fz_pixmap *pixmap, char *filename) +{ + FILE *fp; + unsigned char *p; + int len; + + if (pixmap->n != 1 && pixmap->n != 2 && pixmap->n != 4) + return fz_throw("pixmap must be grayscale or rgb to write as pnm"); + + fp = fopen(filename, "wb"); + if (!fp) + return fz_throw("cannot open file '%s': %s", filename, strerror(errno)); + + if (pixmap->n == 1 || pixmap->n == 2) + fprintf(fp, "P5\n"); + if (pixmap->n == 4) + fprintf(fp, "P6\n"); + fprintf(fp, "%d %d\n", pixmap->w, pixmap->h); + fprintf(fp, "255\n"); + + len = pixmap->w * pixmap->h; + p = pixmap->samples; + + switch (pixmap->n) + { + case 1: + fwrite(p, 1, len, fp); + break; + case 2: + while (len--) + { + putc(p[0], fp); + p += 2; + } + break; + case 4: + while (len--) + { + putc(p[0], fp); + putc(p[1], fp); + putc(p[2], fp); + p += 4; + } + } + + fclose(fp); + return fz_okay; +} + +/* + * Write pixmap to PAM file (with or without alpha channel) + */ + +fz_error +fz_write_pam(fz_pixmap *pixmap, char *filename, int savealpha) +{ + unsigned char *sp; + int y, w, k; + FILE *fp; + + int sn = pixmap->n; + int dn = pixmap->n; + if (!savealpha && dn > 1) + dn--; + + fp = fopen(filename, "wb"); + if (!fp) + return fz_throw("cannot open file '%s': %s", filename, strerror(errno)); + + fprintf(fp, "P7\n"); + fprintf(fp, "WIDTH %d\n", pixmap->w); + fprintf(fp, "HEIGHT %d\n", pixmap->h); + fprintf(fp, "DEPTH %d\n", dn); + fprintf(fp, "MAXVAL 255\n"); + if (pixmap->colorspace) + fprintf(fp, "# COLORSPACE %s\n", pixmap->colorspace->name); + switch (dn) + { + case 1: fprintf(fp, "TUPLTYPE GRAYSCALE\n"); break; + case 2: if (sn == 2) fprintf(fp, "TUPLTYPE GRAYSCALE_ALPHA\n"); break; + case 3: if (sn == 4) fprintf(fp, "TUPLTYPE RGB\n"); break; + case 4: if (sn == 4) fprintf(fp, "TUPLTYPE RGB_ALPHA\n"); break; + } + fprintf(fp, "ENDHDR\n"); + + sp = pixmap->samples; + for (y = 0; y < pixmap->h; y++) + { + w = pixmap->w; + while (w--) + { + for (k = 0; k < dn; k++) + putc(sp[k], fp); + sp += sn; + } + } + + fclose(fp); + + return fz_okay; +} + +/* + * Write pixmap to PNG file (with or without alpha channel) + */ + +#include + +static inline void big32(unsigned char *buf, unsigned int v) +{ + buf[0] = (v >> 24) & 0xff; + buf[1] = (v >> 16) & 0xff; + buf[2] = (v >> 8) & 0xff; + buf[3] = (v) & 0xff; +} + +static inline void put32(unsigned int v, FILE *fp) +{ + putc(v >> 24, fp); + putc(v >> 16, fp); + putc(v >> 8, fp); + putc(v, fp); +} + +static void putchunk(char *tag, unsigned char *data, int size, FILE *fp) +{ + unsigned int sum; + put32(size, fp); + fwrite(tag, 1, 4, fp); + fwrite(data, 1, size, fp); + sum = crc32(0, NULL, 0); + sum = crc32(sum, (unsigned char*)tag, 4); + sum = crc32(sum, data, size); + put32(sum, fp); +} + +fz_error +fz_write_png(fz_pixmap *pixmap, char *filename, int savealpha) +{ + static const unsigned char pngsig[8] = { 137, 80, 78, 71, 13, 10, 26, 10 }; + FILE *fp; + unsigned char head[13]; + unsigned char *udata, *cdata, *sp, *dp; + uLong usize, csize; + int y, x, k, sn, dn; + int color; + int err; + + if (pixmap->n != 1 && pixmap->n != 2 && pixmap->n != 4) + return fz_throw("pixmap must be grayscale or rgb to write as png"); + + sn = pixmap->n; + dn = pixmap->n; + if (!savealpha && dn > 1) + dn--; + + switch (dn) + { + default: + case 1: color = 0; break; + case 2: color = 4; break; + case 3: color = 2; break; + case 4: color = 6; break; + } + + usize = (pixmap->w * dn + 1) * pixmap->h; + csize = compressBound(usize); + udata = fz_malloc(usize); + cdata = fz_malloc(csize); + + sp = pixmap->samples; + dp = udata; + for (y = 0; y < pixmap->h; y++) + { + *dp++ = 1; /* sub prediction filter */ + for (x = 0; x < pixmap->w; x++) + { + for (k = 0; k < dn; k++) + { + if (x == 0) + dp[k] = sp[k]; + else + dp[k] = sp[k] - sp[k-sn]; + } + sp += sn; + dp += dn; + } + } + + err = compress(cdata, &csize, udata, usize); + if (err != Z_OK) + { + fz_free(udata); + fz_free(cdata); + return fz_throw("cannot compress image data"); + } + + fp = fopen(filename, "wb"); + if (!fp) + { + fz_free(udata); + fz_free(cdata); + return fz_throw("cannot open file '%s': %s", filename, strerror(errno)); + } + + big32(head+0, pixmap->w); + big32(head+4, pixmap->h); + head[8] = 8; /* depth */ + head[9] = color; + head[10] = 0; /* compression */ + head[11] = 0; /* filter */ + head[12] = 0; /* interlace */ + + fwrite(pngsig, 1, 8, fp); + putchunk("IHDR", head, 13, fp); + putchunk("IDAT", cdata, csize, fp); + putchunk("IEND", head, 0, fp); + fclose(fp); + + fz_free(udata); + fz_free(cdata); + return fz_okay; +} diff --git a/contrib/media/updf_newlib/fitz/res_shade.c b/contrib/media/updf_newlib/fitz/res_shade.c new file mode 100755 index 000000000..7faff3bf0 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/res_shade.c @@ -0,0 +1,127 @@ +#include "fitz.h" + +fz_shade * +fz_keep_shade(fz_shade *shade) +{ + shade->refs ++; + return shade; +} + +void +fz_drop_shade(fz_shade *shade) +{ + if (shade && --shade->refs == 0) + { + if (shade->colorspace) + fz_drop_colorspace(shade->colorspace); + fz_free(shade->mesh); + fz_free(shade); + } +} + +fz_rect +fz_bound_shade(fz_shade *shade, fz_matrix ctm) +{ + float *v; + fz_rect r; + fz_point p; + int i, ncomp, nvert; + + ctm = fz_concat(shade->matrix, ctm); + ncomp = shade->use_function ? 3 : 2 + shade->colorspace->n; + nvert = shade->mesh_len / ncomp; + v = shade->mesh; + + if (shade->type == FZ_LINEAR) + return fz_infinite_rect; + if (shade->type == FZ_RADIAL) + return fz_infinite_rect; + + if (nvert == 0) + return fz_empty_rect; + + p.x = v[0]; + p.y = v[1]; + v += ncomp; + p = fz_transform_point(ctm, p); + r.x0 = r.x1 = p.x; + r.y0 = r.y1 = p.y; + + for (i = 1; i < nvert; i++) + { + p.x = v[0]; + p.y = v[1]; + p = fz_transform_point(ctm, p); + v += ncomp; + if (p.x < r.x0) r.x0 = p.x; + if (p.y < r.y0) r.y0 = p.y; + if (p.x > r.x1) r.x1 = p.x; + if (p.y > r.y1) r.y1 = p.y; + } + + return r; +} + +void +fz_debug_shade(fz_shade *shade) +{ + int i, j, n; + float *vertex; + int triangle; + + printf("shading {\n"); + + switch (shade->type) + { + case FZ_LINEAR: printf("\ttype linear\n"); break; + case FZ_RADIAL: printf("\ttype radial\n"); break; + case FZ_MESH: printf("\ttype mesh\n"); break; + } + + printf("\tbbox [%g %g %g %g]\n", + shade->bbox.x0, shade->bbox.y0, + shade->bbox.x1, shade->bbox.y1); + + printf("\tcolorspace %s\n", shade->colorspace->name); + + printf("\tmatrix [%g %g %g %g %g %g]\n", + shade->matrix.a, shade->matrix.b, shade->matrix.c, + shade->matrix.d, shade->matrix.e, shade->matrix.f); + + if (shade->use_background) + { + printf("\tbackground ["); + for (i = 0; i < shade->colorspace->n; i++) + printf("%s%g", i == 0 ? "" : " ", shade->background[i]); + printf("]\n"); + } + + if (shade->use_function) + { + printf("\tfunction\n"); + n = 3; + } + else + n = 2 + shade->colorspace->n; + + printf("\tvertices: %d\n", shade->mesh_len); + + vertex = shade->mesh; + triangle = 0; + i = 0; + while (i < shade->mesh_len) + { + printf("\t%d:(%g, %g): ", triangle, vertex[0], vertex[1]); + + for (j = 2; j < n; j++) + printf("%s%g", j == 2 ? "" : " ", vertex[j]); + printf("\n"); + + vertex += n; + i++; + if (i % 3 == 0) + triangle++; + } + + printf("}\n"); +} diff --git a/contrib/media/updf_newlib/fitz/res_text.c b/contrib/media/updf_newlib/fitz/res_text.c new file mode 100755 index 000000000..d38637f10 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/res_text.c @@ -0,0 +1,133 @@ +#include "fitz.h" + +fz_text * +fz_new_text(fz_font *font, fz_matrix trm, int wmode) +{ + fz_text *text; + + text = fz_malloc(sizeof(fz_text)); + text->font = fz_keep_font(font); + text->trm = trm; + text->wmode = wmode; + text->len = 0; + text->cap = 0; + text->items = NULL; + + return text; +} + +void +fz_free_text(fz_text *text) +{ + fz_drop_font(text->font); + fz_free(text->items); + fz_free(text); +} + +fz_text * +fz_clone_text(fz_text *old) +{ + fz_text *text; + + text = fz_malloc(sizeof(fz_text)); + text->font = fz_keep_font(old->font); + text->trm = old->trm; + text->wmode = old->wmode; + text->len = old->len; + text->cap = text->len; + text->items = fz_calloc(text->len, sizeof(fz_text_item)); + memcpy(text->items, old->items, text->len * sizeof(fz_text_item)); + + return text; +} + +fz_rect +fz_bound_text(fz_text *text, fz_matrix ctm) +{ + fz_matrix trm; + fz_rect bbox; + fz_rect fbox; + int i; + + if (text->len == 0) + return fz_empty_rect; + + /* find bbox of glyph origins in ctm space */ + + bbox.x0 = bbox.x1 = text->items[0].x; + bbox.y0 = bbox.y1 = text->items[0].y; + + for (i = 1; i < text->len; i++) + { + bbox.x0 = MIN(bbox.x0, text->items[i].x); + bbox.y0 = MIN(bbox.y0, text->items[i].y); + bbox.x1 = MAX(bbox.x1, text->items[i].x); + bbox.y1 = MAX(bbox.y1, text->items[i].y); + } + + bbox = fz_transform_rect(ctm, bbox); + + /* find bbox of font in trm * ctm space */ + + trm = fz_concat(text->trm, ctm); + trm.e = 0; + trm.f = 0; + + fbox.x0 = text->font->bbox.x0 * 0.001f; + fbox.y0 = text->font->bbox.y0 * 0.001f; + fbox.x1 = text->font->bbox.x1 * 0.001f; + fbox.y1 = text->font->bbox.y1 * 0.001f; + + fbox = fz_transform_rect(trm, fbox); + + /* expand glyph origin bbox by font bbox */ + + bbox.x0 += fbox.x0; + bbox.y0 += fbox.y0; + bbox.x1 += fbox.x1; + bbox.y1 += fbox.y1; + + return bbox; +} + +static void +fz_grow_text(fz_text *text, int n) +{ + if (text->len + n < text->cap) + return; + while (text->len + n > text->cap) + text->cap = text->cap + 36; + text->items = fz_realloc(text->items, text->cap, sizeof(fz_text_item)); +} + +void +fz_add_text(fz_text *text, int gid, int ucs, float x, float y) +{ + fz_grow_text(text, 1); + text->items[text->len].ucs = ucs; + text->items[text->len].gid = gid; + text->items[text->len].x = x; + text->items[text->len].y = y; + text->len++; +} + +static int isxmlmeta(int c) +{ + return c < 32 || c >= 128 || c == '&' || c == '<' || c == '>' || c == '\'' || c == '"'; +} + +void fz_debug_text(fz_text *text, int indent) +{ + int i, n; + for (i = 0; i < text->len; i++) + { + for (n = 0; n < indent; n++) + putchar(' '); + if (!isxmlmeta(text->items[i].ucs)) + printf("\n", + text->items[i].ucs, text->items[i].gid, text->items[i].x, text->items[i].y); + else + printf("\n", + text->items[i].ucs, text->items[i].gid, text->items[i].x, text->items[i].y); + } +} diff --git a/contrib/media/updf_newlib/fitz/stm_buffer.c b/contrib/media/updf_newlib/fitz/stm_buffer.c new file mode 100755 index 000000000..4c7410c3b --- /dev/null +++ b/contrib/media/updf_newlib/fitz/stm_buffer.c @@ -0,0 +1,49 @@ +#include "fitz.h" + +fz_buffer * +fz_new_buffer(int size) +{ + fz_buffer *b; + + size = size > 1 ? size : 16; + + b = fz_malloc(sizeof(fz_buffer)); + b->refs = 1; + b->data = fz_malloc(size); + b->cap = size; + b->len = 0; + + return b; +} + +fz_buffer * +fz_keep_buffer(fz_buffer *buf) +{ + buf->refs ++; + return buf; +} + +void +fz_drop_buffer(fz_buffer *buf) +{ + if (--buf->refs == 0) + { + fz_free(buf->data); + fz_free(buf); + } +} + +void +fz_resize_buffer(fz_buffer *buf, int size) +{ + buf->data = fz_realloc(buf->data, size, 1); + buf->cap = size; + if (buf->len > buf->cap) + buf->len = buf->cap; +} + +void +fz_grow_buffer(fz_buffer *buf) +{ + fz_resize_buffer(buf, (buf->cap * 3) / 2); +} diff --git a/contrib/media/updf_newlib/fitz/stm_open.c b/contrib/media/updf_newlib/fitz/stm_open.c new file mode 100755 index 000000000..74346f73d --- /dev/null +++ b/contrib/media/updf_newlib/fitz/stm_open.c @@ -0,0 +1,174 @@ +#include "fitz.h" + +fz_stream * +fz_new_stream(void *state, + int(*read)(fz_stream *stm, unsigned char *buf, int len), + void(*close)(fz_stream *stm)) +{ + fz_stream *stm; + + stm = fz_malloc(sizeof(fz_stream)); + + stm->refs = 1; + stm->error = 0; + stm->eof = 0; + stm->pos = 0; + + stm->bits = 0; + stm->avail = 0; + + stm->bp = stm->buf; + stm->rp = stm->bp; + stm->wp = stm->bp; + stm->ep = stm->buf + sizeof stm->buf; + + stm->state = state; + stm->read = read; + stm->close = close; + stm->seek = NULL; + + return stm; +} + +fz_stream * +fz_keep_stream(fz_stream *stm) +{ + stm->refs ++; + return stm; +} + +void +fz_close(fz_stream *stm) +{ + stm->refs --; + if (stm->refs == 0) + { + if (stm->close) + stm->close(stm); + fz_free(stm); + } +} + +/* File stream */ + +static int read_file(fz_stream *stm, unsigned char *buf, int len) +{ + int n = read(*(int*)stm->state, buf, len); + if (n < 0) + return fz_throw("read error: %s", strerror(errno)); + return n; +} + +static void seek_file(fz_stream *stm, int offset, int whence) +{ + int n = lseek(*(int*)stm->state, offset, whence); + if (n < 0) + fz_warn("cannot lseek: %s", strerror(errno)); + stm->pos = n; + stm->rp = stm->bp; + stm->wp = stm->bp; +} + +static void close_file(fz_stream *stm) +{ + int n = close(*(int*)stm->state); + if (n < 0) + fz_warn("close error: %s", strerror(errno)); + fz_free(stm->state); +} + +fz_stream * +fz_open_fd(int fd) +{ + fz_stream *stm; + int *state; + + state = fz_malloc(sizeof(int)); + *state = fd; + + stm = fz_new_stream(state, read_file, close_file); + stm->seek = seek_file; + + return stm; +} + +fz_stream * +fz_open_file(const char *name) +{ + int fd = open(name, O_BINARY | O_RDONLY, 0); + if (fd == -1) + return NULL; + return fz_open_fd(fd); +} + +#ifdef _WIN32 +fz_stream * +fz_open_file_w(const wchar_t *name) +{ + int fd = _wopen(name, O_BINARY | O_RDONLY, 0); + if (fd == -1) + return NULL; + return fz_open_fd(fd); +} +#endif + +/* Memory stream */ + +static int read_buffer(fz_stream *stm, unsigned char *buf, int len) +{ + return 0; +} + +static void seek_buffer(fz_stream *stm, int offset, int whence) +{ + if (whence == 0) + stm->rp = stm->bp + offset; + if (whence == 1) + stm->rp += offset; + if (whence == 2) + stm->rp = stm->ep - offset; + stm->rp = CLAMP(stm->rp, stm->bp, stm->ep); + stm->wp = stm->ep; +} + +static void close_buffer(fz_stream *stm) +{ + if (stm->state) + fz_drop_buffer(stm->state); +} + +fz_stream * +fz_open_buffer(fz_buffer *buf) +{ + fz_stream *stm; + + stm = fz_new_stream(fz_keep_buffer(buf), read_buffer, close_buffer); + stm->seek = seek_buffer; + + stm->bp = buf->data; + stm->rp = buf->data; + stm->wp = buf->data + buf->len; + stm->ep = buf->data + buf->len; + + stm->pos = buf->len; + + return stm; +} + +fz_stream * +fz_open_memory(unsigned char *data, int len) +{ + fz_stream *stm; + + stm = fz_new_stream(NULL, read_buffer, close_buffer); + stm->seek = seek_buffer; + + stm->bp = data; + stm->rp = data; + stm->wp = data + len; + stm->ep = data + len; + + stm->pos = len; + + return stm; +} diff --git a/contrib/media/updf_newlib/fitz/stm_read.c b/contrib/media/updf_newlib/fitz/stm_read.c new file mode 100755 index 000000000..59f064333 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/stm_read.c @@ -0,0 +1,201 @@ +#include "fitz.h" + +int +fz_read(fz_stream *stm, unsigned char *buf, int len) +{ + int count, n; + + count = MIN(len, stm->wp - stm->rp); + if (count) + { + memcpy(buf, stm->rp, count); + stm->rp += count; + } + + if (count == len || stm->error || stm->eof) + return count; + + assert(stm->rp == stm->wp); + + if (len - count < stm->ep - stm->bp) + { + n = stm->read(stm, stm->bp, stm->ep - stm->bp); + if (n < 0) + { + stm->error = 1; + return fz_rethrow(n, "read error"); + } + else if (n == 0) + { + stm->eof = 1; + } + else if (n > 0) + { + stm->rp = stm->bp; + stm->wp = stm->bp + n; + stm->pos += n; + } + + n = MIN(len - count, stm->wp - stm->rp); + if (n) + { + memcpy(buf + count, stm->rp, n); + stm->rp += n; + count += n; + } + } + else + { + n = stm->read(stm, buf + count, len - count); + if (n < 0) + { + stm->error = 1; + return fz_rethrow(n, "read error"); + } + else if (n == 0) + { + stm->eof = 1; + } + else if (n > 0) + { + stm->pos += n; + count += n; + } + } + + return count; +} + +void +fz_fill_buffer(fz_stream *stm) +{ + int n; + + assert(stm->rp == stm->wp); + + if (stm->error || stm->eof) + return; + + n = stm->read(stm, stm->bp, stm->ep - stm->bp); + if (n < 0) + { + stm->error = 1; + fz_catch(n, "read error; treating as end of file"); + } + else if (n == 0) + { + stm->eof = 1; + } + else if (n > 0) + { + stm->rp = stm->bp; + stm->wp = stm->bp + n; + stm->pos += n; + } +} + +fz_error +fz_read_all(fz_buffer **bufp, fz_stream *stm, int initial) +{ + fz_buffer *buf; + int n; + + if (initial < 1024) + initial = 1024; + + buf = fz_new_buffer(initial); + + while (1) + { + if (buf->len == buf->cap) + fz_grow_buffer(buf); + + if (buf->len / 200 > initial) + { + fz_drop_buffer(buf); + return fz_throw("compression bomb detected"); + } + + n = fz_read(stm, buf->data + buf->len, buf->cap - buf->len); + if (n < 0) + { + fz_drop_buffer(buf); + return fz_rethrow(n, "read error"); + } + if (n == 0) + break; + + buf->len += n; + } + + *bufp = buf; + return fz_okay; +} + +void +fz_read_line(fz_stream *stm, char *mem, int n) +{ + char *s = mem; + int c = EOF; + while (n > 1) + { + c = fz_read_byte(stm); + if (c == EOF) + break; + if (c == '\r') { + c = fz_peek_byte(stm); + if (c == '\n') + fz_read_byte(stm); + break; + } + if (c == '\n') + break; + *s++ = c; + n--; + } + if (n) + *s = '\0'; +} + +int +fz_tell(fz_stream *stm) +{ + return stm->pos - (stm->wp - stm->rp); +} + +void +fz_seek(fz_stream *stm, int offset, int whence) +{ + if (stm->seek) + { + if (whence == 1) + { + offset = fz_tell(stm) + offset; + whence = 0; + } + if (whence == 0) + { + unsigned char *p = stm->wp - (stm->pos - offset); + if (p >= stm->bp && p <= stm->wp) + { + stm->rp = p; + stm->eof = 0; + return; + } + } + stm->seek(stm, offset, whence); + stm->eof = 0; + } + else if (whence != 2) + { + if (whence == 0) + offset -= fz_tell(stm); + if (offset < 0) + fz_warn("cannot seek backwards"); + /* dog slow, but rare enough */ + while (offset-- > 0) + fz_read_byte(stm); + } + else + fz_warn("cannot seek"); +} diff --git a/contrib/media/updf_newlib/fitz/strtoll.c b/contrib/media/updf_newlib/fitz/strtoll.c new file mode 100755 index 000000000..1c9141d5b --- /dev/null +++ b/contrib/media/updf_newlib/fitz/strtoll.c @@ -0,0 +1,30 @@ +#include +#include +#include +#include +#include + +long long int strtoll(const char *nptr, char **endptr, int base) +{ + int neg=0; + unsigned long long int v; + const char*orig=nptr; + + while(isspace(*nptr)) nptr++; + + if (*nptr == '-' && isalnum(nptr[1])) { neg=-1; nptr++; } + v=strtoull(nptr,endptr,base); + if (endptr && *endptr==nptr) *endptr=(char *)orig; + if (v>LLONG_MAX) { + if (v==0x8000000000000000ull && neg) { + errno=0; + return v; + } + errno=ERANGE; + return (neg?LLONG_MIN:LLONG_MAX); + } + return (neg?-v:v); +} + +intmax_t strtoimax(const char *nptr, char **endptr, int base) + __attribute__((alias("strtoll"))); diff --git a/contrib/media/updf_newlib/fitz/strtoull.c b/contrib/media/updf_newlib/fitz/strtoull.c new file mode 100755 index 000000000..4a92d7069 --- /dev/null +++ b/contrib/media/updf_newlib/fitz/strtoull.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include + +#define __expect(foo,bar) (foo) +#define __likely(foo) __expect((foo),1) +#define __unlikely(foo) __expect((foo),0) + +unsigned long long int strtoull(const char *ptr, char **endptr, int base) +{ + int neg = 0, overflow = 0; + long long int v=0; + const char* orig; + const char* nptr=ptr; + + while(isspace(*nptr)) ++nptr; + + if (*nptr == '-') { neg=1; nptr++; } + else if (*nptr == '+') ++nptr; + orig=nptr; + if (base==16 && nptr[0]=='0') goto skip0x; + if (base) { + register unsigned int b=base-2; + if (__unlikely(b>34)) { errno=EINVAL; return 0; } + } else { + if (*nptr=='0') { + base=8; +skip0x: + if (((*(nptr+1)=='x')||(*(nptr+1)=='X')) && isxdigit(nptr[2])) { + nptr+=2; + base=16; + } + } else + base=10; + } + while(__likely(*nptr)) { + register unsigned char c=*nptr; + c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c<='9'?c-'0':0xff); + if (__unlikely(c>=base)) break; /* out of base */ + { + register unsigned long x=(v&0xff)*base+c; + register unsigned long long w=(v>>8)*base+(x>>8); + if (w>(ULLONG_MAX>>8)) overflow=1; + v=(w<<8)+(x&0xff); + } + ++nptr; + } + if (__unlikely(nptr==orig)) { /* no conversion done */ + nptr=ptr; + errno=EINVAL; + v=0; + } + if (endptr) *endptr=(char *)nptr; + if (overflow) { + errno=ERANGE; + return ULLONG_MAX; + } + return (neg?-v:v); +} + +/* die, BSD, die!!! */ +unsigned long long int strtouq(const char *nptr, char **endptr, int base) + __attribute__((alias("strtoull"))); + +uintmax_t strtoumax(const char *nptr, char **endptr, int base) + __attribute__((alias("strtoull"))); diff --git a/contrib/media/updf_newlib/generated/cmap_cns.h b/contrib/media/updf_newlib/generated/cmap_cns.h new file mode 100755 index 000000000..a1f2e2f62 --- /dev/null +++ b/contrib/media/updf_newlib/generated/cmap_cns.h @@ -0,0 +1,681 @@ +/* This is an automatically generated file. Do not edit. */ + +/* B5-V */ + +static const pdf_range cmap_Adobe_CNS1_0_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_CNS1_0_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_CNS1_0 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_CNS1_0_ranges, + 0, 0, (unsigned short*) cmap_Adobe_CNS1_0_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_CNS1_1_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_CNS1_1_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_CNS1_1 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_CNS1_1_ranges, + 0, 0, (unsigned short*) cmap_Adobe_CNS1_1_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_CNS1_2_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_CNS1_2_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_CNS1_2 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_CNS1_2_ranges, + 0, 0, (unsigned short*) cmap_Adobe_CNS1_2_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_CNS1_3_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_CNS1_3_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_CNS1_3 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_CNS1_3_ranges, + 0, 0, (unsigned short*) cmap_Adobe_CNS1_3_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_CNS1_4_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_CNS1_4_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_CNS1_4 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_CNS1_4_ranges, + 0, 0, (unsigned short*) cmap_Adobe_CNS1_4_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_CNS1_5_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_CNS1_5_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_CNS1_5 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_CNS1_5_ranges, + 0, 0, (unsigned short*) cmap_Adobe_CNS1_5_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_CNS1_6_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_CNS1_6_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_CNS1_6 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_CNS1_6_ranges, + 0, 0, (unsigned short*) cmap_Adobe_CNS1_6_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_CNS1_UCS2_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_CNS1_UCS2_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_CNS1_UCS2 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_CNS1_UCS2_ranges, + 0, 0, (unsigned short*) cmap_Adobe_CNS1_UCS2_table, +}; + +/* B5-V */ + +static const pdf_range cmap_B5_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_B5_H_table[] = { 0 }; + +static pdf_cmap cmap_B5_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_B5_H_ranges, + 0, 0, (unsigned short*) cmap_B5_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_B5pc_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_B5pc_H_table[] = { 0 }; + +static pdf_cmap cmap_B5pc_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_B5pc_H_ranges, + 0, 0, (unsigned short*) cmap_B5pc_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_B5pc_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_B5pc_V_table[] = { 0 }; + +static pdf_cmap cmap_B5pc_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_B5pc_V_ranges, + 0, 0, (unsigned short*) cmap_B5pc_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_B5_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_B5_V_table[] = { 0 }; + +static pdf_cmap cmap_B5_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_B5_V_ranges, + 0, 0, (unsigned short*) cmap_B5_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_CNS1_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_CNS1_H_table[] = { 0 }; + +static pdf_cmap cmap_CNS1_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_CNS1_H_ranges, + 0, 0, (unsigned short*) cmap_CNS1_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_CNS1_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_CNS1_V_table[] = { 0 }; + +static pdf_cmap cmap_CNS1_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_CNS1_V_ranges, + 0, 0, (unsigned short*) cmap_CNS1_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_CNS2_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_CNS2_H_table[] = { 0 }; + +static pdf_cmap cmap_CNS2_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_CNS2_H_ranges, + 0, 0, (unsigned short*) cmap_CNS2_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_CNS2_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_CNS2_V_table[] = { 0 }; + +static pdf_cmap cmap_CNS2_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_CNS2_V_ranges, + 0, 0, (unsigned short*) cmap_CNS2_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_CNS_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_CNS_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_CNS_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_CNS_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_CNS_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_CNS_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_CNS_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_CNS_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_CNS_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_CNS_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_ETen_B5_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_ETen_B5_H_table[] = { 0 }; + +static pdf_cmap cmap_ETen_B5_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_ETen_B5_H_ranges, + 0, 0, (unsigned short*) cmap_ETen_B5_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_ETen_B5_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_ETen_B5_V_table[] = { 0 }; + +static pdf_cmap cmap_ETen_B5_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_ETen_B5_V_ranges, + 0, 0, (unsigned short*) cmap_ETen_B5_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_ETenms_B5_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_ETenms_B5_H_table[] = { 0 }; + +static pdf_cmap cmap_ETenms_B5_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_ETenms_B5_H_ranges, + 0, 0, (unsigned short*) cmap_ETenms_B5_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_ETenms_B5_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_ETenms_B5_V_table[] = { 0 }; + +static pdf_cmap cmap_ETenms_B5_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_ETenms_B5_V_ranges, + 0, 0, (unsigned short*) cmap_ETenms_B5_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_ETHK_B5_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_ETHK_B5_H_table[] = { 0 }; + +static pdf_cmap cmap_ETHK_B5_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_ETHK_B5_H_ranges, + 0, 0, (unsigned short*) cmap_ETHK_B5_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_ETHK_B5_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_ETHK_B5_V_table[] = { 0 }; + +static pdf_cmap cmap_ETHK_B5_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_ETHK_B5_V_ranges, + 0, 0, (unsigned short*) cmap_ETHK_B5_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKdla_B5_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKdla_B5_H_table[] = { 0 }; + +static pdf_cmap cmap_HKdla_B5_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKdla_B5_H_ranges, + 0, 0, (unsigned short*) cmap_HKdla_B5_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKdla_B5_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKdla_B5_V_table[] = { 0 }; + +static pdf_cmap cmap_HKdla_B5_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKdla_B5_V_ranges, + 0, 0, (unsigned short*) cmap_HKdla_B5_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKdlb_B5_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKdlb_B5_H_table[] = { 0 }; + +static pdf_cmap cmap_HKdlb_B5_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKdlb_B5_H_ranges, + 0, 0, (unsigned short*) cmap_HKdlb_B5_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKdlb_B5_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKdlb_B5_V_table[] = { 0 }; + +static pdf_cmap cmap_HKdlb_B5_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKdlb_B5_V_ranges, + 0, 0, (unsigned short*) cmap_HKdlb_B5_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKgccs_B5_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKgccs_B5_H_table[] = { 0 }; + +static pdf_cmap cmap_HKgccs_B5_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKgccs_B5_H_ranges, + 0, 0, (unsigned short*) cmap_HKgccs_B5_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKgccs_B5_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKgccs_B5_V_table[] = { 0 }; + +static pdf_cmap cmap_HKgccs_B5_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKgccs_B5_V_ranges, + 0, 0, (unsigned short*) cmap_HKgccs_B5_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKm314_B5_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKm314_B5_H_table[] = { 0 }; + +static pdf_cmap cmap_HKm314_B5_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKm314_B5_H_ranges, + 0, 0, (unsigned short*) cmap_HKm314_B5_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKm314_B5_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKm314_B5_V_table[] = { 0 }; + +static pdf_cmap cmap_HKm314_B5_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKm314_B5_V_ranges, + 0, 0, (unsigned short*) cmap_HKm314_B5_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKm471_B5_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKm471_B5_H_table[] = { 0 }; + +static pdf_cmap cmap_HKm471_B5_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKm471_B5_H_ranges, + 0, 0, (unsigned short*) cmap_HKm471_B5_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKm471_B5_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKm471_B5_V_table[] = { 0 }; + +static pdf_cmap cmap_HKm471_B5_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKm471_B5_V_ranges, + 0, 0, (unsigned short*) cmap_HKm471_B5_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKscs_B5_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKscs_B5_H_table[] = { 0 }; + +static pdf_cmap cmap_HKscs_B5_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKscs_B5_H_ranges, + 0, 0, (unsigned short*) cmap_HKscs_B5_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_HKscs_B5_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_HKscs_B5_V_table[] = { 0 }; + +static pdf_cmap cmap_HKscs_B5_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_HKscs_B5_V_ranges, + 0, 0, (unsigned short*) cmap_HKscs_B5_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniCNS_UCS2_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniCNS_UCS2_H_table[] = { 0 }; + +static pdf_cmap cmap_UniCNS_UCS2_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniCNS_UCS2_H_ranges, + 0, 0, (unsigned short*) cmap_UniCNS_UCS2_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniCNS_UCS2_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniCNS_UCS2_V_table[] = { 0 }; + +static pdf_cmap cmap_UniCNS_UCS2_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniCNS_UCS2_V_ranges, + 0, 0, (unsigned short*) cmap_UniCNS_UCS2_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniCNS_UTF16_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniCNS_UTF16_H_table[] = { 0 }; + +static pdf_cmap cmap_UniCNS_UTF16_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniCNS_UTF16_H_ranges, + 0, 0, (unsigned short*) cmap_UniCNS_UTF16_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniCNS_UTF16_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniCNS_UTF16_V_table[] = { 0 }; + +static pdf_cmap cmap_UniCNS_UTF16_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniCNS_UTF16_V_ranges, + 0, 0, (unsigned short*) cmap_UniCNS_UTF16_V_table, +}; diff --git a/contrib/media/updf_newlib/generated/cmap_gb.h b/contrib/media/updf_newlib/generated/cmap_gb.h new file mode 100755 index 000000000..04d46a7d3 --- /dev/null +++ b/contrib/media/updf_newlib/generated/cmap_gb.h @@ -0,0 +1,494 @@ +/* This is an automatically generated file. Do not edit. */ + +/* B5-V */ + +static const pdf_range cmap_Adobe_GB1_0_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_GB1_0_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_GB1_0 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_GB1_0_ranges, + 0, 0, (unsigned short*) cmap_Adobe_GB1_0_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_GB1_1_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_GB1_1_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_GB1_1 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_GB1_1_ranges, + 0, 0, (unsigned short*) cmap_Adobe_GB1_1_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_GB1_2_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_GB1_2_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_GB1_2 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_GB1_2_ranges, + 0, 0, (unsigned short*) cmap_Adobe_GB1_2_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_GB1_3_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_GB1_3_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_GB1_3 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_GB1_3_ranges, + 0, 0, (unsigned short*) cmap_Adobe_GB1_3_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_GB1_4_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_GB1_4_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_GB1_4 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_GB1_4_ranges, + 0, 0, (unsigned short*) cmap_Adobe_GB1_4_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_GB1_5_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_GB1_5_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_GB1_5 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_GB1_5_ranges, + 0, 0, (unsigned short*) cmap_Adobe_GB1_5_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_GB1_UCS2_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_GB1_UCS2_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_GB1_UCS2 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_GB1_UCS2_ranges, + 0, 0, (unsigned short*) cmap_Adobe_GB1_UCS2_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GB_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GB_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_GB_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GB_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_GB_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GB_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GB_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_GB_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GB_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_GB_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GB_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GB_H_table[] = { 0 }; + +static pdf_cmap cmap_GB_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GB_H_ranges, + 0, 0, (unsigned short*) cmap_GB_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBK2K_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBK2K_H_table[] = { 0 }; + +static pdf_cmap cmap_GBK2K_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBK2K_H_ranges, + 0, 0, (unsigned short*) cmap_GBK2K_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBK2K_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBK2K_V_table[] = { 0 }; + +static pdf_cmap cmap_GBK2K_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBK2K_V_ranges, + 0, 0, (unsigned short*) cmap_GBK2K_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBK_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBK_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_GBK_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBK_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_GBK_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBK_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBK_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_GBK_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBK_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_GBK_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBKp_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBKp_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_GBKp_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBKp_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_GBKp_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBKp_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBKp_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_GBKp_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBKp_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_GBKp_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBpc_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBpc_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_GBpc_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBpc_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_GBpc_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBpc_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBpc_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_GBpc_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBpc_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_GBpc_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBT_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBT_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_GBT_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBT_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_GBT_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBT_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBT_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_GBT_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBT_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_GBT_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBT_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBT_H_table[] = { 0 }; + +static pdf_cmap cmap_GBT_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBT_H_ranges, + 0, 0, (unsigned short*) cmap_GBT_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBTpc_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBTpc_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_GBTpc_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBTpc_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_GBTpc_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBTpc_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBTpc_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_GBTpc_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBTpc_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_GBTpc_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GBT_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GBT_V_table[] = { 0 }; + +static pdf_cmap cmap_GBT_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GBT_V_ranges, + 0, 0, (unsigned short*) cmap_GBT_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_GB_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_GB_V_table[] = { 0 }; + +static pdf_cmap cmap_GB_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_GB_V_ranges, + 0, 0, (unsigned short*) cmap_GB_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniGB_UCS2_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniGB_UCS2_H_table[] = { 0 }; + +static pdf_cmap cmap_UniGB_UCS2_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniGB_UCS2_H_ranges, + 0, 0, (unsigned short*) cmap_UniGB_UCS2_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniGB_UCS2_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniGB_UCS2_V_table[] = { 0 }; + +static pdf_cmap cmap_UniGB_UCS2_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniGB_UCS2_V_ranges, + 0, 0, (unsigned short*) cmap_UniGB_UCS2_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniGB_UTF16_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniGB_UTF16_H_table[] = { 0 }; + +static pdf_cmap cmap_UniGB_UTF16_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniGB_UTF16_H_ranges, + 0, 0, (unsigned short*) cmap_UniGB_UTF16_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniGB_UTF16_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniGB_UTF16_V_table[] = { 0 }; + +static pdf_cmap cmap_UniGB_UTF16_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniGB_UTF16_V_ranges, + 0, 0, (unsigned short*) cmap_UniGB_UTF16_V_table, +}; diff --git a/contrib/media/updf_newlib/generated/cmap_japan.h b/contrib/media/updf_newlib/generated/cmap_japan.h new file mode 100755 index 000000000..125f24f43 --- /dev/null +++ b/contrib/media/updf_newlib/generated/cmap_japan.h @@ -0,0 +1,1038 @@ +/* This is an automatically generated file. Do not edit. */ + +/* B5-V */ + +static const pdf_range cmap_78_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_78_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_78_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_78_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_78_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_78_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_78_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_78_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_78_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_78_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_78_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_78_H_table[] = { 0 }; + +static pdf_cmap cmap_78_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_78_H_ranges, + 0, 0, (unsigned short*) cmap_78_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_78ms_RKSJ_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_78ms_RKSJ_H_table[] = { 0 }; + +static pdf_cmap cmap_78ms_RKSJ_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_78ms_RKSJ_H_ranges, + 0, 0, (unsigned short*) cmap_78ms_RKSJ_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_78ms_RKSJ_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_78ms_RKSJ_V_table[] = { 0 }; + +static pdf_cmap cmap_78ms_RKSJ_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_78ms_RKSJ_V_ranges, + 0, 0, (unsigned short*) cmap_78ms_RKSJ_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_78_RKSJ_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_78_RKSJ_H_table[] = { 0 }; + +static pdf_cmap cmap_78_RKSJ_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_78_RKSJ_H_ranges, + 0, 0, (unsigned short*) cmap_78_RKSJ_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_78_RKSJ_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_78_RKSJ_V_table[] = { 0 }; + +static pdf_cmap cmap_78_RKSJ_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_78_RKSJ_V_ranges, + 0, 0, (unsigned short*) cmap_78_RKSJ_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_78_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_78_V_table[] = { 0 }; + +static pdf_cmap cmap_78_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_78_V_ranges, + 0, 0, (unsigned short*) cmap_78_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_83pv_RKSJ_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_83pv_RKSJ_H_table[] = { 0 }; + +static pdf_cmap cmap_83pv_RKSJ_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_83pv_RKSJ_H_ranges, + 0, 0, (unsigned short*) cmap_83pv_RKSJ_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_90msp_RKSJ_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_90msp_RKSJ_H_table[] = { 0 }; + +static pdf_cmap cmap_90msp_RKSJ_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_90msp_RKSJ_H_ranges, + 0, 0, (unsigned short*) cmap_90msp_RKSJ_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_90msp_RKSJ_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_90msp_RKSJ_V_table[] = { 0 }; + +static pdf_cmap cmap_90msp_RKSJ_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_90msp_RKSJ_V_ranges, + 0, 0, (unsigned short*) cmap_90msp_RKSJ_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_90ms_RKSJ_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_90ms_RKSJ_H_table[] = { 0 }; + +static pdf_cmap cmap_90ms_RKSJ_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_90ms_RKSJ_H_ranges, + 0, 0, (unsigned short*) cmap_90ms_RKSJ_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_90ms_RKSJ_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_90ms_RKSJ_V_table[] = { 0 }; + +static pdf_cmap cmap_90ms_RKSJ_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_90ms_RKSJ_V_ranges, + 0, 0, (unsigned short*) cmap_90ms_RKSJ_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_90pv_RKSJ_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_90pv_RKSJ_H_table[] = { 0 }; + +static pdf_cmap cmap_90pv_RKSJ_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_90pv_RKSJ_H_ranges, + 0, 0, (unsigned short*) cmap_90pv_RKSJ_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_90pv_RKSJ_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_90pv_RKSJ_V_table[] = { 0 }; + +static pdf_cmap cmap_90pv_RKSJ_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_90pv_RKSJ_V_ranges, + 0, 0, (unsigned short*) cmap_90pv_RKSJ_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Add_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Add_H_table[] = { 0 }; + +static pdf_cmap cmap_Add_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Add_H_ranges, + 0, 0, (unsigned short*) cmap_Add_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Add_RKSJ_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Add_RKSJ_H_table[] = { 0 }; + +static pdf_cmap cmap_Add_RKSJ_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Add_RKSJ_H_ranges, + 0, 0, (unsigned short*) cmap_Add_RKSJ_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Add_RKSJ_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Add_RKSJ_V_table[] = { 0 }; + +static pdf_cmap cmap_Add_RKSJ_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Add_RKSJ_V_ranges, + 0, 0, (unsigned short*) cmap_Add_RKSJ_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Add_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Add_V_table[] = { 0 }; + +static pdf_cmap cmap_Add_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Add_V_ranges, + 0, 0, (unsigned short*) cmap_Add_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Japan1_0_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Japan1_0_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Japan1_0 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Japan1_0_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Japan1_0_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Japan1_1_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Japan1_1_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Japan1_1 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Japan1_1_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Japan1_1_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Japan1_2_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Japan1_2_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Japan1_2 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Japan1_2_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Japan1_2_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Japan1_3_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Japan1_3_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Japan1_3 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Japan1_3_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Japan1_3_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Japan1_4_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Japan1_4_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Japan1_4 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Japan1_4_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Japan1_4_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Japan1_5_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Japan1_5_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Japan1_5 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Japan1_5_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Japan1_5_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Japan1_6_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Japan1_6_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Japan1_6 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Japan1_6_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Japan1_6_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Japan1_UCS2_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Japan1_UCS2_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Japan1_UCS2 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Japan1_UCS2_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Japan1_UCS2_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Japan2_0_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Japan2_0_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Japan2_0 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Japan2_0_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Japan2_0_table, +}; + +/* B5-V */ + +static const pdf_range cmap_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Ext_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Ext_H_table[] = { 0 }; + +static pdf_cmap cmap_Ext_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Ext_H_ranges, + 0, 0, (unsigned short*) cmap_Ext_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Ext_RKSJ_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Ext_RKSJ_H_table[] = { 0 }; + +static pdf_cmap cmap_Ext_RKSJ_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Ext_RKSJ_H_ranges, + 0, 0, (unsigned short*) cmap_Ext_RKSJ_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Ext_RKSJ_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Ext_RKSJ_V_table[] = { 0 }; + +static pdf_cmap cmap_Ext_RKSJ_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Ext_RKSJ_V_ranges, + 0, 0, (unsigned short*) cmap_Ext_RKSJ_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Ext_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Ext_V_table[] = { 0 }; + +static pdf_cmap cmap_Ext_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Ext_V_ranges, + 0, 0, (unsigned short*) cmap_Ext_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_H_table[] = { 0 }; + +static pdf_cmap cmap_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_H_ranges, + 0, 0, (unsigned short*) cmap_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Hankaku_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Hankaku_table[] = { 0 }; + +static pdf_cmap cmap_Hankaku = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Hankaku_ranges, + 0, 0, (unsigned short*) cmap_Hankaku_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Hiragana_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Hiragana_table[] = { 0 }; + +static pdf_cmap cmap_Hiragana = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Hiragana_ranges, + 0, 0, (unsigned short*) cmap_Hiragana_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Hojo_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Hojo_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_Hojo_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Hojo_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_Hojo_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Hojo_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Hojo_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_Hojo_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Hojo_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_Hojo_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Hojo_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Hojo_H_table[] = { 0 }; + +static pdf_cmap cmap_Hojo_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Hojo_H_ranges, + 0, 0, (unsigned short*) cmap_Hojo_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Hojo_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Hojo_V_table[] = { 0 }; + +static pdf_cmap cmap_Hojo_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Hojo_V_ranges, + 0, 0, (unsigned short*) cmap_Hojo_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Katakana_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Katakana_table[] = { 0 }; + +static pdf_cmap cmap_Katakana = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Katakana_ranges, + 0, 0, (unsigned short*) cmap_Katakana_table, +}; + +/* B5-V */ + +static const pdf_range cmap_NWP_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_NWP_H_table[] = { 0 }; + +static pdf_cmap cmap_NWP_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_NWP_H_ranges, + 0, 0, (unsigned short*) cmap_NWP_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_NWP_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_NWP_V_table[] = { 0 }; + +static pdf_cmap cmap_NWP_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_NWP_V_ranges, + 0, 0, (unsigned short*) cmap_NWP_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_RKSJ_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_RKSJ_H_table[] = { 0 }; + +static pdf_cmap cmap_RKSJ_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_RKSJ_H_ranges, + 0, 0, (unsigned short*) cmap_RKSJ_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_RKSJ_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_RKSJ_V_table[] = { 0 }; + +static pdf_cmap cmap_RKSJ_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_RKSJ_V_ranges, + 0, 0, (unsigned short*) cmap_RKSJ_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Roman_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Roman_table[] = { 0 }; + +static pdf_cmap cmap_Roman = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Roman_ranges, + 0, 0, (unsigned short*) cmap_Roman_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniHojo_UCS2_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniHojo_UCS2_H_table[] = { 0 }; + +static pdf_cmap cmap_UniHojo_UCS2_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniHojo_UCS2_H_ranges, + 0, 0, (unsigned short*) cmap_UniHojo_UCS2_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniHojo_UCS2_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniHojo_UCS2_V_table[] = { 0 }; + +static pdf_cmap cmap_UniHojo_UCS2_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniHojo_UCS2_V_ranges, + 0, 0, (unsigned short*) cmap_UniHojo_UCS2_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniHojo_UTF16_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniHojo_UTF16_H_table[] = { 0 }; + +static pdf_cmap cmap_UniHojo_UTF16_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniHojo_UTF16_H_ranges, + 0, 0, (unsigned short*) cmap_UniHojo_UTF16_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniHojo_UTF16_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniHojo_UTF16_V_table[] = { 0 }; + +static pdf_cmap cmap_UniHojo_UTF16_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniHojo_UTF16_V_ranges, + 0, 0, (unsigned short*) cmap_UniHojo_UTF16_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniJISPro_UCS2_HW_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniJISPro_UCS2_HW_V_table[] = { 0 }; + +static pdf_cmap cmap_UniJISPro_UCS2_HW_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniJISPro_UCS2_HW_V_ranges, + 0, 0, (unsigned short*) cmap_UniJISPro_UCS2_HW_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniJISPro_UCS2_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniJISPro_UCS2_V_table[] = { 0 }; + +static pdf_cmap cmap_UniJISPro_UCS2_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniJISPro_UCS2_V_ranges, + 0, 0, (unsigned short*) cmap_UniJISPro_UCS2_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniJIS_UCS2_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniJIS_UCS2_H_table[] = { 0 }; + +static pdf_cmap cmap_UniJIS_UCS2_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniJIS_UCS2_H_ranges, + 0, 0, (unsigned short*) cmap_UniJIS_UCS2_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniJIS_UCS2_HW_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniJIS_UCS2_HW_H_table[] = { 0 }; + +static pdf_cmap cmap_UniJIS_UCS2_HW_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniJIS_UCS2_HW_H_ranges, + 0, 0, (unsigned short*) cmap_UniJIS_UCS2_HW_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniJIS_UCS2_HW_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniJIS_UCS2_HW_V_table[] = { 0 }; + +static pdf_cmap cmap_UniJIS_UCS2_HW_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniJIS_UCS2_HW_V_ranges, + 0, 0, (unsigned short*) cmap_UniJIS_UCS2_HW_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniJIS_UCS2_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniJIS_UCS2_V_table[] = { 0 }; + +static pdf_cmap cmap_UniJIS_UCS2_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniJIS_UCS2_V_ranges, + 0, 0, (unsigned short*) cmap_UniJIS_UCS2_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniJIS_UTF16_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniJIS_UTF16_H_table[] = { 0 }; + +static pdf_cmap cmap_UniJIS_UTF16_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniJIS_UTF16_H_ranges, + 0, 0, (unsigned short*) cmap_UniJIS_UTF16_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniJIS_UTF16_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniJIS_UTF16_V_table[] = { 0 }; + +static pdf_cmap cmap_UniJIS_UTF16_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniJIS_UTF16_V_ranges, + 0, 0, (unsigned short*) cmap_UniJIS_UTF16_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_V_table[] = { 0 }; + +static pdf_cmap cmap_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_V_ranges, + 0, 0, (unsigned short*) cmap_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_WP_Symbol_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_WP_Symbol_table[] = { 0 }; + +static pdf_cmap cmap_WP_Symbol = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_WP_Symbol_ranges, + 0, 0, (unsigned short*) cmap_WP_Symbol_table, +}; diff --git a/contrib/media/updf_newlib/generated/cmap_korea.h b/contrib/media/updf_newlib/generated/cmap_korea.h new file mode 100755 index 000000000..586dd4893 --- /dev/null +++ b/contrib/media/updf_newlib/generated/cmap_korea.h @@ -0,0 +1,341 @@ +/* This is an automatically generated file. Do not edit. */ + +/* B5-V */ + +static const pdf_range cmap_Adobe_Korea1_0_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Korea1_0_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Korea1_0 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Korea1_0_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Korea1_0_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Korea1_1_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Korea1_1_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Korea1_1 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Korea1_1_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Korea1_1_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Korea1_2_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Korea1_2_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Korea1_2 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Korea1_2_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Korea1_2_table, +}; + +/* B5-V */ + +static const pdf_range cmap_Adobe_Korea1_UCS2_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_Adobe_Korea1_UCS2_table[] = { 0 }; + +static pdf_cmap cmap_Adobe_Korea1_UCS2 = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_Adobe_Korea1_UCS2_ranges, + 0, 0, (unsigned short*) cmap_Adobe_Korea1_UCS2_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSC_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSC_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_KSC_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSC_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_KSC_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSC_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSC_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_KSC_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSC_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_KSC_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSC_H_table[] = { 0 }; + +static pdf_cmap cmap_KSC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSC_H_ranges, + 0, 0, (unsigned short*) cmap_KSC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSC_Johab_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSC_Johab_H_table[] = { 0 }; + +static pdf_cmap cmap_KSC_Johab_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSC_Johab_H_ranges, + 0, 0, (unsigned short*) cmap_KSC_Johab_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSC_Johab_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSC_Johab_V_table[] = { 0 }; + +static pdf_cmap cmap_KSC_Johab_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSC_Johab_V_ranges, + 0, 0, (unsigned short*) cmap_KSC_Johab_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSCms_UHC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSCms_UHC_H_table[] = { 0 }; + +static pdf_cmap cmap_KSCms_UHC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSCms_UHC_H_ranges, + 0, 0, (unsigned short*) cmap_KSCms_UHC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSCms_UHC_HW_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSCms_UHC_HW_H_table[] = { 0 }; + +static pdf_cmap cmap_KSCms_UHC_HW_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSCms_UHC_HW_H_ranges, + 0, 0, (unsigned short*) cmap_KSCms_UHC_HW_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSCms_UHC_HW_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSCms_UHC_HW_V_table[] = { 0 }; + +static pdf_cmap cmap_KSCms_UHC_HW_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSCms_UHC_HW_V_ranges, + 0, 0, (unsigned short*) cmap_KSCms_UHC_HW_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSCms_UHC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSCms_UHC_V_table[] = { 0 }; + +static pdf_cmap cmap_KSCms_UHC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSCms_UHC_V_ranges, + 0, 0, (unsigned short*) cmap_KSCms_UHC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSCpc_EUC_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSCpc_EUC_H_table[] = { 0 }; + +static pdf_cmap cmap_KSCpc_EUC_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSCpc_EUC_H_ranges, + 0, 0, (unsigned short*) cmap_KSCpc_EUC_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSCpc_EUC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSCpc_EUC_V_table[] = { 0 }; + +static pdf_cmap cmap_KSCpc_EUC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSCpc_EUC_V_ranges, + 0, 0, (unsigned short*) cmap_KSCpc_EUC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_KSC_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_KSC_V_table[] = { 0 }; + +static pdf_cmap cmap_KSC_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_KSC_V_ranges, + 0, 0, (unsigned short*) cmap_KSC_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniKS_UCS2_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniKS_UCS2_H_table[] = { 0 }; + +static pdf_cmap cmap_UniKS_UCS2_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniKS_UCS2_H_ranges, + 0, 0, (unsigned short*) cmap_UniKS_UCS2_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniKS_UCS2_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniKS_UCS2_V_table[] = { 0 }; + +static pdf_cmap cmap_UniKS_UCS2_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniKS_UCS2_V_ranges, + 0, 0, (unsigned short*) cmap_UniKS_UCS2_V_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniKS_UTF16_H_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniKS_UTF16_H_table[] = { 0 }; + +static pdf_cmap cmap_UniKS_UTF16_H = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniKS_UTF16_H_ranges, + 0, 0, (unsigned short*) cmap_UniKS_UTF16_H_table, +}; + +/* B5-V */ + +static const pdf_range cmap_UniKS_UTF16_V_ranges[] = { +{41291,0,13646},{41306,0,13743},{41308,0,13745},{41309,5,130}, +{41313,5,134},{41317,5,138},{41321,5,142},{41325,5,146}, +{41329,5,150},{41333,5,154},{41337,5,158},{41443,0,13647}, +}; + +static const unsigned short cmap_UniKS_UTF16_V_table[] = { 0 }; + +static pdf_cmap cmap_UniKS_UTF16_V = { + -1, "B5-V", "B5-H", 0, 1, 0, + { {0,0,0}, }, + 12, 12, (pdf_range*) cmap_UniKS_UTF16_V_ranges, + 0, 0, (unsigned short*) cmap_UniKS_UTF16_V_table, +}; diff --git a/contrib/media/updf_newlib/generated/font_base14.h b/contrib/media/updf_newlib/generated/font_base14.h new file mode 100755 index 000000000..be74f5f48 --- /dev/null +++ b/contrib/media/updf_newlib/generated/font_base14.h @@ -0,0 +1,10561 @@ +#ifndef __STRICT_ANSI__ +#if defined(__linux__) || defined(__FreeBSD__) +#define HAVE_INCBIN +#endif +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_Dingbats[15788]; +asm(".globl pdf_font_Dingbats"); +asm(".balign 8"); +asm("pdf_font_Dingbats:"); +asm(".incbin \"fonts/Dingbats.cff\""); +#else +static const unsigned char pdf_font_Dingbats[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusMonL_Bold[15788]; +asm(".globl pdf_font_NimbusMonL_Bold"); +asm(".balign 8"); +asm("pdf_font_NimbusMonL_Bold:"); +asm(".incbin \"fonts/NimbusMonL-Bold.cff\""); +#else +static const unsigned char pdf_font_NimbusMonL_Bold[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusMonL_BoldObli[15788]; +asm(".globl pdf_font_NimbusMonL_BoldObli"); +asm(".balign 8"); +asm("pdf_font_NimbusMonL_BoldObli:"); +asm(".incbin \"fonts/NimbusMonL-BoldObli.cff\""); +#else +static const unsigned char pdf_font_NimbusMonL_BoldObli[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusMonL_Regu[15788]; +asm(".globl pdf_font_NimbusMonL_Regu"); +asm(".balign 8"); +asm("pdf_font_NimbusMonL_Regu:"); +asm(".incbin \"fonts/NimbusMonL-Regu.cff\""); +#else +static const unsigned char pdf_font_NimbusMonL_Regu[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusMonL_ReguObli[15788]; +asm(".globl pdf_font_NimbusMonL_ReguObli"); +asm(".balign 8"); +asm("pdf_font_NimbusMonL_ReguObli:"); +asm(".incbin \"fonts/NimbusMonL-ReguObli.cff\""); +#else +static const unsigned char pdf_font_NimbusMonL_ReguObli[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusRomNo9L_Medi[15788]; +asm(".globl pdf_font_NimbusRomNo9L_Medi"); +asm(".balign 8"); +asm("pdf_font_NimbusRomNo9L_Medi:"); +asm(".incbin \"fonts/NimbusRomNo9L-Medi.cff\""); +#else +static const unsigned char pdf_font_NimbusRomNo9L_Medi[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusRomNo9L_MediItal[15788]; +asm(".globl pdf_font_NimbusRomNo9L_MediItal"); +asm(".balign 8"); +asm("pdf_font_NimbusRomNo9L_MediItal:"); +asm(".incbin \"fonts/NimbusRomNo9L-MediItal.cff\""); +#else +static const unsigned char pdf_font_NimbusRomNo9L_MediItal[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusRomNo9L_Regu[15788]; +asm(".globl pdf_font_NimbusRomNo9L_Regu"); +asm(".balign 8"); +asm("pdf_font_NimbusRomNo9L_Regu:"); +asm(".incbin \"fonts/NimbusRomNo9L-Regu.cff\""); +#else +static const unsigned char pdf_font_NimbusRomNo9L_Regu[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusRomNo9L_ReguItal[15788]; +asm(".globl pdf_font_NimbusRomNo9L_ReguItal"); +asm(".balign 8"); +asm("pdf_font_NimbusRomNo9L_ReguItal:"); +asm(".incbin \"fonts/NimbusRomNo9L-ReguItal.cff\""); +#else +static const unsigned char pdf_font_NimbusRomNo9L_ReguItal[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusSanL_Bold[15788]; +asm(".globl pdf_font_NimbusSanL_Bold"); +asm(".balign 8"); +asm("pdf_font_NimbusSanL_Bold:"); +asm(".incbin \"fonts/NimbusSanL-Bold.cff\""); +#else +static const unsigned char pdf_font_NimbusSanL_Bold[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusSanL_BoldItal[15788]; +asm(".globl pdf_font_NimbusSanL_BoldItal"); +asm(".balign 8"); +asm("pdf_font_NimbusSanL_BoldItal:"); +asm(".incbin \"fonts/NimbusSanL-BoldItal.cff\""); +#else +static const unsigned char pdf_font_NimbusSanL_BoldItal[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusSanL_Regu[15788]; +asm(".globl pdf_font_NimbusSanL_Regu"); +asm(".balign 8"); +asm("pdf_font_NimbusSanL_Regu:"); +asm(".incbin \"fonts/NimbusSanL-Regu.cff\""); +#else +static const unsigned char pdf_font_NimbusSanL_Regu[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_NimbusSanL_ReguItal[15788]; +asm(".globl pdf_font_NimbusSanL_ReguItal"); +asm(".balign 8"); +asm("pdf_font_NimbusSanL_ReguItal:"); +asm(".incbin \"fonts/NimbusSanL-ReguItal.cff\""); +#else +static const unsigned char pdf_font_NimbusSanL_ReguItal[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_StandardSymL[15788]; +asm(".globl pdf_font_StandardSymL"); +asm(".balign 8"); +asm("pdf_font_StandardSymL:"); +asm(".incbin \"fonts/StandardSymL.cff\""); +#else +static const unsigned char pdf_font_StandardSymL[15788] = { +1,0,4,4,0,1,1,1,16,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,0, +1,2,0,1,0,48,248,31,0,248,32,1,248,33,2,248,34,3,248,24,4,251,43,12,3,251, +66,251,112,250,125,250,77,5,28,0,229,15,28,0,0,16,28,2,182,17,28,0,50,28, +55,74,18,0,8,2,0,1,0,5,0,11,0,20,0,27,0,31,0,95,0,116,0,129,69,117,114,111, +109,105,100,100,111,116,115,102,116,104,121,112,104,101,110,110,98,115,112, +97,99,101,49,46,48,53,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41, +43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40, +85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111, +112,109,101,110,116,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101, +103,117,108,97,114,78,105,109,98,117,115,32,83,97,110,115,32,76,0,0,0,0,1, +0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0, +18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32, +0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47, +0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62, +0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77, +0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92, +0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0, +106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118, +0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0, +131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143, +0,144,0,145,0,146,0,147,0,148,0,149,0,173,0,171,0,174,0,172,0,176,0,175,0, +177,0,154,0,180,0,178,0,181,0,179,0,184,0,182,0,185,0,183,0,186,0,189,0,187, +0,190,0,188,0,191,0,192,0,195,0,193,0,196,0,194,0,197,0,199,0,157,0,198,0, +202,0,200,0,203,0,201,0,205,0,204,0,206,0,209,0,207,0,210,0,208,0,213,0,211, +0,214,0,212,0,215,0,218,0,216,0,219,0,217,0,220,0,221,0,224,0,222,0,225,0, +223,0,226,0,228,0,167,0,162,0,227,1,135,0,150,0,164,0,169,1,136,1,137,0,161, +0,166,0,168,0,159,0,153,0,156,0,155,0,158,0,163,0,170,0,165,1,138,0,151,0, +160,0,152,0,233,2,0,1,0,3,0,5,0,47,0,64,0,163,1,64,1,195,2,101,2,116,2,170, +2,224,3,12,3,32,3,42,3,59,3,75,3,99,3,183,3,215,4,60,4,187,4,246,5,83,5,195, +5,241,6,115,6,225,6,252,7,23,7,54,7,74,7,106,7,200,8,162,8,187,9,72,9,175, +9,237,10,3,10,39,10,152,10,200,10,221,11,26,11,80,11,104,11,161,11,206,11, +232,12,45,12,156,13,4,13,26,13,56,13,121,13,154,13,207,14,6,14,26,14,42,14, +71,14,92,14,121,14,150,14,166,14,182,14,208,15,39,15,119,15,210,15,232,15, +253,16,143,16,208,16,243,17,44,17,94,17,115,17,209,17,252,18,21,18,116,18, +205,19,9,19,31,19,89,19,120,19,153,19,200,19,251,20,12,20,28,20,115,20,134, +20,220,21,46,21,87,21,179,22,98,22,111,22,198,23,55,24,2,24,122,24,146,24, +169,24,182,24,190,24,199,24,244,25,28,25,44,25,78,25,129,25,152,25,206,25, +230,26,6,26,25,26,46,26,60,26,100,26,215,27,55,27,68,27,81,27,94,27,156,27, +173,27,219,27,238,28,10,28,34,28,108,28,124,28,185,28,198,28,216,29,29,29, +183,29,231,30,101,30,235,31,51,31,247,32,12,32,53,32,173,33,51,33,173,33, +222,33,253,34,28,34,59,34,141,34,186,35,99,35,179,35,224,35,253,36,26,36, +68,36,114,36,141,36,168,36,195,37,52,37,101,37,133,37,165,37,197,38,34,38, +63,38,107,38,172,38,201,38,230,39,26,39,49,39,116,39,161,40,53,40,88,40,124, +40,160,40,231,41,19,41,170,41,217,41,249,42,33,42,65,42,115,42,145,42,175, +42,205,43,48,43,94,43,128,43,162,43,196,44,34,44,65,44,127,44,168,44,209, +44,250,45,21,45,47,45,174,46,2,46,44,46,186,46,199,47,33,47,60,47,83,47,100, +47,156,47,174,47,221,48,1,48,75,48,100,48,217,49,22,49,97,49,200,50,53,50, +55,50,79,50,108,50,190,124,14,124,14,124,139,243,248,241,159,18,247,16,223, +56,222,19,208,247,100,249,109,21,56,251,230,6,161,251,115,178,139,161,247, +115,5,19,224,251,179,4,55,35,223,6,14,201,191,232,206,232,3,191,249,89,21, +32,10,206,22,32,10,14,119,159,247,83,207,247,66,207,1,248,121,249,77,21,62, +139,104,251,88,251,17,139,175,247,88,63,139,103,251,88,251,13,139,139,71, +247,0,139,108,251,66,251,6,139,139,71,240,139,101,251,103,215,139,5,178,247, +103,247,16,139,101,251,103,215,139,178,247,103,247,9,139,139,207,34,139,170, +247,66,245,139,139,207,46,139,5,50,71,21,108,251,66,251,17,139,171,247,66, +5,14,185,220,247,8,198,247,26,221,3,247,135,249,150,21,85,7,251,20,123,70, +69,139,251,6,139,76,163,90,186,105,165,120,166,128,212,117,8,251,164,7,94, +145,101,159,116,170,124,162,135,156,133,204,8,60,6,132,251,31,215,56,247, +33,130,8,36,198,242,7,193,143,176,150,172,159,197,175,173,208,139,217,139, +210,112,189,81,172,113,154,126,144,47,167,8,247,141,7,206,136,186,88,140, +66,8,218,6,139,247,6,66,213,251,13,148,8,193,7,80,252,1,21,60,160,102,178, +139,200,139,205,181,182,213,149,8,198,251,228,21,241,109,171,109,139,73,139, +100,124,104,112,113,115,116,114,130,96,134,8,14,248,232,119,159,120,209,247, +93,209,160,209,247,94,209,18,168,208,247,95,208,247,40,208,247,95,208,19, +191,128,247,91,249,65,21,46,62,62,45,45,216,62,233,232,216,216,231,31,236, +64,215,43,30,69,4,196,184,94,82,84,93,94,84,83,93,185,194,195,185,184,194, +31,248,46,233,21,252,31,253,109,205,139,248,31,249,109,5,152,252,23,21,46, +62,62,46,31,19,103,128,45,216,62,233,231,217,216,231,235,64,215,43,30,69, +4,196,184,94,82,85,93,94,84,83,93,184,195,194,185,184,194,31,14,248,10,116, +217,84,159,248,255,209,18,191,223,136,221,247,65,218,19,172,248,129,247,226, +21,140,103,127,91,119,104,8,251,25,247,55,5,243,198,173,182,139,211,8,231, +71,204,44,44,63,70,51,30,139,92,158,101,201,61,8,19,176,251,16,67,101,89, +139,48,139,251,12,221,60,247,15,139,188,139,186,152,175,162,160,152,157,154, +177,176,8,19,108,201,61,247,1,139,251,14,247,43,5,176,196,160,205,139,199, +8,251,180,236,21,78,209,130,156,139,174,8,191,173,173,191,189,176,103,90, +30,139,94,114,110,61,90,8,19,144,247,25,251,186,21,83,80,96,116,87,139,67, +139,80,197,139,209,139,195,170,179,230,197,8,14,68,249,5,243,1,204,232,3, +204,249,109,21,33,10,14,179,249,89,159,1,212,220,3,247,128,249,109,21,39, +251,23,76,251,74,139,251,49,139,251,50,202,251,74,239,251,23,8,194,6,51,247, +35,90,247,60,139,247,52,139,247,51,188,247,61,227,247,34,8,14,179,249,89, +159,1,247,67,220,3,232,251,104,21,239,247,23,202,247,74,139,247,49,139,247, +50,76,247,74,39,247,23,8,84,6,227,251,35,188,251,60,139,251,52,139,251,51, +90,251,61,51,251,34,8,14,235,249,89,159,1,247,52,249,109,21,144,251,4,33, +177,120,80,247,0,109,70,50,189,103,202,232,201,46,190,175,69,228,247,0,169, +120,198,33,101,144,247,4,5,14,247,183,129,159,247,79,209,1,247,149,209,3, +248,170,247,159,21,34,10,14,124,139,243,1,226,243,21,35,10,14,179,247,132, +211,1,247,176,247,204,21,251,130,67,247,130,6,14,124,139,243,1,226,243,3, +247,83,243,21,35,35,243,6,14,124,119,159,249,89,159,1,247,121,249,109,21, +251,129,253,129,194,139,247,129,249,129,5,14,116,212,248,217,217,1,182,229, +247,176,229,3,247,167,249,89,21,73,139,79,110,102,90,93,77,116,44,139,251, +23,8,251,131,219,251,19,247,44,247,42,221,247,19,247,125,30,139,247,30,117, +231,92,203,102,189,80,167,72,139,8,61,4,234,186,43,251,82,251,93,93,45,41, +46,92,237,247,86,247,86,186,234,234,31,14,139,249,89,1,247,151,227,3,247, +151,248,141,21,252,141,227,249,89,81,7,108,251,1,119,124,251,28,122,8,76, +7,14,139,226,248,181,216,1,248,57,229,3,248,142,226,21,252,9,6,148,197,171, +176,226,190,8,239,193,5,238,193,190,212,139,226,139,198,115,194,97,177,97, +177,87,157,72,139,49,139,72,107,100,79,114,101,128,95,137,67,8,227,6,142, +187,145,168,151,162,162,182,185,165,192,139,219,139,199,82,139,63,139,83, +106,91,76,103,8,47,87,5,251,40,55,96,72,131,251,48,8,248,108,6,14,116,217, +248,213,216,18,248,31,229,70,229,19,208,247,113,247,217,21,150,139,176,140, +5,236,189,95,54,50,84,86,47,31,43,139,92,187,133,242,8,51,6,143,82,149,102, +156,107,175,71,209,104,236,139,247,38,139,233,226,139,247,26,139,229,104, +189,54,168,8,19,224,205,165,172,189,139,210,139,247,14,58,212,251,27,139, +251,35,139,63,61,136,251,43,8,227,6,140,182,143,163,150,161,159,178,183,163, +194,139,217,139,186,93,139,64,139,89,121,109,100,123,115,129,108,135,77,138, +8,14,139,249,89,252,175,218,18,247,219,227,19,96,247,219,247,62,21,19,160, +251,62,227,7,19,96,247,62,244,218,34,7,19,160,248,96,74,7,251,214,252,82, +5,19,96,46,7,247,191,218,21,251,114,139,247,114,247,202,5,14,116,217,247, +226,217,247,47,226,1,248,59,229,3,248,112,249,89,21,252,2,139,86,252,22,220, +139,5,180,188,173,156,194,139,8,234,199,74,34,37,80,77,43,31,62,139,92,178, +118,219,8,51,6,151,81,149,111,160,113,179,85,211,108,219,139,8,247,35,239, +243,247,42,247,32,46,235,251,28,31,89,139,99,126,98,109,8,167,247,90,247, +187,139,5,14,116,217,247,200,217,202,159,246,217,1,182,234,247,177,229,3, +248,134,248,160,21,122,247,8,63,208,251,0,139,61,139,69,101,97,76,95,70,119, +52,139,251,21,139,251,11,157,63,181,76,177,82,201,108,217,139,8,247,27,236, +239,247,31,247,24,49,232,251,19,31,69,139,84,112,101,87,140,247,65,195,235, +240,139,201,139,182,100,153,71,8,251,17,251,53,21,224,192,80,44,50,79,74, +58,57,77,207,230,227,199,200,226,31,14,139,249,89,52,226,18,19,64,248,156, +249,89,21,252,110,52,248,19,6,19,128,251,61,251,133,70,251,40,86,251,125, +8,233,6,178,247,119,228,247,87,247,52,247,105,8,14,116,217,247,171,213,247, +115,217,18,176,229,74,229,247,138,229,74,229,19,236,248,27,248,9,21,212,183, +163,175,139,206,8,247,3,52,217,251,18,251,17,51,61,251,3,30,139,73,163,103, +211,94,8,19,242,58,100,99,80,139,61,8,251,22,237,49,247,32,247,32,237,229, +247,21,30,139,218,99,198,57,178,8,19,236,251,8,247,150,21,214,187,95,70,73, +90,95,65,65,90,183,206,31,207,188,183,213,30,19,242,251,189,4,227,199,83, +56,55,79,83,49,53,79,196,222,31,222,199,195,227,30,14,116,217,247,82,217, +247,201,216,1,177,229,247,177,235,3,192,247,54,21,156,251,8,215,70,247,0, +139,217,139,210,177,180,202,184,208,159,226,139,247,21,139,247,11,121,215, +97,202,100,196,77,170,61,139,8,251,27,42,39,251,31,251,24,229,46,247,20,31, +206,139,188,163,185,194,138,251,65,83,43,38,139,77,139,96,178,125,207,8,247, +20,248,106,21,221,201,71,47,52,78,77,53,54,86,198,234,229,199,204,220,31, +14,124,139,243,247,208,243,1,247,2,243,3,247,106,243,21,35,35,243,6,248,160, +4,35,35,243,6,14,124,139,243,247,208,243,1,247,3,243,3,247,107,248,160,21, +35,35,243,6,34,251,208,21,35,10,14,247,183,130,159,1,184,247,90,21,248,125, +251,99,139,218,252,30,247,56,248,30,247,53,139,218,252,125,251,99,5,14,247, +183,247,3,209,241,209,1,248,170,247,245,21,36,10,37,4,36,10,14,247,183,130, +159,1,248,175,247,159,21,252,125,247,99,139,60,248,30,251,56,252,30,251,53, +139,60,248,125,247,99,5,14,139,243,248,195,217,1,247,132,229,228,229,3,247, +222,247,91,21,186,7,139,183,150,156,207,202,214,207,164,184,139,205,8,247, +9,56,214,251,22,251,36,64,59,251,46,30,224,6,139,185,144,167,151,163,158, +176,179,160,192,139,216,139,190,93,139,71,139,93,117,100,86,92,80,86,139, +139,122,116,118,111,132,116,139,103,8,84,7,229,44,21,49,35,229,6,14,249,102, +251,34,216,247,14,209,74,203,247,224,203,247,34,216,18,173,224,247,37,229, +248,146,226,19,55,249,45,248,137,21,117,73,5,114,196,97,169,84,139,8,251, +26,251,15,251,24,251,37,35,209,60,232,31,192,139,182,161,185,189,8,19,223, +148,88,177,113,202,139,213,139,200,168,190,199,194,203,170,220,139,217,139, +247,95,251,85,247,61,251,125,139,251,11,139,251,18,90,51,59,41,50,79,251, +26,139,251,23,8,251,114,247,94,251,70,247,145,30,213,139,219,154,211,166, +8,111,206,5,57,116,82,130,85,139,8,251,104,251,55,247,39,247,83,247,102,247, +74,247,73,247,103,247,83,247,53,251,32,251,59,251,9,56,251,5,54,112,116,159, +163,31,139,148,143,157,147,162,8,229,247,172,5,251,125,96,21,195,139,180, +97,136,85,137,89,112,55,114,102,8,19,55,111,98,102,115,102,139,8,84,95,191, +205,247,4,216,241,223,31,14,248,10,139,159,247,91,217,248,48,159,1,248,110, +247,111,21,37,10,247,147,217,21,38,10,14,248,10,139,221,247,143,221,247,124, +221,18,218,232,247,218,232,78,232,19,244,218,22,247,221,6,208,139,190,158, +178,181,175,177,159,191,139,196,139,227,99,192,46,175,8,19,248,205,170,174, +193,139,213,139,192,119,186,101,173,101,174,89,155,69,139,8,251,188,6,232, +251,206,21,247,124,247,72,7,191,139,168,132,164,120,165,119,153,109,139,99, +139,100,125,108,113,119,114,120,110,132,87,139,8,251,72,251,225,21,247,143, +247,119,7,184,139,169,128,161,115,8,19,244,161,116,151,107,139,103,139,104, +127,107,117,116,117,115,109,128,94,139,8,14,248,65,116,221,248,236,221,1, +187,232,3,249,42,248,139,21,110,247,52,47,217,251,52,139,41,139,60,108,85, +79,73,67,103,35,139,251,10,139,251,12,176,36,208,68,195,81,211,112,234,139, +247,70,139,239,235,161,247,85,8,43,6,131,89,129,105,124,110,109,79,77,105, +61,139,8,251,37,47,247,8,247,74,247,79,227,247,7,247,33,31,198,139,194,121, +169,111,166,114,154,108,150,85,8,14,248,65,139,221,248,201,221,1,228,232, +248,28,232,3,228,22,247,173,6,247,76,247,5,247,30,247,119,247,118,251,4,247, +30,251,77,31,251,173,6,232,253,27,21,248,201,247,64,7,247,36,215,42,251,78, +251,76,63,41,251,36,31,14,248,10,139,221,247,142,221,247,125,221,1,229,232, +3,247,75,247,224,21,39,10,14,247,210,139,159,247,204,221,247,125,221,1,229, +232,3,247,75,247,224,21,247,240,221,251,240,247,125,248,32,221,252,125,253, +109,232,6,14,248,121,116,221,247,136,221,247,166,221,1,183,232,248,126,221, +3,249,89,248,21,21,251,196,57,247,114,119,6,251,22,43,45,251,25,30,65,139, +72,166,96,186,91,191,110,226,139,229,139,247,71,241,247,10,247,46,139,247, +3,139,219,82,159,45,8,234,6,113,247,40,251,4,224,251,59,139,50,139,67,116, +82,92,55,69,91,251,5,139,251,23,139,251,116,247,29,251,48,247,89,139,238, +139,218,176,210,218,8,162,42,198,139,5,14,248,65,139,159,247,204,221,247, +187,159,18,222,232,46,233,248,10,232,19,244,248,187,247,224,21,251,224,232, +249,109,46,251,207,252,11,247,207,7,19,236,46,253,109,233,247,224,6,14,124, +139,159,249,69,159,1,239,233,3,247,86,249,109,21,45,253,109,233,6,14,247, +99,116,217,249,34,159,1,156,234,247,113,232,3,247,225,249,109,21,252,149, +7,139,81,133,106,122,114,121,111,105,122,102,139,8,69,100,186,224,31,186, +44,75,7,251,10,217,64,247,17,247,19,218,218,247,18,30,248,183,7,14,248,10, +139,159,249,69,159,1,218,232,3,247,64,247,147,21,247,11,247,11,247,149,252, +10,247,2,139,251,192,248,68,247,189,247,189,251,12,139,251,255,252,5,139, +248,5,46,139,139,253,109,232,139,5,14,139,221,249,7,159,1,219,232,3,247,65, +249,109,21,46,253,109,248,89,221,251,252,6,14,248,176,139,159,249,69,159, +1,214,227,248,146,227,3,248,104,22,247,97,248,247,139,252,247,227,139,139, +249,109,251,21,139,251,104,253,15,251,108,249,15,251,21,139,139,253,109,227, +139,139,248,247,247,99,252,247,5,14,248,65,139,159,249,69,159,1,215,227,248, +30,227,3,249,26,249,109,21,51,252,232,6,252,17,248,232,38,139,139,253,109, +227,139,139,248,227,248,13,252,227,244,139,5,14,248,121,116,221,248,236,221, +1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10,14,248,10,139, +159,247,181,221,247,148,221,1,230,232,247,228,236,3,247,76,247,201,21,247, +121,6,196,139,184,156,178,174,183,179,158,186,139,206,8,247,29,58,216,251, +36,30,251,193,253,109,232,6,248,27,4,247,148,247,86,7,228,192,91,59,59,86, +91,50,31,14,248,121,116,221,248,236,221,1,177,232,248,154,232,3,249,113,138, +21,45,216,5,208,215,173,233,139,247,7,8,247,118,251,34,247,46,251,102,251, +102,251,34,251,46,251,120,251,120,247,34,251,46,247,102,30,211,139,199,155, +198,174,8,244,52,5,251,97,247,156,21,93,83,213,77,5,96,119,106,131,95,139, +8,251,47,36,247,12,247,72,247,72,243,247,12,247,47,247,47,243,251,12,251, +71,31,139,45,114,66,85,78,8,14,248,65,139,159,247,186,221,247,143,221,1,232, +232,248,4,236,3,247,78,247,206,21,247,132,6,222,176,99,49,31,138,74,5,139, +94,147,95,152,109,8,247,5,162,6,104,163,132,165,137,236,138,247,12,120,175, +60,173,221,179,172,190,139,222,8,247,18,60,208,251,35,30,251,228,253,109, +232,6,248,32,4,247,143,247,117,7,191,139,169,131,162,119,164,118,152,106, +139,95,8,53,95,100,40,30,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,14,247,210,139,159,249,7,221,1,247,153,232,3,247, +246,249,27,21,247,131,221,252,208,57,247,132,253,27,232,6,14,248,65,116,221, +249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68,79,251, +9,30,85,139,95,152,104,164,103,167,122,176,139,194,8,248,148,46,252,148,7, +251,40,245,47,247,65,247,63,247,2,233,247,38,30,248,148,7,14,248,10,139,159, +249,69,159,1,248,28,22,247,145,249,109,40,139,251,94,252,253,251,106,248, +253,39,139,247,154,253,109,5,14,249,31,139,159,249,69,159,1,249,124,22,247, +77,249,109,35,139,251,26,252,228,251,58,248,228,39,139,251,54,252,228,251, +29,248,228,35,139,247,79,253,109,241,139,247,55,248,235,247,60,252,235,5, +14,248,10,139,159,249,69,159,1,248,27,248,10,21,247,138,247,247,251,3,139, +251,80,251,178,251,79,247,178,251,5,139,247,134,251,247,251,150,252,10,247, +5,139,247,92,247,196,247,91,251,196,247,7,139,5,14,248,10,139,159,249,69, +159,1,247,186,232,3,248,23,247,178,21,43,10,14,247,210,139,221,248,201,221, +1,248,217,249,109,21,44,10,14,124,251,104,211,249,177,211,1,203,222,3,247, +142,249,109,21,251,78,254,65,247,78,211,36,249,177,242,6,14,124,119,159,249, +89,159,1,186,249,109,21,84,139,247,129,253,129,194,139,5,14,124,251,104,211, +249,177,211,1,247,18,222,3,162,251,104,21,247,78,250,65,251,78,67,242,253, +177,36,6,14,247,68,247,89,249,89,21,251,45,252,16,208,139,247,13,247,192, +247,14,251,192,208,139,251,47,248,16,5,14,251,68,189,1,248,214,251,18,21, +252,236,89,248,236,6,14,68,248,113,243,1,204,232,3,247,50,248,113,21,45,10, +14,116,212,248,48,216,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38, +247,71,21,47,10,14,116,217,84,159,248,77,217,247,62,159,18,193,222,247,191, +226,19,92,193,249,109,21,253,109,214,206,7,19,188,179,78,192,110,212,139, +8,247,30,229,247,5,247,66,247,62,53,244,251,30,31,67,139,88,112,100,80,8, +247,168,7,247,38,251,160,21,232,199,58,251,17,251,11,77,58,48,51,81,219,247, +15,247,15,197,219,227,31,14,247,99,116,216,248,44,216,1,170,226,3,248,107, +247,240,21,135,190,128,172,119,168,103,188,76,168,66,139,8,251,33,47,251, +4,251,66,251,61,229,32,247,34,31,247,17,139,218,214,149,247,20,8,55,6,125, +55,96,97,68,139,8,47,84,214,247,16,247,23,193,217,230,31,209,139,183,98,149, +66,8,14,116,217,84,159,248,77,217,247,62,159,18,165,226,247,191,222,19,188, +248,131,249,109,21,56,251,163,6,104,192,83,167,69,139,8,251,28,50,251,1,251, +59,251,69,226,251,1,247,33,31,211,139,189,166,184,204,8,19,124,70,213,7,251, +122,248,97,21,229,196,59,251,17,31,19,172,251,13,81,59,51,47,78,220,247,14, +247,14,200,220,230,30,14,116,216,247,72,207,247,52,216,1,248,149,247,126, +21,48,10,141,207,21,49,10,14,124,139,159,248,72,207,247,27,212,1,227,222, +3,247,150,248,160,21,50,10,14,251,110,209,247,17,216,248,44,216,104,159,18, +168,226,247,188,216,19,28,248,48,248,160,21,63,7,19,236,97,201,88,168,72, +139,251,25,139,49,251,8,139,251,62,139,53,162,69,182,89,178,95,195,113,194, +139,205,139,185,167,186,205,8,112,7,139,68,130,96,118,110,117,108,96,121, +88,139,101,139,105,149,116,157,120,154,131,153,134,170,8,54,6,148,40,216, +80,247,15,139,217,139,206,164,173,181,179,187,154,205,139,247,15,8,19,28, +248,74,7,19,108,251,120,77,21,229,192,63,251,23,251,17,85,63,51,48,84,216, +247,19,31,247,18,195,217,228,30,14,139,159,248,82,212,247,62,159,1,209,222, +247,142,222,3,209,249,109,21,253,109,222,247,181,7,246,195,209,225,30,166, +139,166,130,159,124,163,122,149,114,139,102,8,251,255,222,248,32,7,227,76, +194,37,30,65,139,94,116,90,75,8,247,169,7,14,68,139,159,248,120,159,239,244, +18,205,223,56,222,19,232,247,42,248,160,21,56,252,160,222,6,19,240,249,109, +4,55,34,223,6,14,68,251,110,212,249,29,159,239,244,1,209,222,3,209,248,160, +21,252,236,7,87,122,122,88,30,136,139,139,139,122,140,8,68,7,149,137,144, +138,152,139,8,233,188,177,210,31,249,13,7,247,97,4,56,34,222,6,14,247,99, +139,159,248,120,159,247,77,159,1,197,222,3,247,33,249,109,21,56,253,109,222, +247,96,6,220,219,247,69,251,176,242,139,251,106,247,235,247,74,247,73,32, +139,251,114,251,114,5,14,68,139,159,249,69,159,1,207,223,3,247,44,249,109, +21,55,253,109,223,6,14,248,176,139,159,248,82,212,104,159,18,209,216,62,223, +247,112,223,247,112,223,19,174,209,248,160,21,252,160,223,247,221,7,19,206, +215,194,200,207,201,174,101,72,30,251,253,223,247,221,7,215,194,200,207,200, +175,100,73,30,251,253,223,248,29,7,233,85,191,41,30,69,139,97,118,90,80,108, +195,97,163,71,139,8,19,48,69,139,93,113,94,76,8,213,7,14,139,159,248,82,212, +104,159,18,209,216,62,223,247,142,222,19,172,209,248,160,21,252,160,223,247, +181,7,19,204,51,10,19,48,61,139,89,109,93,66,8,227,7,14,116,216,248,44,216, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,14,251,110, +159,247,67,217,248,42,217,104,159,18,193,216,62,223,247,190,226,19,230,193, +251,110,21,223,247,165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59, +247,68,53,247,2,251,31,31,19,152,68,139,82,107,100,77,8,218,7,19,150,62,6, +19,102,247,122,76,21,231,199,58,251,17,251,11,78,58,48,51,81,219,247,15,31, +247,15,197,219,227,30,14,251,110,159,247,67,217,248,42,217,104,159,18,165, +226,247,191,222,19,156,248,131,251,110,21,249,122,65,69,7,19,236,100,194, +80,169,70,139,8,251,30,49,251,5,251,66,251,62,225,34,247,30,31,212,139,189, +165,178,196,8,251,170,7,251,38,249,59,21,228,196,59,251,18,251,12,81,59,51, +47,78,220,247,14,247,13,200,221,231,31,14,179,139,159,248,120,159,134,159, +18,208,216,62,223,19,200,208,248,160,21,252,160,223,247,164,7,139,214,158, +188,179,168,165,158,164,145,197,140,8,224,7,19,48,125,141,132,140,128,139, +85,139,98,107,91,61,8,19,80,234,7,14,247,99,116,216,248,44,216,1,186,226, +247,130,226,3,248,74,248,14,21,54,10,14,124,116,212,248,42,207,1,224,222, +3,247,146,248,160,21,53,247,36,56,251,36,68,71,210,252,32,6,86,175,109,204, +30,159,139,159,141,167,144,8,209,7,128,136,126,138,123,139,8,103,129,149, +176,31,247,251,225,7,14,116,212,89,159,248,120,159,18,204,222,247,143,222, +64,214,19,120,248,118,22,55,10,19,184,56,10,19,68,57,10,14,247,99,139,159, +248,120,159,1,247,177,22,247,93,248,160,45,139,251,40,252,61,251,32,248,61, +45,139,247,76,252,160,5,14,248,65,139,159,248,120,159,1,248,190,22,247,46, +248,160,45,139,35,252,44,36,248,44,37,139,39,252,44,32,248,44,47,139,247, +44,252,160,233,139,240,248,47,245,252,47,5,14,247,99,139,159,248,120,159, +1,247,184,247,163,21,247,68,247,145,45,139,251,18,251,82,251,18,247,82,44, +139,247,67,251,149,251,77,251,159,234,139,247,25,247,93,247,23,251,93,236, +139,5,14,247,99,251,110,221,249,20,159,1,248,24,248,160,21,58,10,14,247,99, +139,212,248,14,212,1,248,79,248,160,21,59,10,14,180,251,104,204,249,191,204, +1,247,13,216,3,247,168,249,109,21,93,6,70,99,91,56,31,251,59,7,139,46,120, +106,80,127,8,70,7,198,127,158,105,139,47,8,251,59,7,56,179,91,208,30,185, +204,124,6,90,125,154,191,31,247,73,7,139,222,113,188,83,165,200,163,160,180, +139,231,8,247,73,7,191,153,154,188,30,154,6,14,106,249,89,159,1,239,199,3, +239,249,109,21,254,65,199,250,65,7,14,180,251,104,204,249,191,204,1,247,1, +216,3,168,251,104,21,186,6,209,179,187,222,31,247,59,7,139,231,158,173,196, +151,8,208,7,82,151,120,173,139,231,8,247,59,7,222,99,187,69,30,92,74,155, +6,189,153,124,87,31,251,73,7,139,57,165,89,195,113,83,114,113,90,139,56,8, +251,73,7,87,125,124,89,30,123,6,14,247,183,247,160,207,174,206,1,248,91,248, +47,21,140,86,124,117,102,139,125,139,123,144,119,151,8,251,9,208,5,122,149, +120,145,121,139,74,139,101,88,134,45,8,192,6,141,162,141,149,143,149,149, +161,156,152,157,139,149,139,162,131,149,133,8,237,76,5,165,123,169,129,164, +139,8,203,180,189,216,31,155,7,14,179,248,56,243,18,247,13,223,56,222,19, +160,247,14,251,97,21,222,247,230,6,117,247,115,100,139,117,251,115,5,19,192, +138,247,179,21,223,243,55,6,14,191,226,247,23,181,3,247,204,248,98,21,200, +134,179,97,146,72,8,223,6,133,247,6,70,208,251,9,147,8,228,97,49,7,251,27, +125,56,251,0,139,251,55,139,251,51,222,35,247,27,127,8,41,181,236,7,247,8, +145,214,216,146,247,12,8,55,6,127,60,101,98,75,132,8,97,141,21,56,152,91, +211,139,247,5,139,247,13,184,210,225,155,8,14,116,231,93,216,247,113,194, +247,167,217,18,193,232,152,224,19,124,248,2,248,12,21,251,52,6,133,151,132, +152,136,142,102,204,133,156,139,176,139,216,195,190,224,139,226,139,185,88, +142,36,8,227,6,138,200,131,178,120,172,103,201,68,176,54,139,251,26,139,35, +46,139,251,13,139,95,146,120,185,63,8,58,84,247,2,6,154,114,148,111,139,114, +139,78,106,88,47,60,8,187,73,5,177,164,175,151,174,139,160,139,163,135,160, +132,8,19,140,222,110,165,133,176,139,191,139,178,156,179,178,8,97,205,5,110, +119,111,129,113,139,121,139,119,143,98,151,8,19,108,101,151,121,142,113,139, +96,139,99,126,100,113,229,230,167,185,139,191,139,158,134,162,129,168,8,247, +28,6,14,251,18,119,159,1,247,170,249,89,21,60,10,14,139,249,89,252,170,190, +216,190,18,247,129,227,19,48,248,131,247,246,21,251,43,139,5,19,144,247,93, +247,247,54,139,251,71,251,214,251,77,247,214,54,139,5,19,112,247,97,251,247, +251,43,139,139,88,247,64,139,139,62,251,64,139,139,88,247,64,139,5,19,144, +251,67,227,7,19,112,247,67,247,62,190,251,62,216,247,62,7,14,251,104,217, +248,162,209,247,88,219,1,248,103,248,98,21,251,5,139,151,209,5,154,221,171, +183,186,139,154,139,151,135,164,125,8,169,218,5,109,152,116,145,113,139,99, +139,96,121,107,109,109,110,119,100,128,83,8,117,35,251,17,139,139,69,247, +5,139,61,252,49,5,124,62,109,103,88,139,119,139,125,144,122,150,8,122,55, +5,152,132,157,136,163,139,189,139,190,161,173,174,171,172,159,186,152,209, +8,214,248,33,247,18,139,5,14,251,105,216,249,20,159,247,20,216,18,182,218, +121,229,247,58,229,69,223,102,218,19,234,248,100,248,160,21,139,147,139,159, +5,245,68,210,35,35,58,66,47,30,139,101,152,111,170,103,8,19,244,65,100,108, +94,139,73,139,74,166,92,204,94,8,247,62,251,9,5,178,112,155,113,139,104,139, +88,100,104,82,139,103,139,110,154,120,168,125,158,135,159,139,178,8,54,6, +139,92,141,127,148,112,163,69,206,96,223,139,246,139,219,211,139,235,139, +182,126,169,99,184,8,19,233,211,166,176,192,139,215,139,211,111,182,58,191, +8,251,38,233,5,97,167,124,159,139,168,8,188,177,175,190,30,19,242,198,177, +99,77,31,139,122,139,130,5,251,84,251,187,21,86,178,126,159,139,179,139,179, +158,166,191,173,8,247,53,251,1,5,19,225,188,105,163,102,139,98,139,99,113, +102,92,114,8,14,247,51,216,247,101,216,1,228,218,247,105,218,3,248,121,247, +82,21,85,193,5,158,170,149,171,139,173,139,171,129,175,123,164,8,194,194, +82,197,80,86,5,113,157,104,149,102,139,103,139,107,130,110,122,8,84,194,83, +86,193,84,5,119,111,127,101,139,103,139,103,151,100,159,112,8,91,90,195,82, +190,190,5,165,123,174,130,172,139,178,139,173,149,166,159,8,192,86,5,251, +45,247,201,21,199,186,92,80,83,90,92,82,80,91,186,196,197,187,186,197,31, +14,37,187,233,3,187,249,89,21,139,251,3,166,251,26,179,139,166,247,26,139, +247,3,5,14,179,248,113,243,1,187,232,204,232,3,247,33,248,113,21,45,10,247, +143,22,45,10,14,237,247,119,21,61,10,247,97,50,21,61,10,14,179,230,247,119, +21,61,10,14,179,247,131,247,209,21,62,10,14,247,99,139,159,248,72,207,239, +244,69,212,18,221,222,247,80,222,19,220,247,144,248,160,21,50,10,247,76,207, +21,56,252,160,222,6,19,44,249,109,4,56,34,222,6,14,247,99,139,159,248,72, +207,247,27,212,116,159,18,226,222,247,69,222,19,236,247,149,248,160,21,50, +10,19,156,247,65,247,165,21,56,253,109,222,6,14,247,132,211,1,248,197,247, +204,21,252,202,67,248,202,6,14,248,56,221,1,247,123,227,3,248,149,248,138, +21,251,86,247,99,51,251,99,251,85,57,247,85,252,233,227,248,233,247,86,6, +14,170,221,247,199,221,1,247,123,227,3,248,149,248,138,21,251,86,247,99,51, +251,99,251,85,57,247,85,251,199,251,85,57,247,85,251,100,227,247,100,247, +86,6,221,251,86,247,199,247,86,7,14,124,247,194,247,17,1,226,247,16,3,247, +103,248,63,21,251,16,251,17,247,16,6,14,247,136,249,45,203,1,247,147,203, +221,203,3,248,158,249,109,21,251,142,6,251,18,41,34,251,27,31,139,65,169, +70,191,96,174,110,174,127,194,136,8,252,72,203,249,222,221,253,222,203,249, +222,196,7,14,196,247,67,248,106,21,70,83,83,70,70,195,83,208,207,196,195, +206,210,84,195,69,31,14,68,139,243,1,204,232,3,204,243,21,35,187,7,141,81, +124,112,103,134,8,101,7,200,144,172,185,139,219,8,240,7,14,179,139,243,1, +186,232,206,232,3,186,243,21,33,10,206,22,33,10,14,179,248,241,243,1,188, +232,206,232,3,188,249,89,21,33,10,206,22,33,10,14,247,144,247,209,21,62,10, +247,91,228,21,62,10,14,249,87,139,243,1,247,7,243,247,121,243,247,121,243, +3,247,111,243,21,35,35,243,6,247,225,243,21,35,35,243,6,247,225,243,21,35, +35,243,6,14,249,87,117,199,247,73,199,247,40,199,247,73,199,129,159,18,148, +198,247,73,198,165,198,247,73,198,200,198,247,73,198,19,55,224,247,50,249, +108,21,57,72,71,57,56,206,71,222,220,207,207,220,31,224,73,206,55,30,79,4, +190,179,99,88,90,98,98,90,89,98,180,189,188,180,180,188,31,19,207,224,247, +226,209,21,252,31,253,138,205,139,248,31,249,138,5,64,252,95,21,63,10,79, +4,64,10,247,252,199,21,63,10,79,4,64,10,14,247,210,251,109,217,248,195,243, +1,234,229,229,229,3,247,167,247,217,21,92,7,139,94,129,123,69,76,64,71,114, +95,139,72,8,251,9,222,64,247,23,247,36,214,219,247,46,30,54,6,139,93,134, +111,127,115,120,102,99,118,86,139,62,139,87,185,139,207,139,185,161,178,192, +186,198,192,139,139,157,162,160,167,146,162,139,175,8,194,7,49,234,21,229, +243,49,6,14,179,249,100,159,1,247,27,249,120,21,65,10,14,179,249,100,159, +1,247,80,249,120,21,66,10,14,179,249,101,159,1,247,8,249,121,21,67,10,14, +179,248,249,207,109,205,18,19,128,247,153,249,97,21,131,114,127,128,122,139, +127,139,113,146,114,149,8,19,64,98,156,131,141,118,139,94,139,109,103,128, +72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,128,68,10, +14,179,249,11,209,1,247,194,249,81,21,251,166,69,247,166,6,14,179,248,233, +208,185,159,1,154,249,112,21,140,100,145,120,153,119,166,102,184,119,195, +139,232,139,191,185,146,228,8,80,6,135,97,106,115,85,139,82,139,109,161,134, +183,8,14,179,248,248,243,1,247,7,243,3,247,111,249,96,21,35,35,243,6,14,179, +248,248,242,1,169,243,197,243,3,247,26,249,95,21,35,36,243,6,247,54,242,21, +35,36,243,6,14,179,248,215,183,226,183,1,218,183,227,183,3,247,59,249,134, +21,69,10,95,4,70,10,14,179,251,106,180,221,230,1,247,104,214,3,247,57,22, +97,47,151,132,5,151,145,146,141,151,139,8,168,156,125,116,113,116,120,108, +31,113,139,122,145,93,162,8,130,143,118,99,5,201,112,163,132,178,139,8,215, +186,175,196,182,110,163,89,31,131,139,132,139,126,137,8,162,195,5,14,179, +249,100,159,1,200,249,120,21,71,10,200,22,71,10,14,179,251,97,184,247,52, +159,1,196,212,3,247,46,22,78,117,103,98,139,91,139,100,160,113,181,123,161, +131,164,134,161,139,158,139,172,144,163,144,8,184,7,121,132,118,136,115,139, +92,139,114,158,139,174,139,181,160,162,212,180,8,14,179,249,101,159,1,247, +102,248,227,21,72,10,14,249,87,247,132,211,1,250,125,247,204,21,254,134,67, +250,134,6,14,249,87,139,221,247,24,221,175,221,247,125,221,1,248,104,232, +3,248,104,247,106,21,251,106,248,118,221,252,25,247,142,247,244,221,251,244, +247,125,248,7,221,253,2,7,251,191,253,109,242,139,224,247,106,5,247,161,221, +21,251,130,139,247,30,247,243,239,139,5,14,216,247,195,190,184,186,92,191, +247,131,191,18,176,197,247,40,196,19,220,247,212,247,246,21,251,169,88,247, +169,6,152,247,38,21,135,137,136,138,136,139,8,124,131,147,154,31,247,71,7, +202,98,170,58,30,57,139,94,102,137,68,8,198,6,146,182,155,152,184,139,8,182, +163,123,111,31,126,7,139,117,128,131,101,136,97,136,98,131,122,132,102,123, +119,110,139,97,8,19,44,80,179,102,203,30,178,139,172,153,172,168,8,19,76, +145,108,155,127,172,139,151,139,146,140,152,144,8,19,44,49,247,4,21,104,97, +108,90,103,118,156,169,30,139,171,159,154,191,146,188,147,152,141,153,145, +8,14,139,221,249,7,159,1,219,232,3,247,65,248,42,21,247,215,46,252,9,7,59, +83,139,62,219,196,139,251,172,248,108,139,139,221,252,15,139,139,247,139, +247,63,247,14,139,215,5,14,248,121,116,221,248,236,221,1,174,232,248,154, +232,3,169,158,21,178,103,216,223,5,205,78,217,110,236,139,247,102,139,247, +34,247,46,139,247,119,139,241,109,233,85,207,8,228,236,99,175,52,44,5,77, +193,62,166,48,139,251,102,139,251,34,251,46,139,251,119,139,42,165,54,189, +69,8,202,207,21,109,191,123,202,139,208,139,247,71,243,247,12,247,47,139, +204,139,197,117,187,97,8,174,98,21,174,85,157,72,139,64,139,251,71,35,251, +12,251,47,139,68,139,78,164,90,188,8,14,249,87,119,221,77,221,247,137,221, +247,130,221,69,221,18,182,232,248,25,232,19,54,248,254,247,219,21,247,220, +221,251,220,247,130,247,228,221,252,65,63,6,19,142,97,199,80,167,57,139,66, +139,65,110,90,90,71,72,104,35,139,251,28,139,251,16,167,47,198,71,191,79, +213,107,224,139,220,139,196,168,185,204,8,19,102,65,248,70,221,251,233,7, +19,142,46,239,21,99,58,79,100,55,139,73,139,86,166,104,190,103,193,124,204, +139,240,139,241,154,204,175,193,174,190,192,166,206,139,223,139,198,100,179, +58,8,14,211,247,195,190,184,191,247,131,191,1,179,197,247,60,197,3,247,206, +247,246,21,251,155,88,247,155,6,251,24,248,75,21,49,87,76,251,0,251,1,191, +76,229,228,192,202,245,247,4,88,201,48,31,87,4,192,170,94,63,66,107,94,87, +87,107,184,214,213,171,184,191,31,14,248,232,116,212,66,216,247,72,207,247, +52,216,18,173,226,19,120,249,131,247,51,21,115,70,92,103,72,139,86,139,94, +163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133,187,124,178,105, +224,59,192,42,139,67,139,74,108,103,88,108,193,80,167,54,139,65,139,76,117, +104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,216,139,8,216,180, +112,88,31,117,7,139,100,120,125,71,133,55,132,88,129,107,125,77,113,108,93, +139,71,8,19,136,45,205,78,241,30,217,139,202,171,214,217,146,127,143,132, +144,131,8,19,72,174,87,205,108,216,139,247,10,139,223,207,160,247,6,8,19, +184,252,90,137,21,139,120,120,112,109,116,106,114,101,126,99,139,77,139,101, +171,139,191,139,194,175,166,229,152,228,152,156,143,167,151,8,219,183,21, +73,10,14,124,139,159,248,120,159,1,233,223,3,247,70,248,160,21,55,252,160, +223,6,14,68,139,159,249,69,159,1,202,222,3,247,38,248,57,21,247,200,56,251, +244,7,76,89,139,75,202,189,139,251,205,222,139,139,247,249,205,190,139,203, +5,14,247,210,116,216,248,44,216,1,175,226,247,192,226,3,248,165,248,147,21, +107,167,81,74,5,94,184,87,159,70,139,251,40,139,50,34,139,251,68,139,61,154, +80,172,90,8,73,65,171,111,200,208,5,179,98,195,118,206,139,247,40,139,227, +244,139,247,68,139,215,125,195,109,189,8,78,70,21,151,108,145,101,139,95, +139,251,18,82,61,46,139,97,139,104,155,110,171,8,116,178,21,125,172,132,176, +139,186,139,247,18,196,217,232,139,183,139,179,120,165,106,8,14,249,31,116, +216,247,72,207,247,52,216,1,179,226,3,249,184,247,51,21,116,70,92,103,72, +139,86,139,94,163,111,183,119,169,132,169,138,191,8,248,22,6,139,219,133, +187,124,178,105,225,59,191,41,139,58,139,68,100,98,72,99,209,72,175,50,139, +8,251,43,53,38,251,71,251,72,225,37,247,43,31,227,139,203,173,181,208,179, +73,208,102,224,139,247,11,139,222,207,160,247,6,8,252,247,247,195,21,233, +195,62,251,21,251,17,81,62,47,46,82,216,247,20,247,18,196,216,232,31,247, +130,251,52,21,73,10,14,247,210,119,159,139,159,249,11,217,18,247,18,222,247, +131,226,83,226,19,228,247,194,247,241,21,197,139,141,138,165,134,196,126, +173,90,139,71,8,50,80,77,53,30,111,139,131,139,139,61,5,156,136,149,138,156, +139,247,29,139,226,231,139,247,39,139,232,96,195,42,172,8,19,248,213,166, +174,185,139,210,139,247,2,59,213,251,10,139,78,139,82,119,98,104,103,107, +123,98,139,76,8,252,174,222,248,174,7,208,187,183,212,208,188,94,75,74,82, +93,59,30,130,6,14,248,10,139,159,247,91,217,248,48,159,221,242,1,247,94,243, +197,243,3,248,110,247,111,21,37,10,247,147,217,21,38,10,109,247,177,21,35, +36,243,6,247,54,242,21,35,36,243,6,14,248,10,139,159,247,91,217,248,48,159, +1,248,110,247,111,21,37,10,247,147,217,21,38,10,173,247,202,21,66,10,14,248, +10,139,159,247,91,217,248,48,159,1,248,110,247,111,21,37,10,247,147,217,21, +38,10,106,247,202,21,74,10,14,248,10,139,159,247,91,217,248,48,159,1,248, +110,247,111,21,37,10,247,147,217,21,38,10,91,247,203,21,75,10,14,248,10,139, +159,247,91,217,248,48,159,222,206,110,205,18,19,240,248,110,247,111,21,37, +10,247,147,217,21,38,10,237,247,179,21,131,114,128,127,121,139,127,139,112, +146,115,150,8,19,8,97,156,132,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,151,153,154,139,150,139,153,135,163,130,8,19,16,68,10,14,248,10,139,159, +247,91,217,248,48,159,188,183,226,183,1,247,139,183,227,183,3,248,110,247, +111,21,37,10,247,147,217,21,38,10,138,247,216,21,69,10,95,4,70,10,14,248, +65,251,106,180,221,247,41,248,237,221,1,187,232,247,149,214,3,248,15,116, +21,247,68,139,239,237,161,247,83,8,43,6,131,89,129,105,124,109,109,79,77, +105,61,139,8,251,37,47,247,8,247,75,247,79,227,247,7,247,34,31,197,139,194, +121,169,111,166,114,154,108,150,85,8,234,6,110,247,52,47,217,251,52,139,41, +139,60,108,85,79,73,67,103,34,139,251,9,139,251,34,192,251,12,230,74,182, +109,169,128,215,128,8,108,70,150,132,5,151,145,146,141,151,139,8,168,156, +125,116,113,116,120,108,31,114,139,120,145,94,162,8,130,143,118,99,5,200, +112,165,132,177,139,8,215,186,175,196,182,110,163,89,31,131,139,132,139,126, +137,8,14,248,65,139,221,247,149,206,247,133,221,1,228,232,248,28,232,3,228, +247,231,21,251,231,247,174,7,247,76,247,4,247,30,247,119,247,118,251,4,247, +30,251,76,31,251,174,251,215,70,72,6,247,54,22,247,63,206,251,63,247,133, +247,65,6,247,35,215,42,251,77,251,78,63,42,251,35,31,251,65,6,14,248,10,139, +221,247,142,221,247,125,221,221,242,1,229,232,167,243,197,243,3,247,75,247, +224,21,39,10,247,24,249,212,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248, +10,139,221,247,142,221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247, +76,249,237,21,76,10,14,248,10,139,221,247,142,221,247,125,221,1,229,232,3, +247,75,247,224,21,39,10,247,29,249,237,21,65,10,14,248,10,139,221,247,142, +221,247,125,221,1,229,232,3,247,75,247,224,21,39,10,247,6,249,238,21,43,251, +42,204,139,218,235,219,43,202,139,43,247,42,5,14,124,139,159,249,69,159,214, +242,18,148,243,126,232,117,243,19,232,247,85,249,109,21,46,253,109,232,6, +19,244,59,250,31,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159, +249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232,6,113,250,63,21,66, +10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109,21,46,253,109,232, +6,60,250,63,21,65,10,14,124,139,159,249,69,159,1,239,232,3,247,85,249,109, +21,46,253,109,232,6,41,250,64,21,67,10,14,248,65,139,159,249,69,159,222,206, +110,205,18,215,227,248,30,227,19,236,249,26,249,109,21,51,252,232,6,252,17, +248,232,38,139,139,253,109,227,139,139,248,227,248,12,252,227,245,139,5,251, +71,250,40,21,131,114,127,127,122,139,126,139,113,146,115,150,8,19,28,97,156, +131,141,119,139,95,139,108,102,128,73,8,196,6,146,162,151,153,153,139,150, +139,154,135,162,130,8,19,44,194,118,151,135,157,139,189,139,169,174,149,208, +8,14,248,121,116,221,248,236,221,209,242,1,177,232,247,18,243,197,243,247, +18,232,3,248,25,249,121,21,40,10,57,4,41,10,111,247,147,21,35,36,243,6,247, +54,242,21,35,36,243,6,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,169,247,172,21,76,10,14,248,121,116, +221,248,236,221,1,177,232,248,154,232,3,248,25,249,121,21,40,10,57,4,41,10, +108,247,172,21,74,10,14,248,121,116,221,248,236,221,1,177,232,248,154,232, +3,248,25,249,121,21,40,10,57,4,41,10,93,247,173,21,75,10,14,248,121,116,221, +248,236,221,210,206,110,205,18,177,232,248,154,232,19,236,248,25,249,121, +21,40,10,57,4,41,10,243,247,149,21,131,114,127,127,121,139,127,139,112,146, +115,150,8,19,28,98,156,131,141,118,139,95,139,108,102,128,73,8,197,6,145, +162,152,153,153,139,150,139,153,135,163,130,8,19,44,193,118,152,135,157,139, +188,139,170,174,148,208,8,14,248,10,116,221,248,240,217,1,209,232,248,1,232, +3,248,232,248,151,21,42,10,251,20,247,167,21,77,10,14,248,65,116,221,249, +30,159,221,242,1,224,232,193,243,197,243,193,232,3,248,188,249,109,21,78, +10,251,201,247,77,21,35,36,243,6,247,54,242,21,35,36,243,6,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,252,148,7,41,68, +79,251,8,251,8,68,199,237,30,248,148,46,252,148,7,251,38,247,2,45,247,62, +247,63,247,1,233,247,38,30,248,148,7,251,150,247,102,21,66,10,14,248,65,116, +221,249,30,159,1,224,232,248,10,232,3,248,188,249,109,21,78,10,251,204,247, +102,21,74,10,14,248,65,116,221,249,30,159,1,224,232,248,10,232,3,248,188, +249,109,21,78,10,251,219,247,103,21,75,10,14,248,10,139,159,249,69,159,1, +247,186,232,3,248,23,247,178,21,247,166,248,79,251,3,139,251,100,251,247, +251,105,247,247,251,7,139,247,172,252,79,139,251,178,232,139,5,118,250,63, +21,66,10,14,247,210,139,221,248,201,221,1,248,217,249,109,21,44,10,251,107, +247,37,21,77,10,14,248,10,139,159,247,61,221,247,148,221,239,159,1,231,232, +247,224,239,3,247,77,247,81,21,247,121,6,247,11,223,225,247,14,247,24,54, +219,251,31,31,251,100,247,12,46,253,109,232,6,247,163,4,247,148,247,86,7, +226,190,91,59,59,88,91,52,31,14,248,10,139,159,249,69,159,221,242,18,247, +100,243,121,232,122,243,19,232,248,23,247,178,21,43,10,19,244,64,250,38,21, +35,36,243,6,247,54,242,21,35,36,243,6,14,116,212,248,48,216,212,242,18,181, +226,150,243,197,243,122,222,19,226,248,171,188,21,130,137,135,139,134,139, +8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139,76,117,104,100, +115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214,181,111,89,31, +117,7,19,244,139,104,118,124,73,131,251,10,124,121,135,107,126,78,114,108, +92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165,115,193, +139,8,156,139,152,141,166,146,8,19,250,251,38,247,71,21,47,10,251,37,248, +92,21,35,36,243,6,19,228,247,54,242,21,35,36,243,6,14,116,212,248,48,216, +247,73,159,1,181,226,247,152,222,3,248,171,188,21,46,10,251,38,247,71,21, +47,10,54,248,117,21,76,10,14,116,212,248,48,216,247,73,159,1,181,226,247, +152,222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,31,248,117,21,65, +10,14,116,212,248,48,216,247,74,159,1,181,226,247,152,222,3,248,171,188,21, +46,10,251,38,247,71,21,47,10,251,53,248,118,21,75,10,14,116,212,248,48,216, +213,207,109,205,18,181,226,247,152,222,19,236,248,171,188,21,46,10,251,38, +247,71,21,47,10,125,248,94,21,79,10,19,28,99,156,130,141,118,139,95,139,108, +103,128,72,8,197,6,145,162,151,153,154,139,150,139,153,135,163,130,8,19,44, +80,10,14,116,212,248,48,216,179,183,226,183,1,181,226,197,183,227,183,165, +222,3,248,171,188,21,46,10,251,38,247,71,21,47,10,251,6,248,131,21,69,10, +95,4,70,10,14,247,99,251,106,180,221,247,36,248,45,216,1,170,226,247,57,214, +3,247,156,116,21,247,15,139,222,217,146,247,17,8,55,6,125,55,96,96,68,139, +8,47,84,214,247,16,247,24,193,217,230,31,209,139,183,98,149,66,8,223,6,135, +190,128,172,119,168,103,188,76,168,66,139,251,33,139,47,251,4,139,251,66, +139,34,175,53,204,93,166,119,162,130,182,131,8,108,68,151,132,5,151,145,146, +141,151,139,8,168,156,125,116,113,116,120,108,31,114,139,119,145,95,162,8, +130,143,118,98,5,203,112,161,133,178,139,8,215,186,175,196,181,110,164,89, +31,131,139,133,139,125,137,8,14,116,216,247,72,207,247,52,216,212,242,1,247, +45,243,197,243,3,248,149,247,126,21,48,10,141,207,21,49,10,251,58,248,49, +21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,216,247,72,207,247,52,216, +247,73,159,1,248,149,247,126,21,48,10,141,207,21,49,10,251,7,248,74,21,66, +10,14,116,216,247,72,207,247,52,216,247,73,159,1,248,149,247,126,21,48,10, +141,207,21,49,10,251,64,248,74,21,251,4,139,247,41,251,40,199,139,5,14,116, +216,247,72,207,247,52,216,247,74,159,1,248,149,247,126,21,48,10,141,207,21, +49,10,251,76,248,75,21,67,10,14,124,139,249,89,251,97,159,221,242,18,142, +243,126,222,127,243,19,72,247,69,248,160,21,56,6,19,136,252,160,222,7,19, +116,69,249,89,21,35,36,243,6,247,54,242,21,35,36,243,6,14,124,139,159,248, +120,159,247,88,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,123,249, +120,21,66,10,14,124,139,159,248,120,159,247,88,159,1,233,222,3,247,69,248, +160,21,56,252,160,222,6,70,249,120,21,65,10,14,124,139,159,248,120,159,247, +89,159,1,233,222,3,247,69,248,160,21,56,252,160,222,6,51,249,121,21,67,10, +14,139,159,248,82,212,104,159,228,207,109,205,18,209,216,62,223,247,142,222, +19,163,209,248,160,21,252,160,223,247,181,7,19,195,51,10,19,52,61,139,89, +109,93,66,8,227,7,247,123,247,85,21,79,10,19,12,99,156,131,141,117,139,95, +139,109,103,128,72,8,196,6,146,162,151,153,153,139,150,139,153,135,163,130, +8,19,20,193,118,152,135,157,139,189,139,168,174,150,208,8,14,116,216,248, +44,216,212,242,1,175,226,156,243,197,243,156,226,3,247,164,248,175,21,52, +10,140,62,21,53,10,110,247,145,21,35,36,243,6,247,54,242,21,35,36,243,6,14, +116,216,248,44,216,247,73,159,1,175,226,247,192,226,3,247,164,248,175,21, +52,10,140,62,21,53,10,164,247,170,21,66,10,14,116,216,248,44,216,247,73,159, +1,175,226,247,192,226,3,247,164,248,175,21,52,10,140,62,21,53,10,111,247, +170,21,65,10,14,116,216,248,44,216,247,74,159,1,175,226,247,192,226,3,247, +164,248,175,21,52,10,140,62,21,53,10,92,247,171,21,75,10,14,116,216,248,44, +216,213,207,109,205,18,175,226,247,192,226,19,236,247,164,248,175,21,251, +39,50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,31,247,73,52,243, +251,43,30,140,62,21,53,10,242,247,147,21,79,10,19,28,99,156,131,141,117,139, +95,139,108,103,128,72,8,197,6,145,162,152,153,153,139,150,139,153,135,163, +130,8,19,44,80,10,14,247,99,116,216,248,44,216,247,74,159,1,186,226,247,130, +226,3,248,74,248,14,21,54,10,83,247,105,21,72,10,14,116,212,89,159,248,120, +159,227,242,18,204,222,132,243,197,243,131,222,64,214,19,105,0,248,118,22, +55,10,19,169,0,56,10,19,80,128,57,10,19,85,0,251,54,249,95,21,35,36,243,6, +19,82,0,247,54,242,21,35,36,243,6,14,116,212,89,159,248,120,159,247,88,159, +18,204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82, +57,10,251,3,249,120,21,66,10,14,116,212,89,159,248,120,159,247,88,159,18, +204,222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57, +10,251,56,249,120,21,65,10,14,116,212,89,159,248,120,159,247,89,159,18,204, +222,247,143,222,64,214,19,108,248,118,22,55,10,19,172,56,10,19,82,57,10,251, +72,249,121,21,67,10,14,247,99,251,110,221,249,20,159,247,88,159,1,248,24, +248,160,21,58,10,251,99,247,108,21,66,10,14,247,99,139,212,248,14,212,247, +89,159,1,248,79,248,160,21,59,10,251,37,247,33,21,77,10,14,116,216,248,44, +214,247,78,159,1,175,226,247,192,226,3,247,111,248,249,21,191,95,150,129, +174,104,109,149,125,142,120,139,99,139,99,127,105,116,70,95,104,56,139,251, +9,8,251,71,225,37,247,43,247,43,225,241,247,72,30,139,231,118,207,88,217, +101,196,102,177,67,194,8,229,180,99,176,42,94,5,72,182,126,146,108,152,8, +95,95,5,182,115,152,131,165,119,8,54,99,175,100,5,247,43,33,21,233,195,62, +251,22,251,15,81,61,47,46,82,217,247,18,247,18,196,217,232,31,14,251,110, +159,247,67,217,248,42,217,1,194,222,247,190,226,3,194,251,110,21,222,247, +165,6,183,85,188,115,207,139,8,247,27,228,247,1,247,59,247,66,51,247,4,251, +28,31,72,139,81,110,103,88,8,247,147,56,7,247,121,251,145,21,231,199,58,251, +17,251,11,78,58,48,51,81,219,247,15,247,15,197,219,227,31,14,247,99,251,110, +221,249,20,159,227,242,1,247,5,243,197,243,3,248,24,248,160,21,58,10,251, +153,247,83,21,35,36,243,6,247,54,242,21,35,36,243,6,14,116,217,247,91,198, +205,198,247,87,215,1,218,227,3,218,247,205,21,84,139,117,80,222,139,5,151, +71,159,82,169,90,178,75,214,100,223,139,199,139,194,155,190,170,8,232,7,58, +91,103,125,90,139,52,139,82,206,114,247,24,8,247,106,139,163,198,251,138, +139,5,138,154,139,147,139,146,139,150,139,148,141,155,8,247,162,139,162,198, +251,176,139,5,167,247,25,191,201,225,139,192,139,180,122,212,85,8,171,219, +5,73,186,82,159,70,139,53,139,74,106,92,71,105,89,117,83,129,75,8,76,139, +117,80,218,139,5,137,120,139,129,139,127,8,14,179,247,46,201,3,247,46,248, +216,21,81,10,14,179,247,176,197,247,206,192,1,247,147,202,3,247,207,247,234, +21,251,121,6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192, +139,213,79,191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152, +153,163,167,154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8, +81,108,5,43,88,113,100,134,42,8,247,196,6,14,179,247,162,192,247,225,192, +18,247,130,202,90,202,19,208,247,20,248,112,21,82,10,19,224,83,10,14,124, +247,194,247,17,1,226,247,16,3,247,103,248,63,21,251,16,251,17,247,16,6,14, +179,247,132,211,1,247,176,247,204,21,251,130,67,247,130,6,14,246,248,19,196, +247,81,196,1,187,196,247,81,196,3,247,92,249,66,21,55,71,71,56,56,207,70, +221,224,207,206,224,222,71,207,56,31,82,4,191,181,97,87,86,97,97,85,89,96, +182,191,190,182,182,191,31,14,247,183,247,89,209,1,248,180,247,159,21,252, +140,69,248,140,6,14,247,183,248,74,248,63,21,251,39,251,38,251,38,247,37, +90,90,247,38,251,38,251,39,251,39,189,90,247,38,247,38,247,39,251,39,189, +189,251,39,247,39,247,38,247,38,5,14,247,183,139,243,236,209,236,243,1,247, +132,243,3,248,170,247,163,21,36,10,251,82,42,21,35,35,243,6,248,108,4,35, +35,243,6,14,249,87,249,54,194,1,247,109,207,247,97,206,247,206,206,3,247, +177,249,54,21,247,45,194,252,11,84,247,46,252,18,207,6,248,99,22,247,15,247, +233,139,251,233,206,139,139,248,73,48,139,251,23,251,254,251,24,247,254,45, +139,139,252,73,206,139,139,247,233,247,13,251,233,5,14,247,183,128,209,247, +179,209,1,247,149,209,3,248,170,248,52,21,34,10,251,179,4,36,10,14,248,177, +119,159,139,197,81,249,89,251,229,192,18,247,27,201,248,195,202,19,172,247, +27,248,216,21,81,10,248,194,247,21,21,60,10,19,92,247,56,253,31,21,251,121, +6,151,177,157,158,182,162,8,202,171,5,202,170,172,184,139,192,139,213,79, +191,53,139,40,139,90,90,136,36,8,201,6,141,170,142,155,147,152,153,163,167, +154,171,139,187,139,176,107,139,96,139,108,119,112,100,118,8,81,108,5,19, +44,43,88,113,100,134,42,8,247,196,6,14,248,177,119,159,139,249,89,252,245, +192,18,247,26,201,248,134,201,19,216,247,26,248,216,21,81,10,248,218,247, +21,21,60,10,19,56,158,252,245,21,19,88,39,201,7,19,56,84,10,247,80,192,21, +251,21,139,247,21,247,62,5,14,248,177,119,159,139,249,89,252,245,192,247, +9,192,247,225,192,18,247,121,202,90,202,248,34,201,19,26,247,11,248,112,21, +82,10,19,29,83,10,19,197,248,154,247,74,21,60,10,19,37,148,252,245,21,19, +69,39,201,7,19,37,84,10,247,80,192,21,251,21,139,247,21,247,62,5,14,248,80, +117,201,225,201,247,234,201,227,201,1,126,207,247,18,208,248,69,207,3,248, +180,248,73,21,115,245,86,188,50,139,8,251,10,60,44,251,32,251,28,218,44,247, +7,31,196,139,185,162,172,186,158,167,149,167,151,199,8,68,6,126,58,102,96, +83,139,107,139,103,157,118,167,116,168,126,183,139,190,139,244,188,206,215, +139,192,139,167,112,156,73,8,35,247,197,21,85,10,77,4,86,10,14,248,80,117, +201,247,177,202,247,26,202,234,201,1,126,207,247,39,209,247,96,212,247,26, +207,3,247,164,247,217,21,247,26,6,184,158,119,91,31,138,99,5,139,111,145, +111,148,118,8,218,164,6,121,152,135,151,138,197,138,210,132,156,102,163,180, +169,152,162,139,185,8,224,93,180,44,30,251,98,252,81,209,6,247,140,4,247, +26,247,21,7,192,161,119,92,93,116,118,87,31,107,247,246,21,85,10,77,4,86, +10,14,124,14,247,183,247,197,209,1,248,110,209,3,179,248,11,21,69,248,70, +251,111,209,247,181,7,14,106,249,89,159,1,239,199,3,239,249,109,21,252,37, +199,248,37,7,79,252,176,21,252,37,199,248,37,7,14,251,112,159,247,69,212, +248,90,159,1,204,222,247,142,222,3,248,180,188,21,129,137,135,139,135,139, +8,110,123,153,166,31,248,72,56,251,189,7,32,83,69,52,74,97,179,202,30,248, +7,56,253,124,222,247,115,7,164,121,168,131,175,139,207,139,195,167,178,194, +141,82,166,113,196,139,157,139,152,141,165,146,8,14,248,192,20,247,185,21, +116,162,248,160,154,247,82,151,84,162,6,30,10,3,150,37,255,12,9,139,12,10, +217,10,208,144,143,144,12,12,224,11,217,146,148,12,13,139,12,14,28,0,50,19, +0,55,2,0,1,0,17,0,39,0,60,0,82,0,89,0,112,0,121,0,142,0,184,0,214,1,75,1, +104,1,130,1,152,1,248,2,24,2,82,2,102,2,143,2,164,2,190,2,212,3,53,3,60,3, +81,3,91,3,148,3,174,3,186,3,204,3,224,3,242,4,4,4,15,4,26,4,42,4,56,4,74, +4,92,4,103,4,119,4,132,4,143,4,159,4,170,4,186,4,225,4,239,4,253,5,17,5,61, +5,105,5,121,5,155,5,189,139,251,3,166,251,26,178,139,166,247,26,139,247,3, +5,11,35,187,7,140,81,125,112,104,134,8,101,7,199,144,172,185,139,219,8,240, +7,11,251,99,247,99,69,251,99,251,99,69,247,99,251,99,209,247,99,247,99,6, +11,35,199,121,7,139,70,126,119,92,137,8,101,7,209,174,184,225,31,247,12,7, +11,252,120,69,248,120,6,11,214,251,111,243,139,251,148,249,109,251,12,139, +251,152,253,109,238,139,216,247,111,5,11,251,124,139,247,12,247,224,5,11, +248,33,221,252,33,247,125,248,48,221,252,141,253,109,248,159,221,252,66,6, +11,251,101,251,34,251,46,251,120,251,120,247,34,251,46,247,102,31,227,139, +218,166,198,189,218,206,186,247,5,139,247,11,8,247,127,251,31,247,45,251, +106,30,11,247,50,241,251,12,251,76,251,68,34,251,12,251,46,251,47,35,247, +12,247,72,247,72,243,247,12,247,46,31,11,138,247,35,41,222,251,60,139,251, +52,139,40,57,139,251,24,139,50,186,83,235,114,8,247,73,91,5,231,115,181,102, +139,82,139,100,118,99,108,117,110,119,93,128,80,139,60,139,85,158,104,181, +112,171,127,174,140,184,8,51,6,140,72,152,95,168,99,189,71,223,103,247,3, +139,226,139,210,159,186,175,188,178,170,204,139,202,139,229,83,205,40,166, +8,251,75,188,5,51,163,107,167,139,195,139,213,204,188,237,139,247,8,139,204, +86,140,44,8,11,247,166,248,79,251,3,139,251,100,251,247,251,106,247,247,251, +7,139,247,173,252,79,139,251,178,232,139,5,11,252,161,57,248,46,6,252,74, +252,201,139,57,248,191,139,139,221,252,74,139,248,72,248,199,5,11,243,91, +7,138,196,154,167,173,144,8,177,7,79,134,106,92,139,60,8,38,7,11,130,137, +135,139,134,139,8,110,123,154,165,31,247,200,7,232,71,189,251,21,30,63,139, +76,117,104,100,115,112,129,109,137,87,8,223,6,146,203,177,168,217,139,8,214, +181,111,89,31,117,7,139,104,118,124,73,131,251,10,124,121,135,107,126,78, +114,108,92,139,71,139,44,205,79,245,139,205,139,192,162,198,193,145,86,165, +115,193,139,8,156,139,152,141,166,146,8,11,139,111,131,122,114,116,105,108, +98,123,90,139,74,139,101,170,139,192,139,194,176,167,228,152,227,151,157, +143,167,152,8,11,139,219,133,187,124,178,105,225,59,191,41,139,8,251,38,45, +251,4,251,64,251,64,230,33,247,39,31,247,12,139,222,207,160,247,6,8,55,6, +116,70,92,103,72,139,86,139,94,163,111,183,119,169,132,169,138,191,8,11,146, +236,198,202,223,139,221,139,202,71,139,53,139,137,139,137,138,137,8,11,52, +221,6,174,159,157,177,30,146,139,142,139,158,138,8,208,7,120,143,128,140, +122,139,8,62,93,95,64,31,50,69,71,209,252,92,222,248,92,226,7,11,246,195, +209,225,205,181,99,76,30,251,255,222,248,32,7,226,74,195,38,30,11,251,39, +50,34,251,68,251,68,227,34,247,41,247,39,229,244,247,64,247,73,52,243,251, +43,31,11,233,195,62,251,22,251,15,81,61,47,46,82,216,247,19,247,18,196,217, +232,31,11,138,242,71,197,251,13,139,251,14,139,60,76,139,42,139,57,181,100, +247,16,109,8,217,120,5,197,125,162,118,139,101,139,90,90,106,66,139,94,139, +101,152,118,161,126,154,133,154,134,176,8,51,6,143,251,13,207,81,247,29,139, +247,24,139,223,204,139,240,139,217,95,182,35,164,8,59,158,5,71,155,110,161, +139,176,139,187,182,170,207,139,206,139,175,110,141,84,8,11,248,160,56,251, +189,7,11,32,83,69,52,73,97,179,202,30,248,7,56,252,40,7,52,204,83,241,30, +11,216,139,188,166,188,208,8,66,7,11,251,37,252,44,251,26,248,44,50,139,247, +69,252,162,107,56,5,126,102,120,125,104,139,127,139,125,141,121,143,8,64, +7,156,130,156,135,161,139,166,139,168,148,161,155,165,158,154,161,155,181, +8,247,125,249,14,5,11,252,27,66,247,184,6,251,205,252,12,139,64,248,62,139, +139,212,251,217,139,247,203,248,13,5,11,252,88,253,109,197,139,248,88,249, +109,5,11,247,44,251,13,139,222,33,222,245,222,139,222,251,44,251,14,5,11, +251,46,247,13,139,56,247,0,56,251,0,56,139,56,247,46,247,14,5,11,57,72,71, +57,56,206,71,222,220,207,207,220,224,73,206,55,31,11,190,179,99,88,90,98, +98,89,90,98,180,189,188,180,180,188,31,11,251,5,139,247,41,251,40,199,139, +5,11,43,251,40,199,139,247,41,247,40,5,11,43,251,42,203,139,218,235,220,43, +202,139,43,247,42,5,11,193,118,151,135,158,139,188,139,169,174,149,208,8, +11,91,99,99,92,91,179,99,187,187,179,178,187,188,100,178,90,31,11,164,158, +120,114,116,119,119,115,115,119,159,163,162,159,159,163,31,11,43,251,42,199, +139,247,41,247,42,5,11,235,247,42,75,139,60,43,58,235,76,139,235,251,42,5, +11,146,236,198,202,223,139,8,224,198,74,44,31,11,251,4,139,247,40,251,40, +200,139,5,11,43,251,42,203,139,218,235,219,43,203,139,42,247,42,5,11,42,251, +40,199,139,247,41,247,40,5,11,235,247,42,75,139,60,43,59,235,75,139,236,251, +42,5,11,252,148,7,41,68,79,251,8,251,8,68,199,237,30,248,148,46,252,148,7, +251,38,247,2,45,247,62,247,62,247,2,233,247,38,30,248,148,7,11,130,114,128, +128,121,139,127,139,113,146,114,149,8,11,193,118,152,135,157,139,188,139, +169,174,149,208,8,11,251,188,201,248,61,96,7,122,75,125,128,67,132,8,124, +138,139,93,5,11,174,139,155,139,154,137,174,133,162,111,139,103,139,88,105, +109,83,139,79,139,111,166,136,201,8,77,6,49,194,87,235,233,200,192,220,30, +139,190,116,172,91,155,8,11,176,156,159,168,139,178,139,213,86,185,53,139, +46,139,90,91,137,45,8,202,6,139,167,141,152,146,152,151,161,166,152,172,139, +8,186,168,113,97,92,115,125,53,31,11,239,206,192,72,247,164,93,7,251,96,251, +158,139,80,5,11,251,103,251,63,251,63,251,103,251,100,247,64,251,66,247,97, +247,108,247,63,247,61,247,106,247,102,251,63,247,63,251,103,31,11,247,65, +247,33,251,36,251,67,251,71,251,32,251,34,251,70,251,61,251,33,247,38,247, +66,247,68,247,33,247,36,247,65,31,11,0,}; +#endif diff --git a/contrib/media/updf_newlib/generated/font_cjk.h b/contrib/media/updf_newlib/generated/font_cjk.h new file mode 100755 index 000000000..08875be1f --- /dev/null +++ b/contrib/media/updf_newlib/generated/font_cjk.h @@ -0,0 +1,5631 @@ +#ifndef __STRICT_ANSI__ +#if defined(__linux__) || defined(__FreeBSD__) +#define HAVE_INCBIN +#endif +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_DroidSansFallback[139280]; +asm(".globl pdf_font_DroidSansFallback"); +asm(".balign 8"); +asm("pdf_font_DroidSansFallback:"); +asm(".incbin \"fonts/droid/DroidSansFallback.ttf\""); +#else +static const unsigned char pdf_font_DroidSansFallback[139280] = { +0,1,0,0,0,19,1,0,0,4,0,48,70,70,84,77,75,29,224,116,0,2,31,244,0,0,0,28,71, +68,69,70,2,201,0,4,0,2,14,208,0,0,0,32,71,80,79,83,236,144,228,222,0,2,15, +64,0,0,16,180,71,83,85,66,147,60,130,75,0,2,14,240,0,0,0,80,79,83,47,50,247, +26,134,136,0,0,1,184,0,0,0,96,99,109,97,112,29,150,101,90,0,0,12,136,0,0, +6,242,99,118,116,32,65,244,67,234,0,0,29,92,0,0,2,20,102,112,103,109,115, +211,35,176,0,0,19,124,0,0,7,5,103,97,115,112,0,24,0,9,0,2,14,192,0,0,0,16, +103,108,121,102,155,28,79,66,0,0,36,172,0,1,184,160,104,101,97,100,248,253, +254,54,0,0,1,60,0,0,0,54,104,104,101,97,14,75,8,159,0,0,1,116,0,0,0,36,104, +109,116,120,38,164,8,117,0,0,2,24,0,0,10,112,107,101,114,110,174,170,185, +111,0,1,221,76,0,0,21,90,108,111,99,97,120,114,13,144,0,0,31,112,0,0,5,58, +109,97,120,112,7,1,7,208,0,0,1,152,0,0,0,32,110,97,109,101,35,87,171,194, +0,1,242,168,0,0,7,251,112,111,115,116,26,213,54,16,0,1,250,164,0,0,20,25, +112,114,101,112,122,200,94,246,0,0,26,132,0,0,2,213,0,1,0,0,0,1,5,30,235, +107,75,224,95,15,60,245,0,31,8,0,0,0,0,0,201,129,215,160,0,0,0,0,201,129, +215,160,254,96,253,147,8,103,7,72,0,0,0,8,0,2,0,0,0,0,0,0,0,1,0,0,7,62,254, +78,0,67,8,192,254,96,254,244,8,103,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,156, +0,1,0,0,2,156,1,82,0,84,0,140,0,5,0,2,0,16,0,47,0,90,0,0,3,158,5,192,0,3, +0,1,0,3,4,185,1,144,0,5,0,8,5,154,5,51,0,0,1,27,5,154,5,51,0,0,3,209,0,102, +2,18,8,5,2,11,6,4,2,2,2,2,2,4,160,0,2,175,80,0,120,251,0,0,0,0,0,0,0,0,49, +65,83,67,0,64,0,33,251,2,5,211,254,81,1,51,7,62,1,178,96,0,0,159,223,215, +0,0,4,58,5,129,0,0,0,32,0,2,2,236,0,68,0,0,0,0,2,170,0,0,2,57,0,0,2,57,0, +185,2,215,0,87,4,115,0,9,4,115,0,22,7,29,0,73,5,86,0,72,1,135,0,104,2,170, +0,127,2,170,0,12,3,29,0,33,4,172,0,100,2,57,0,184,2,170,0,91,2,57,0,187,2, +57,0,0,4,115,0,80,4,115,0,156,4,115,0,103,4,115,0,78,4,115,0,47,4,115,0,82, +4,115,0,104,4,115,0,105,4,115,0,89,4,115,0,96,2,57,0,187,2,57,0,184,4,172, +0,101,4,172,0,100,4,172,0,101,4,115,0,84,8,31,0,161,5,86,0,4,5,86,0,168,5, +199,0,104,5,199,0,168,5,86,0,168,4,227,0,168,6,57,0,103,5,199,0,168,2,57, +0,189,4,0,0,32,5,86,0,168,4,115,0,168,6,170,0,168,5,199,0,168,6,57,0,97,5, +86,0,168,6,57,0,97,5,199,0,168,5,86,0,93,4,227,0,46,5,199,0,158,5,86,0,9, +7,141,0,9,5,86,0,46,5,86,0,45,4,227,0,65,2,57,0,146,2,57,0,0,2,57,0,16,3, +193,0,10,4,115,255,225,2,170,0,106,4,115,0,87,4,115,0,132,4,0,0,87,4,115, +0,86,4,115,0,87,2,57,0,29,4,115,0,86,4,115,0,142,1,199,0,137,1,199,255,206, +4,0,0,138,1,199,0,138,6,170,0,136,4,115,0,136,4,115,0,86,4,115,0,132,4,115, +0,86,2,170,0,136,4,0,0,57,2,57,0,31,4,115,0,133,4,0,0,7,5,199,255,253,4,0, +0,23,4,0,0,5,4,0,0,49,2,172,0,34,2,20,0,183,2,172,0,34,4,172,0,92,2,170,0, +242,4,115,0,135,4,115,0,58,4,115,0,113,4,115,255,254,2,20,0,183,4,115,0,115, +2,170,0,45,5,229,0,31,2,246,0,26,4,115,0,83,4,172,0,100,5,229,0,31,4,107, +255,239,3,51,0,122,4,100,0,65,2,170,0,41,2,170,0,27,2,170,0,72,4,156,0,140, +4,76,0,80,2,57,0,187,2,170,0,119,2,170,0,80,2,236,0,27,4,115,0,83,6,172,0, +56,6,172,0,56,6,172,0,73,4,227,0,131,5,86,0,4,5,86,0,4,5,86,0,4,5,86,0,4, +5,86,0,4,5,86,0,4,8,0,0,24,5,199,0,104,5,86,0,168,5,86,0,168,5,86,0,168,5, +86,0,168,2,57,0,9,2,57,0,142,2,57,255,210,2,57,0,7,5,199,0,14,5,199,0,168, +6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,4,172,0,142,6,57,0,71,5, +199,0,158,5,199,0,158,5,199,0,158,5,199,0,158,5,86,0,45,5,86,0,168,4,227, +0,142,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,7, +29,0,66,4,0,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,2,57,0,10,2, +57,0,135,2,57,255,211,2,57,0,8,4,115,0,86,4,115,0,140,4,115,0,86,4,115,0, +86,4,115,0,86,4,115,0,86,4,115,0,86,4,100,0,65,4,227,0,44,4,115,0,139,4,115, +0,139,4,115,0,139,4,115,0,139,4,0,0,5,4,115,0,138,4,0,0,5,5,86,0,4,4,115, +0,87,5,86,0,4,4,115,0,87,5,86,0,4,4,115,0,87,5,199,0,104,4,0,0,87,5,199,0, +104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,168,4,235, +0,86,5,199,0,14,4,115,0,86,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5, +86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,6,57,0,103, +4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0, +86,5,199,0,168,4,115,0,142,5,199,0,14,4,115,0,10,2,57,255,184,2,57,255,184, +2,57,0,12,2,57,0,12,2,57,255,210,2,57,255,210,2,57,0,92,1,199,0,31,2,57,0, +189,2,57,0,194,5,225,0,170,3,141,0,137,4,0,0,32,1,199,255,153,5,86,0,168, +4,0,0,138,4,0,0,138,4,115,0,168,1,199,0,91,4,115,0,168,1,199,0,126,4,115, +0,168,2,85,0,138,4,115,0,168,2,172,0,138,4,115,0,20,1,199,0,16,5,199,0,168, +4,115,0,140,5,199,0,168,4,115,0,140,5,199,0,168,4,115,0,140,4,213,255,254, +5,201,0,165,4,115,0,140,6,57,0,97,4,115,0,86,6,57,0,97,4,115,0,86,6,57,0, +97,4,115,0,86,8,0,0,97,7,141,0,86,5,199,0,168,2,170,0,136,5,199,0,168,2,170, +0,129,5,199,0,168,2,170,0,56,5,86,0,93,4,0,0,57,5,86,0,93,4,0,0,57,5,86,0, +93,4,0,0,57,5,86,0,93,4,0,0,57,4,227,0,46,2,57,0,31,4,227,0,46,3,0,0,31,4, +227,0,46,2,57,0,31,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199, +0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0, +158,4,115,0,133,7,141,0,9,5,199,255,253,5,86,0,45,4,0,0,5,5,86,0,45,4,227, +0,65,4,0,0,49,4,227,0,65,4,0,0,49,4,227,0,65,4,0,0,49,1,199,0,138,4,115,0, +192,5,86,0,4,4,115,0,87,8,0,0,24,7,29,0,66,6,57,0,71,4,227,0,44,2,170,0,0, +2,170,0,0,2,170,0,51,2,170,255,221,2,170,0,156,2,170,0,51,2,170,0,80,2,170, +255,233,2,170,0,22,2,170,0,205,2,170,0,29,5,87,0,4,2,57,0,187,6,70,255,245, +6,180,255,242,3,18,255,232,6,50,255,187,6,216,0,65,6,5,255,187,1,199,255, +176,5,86,0,4,5,86,0,168,4,104,0,168,5,88,0,61,5,86,0,168,4,227,0,65,5,199, +0,168,6,57,0,97,2,57,0,189,5,86,0,168,5,88,0,10,6,170,0,168,5,199,0,168,5, +51,0,90,6,57,0,97,5,199,0,168,5,86,0,168,4,242,0,108,4,227,0,46,5,86,0,45, +6,98,0,117,5,86,0,46,6,175,0,145,5,251,0,87,2,57,0,7,5,86,0,45,4,160,0,86, +3,145,0,70,4,115,0,106,1,199,0,137,4,96,0,133,4,160,0,86,4,154,0,142,4,0, +0,7,4,116,0,86,3,145,0,70,3,135,0,86,4,115,0,106,4,115,0,106,1,199,0,137, +4,0,0,138,4,0,0,14,4,156,0,138,4,0,0,0,3,149,0,86,4,115,0,86,5,133,0,79,4, +141,0,132,3,219,0,86,4,240,0,86,3,41,0,29,4,96,0,133,5,48,0,85,4,51,0,21, +5,180,0,135,6,63,0,83,1,199,255,205,4,96,0,133,4,115,0,86,4,96,0,133,6,63, +0,83,5,87,0,168,6,235,0,46,4,85,0,168,5,192,0,104,5,86,0,93,2,57,0,189,2, +57,0,7,4,0,0,32,8,117,0,18,8,21,0,168,6,213,0,46,4,169,0,168,5,21,0,55,5, +192,0,168,5,86,0,4,5,64,0,168,5,86,0,168,4,85,0,168,5,107,0,15,5,86,0,168, +7,99,0,28,4,213,0,67,5,192,0,168,5,192,0,168,4,169,0,168,5,64,0,18,6,170, +0,168,5,199,0,168,6,57,0,97,5,192,0,166,5,86,0,168,5,199,0,104,4,227,0,46, +5,21,0,55,6,21,0,118,5,86,0,46,5,235,0,168,5,85,0,160,7,85,0,168,7,128,0, +168,6,85,0,46,7,21,0,168,5,64,0,168,5,192,0,105,8,21,0,168,5,199,0,96,4,115, +0,87,4,149,0,120,4,64,0,142,2,235,0,142,4,171,0,20,4,115,0,87,5,90,0,7,3, +171,0,49,4,120,0,142,4,120,0,142,3,128,0,138,4,171,0,11,5,128,0,142,4,107, +0,142,4,115,0,86,4,85,0,142,4,115,0,132,4,0,0,87,3,170,0,35,4,0,0,5,6,149, +0,86,4,0,0,23,4,149,0,142,4,43,0,122,6,107,0,142,6,149,0,142,5,0,0,45,5,192, +0,142,4,43,0,142,4,21,0,55,6,0,0,142,4,85,0,17,4,115,0,87,4,115,0,10,2,235, +0,142,4,21,0,87,4,0,0,57,1,199,0,137,2,57,255,248,1,199,255,206,7,64,0,11, +6,128,0,142,4,115,0,10,3,128,0,138,4,0,0,5,4,107,0,142,3,233,0,168,3,74,0, +142,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253, +5,86,0,45,4,0,0,5,4,115,0,0,8,0,0,0,8,0,0,0,4,107,255,225,1,199,0,127,1,199, +0,127,1,199,0,127,1,199,0,126,2,170,0,75,2,170,0,75,2,170,0,75,4,115,0,138, +4,115,0,136,2,205,0,81,8,0,1,22,8,0,0,55,1,128,0,85,2,213,0,85,2,170,0,88, +2,170,0,89,4,0,0,185,2,170,255,192,1,86,254,96,2,235,0,101,4,115,0,4,4,115, +0,58,8,192,0,158,4,115,0,16,7,21,0,69,2,150,0,19,8,149,0,188,8,0,0,188,6, +37,0,108,4,205,0,88,6,172,0,80,6,172,0,61,6,172,0,93,6,172,0,145,8,0,1,162, +4,0,1,16,8,0,1,162,4,0,1,16,8,0,1,162,4,0,1,16,4,0,1,16,3,244,0,56,4,229, +0,4,6,150,0,235,5,180,0,154,4,172,0,101,4,100,0,51,5,180,0,87,7,213,1,152, +5,192,1,22,2,49,255,158,4,100,0,56,4,100,0,65,4,171,0,100,4,100,0,63,4,100, +0,65,4,213,0,157,4,172,0,100,4,213,2,34,4,213,1,5,5,171,255,246,5,0,1,216, +5,171,2,141,5,171,255,246,5,171,2,141,5,171,255,246,5,171,2,141,5,171,255, +246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,1,217,5, +171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255,246, +5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255, +246,5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171, +255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255, +246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,0,0,5,171, +0,0,5,171,0,0,5,171,0,0,5,171,2,213,5,171,0,103,5,171,0,0,5,213,0,0,4,213, +0,123,4,213,0,6,2,214,0,109,2,214,0,109,8,0,0,0,7,235,1,158,7,235,1,145,7, +235,1,158,7,235,1,145,3,244,0,8,4,213,0,167,4,213,0,178,4,213,0,41,4,213, +0,41,2,214,0,115,8,43,1,177,8,107,1,209,7,85,1,70,6,0,1,218,6,0,1,81,4,64, +0,59,5,64,0,60,4,192,0,102,4,21,0,66,4,0,0,196,6,0,1,16,4,0,0,29,4,0,0,29, +2,170,0,119,2,170,0,243,2,170,0,127,2,170,0,14,2,170,0,53,2,170,0,43,2,170, +0,45,2,170,255,229,1,199,0,124,1,199,0,130,2,90,0,106,2,90,0,72,2,152,0,0, +2,152,0,0,2,135,0,45,2,160,255,233,3,47,0,32,2,72,255,232,0,0,0,3,0,0,0,3, +0,0,0,28,0,1,0,0,0,0,4,232,0,3,0,1,0,0,0,28,0,4,4,204,0,0,0,190,0,128,0,6, +0,62,0,126,1,127,1,146,1,255,2,199,2,201,2,221,3,126,3,138,3,140,3,161,3, +206,4,12,4,79,4,92,4,95,4,145,30,133,30,243,32,21,32,30,32,34,32,38,32,48, +32,51,32,58,32,60,32,62,32,68,32,127,32,164,32,167,32,172,33,5,33,19,33,22, +33,34,33,38,33,46,33,94,33,149,33,168,34,2,34,6,34,15,34,18,34,21,34,26,34, +31,34,41,34,43,34,72,34,97,34,101,35,2,35,16,35,33,37,0,37,2,37,12,37,16, +37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,108,37,128,37,132,37,136,37, +140,37,147,37,161,37,172,37,178,37,186,37,188,37,196,37,203,37,207,37,217, +37,230,38,60,38,64,38,66,38,96,38,99,38,102,38,107,240,2,240,5,251,2,255, +255,0,0,0,32,0,160,1,146,1,250,2,198,2,201,2,216,3,126,3,132,3,140,3,142, +3,163,4,1,4,14,4,81,4,94,4,144,30,128,30,242,32,19,32,23,32,32,32,38,32,48, +32,50,32,57,32,60,32,62,32,68,32,127,32,163,32,167,32,172,33,5,33,19,33,22, +33,34,33,38,33,46,33,91,33,144,33,168,34,2,34,6,34,15,34,17,34,21,34,25,34, +30,34,41,34,43,34,72,34,96,34,100,35,2,35,16,35,32,37,0,37,2,37,12,37,16, +37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,80,37,128,37,132,37,136,37,140, +37,144,37,160,37,170,37,178,37,186,37,188,37,196,37,202,37,207,37,216,37, +230,38,58,38,64,38,66,38,96,38,99,38,101,38,106,240,1,240,5,251,1,255,255, +255,227,0,0,255,174,255,71,254,129,254,128,254,114,252,160,253,204,253,203, +253,202,253,201,253,151,253,150,253,149,253,148,253,100,227,118,227,10,225, +235,225,234,225,233,225,230,225,221,225,220,225,215,225,214,225,213,225,208, +225,150,225,115,225,113,225,109,225,21,225,8,225,6,224,251,224,248,224,241, +224,197,224,148,224,130,224,41,224,38,224,30,224,29,223,255,0,0,224,19,224, +10,224,9,223,237,223,214,223,212,223,56,223,43,223,28,221,62,221,61,221,52, +221,49,221,46,221,43,221,40,221,33,221,26,221,19,221,12,220,249,220,230,220, +227,220,224,220,221,220,218,220,206,220,198,220,193,220,186,220,185,220,178, +220,173,220,170,220,162,220,150,220,67,220,64,220,63,220,34,220,32,220,31, +220,28,18,135,18,133,7,135,0,1,0,0,0,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,98,0,99,0,100,0,101,0, +102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,16,0,110,0,111,0,112,0,113, +0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0, +126,0,127,0,128,0,129,0,130,0,131,0,132,0,133,0,134,0,135,0,136,0,137,0,138, +0,139,0,140,0,141,0,142,0,143,0,144,0,145,0,146,0,147,0,148,0,149,0,150,0, +151,0,152,0,153,0,154,0,155,0,156,0,157,0,158,0,159,0,160,0,161,0,162,0,163, +0,164,0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0, +176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188, +0,189,0,190,0,191,0,192,0,193,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0, +201,0,202,0,203,0,204,0,205,0,206,0,207,0,208,0,209,0,210,0,211,0,212,0,213, +0,214,0,215,0,216,0,217,0,218,0,219,0,220,0,221,0,222,0,223,0,224,0,225,0, +226,0,227,0,228,0,229,0,230,0,231,0,232,0,233,0,234,0,235,0,236,0,237,0,238, +0,239,0,240,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,0, +251,0,252,0,253,0,254,0,255,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10, +1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25, +1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40, +1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55, +1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,0,119,2,48,0,6,2,10,0,0,0,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,0,4,0,5,0,6,0,7,0, +8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0, +23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37, +0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52, +0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67, +0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82, +0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97, +0,0,0,132,0,133,0,135,0,137,0,145,0,150,0,156,0,161,0,160,0,162,0,164,0,163, +0,165,0,167,0,169,0,168,0,170,0,171,0,173,0,172,0,174,0,175,0,177,0,179,0, +178,0,180,0,182,0,181,0,186,0,185,0,187,0,188,2,9,0,112,0,99,0,100,0,104, +2,11,0,118,0,159,0,110,0,106,2,29,0,116,0,105,2,54,0,134,0,152,2,49,0,113, +2,56,2,57,0,102,0,117,2,43,2,46,2,45,1,137,2,52,0,107,0,122,1,114,0,166,0, +184,0,127,0,98,0,109,2,48,1,64,2,53,2,44,0,108,0,123,2,12,0,3,0,128,0,131, +0,149,1,18,1,19,1,254,1,255,2,6,2,7,2,2,2,3,0,183,2,119,0,191,1,56,2,20,2, +25,2,16,2,17,2,136,2,137,2,10,0,119,2,4,2,8,2,13,0,130,0,138,0,129,0,139, +0,136,0,141,0,142,0,143,0,140,0,147,0,148,0,0,0,146,0,154,0,155,0,153,0,241, +1,71,1,78,0,111,1,74,1,75,1,76,0,120,1,79,1,77,1,72,0,0,64,69,89,88,85,84, +83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59, +58,57,56,55,54,53,49,48,47,46,45,44,40,39,38,37,36,35,34,33,31,24,20,17,16, +15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,44,69,35,70,96,32,176,38,96,176,4,38,35, +72,72,45,44,69,35,70,35,97,32,176,38,97,176,4,38,35,72,72,45,44,69,35,70, +96,176,32,97,32,176,70,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,32,96, +32,176,38,97,176,32,97,176,4,38,35,72,72,45,44,69,35,70,96,176,64,97,32,176, +102,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,64,96,32,176,38,97,176, +64,97,176,4,38,35,72,72,45,44,1,16,32,60,0,60,45,44,32,69,35,32,176,205,68, +35,32,184,1,90,81,88,35,32,176,141,68,35,89,32,176,237,81,88,35,32,176,77, +68,35,89,32,176,4,38,81,88,35,32,176,13,68,35,89,33,33,45,44,32,32,69,24, +104,68,32,176,1,96,32,69,176,70,118,104,138,69,96,68,45,44,1,177,11,10,67, +35,67,101,10,45,44,0,177,10,11,67,35,67,11,45,44,0,176,40,35,112,177,1,40, +62,1,176,40,35,112,177,2,40,69,58,177,2,0,8,13,45,44,32,69,176,3,37,69,97, +100,176,80,81,88,69,68,27,33,33,89,45,44,73,176,14,35,68,45,44,32,69,176, +0,67,96,68,45,44,1,176,6,67,176,7,67,101,10,45,44,32,105,176,64,97,176,0, +139,32,177,44,192,138,140,184,16,0,98,96,43,12,100,35,100,97,92,88,176,3, +97,89,45,44,138,3,69,138,138,135,176,17,43,176,41,35,68,176,41,122,228,24, +45,44,69,101,176,44,35,68,69,176,43,35,68,45,44,75,82,88,69,68,27,33,33,89, +45,44,75,81,88,69,68,27,33,33,89,45,44,1,176,5,37,16,35,32,138,245,0,176, +1,96,35,237,236,45,44,1,176,5,37,16,35,32,138,245,0,176,1,97,35,237,236,45, +44,1,176,6,37,16,245,0,237,236,45,44,70,35,70,96,138,138,70,35,32,70,138, +96,138,97,184,255,128,98,35,32,16,35,138,177,12,12,138,112,69,96,32,176,0, +80,88,176,1,97,184,255,186,139,27,176,70,140,89,176,16,96,104,1,58,45,44, +32,69,176,3,37,70,82,75,176,19,81,91,88,176,2,37,70,32,104,97,176,3,37,176, +3,37,63,35,33,56,27,33,17,89,45,44,32,69,176,3,37,70,80,88,176,2,37,70,32, +104,97,176,3,37,176,3,37,63,35,33,56,27,33,17,89,45,44,0,176,7,67,176,6,67, +11,45,44,33,33,12,100,35,100,139,184,64,0,98,45,44,33,176,128,81,88,12,100, +35,100,139,184,32,0,98,27,178,0,64,47,43,89,176,2,96,45,44,33,176,192,81, +88,12,100,35,100,139,184,21,85,98,27,178,0,128,47,43,89,176,2,96,45,44,12, +100,35,100,139,184,64,0,98,96,35,33,45,44,75,83,88,138,176,4,37,73,100,35, +69,105,176,64,139,97,176,128,98,176,32,97,106,176,14,35,68,35,16,176,14,246, +27,33,35,138,18,17,32,57,47,89,45,44,75,83,88,32,176,3,37,73,100,105,32,176, +5,38,176,6,37,73,100,35,97,176,128,98,176,32,97,106,176,14,35,68,176,4,38, +16,176,14,246,138,16,176,14,35,68,176,14,246,176,14,35,68,176,14,237,27,138, +176,4,38,17,18,32,57,35,32,57,47,47,89,45,44,69,35,69,96,35,69,96,35,69,96, +35,118,104,24,176,128,98,32,45,44,176,72,43,45,44,32,69,176,0,84,88,176,64, +68,32,69,176,64,97,68,27,33,33,89,45,44,69,177,48,47,69,35,69,97,96,176,1, +96,105,68,45,44,75,81,88,176,47,35,112,176,20,35,66,27,33,33,89,45,44,75, +81,88,32,176,3,37,69,105,83,88,68,27,33,33,89,27,33,33,89,45,44,69,176,20, +67,176,0,96,99,176,1,96,105,68,45,44,176,47,69,68,45,44,69,35,32,69,138,96, +68,45,44,69,35,69,96,68,45,44,75,35,81,88,185,0,51,255,224,177,52,32,27,179, +51,0,52,0,89,68,68,45,44,176,22,67,88,176,3,38,69,138,88,100,102,176,31,96, +27,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,89,35,88,101,89,176,41, +35,68,35,16,176,41,224,27,33,33,33,33,33,89,45,44,176,2,67,84,88,75,83,35, +75,81,90,88,56,27,33,33,89,27,33,33,33,33,89,45,44,176,22,67,88,176,4,37, +69,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,35,88,27,101,89,176,41, +35,68,176,5,37,176,8,37,8,32,88,2,27,3,89,176,4,37,16,176,5,37,32,70,176, +4,37,35,66,60,176,4,37,176,7,37,8,176,7,37,16,176,6,37,32,70,176,4,37,176, +1,96,35,66,60,32,88,1,27,0,89,176,4,37,16,176,5,37,176,41,224,176,41,32,69, +101,68,176,7,37,16,176,6,37,176,41,224,176,5,37,176,8,37,8,32,88,2,27,3,89, +176,5,37,176,3,37,67,72,176,4,37,176,7,37,8,176,6,37,176,3,37,176,1,96,67, +72,27,33,89,33,33,33,33,33,33,33,45,44,2,176,4,37,32,32,70,176,4,37,35,66, +176,5,37,8,176,3,37,69,72,33,33,33,33,45,44,2,176,3,37,32,176,4,37,8,176, +2,37,67,72,33,33,33,45,44,69,35,32,69,24,32,176,0,80,32,88,35,101,35,89,35, +104,32,176,64,80,88,33,176,64,89,35,88,101,89,138,96,68,45,44,75,83,35,75, +81,90,88,32,69,138,96,68,27,33,33,89,45,44,75,84,88,32,69,138,96,68,27,33, +33,89,45,44,75,83,35,75,81,90,88,56,27,33,33,89,45,44,176,0,33,75,84,88,56, +27,33,33,89,45,44,176,2,67,84,88,176,70,43,27,33,33,33,33,89,45,44,176,2, +67,84,88,176,71,43,27,33,33,33,89,45,44,176,2,67,84,88,176,72,43,27,33,33, +33,33,89,45,44,176,2,67,84,88,176,73,43,27,33,33,33,89,45,44,32,138,8,35, +75,83,138,75,81,90,88,35,56,27,33,33,89,45,44,0,176,2,37,73,176,0,83,88,32, +176,64,56,17,27,33,89,45,44,1,70,35,70,96,35,70,97,35,32,16,32,70,138,97, +184,255,128,98,138,177,64,64,138,112,69,96,104,58,45,44,32,138,35,73,100, +138,35,83,88,60,27,33,89,45,44,75,82,88,125,27,122,89,45,44,176,18,0,75,1, +75,84,66,45,44,177,2,0,66,177,35,1,136,81,177,64,1,136,83,90,88,185,16,0, +0,32,136,84,88,178,2,1,2,67,96,66,89,177,36,1,136,81,88,185,32,0,0,64,136, +84,88,178,2,2,2,67,96,66,177,36,1,136,84,88,178,2,32,2,67,96,66,0,75,1,75, +82,88,178,2,8,2,67,96,66,89,27,185,64,0,0,128,136,84,88,178,2,4,2,67,96,66, +89,185,64,0,0,128,99,184,1,0,136,84,88,178,2,8,2,67,96,66,89,185,64,0,1,0, +99,184,2,0,136,84,88,178,2,16,2,67,96,66,89,185,64,0,2,0,99,184,4,0,136,84, +88,178,2,64,2,67,96,66,89,89,89,89,89,45,44,69,24,104,35,75,81,88,35,32,69, +32,100,176,64,80,88,124,89,104,138,96,89,68,45,44,176,0,22,176,2,37,176,2, +37,1,176,1,35,62,0,176,2,35,62,177,1,2,6,12,176,10,35,101,66,176,11,35,66, +1,176,1,35,63,0,176,2,35,63,177,1,2,6,12,176,6,35,101,66,176,7,35,66,176, +1,22,1,45,44,122,138,16,69,35,245,24,45,0,0,0,177,9,64,190,1,7,0,1,0,31,1, +7,0,1,0,159,1,4,64,142,1,192,253,1,175,253,1,0,253,1,10,79,251,1,32,251,1, +245,80,40,31,242,70,40,31,241,70,42,31,240,70,43,31,95,239,127,239,2,15,239, +79,239,95,239,143,239,175,239,5,11,229,228,30,31,227,226,70,31,15,226,1,64, +226,70,22,31,225,224,70,31,207,224,223,224,239,224,3,64,224,51,54,70,224, +70,24,31,221,61,223,85,222,61,3,85,223,1,3,85,220,3,255,31,15,213,31,213, +2,15,213,31,213,2,64,202,24,27,70,207,194,1,189,192,60,31,193,80,38,31,188, +190,40,31,255,185,1,80,184,112,184,128,184,3,184,255,192,64,255,184,18,50, +70,31,183,63,183,79,183,111,183,127,183,159,183,175,183,7,112,178,160,178, +176,178,3,15,178,1,144,181,1,176,181,1,15,181,1,8,15,179,63,179,239,179,3, +128,176,144,176,2,176,176,192,176,208,176,3,47,175,63,175,2,160,173,176,173, +2,192,173,208,173,2,47,172,63,172,2,159,171,1,192,170,208,170,2,79,169,143, +169,2,47,169,111,169,191,169,255,169,4,156,155,36,31,80,155,1,111,150,1,191, +150,1,150,70,29,31,149,148,23,31,127,148,143,148,255,148,3,48,145,64,145, +2,128,145,1,112,143,128,143,2,144,143,1,192,143,208,143,2,79,140,95,140,111, +140,3,134,70,255,31,159,133,1,132,131,49,31,116,115,63,31,115,80,38,31,111, +110,60,31,110,70,53,31,26,1,24,85,25,51,24,85,7,51,3,85,6,3,255,31,96,80, +38,31,95,80,38,31,92,70,49,31,91,90,72,31,90,70,49,31,19,50,18,85,5,1,3,85, +4,50,3,85,111,3,1,15,3,63,3,2,239,81,255,81,2,64,81,53,56,70,64,81,37,40, +70,207,64,84,80,1,73,70,32,31,72,70,53,31,71,70,53,31,175,70,1,223,70,239, +70,2,128,70,1,22,50,21,85,17,1,15,85,16,50,15,85,2,1,0,85,1,0,1,31,31,15, +63,15,95,15,127,15,4,15,15,47,15,79,15,111,15,143,15,223,15,255,15,7,63,15, +127,15,239,15,3,111,0,1,128,22,1,5,1,184,1,144,177,84,83,43,43,75,184,7,255, +82,75,176,7,80,91,176,1,136,176,37,83,176,1,136,176,64,81,90,176,6,136,176, +0,85,90,91,88,177,1,1,142,89,133,141,141,0,66,29,75,176,50,83,88,176,96,29, +89,75,176,100,83,88,176,64,29,89,75,176,128,83,88,176,16,29,177,22,0,66,89, +116,115,116,117,43,43,43,43,43,1,115,116,117,43,43,43,0,116,43,43,115,115, +117,43,43,43,1,43,43,43,0,43,43,43,43,43,43,1,43,43,0,43,43,1,43,115,43,0, +116,115,116,117,115,116,115,43,1,43,116,117,0,115,43,115,116,1,115,115,116, +0,115,116,116,115,116,115,1,94,115,115,116,115,115,0,115,43,115,115,1,43, +0,43,1,43,0,115,43,116,117,43,43,43,43,1,43,43,116,43,43,94,115,43,0,43,94, +115,116,1,43,43,43,0,43,115,115,94,115,115,115,1,115,115,115,24,94,0,0,0, +5,204,5,204,0,125,5,129,0,21,0,121,5,129,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,58,0,20,0,119,0,0,255,236,0,0,0,0,255,236,0,0,0,0,255,236,0,0,254,87,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,8,0,0,0,0,0,0,180,0,189,0,175,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0, +126,0,0,0,172,0,0,0,0,0,0,0,0,0,0,0,0,0,191,0,195,0,171,0,0,0,0,0,155,0,141, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,0,170,0,0,0,0,0, +0,0,148,0,153,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106, +0,131,0,141,0,164,0,180,0,0,0,0,0,0,0,0,0,0,0,96,0,106,0,121,0,152,0,172, +0,184,0,167,0,0,1,34,1,51,0,195,0,107,0,0,0,0,0,0,0,219,0,201,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,225,1,201,0,146,0,168,0,107,0,146,0,183, +0,107,0,155,0,0,2,123,2,242,0,146,2,82,0,110,2,215,3,129,0,130,0,137,0,160, +0,159,1,105,0,143,0,0,1,96,0,164,1,91,0,94,0,130,0,0,0,0,0,0,0,94,0,101,0, +111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,144,0,165,0,122,0,128,0,0,0,0,0,0, +0,0,0,0,5,129,255,243,0,13,252,167,0,131,0,137,0,143,0,150,0,105,0,113,0, +0,0,0,0,0,0,0,0,0,0,168,1,249,0,0,0,0,3,31,0,167,0,174,0,181,0,0,0,0,0,129, +0,0,0,0,0,0,0,0,7,72,3,106,2,182,2,2,253,147,0,0,0,145,0,103,0,145,0,97,1, +217,0,0,2,141,3,65,0,68,5,17,0,0,0,44,0,44,0,44,0,44,1,22,1,96,2,4,3,4,3, +230,4,240,5,14,5,84,5,158,5,246,6,50,6,114,6,144,6,178,6,218,7,80,7,150,8, +32,8,222,9,68,9,226,10,140,10,206,11,158,12,80,12,126,12,200,13,18,13,74, +13,146,14,20,15,100,16,22,16,172,17,64,17,160,17,222,18,40,18,202,19,22,19, +96,19,194,20,44,20,88,21,184,22,64,22,182,23,26,23,192,24,94,25,40,26,38, +26,146,27,42,29,162,30,254,32,64,32,148,32,190,32,242,33,28,34,172,34,202, +34,244,35,160,36,54,36,172,37,54,37,166,38,32,38,238,39,88,39,166,40,102, +41,0,41,68,42,246,43,100,43,212,44,112,45,20,45,98,46,16,46,114,46,230,48, +52,50,86,51,226,53,124,54,24,54,136,55,126,55,240,56,112,57,142,58,18,58, +196,59,100,59,234,60,238,62,28,62,144,63,134,64,72,64,168,64,210,65,178,65, +200,66,36,66,110,66,232,67,126,67,170,68,42,68,106,68,138,68,244,69,48,69, +166,70,14,70,48,70,90,70,124,71,8,71,32,71,56,71,80,71,104,71,130,71,154, +72,14,72,34,72,58,72,82,72,106,72,132,72,156,72,178,72,200,72,224,73,80,73, +104,73,128,73,152,73,176,73,200,73,226,74,68,74,252,75,20,75,44,75,68,75, +94,75,118,75,212,76,154,76,178,76,202,76,226,76,250,77,20,77,46,78,38,78, +58,78,82,78,106,78,130,78,156,78,180,78,202,78,224,78,248,79,172,79,196,79, +220,79,244,80,12,80,36,80,62,80,126,81,26,81,50,81,74,81,98,81,124,81,148, +82,24,82,50,82,74,82,98,82,122,82,146,82,166,82,186,82,210,82,234,83,2,83, +26,83,50,83,70,83,94,83,118,83,142,83,164,83,172,84,74,84,98,84,122,84,146, +84,170,84,194,84,214,84,234,84,254,85,22,85,46,85,70,85,94,85,118,85,142, +85,166,85,186,85,206,85,230,85,254,86,22,86,142,87,20,87,42,87,64,87,88,87, +110,87,132,87,154,87,172,87,192,87,216,88,170,88,182,88,210,88,234,89,228, +89,248,90,12,90,124,90,148,90,170,90,190,90,210,90,232,91,22,91,42,91,62, +91,150,91,224,91,248,92,16,92,36,92,56,92,80,92,104,92,116,93,20,93,164,93, +188,93,212,93,236,94,4,94,30,94,56,94,216,95,154,95,178,95,202,95,222,95, +242,96,10,96,34,96,58,96,82,96,106,96,130,96,150,96,170,96,194,96,218,96, +238,98,112,98,136,98,158,98,238,99,96,99,120,99,144,99,168,99,192,99,216, +99,240,100,10,100,36,100,62,100,88,100,122,100,142,100,166,100,190,100,214, +100,238,101,8,101,32,101,56,101,80,101,100,101,124,101,148,101,244,102,108, +103,104,103,140,103,164,103,188,103,212,103,236,104,34,104,88,104,142,104, +214,104,238,105,86,105,162,106,244,107,70,107,118,107,188,107,248,109,10, +109,50,109,112,109,172,109,206,112,188,112,236,114,22,114,30,114,38,114,82, +114,208,114,216,114,224,114,232,115,138,115,146,115,154,116,34,116,42,116, +50,116,116,116,124,116,182,116,190,117,56,117,64,117,72,117,234,117,242,118, +140,119,78,119,102,120,194,120,218,120,242,121,10,121,36,121,64,122,30,122, +212,123,118,124,16,124,186,125,114,125,218,126,124,127,28,127,136,128,94, +128,208,130,6,130,234,130,242,131,112,131,246,132,174,133,52,133,156,134, +4,134,138,135,74,135,188,136,108,136,134,136,160,136,184,136,208,136,232, +137,66,137,198,137,222,138,142,138,150,138,158,138,182,138,190,139,116,139, +224,140,78,140,102,140,126,140,198,140,206,141,66,141,74,141,82,141,224,141, +232,142,210,143,168,144,10,144,34,144,152,145,30,145,38,145,46,145,54,145, +108,145,116,145,124,145,132,146,12,146,156,146,164,146,226,147,78,147,158, +147,250,148,88,148,206,149,44,149,214,150,112,151,26,151,34,151,198,152,86, +152,130,152,254,153,6,153,250,154,160,155,34,155,58,155,200,156,80,157,2, +157,96,157,104,157,178,157,186,157,194,157,250,158,2,158,250,159,2,159,72, +159,160,159,242,160,86,160,184,161,28,161,134,162,24,162,150,163,6,163,32, +163,192,163,216,164,106,164,114,164,232,165,2,165,10,165,228,166,90,166,222, +166,246,167,14,167,100,167,148,167,194,167,218,167,242,168,10,168,34,168, +60,168,86,168,110,168,134,168,168,168,202,168,236,168,248,169,40,169,90,169, +140,169,188,170,18,170,114,170,208,171,12,171,102,171,172,171,238,174,134, +174,168,174,186,174,246,175,46,175,70,175,90,175,126,175,232,176,60,176,252, +178,100,179,50,180,4,180,178,181,136,182,32,182,224,183,78,183,128,183,178, +183,228,184,14,184,60,184,106,184,152,184,198,185,14,185,86,185,166,186,118, +187,22,187,70,187,184,187,214,188,72,188,226,188,250,189,52,190,108,191,92, +191,212,192,8,192,96,192,184,192,230,193,0,193,54,193,116,193,140,193,166, +193,200,193,234,194,12,194,46,194,84,194,122,194,160,194,198,194,248,195, +30,195,72,195,118,195,166,195,224,196,14,196,62,196,120,196,166,196,214,197, +16,197,62,197,110,197,168,197,220,198,18,198,86,198,138,198,194,199,8,199, +62,199,114,199,184,199,238,200,34,200,106,200,178,200,252,201,88,201,112, +201,136,201,160,201,184,201,208,203,232,205,196,207,132,207,146,207,178,207, +206,207,246,208,4,208,18,208,32,208,46,208,60,208,106,208,188,208,238,209, +32,209,114,209,180,210,100,210,228,211,148,212,14,212,166,213,6,213,140,213, +224,214,26,214,102,214,220,215,70,215,164,215,246,216,8,216,68,216,164,217, +34,217,88,218,12,218,74,218,114,218,160,218,200,218,242,219,40,219,94,219, +130,219,208,220,20,220,80,0,0,0,2,0,68,0,0,2,100,5,85,0,3,0,7,0,46,177,1, +0,47,60,178,7,4,8,237,50,177,6,5,220,60,178,3,2,8,237,50,0,177,3,0,47,60, +178,5,4,8,237,50,178,7,6,9,252,60,178,1,2,8,237,50,51,17,33,17,37,33,17,33, +68,2,32,254,36,1,152,254,104,5,85,250,171,68,4,205,0,0,0,2,0,185,0,0,1,127, +5,129,0,3,0,7,1,172,64,158,3,91,2,2,150,7,166,7,2,7,150,57,4,73,4,89,4,3, +4,64,23,27,72,6,4,1,11,4,38,9,1,201,9,217,9,2,118,9,166,9,2,25,9,41,9,2,6, +9,1,215,73,9,1,38,9,1,217,9,1,118,9,1,41,9,1,6,9,1,121,9,1,86,9,1,9,9,1,163, +169,9,1,130,9,1,84,9,100,9,116,9,3,137,9,1,98,9,114,9,2,68,9,84,9,2,34,9, +50,9,2,20,9,1,2,9,1,242,9,1,212,9,228,9,2,178,9,194,9,2,148,9,164,9,2,114, +9,130,9,2,84,9,100,9,2,66,9,1,20,9,36,9,52,9,3,2,9,1,110,9,184,255,128,64, +17,102,109,72,73,9,1,9,64,94,98,72,45,9,61,9,2,9,184,1,0,64,153,85,88,72, +9,128,81,84,72,125,9,141,9,157,9,3,95,9,111,9,2,9,128,71,75,72,9,192,67,70, +72,9,128,63,66,72,125,9,1,91,9,107,9,2,61,9,77,9,2,25,9,41,9,2,11,9,1,55, +235,9,251,9,2,205,9,221,9,2,171,9,187,9,2,9,64,45,48,72,59,9,75,9,91,9,3, +29,9,45,9,2,1,203,9,219,9,235,9,3,159,9,175,9,191,9,3,27,9,43,9,59,9,107, +9,123,9,5,15,9,1,2,127,9,143,9,159,9,191,9,207,9,5,64,9,96,9,2,15,9,31,9, +2,7,112,1,1,95,1,1,1,5,156,4,2,3,0,63,47,253,206,93,93,1,94,93,93,93,95,113, +113,113,113,95,114,114,43,114,114,114,94,93,93,93,93,93,43,43,43,113,113, +43,43,114,43,114,43,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113, +114,114,114,94,93,93,93,113,113,113,113,114,114,94,93,93,93,93,113,47,94, +93,43,93,237,113,51,47,237,49,48,1,35,3,51,3,53,51,21,1,103,148,24,196,198, +194,1,141,3,244,250,127,201,201,0,0,2,0,87,3,198,2,128,5,129,0,3,0,7,0,104, +64,33,48,3,1,128,3,1,3,16,2,32,2,96,2,112,2,128,2,5,96,2,112,2,2,80,2,96, +2,176,2,192,2,4,2,184,255,192,179,37,40,72,2,184,255,192,64,32,25,28,72,2, +48,7,1,128,7,1,7,111,6,127,6,143,6,3,47,6,63,6,2,6,5,32,0,1,0,6,2,3,0,63, +51,205,93,50,1,47,113,114,205,93,113,220,43,43,93,113,114,205,93,113,49,48, +1,35,3,51,1,35,3,51,2,106,142,20,184,254,121,141,21,184,3,198,1,187,254,69, +1,187,0,0,0,2,0,9,0,0,4,105,5,121,0,27,0,31,0,214,64,134,90,25,1,90,21,1, +68,14,1,68,19,1,54,19,1,68,30,1,38,30,54,30,2,68,23,1,38,23,54,23,2,3,16, +1,8,29,28,21,20,9,20,20,11,14,15,18,19,10,9,19,12,16,4,10,4,1,0,25,24,5,24, +24,27,3,3,7,30,31,22,23,6,23,5,6,4,7,8,11,4,12,13,1,14,29,30,4,13,0,15,28, +31,4,16,17,18,21,22,25,4,17,16,13,1,208,13,1,79,17,143,17,159,17,3,63,17, +79,17,2,13,17,13,17,5,20,23,24,3,19,3,6,9,10,3,5,0,47,23,51,63,23,51,18,57, +57,47,47,93,113,93,113,17,23,51,16,205,23,50,17,23,51,16,205,23,50,1,47,51, +51,135,192,192,192,192,1,23,51,16,135,192,192,192,192,1,47,23,51,135,192, +192,192,192,1,51,16,135,192,192,192,192,49,48,1,93,93,93,93,93,93,93,93,93, +93,1,3,33,21,33,3,35,19,33,3,35,19,35,53,51,19,35,53,33,19,51,3,33,19,51, +3,51,21,33,3,33,19,3,128,78,1,4,254,229,88,110,86,254,149,84,110,84,201,225, +78,252,1,18,89,110,88,1,107,88,110,88,211,253,64,80,1,106,78,3,117,254,143, +108,254,104,1,152,254,104,1,152,108,1,113,108,1,152,254,104,1,152,254,104, +108,254,143,1,113,0,3,0,22,255,114,4,82,5,236,0,48,0,59,0,70,1,46,64,92,154, +14,1,154,13,1,150,68,1,133,39,1,138,57,154,57,2,137,53,153,53,2,132,37,1, +118,6,134,6,150,6,3,70,63,86,63,134,63,3,52,38,100,38,116,38,3,37,2,1,25, +27,1,24,34,55,3,47,9,21,65,3,32,48,1,48,48,16,49,30,111,29,41,111,0,49,32, +49,2,0,49,32,49,48,49,80,49,112,49,5,8,3,49,184,255,192,179,29,35,72,49,184, +255,192,64,117,17,22,72,49,4,111,3,64,16,24,72,3,60,111,16,33,66,115,207, +54,1,157,54,1,5,136,54,1,120,10,216,10,2,199,34,215,34,2,182,34,1,135,34, +167,34,2,215,65,1,166,65,1,119,65,1,60,16,65,34,10,54,41,49,8,0,125,30,141, +30,2,26,30,1,30,24,22,64,19,23,72,22,15,21,47,21,63,21,95,21,4,21,55,9,115, +47,148,4,164,4,2,112,4,128,4,2,5,4,21,4,85,4,101,4,4,46,4,0,0,47,50,50,93, +93,93,205,237,50,47,93,205,43,51,51,93,93,18,23,57,93,93,93,93,93,93,93,93, +95,93,93,237,50,1,47,237,214,43,237,47,43,43,95,94,93,113,253,212,237,17, +18,57,47,114,23,51,205,23,50,49,48,93,0,93,93,93,93,93,93,1,93,93,93,0,93, +1,93,37,46,1,39,55,30,3,23,17,39,46,3,53,52,62,2,55,53,51,21,30,3,23,7,46, +1,39,17,30,5,21,20,14,2,7,21,35,1,52,46,2,39,17,62,3,1,20,30,2,23,17,14,3, +2,6,217,245,34,170,11,46,78,113,78,20,77,148,116,71,64,115,158,95,124,100, +145,102,66,20,174,20,122,117,59,114,103,88,64,36,56,114,175,119,124,1,160, +47,81,106,58,65,108,77,42,253,92,40,70,95,55,72,100,61,27,20,9,185,165,37, +53,87,64,39,5,1,240,5,18,50,83,128,98,84,124,83,44,4,131,131,5,45,80,115, +75,33,94,105,11,254,67,14,30,41,56,79,109,72,77,131,100,62,6,162,2,24,63, +80,51,32,15,254,44,4,31,56,81,2,197,54,74,50,33,14,1,165,4,33,52,68,0,0,0, +0,5,0,73,255,244,6,212,5,141,0,19,0,23,0,43,0,63,0,83,0,212,64,11,118,20, +134,20,2,121,22,137,22,2,42,184,255,232,64,14,8,12,72,37,24,8,12,72,32,24, +8,12,72,26,184,255,232,179,8,12,72,17,184,255,232,179,8,12,72,13,184,255, +232,64,18,8,12,72,7,24,8,12,72,3,24,8,12,72,22,23,20,21,21,184,255,240,64, +84,23,16,23,21,23,21,0,39,54,180,10,178,0,180,0,44,16,44,32,44,3,0,44,64, +44,2,0,44,16,44,32,44,80,44,96,44,112,44,224,44,240,44,8,44,64,180,29,178, +74,180,15,39,1,239,39,255,39,2,39,64,10,13,72,39,79,182,34,184,69,182,24, +4,22,3,21,18,49,182,15,184,59,182,5,19,0,63,237,244,237,63,63,63,237,244, +237,1,47,43,113,114,237,244,237,47,93,113,114,253,244,237,17,18,57,57,47, +47,56,56,17,51,17,51,49,48,0,43,43,43,43,43,43,43,43,1,93,93,1,20,14,2,35, +34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2, +53,52,62,2,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,52,46,2,35,34,14, +2,21,20,30,2,51,50,62,2,6,212,51,87,116,66,66,115,85,49,48,86,117,68,66,115, +85,50,251,59,155,3,154,157,251,223,64,114,86,49,50,85,116,66,67,116,85,49, +49,86,118,4,250,22,43,63,40,42,64,44,22,23,43,63,41,39,63,44,24,251,240,22, +42,62,40,43,65,44,22,23,43,64,42,38,62,44,24,1,178,125,171,105,45,45,104, +171,126,133,174,103,41,41,103,174,253,201,5,129,12,41,102,172,131,126,172, +107,46,46,106,172,127,131,172,102,41,252,37,99,131,78,32,33,78,131,98,95, +128,79,34,34,79,128,2,124,98,130,78,32,33,78,130,97,95,130,79,34,34,79,130, +0,0,3,0,72,255,236,5,54,5,137,0,57,0,73,0,89,1,20,64,73,137,1,1,140,36,1, +123,42,139,42,2,98,82,114,82,130,82,3,102,71,1,127,78,1,91,78,1,73,43,89, +43,105,43,3,54,48,134,48,2,37,40,1,44,35,124,35,140,35,3,28,5,44,5,60,5,92, +5,4,10,10,26,10,42,10,3,10,2,26,2,42,2,3,31,184,255,232,64,56,9,13,72,10, +25,26,25,42,25,3,48,41,38,69,4,54,66,73,23,33,73,58,45,44,140,74,1,74,77, +18,3,23,3,58,44,80,23,1,3,44,1,23,58,44,44,58,23,3,13,15,54,1,175,54,1,54, +184,255,192,64,61,9,12,72,54,80,72,63,13,79,13,2,13,143,3,1,141,77,1,98,69, +114,69,2,54,69,70,69,2,3,74,48,41,77,44,38,18,69,9,8,63,81,144,28,1,192,28, +1,15,28,63,28,2,28,85,81,8,22,51,80,0,22,0,63,237,63,237,47,93,93,113,237, +18,23,57,93,93,93,93,1,47,93,237,47,43,93,113,18,23,57,47,47,47,0,93,1,93, +17,18,57,17,23,57,93,16,205,16,237,16,237,17,23,57,49,48,93,43,0,93,93,93, +93,1,93,93,93,0,93,93,93,93,1,93,0,93,93,5,34,38,39,14,3,35,34,46,2,53,52, +62,2,55,46,3,53,52,62,2,51,50,30,2,21,20,14,2,7,30,1,23,62,1,55,23,14,1,7, +30,1,51,50,54,55,21,14,1,1,52,46,2,35,34,6,21,20,22,23,62,3,3,46,1,39,14, +1,21,20,30,2,51,50,62,2,4,169,96,144,58,30,76,93,109,64,117,171,110,53,51, +91,126,75,18,29,22,12,40,85,133,93,73,123,90,50,66,112,148,83,62,146,85,61, +81,29,145,35,107,70,53,106,49,32,59,26,28,75,254,150,27,48,69,42,96,100,37, +28,65,116,86,50,74,89,164,66,113,123,35,72,109,73,44,79,68,55,12,66,61,26, +48,38,23,60,105,143,83,79,129,105,83,33,34,77,78,78,35,66,115,85,49,38,72, +106,68,75,117,92,75,33,114,201,97,90,199,121,43,139,227,103,54,44,7,9,135, +11,11,4,121,37,60,43,23,103,91,59,129,56,26,55,65,79,252,158,105,230,122, +48,148,105,55,95,71,41,19,30,38,0,0,1,0,104,3,198,1,32,5,129,0,3,0,33,64, +19,48,3,1,128,3,1,3,16,2,32,2,2,2,32,0,1,0,2,3,0,63,205,93,1,47,93,205,93, +113,49,48,1,35,3,51,1,10,141,21,184,3,198,1,187,0,1,0,127,254,88,2,158,5, +204,0,22,0,66,64,45,135,13,1,135,9,1,88,20,1,88,2,1,17,24,14,17,72,5,24,14, +17,72,16,6,16,16,6,128,6,2,6,11,242,0,0,16,0,32,0,3,0,16,27,5,0,0,63,63,1, +47,93,237,204,93,56,50,49,48,43,43,93,93,93,93,19,52,62,2,55,51,14,3,21,20, +30,2,23,35,46,3,53,127,42,90,140,97,174,94,137,88,43,43,88,137,94,174,97, +140,90,42,2,20,139,254,234,220,105,105,221,235,254,139,139,254,236,220,105, +105,220,234,253,140,0,0,0,1,0,12,254,88,2,43,5,204,0,22,0,72,64,13,136,13, +1,136,9,1,87,20,1,87,2,1,17,184,255,232,179,14,17,72,5,184,255,232,180,14, +17,72,16,6,184,255,240,64,16,31,6,143,6,2,6,0,242,143,11,1,11,16,0,5,27,0, +63,63,1,47,93,253,204,93,56,50,49,48,43,43,93,93,93,93,1,20,14,2,7,35,62, +3,53,52,46,2,39,51,30,3,21,2,43,42,90,140,97,174,94,137,88,43,43,88,137,94, +174,97,140,90,42,2,16,140,253,234,220,105,105,220,236,254,139,139,254,235, +221,105,105,220,234,254,139,0,0,0,0,1,0,33,2,178,2,253,5,129,0,14,0,107,64, +75,77,5,93,5,109,5,3,75,4,91,4,107,4,3,66,8,82,8,2,67,7,83,7,2,0,6,12,3,13, +95,4,1,15,4,1,4,3,32,2,48,2,2,2,14,47,10,63,10,2,10,9,8,191,13,207,13,2,16, +13,32,13,2,13,240,5,1,223,5,1,0,5,1,5,14,3,0,63,204,93,93,93,1,47,93,93,204, +51,204,93,221,204,93,51,204,113,114,18,23,57,49,48,93,93,93,93,1,37,23,5, +23,7,11,1,39,55,37,55,5,3,51,1,200,1,8,45,254,230,185,119,150,156,119,189, +254,232,45,1,11,12,136,4,90,103,132,73,250,72,1,2,255,0,72,248,73,134,107, +1,41,0,0,0,1,0,100,0,180,4,71,4,158,0,11,0,71,64,46,211,11,1,133,11,1,220, +4,1,138,4,1,9,1,170,6,16,2,32,2,2,2,217,2,1,56,2,136,2,2,2,0,4,173,9,214, +7,1,55,7,135,7,2,7,5,179,0,63,51,93,93,51,237,50,50,93,93,1,47,93,51,237, +50,49,48,93,93,93,93,1,17,35,17,33,53,33,17,51,17,33,21,2,159,147,254,88, +1,168,147,1,168,2,96,254,84,1,172,146,1,172,254,84,146,0,0,1,0,184,254,250, +1,129,0,219,0,12,0,78,185,0,4,255,224,183,11,17,72,10,151,0,150,7,184,255, +192,64,22,9,17,72,7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2, +12,184,255,192,64,14,38,41,72,12,64,13,16,72,12,7,168,0,155,11,0,47,253,228, +1,47,43,43,93,113,114,51,43,253,237,49,48,43,37,21,20,14,2,7,35,62,1,53,35, +53,1,129,9,20,29,20,123,45,49,88,219,168,53,87,75,66,32,65,132,65,219,0,0, +0,0,1,0,91,1,208,2,79,2,112,0,3,0,33,64,20,0,2,64,2,112,2,3,2,0,0,187,159, +1,207,1,2,47,1,1,1,0,47,93,113,237,1,47,47,93,49,48,19,53,33,21,91,1,244, +1,208,160,160,0,0,0,1,0,187,0,0,1,126,0,219,0,3,0,46,64,32,3,150,0,0,144, +0,2,64,0,80,0,176,0,224,0,240,0,5,144,0,160,0,2,0,64,13,16,72,0,1,155,0,0, +47,237,1,47,43,93,113,114,237,49,48,51,53,51,21,187,195,219,219,0,1,0,0,255, +236,2,57,5,204,0,3,0,51,64,26,121,0,137,0,2,1,24,13,17,72,41,2,1,2,16,0,2, +16,2,32,2,128,2,4,2,0,184,255,240,180,0,1,0,0,19,0,63,63,1,47,56,205,93,56, +49,48,93,43,93,21,1,51,1,1,155,158,254,105,20,5,224,250,32,0,0,2,0,80,255, +236,4,35,5,150,0,19,0,39,0,112,64,80,89,37,105,37,2,70,33,86,33,102,33,3, +86,27,102,27,2,89,23,105,23,2,4,18,1,118,17,134,17,2,121,13,137,13,2,11,12, +1,11,8,1,121,7,137,7,2,118,3,134,3,2,4,2,1,7,0,110,64,144,20,160,20,2,20, +41,128,30,110,63,10,1,10,25,115,15,7,35,115,5,25,0,63,237,63,237,1,47,93, +237,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93,93,93,93,93,1,20, +2,14,1,35,34,46,1,2,53,52,18,62,1,51,50,30,1,18,7,52,46,2,35,34,14,2,21,20, +30,2,51,50,62,2,4,35,77,133,180,102,103,178,131,75,75,132,180,106,101,177, +132,76,183,40,78,113,72,76,116,79,40,41,79,114,73,71,114,79,43,2,193,203, +254,235,171,74,74,170,1,21,204,213,1,23,166,67,67,166,254,233,213,168,223, +133,55,56,133,223,167,162,222,135,59,59,135,222,0,1,0,156,0,0,4,15,5,129, +0,10,0,94,64,32,32,9,128,9,2,9,9,8,110,2,144,4,1,4,47,1,143,1,2,1,1,4,6,3, +0,2,16,2,2,7,2,5,184,255,240,64,26,16,22,72,68,5,84,5,100,5,3,5,4,3,16,16, +22,72,4,3,6,6,8,1,116,0,24,0,63,237,50,63,51,51,43,47,51,93,43,1,47,94,93, +23,51,47,93,47,93,16,237,50,47,93,49,48,51,53,33,17,5,53,37,51,17,33,21,156, +1,103,254,194,1,77,166,1,87,153,4,60,227,170,229,251,24,153,0,0,0,1,0,103, +0,0,4,12,5,150,0,40,0,161,64,77,117,4,1,117,26,133,26,2,122,16,138,16,2,101, +37,1,86,37,1,41,33,89,33,105,33,3,105,35,1,28,35,1,25,21,1,117,27,133,27, +2,6,27,1,39,29,110,64,8,64,38,42,72,64,8,1,143,8,1,8,42,128,18,110,19,116, +38,132,38,2,19,38,16,0,32,0,2,0,184,255,192,64,31,30,38,72,0,8,38,142,18, +1,92,18,108,18,124,18,3,10,18,26,18,2,18,13,115,24,7,1,38,116,0,24,0,63,237, +57,63,237,51,93,93,93,18,57,1,47,43,93,51,51,93,47,237,26,16,220,93,113,43, +26,237,50,49,48,93,93,0,93,93,93,93,1,93,93,0,93,93,93,51,53,62,5,53,52,46, +2,35,34,14,2,7,39,62,3,51,50,30,2,21,20,14,6,7,33,21,103,51,147,162,159,128, +79,36,68,95,58,54,95,74,47,7,184,9,66,116,163,107,105,164,113,60,51,85,112, +122,124,109,86,24,2,223,127,117,179,145,124,124,136,86,60,91,62,31,30,60, +89,59,17,76,134,101,58,50,98,144,94,71,128,116,108,103,101,102,105,57,153, +0,0,0,0,1,0,78,255,236,4,25,5,150,0,59,0,216,64,149,122,3,138,3,2,117,2,133, +2,2,117,58,133,58,2,117,51,133,51,2,117,47,133,47,2,117,13,133,13,2,122,37, +138,37,2,91,17,107,17,2,26,41,1,21,8,1,118,46,134,46,2,7,46,1,73,39,1,38, +110,54,25,49,95,25,111,25,2,39,25,39,25,10,19,32,110,49,49,0,110,64,31,19, +47,19,159,19,3,144,19,1,19,61,128,11,110,239,10,1,63,10,1,10,54,25,116,26, +26,16,141,38,1,92,38,108,38,124,38,3,10,38,26,38,2,38,35,115,44,7,16,115, +129,11,1,83,11,99,11,115,11,3,20,11,1,5,11,1,11,5,25,0,63,51,93,93,93,93, +237,63,237,51,93,93,93,18,57,47,237,57,1,47,93,113,237,26,16,220,93,113,26, +237,50,47,237,17,18,57,57,47,47,93,17,18,57,237,113,49,48,0,93,93,93,93,1, +93,0,93,93,1,93,93,93,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53, +52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,14, +2,7,21,30,3,4,25,63,121,179,115,131,179,116,58,9,186,8,43,74,108,74,136,155, +69,103,121,51,102,98,51,110,91,59,133,131,119,147,12,181,11,80,123,158,89, +118,170,108,51,34,72,111,78,85,126,82,41,1,133,97,152,105,55,65,107,137,73, +17,56,92,66,36,134,132,78,95,53,18,156,21,55,94,73,113,131,122,111,14,93, +138,91,45,59,101,136,77,62,108,86,62,16,4,9,59,88,112,0,0,2,0,47,0,0,4,55, +5,129,0,10,0,23,0,117,64,80,154,15,1,153,6,1,136,6,1,133,16,149,16,2,118, +16,1,24,22,1,118,22,134,22,150,22,3,22,5,64,12,21,72,5,91,10,107,10,123,10, +3,10,8,1,111,23,6,31,2,1,112,2,224,2,2,0,2,16,2,48,2,80,2,224,2,5,8,2,0,4, +115,8,22,22,1,11,6,6,1,24,0,63,63,51,18,57,47,51,237,50,1,47,94,93,113,114, +51,51,237,50,50,93,47,43,51,93,113,49,48,93,93,93,93,0,93,1,17,35,17,33,53, +1,51,17,51,21,1,14,3,7,1,14,3,7,33,3,113,170,253,104,2,133,189,198,254,144, +2,16,20,21,8,254,151,5,19,20,20,6,1,242,1,63,254,193,1,63,140,3,182,252,76, +142,3,119,5,29,36,37,12,253,236,8,26,27,26,7,0,1,0,82,255,236,4,29,5,129, +0,44,0,181,64,28,86,13,102,13,134,13,3,85,2,101,2,2,90,3,106,3,2,85,43,101, +43,2,85,42,101,42,2,38,184,255,216,64,89,14,17,72,21,8,1,6,10,1,25,36,153, +36,2,137,36,217,36,2,3,68,33,1,6,35,32,14,17,72,35,11,0,110,64,31,21,1,47, +21,159,21,2,144,21,1,21,46,128,36,31,37,110,33,32,32,11,110,208,10,1,63,10, +1,10,26,115,40,40,16,36,116,33,6,16,115,115,11,131,11,2,103,11,1,22,11,1, +11,5,25,0,63,51,93,93,93,237,63,237,18,57,47,237,1,47,93,113,237,51,47,51, +237,50,50,26,16,220,93,113,114,26,237,17,57,43,49,48,95,113,95,113,114,0, +93,1,93,0,43,93,1,93,0,93,1,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50, +62,2,53,52,46,2,35,34,14,2,7,35,19,33,21,33,3,62,1,51,50,30,2,4,29,64,126, +187,123,111,165,114,67,14,182,11,40,69,101,72,70,114,81,44,42,78,113,72,45, +76,65,53,23,176,47,3,33,253,131,27,48,144,99,105,168,118,64,1,203,106,176, +127,70,52,91,122,70,21,40,75,59,35,43,84,122,79,65,109,79,44,16,28,37,20, +2,246,153,254,65,37,53,64,117,162,0,0,0,0,2,0,104,255,236,4,25,5,150,0,36, +0,56,0,175,64,48,140,21,1,122,22,138,22,2,89,7,105,7,2,90,3,106,3,122,3,3, +84,2,100,2,2,84,35,100,35,116,35,3,84,34,100,34,116,34,3,53,30,69,30,2,133, +50,1,50,184,255,240,64,45,10,13,72,132,26,1,37,26,53,26,69,26,117,26,4,22, +26,1,21,111,20,20,0,110,64,47,37,159,37,2,144,37,1,37,58,128,47,29,110,16, +10,32,10,2,10,184,255,192,64,24,30,38,72,10,29,42,117,32,32,52,24,115,25, +21,153,21,2,21,15,7,52,115,5,25,0,63,237,63,51,93,237,18,57,47,237,50,1,47, +43,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,93,93,43,93,0,93, +93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,46,1,2,53,52,18,62,1,51,50,30,2, +23,7,46,1,35,34,14,2,21,62,1,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51, +50,62,2,4,25,59,115,170,111,123,184,122,61,69,130,187,118,72,126,103,78,23, +172,28,123,81,74,120,84,45,49,178,115,96,156,111,61,183,36,72,106,70,49,100, +81,51,40,75,106,66,65,103,72,38,1,205,106,177,127,71,94,177,1,1,164,188,1, +28,190,96,30,67,110,80,31,91,81,70,139,210,140,91,95,62,117,167,112,73,118, +83,45,29,65,106,76,78,135,100,58,45,85,122,0,0,1,0,105,0,0,4,12,5,129,0,14, +0,68,64,45,122,11,138,11,2,105,11,1,5,110,6,6,0,80,12,1,16,12,32,12,2,12, +11,95,0,1,0,0,32,0,64,0,96,0,128,0,5,0,0,12,116,13,6,5,24,0,63,63,237,50, +1,47,93,113,51,47,93,113,18,57,47,237,49,48,93,93,1,6,10,2,21,35,52,26,2, +55,33,53,33,4,12,106,178,128,71,188,80,136,180,101,253,11,3,163,4,239,162, +254,213,254,209,254,193,180,169,1,69,1,57,1,46,147,153,0,0,0,0,3,0,89,255, +236,4,26,5,150,0,41,0,61,0,81,0,191,64,132,117,40,133,40,2,117,33,133,33, +2,117,29,133,29,2,117,28,133,28,2,117,24,133,24,2,122,23,138,23,2,122,19, +138,19,2,122,12,1,122,8,138,8,2,122,7,138,7,2,122,3,138,3,2,117,2,133,2,2, +85,69,101,69,2,85,75,101,75,2,90,65,106,65,2,52,110,21,42,110,31,15,36,31, +79,21,1,21,31,21,31,10,0,110,64,15,62,31,62,2,31,62,47,62,159,62,3,144,62, +1,62,83,128,72,110,208,10,1,10,36,15,67,117,57,57,77,47,117,26,7,77,117,5, +25,0,63,237,63,237,18,57,47,237,57,57,1,47,113,237,26,16,220,93,113,114,26, +237,17,57,57,47,47,113,18,57,57,16,237,16,237,49,48,93,93,93,93,0,93,93,1, +93,93,93,93,0,93,93,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3, +53,52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,3,52,46,2,35,34,14,2,21,20,30, +2,51,50,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,26,57,117,182, +124,124,181,119,57,47,79,101,54,59,93,63,33,57,112,166,109,115,169,111,54, +33,63,93,61,61,104,76,44,222,27,62,100,73,71,98,63,28,22,58,102,80,85,103, +55,17,35,28,68,115,86,79,111,69,32,32,70,114,81,82,112,68,29,1,137,90,151, +110,62,62,109,151,89,77,120,87,53,9,4,14,62,87,106,59,74,131,99,57,58,99, +132,74,58,106,87,61,12,4,10,53,87,120,2,76,53,88,63,35,35,63,88,53,42,88, +72,46,46,72,88,253,163,51,95,73,45,45,74,97,52,65,107,77,42,42,77,109,0,0, +0,2,0,96,255,236,4,18,5,150,0,36,0,56,0,190,64,105,169,39,1,163,11,1,149, +12,165,12,2,170,17,1,153,17,1,116,35,132,35,2,116,32,132,32,148,32,3,122, +31,138,31,154,31,3,122,27,138,27,154,27,3,123,26,139,26,155,26,3,90,40,106, +40,2,89,2,105,2,2,16,24,10,13,72,54,8,1,37,0,110,47,19,63,19,2,79,19,191, +19,2,0,19,32,19,48,19,64,19,176,19,5,7,19,58,11,111,10,10,47,110,32,29,1, +29,184,255,192,64,27,32,38,72,29,19,52,115,95,24,111,24,2,24,24,5,42,115, +34,7,14,115,23,11,1,11,5,25,0,63,51,93,237,63,237,17,57,47,93,237,50,1,47, +43,93,237,51,47,237,16,220,94,93,113,114,237,51,49,48,93,43,93,93,0,93,1, +93,93,0,93,93,1,93,93,0,93,93,1,93,1,20,2,14,1,35,34,46,2,39,55,30,1,51,50, +62,2,55,14,3,35,34,46,2,53,52,62,2,51,50,18,7,52,46,2,35,34,14,2,21,20,30, +2,51,50,62,2,4,18,71,132,189,118,81,130,102,72,22,172,28,119,91,73,121,85, +48,2,21,73,93,108,55,96,155,108,59,63,120,175,111,235,242,196,37,73,107,70, +65,104,72,39,35,70,104,69,50,103,83,53,2,221,188,254,229,188,94,33,70,112, +79,27,91,85,69,138,208,140,47,74,51,27,69,124,175,107,109,176,123,66,254, +164,175,78,138,102,59,46,85,122,75,71,122,89,51,34,70,107,0,0,0,0,2,0,187, +0,0,1,126,4,58,0,3,0,7,0,54,64,36,3,7,150,0,0,4,144,4,2,64,4,80,4,224,4,240, +4,4,144,4,160,4,2,4,64,13,16,72,4,5,156,4,0,156,1,15,0,63,237,47,237,1,47, +43,93,113,114,51,237,50,49,48,19,53,51,21,3,53,51,21,187,195,195,195,3,107, +207,207,252,149,207,207,0,0,0,2,0,184,254,250,1,129,4,58,0,12,0,16,0,89,185, +0,4,255,224,64,10,11,17,72,16,10,151,0,150,13,7,184,255,192,64,22,9,17,72, +7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2,12,184,255,192,64, +18,38,41,72,12,64,13,16,72,12,13,156,14,15,7,168,0,156,11,0,47,253,228,63, +237,1,47,43,43,93,113,114,51,43,51,253,237,51,49,48,43,37,21,20,14,2,7,35, +62,1,53,35,53,17,53,51,21,1,129,9,20,29,20,123,45,49,88,195,207,156,53,87, +75,66,32,65,132,65,207,2,156,207,207,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106, +185,0,5,255,216,64,17,18,22,72,3,40,18,22,72,0,40,18,22,72,137,0,1,1,184, +255,216,64,51,18,22,72,134,1,1,6,0,2,32,2,80,2,112,2,4,2,32,0,1,0,63,6,127, +6,143,6,3,6,48,2,112,2,128,2,3,2,1,0,15,4,63,4,111,4,159,4,207,4,5,4,0,25, +47,93,51,51,205,93,205,93,1,24,47,93,47,93,51,49,48,0,93,43,93,43,43,43,19, +53,1,21,9,1,21,101,3,227,252,166,3,90,2,59,205,1,162,154,254,146,254,145, +153,0,0,0,0,2,0,100,1,88,4,71,3,236,0,3,0,7,0,70,64,49,7,64,2,96,2,2,0,2, +32,2,112,2,208,2,4,2,4,223,0,1,32,0,1,0,4,173,31,5,47,5,95,5,111,5,223,5, +5,5,0,173,80,1,208,1,2,15,1,1,1,0,47,93,93,237,222,93,237,1,47,93,93,51,47, +93,113,51,49,48,19,53,33,21,1,53,33,21,100,3,227,252,29,3,227,3,88,148,148, +254,0,148,148,0,0,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106,185,0,1,255,216, +64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137,6,1,5,184,255,216,64,51,18, +22,72,134,5,1,0,6,32,6,80,6,112,6,4,6,3,32,0,1,0,6,5,48,4,112,4,128,4,3,4, +63,0,127,0,143,0,3,0,15,2,63,2,111,2,159,2,207,2,5,2,0,25,47,93,205,93,205, +93,51,51,1,24,47,93,51,47,93,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21, +101,3,90,252,166,3,227,154,153,1,111,1,110,154,254,94,205,0,2,0,84,0,0,4, +39,5,150,0,37,0,41,0,137,64,68,117,36,133,36,2,117,35,133,35,2,90,26,106, +26,2,90,21,1,90,14,122,14,138,14,3,90,13,122,13,138,13,3,58,6,74,6,2,9,72, +10,10,176,41,192,41,2,41,150,38,38,19,27,70,28,0,70,0,19,32,19,64,19,144, +19,176,19,5,19,184,255,192,64,23,38,44,72,19,19,33,95,10,143,10,2,10,39,156, +38,76,27,1,27,24,95,33,4,0,63,237,51,93,47,253,198,93,17,57,1,47,43,93,237, +47,237,18,57,47,237,113,51,47,237,49,48,0,93,1,93,93,0,93,93,93,1,93,1,20, +14,6,7,35,62,7,53,52,46,2,35,34,6,7,39,62,3,51,50,30,2,1,53,51,21,4,39,37, +62,79,82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184, +11,67,121,179,122,114,178,123,64,253,143,195,4,8,71,108,85,67,60,58,68,83, +55,69,104,80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103, +148,251,157,201,201,0,0,0,0,2,0,161,254,229,7,110,5,204,0,93,0,114,1,101, +64,255,122,17,138,17,2,117,15,133,15,2,117,27,133,27,2,121,47,137,47,2,116, +38,132,38,2,102,38,1,99,70,1,86,69,102,69,2,123,26,139,26,2,73,26,1,74,56, +90,56,106,56,3,59,102,1,82,63,1,54,63,70,63,2,82,64,1,38,64,54,64,70,64,3, +131,3,1,37,3,53,3,69,3,3,37,2,53,2,69,2,133,2,4,25,8,57,8,2,11,8,1,11,8,27, +8,2,8,32,12,17,72,22,92,102,92,134,92,3,80,58,96,58,2,5,58,21,58,53,58,69, +58,4,137,57,1,93,57,1,10,57,26,57,2,9,7,1,125,52,141,52,2,11,52,75,52,2,10, +22,26,22,42,22,3,104,212,24,37,41,211,10,112,34,132,72,1,72,10,49,80,24,1, +80,24,1,24,10,24,10,82,0,210,64,95,49,111,49,2,143,49,159,49,2,49,116,128, +61,210,0,82,16,82,32,82,3,82,44,213,5,5,107,214,19,99,214,29,36,29,47,19, +63,19,79,19,3,32,29,48,29,64,29,3,19,29,19,29,77,54,214,89,0,149,71,1,71, +66,214,77,0,47,237,51,93,63,237,18,57,57,47,47,93,93,17,51,16,237,16,237, +51,47,237,1,47,93,237,26,16,220,93,113,26,237,18,57,57,47,47,93,114,17,18, +57,93,50,50,16,237,50,16,237,49,48,93,93,93,93,0,93,93,93,1,93,93,93,43,93, +0,93,93,1,93,93,93,0,93,93,1,93,93,0,93,93,1,93,93,0,93,93,1,93,93,93,0,93, +1,93,0,93,1,20,14,2,35,34,46,2,53,52,54,55,35,14,3,35,34,46,2,53,52,62,2, +51,50,30,2,23,51,55,51,3,14,1,21,20,22,51,50,62,2,53,52,46,2,35,34,14,4,21, +20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,62,2,36,51,50,4,22,18, +5,52,46,2,35,34,14,2,21,20,22,51,50,62,2,55,62,1,7,110,67,118,165,97,56,79, +50,22,2,1,6,24,69,93,117,71,84,125,81,40,71,132,185,114,60,96,73,54,18,6, +39,156,116,19,18,43,38,62,107,79,45,83,161,238,156,134,227,184,139,94,48, +86,165,243,158,105,182,152,120,44,55,50,135,166,196,111,190,254,217,203,105, +63,118,170,215,0,255,144,201,1,36,191,92,253,162,34,63,89,56,86,130,87,45, +95,99,69,120,96,70,18,9,14,2,243,144,239,172,96,27,47,64,38,15,43,12,45,89, +69,43,58,103,141,83,120,221,169,102,27,48,67,40,160,254,6,84,120,49,48,46, +81,142,192,112,129,222,162,92,64,116,161,192,219,115,141,238,171,96,33,48, +57,24,112,30,63,52,33,115,206,1,28,169,139,1,0,220,180,128,70,118,200,254, +248,155,50,84,60,33,85,138,173,87,120,136,62,102,132,71,36,80,0,0,0,0,2,0, +4,0,0,5,82,5,129,0,7,0,20,1,18,64,206,102,2,118,2,134,2,3,102,19,118,19,134, +19,3,105,1,121,1,137,1,3,105,20,121,20,137,20,3,115,6,131,6,2,101,6,1,124, +5,140,5,2,106,5,1,122,0,138,0,2,57,0,89,0,105,0,3,117,3,133,3,2,54,3,86,3, +102,3,3,90,4,1,72,4,1,85,7,1,71,7,1,19,2,3,1,20,0,21,6,37,6,53,6,3,6,6,1, +230,6,246,6,2,26,5,42,5,58,5,3,9,5,1,233,5,249,5,2,6,5,13,13,4,26,0,42,0, +58,0,3,9,0,1,233,0,249,0,2,0,16,7,32,7,48,7,3,32,7,1,7,7,22,21,3,37,3,53, +3,3,6,3,1,230,3,246,3,2,3,175,4,191,4,2,4,80,22,176,22,2,48,22,96,22,144, +22,192,22,240,22,5,47,22,1,1,2,95,20,19,19,118,13,1,13,5,3,4,0,18,0,63,50, +63,51,93,57,47,51,237,50,1,93,93,113,47,93,51,93,113,113,17,51,47,93,113, +51,93,113,113,18,57,61,47,51,51,93,113,113,93,113,113,18,57,57,18,57,57,49, +48,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,3,33,3,35,1,51,9,1, +46,3,39,14,3,7,3,33,4,143,161,253,126,162,198,2,63,217,2,54,253,174,16,29, +22,15,1,2,14,23,29,15,180,2,15,1,156,254,100,5,129,250,127,4,2,40,82,67,45, +5,5,46,68,82,40,254,49,0,3,0,168,0,0,4,234,5,129,0,22,0,33,0,46,0,155,64, +108,155,24,171,24,2,147,32,1,133,32,1,147,45,1,117,45,133,45,2,122,36,138, +36,154,36,3,5,11,21,11,37,11,3,6,2,22,2,38,2,3,171,18,1,159,18,1,107,18,123, +18,139,18,3,18,28,13,90,23,64,13,17,72,23,23,41,0,90,64,31,34,47,34,2,175, +34,1,34,48,128,28,41,90,0,6,16,6,64,6,3,7,6,18,40,95,127,28,1,28,28,41,27, +95,7,3,41,95,6,18,0,63,237,63,237,18,57,47,113,237,57,1,47,94,93,237,50,26, +16,220,93,113,26,237,18,57,47,43,237,17,57,93,93,93,49,48,93,93,0,93,93,93, +93,93,93,1,20,14,2,35,33,17,33,50,30,2,21,20,14,2,7,30,3,1,52,38,35,33,17, +33,50,62,2,19,52,46,2,35,33,17,33,50,62,2,4,234,84,142,188,104,253,196,2, +0,117,184,128,67,33,67,101,67,85,131,88,46,254,238,156,148,254,191,1,65,84, +116,72,32,81,49,92,129,80,254,156,1,115,73,123,89,50,1,141,107,151,95,44, +5,129,39,84,129,90,59,104,85,61,15,10,58,90,119,2,66,114,98,254,66,33,61, +86,253,190,67,94,60,28,254,4,24,60,100,0,1,0,104,255,236,5,121,5,150,0,39, +0,173,64,79,121,14,137,14,2,117,13,133,13,2,123,37,139,37,2,106,38,1,124, +36,140,36,2,106,36,1,106,28,1,85,7,1,90,3,1,42,29,106,29,2,134,23,1,42,23, +106,23,2,5,8,21,8,2,5,2,21,2,2,5,91,80,26,96,26,2,175,26,191,26,2,32,26,1, +15,26,1,26,34,16,184,255,192,64,42,7,13,72,16,16,41,32,41,1,79,35,1,35,35, +0,95,31,4,0,15,16,15,2,48,15,64,15,112,15,128,15,192,15,208,15,6,15,15,10, +95,21,19,0,63,237,51,47,93,113,63,237,51,47,93,1,93,17,51,47,43,51,47,93, +93,93,113,237,49,48,93,93,93,93,93,0,93,93,1,93,93,93,93,0,93,93,1,93,1,34, +14,2,21,20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50, +4,23,7,46,3,3,24,120,185,125,64,69,129,187,117,82,135,109,86,33,156,38,112, +151,191,118,171,254,255,173,86,91,175,1,0,164,225,1,46,71,181,20,68,102,137, +4,250,80,148,208,127,127,211,152,84,43,78,107,65,78,79,136,100,57,109,195, +1,12,159,165,1,10,187,101,176,173,60,50,91,70,42,0,2,0,168,0,0,5,101,5,129, +0,12,0,25,0,100,64,70,169,24,1,123,24,1,172,23,1,27,23,43,23,59,23,123,23, +4,169,16,1,27,16,43,16,59,16,123,16,4,123,15,1,153,3,1,121,2,1,0,90,64,47, +13,1,13,27,128,64,27,1,20,90,0,6,16,6,64,6,3,7,6,19,95,7,3,20,95,6,18,0,63, +237,63,237,1,47,94,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93, +93,93,93,1,20,2,14,1,35,33,17,33,50,4,22,18,7,52,46,2,35,33,17,33,50,62,2, +5,101,106,184,251,145,253,241,1,210,163,1,19,198,111,192,82,148,206,123,254, +241,1,58,111,189,138,78,2,207,176,254,243,181,93,5,129,81,169,254,252,180, +143,203,130,61,251,177,72,142,212,0,0,1,0,168,0,0,4,254,5,129,0,11,0,77,181, +7,3,7,3,0,10,184,255,192,64,37,7,11,72,10,10,13,5,9,90,0,0,16,0,64,0,3,7, +0,32,13,1,8,95,127,5,1,5,5,9,4,95,1,3,9,95,0,18,0,63,237,63,237,18,57,47, +113,237,1,93,47,94,93,237,50,17,51,47,43,18,57,57,47,47,49,48,51,17,33,21, +33,17,33,21,33,17,33,21,168,4,45,252,146,3,50,252,206,3,151,5,129,156,254, +60,154,254,21,156,0,0,1,0,168,0,0,4,145,5,129,0,9,0,105,185,0,2,255,192,182, +13,24,72,2,2,6,8,184,255,192,64,58,7,12,72,8,8,11,1,5,90,0,6,16,6,64,6,3, +7,6,48,11,1,4,95,239,1,1,15,1,63,1,111,1,127,1,159,1,175,1,207,1,223,1,8, +8,1,64,23,30,72,1,1,5,0,95,7,3,5,18,0,63,63,237,18,57,47,43,94,93,113,237, +1,93,47,94,93,237,50,17,51,47,43,18,57,47,43,49,48,1,17,33,21,33,17,35,17, +33,21,1,103,3,18,252,238,191,3,233,4,229,253,244,158,253,197,5,129,156,0, +1,0,103,255,236,5,160,5,150,0,45,0,185,64,130,134,43,1,106,43,1,66,37,82, +37,2,5,24,21,24,85,24,3,86,23,1,86,19,1,5,18,21,18,85,18,3,122,12,138,12, +2,89,12,105,12,2,106,3,1,106,2,1,73,37,89,37,2,53,29,1,123,13,139,13,2,64, +10,1,10,10,36,92,31,64,33,33,0,127,31,143,31,2,31,47,128,32,47,96,47,128, +47,3,21,91,175,0,191,0,2,32,0,1,15,0,1,0,33,95,240,34,1,34,34,5,26,95,41, +19,16,95,5,48,11,64,11,2,144,11,224,11,2,11,11,5,4,0,63,51,47,93,113,16,237, +63,237,17,57,47,93,237,1,47,93,93,93,237,93,26,16,204,93,17,57,47,26,16,237, +50,47,93,49,48,0,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,19,52,18,54, +36,51,50,30,2,23,7,46,3,35,34,14,2,21,20,30,2,51,50,62,2,55,53,33,53,33,17, +14,3,35,34,36,38,2,103,89,177,1,6,173,130,196,144,100,35,182,26,73,104,137, +88,128,189,124,61,66,130,193,127,83,140,113,86,29,254,91,2,85,47,127,158, +188,107,178,254,246,177,89,2,199,165,1,10,187,101,46,86,123,77,54,52,85,60, +33,80,148,208,127,127,211,153,85,28,45,55,28,254,160,254,26,48,87,66,38,109, +195,1,12,0,0,0,0,1,0,168,0,0,5,32,5,129,0,11,0,103,64,29,11,90,64,8,143,0, +159,0,175,0,223,0,4,0,13,128,64,13,1,64,13,192,13,208,13,224,13,4,13,184, +255,192,64,37,14,17,72,7,3,90,0,4,16,4,64,4,3,7,4,2,95,80,7,1,176,7,224,7, +2,15,7,1,8,7,7,9,5,3,4,0,18,0,63,50,63,51,57,47,94,93,93,113,237,1,47,94, +93,237,50,43,93,113,26,16,220,93,50,26,237,49,48,33,17,33,17,35,17,51,17, +33,17,51,17,4,97,253,6,191,191,2,250,191,2,141,253,115,5,129,253,172,2,84, +250,127,0,0,0,1,0,189,0,0,1,124,5,129,0,3,0,122,64,70,3,90,15,0,1,12,0,0, +1,61,16,0,32,0,208,0,3,96,0,112,0,2,0,0,16,0,64,0,80,0,176,0,5,7,0,175,5, +1,0,5,160,5,176,5,3,0,5,16,5,64,5,80,5,160,5,176,5,192,5,240,5,8,32,5,144, +5,240,5,3,5,184,255,192,179,56,61,72,5,184,255,192,179,45,48,72,5,184,255, +192,182,13,16,72,1,3,0,18,0,63,63,1,43,43,43,93,113,114,93,47,94,93,113,114, +94,93,94,93,237,49,48,51,17,51,17,189,191,5,129,250,127,0,0,0,1,0,32,255, +236,3,104,5,129,0,21,0,124,64,15,137,2,1,130,5,1,123,10,1,100,6,116,6,2,6, +184,255,224,64,66,14,17,72,0,14,32,14,2,128,14,144,14,224,14,240,14,4,14, +14,3,17,90,64,64,12,80,12,96,12,3,111,12,1,12,23,128,15,3,1,3,32,23,1,32, +23,64,23,80,23,96,23,4,14,95,15,3,9,95,0,64,4,1,4,4,0,19,0,63,50,47,93,16, +237,63,237,1,93,113,47,113,26,16,220,93,113,26,237,18,57,47,93,113,49,48, +0,43,1,93,93,93,0,93,5,34,38,39,55,30,3,51,50,54,53,17,33,53,33,17,20,14, +2,1,201,171,219,35,187,10,46,64,78,41,104,120,254,241,1,205,56,107,154,20, +178,192,31,65,93,60,28,143,138,3,69,156,252,35,101,162,115,62,0,1,0,168,0, +0,5,63,5,129,0,11,0,154,64,103,171,1,1,157,1,1,138,8,154,8,2,138,1,154,1, +170,1,3,102,2,1,131,7,147,7,2,100,7,1,157,0,173,0,2,107,0,123,0,139,0,3,89, +0,1,86,10,1,155,10,1,36,10,1,1,10,106,8,250,8,2,8,10,144,9,160,9,2,9,9,0, +11,16,0,11,1,11,11,13,7,2,3,90,0,4,16,4,64,4,3,7,4,7,10,1,2,4,4,8,5,3,0,4, +18,0,63,51,63,51,18,23,57,1,47,94,93,237,50,50,17,51,47,93,56,51,57,47,93, +57,51,113,17,51,49,48,0,93,93,1,93,93,93,93,0,93,93,93,1,93,93,0,93,93,33, +1,7,17,35,17,51,17,1,51,9,1,4,82,253,205,184,191,191,2,167,225,253,168,2, +168,2,168,140,253,228,5,129,253,62,2,194,253,156,252,227,0,0,0,0,1,0,168, +0,0,4,47,5,129,0,5,0,56,64,40,16,4,48,4,2,0,4,16,4,32,4,64,4,96,4,128,4,160, +4,240,4,8,4,3,90,0,0,16,0,64,0,3,7,0,1,3,3,95,0,18,0,63,237,63,1,47,94,93, +237,47,93,113,49,48,51,17,51,17,33,21,168,191,2,200,5,129,251,27,156,0,0, +0,0,1,0,168,0,0,6,2,5,129,0,44,2,44,64,12,152,41,1,151,31,1,12,16,18,24,72, +12,184,255,240,179,13,17,72,13,184,255,240,64,27,18,24,72,40,13,1,13,16,13, +17,72,42,32,33,37,72,42,32,18,28,72,42,32,9,17,72,30,184,255,224,179,33,37, +72,30,184,255,224,179,18,28,72,30,184,255,224,64,255,9,17,72,13,12,36,36, +27,44,92,42,36,0,52,0,2,212,0,1,139,0,155,0,2,4,0,1,8,0,46,139,46,1,116,46, +1,59,46,1,203,46,1,180,46,1,11,46,1,207,171,46,1,52,46,1,32,46,1,20,46,1, +0,46,1,244,46,1,208,46,1,196,46,1,176,46,1,116,46,132,46,164,46,3,96,46,1, +84,46,1,64,46,1,52,46,1,16,46,1,4,46,1,151,240,46,1,180,46,196,46,228,46, +3,160,46,1,116,46,148,46,2,80,46,1,68,46,1,48,46,1,4,46,36,46,2,244,46,1, +224,46,1,180,46,212,46,2,144,46,1,132,46,1,112,46,1,52,46,68,46,100,46,3, +32,46,1,20,46,1,244,46,1,208,46,1,116,46,132,46,164,46,196,46,4,96,46,1,52, +46,84,46,2,16,46,1,4,46,1,103,116,46,148,46,180,46,196,46,228,46,5,80,46, +1,4,46,36,46,68,46,3,20,46,52,46,68,46,100,46,132,46,180,46,212,46,244,46, +8,164,46,196,46,244,46,3,139,46,1,4,46,52,46,84,46,116,46,4,55,64,83,228, +46,1,203,46,1,36,46,68,46,116,46,148,46,180,46,5,11,46,1,212,46,244,46,2, +187,46,1,100,46,132,46,2,75,46,1,20,46,52,46,2,251,46,1,164,46,196,46,228, +46,3,128,46,1,2,64,46,80,46,112,46,3,63,46,1,0,46,32,46,2,30,27,92,0,28,64, +28,2,7,28,6,21,21,184,255,192,64,16,18,37,72,42,21,29,3,75,36,1,0,13,36,3, +28,18,0,63,23,51,93,63,51,51,43,17,51,1,47,94,93,237,50,93,93,93,95,93,93, +93,113,113,113,113,113,114,114,114,114,94,93,93,93,113,114,114,114,94,93, +93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114, +114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,94,93, +93,93,113,113,113,16,220,94,93,93,93,113,50,237,18,57,61,47,51,51,49,48,43, +43,43,43,43,43,43,93,43,43,43,93,93,33,17,52,54,55,54,55,6,7,14,1,7,1,35, +1,46,3,39,38,39,22,23,30,1,21,17,35,17,51,1,30,3,23,62,3,55,1,51,17,5,86, +2,2,2,3,14,15,13,31,15,254,148,134,254,143,6,13,15,15,7,17,16,1,2,2,2,170, +251,1,119,7,20,18,15,3,3,16,21,20,8,1,112,245,3,172,51,106,44,51,48,51,50, +43,97,39,252,64,3,192,15,40,45,47,23,53,57,56,55,47,103,39,252,84,5,129,252, +47,20,63,66,59,16,16,60,66,62,20,3,209,250,127,0,0,0,0,1,0,168,0,0,5,32,5, +129,0,19,0,196,185,0,10,255,224,64,39,12,43,72,54,10,70,10,2,0,32,12,43,72, +41,0,57,0,73,0,3,11,16,29,33,72,11,32,18,28,72,150,11,166,11,2,41,11,1,1, +184,255,240,179,29,33,72,1,184,255,224,64,53,18,28,72,154,1,170,1,2,3,38, +1,1,19,92,0,68,16,84,16,148,16,3,224,16,1,2,0,16,48,16,64,16,112,16,192,16, +208,16,6,16,64,21,1,64,21,192,21,208,21,224,21,4,21,184,255,192,64,16,14, +17,72,10,7,92,0,8,16,8,64,8,3,7,8,1,184,255,192,64,16,29,43,72,17,1,9,3,11, +64,29,43,72,11,0,8,18,0,63,51,51,43,63,51,51,43,1,47,94,93,237,50,43,93,113, +47,93,95,93,113,51,237,49,48,0,93,95,93,43,43,93,93,43,43,1,93,43,93,43,33, +1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,4,58,253,14,2,3,2,3, +170,222,2,250,3,3,2,4,172,4,176,49,48,41,91,35,252,88,5,129,251,72,49,49, +42,99,45,3,156,250,127,0,0,0,0,2,0,97,255,236,5,215,5,150,0,19,0,39,0,108, +64,74,91,37,1,26,37,1,9,37,1,82,33,1,21,33,1,7,33,1,84,27,1,21,27,1,91,23, +1,25,23,1,102,17,1,104,12,1,0,91,64,15,20,1,20,41,128,32,41,128,41,2,30,91, +175,10,191,10,2,32,10,1,15,10,31,10,2,10,25,95,15,4,35,95,5,19,0,63,237,63, +237,1,47,93,93,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93,93, +93,93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,215,95,180,254,252,165,174,254,250, +174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63,65, +127,189,123,132,191,123,59,2,199,165,254,242,192,104,109,195,1,12,159,165, +1,10,187,101,102,188,254,246,163,127,208,148,80,80,148,208,127,127,211,153, +85,86,153,212,0,2,0,168,0,0,4,234,5,129,0,14,0,23,0,117,64,83,169,2,1,147, +23,1,155,16,171,16,2,10,3,26,3,42,3,3,5,12,21,12,37,12,3,0,90,64,15,25,128, +64,25,1,64,25,1,20,7,90,0,8,16,8,64,8,3,8,6,95,31,20,47,20,79,20,95,20,127, +20,5,15,20,207,20,255,20,3,7,20,64,9,17,72,20,20,7,19,95,9,3,7,18,0,63,63, +237,18,57,47,43,94,93,113,237,1,47,93,237,50,93,113,26,16,220,26,237,49,48, +0,93,93,93,93,93,1,20,14,2,35,33,17,35,17,33,50,30,2,7,52,38,35,33,17,33, +50,54,4,234,61,121,182,121,254,98,191,2,81,125,186,124,62,192,164,164,254, +133,1,131,165,155,3,217,92,159,117,68,253,219,5,129,61,111,157,97,134,139, +253,212,146,0,0,0,2,0,97,254,125,5,215,5,150,0,36,0,56,0,162,64,113,108,20, +124,20,140,20,3,104,24,1,104,29,1,101,34,1,87,6,1,85,49,1,90,39,1,90,45,1, +108,19,124,19,140,19,3,26,19,90,19,2,26,40,90,40,2,21,44,85,44,2,26,54,90, +54,2,8,54,1,21,50,85,50,2,7,50,1,13,13,22,5,27,0,91,64,15,37,1,37,58,128, +47,91,175,27,191,27,2,32,27,1,15,27,31,27,2,27,32,58,128,58,2,42,95,32,4, +52,95,5,22,19,10,95,17,0,47,237,63,51,237,63,237,1,93,47,93,93,93,237,26, +16,220,113,26,237,17,57,57,50,47,49,48,93,93,93,93,93,93,0,93,93,93,93,93, +1,93,93,93,0,93,93,1,20,14,2,7,30,3,51,50,54,55,21,14,1,35,34,46,2,39,46, +2,2,53,52,18,54,36,51,50,4,22,18,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62, +2,5,215,77,145,211,134,21,53,68,83,51,28,64,23,38,91,49,86,128,97,70,27,158, +239,159,80,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63, +65,127,189,123,132,191,123,59,2,199,149,247,186,117,18,64,90,57,27,8,5,134, +9,13,51,95,138,87,8,115,193,1,3,152,165,1,10,187,101,102,188,254,246,163, +127,208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,0,0,2,0,168,0,0, +5,104,5,129,0,17,0,30,0,210,64,62,169,13,1,138,20,154,20,170,20,3,148,29, +1,117,29,133,29,2,174,0,1,157,0,1,124,0,140,0,2,74,0,90,0,106,0,3,3,160,1, +1,114,1,130,1,146,1,3,2,99,1,1,64,1,1,51,1,1,37,1,1,3,16,184,255,112,64,87, +17,73,112,16,128,16,144,16,3,84,16,100,16,2,66,16,1,2,35,16,51,16,2,1,16, +16,25,18,90,11,11,0,0,17,48,17,64,17,96,17,144,17,160,17,6,17,64,32,144,32, +160,32,3,25,3,90,0,4,16,4,64,4,3,7,4,16,2,95,47,25,95,25,111,25,143,25,4, +25,25,0,24,95,5,3,4,0,18,0,63,50,63,237,18,57,47,93,237,50,1,47,94,93,237, +50,93,47,93,51,57,47,237,18,57,17,51,49,48,93,95,93,93,93,43,95,93,93,93, +93,95,93,93,95,93,93,93,93,0,93,93,93,93,33,1,33,17,35,17,33,50,30,2,21,20, +14,2,7,1,3,52,46,2,35,33,17,33,50,62,2,4,140,254,146,254,73,191,2,151,120, +185,126,66,39,84,130,91,1,144,248,44,84,120,76,254,59,1,205,82,120,77,37, +2,73,253,183,5,129,55,104,150,94,67,130,108,78,16,253,161,3,236,64,94,63, +31,253,248,41,72,98,0,0,0,0,1,0,93,255,236,4,248,5,150,0,63,0,226,64,110, +150,62,1,68,62,1,166,59,1,134,54,1,132,49,1,151,40,1,169,33,1,11,33,27,33, +43,33,155,33,4,89,29,169,29,2,139,17,1,139,7,1,150,2,1,4,2,20,2,2,132,58, +1,96,54,1,105,21,1,118,17,1,42,90,41,41,0,90,64,176,19,1,19,65,128,9,90,8, +64,16,19,72,8,8,52,90,0,31,16,31,64,31,3,7,31,19,16,19,22,72,120,19,136,19, +152,19,3,59,19,1,52,184,255,240,64,47,19,22,72,119,52,135,52,151,52,3,58, +52,1,19,52,5,47,95,111,42,1,89,42,1,75,42,1,6,42,1,42,36,4,14,95,96,9,1,82, +9,1,68,9,1,9,5,19,0,63,51,93,93,93,237,63,51,93,93,93,93,237,18,57,57,93, +93,43,93,93,43,1,47,94,93,237,51,47,43,237,26,16,220,93,26,237,50,47,237, +49,48,0,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,20,14,2,35, +32,36,39,55,30,3,51,50,62,2,53,52,46,2,39,46,5,53,52,62,2,51,50,30,2,23,7, +46,3,35,34,14,2,21,20,30,2,23,30,5,4,248,69,144,219,150,254,249,254,218,40, +185,14,58,99,146,102,85,142,102,57,63,114,158,96,59,119,109,96,70,40,81,144, +196,114,131,186,128,77,23,188,14,53,86,123,83,98,133,81,35,63,108,142,80, +65,129,118,103,76,43,1,133,89,150,109,61,184,174,37,55,90,65,36,29,60,95, +66,69,86,56,38,22,13,31,43,58,81,107,70,100,143,92,42,41,82,121,80,33,51, +80,54,28,35,60,81,47,63,81,54,36,18,15,31,43,58,84,114,0,0,0,1,0,46,0,0,4, +180,5,129,0,7,1,212,64,255,9,9,1,201,9,217,9,249,9,3,187,9,1,73,9,89,9,121, +9,137,9,4,59,9,1,9,9,25,9,2,246,9,1,153,9,201,9,2,139,9,1,9,9,25,9,73,9,105, +9,4,199,217,9,233,9,2,203,9,1,182,9,1,41,9,89,9,105,9,137,9,153,9,5,27,9, +1,6,9,1,25,9,41,9,89,9,121,9,153,9,169,9,217,9,7,233,9,249,9,2,219,9,1,169, +9,1,150,9,1,57,9,105,9,2,45,9,1,1,11,9,1,151,107,9,123,9,139,9,171,9,187, +9,235,9,251,9,7,84,9,1,11,9,43,9,59,9,3,187,9,251,9,2,164,9,1,59,9,75,9,123, +9,3,36,9,1,139,9,155,9,187,9,203,9,251,9,5,127,9,1,2,79,9,95,9,2,48,9,1,15, +9,1,103,207,9,223,9,2,176,9,1,15,9,79,9,95,9,143,9,4,240,9,1,159,9,175,9, +207,9,223,9,4,112,9,1,95,9,1,64,9,1,31,9,1,31,9,63,9,95,9,111,9,159,9,223, +9,239,9,7,0,9,1,55,239,9,1,128,64,93,9,144,9,208,9,3,111,9,1,80,9,1,47,9, +1,0,9,1,208,9,1,175,9,1,144,9,1,111,9,127,9,2,16,9,32,9,64,9,80,9,4,255,9, +1,224,9,1,191,9,1,64,9,96,9,144,9,160,9,4,63,9,1,32,9,1,15,9,1,7,3,5,4,14, +1,90,2,64,2,7,14,112,7,160,7,176,7,3,32,7,128,7,2,7,184,255,192,64,15,23, +28,72,7,32,2,1,2,0,4,95,5,3,1,18,0,63,63,237,50,1,47,93,204,43,93,113,43, +1,26,24,16,77,253,228,50,95,94,93,93,93,93,93,93,93,113,113,113,113,113,114, +114,114,114,114,114,94,93,93,113,113,113,113,113,113,114,114,114,94,93,93, +93,95,93,93,113,113,113,113,114,114,114,94,93,95,93,93,93,93,93,93,113,114, +114,114,114,114,114,94,93,93,93,93,113,113,113,113,113,114,49,48,1,17,35, +17,33,53,33,21,2,208,190,254,28,4,134,4,229,251,27,4,229,156,156,0,0,0,0, +1,0,158,255,236,5,41,5,129,0,25,0,136,64,61,89,23,105,23,2,89,3,105,3,2,89, +2,105,2,2,69,16,1,69,10,1,21,90,64,64,18,80,18,160,18,3,48,18,144,18,240, +18,3,143,18,159,18,175,18,3,18,27,128,64,27,1,64,27,192,27,208,27,224,27, +4,27,184,255,192,64,36,14,17,72,8,90,79,5,95,5,111,5,3,143,5,159,5,2,207, +5,1,0,5,16,5,64,5,3,7,5,19,6,3,13,95,0,19,0,63,237,63,51,1,47,94,93,93,113, +114,237,43,93,113,26,16,220,93,113,114,26,237,49,48,0,93,93,93,93,93,5,34, +46,2,53,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,14,2,2,219,116,208,157, +92,191,57,102,139,83,82,146,110,63,190,93,160,215,20,62,131,201,138,3,129, +252,143,107,149,94,43,44,96,155,111,3,100,252,145,141,207,136,66,0,1,0,9, +0,0,5,77,5,129,0,16,0,235,64,181,74,14,90,14,106,14,3,69,4,85,4,101,4,3,140, +15,1,58,15,90,15,106,15,122,15,4,131,3,1,53,3,85,3,101,3,117,3,4,116,0,132, +0,2,9,0,1,140,1,1,123,1,1,6,1,1,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0, +37,0,53,0,3,6,0,1,230,0,246,0,2,1,0,9,9,2,26,15,42,15,58,15,3,3,8,15,1,232, +15,248,15,2,15,52,16,84,16,2,32,16,1,2,16,16,1,48,16,96,16,144,16,192,16, +240,16,5,16,21,3,37,3,53,3,3,6,3,1,230,3,246,3,2,3,175,2,191,2,2,2,32,18, +80,18,2,48,18,96,18,144,18,192,18,240,18,5,47,18,1,15,2,3,121,9,1,9,1,18, +0,63,51,93,63,51,1,93,93,113,47,93,51,93,113,113,47,93,113,95,113,113,51, +93,113,95,113,18,57,61,47,51,51,93,113,113,93,113,113,49,48,93,93,93,93,93, +93,93,93,93,93,93,33,35,1,51,1,30,1,23,22,23,54,55,62,1,55,1,51,3,14,198, +253,193,201,1,134,15,30,12,14,13,12,14,12,29,17,1,132,201,5,129,252,32,45, +89,35,41,39,37,41,35,88,48,3,224,0,0,1,0,9,0,0,7,134,5,129,0,46,4,87,64,73, +121,44,1,117,17,1,123,2,139,2,2,73,2,1,116,12,132,12,2,70,12,1,122,30,138, +30,2,73,30,89,30,105,30,3,117,31,133,31,2,71,31,87,31,103,31,3,142,45,1,91, +45,107,45,123,45,3,129,16,1,100,16,116,16,2,85,16,1,1,32,13,17,72,13,184, +255,224,64,255,13,17,72,131,0,1,117,0,1,68,0,84,0,100,0,3,54,0,1,140,14,1, +122,14,1,75,14,91,14,107,14,3,14,16,9,12,72,26,14,42,14,58,14,3,9,14,1,233, +14,249,14,2,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,14,13,22,26,30,42, +30,58,30,3,9,30,1,233,30,249,30,2,21,31,37,31,53,31,3,6,31,1,230,31,246,31, +2,31,30,7,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0,37,0,53,0,3,6,0,1,230, +0,246,0,2,1,0,39,123,39,1,116,22,132,22,2,22,7,39,39,7,22,3,15,26,45,42,45, +58,45,3,3,8,45,1,232,45,248,45,2,45,219,46,1,207,46,1,187,46,1,175,46,1,155, +46,1,143,46,1,123,46,1,111,46,1,91,46,1,79,46,1,2,79,46,143,46,175,46,3,46, +64,25,28,72,32,46,48,46,2,15,46,1,9,46,5,16,1,229,16,245,16,2,182,16,198, +16,214,16,3,3,16,8,15,56,15,120,15,136,15,152,15,184,15,6,12,15,64,64,255, +25,38,72,15,119,48,151,48,215,48,3,54,48,70,48,86,48,3,23,48,39,48,2,6,48, +1,55,48,103,48,119,48,167,48,183,48,199,48,231,48,247,48,8,38,48,1,7,48,23, +48,2,201,199,48,215,48,231,48,3,120,48,152,48,168,48,184,48,4,105,48,1,40, +48,56,48,88,48,3,25,48,1,7,48,1,232,48,1,217,48,1,168,48,200,48,2,153,48, +1,138,48,1,88,48,104,48,2,73,48,1,55,48,1,8,48,24,48,2,231,48,1,200,48,1, +167,48,1,8,48,24,48,40,48,72,48,136,48,5,153,199,48,1,88,48,104,48,136,48, +152,48,168,48,5,73,48,1,40,48,1,9,48,25,48,2,216,48,232,48,2,203,48,1,154, +48,170,48,186,48,3,139,48,1,48,192,124,127,72,57,48,1,42,48,1,25,48,1,10, +48,1,249,48,1,234,48,1,217,48,1,202,48,1,184,48,1,137,48,153,48,169,48,3, +120,48,1,105,48,1,58,48,74,48,90,48,3,41,48,1,26,48,1,12,48,1,104,253,48, +1,236,48,1,221,48,1,204,48,1,64,255,189,48,1,171,48,1,156,48,1,139,48,1,124, +48,1,107,48,1,92,48,1,75,48,1,60,48,1,43,48,1,28,48,1,11,48,1,252,48,1,235, +48,1,220,48,1,203,48,1,188,48,1,171,48,1,156,48,1,0,141,48,1,127,48,1,109, +48,1,95,48,1,77,48,1,47,48,63,48,2,29,48,1,15,48,1,253,48,1,239,48,1,221, +48,1,207,48,1,189,48,1,175,48,1,157,48,1,143,48,1,109,48,125,48,2,91,48,1, +77,48,1,59,48,1,45,48,1,27,48,1,13,48,1,56,251,48,1,237,48,1,219,48,1,205, +48,1,187,48,1,173,48,1,155,48,1,141,48,1,123,48,1,109,48,1,75,48,91,48,2, +57,48,1,43,48,1,25,48,1,11,48,1,249,48,1,235,48,1,221,48,1,203,48,1,189,48, +1,171,48,1,157,48,1,139,48,1,125,48,1,107,48,1,93,48,1,75,48,1,61,48,1,1, +43,48,1,31,48,1,2,95,48,127,48,159,48,191,48,223,48,255,48,6,0,48,1,8,68, +7,84,7,2,7,30,45,3,15,3,39,64,15,22,123,22,139,22,2,22,32,9,14,72,22,1,14, +18,0,63,51,51,43,93,17,51,63,23,51,93,1,94,93,93,95,113,113,95,113,113,113, +113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114, +114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,113, +113,113,113,113,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114, +114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93, +93,93,93,93,113,113,113,113,43,113,113,113,113,114,114,114,114,114,94,93, +93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93, +93,93,113,113,113,113,47,43,94,93,51,95,93,93,113,47,94,93,93,43,93,95,113, +113,113,113,113,113,113,113,113,113,51,93,113,95,113,18,23,57,61,47,47,47, +93,93,17,51,51,93,113,113,93,113,113,17,51,51,93,113,113,93,113,113,17,51, +51,93,113,113,93,113,113,49,48,43,93,93,93,93,93,93,93,43,43,93,93,93,93, +93,93,93,93,93,93,93,93,93,93,93,33,35,3,46,1,39,38,39,6,7,14,1,7,3,35,1, +51,19,30,1,23,22,23,54,55,62,3,55,19,51,19,30,3,23,22,23,50,62,2,55,19,51, +5,231,228,244,11,25,10,12,12,13,12,11,24,11,246,228,254,97,199,253,17,31, +11,13,11,15,16,7,14,15,15,6,245,183,245,6,15,15,14,7,16,15,1,16,24,29,15, +249,199,3,127,38,104,47,55,57,58,55,48,102,38,252,129,5,129,252,129,63,124, +49,58,52,69,67,28,62,60,55,23,3,109,252,147,23,55,59,62,28,67,70,69,104,121, +52,3,127,0,0,1,0,46,0,0,5,43,5,129,0,11,2,119,64,255,92,4,1,73,4,1,59,4,1, +38,11,1,75,0,91,0,2,41,0,57,0,2,68,2,84,2,2,38,2,54,2,2,9,3,25,3,41,3,3,81, +10,1,69,10,1,51,10,1,6,10,22,10,2,93,8,1,76,8,1,43,8,59,8,2,9,8,25,8,2,82, +6,1,67,6,1,3,38,6,54,6,2,7,6,23,6,2,12,219,13,1,196,13,1,171,13,1,144,13, +1,132,13,1,96,13,1,84,13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13, +1,160,13,1,148,13,1,112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,204, +224,13,1,212,13,1,176,13,1,164,13,1,128,13,1,116,13,1,80,13,1,68,13,1,32, +13,1,20,13,1,36,13,84,13,132,13,180,13,228,13,5,4,13,52,13,100,13,148,13, +196,13,244,13,6,156,52,13,100,13,148,13,196,13,244,13,5,11,13,1,27,13,75, +13,123,13,171,13,219,13,5,139,13,187,13,235,13,3,4,13,20,13,52,13,68,13,4, +106,84,13,100,13,132,13,148,64,156,13,180,13,196,13,228,13,244,13,8,59,13, +1,36,13,1,11,13,1,244,13,1,219,13,1,196,13,1,171,13,1,148,13,1,123,13,1,100, +13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13,1,160,13,1,148,13,1, +112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,57,224,13,1,212,13,1,176, +13,1,164,13,1,128,13,1,20,13,68,13,116,13,3,36,13,84,13,132,13,180,13,228, +13,5,84,13,100,13,148,13,244,13,4,64,13,1,2,0,13,48,13,2,6,8,10,7,1,4,4,9, +5,9,5,9,3,0,11,16,192,11,240,11,2,11,184,255,192,64,16,26,30,72,175,11,1, +144,11,1,127,11,1,0,11,1,11,184,255,192,181,11,15,72,11,2,3,184,255,240,64, +41,16,3,32,3,2,224,3,240,3,2,31,3,175,3,191,3,207,3,4,3,114,7,1,52,7,68,7, +84,7,3,4,7,10,1,4,8,5,3,3,0,18,0,63,50,63,51,23,57,93,93,1,47,93,93,113,56, +51,47,43,93,93,93,93,43,93,56,51,18,57,57,47,47,18,23,57,50,51,93,95,93,93, +113,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113, +113,113,113,113,113,113,113,114,114,114,114,94,93,93,113,114,114,94,93,113, +114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93, +93,113,113,113,113,113,113,113,113,113,113,49,48,94,93,93,95,93,93,93,93, +93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,9,1,35,9,1,51,9,1,51,9,1, +4,88,254,89,254,80,211,2,24,254,17,211,1,136,1,125,211,254,30,2,11,2,104, +253,152,2,220,2,165,253,215,2,41,253,98,253,29,0,0,0,1,0,45,0,0,5,41,5,129, +0,8,2,83,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5,1,3,5,1,16,3,5,184,255,232, +64,255,12,15,72,5,4,14,2,1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8, +6,1,90,38,2,86,2,150,2,3,118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,10,169, +10,201,10,3,86,10,1,9,10,57,10,2,25,10,89,10,137,10,249,10,4,6,10,1,202,249, +10,1,230,10,1,9,10,25,10,185,10,201,10,4,198,10,1,89,10,121,10,169,10,3,54, +10,1,41,10,57,10,185,10,233,10,4,11,10,1,153,249,10,1,198,10,214,10,2,178, +10,1,164,10,1,150,10,1,130,10,1,116,10,1,86,10,102,10,2,66,10,1,36,10,52, +10,2,18,10,1,4,10,1,244,10,1,230,10,1,196,10,212,10,2,166,10,182,10,2,146, +10,1,132,10,1,118,10,1,98,10,1,84,10,1,54,10,70,10,2,36,10,1,22,10,1,4,10, +1,242,10,1,1,208,10,224,10,2,196,10,1,160,10,176,10,2,148,10,1,112,10,1,100, +10,1,64,10,1,20,10,36,10,52,10,3,0,10,1,105,228,10,244,10,2,208,10,64,182, +1,164,10,180,10,196,10,3,128,10,144,10,2,116,10,1,80,10,96,10,2,68,10,1,32, +10,1,4,10,20,10,2,244,10,1,224,10,1,196,10,212,10,2,176,10,1,84,10,100,10, +116,10,148,10,164,10,5,48,10,64,10,2,36,10,1,0,10,1,196,10,244,10,2,144,10, +1,4,10,20,10,36,10,68,10,84,10,116,10,132,10,7,57,224,10,1,132,10,164,10, +212,10,3,112,10,1,4,10,36,10,52,10,84,10,100,10,5,228,10,244,10,2,192,10, +1,180,10,1,144,10,1,4,10,20,10,52,10,84,10,132,10,5,212,10,228,10,2,187,10, +1,164,10,1,112,10,1,2,48,10,96,10,2,15,10,47,10,2,0,3,59,3,75,3,123,3,3,3, +1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,1,93,93,95,93,93,93,93,113,113,113, +113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113,113,114,114, +114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,95,93,113,113,113, +113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114, +114,114,114,94,93,93,113,113,113,114,114,114,94,93,93,113,113,113,47,94,93, +93,93,113,253,57,206,94,93,93,50,43,1,24,16,77,230,50,49,48,43,95,94,93,93, +43,93,93,1,17,35,17,1,51,9,1,51,3,9,190,253,226,210,1,173,1,171,210,2,72, +253,184,2,72,3,57,253,97,2,159,0,0,0,0,1,0,65,0,0,4,163,5,129,0,9,0,122,64, +35,100,4,116,4,132,4,3,109,3,125,3,141,3,3,91,3,1,41,3,57,3,73,3,3,114,8, +130,8,2,84,8,100,8,2,8,184,255,240,64,9,10,13,72,9,3,16,7,1,7,184,255,192, +64,18,12,17,72,7,8,4,15,2,31,2,2,2,64,12,15,72,2,11,184,255,192,64,14,13, +17,72,7,3,4,95,5,3,2,8,95,1,18,0,63,237,50,63,237,50,50,1,43,47,43,93,51, +51,47,43,93,51,51,49,48,43,93,93,93,93,93,93,41,1,53,1,33,53,33,21,1,33,4, +163,251,158,3,90,252,239,3,234,252,166,3,137,143,4,86,156,139,251,166,0,0, +1,0,146,254,87,2,41,5,204,0,7,0,49,64,30,7,48,2,1,224,2,1,2,4,241,63,1,1, +143,1,191,1,2,32,1,1,1,4,245,1,0,5,245,0,27,0,63,237,63,237,1,47,93,93,113, +237,205,93,113,50,49,48,19,17,33,21,35,17,51,21,146,1,151,233,233,254,87, +7,117,129,249,141,129,0,1,0,0,255,236,2,57,5,204,0,3,0,71,64,40,120,1,136, +1,2,0,24,13,17,72,9,3,25,3,73,3,3,70,2,1,10,2,26,2,42,2,3,3,16,0,3,16,3,32, +3,128,3,4,3,1,184,255,240,183,143,1,1,1,1,0,0,19,0,63,63,1,47,93,56,205,93, +56,49,48,93,93,93,43,93,5,1,51,1,1,151,254,105,158,1,155,20,5,224,250,32, +0,0,0,0,1,0,16,254,87,1,167,5,204,0,7,0,49,64,31,4,63,0,1,239,0,1,0,7,241, +64,2,80,2,2,192,2,208,2,224,2,3,2,4,245,5,0,1,245,0,27,0,63,237,63,237,1, +47,93,113,253,205,93,113,50,49,48,19,53,51,17,35,53,33,17,16,233,233,1,151, +254,87,129,6,115,129,248,139,0,1,0,10,2,161,3,183,5,129,0,6,2,243,181,0,24, +18,22,72,2,184,255,232,179,18,22,72,5,184,255,232,64,47,18,22,72,118,5,134, +5,2,4,24,18,22,72,121,4,137,4,2,3,54,6,70,6,2,102,6,118,6,134,6,230,6,4,6, +6,22,6,38,6,70,6,86,6,102,6,6,6,184,255,192,179,48,65,72,6,184,255,192,64, +57,18,22,72,6,5,4,57,3,73,3,2,105,3,121,3,137,3,3,9,3,25,3,41,3,89,3,105, +3,5,9,3,64,18,22,72,3,6,1,22,1,134,1,3,57,38,1,54,1,70,1,246,1,4,230,1,1, +1,184,255,192,182,60,63,72,153,1,1,1,184,255,224,64,255,30,33,72,56,1,72, +1,2,39,1,1,22,1,1,183,1,199,1,2,6,1,70,1,86,1,102,1,150,1,166,1,6,9,1,6,8, +1,246,8,1,164,8,1,121,8,1,6,8,1,246,8,1,201,8,217,8,2,187,8,1,9,8,25,8,41, +8,169,8,4,201,201,8,217,8,2,54,8,118,8,134,8,150,8,4,153,8,233,8,2,102,8, +118,8,2,9,8,25,8,57,8,3,198,8,1,139,8,1,57,8,73,8,121,8,3,43,8,1,4,8,1,152, +228,8,244,8,2,208,8,1,162,8,178,8,194,8,3,132,8,148,8,2,82,8,98,8,114,8,3, +64,8,1,50,8,1,36,8,1,2,8,18,8,2,228,8,244,8,2,214,8,1,196,8,1,146,8,162,8, +178,8,3,116,8,132,8,2,102,8,1,50,8,66,8,82,8,3,20,8,36,8,2,6,8,1,242,8,1, +212,8,228,8,2,166,8,182,8,2,130,8,146,8,2,100,8,116,8,2,86,8,1,52,8,68,8, +2,32,8,1,4,8,20,8,2,104,230,8,246,8,2,192,8,1,146,8,162,8,64,24,178,8,3,116, +8,132,8,2,82,8,98,8,2,52,8,68,8,2,22,8,38,8,2,8,184,255,128,64,24,85,88,72, +182,8,198,8,2,132,8,148,8,164,8,3,102,8,118,8,2,68,8,1,8,184,255,192,182, +72,75,72,228,8,1,8,184,255,192,64,12,66,69,72,148,8,1,114,8,130,8,2,8,184, +255,128,64,120,59,62,72,18,8,34,8,2,1,0,8,1,56,240,8,1,212,8,228,8,2,176, +8,1,100,8,132,8,148,8,164,8,4,64,8,80,8,2,36,8,52,8,2,228,8,244,8,2,171,8, +187,8,2,116,8,132,8,148,8,3,75,8,1,52,8,1,11,8,1,235,8,251,8,2,208,8,1,196, +8,1,176,8,1,132,8,148,8,164,8,3,96,8,112,8,2,2,0,8,16,8,64,8,80,8,4,8,34, +1,1,3,1,19,1,2,1,4,3,3,3,0,0,47,50,47,63,51,93,93,1,94,93,95,93,93,93,93, +93,93,113,113,113,113,113,113,114,114,114,114,114,114,94,93,95,93,43,93,93, +43,93,43,113,113,113,113,43,114,114,114,114,114,114,114,94,93,93,93,93,93, +93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114, +114,114,94,93,93,93,93,93,113,113,113,114,114,94,93,93,93,93,113,113,113, +113,114,25,47,94,93,93,113,113,113,43,113,43,113,114,94,93,205,43,94,93,113, +114,51,51,205,43,43,93,113,114,49,48,95,93,43,93,43,43,43,9,2,35,1,51,1,3, +19,254,203,254,206,162,1,112,203,1,114,2,161,2,121,253,135,2,224,253,32,0, +0,0,0,1,255,225,254,105,4,138,254,235,0,3,0,35,64,23,16,2,96,2,128,2,160, +2,208,2,5,96,2,128,2,240,2,3,2,0,0,186,1,0,47,237,1,47,47,93,113,49,48,3, +53,33,21,31,4,169,254,105,130,130,0,1,0,106,4,177,2,18,5,228,0,5,0,47,64, +31,117,3,133,3,2,64,4,128,4,2,4,64,16,1,1,1,2,149,128,15,0,47,0,63,0,127, +0,239,0,5,0,0,47,93,26,237,1,47,93,26,205,93,49,48,93,9,1,53,51,19,21,1,180, +254,182,207,217,4,177,1,22,29,254,225,20,0,0,0,0,2,0,87,255,236,4,115,4,78, +0,50,0,65,0,161,64,50,121,61,137,61,2,121,12,137,12,2,2,40,9,13,72,10,5,26, +5,2,43,24,9,17,72,5,28,21,28,2,37,37,30,70,64,46,9,111,56,127,56,143,56,3, +56,67,128,20,71,21,184,255,192,64,20,21,28,72,21,21,63,71,31,3,1,3,48,67, +192,67,2,160,67,1,67,184,255,192,64,32,30,35,72,33,81,40,22,57,81,9,9,26, +51,95,20,1,47,20,143,20,2,20,20,15,80,26,16,46,51,80,0,22,0,63,237,50,63, +237,51,47,93,113,17,18,57,47,237,63,237,1,43,93,113,47,93,237,51,47,43,237, +26,16,220,93,50,50,26,237,50,47,49,48,93,43,93,43,0,93,93,5,34,38,53,52,62, +2,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,21,17,20,22,51,50,54,55,21, +14,1,35,34,46,2,39,35,14,3,39,50,62,2,61,1,7,14,3,21,20,22,1,158,163,164, +81,131,168,87,243,28,58,87,59,52,84,62,38,6,188,10,56,103,155,110,204,206, +42,59,15,30,14,34,67,38,51,73,46,24,3,6,29,69,92,117,35,86,129,85,42,197, +66,119,90,53,95,20,172,150,107,137,78,30,2,4,59,67,94,58,27,15,39,67,51,17, +64,107,78,43,187,177,254,46,80,81,4,3,112,8,8,27,55,81,54,52,84,59,32,135, +63,98,116,53,89,4,1,17,50,90,73,88,96,0,0,2,0,132,255,236,4,29,5,204,0,31, +0,51,0,146,64,9,105,49,121,49,2,121,35,1,31,184,255,224,64,24,7,10,72,134, +30,150,30,2,73,27,89,27,2,73,4,89,4,2,134,1,150,1,2,1,184,255,224,64,63,7, +10,72,0,71,64,160,32,1,32,53,128,42,5,19,70,0,18,16,18,48,18,240,18,4,8,18, +176,53,1,63,53,1,112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,37,80, +29,16,18,0,12,21,5,47,80,2,22,0,63,237,50,63,63,63,237,50,1,93,93,113,113, +114,114,47,94,93,237,50,50,26,16,220,93,26,237,49,48,43,93,93,93,93,43,93, +93,1,16,33,34,38,39,35,20,14,2,7,35,62,3,53,17,51,17,20,6,7,6,7,51,62,1,51, +50,18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,29,254,114,123,163,51, +2,3,3,3,1,174,1,2,2,1,180,1,1,1,1,4,50,165,122,205,193,189,28,62,96,69,71, +109,73,38,38,73,108,70,66,96,64,31,2,34,253,202,89,99,26,56,48,34,4,9,43, +60,72,39,4,237,254,89,30,55,21,25,22,104,90,254,236,254,226,112,160,103,48, +46,102,166,120,116,158,99,43,46,102,163,0,0,0,1,0,87,255,236,3,202,4,78,0, +39,0,117,64,81,121,16,1,121,23,1,99,37,1,99,3,1,32,70,31,31,8,70,160,9,1, +9,9,41,0,71,31,19,1,19,35,80,26,31,32,127,32,143,32,223,32,4,32,32,26,16, +32,8,112,8,128,8,208,8,224,8,5,0,8,16,8,96,8,112,8,128,8,192,8,208,8,7,8, +8,5,80,14,22,31,41,1,93,0,63,237,51,47,93,113,63,51,47,93,16,237,1,47,93, +237,17,51,125,47,113,24,237,51,47,237,49,48,93,93,93,93,1,20,30,2,51,50,54, +55,23,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,7,46,1,35,34,14,2,1,19,27, +64,105,77,96,129,15,182,9,60,103,148,97,127,178,111,50,36,65,88,103,114,58, +91,142,103,64,13,185,14,114,105,77,103,64,27,2,34,93,156,113,62,104,108,12, +67,124,94,57,86,151,205,120,109,167,125,85,51,23,50,87,118,68,14,90,106,51, +103,156,0,0,0,0,2,0,86,255,236,3,239,5,204,0,31,0,51,0,123,64,87,85,34,101, +34,2,90,50,106,50,2,57,1,73,1,2,54,10,70,10,2,9,4,25,4,121,4,137,4,4,6,7, +22,7,118,7,134,7,4,19,70,64,42,0,143,18,239,18,2,18,53,128,32,71,31,6,1,6, +112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,21,18,0,11,47,80,8,16, +0,37,80,3,22,0,63,237,50,63,237,50,63,63,1,93,93,113,113,47,93,237,26,16, +220,93,50,50,26,237,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17,16,33,50, +22,23,51,52,46,1,52,53,17,51,17,20,30,2,23,35,46,3,53,1,20,30,2,51,50,62, +2,53,52,46,2,35,34,14,2,3,53,50,165,122,205,193,1,142,123,164,50,2,1,1,180, +1,2,2,1,172,2,3,3,2,253,218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64, +31,174,104,90,1,20,1,24,2,54,90,98,10,43,47,42,9,1,163,251,19,39,72,60,43, +9,10,37,48,53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102, +163,0,0,0,2,0,87,255,236,4,24,4,78,0,28,0,37,0,107,64,46,90,35,106,35,2,90, +30,106,30,2,85,3,101,3,2,8,73,9,9,27,71,64,31,29,1,144,29,1,29,39,128,37, +0,71,31,17,1,17,48,39,192,39,208,39,3,39,184,255,192,64,19,30,35,72,8,8,5, +0,80,37,37,5,32,80,22,16,5,80,14,22,0,63,237,63,237,18,57,47,237,17,57,47, +1,43,113,47,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,0,93,93, +1,20,30,2,51,50,54,55,23,14,3,35,34,2,17,52,62,2,51,50,30,2,29,1,39,46,1, +35,34,14,2,7,1,20,35,73,114,80,117,141,25,158,17,61,102,153,108,240,251,76, +132,176,100,136,183,111,47,186,15,144,135,45,99,84,58,4,1,247,85,143,103, +57,94,72,45,45,91,73,47,1,30,1,26,152,211,132,59,88,155,210,122,24,138,171, +157,29,74,127,98,0,0,0,1,0,29,0,0,2,60,5,202,0,27,0,161,64,11,3,10,19,10, +51,10,67,10,4,13,10,184,255,224,64,106,8,12,72,26,15,16,1,14,16,25,16,1,70, +5,0,2,1,18,2,31,29,47,29,79,29,95,29,127,29,143,29,159,29,7,15,29,63,29,127, +29,175,29,191,29,223,29,239,29,7,59,95,29,191,29,2,127,29,143,29,159,29,3, +29,64,86,100,72,29,64,39,44,72,32,29,48,29,96,29,3,175,29,223,29,239,29,3, +64,29,1,15,29,47,29,2,19,80,12,0,0,3,80,25,6,15,1,21,0,63,63,51,237,50,63, +237,1,93,93,93,113,43,43,113,114,94,93,113,47,94,93,51,237,50,50,47,94,93, +51,49,48,0,43,94,93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35, +34,14,2,29,1,51,21,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51, +29,11,211,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41,60,39, +97,131,0,2,0,86,254,87,3,239,4,75,0,49,0,69,0,217,64,72,122,49,138,49,2,118, +7,134,7,2,101,62,1,85,12,101,12,2,90,58,106,58,2,38,3,54,3,2,38,18,1,41,33, +1,9,23,25,23,121,23,137,23,4,6,29,22,29,118,29,134,29,4,9,47,70,64,50,34, +48,14,1,127,14,223,14,2,14,71,128,6,70,5,184,255,192,64,81,23,28,72,5,5,60, +71,15,26,1,10,26,32,71,64,71,2,207,71,1,0,71,32,71,144,71,176,71,4,80,223, +71,1,192,71,1,79,71,1,128,71,160,71,2,15,71,47,71,2,208,71,240,71,2,15,71, +1,8,41,15,34,55,80,31,16,15,65,80,21,22,9,80,53,6,1,38,6,1,6,0,27,0,63,50, +93,93,237,63,237,50,63,237,50,63,1,94,93,93,113,113,114,114,114,94,93,93, +113,47,94,93,237,51,47,43,237,26,16,220,93,113,50,50,26,237,49,48,0,94,93, +93,93,93,93,93,93,93,93,93,1,34,46,2,39,55,30,1,51,50,62,2,61,1,35,14,3,35, +34,46,2,53,52,62,2,51,50,22,23,51,52,62,2,55,51,14,3,21,17,20,6,19,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,2,36,93,144,102,64,14,181,18,123,100,61, +100,70,38,2,20,59,85,112,72,103,147,93,43,43,97,155,111,115,169,46,2,3,3, +4,2,171,1,2,2,1,223,44,49,80,103,54,69,99,65,31,31,64,98,68,54,103,82,50, +254,87,38,71,98,60,26,75,81,34,75,120,86,174,41,75,58,35,69,138,205,135,130, +208,145,77,105,97,25,62,55,40,3,9,43,60,73,39,252,197,227,229,3,198,113,161, +102,48,48,103,161,112,117,159,98,42,46,100,158,0,0,0,0,1,0,142,0,0,3,238, +5,204,0,33,0,109,185,0,8,255,192,64,36,7,11,72,11,70,64,80,12,1,159,12,255, +12,2,12,35,128,0,35,192,35,208,35,224,35,4,192,35,1,15,35,1,128,35,1,35,184, +255,192,64,32,19,23,72,28,24,70,192,25,1,0,25,16,25,48,25,224,25,240,25,5, +8,25,26,0,25,11,21,0,18,80,5,16,0,63,237,50,63,51,63,1,47,94,93,113,237,50, +43,93,113,113,114,26,16,220,93,113,26,237,49,48,43,1,62,3,51,50,30,2,21,17, +35,17,52,46,2,35,34,14,2,21,17,35,17,51,17,20,14,2,7,1,61,30,70,84,100,62, +104,133,77,29,181,17,48,88,70,64,103,73,40,180,180,2,3,2,1,3,129,55,77,50, +23,56,101,140,84,253,47,2,174,69,104,69,35,46,84,120,75,253,130,5,204,254, +126,33,66,56,39,7,0,0,0,2,0,137,0,0,1,61,5,204,0,3,0,7,0,115,64,13,3,7,70, +0,0,4,16,4,48,4,3,8,4,184,255,192,64,42,21,24,72,4,4,8,9,255,9,1,224,9,1, +223,9,1,176,9,192,9,2,159,9,1,112,9,128,9,2,31,9,1,0,9,1,240,9,1,223,9,1, +9,184,255,192,64,17,34,37,72,79,9,1,31,9,1,5,15,4,21,0,83,1,0,0,63,237,63, +63,1,93,113,43,113,113,114,114,114,114,114,114,114,114,17,18,57,47,43,94, +93,51,237,50,49,48,19,53,51,21,3,17,51,17,137,180,180,180,5,32,172,172,250, +224,4,58,251,198,0,0,0,0,2,255,206,254,87,1,61,5,204,0,3,0,23,1,51,64,151, +7,24,12,16,72,7,40,8,11,72,3,4,70,21,12,12,0,0,21,16,21,32,21,64,21,4,7,21, +21,24,25,144,25,1,63,25,1,0,25,16,25,2,219,25,64,210,213,72,208,25,224,25, +2,143,25,1,64,25,80,25,2,15,25,31,25,95,25,111,25,255,25,5,144,25,160,25, +224,25,240,25,4,79,25,1,0,25,1,160,63,25,175,25,191,25,207,25,4,239,25,1, +176,25,192,25,208,25,3,63,25,79,25,95,25,3,32,25,1,143,25,191,25,207,25,3, +0,25,1,111,239,25,1,208,25,1,63,25,143,25,2,111,25,143,25,159,25,175,25,255, +25,5,25,184,255,192,64,84,79,82,72,223,25,1,144,25,160,25,176,25,3,47,25, +63,25,79,25,3,0,25,1,61,25,64,53,56,72,112,25,128,25,144,25,176,25,4,15,25, +31,25,2,255,25,1,25,64,35,38,72,144,25,1,79,25,1,255,25,1,112,25,128,25,192, +25,208,25,224,25,5,31,25,1,22,15,16,80,9,27,0,83,1,0,0,63,237,63,237,63,1, +93,93,93,113,113,43,113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93, +93,113,113,113,113,114,94,93,93,93,113,114,114,114,43,94,93,93,93,17,18,57, +47,94,93,51,51,47,16,237,50,49,48,0,43,43,19,53,51,21,17,20,14,2,35,34,38, +39,53,30,1,51,50,62,2,53,17,51,137,180,21,54,93,72,34,65,28,13,36,13,38,49, +28,10,180,5,32,172,172,250,90,62,106,78,45,4,5,139,2,4,20,43,67,46,4,165, +0,0,1,0,138,0,0,4,3,5,204,0,11,0,251,64,84,124,2,1,122,8,1,118,7,1,86,9,102, +9,134,9,150,9,4,139,0,155,0,2,89,0,105,0,121,0,3,116,10,132,10,148,10,3,68, +10,1,1,10,10,11,42,8,1,3,8,9,16,116,9,1,9,9,0,11,16,84,11,116,11,148,11,3, +116,11,148,11,180,11,212,11,228,11,244,11,6,48,11,1,2,11,184,255,192,64,105, +7,10,72,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,31,13,63,13,2,31,13,63,13,95, +13,255,13,4,15,13,31,13,63,13,95,13,127,13,5,57,13,64,83,86,72,96,13,128, +13,160,13,192,13,208,13,5,223,13,1,0,13,96,13,128,13,160,13,4,0,13,16,13, +48,13,64,13,128,13,160,13,192,13,224,13,240,13,9,7,2,1,7,10,4,8,15,5,0,4, +21,0,21,0,63,63,63,63,23,57,1,94,93,113,113,114,43,94,93,113,114,47,94,93, +237,50,47,43,95,93,93,113,56,51,51,47,93,56,51,95,114,17,57,17,51,49,48,93, +93,93,93,93,0,93,1,93,0,93,33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132, +180,180,1,219,211,254,73,1,206,1,238,109,254,127,5,204,252,97,2,13,254,47, +253,151,0,0,0,1,0,138,0,0,1,62,5,204,0,3,0,111,64,52,3,70,192,0,1,208,0,1, +0,0,16,0,48,0,240,0,4,8,0,224,5,240,5,2,223,5,1,176,5,192,5,2,159,5,1,112, +5,128,5,2,15,5,31,5,2,240,5,1,223,5,1,5,184,255,192,64,27,34,37,72,79,5,1, +255,5,1,112,5,128,5,192,5,208,5,224,5,5,31,5,1,1,0,0,21,0,63,63,1,93,93,93, +113,43,113,113,114,114,114,114,114,114,47,94,93,113,114,237,49,48,51,17,51, +17,138,180,5,204,250,52,0,0,1,0,136,0,0,6,35,4,78,0,59,2,194,185,0,42,255, +224,179,8,11,72,32,184,255,224,64,255,8,11,72,34,59,70,0,0,13,46,70,217,47, +249,47,2,182,47,1,41,47,89,47,137,47,3,6,47,1,166,47,182,47,214,47,230,47, +4,137,47,1,118,47,1,89,47,1,6,47,22,47,70,47,3,7,47,25,12,70,198,13,1,6,13, +22,13,54,13,230,13,246,13,5,8,13,251,61,1,201,61,217,61,233,61,3,187,61,1, +153,61,1,139,61,1,105,61,121,61,2,91,61,1,73,61,1,43,61,59,61,2,249,61,1, +235,61,1,217,61,1,203,61,1,189,61,1,153,61,1,139,61,1,105,61,1,91,61,1,41, +61,57,61,2,27,61,1,9,61,1,202,235,61,251,61,2,105,61,137,61,153,61,185,61, +201,61,5,91,61,1,77,61,1,41,61,57,61,2,27,61,1,249,61,1,235,61,1,201,61,217, +61,2,187,61,1,153,61,1,139,61,1,125,61,1,1,43,61,75,61,91,61,107,61,4,31, +61,1,4,61,1,203,61,235,61,2,175,61,191,61,2,139,61,1,127,61,1,43,61,75,61, +91,61,107,61,4,31,61,1,11,61,1,154,255,61,1,235,61,64,255,1,223,61,1,187, +61,1,175,61,1,139,61,155,61,2,127,61,1,91,61,107,61,2,79,61,1,59,61,1,36, +61,1,11,61,1,235,61,1,223,61,1,187,61,1,175,61,1,155,61,1,127,61,143,61,2, +100,61,1,75,61,1,63,61,1,43,61,1,15,61,31,61,2,235,61,1,223,61,1,123,61,139, +61,171,61,187,61,4,111,61,1,59,61,1,31,61,1,11,61,1,106,187,61,203,61,235, +61,3,175,61,1,139,61,1,127,61,1,91,61,1,79,61,1,27,61,1,251,61,1,223,61,239, +61,2,187,61,203,61,2,175,61,1,100,61,148,61,2,27,61,43,61,75,61,3,4,61,1, +244,61,1,139,61,171,61,219,61,3,127,61,1,107,61,1,52,61,1,27,61,1,15,61,1, +57,187,61,219,61,251,61,3,160,61,1,116,61,148,61,2,43,61,75,61,91,61,3,31, +61,1,11,61,1,203,61,235,61,251,61,3,164,61,1,27,61,75,61,91,61,123,61,4,244, +61,1,208,61,1,2,96,61,144,61,160,61,192,61,4,79,61,1,48,61,1,47,61,1,0,64, +19,61,1,8,34,53,80,40,16,25,6,80,31,16,19,15,47,13,0,21,0,63,50,50,63,63, +237,50,63,237,50,1,94,93,93,93,93,93,95,93,93,113,113,113,114,114,114,114, +114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114, +114,114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113, +113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93, +93,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114,114,114,94, +93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,47, +94,93,113,237,50,47,94,93,93,93,93,93,113,113,113,113,237,18,57,47,237,57, +49,48,0,43,43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21, +51,62,3,51,50,22,23,51,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21, +17,3,0,20,47,76,55,57,92,65,35,179,1,2,2,1,170,1,2,3,2,3,24,56,75,97,64,123, +143,28,3,24,60,80,100,64,82,119,76,36,178,20,47,76,55,57,92,65,35,2,174,79, +106,65,27,45,85,125,81,253,141,3,83,34,75,67,48,7,5,44,57,59,20,47,76,53, +29,98,107,47,76,53,29,44,92,145,100,253,47,2,174,79,106,65,27,43,84,126,83, +253,141,0,1,0,136,0,0,3,238,4,78,0,37,0,109,185,0,34,255,224,64,36,7,11,72, +37,70,64,80,0,1,159,0,255,0,2,0,39,128,0,39,192,39,208,39,224,39,4,192,39, +1,15,39,1,128,39,1,39,184,255,192,64,32,19,23,72,25,12,70,192,13,1,0,13,16, +13,48,13,224,13,240,13,5,8,13,25,6,80,31,16,19,15,13,0,21,0,63,50,63,63,237, +50,1,47,94,93,113,237,50,43,93,113,113,114,26,16,220,93,113,26,237,49,48, +43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51, +50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26, +62,82,106,70,90,130,84,39,2,174,79,106,65,27,45,85,125,81,253,141,3,83,34, +75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,253,47,0,0,0,0,2,0,86, +255,236,4,29,4,78,0,14,0,34,0,116,64,59,121,32,137,32,2,116,28,132,28,2,118, +22,134,22,2,121,18,137,18,2,150,12,166,12,2,4,12,20,12,2,11,9,27,9,2,11,5, +27,5,2,4,2,20,2,2,7,0,71,64,144,15,1,15,36,128,48,36,1,36,184,255,192,64, +20,30,35,72,223,36,1,25,71,31,8,1,8,20,80,10,16,30,80,3,22,0,63,237,63,237, +1,47,93,237,93,43,113,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93, +93,1,16,2,35,34,46,2,53,16,33,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51, +50,62,2,4,29,250,238,113,178,123,65,1,229,126,183,117,56,189,39,75,108,68, +69,111,78,41,44,77,105,62,69,112,78,42,2,30,254,228,254,234,68,140,211,143, +2,48,70,140,210,140,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0, +0,2,0,132,254,87,4,29,4,77,0,38,0,58,0,148,64,16,105,56,121,56,2,105,42,121, +42,2,134,36,150,36,2,36,184,255,224,64,19,7,10,72,73,31,89,31,2,73,7,89,7, +2,134,3,150,3,2,3,184,255,224,64,63,7,10,72,0,71,64,160,39,1,39,60,128,49, +28,15,70,0,16,16,16,48,16,240,16,4,8,16,176,60,1,63,60,1,112,60,144,60,2, +31,60,1,255,60,1,192,60,224,60,2,28,44,80,34,16,22,15,15,27,8,54,80,5,22, +0,63,237,50,63,63,63,237,50,1,93,93,113,113,114,114,47,94,93,237,50,50,26, +16,220,93,26,237,49,48,43,93,93,93,43,93,93,93,1,20,14,2,35,34,38,39,35,30, +3,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51,50,30,2,7,52,46,2,35,34,14, +2,21,20,30,2,51,50,62,2,4,29,40,93,153,112,116,174,46,5,1,1,1,1,180,1,2,2, +1,174,1,3,3,3,4,25,64,82,101,63,112,153,93,40,189,24,59,98,74,60,106,79,46, +38,73,108,70,75,99,59,24,2,34,123,208,150,85,88,100,2,32,48,59,29,254,89, +5,6,39,72,59,42,9,3,36,51,58,26,52,73,47,21,80,145,205,129,100,156,108,56, +34,96,169,135,115,159,98,43,58,110,159,0,0,2,0,86,254,87,3,240,4,78,0,34, +0,54,0,165,64,119,85,47,101,47,2,90,43,106,43,2,57,32,73,32,2,54,9,70,9,2, +9,1,25,1,121,1,137,1,4,6,5,22,5,118,5,134,5,4,9,22,70,64,35,11,127,23,223, +23,2,23,56,128,45,71,15,3,1,10,3,32,56,64,56,2,207,56,1,0,56,32,56,144,56, +176,56,4,80,223,56,1,192,56,1,79,56,1,128,56,160,56,2,15,56,47,56,2,208,56, +240,56,2,15,56,1,8,22,27,17,16,11,40,80,6,16,29,50,80,0,22,0,63,237,50,63, +237,50,63,63,1,94,93,93,113,113,114,114,114,94,93,93,113,47,94,93,237,26, +16,220,93,50,50,26,237,49,48,0,94,93,93,93,93,93,93,5,34,2,17,16,18,51,50, +30,2,23,51,52,62,2,55,51,14,1,21,17,35,17,52,54,55,54,55,35,14,3,1,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,1,228,206,192,197,201,67,103,81,61,25, +2,3,3,4,2,173,2,5,180,1,1,1,1,2,26,63,82,103,1,16,41,75,107,66,69,98,61,29, +27,61,97,70,60,106,79,46,20,1,22,1,22,1,26,1,28,24,47,70,47,25,61,54,39,3, +17,144,134,251,54,1,183,26,56,25,28,29,51,75,49,23,2,62,118,160,96,41,51, +105,161,110,108,160,104,51,37,97,169,0,0,0,1,0,136,0,0,2,136,4,78,0,31,0, +62,64,40,16,21,48,21,2,21,21,33,12,31,70,192,0,1,0,0,16,0,48,0,224,0,240, +0,5,8,0,25,40,19,22,72,25,12,18,16,7,15,0,21,0,63,63,63,51,205,43,1,47,94, +93,113,237,50,17,51,47,93,49,48,51,17,52,46,2,39,51,30,3,21,51,62,3,51,50, +22,23,21,46,1,35,34,14,2,21,17,142,1,2,2,1,170,1,3,3,1,4,19,43,58,80,57,22, +40,11,18,48,30,62,87,55,26,3,62,34,71,66,58,23,23,59,62,57,20,62,91,59,29, +7,3,165,5,5,56,99,137,81,253,204,0,0,1,0,57,255,236,3,182,4,75,0,55,0,189, +64,85,116,46,132,46,2,111,21,127,21,143,21,3,107,22,1,37,54,1,42,27,1,21, +52,1,5,2,21,2,2,11,30,27,30,2,36,73,35,35,0,72,64,32,19,48,19,2,144,19,160, +19,176,19,3,19,57,128,11,73,10,64,25,30,72,10,10,44,72,79,29,95,29,2,32,29, +1,29,96,57,192,57,2,128,57,1,57,184,255,192,64,42,39,42,72,63,57,1,16,57, +1,19,44,5,41,80,32,0,36,1,144,36,240,36,2,36,36,32,16,14,80,5,96,11,112,11, +2,128,11,1,11,11,5,22,0,63,51,47,93,113,16,237,63,51,47,93,113,16,237,18, +57,57,1,93,93,43,93,113,47,93,113,237,51,47,43,237,26,16,220,93,113,26,237, +50,47,237,49,48,93,93,0,93,1,93,93,0,93,93,93,1,20,14,2,35,34,46,2,39,55, +30,1,51,50,62,2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,6,21, +20,30,2,23,30,5,3,182,59,112,163,105,94,151,114,77,18,159,23,144,128,58,97, +70,39,46,82,117,70,65,128,103,64,211,202,179,211,28,162,9,48,68,85,46,122, +116,43,77,108,65,43,90,85,75,56,33,1,43,76,119,81,43,29,64,105,76,31,87,81, +16,39,65,48,49,63,42,31,19,17,42,69,102,77,148,155,126,139,20,42,57,35,15, +74,75,44,57,39,29,16,11,25,35,47,66,88,0,0,0,0,1,0,31,255,240,2,42,5,44,0, +22,0,123,64,87,40,14,1,105,14,121,14,137,14,3,40,13,1,105,13,121,13,137,13, +3,139,4,1,4,32,9,13,72,108,4,124,4,156,4,172,4,4,4,32,9,12,72,111,22,127, +22,2,22,12,13,22,3,16,70,9,8,143,5,1,0,5,16,5,32,5,64,5,4,7,5,128,24,1,15, +6,80,12,63,10,1,10,9,15,19,80,3,22,0,63,237,63,205,93,51,237,50,1,93,47,94, +93,113,51,51,237,23,50,47,93,49,48,0,43,93,1,43,93,93,113,93,113,37,14,1, +35,34,53,17,35,53,51,55,51,21,51,21,35,17,20,22,51,50,54,55,2,42,41,85,56, +216,125,132,53,120,200,200,51,63,26,49,29,8,11,13,245,2,210,131,242,242,131, +253,85,78,63,8,6,0,0,0,0,1,0,133,255,236,3,235,4,58,0,37,0,121,64,69,150, +3,1,26,33,42,33,58,33,3,25,14,70,64,47,11,143,11,2,191,11,1,143,11,159,11, +255,11,3,11,39,128,1,70,223,36,239,36,2,0,36,16,36,48,36,240,36,4,8,36,176, +39,192,39,208,39,3,176,39,240,39,2,255,39,1,112,39,1,39,184,255,192,64,13, +19,23,72,25,6,80,31,22,19,21,12,0,15,0,63,50,63,63,237,50,1,43,93,93,113, +114,47,94,93,113,237,26,16,220,93,113,114,26,237,51,49,48,0,93,93,1,17,20, +30,2,51,50,62,2,53,17,51,17,20,30,2,23,35,46,3,53,35,14,3,35,34,46,2,53,17, +1,58,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90, +130,84,39,4,58,253,82,79,106,65,27,45,85,125,81,2,115,252,173,34,75,67,48, +7,5,44,57,59,20,47,76,53,29,44,92,144,101,2,209,0,0,1,0,7,0,0,3,249,4,58, +0,16,2,91,64,55,57,1,73,1,2,153,1,1,54,0,70,0,2,134,0,150,0,2,58,15,74,15, +2,154,15,1,105,15,121,15,137,15,3,53,3,69,3,2,149,3,1,3,103,3,119,3,135,3, +3,14,16,13,17,72,4,184,255,240,64,62,13,17,72,1,0,9,9,2,15,16,16,43,16,123, +16,2,4,16,20,16,2,4,16,20,16,68,16,84,16,132,16,148,16,196,16,212,16,8,219, +16,1,68,16,84,16,132,16,148,16,196,16,5,27,16,1,4,16,1,8,16,3,2,184,255,240, +64,255,11,2,91,2,2,42,2,11,18,27,18,2,11,18,27,18,75,18,91,18,139,18,155, +18,203,18,219,18,8,255,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18, +1,68,18,84,18,2,32,18,1,4,18,20,18,2,199,224,18,1,196,18,212,18,2,160,18, +1,4,18,20,18,68,18,84,18,132,18,148,18,6,68,18,84,18,132,18,148,18,196,18, +212,18,6,27,18,1,4,18,1,219,18,1,196,18,1,155,18,1,132,18,1,91,18,1,68,18, +1,27,18,1,4,18,1,151,11,18,27,18,75,18,91,18,139,18,155,18,203,18,219,18, +8,155,18,203,18,219,18,3,132,18,1,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18, +2,224,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,4,18,20,18,68, +18,84,18,4,103,4,18,20,18,68,18,84,18,132,18,148,18,196,18,212,18,8,219,18, +1,196,18,1,155,18,1,132,18,1,91,18,1,68,18,1,27,18,1,4,18,1,219,18,1,196, +18,1,11,18,27,18,75,18,64,99,91,18,139,18,155,18,6,55,75,18,91,18,139,18, +155,18,203,18,219,18,6,63,18,1,32,18,1,4,18,20,18,2,224,18,1,196,18,212,18, +2,160,18,1,132,18,148,18,2,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18,2,196, +18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,2,80,18,1,47,18,1,0,18,16,18, +2,7,15,2,15,9,1,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93,93,113,113,113, +113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113, +113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114,94,93,93,93,93,93, +93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93,93,93,93,113,114,47, +94,93,56,51,47,94,93,93,93,93,113,114,114,56,51,18,57,61,47,51,51,49,48,43, +43,93,95,93,113,93,93,113,93,113,93,113,33,35,1,51,19,30,3,23,62,3,55,19, +51,2,101,213,254,119,192,238,7,19,20,17,6,6,19,20,21,8,246,191,4,58,253,64, +22,63,68,63,21,21,63,66,63,22,2,194,0,0,0,0,1,255,253,0,0,5,204,4,58,0,42, +3,177,64,36,229,23,1,58,41,74,41,2,122,41,138,41,154,41,3,53,16,69,16,2,117, +16,133,16,149,16,3,54,29,70,29,2,54,29,1,29,184,255,240,64,22,13,17,72,57, +28,73,28,2,57,28,1,28,16,13,17,72,54,0,70,0,2,0,184,255,240,64,9,11,17,72, +54,13,70,13,2,13,184,255,240,64,51,11,17,72,57,1,73,1,2,1,16,11,17,72,57, +14,73,14,2,3,14,16,9,17,72,14,13,22,29,28,7,1,0,35,40,35,1,88,35,1,22,7,35, +35,7,22,3,15,41,42,16,42,184,255,192,64,73,47,50,72,73,42,1,52,42,1,38,42, +1,249,42,1,198,42,230,42,2,164,42,1,150,42,1,121,42,1,54,42,70,42,102,42, +3,25,42,1,244,42,1,182,42,230,42,2,132,42,148,42,2,102,42,118,42,2,57,42, +1,38,42,1,20,42,1,6,42,1,8,42,16,15,184,255,240,64,255,9,15,89,15,105,15, +121,15,4,10,15,198,44,230,44,246,44,3,164,44,1,150,44,1,121,44,1,102,44,1, +84,44,1,54,44,70,44,2,25,44,1,244,44,1,230,44,1,196,44,1,182,44,1,153,44, +1,134,44,1,116,44,1,102,44,1,57,44,1,20,44,36,44,2,6,44,1,202,249,44,1,150, +44,182,44,198,44,230,44,4,105,44,1,54,44,70,44,2,9,44,25,44,2,230,44,1,185, +44,1,86,44,102,44,134,44,3,57,44,1,43,44,1,20,44,1,6,44,1,228,44,1,214,44, +1,196,44,1,182,44,1,162,44,1,148,44,1,134,44,1,114,44,1,100,44,1,86,44,1, +52,44,68,44,2,34,44,1,20,44,1,6,44,1,153,246,44,1,194,44,210,44,2,180,44, +1,166,44,1,132,44,1,118,44,1,84,44,100,44,2,66,44,1,52,44,1,22,44,38,44,2, +4,44,1,226,44,242,44,2,212,44,1,198,44,1,164,44,1,146,44,1,132,44,1,102,44, +118,44,2,84,44,1,54,44,70,44,2,36,44,1,22,44,1,4,44,1,244,44,64,213,1,230, +44,1,196,44,1,178,44,1,164,44,1,102,44,134,44,150,44,3,68,44,84,44,2,54,44, +1,20,44,1,6,44,1,105,246,44,1,226,44,1,212,44,1,150,44,182,44,198,44,3,116, +44,132,44,2,54,44,70,44,102,44,3,36,44,1,6,44,22,44,2,244,44,1,182,44,230, +44,2,148,44,164,44,2,134,44,1,105,44,1,86,44,1,68,44,1,6,44,54,44,2,228,44, +1,214,44,1,196,44,1,166,44,182,44,2,137,44,1,114,44,1,1,96,44,1,4,44,36,44, +84,44,3,56,164,44,196,44,212,44,244,44,4,128,44,1,116,44,1,75,44,1,48,44, +1,20,44,36,44,2,251,44,1,196,44,1,160,44,1,148,44,1,123,44,1,52,44,68,44, +100,44,3,27,44,1,240,44,1,228,44,1,203,44,1,100,44,132,44,148,44,180,44,4, +63,44,1,2,0,44,16,44,2,8,7,184,255,224,64,40,14,17,72,66,7,1,52,7,1,34,7, +1,7,28,41,3,15,15,35,40,12,17,72,45,35,1,22,40,12,17,72,45,22,1,1,22,35,3, +14,21,0,63,23,51,93,43,93,43,63,23,51,93,93,93,43,1,94,93,95,93,93,93,93, +93,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93,93,95,93,93, +93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114, +94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113, +113,113,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93, +93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114,114,94, +93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,47,94,93, +56,51,47,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114, +43,56,51,18,23,57,61,47,47,47,113,114,17,51,51,17,51,51,17,51,51,49,48,43, +95,113,43,113,43,113,43,113,43,93,113,43,93,113,93,113,93,113,113,33,35,3, +46,1,39,38,39,6,7,14,1,7,3,35,1,51,19,30,1,23,22,23,54,55,62,1,55,19,51,19, +30,1,23,22,23,54,55,62,1,55,19,51,4,150,209,173,8,17,8,10,9,9,10,8,19,8,178, +208,254,209,178,183,7,14,7,7,8,8,9,8,16,6,196,193,189,7,16,7,8,8,8,8,7,15, +7,191,176,2,186,27,80,38,44,47,45,44,38,82,31,253,74,4,58,253,33,23,67,32, +37,39,38,36,31,64,21,2,231,253,25,26,66,29,34,35,38,36,31,67,26,2,223,0,0, +1,0,23,0,0,3,234,4,58,0,11,2,214,64,72,148,2,1,134,2,1,141,8,157,8,2,121, +8,1,130,6,146,6,2,118,6,1,141,0,157,0,2,121,0,1,55,10,119,10,2,28,10,1,122, +4,1,19,4,1,3,24,1,120,1,136,1,152,1,4,23,7,135,7,151,7,3,6,8,10,1,7,4,4,9, +9,16,5,184,255,240,64,59,5,9,5,9,3,0,11,16,41,11,57,11,2,4,11,20,11,2,214, +11,230,11,246,11,3,196,11,1,150,11,166,11,182,11,3,132,11,1,6,11,38,11,70, +11,102,11,134,11,150,11,166,11,198,11,230,11,9,8,11,184,255,192,181,24,31, +72,11,2,3,184,255,240,64,11,9,3,1,9,3,57,3,2,10,3,13,184,255,128,64,116,223, +233,72,118,13,1,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,230, +13,246,13,2,210,13,1,192,13,1,178,13,1,132,13,148,13,164,13,3,118,13,1,100, +13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,199,246,13,1,228,13,1, +214,13,1,196,13,1,182,13,1,164,13,1,6,13,70,13,86,13,134,13,150,13,166,13, +198,13,214,13,230,13,9,150,13,198,13,2,13,184,255,192,64,187,183,192,72,132, +13,1,86,13,102,13,118,13,3,68,13,1,38,13,54,13,2,4,13,1,151,38,13,54,13,102, +13,118,13,166,13,182,13,198,13,230,13,246,13,9,230,13,1,132,13,1,118,13,1, +68,13,84,13,100,13,3,54,13,1,36,13,1,22,13,1,4,13,1,246,13,1,228,13,1,214, +13,1,196,13,1,182,13,1,164,13,1,118,13,134,13,150,13,3,100,13,1,6,13,22,13, +38,13,70,13,86,13,5,103,6,13,70,13,86,13,134,13,150,13,198,13,214,13,230, +13,8,153,13,217,13,2,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13, +1,214,13,230,13,246,13,3,196,13,1,6,13,38,13,54,13,70,13,4,55,102,13,166, +13,182,13,230,13,246,13,5,13,184,255,192,64,54,61,66,72,57,13,1,34,13,1,1, +0,13,16,13,2,244,13,1,192,13,208,13,224,13,3,180,13,1,128,13,144,13,160,13, +3,116,13,1,96,13,1,84,13,1,64,13,1,52,13,1,32,13,1,13,184,255,192,64,34,18, +24,72,160,13,1,2,0,13,16,13,80,13,112,13,128,13,144,13,6,7,10,4,4,7,1,3,2, +8,6,15,0,2,21,0,63,51,63,51,18,23,57,17,1,51,94,93,95,93,43,113,113,113,113, +113,113,113,113,113,113,114,95,114,114,43,114,94,93,93,93,113,113,113,113, +113,113,113,113,114,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113, +113,113,114,94,93,93,93,93,93,43,93,113,114,114,114,114,114,114,94,93,93, +93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,43,47,94, +93,114,56,51,47,43,94,93,113,113,113,113,114,114,56,51,18,57,57,47,47,56, +56,18,23,57,50,51,49,48,0,93,93,1,95,93,93,93,93,93,93,93,93,93,93,93,93, +33,9,1,35,9,1,51,9,1,51,9,1,3,33,254,221,254,219,194,1,129,254,145,199,1, +14,1,12,201,254,145,1,134,1,188,254,68,2,44,2,14,254,91,1,165,253,244,253, +210,0,0,0,0,1,0,5,254,87,3,252,4,58,0,31,2,207,64,59,147,3,1,147,2,1,153, +16,1,150,0,1,141,16,157,16,2,141,0,157,0,2,122,29,138,29,154,29,3,105,29, +1,157,30,1,30,16,13,16,72,146,19,1,134,19,1,114,19,1,86,19,102,19,2,146,18, +1,3,18,184,255,240,64,36,13,16,72,16,0,24,8,24,8,24,17,30,31,16,153,31,1, +134,31,1,89,31,1,70,31,1,25,31,1,6,31,1,8,31,18,17,184,255,240,64,36,17,6, +33,1,6,33,38,33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230, +33,246,33,12,199,230,33,246,33,2,33,184,255,192,64,255,217,233,72,196,33, +1,166,33,182,33,2,132,33,1,6,33,38,33,54,33,70,33,102,33,118,33,6,6,33,38, +33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230,33,246,33,12, +6,33,22,33,38,33,70,33,86,33,102,33,134,33,166,33,198,33,230,33,246,33,11, +151,244,33,1,224,33,1,194,33,210,33,2,180,33,1,160,33,1,130,33,146,33,2,116, +33,1,96,33,1,66,33,82,33,2,52,33,1,32,33,1,2,33,18,33,2,228,33,244,33,2,194, +33,210,33,2,164,33,180,33,2,130,33,146,33,2,100,33,116,33,2,66,33,82,33,2, +36,33,52,33,2,2,33,18,33,2,228,33,244,33,2,194,33,210,33,2,164,33,180,33, +2,130,33,146,33,2,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2, +33,1,103,228,33,244,33,2,214,33,1,194,33,1,164,33,180,33,2,150,33,1,130,33, +1,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2,33,1,228,33,244, +33,2,214,33,1,64,166,194,33,1,1,160,33,176,33,2,132,33,148,33,2,96,33,112, +33,2,68,33,84,33,2,32,33,48,33,2,4,33,20,33,2,224,33,240,33,2,196,33,212, +33,2,160,33,176,33,2,132,33,148,33,2,96,33,112,33,2,68,33,84,33,2,32,33,48, +33,2,4,33,20,33,2,55,224,33,1,196,33,212,33,2,160,33,1,132,33,148,33,2,96, +33,1,68,33,84,33,2,32,33,1,4,33,20,33,2,224,33,1,196,33,212,33,2,160,33,1, +132,33,148,33,2,96,33,1,2,0,33,32,33,48,33,80,33,4,80,33,128,33,144,33,192, +33,4,47,33,1,0,33,16,33,2,7,16,0,24,0,32,30,17,15,12,80,5,27,0,63,237,63, +51,17,51,51,17,51,1,94,93,93,93,113,95,113,113,113,113,113,114,114,114,114, +114,114,114,114,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,95,113, +113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93, +93,93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114, +114,114,114,114,114,94,93,113,114,114,114,114,43,114,94,93,113,47,56,51,47, +94,93,93,93,93,93,93,56,51,18,57,57,61,47,24,47,17,51,51,49,48,43,95,93,93, +93,93,93,43,93,93,93,0,93,93,1,93,93,93,93,33,14,3,35,34,38,39,53,30,1,51, +50,54,63,1,1,51,19,30,3,23,62,3,55,19,51,2,92,38,79,98,120,78,34,58,32,19, +48,17,79,136,51,17,254,83,192,228,10,31,31,24,2,3,23,29,30,10,212,190,98, +157,111,59,4,7,135,3,3,118,129,43,4,53,253,170,27,90,90,72,9,11,65,80,82, +30,2,106,0,1,0,49,0,0,3,182,4,58,0,9,1,11,64,78,157,2,173,2,2,139,2,1,89, +2,105,2,2,146,7,162,7,2,116,7,132,7,2,70,7,86,7,102,7,3,40,8,1,3,8,2,123, +6,1,4,6,20,6,36,6,164,6,180,6,212,6,228,6,7,7,6,7,3,11,1,59,1,91,1,3,10,1, +64,39,55,72,1,64,17,20,72,1,11,184,255,192,64,40,92,100,72,192,11,1,180,11, +1,160,11,1,148,11,1,128,11,1,116,11,1,96,11,1,84,11,1,64,11,1,52,11,68,11, +100,11,132,11,4,11,184,255,192,64,32,73,82,72,32,11,1,20,11,1,0,11,1,63,68, +11,100,11,132,11,164,11,4,4,11,36,11,68,11,100,11,4,11,184,255,192,179,51, +62,72,11,184,255,192,64,18,31,39,72,224,11,1,2,0,11,32,11,80,11,112,11,4, +7,11,184,255,192,64,13,16,20,72,6,3,80,4,15,1,7,80,0,21,0,63,237,50,63,237, +50,1,43,94,93,95,93,43,43,113,114,94,93,93,93,43,93,113,113,113,113,113,113, +113,113,113,43,47,43,43,94,93,51,51,47,94,93,113,51,51,95,113,49,48,93,93, +93,93,93,93,51,53,1,33,53,33,21,1,33,21,49,2,149,253,147,3,56,253,106,2,187, +137,3,38,139,137,252,218,139,0,0,0,1,0,34,254,87,2,136,5,204,0,45,0,96,64, +65,3,32,9,12,72,19,32,9,13,72,23,45,33,28,40,240,17,11,31,5,63,5,2,143,5, +1,64,5,1,5,33,11,245,47,12,111,12,2,15,12,79,12,223,12,239,12,4,47,12,79, +12,111,12,3,12,12,0,24,245,21,0,43,245,0,27,0,63,237,63,237,18,57,47,93,113, +114,237,57,1,47,93,93,113,51,51,237,50,50,205,50,49,48,43,43,1,34,46,2,53, +17,52,46,2,39,53,62,3,53,17,52,54,59,1,21,35,34,6,21,17,20,14,2,7,21,30,3, +21,17,20,22,59,1,21,2,1,65,99,66,34,29,55,80,51,51,80,55,29,133,131,135,63, +91,77,30,52,71,41,43,71,51,29,77,91,63,254,87,41,76,108,68,1,105,63,88,56, +28,2,127,2,28,56,88,62,1,106,141,152,129,107,108,254,156,50,84,64,44,10,2, +10,44,65,84,51,254,155,106,109,129,0,1,0,183,254,78,1,93,5,204,0,3,1,207, +64,21,3,171,6,0,1,11,0,0,4,5,214,5,230,5,246,5,3,194,5,1,5,184,255,128,179, +226,229,72,5,184,255,192,64,10,222,225,72,2,5,18,5,2,218,5,184,255,128,179, +214,217,72,5,184,255,192,64,20,210,213,72,180,5,196,5,2,162,5,1,1,112,5,128, +5,144,5,3,5,184,255,192,64,20,199,202,72,0,5,1,240,5,1,212,5,228,5,2,176, +5,192,5,2,5,184,255,192,64,43,187,190,72,48,5,64,5,80,5,3,4,5,20,5,36,5,3, +240,5,1,196,5,212,5,228,5,3,128,5,144,5,160,5,3,4,5,20,5,36,5,3,164,5,184, +255,192,179,168,171,72,5,184,255,128,179,160,163,72,5,184,255,192,64,14,156, +159,72,112,5,128,5,144,5,3,228,5,1,5,184,255,192,64,11,145,148,72,176,5,192, +5,208,5,3,5,184,255,192,64,15,133,136,72,48,5,1,20,5,36,5,2,0,5,1,5,184,255, +192,64,15,122,125,72,128,5,1,4,5,20,5,36,5,3,110,5,184,255,192,64,10,114, +117,72,192,5,1,84,5,1,5,184,255,192,182,102,105,72,16,5,1,5,184,255,192,64, +9,91,94,72,80,5,96,5,2,5,184,255,192,64,15,79,82,72,203,5,219,5,2,160,5,176, +5,2,2,5,184,255,192,64,10,68,71,72,15,5,31,5,2,62,5,184,255,192,64,29,56, +61,72,207,5,1,96,5,112,5,160,5,176,5,4,31,5,1,0,5,1,160,5,224,5,240,5,3,5, +184,255,192,64,28,25,28,72,5,64,17,21,72,64,5,112,5,128,5,144,5,4,15,5,31, +5,47,5,3,7,1,0,0,0,47,63,1,94,93,93,43,43,113,114,114,114,114,43,94,93,43, +95,93,93,43,113,43,114,43,114,114,43,94,93,93,43,113,113,113,43,113,43,113, +114,43,43,43,94,93,93,93,93,113,113,43,113,113,113,114,43,114,95,114,114, +43,43,94,93,43,43,93,93,17,18,57,47,94,93,237,49,48,19,17,51,17,183,166,254, +78,7,126,248,130,0,0,0,0,1,0,34,254,87,2,135,5,204,0,45,0,98,185,0,40,255, +224,179,9,12,72,24,184,255,224,64,55,9,13,72,20,44,32,26,38,240,15,9,48,3, +1,192,3,208,3,2,3,9,32,245,47,31,111,31,2,15,31,79,31,223,31,239,31,4,47, +31,79,31,111,31,3,31,31,21,45,245,44,27,20,245,21,0,0,63,237,63,237,18,57, +47,93,113,114,237,57,1,47,93,113,51,51,253,50,50,205,50,49,48,43,43,19,50, +54,53,17,52,62,2,55,53,46,3,53,17,52,38,43,1,53,51,50,22,21,17,20,30,2,23, +21,14,3,21,17,20,14,2,43,1,53,94,91,79,28,51,71,43,42,70,52,29,79,91,60,132, +131,133,29,55,81,52,52,81,55,29,34,66,99,65,132,254,216,109,106,1,101,51, +84,65,44,10,2,10,44,64,84,50,1,100,108,107,129,152,141,254,150,62,88,56,28, +2,127,2,28,56,88,63,254,151,68,108,76,41,129,0,0,0,0,1,0,92,2,41,4,80,3,39, +0,32,0,154,64,26,90,3,138,3,2,25,2,41,2,57,2,3,30,48,10,16,72,13,31,1,25, +48,9,12,72,13,184,255,208,179,9,13,72,7,184,255,208,64,19,9,13,72,0,27,32, +27,112,27,3,27,32,10,1,10,24,173,64,10,184,255,192,180,38,60,72,10,0,184, +255,192,179,23,28,72,0,184,255,192,64,41,14,20,72,0,128,27,64,41,60,72,27, +5,173,31,14,79,14,159,14,3,111,14,127,14,159,14,175,14,207,14,239,14,255, +14,7,14,64,9,13,72,14,0,47,43,93,113,237,196,43,26,221,43,43,196,43,26,237, +1,47,93,47,93,49,48,0,43,43,43,93,43,93,93,1,34,38,39,38,35,34,14,2,7,53, +62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,76,69,145,73,129,88,38,65,60, +56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68,2,41, +44,26,45,12,23,32,21,143,38,46,13,20,26,13,8,15,14,8,50,42,149,23,30,19,8, +0,0,0,2,0,242,254,185,1,184,4,58,0,3,0,7,2,19,64,133,2,91,3,3,166,5,182,5, +2,5,150,105,6,185,6,2,70,6,86,6,2,57,6,1,6,64,23,27,72,182,6,198,6,2,73,6, +89,6,105,6,3,22,6,54,6,2,9,6,1,10,6,121,9,137,9,153,9,201,9,4,70,9,1,9,9, +57,9,2,249,9,1,182,9,1,105,9,121,9,169,9,3,38,9,1,9,9,1,204,217,9,233,9,2, +150,9,1,73,9,89,9,121,9,3,6,9,1,185,9,201,9,2,134,9,1,116,9,1,86,9,102,9, +2,68,9,1,22,9,38,9,54,9,3,9,184,255,192,64,14,168,171,72,180,9,1,134,9,150, +9,166,9,3,9,184,255,192,64,22,159,162,72,36,9,1,6,9,22,9,2,156,182,9,198, +9,214,9,246,9,4,9,184,255,64,64,14,147,150,72,102,9,1,150,9,166,9,182,9,3, +9,184,255,192,64,24,137,144,72,98,9,114,9,130,9,3,64,9,80,9,2,34,9,50,9,2, +16,9,1,9,184,255,64,182,117,124,72,128,9,1,9,184,255,64,64,10,110,115,72, +4,9,20,9,2,108,9,184,255,64,64,62,101,107,72,180,9,196,9,212,9,3,150,9,166, +9,2,132,9,1,118,9,1,82,9,98,9,2,36,9,52,9,68,9,3,6,9,22,9,2,246,9,1,194,9, +210,9,2,1,144,9,160,9,176,9,3,100,9,116,9,132,9,3,9,184,255,128,64,16,71, +75,72,212,9,228,9,244,9,3,160,9,176,9,2,9,184,255,192,64,61,59,64,72,16,9, +32,9,2,4,9,1,55,180,9,228,9,244,9,3,128,9,144,9,2,84,9,100,9,116,9,3,27,9, +1,0,9,1,240,9,1,196,9,212,9,228,9,3,84,9,100,9,164,9,212,9,228,9,244,9,6, +9,184,255,192,64,20,26,31,72,64,9,1,2,15,9,1,7,0,6,156,7,15,0,3,1,3,0,47, +93,63,253,206,1,94,93,95,93,43,93,113,113,114,114,114,114,114,94,93,93,43, +93,93,43,113,113,95,113,113,114,114,114,114,114,114,114,43,94,93,43,93,43, +113,113,113,113,43,113,114,43,114,94,93,93,43,93,93,43,113,113,113,113,113, +113,114,114,114,114,94,93,93,93,93,93,113,113,113,47,94,93,93,93,93,43,113, +113,113,237,113,51,47,237,49,48,1,51,19,35,19,21,35,53,1,10,148,24,196,198, +194,2,173,252,12,5,129,201,201,0,0,0,1,0,135,255,225,3,250,5,129,0,43,0,137, +64,31,88,14,104,14,2,87,20,103,20,2,26,28,1,21,6,1,6,3,1,25,10,22,0,11,1, +11,11,3,39,71,17,184,255,192,64,56,8,11,72,17,31,70,30,30,3,70,4,34,80,217, +31,1,124,31,140,31,2,25,31,1,31,22,96,25,112,25,2,160,25,1,25,23,3,12,213, +3,1,112,3,128,3,2,21,3,101,3,2,3,0,80,9,10,0,47,221,237,51,93,93,93,51,63, +221,93,113,50,50,93,93,93,237,1,47,237,51,47,237,47,43,237,18,57,47,113,51, +205,50,49,48,0,93,93,93,93,93,1,50,54,55,23,14,3,7,21,35,53,46,3,53,52,62, +2,55,53,51,21,30,3,23,7,46,1,35,34,14,2,21,20,30,2,2,84,96,129,15,182,8,51, +88,126,83,124,111,154,95,43,66,111,146,80,124,78,120,86,54,12,185,14,114, +105,77,103,64,27,27,64,105,1,21,104,108,12,62,116,92,62,8,168,168,10,93,149, +195,113,150,206,131,63,7,155,155,8,55,85,109,63,14,90,106,51,103,156,105, +93,156,113,62,0,0,1,0,58,0,0,4,80,5,150,0,50,0,210,64,83,70,23,1,54,2,70, +2,2,21,18,37,18,53,18,3,36,0,39,13,6,26,111,25,25,39,0,44,110,6,35,39,110, +14,95,10,1,10,10,0,79,6,95,6,111,6,3,6,50,111,0,0,32,0,2,0,0,32,0,48,0,80, +0,112,0,144,0,176,0,208,0,8,0,0,16,0,48,0,192,0,224,0,5,0,184,255,192,64, +64,14,18,72,0,38,11,81,35,15,14,31,14,175,14,3,15,14,63,14,111,14,127,14, +159,14,175,14,207,14,223,14,8,8,14,64,37,42,72,14,64,27,32,72,14,14,44,31, +115,26,20,7,7,44,116,22,50,118,50,134,50,3,50,6,24,0,63,51,93,237,50,63,51, +237,18,57,47,43,43,94,93,113,51,237,50,1,47,43,93,113,114,237,47,93,18,57, +47,113,51,237,50,16,237,17,18,57,47,237,17,51,17,18,57,49,48,0,93,1,93,0, +93,1,14,3,35,33,53,62,1,61,1,35,53,51,17,52,62,2,51,50,30,2,23,7,46,3,35, +34,6,21,17,33,21,33,21,20,14,2,7,33,50,62,2,55,4,80,9,57,89,115,67,253,70, +89,86,186,186,48,99,152,103,70,123,99,71,18,174,10,39,53,65,36,114,112,1, +152,254,104,22,44,63,40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160, +121,144,129,1,24,92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,254,224, +129,126,56,106,92,71,21,19,42,67,48,0,0,0,2,0,113,0,225,4,2,4,115,0,35,0, +55,0,153,64,119,74,29,90,29,106,29,3,44,29,60,29,2,74,25,90,25,106,25,3,44, +25,60,25,2,69,11,85,11,101,11,3,35,11,51,11,2,69,7,85,7,101,7,3,35,7,51,7, +2,74,34,90,34,106,34,3,45,34,61,34,2,69,20,85,20,101,20,3,35,20,51,20,2,69, +16,85,16,101,16,3,35,16,51,16,2,74,2,90,2,106,2,3,45,2,61,2,2,46,176,18,36, +176,207,0,223,0,2,0,0,1,0,47,57,1,41,176,27,51,176,9,0,47,237,220,237,1,93, +47,93,93,237,220,237,49,48,93,93,93,93,93,93,93,93,0,93,93,93,93,93,93,93, +93,19,52,54,55,39,55,23,62,1,51,50,22,23,55,23,7,30,1,21,20,6,7,23,7,39,14, +1,35,34,38,39,7,39,55,46,1,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,137, +41,37,100,104,99,54,127,73,71,126,54,97,104,96,37,43,44,38,100,102,101,54, +126,71,72,128,52,105,102,102,37,41,154,44,77,102,58,57,102,77,44,44,77,102, +57,58,102,77,44,2,172,71,127,54,100,103,101,39,43,42,38,97,105,96,54,127, +71,71,128,53,100,105,101,37,41,42,38,105,105,102,54,127,73,58,102,76,44,44, +76,102,58,58,102,76,45,45,76,102,0,1,255,254,0,0,4,118,5,129,0,22,0,185,64, +134,151,0,167,0,2,152,17,168,17,2,73,22,1,70,18,1,155,21,171,21,2,74,21,106, +21,122,21,138,21,4,148,19,164,19,2,69,19,101,19,117,19,133,19,4,19,15,18, +31,18,79,18,143,18,4,18,9,21,0,22,16,22,64,22,128,22,4,22,20,4,0,8,92,17, +13,0,9,16,9,64,9,128,9,4,7,9,3,15,81,16,7,11,81,4,47,12,159,12,175,12,3,12, +64,41,45,72,0,12,16,12,32,12,160,12,4,12,20,0,0,16,1,15,16,175,16,2,8,16, +16,8,21,18,3,8,18,0,63,63,51,18,57,47,94,93,113,51,51,222,93,43,113,50,237, +50,16,237,50,1,47,94,93,51,51,253,50,50,57,204,93,50,16,204,93,50,49,48,93, +93,93,93,93,93,93,93,1,33,21,33,21,33,21,33,17,35,17,33,53,33,55,33,53,33, +1,51,9,1,51,2,208,1,65,254,129,1,127,254,129,178,254,131,1,125,2,254,129, +1,64,254,91,199,1,115,1,119,199,2,197,125,154,127,254,209,1,47,127,154,125, +2,188,253,121,2,135,0,2,0,183,254,78,1,93,5,204,0,3,0,7,1,221,64,23,3,7,171, +0,6,4,1,11,4,4,8,9,214,9,230,9,246,9,3,194,9,1,9,184,255,128,179,226,229, +72,9,184,255,192,64,10,222,225,72,2,9,18,9,2,218,9,184,255,128,179,214,217, +72,9,184,255,192,64,20,210,213,72,180,9,196,9,2,162,9,1,1,112,9,128,9,144, +9,3,9,184,255,192,64,20,199,202,72,0,9,1,240,9,1,212,9,228,9,2,176,9,192, +9,2,9,184,255,192,64,43,187,190,72,48,9,64,9,80,9,3,4,9,20,9,36,9,3,240,9, +1,196,9,212,9,228,9,3,128,9,144,9,160,9,3,4,9,20,9,36,9,3,164,9,184,255,192, +179,168,171,72,9,184,255,128,179,160,163,72,9,184,255,192,64,14,156,159,72, +112,9,128,9,144,9,3,228,9,1,9,184,255,192,64,11,145,148,72,176,9,192,9,208, +9,3,9,184,255,192,64,15,133,136,72,48,9,1,20,9,36,9,2,0,9,1,9,184,255,192, +64,15,122,125,72,128,9,1,4,9,20,9,36,9,3,110,9,184,255,192,64,10,114,117, +72,192,9,1,84,9,1,9,184,255,192,182,102,105,72,16,9,1,9,184,255,192,64,9, +91,94,72,80,9,96,9,2,9,184,255,192,64,15,79,82,72,203,9,219,9,2,160,9,176, +9,2,2,9,184,255,192,64,10,68,71,72,15,9,31,9,2,62,9,184,255,192,64,29,56, +61,72,207,9,1,96,9,112,9,160,9,176,9,4,31,9,1,0,9,1,160,9,224,9,240,9,3,9, +184,255,192,64,33,25,28,72,9,64,17,21,72,64,9,112,9,128,9,144,9,4,15,9,31, +9,47,9,3,7,5,0,5,0,1,4,1,0,0,63,47,18,57,57,47,47,1,94,93,93,43,43,113,114, +114,114,114,43,94,93,43,95,93,93,43,113,43,114,43,114,114,43,94,93,93,43, +113,113,113,43,113,43,113,114,43,43,43,94,93,93,93,93,113,113,43,113,113, +113,114,43,114,95,114,114,43,43,94,93,43,43,93,93,17,18,57,47,94,93,51,237, +50,49,48,19,17,51,17,3,17,51,17,183,166,166,166,2,194,3,10,252,246,251,140, +3,11,252,245,0,0,0,0,2,0,115,255,84,4,0,5,204,0,77,0,97,1,79,64,144,117,47, +133,47,2,122,8,138,8,2,100,85,1,43,85,107,85,2,45,81,109,81,2,45,57,109,57, +125,57,141,57,4,85,96,117,96,133,96,3,83,62,115,62,131,62,3,83,90,115,90, +131,90,3,121,80,137,80,2,111,80,1,90,80,1,45,80,1,116,16,132,16,2,54,16,70, +16,2,42,73,1,37,42,1,37,45,1,43,3,1,25,3,1,5,31,21,31,2,5,36,21,36,2,11,76, +27,76,2,14,73,75,34,73,55,144,75,1,75,55,75,55,78,70,29,65,24,6,73,5,5,24, +73,160,78,1,0,78,32,78,64,78,144,78,4,78,184,255,192,179,29,33,72,78,184, +255,192,64,18,21,26,72,78,45,73,44,44,88,73,0,65,32,65,176,65,3,65,184,255, +192,64,68,34,38,72,65,217,55,1,203,55,1,188,55,1,152,55,1,245,3,1,230,3,1, +149,3,1,121,83,1,106,83,1,218,83,1,155,83,1,228,14,244,14,2,166,14,1,119, +14,135,14,2,104,14,1,14,83,93,55,4,0,50,81,45,39,11,81,6,0,0,0,63,50,237, +47,51,237,18,23,57,93,93,93,93,93,93,113,113,93,93,93,93,93,93,93,1,47,43, +93,237,51,47,237,47,43,43,93,113,237,50,16,237,17,18,57,57,17,57,57,47,47, +114,16,237,16,237,49,48,93,93,93,93,93,0,93,93,1,93,0,93,93,93,93,93,93,93, +93,93,93,93,93,1,93,93,93,1,50,30,2,23,7,46,3,35,34,6,21,20,30,2,23,30,3, +21,20,14,2,7,30,3,21,20,14,2,35,34,46,2,39,55,30,3,51,50,62,2,53,52,46,2, +39,46,3,53,52,62,2,55,46,3,53,52,54,1,52,46,2,39,14,3,21,20,30,2,23,62,3, +2,76,79,138,108,73,15,161,8,46,68,84,46,125,129,50,83,109,59,68,139,112,70, +28,55,82,54,49,79,55,30,58,112,164,107,93,154,117,79,19,161,12,54,78,100, +57,58,102,76,45,57,95,123,65,65,131,104,65,32,59,84,53,42,75,57,33,211,1, +225,53,88,113,61,58,89,60,31,49,82,108,60,54,93,68,39,5,204,30,63,98,69,20, +45,58,34,13,79,71,45,64,46,32,14,16,46,73,106,76,45,87,73,55,13,21,51,64, +81,51,73,117,83,44,27,64,104,77,31,55,67,37,13,18,40,65,47,54,72,51,36,16, +15,46,73,105,74,45,83,71,53,15,14,46,64,80,48,139,155,252,203,48,69,51,35, +14,3,33,52,69,39,46,66,48,34,15,1,24,47,70,0,0,0,0,2,0,45,4,195,2,90,5,123, +0,3,0,7,0,193,178,3,133,0,184,255,192,179,19,22,72,0,184,255,192,64,131,13, +16,72,0,7,133,4,64,19,22,72,4,64,14,17,72,4,1,5,145,0,59,4,1,45,4,1,11,4, +27,4,2,57,253,4,1,235,4,1,219,4,1,201,4,1,171,4,187,4,2,153,4,1,141,4,1,1, +4,128,44,48,72,27,4,43,4,2,15,4,1,235,4,251,4,2,191,4,207,4,223,4,3,171,4, +1,159,4,1,123,4,139,4,2,111,4,1,91,4,1,79,4,1,59,4,1,31,4,47,4,2,2,15,4,63, +4,175,4,191,4,4,4,64,22,25,72,4,64,14,17,72,4,0,47,43,43,93,95,113,113,113, +113,113,113,113,113,113,113,114,114,43,95,114,114,114,114,114,114,114,94, +93,93,93,51,237,50,1,47,43,43,237,220,43,43,237,49,48,1,53,51,21,33,53,51, +21,1,183,163,253,211,165,4,195,184,184,184,184,0,0,0,0,3,0,31,255,240,5,197, +5,150,0,25,0,49,0,91,0,245,64,111,138,81,1,10,73,26,73,42,73,3,10,69,26,69, +42,69,3,76,60,1,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,138, +90,154,90,2,53,81,69,81,2,58,61,1,133,52,149,52,2,54,46,70,46,2,54,41,70, +41,2,57,35,73,35,2,57,30,73,30,2,50,196,81,61,95,71,111,71,2,71,61,71,61, +14,0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,68, +15,23,72,26,38,195,111,14,127,14,2,14,60,55,201,66,87,201,76,82,76,15,66, +127,66,2,15,66,31,66,127,66,143,66,159,66,255,66,6,0,76,1,0,76,16,76,112, +76,128,76,144,76,240,76,6,66,76,66,76,7,33,200,21,4,43,200,7,19,0,63,237, +63,237,18,57,57,47,47,93,113,93,113,17,51,16,237,16,237,51,1,47,113,237,47, +43,93,113,237,17,57,57,47,47,93,17,51,237,49,48,0,93,93,93,93,93,93,93,93, +1,93,93,93,93,113,93,93,113,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18, +7,52,46,4,35,34,14,2,21,20,30,2,51,50,62,4,37,20,30,2,51,50,62,2,55,23,14, +3,35,34,46,2,53,52,62,2,51,50,30,2,23,7,46,3,35,34,14,2,5,197,52,94,131,161, +185,100,99,185,160,133,94,52,52,94,132,161,184,100,150,1,7,197,113,92,45, +82,116,140,161,87,130,228,171,99,99,171,228,130,87,161,140,116,82,45,252, +137,33,67,100,67,49,75,56,39,14,115,22,58,82,111,75,101,149,98,48,48,97,146, +98,75,112,80,55,18,114,12,38,55,72,47,69,99,64,30,2,195,100,185,161,131,94, +52,52,94,131,161,185,100,100,184,161,132,94,52,114,196,254,249,150,86,161, +139,115,82,45,99,171,228,130,131,229,171,98,45,81,115,140,161,89,72,120,86, +48,27,45,55,29,35,43,81,63,38,64,114,158,94,97,157,111,59,36,59,75,39,33, +26,50,38,23,46,83,118,0,2,0,26,2,139,2,253,5,152,0,50,0,65,0,203,64,21,45, +40,10,17,72,46,40,10,17,72,3,40,11,17,72,7,24,11,14,72,29,184,255,216,64, +16,9,17,72,23,51,1,39,39,32,226,47,11,212,56,1,56,184,255,192,64,18,19,22, +72,144,56,1,100,56,116,56,132,56,3,80,56,1,2,56,184,255,192,64,20,10,13,72, +56,20,227,21,21,63,227,5,64,22,38,72,5,192,67,1,67,184,255,192,64,51,13,18, +72,26,57,1,11,57,1,57,228,152,20,1,20,8,10,13,72,20,16,11,1,2,11,1,11,11, +26,35,7,51,1,51,228,0,42,42,0,0,32,0,80,0,3,0,0,17,228,26,222,0,63,237,51, +47,93,51,47,16,237,93,50,17,57,47,93,93,51,43,93,237,93,93,1,43,93,47,43, +237,51,47,237,47,43,95,93,93,93,43,113,51,51,237,50,47,0,93,49,48,1,43,43, +43,43,43,1,34,46,2,53,52,62,2,63,1,53,52,46,2,35,34,6,7,39,62,3,51,50,30, +2,21,17,20,22,51,50,54,55,21,14,1,35,34,46,2,39,35,14,1,39,50,62,2,61,1,7, +14,3,21,20,22,1,4,53,86,62,33,51,86,113,62,178,21,39,56,35,67,81,9,149,7, +43,75,108,71,68,109,77,42,28,35,12,22,9,19,42,22,41,57,38,20,2,4,38,132,51, +48,80,57,32,138,41,74,55,32,58,2,139,29,56,82,52,69,92,56,24,1,4,60,46,60, +35,14,59,76,10,47,82,62,35,29,60,95,66,254,204,58,50,5,3,104,5,8,22,39,51, +29,77,70,111,34,55,71,37,65,4,2,11,29,52,43,56,65,0,0,2,0,83,0,141,4,32,3, +172,0,8,0,17,0,113,64,84,106,12,122,12,138,12,3,106,9,122,9,138,9,3,106,3, +122,3,138,3,3,106,0,122,0,138,0,3,17,236,15,235,14,236,95,10,127,10,143,10, +3,64,10,96,10,2,31,10,1,10,7,236,6,235,5,236,176,1,1,95,1,1,32,1,96,1,128, +1,3,1,9,0,239,12,15,3,47,3,111,3,127,3,4,3,0,47,93,51,228,50,1,47,93,113, +113,237,237,237,47,93,93,113,237,237,237,49,48,93,93,93,93,37,1,53,1,51,21, +9,1,21,33,1,53,1,51,21,9,1,21,3,118,254,174,1,82,168,254,174,1,84,253,131, +254,176,1,80,167,254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,1, +109,63,1,115,31,254,140,254,145,29,0,1,0,100,0,180,4,71,2,242,0,5,0,51,64, +19,223,2,1,32,2,1,2,5,170,224,0,1,159,0,1,80,0,1,0,184,255,192,64,9,9,12, +72,0,2,173,0,3,179,0,63,204,237,1,47,43,93,93,93,237,47,93,93,49,48,37,17, +33,53,33,17,3,182,252,174,3,227,180,1,172,146,253,194,0,0,4,0,31,255,240, +5,197,5,150,0,25,0,49,0,63,0,72,0,240,183,4,61,20,61,36,61,3,58,184,255,224, +64,94,11,16,72,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,61, +32,9,13,72,54,46,70,46,2,54,41,70,41,2,57,35,73,35,2,57,30,73,30,2,6,69,22, +69,2,51,62,62,69,63,69,53,196,54,64,196,59,59,50,63,63,16,54,63,54,63,14, +0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,60,15, +23,72,26,38,195,111,14,127,14,2,14,50,50,54,62,52,201,69,9,68,25,68,2,68, +201,55,15,54,31,54,127,54,3,223,55,1,0,55,16,55,112,55,3,54,69,55,55,69,54, +3,7,33,200,21,4,43,200,7,19,0,63,237,63,237,18,23,57,47,47,47,93,113,93,16, +237,93,16,237,50,17,51,47,1,47,113,237,47,43,93,113,237,17,57,57,47,47,56, +17,51,51,47,237,16,237,50,17,18,57,17,51,0,93,49,48,93,93,93,93,43,1,93,93, +93,93,43,93,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18,7,52,46,4,35,34, +14,2,21,20,30,2,51,50,62,4,1,3,35,17,35,17,33,50,22,21,20,6,7,19,3,52,38, +43,1,17,51,50,54,5,197,52,94,131,161,185,100,99,185,160,133,94,52,52,94,132, +161,184,100,150,1,7,197,113,92,45,82,116,140,161,87,130,228,171,99,99,171, +228,130,87,161,140,116,82,45,254,82,199,161,127,1,51,142,151,104,85,221,159, +95,81,170,182,80,84,2,195,100,185,161,131,94,52,52,94,131,161,185,100,100, +184,161,132,94,52,114,196,254,249,150,86,161,139,115,82,45,99,171,228,130, +131,229,171,98,45,81,115,140,161,254,181,1,80,254,176,3,63,126,111,102,123, +19,254,162,2,80,69,72,254,211,85,0,0,1,255,239,5,172,4,124,6,10,0,3,0,14, +180,1,0,2,140,1,0,47,237,1,47,47,49,48,1,33,53,33,4,124,251,115,4,141,5,172, +94,0,0,0,0,2,0,122,3,92,2,184,5,150,0,19,0,39,0,66,185,0,17,255,232,179,9, +12,72,13,184,255,232,64,33,9,12,72,7,24,9,12,72,3,24,9,12,72,20,172,0,30, +172,0,10,16,10,32,10,3,10,35,175,5,25,175,15,4,0,63,237,220,237,1,47,93,237, +220,237,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7, +52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,184,45,78,105,59,59,104,78,46, +46,78,104,59,59,105,78,45,109,27,48,65,38,37,65,48,28,28,48,65,37,38,65,48, +27,4,121,59,104,77,45,45,77,104,59,60,104,77,44,44,77,104,60,37,66,49,28, +28,49,66,37,37,65,49,29,29,49,65,0,0,0,2,0,65,0,0,4,36,4,195,0,11,0,15,0, +85,64,53,13,222,4,1,140,4,1,4,2,14,209,11,1,131,11,1,11,9,1,170,6,32,2,1, +2,13,173,12,151,2,1,2,0,4,173,9,152,7,1,7,239,5,1,80,5,128,5,160,5,208,5, +4,5,0,47,93,93,51,93,51,237,50,50,93,47,237,1,47,93,51,253,50,222,93,93,196, +16,222,93,93,196,49,48,1,17,35,17,33,53,33,17,51,17,33,21,1,53,33,21,2,124, +147,254,88,1,168,147,1,168,252,29,3,227,2,168,254,117,1,139,145,1,138,254, +118,145,253,88,145,145,0,0,1,0,41,2,51,2,131,5,141,0,34,0,142,64,56,6,18, +1,6,17,1,6,12,1,106,31,122,31,138,31,3,89,15,105,15,2,106,14,1,73,14,89,14, +2,10,3,26,3,2,10,2,26,2,58,2,74,2,4,58,17,90,17,106,17,3,6,23,22,23,2,23, +184,255,224,64,40,9,15,72,33,25,225,32,8,1,32,8,96,8,160,8,224,8,4,8,14,224, +15,15,32,191,0,1,0,8,32,14,11,228,20,222,1,32,229,0,223,0,63,237,50,63,237, +51,18,57,1,47,93,51,51,47,237,47,93,113,237,50,49,48,43,0,93,93,1,93,93,0, +93,93,93,93,1,113,113,113,19,39,62,5,53,52,38,35,34,6,7,39,62,3,51,50,30, +2,21,20,14,4,7,33,21,43,2,27,88,100,103,82,52,71,74,68,88,8,133,6,46,76,107, +68,65,103,71,37,54,83,102,95,78,18,1,187,2,51,103,61,96,81,72,73,80,49,62, +75,73,68,8,51,87,64,37,33,60,86,54,62,100,86,75,73,74,42,113,0,0,1,0,27,2, +39,2,130,5,141,0,53,0,150,64,17,102,6,1,102,8,1,86,9,102,9,2,89,34,105,34, +2,42,184,255,232,64,80,11,15,72,2,32,9,13,72,48,45,21,21,15,8,28,225,45,45, +0,225,32,15,96,15,2,32,15,96,15,160,15,224,15,4,15,34,225,8,35,1,35,35,9, +225,191,8,1,8,64,24,37,72,8,49,21,228,22,22,12,105,34,1,72,34,88,34,2,34, +31,228,40,222,12,228,71,9,1,9,3,221,0,63,51,93,237,63,237,51,93,93,18,57, +47,237,57,1,47,43,93,237,51,47,113,237,47,93,113,237,50,47,237,17,18,57,47, +18,57,49,48,0,43,43,93,93,93,93,1,20,6,35,34,46,2,39,55,30,1,51,50,54,53, +52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,6, +7,21,30,3,2,130,155,142,87,116,73,36,6,136,9,88,85,77,83,37,56,67,29,61,57, +29,61,50,32,74,71,68,84,6,135,7,50,79,102,59,69,104,70,35,86,90,52,75,48, +22,3,27,116,128,39,64,81,43,13,67,69,72,76,45,54,29,9,109,13,31,53,40,60, +69,70,65,12,58,86,57,28,33,59,79,46,75,110,20,2,5,37,54,69,0,0,1,0,72,4,177, +1,240,5,228,0,5,0,55,64,37,70,4,1,122,2,138,2,2,128,3,1,3,64,143,0,1,0,64, +9,13,72,0,2,149,128,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,26,237,1,47,43, +93,26,205,93,49,48,93,93,19,53,19,51,21,1,72,217,207,254,182,4,177,20,1,31, +29,254,234,0,1,0,140,254,87,4,109,4,58,0,39,0,136,64,74,29,32,9,17,72,138, +37,154,37,2,108,37,124,37,2,37,24,14,17,72,22,22,13,70,64,31,79,12,1,127, +12,143,12,159,12,3,12,64,32,35,72,12,64,20,23,72,0,12,1,12,41,128,39,2,70, +0,1,16,1,48,1,224,1,240,1,5,8,1,96,41,128,41,2,41,184,255,192,64,17,20,23, +72,31,8,80,35,22,19,80,26,22,12,1,15,0,27,0,63,63,51,63,237,63,237,50,1,43, +93,47,94,93,237,50,26,16,220,93,43,43,93,113,50,26,237,50,47,49,48,43,0,93, +93,1,43,19,17,51,17,20,30,2,51,50,54,53,17,51,17,20,30,2,51,50,54,55,21,14, +1,35,34,46,2,39,35,14,1,35,34,38,39,17,140,181,32,58,84,52,128,146,180,11, +20,29,18,11,32,11,26,51,36,54,71,44,20,2,3,52,147,100,67,109,31,254,87,5, +227,253,82,78,106,65,28,174,162,2,115,252,208,44,56,32,13,5,3,129,8,12,30, +52,71,41,95,99,41,38,254,28,0,0,0,0,1,0,80,254,248,3,245,5,129,0,19,0,61, +64,39,12,1,15,2,191,2,207,2,3,2,5,95,6,111,6,127,6,175,6,191,6,5,0,6,16,6, +48,6,3,6,7,7,1,0,4,17,3,6,1,0,47,51,63,205,50,18,57,47,1,47,93,93,205,220, +93,205,47,49,48,1,17,35,17,35,17,35,17,34,46,2,53,52,62,2,51,33,21,3,116, +112,217,113,80,133,96,53,50,95,138,87,2,51,5,27,249,221,6,35,249,221,3,190, +45,88,133,89,84,133,93,50,102,0,0,1,0,187,1,190,1,126,2,154,0,3,0,38,64,24, +3,150,0,0,16,0,176,0,3,7,0,0,155,15,1,31,1,2,1,64,15,38,72,1,0,47,43,93,237, +1,47,94,93,237,49,48,19,53,51,21,187,195,1,190,220,220,0,0,0,1,0,119,254, +78,1,227,0,0,0,27,0,126,64,16,24,32,20,23,72,25,32,20,23,72,70,26,86,26,2, +2,184,255,232,179,9,17,72,27,184,255,224,64,62,9,17,72,24,16,25,32,25,48, +25,3,25,131,23,22,22,8,16,131,47,0,1,31,0,1,15,0,111,0,2,8,0,239,8,1,8,19, +25,64,9,13,72,25,25,5,23,11,140,32,5,80,5,96,5,112,5,176,5,192,5,6,5,0,47, +93,237,47,18,57,47,43,205,1,47,93,221,94,93,113,114,237,18,57,47,51,237,93, +50,49,48,43,43,93,43,43,5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35, +42,1,7,55,51,7,30,1,1,227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14, +29,14,65,107,39,94,94,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,182,100, +3,81,0,0,1,0,80,2,51,2,125,5,129,0,10,0,75,64,44,32,5,48,5,2,96,9,1,9,9,8, +224,2,32,4,48,4,2,4,111,0,1,0,0,4,6,3,32,2,144,2,2,2,5,4,4,3,6,220,8,1,228, +0,223,0,63,237,50,63,51,51,47,51,1,47,93,23,51,47,93,47,0,93,1,16,237,50, +47,93,49,48,0,93,19,53,51,17,7,53,55,51,17,51,21,80,211,202,210,123,215,2, +51,107,2,108,138,120,137,253,29,107,0,0,0,0,2,0,27,2,139,2,211,5,152,0,15, +0,35,0,130,185,0,13,255,232,179,7,12,72,9,184,255,224,64,43,7,12,72,4,32, +7,12,72,2,32,7,12,72,0,227,4,16,36,16,52,16,100,16,4,148,16,180,16,196,16, +212,16,244,16,5,128,16,1,2,0,16,1,16,184,255,192,64,38,12,16,72,16,26,227, +6,64,22,33,72,6,239,37,1,112,37,128,37,2,47,37,1,31,228,0,3,32,3,80,3,3,3, +3,21,228,11,222,0,63,237,51,47,93,237,1,93,93,93,47,43,237,47,43,93,95,93, +93,113,237,49,48,0,43,43,43,43,1,20,6,35,34,38,53,52,62,2,51,50,30,2,7,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,211,176,175,168,177,43,87,131,88, +93,131,84,39,149,25,50,72,48,48,75,51,26,28,51,70,43,49,75,52,27,4,18,188, +203,201,190,91,145,101,53,53,100,145,92,83,110,65,27,27,66,110,82,84,110, +66,26,26,66,110,0,2,0,83,0,141,4,32,3,172,0,8,0,17,0,133,64,100,101,15,117, +15,133,15,3,101,9,117,9,133,9,3,101,6,117,6,133,6,3,101,0,117,0,133,0,3,13, +236,10,236,17,235,15,12,1,239,12,1,112,12,128,12,2,208,12,1,63,12,111,12, +127,12,3,0,12,1,12,4,236,1,236,8,235,112,3,128,3,176,3,3,176,3,208,3,2,63, +3,1,0,3,32,3,2,3,10,0,239,14,15,5,47,5,111,5,127,5,4,5,0,47,93,51,228,50, +1,47,93,93,93,113,253,237,237,47,93,93,93,113,113,114,253,237,237,49,48,93, +93,93,93,37,35,53,9,1,53,51,1,21,1,35,53,9,1,53,51,1,21,2,206,168,1,82,254, +176,166,1,82,252,221,170,1,82,254,176,168,1,79,141,29,1,111,1,116,31,254, +141,63,254,147,29,1,111,1,116,31,254,141,63,255,255,0,56,0,0,6,78,5,129,16, +38,0,121,232,0,16,39,2,20,2,249,0,0,17,7,2,141,3,184,253,207,0,31,64,18,1, +191,12,1,112,12,1,96,12,1,16,12,1,12,3,2,17,24,0,63,53,53,1,17,93,93,93,93, +53,0,0,0,255,255,0,56,0,0,6,117,5,129,16,38,0,121,232,0,16,39,2,20,2,249, +0,0,17,7,0,114,3,242,253,207,0,47,64,30,2,111,15,1,47,15,1,15,1,191,12,1, +112,12,1,96,12,1,16,12,1,12,51,64,11,11,72,2,15,24,0,63,53,1,43,17,93,93, +93,93,53,17,93,93,53,0,0,0,255,255,0,73,0,0,6,78,5,141,16,39,2,20,3,13,0, +0,16,39,2,141,3,184,253,207,17,6,0,115,46,0,0,33,64,20,0,112,0,1,96,0,1,16, +0,1,0,83,64,11,11,72,1,2,6,24,0,63,53,53,1,43,17,93,93,93,53,0,0,2,0,131, +254,164,4,86,4,58,0,37,0,41,0,159,64,112,121,4,137,4,2,122,35,138,35,2,122, +36,138,36,2,84,26,100,26,2,58,6,74,6,122,6,138,6,4,10,72,9,9,176,39,192,39, +2,39,150,40,40,0,28,70,95,27,127,27,2,27,64,29,60,72,27,64,23,27,72,32,27, +1,27,19,70,0,64,29,60,72,0,64,23,27,72,0,64,13,17,72,32,0,1,0,32,43,1,19, +33,9,40,156,41,15,67,27,1,27,24,95,47,33,63,33,2,111,33,207,33,2,33,0,47, +93,113,237,51,93,63,253,206,17,57,1,93,47,93,43,43,43,237,47,93,43,43,93, +237,18,57,47,237,113,51,47,237,49,48,93,0,93,1,93,0,93,1,93,55,52,62,6,55, +51,14,7,21,20,30,2,51,50,54,55,23,14,3,35,34,46,2,1,21,35,53,131,37,62,79, +82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184,11,67, +121,179,122,114,178,123,64,2,113,195,50,71,108,85,67,60,58,68,83,55,69,104, +80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103,147,4,100, +201,201,0,0,0,255,255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,148,1,78,0, +0,0,21,180,2,21,5,38,2,184,255,225,180,22,25,4,7,37,1,43,53,0,43,53,0,255, +255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,149,1,219,0,0,0,19,64,11,2,21, +5,38,2,76,21,24,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,6,254,18, +38,0,36,0,0,17,7,2,150,1,96,0,0,0,19,64,11,2,22,5,38,2,0,27,21,4,7,37,1,43, +53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,7,6,18,38,0,36,0,0,17,7,2,153,1,94, +0,0,0,19,64,11,2,21,5,38,2,2,30,44,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0, +4,0,0,5,82,6,178,18,38,0,36,0,0,17,7,2,152,1,108,0,0,0,23,64,13,3,2,21,5, +38,3,2,4,25,23,4,7,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,4,0,0,5,82,6, +251,18,38,0,36,0,0,17,7,1,76,1,137,0,136,0,22,64,12,3,2,56,3,3,2,3,31,21, +4,7,37,1,43,53,53,0,63,53,53,0,2,0,24,0,0,7,168,5,129,0,15,0,26,0,136,64, +86,116,25,1,114,2,1,86,2,102,2,2,115,3,131,3,2,85,3,101,3,2,127,5,143,5,2, +109,5,1,92,5,1,25,5,41,5,2,0,7,1,11,7,11,7,0,16,14,32,14,2,14,2,25,3,17,3, +4,17,9,13,90,26,5,0,2,95,25,25,5,4,12,95,9,9,13,16,8,95,5,3,4,18,13,95,0, +18,0,63,237,63,63,237,50,18,57,47,237,17,18,57,47,237,1,47,51,51,237,50,51, +47,51,17,18,57,57,47,93,18,57,57,47,47,113,49,48,93,93,93,93,93,93,93,93, +93,33,17,33,3,35,1,33,21,33,17,33,21,33,17,33,21,1,35,14,5,7,3,33,3,201,253, +220,198,199,2,174,4,185,253,9,2,187,253,69,3,32,252,33,151,1,16,22,27,24, +18,2,217,1,222,1,156,254,100,5,129,156,254,60,154,254,21,156,4,238,3,35,50, +58,51,38,5,254,51,0,0,255,255,0,104,254,78,5,121,5,150,18,38,0,38,0,0,17, +7,0,120,1,254,0,0,0,11,182,1,58,48,40,26,16,37,1,43,53,0,0,0,255,255,0,168, +0,0,4,254,6,240,18,38,0,40,0,0,17,7,2,148,1,63,0,0,0,21,180,1,12,5,38,1,184, +255,170,180,13,16,0,10,37,1,43,53,0,43,53,0,255,255,0,168,0,0,4,254,6,240, +18,38,0,40,0,0,17,7,2,149,1,223,0,0,0,19,64,11,1,12,5,38,1,40,12,15,0,10, +37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40,0,0,17, +7,2,150,1,119,0,0,0,21,180,1,13,5,38,1,184,255,239,180,18,12,0,10,37,1,43, +53,0,43,53,0,255,255,0,168,0,0,4,254,6,178,18,38,0,40,0,0,17,7,2,152,1,121, +0,0,0,25,182,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10,37,1,43,53,53,0,43, +53,53,0,255,255,0,9,0,0,1,177,6,240,18,38,0,44,0,0,17,6,2,148,159,0,0,21, +180,1,4,5,38,1,184,255,193,180,5,8,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0, +142,0,0,2,54,6,240,18,38,0,44,0,0,17,6,2,149,70,0,0,19,64,11,1,4,5,38,1,69, +4,7,0,2,37,1,43,53,0,43,53,0,255,255,255,210,0,0,2,104,6,254,18,38,0,44,0, +0,17,6,2,150,210,0,0,19,64,11,1,5,5,38,1,0,10,4,0,2,37,1,43,53,0,43,53,0, +255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218,0,0,23,64,13,2,1, +4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,2,0,14,0,0,5,101,5,129, +0,16,0,33,0,112,64,69,117,10,1,91,32,139,32,2,91,31,139,31,2,90,20,138,20, +2,91,19,1,10,31,26,31,2,10,20,26,20,2,26,26,28,8,90,64,15,17,1,17,35,128, +24,28,90,14,16,16,1,14,27,16,95,24,127,0,1,0,0,2,28,95,14,18,23,95,2,3,0, +63,237,63,237,17,57,47,113,51,237,50,1,47,51,51,47,16,237,50,26,16,220,113, +26,237,18,57,47,49,48,93,93,93,0,93,1,93,93,0,93,19,51,17,33,50,4,22,18,21, +20,2,14,1,35,33,17,35,37,52,46,2,35,33,17,33,21,33,17,33,50,62,2,14,154,1, +210,163,1,19,198,111,106,184,251,145,253,241,154,4,151,82,148,206,123,254, +241,1,150,254,106,1,58,111,189,138,78,3,33,2,96,81,169,254,252,180,176,254, +243,181,93,2,135,72,143,203,130,61,254,57,154,254,18,72,142,212,0,255,255, +0,168,0,0,5,32,7,6,18,38,0,49,0,0,17,7,2,153,1,161,0,0,0,19,64,11,1,20,5, +38,1,12,29,43,8,18,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6, +240,18,38,0,50,0,0,17,7,2,148,1,182,0,0,0,21,180,2,40,5,38,2,184,255,216, +180,41,44,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255,236,5,215,6,240,18,38, +0,50,0,0,17,7,2,149,2,37,0,0,0,19,64,11,2,40,5,38,2,37,40,43,10,0,37,1,43, +53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,254,18,38,0,50,0,0,17,7,2,150, +1,213,0,0,0,19,64,11,2,41,5,38,2,4,46,40,10,0,37,1,43,53,0,43,53,0,0,0,255, +255,0,97,255,236,5,215,7,6,18,38,0,50,0,0,17,7,2,153,1,193,0,0,0,21,180,2, +40,5,38,2,184,255,245,180,49,63,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255, +236,5,215,6,178,18,38,0,50,0,0,17,7,2,152,1,215,0,0,0,25,182,3,2,40,5,38, +3,2,184,255,255,180,44,42,10,0,37,1,43,53,53,0,43,53,53,0,0,1,0,142,0,225, +4,31,4,115,0,11,0,129,185,0,5,255,232,179,18,22,72,3,184,255,232,64,14,18, +22,72,11,24,18,22,72,9,24,18,22,72,8,184,255,232,179,18,22,72,6,184,255,232, +64,14,18,22,72,2,24,18,22,72,0,24,18,22,72,7,184,255,232,64,14,18,22,72,1, +24,18,22,72,10,24,18,22,72,4,184,255,232,64,23,18,22,72,212,4,228,4,2,180, +4,196,4,212,4,3,32,4,1,4,0,7,1,7,0,25,47,113,1,47,93,93,113,49,48,0,43,43, +1,43,43,43,43,43,43,0,43,43,43,43,19,9,1,55,9,1,23,9,1,7,9,1,142,1,98,254, +160,104,1,94,1,94,105,254,162,1,96,102,254,159,254,156,1,74,1,98,1,96,103, +254,159,1,95,105,254,164,254,160,105,1,97,254,157,0,3,0,71,255,203,5,244, +5,186,0,27,0,39,0,51,0,196,64,141,89,44,1,8,37,1,84,33,1,5,26,21,26,101,26, +3,139,23,1,123,22,139,22,2,108,22,1,90,22,1,105,16,1,10,12,26,12,2,132,9, +1,116,8,132,8,2,99,8,1,85,8,1,27,50,91,50,2,114,43,130,43,2,84,43,1,20,38, +84,38,2,85,37,1,140,31,1,74,31,90,31,122,31,3,4,21,20,21,100,21,3,11,7,27, +7,107,7,3,32,44,40,0,91,64,15,28,1,28,53,128,32,53,1,40,91,175,14,191,14, +2,32,14,1,15,14,31,14,2,14,43,31,35,47,95,23,19,4,35,95,9,5,19,0,63,51,237, +63,51,237,17,57,57,1,47,93,93,93,237,93,26,16,220,113,26,237,18,57,57,49, +48,0,93,93,93,93,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93, +93,1,20,2,6,4,35,34,38,39,7,35,55,38,2,53,52,18,54,36,51,50,22,23,55,51,7, +22,18,7,52,38,39,1,30,1,51,50,62,2,37,20,22,23,1,46,1,35,34,14,2,5,215,95, +180,254,252,165,127,206,81,120,190,200,88,86,92,178,1,5,169,125,207,82,121, +192,201,85,87,195,49,49,253,59,59,150,93,132,191,123,59,252,15,50,51,2,195, +59,151,92,126,190,127,63,2,199,165,254,242,192,104,58,54,145,241,97,1,10, +160,165,1,10,187,101,56,54,146,242,94,254,253,160,112,184,72,252,171,44,47, +86,153,212,125,113,190,75,3,85,42,46,80,148,208,0,0,255,255,0,158,255,236, +5,41,6,240,18,38,0,56,0,0,17,7,2,148,1,141,0,0,0,21,180,1,26,5,38,1,184,255, +232,180,27,30,5,20,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,6,240, +18,38,0,56,0,0,17,7,2,149,1,237,0,0,0,19,64,11,1,26,5,38,1,37,26,29,5,20, +37,1,43,53,0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,254,18,38,0,56,0,0, +17,7,2,150,1,152,0,0,0,19,64,11,1,27,5,38,1,0,32,26,5,20,37,1,43,53,0,43, +53,0,0,0,255,255,0,158,255,236,5,41,6,178,18,38,0,56,0,0,17,7,2,152,1,158, +0,0,0,25,182,2,1,26,5,38,2,1,184,255,254,180,30,28,5,20,37,1,43,53,53,0,43, +53,53,0,255,255,0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,149,1,208,0,0,0, +19,64,11,1,9,5,38,1,65,9,12,4,8,37,1,43,53,0,43,53,0,0,0,0,2,0,168,0,0,4, +234,5,129,0,16,0,27,0,95,64,63,150,15,1,116,26,132,26,2,123,18,139,18,2,0, +90,16,17,48,17,144,17,3,255,17,1,0,17,16,17,32,17,64,17,4,17,22,11,7,90,0, +8,16,8,64,8,3,7,8,22,95,6,21,95,11,6,11,6,11,7,9,3,7,18,0,63,63,18,57,57, +47,47,16,237,16,237,1,47,94,93,237,50,50,47,93,93,113,237,49,48,0,93,93,93, +1,20,14,2,35,33,17,35,17,51,21,33,50,30,2,7,52,38,35,33,17,33,50,62,2,4,234, +59,121,182,123,254,98,191,191,1,146,125,186,124,62,192,164,164,254,133,1, +131,82,121,79,38,2,223,88,159,120,71,254,215,5,129,252,60,111,156,99,134, +149,253,192,44,79,107,0,0,0,0,1,0,142,255,236,4,143,5,204,0,67,0,214,64,150, +149,51,1,133,63,149,63,2,133,47,149,47,2,133,46,149,46,2,118,65,1,118,56, +1,83,26,131,26,147,26,3,92,39,108,39,124,39,3,107,22,1,58,22,1,145,52,1,21, +52,37,52,2,22,66,38,66,118,66,3,26,3,42,3,2,61,72,24,54,72,31,32,24,1,31, +31,1,9,24,31,31,24,9,3,43,0,72,64,48,17,160,17,2,160,17,176,17,2,17,69,128, +42,70,0,43,16,43,48,43,3,8,43,112,69,1,63,69,79,69,2,212,31,1,197,31,1,182, +31,1,219,17,1,202,17,1,185,17,1,31,17,5,36,80,49,0,43,21,14,80,5,22,0,63, +237,63,63,237,18,57,57,93,93,93,93,93,93,1,93,93,47,94,93,237,26,16,220,93, +113,26,237,18,23,57,47,47,47,93,93,16,237,16,237,49,48,0,93,1,93,93,93,93, +93,0,93,93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,38,47,1,30,3,51,50,54,53, +52,46,4,53,52,62,4,53,52,46,2,35,34,14,2,21,17,35,17,52,62,2,51,50,30,2,21, +20,14,4,21,20,30,4,4,143,41,87,136,94,80,148,55,2,25,67,74,78,37,92,98,54, +81,95,81,54,33,49,58,49,33,33,63,90,57,68,107,73,39,180,63,120,174,110,102, +155,105,53,33,51,58,51,33,55,82,95,82,55,1,39,66,115,85,49,25,24,164,14,25, +19,11,86,79,56,77,62,57,73,98,73,51,73,58,48,52,63,43,37,62,45,26,35,77,122, +88,252,3,4,3,118,173,112,54,46,80,109,62,61,90,69,53,47,48,28,38,59,57,64, +85,114,0,0,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,67,0, +188,0,0,0,21,180,2,66,17,38,2,184,255,149,180,67,70,3,36,37,1,43,53,0,43, +53,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,116,1,84,0,0, +0,19,64,11,2,66,17,38,2,11,66,69,3,36,37,1,43,53,0,43,53,0,0,0,255,255,0, +87,255,236,4,115,5,211,18,38,0,68,0,0,17,7,1,71,0,218,0,0,0,21,180,2,67,17, +38,2,184,255,192,180,72,66,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236, +4,115,5,189,18,38,0,68,0,0,17,7,1,78,0,245,0,0,0,21,180,2,66,17,38,2,184, +255,224,180,75,89,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,115,5, +123,18,38,0,68,0,0,17,7,0,105,0,235,0,0,0,25,182,3,2,66,17,38,3,2,184,255, +202,180,70,68,3,36,37,1,43,53,53,0,43,53,53,0,255,255,0,87,255,236,4,115, +6,115,18,38,0,68,0,0,17,7,1,76,1,8,0,0,0,25,182,3,2,71,17,38,3,2,184,255, +200,180,76,66,3,36,37,1,43,53,53,0,43,53,53,0,0,3,0,66,255,236,6,194,4,78, +0,62,0,79,0,88,0,251,64,96,134,54,1,122,36,1,123,58,1,117,8,133,8,2,101,68, +117,68,133,68,3,124,86,1,106,86,1,126,81,1,106,81,1,101,4,117,4,2,41,47,1, +41,44,1,24,40,9,13,72,10,28,26,28,2,17,53,88,1,70,33,31,79,79,79,95,79,127, +79,4,79,79,80,25,9,73,10,10,61,71,64,31,80,47,80,63,80,3,144,80,1,80,90,128, +44,71,45,184,255,192,64,19,21,28,72,45,45,71,71,25,64,12,15,72,25,62,80,80, +80,6,53,184,255,184,64,43,17,73,53,83,80,56,16,63,81,33,33,74,50,143,44,1, +43,44,1,44,44,39,80,50,16,17,74,80,22,22,6,80,15,239,9,1,128,9,1,9,9,15,22, +0,63,51,47,93,93,16,237,63,237,50,63,237,51,47,93,93,17,18,57,47,237,63,237, +50,43,18,57,47,237,1,47,43,237,51,47,43,237,26,16,220,93,113,26,237,50,47, +237,17,18,57,47,93,51,237,50,57,57,49,48,93,43,0,93,93,1,93,0,93,93,93,93, +1,93,0,93,1,93,0,93,93,1,21,30,3,51,50,54,55,23,14,3,35,32,3,14,3,35,34,38, +53,52,62,4,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,23,62,1,51,50,30, +2,29,1,37,7,14,5,21,20,22,51,50,62,2,53,37,46,1,35,34,14,2,7,3,200,1,34,70, +109,78,117,141,25,158,17,61,102,153,108,254,191,102,29,74,102,137,93,167, +169,38,67,91,107,117,60,240,26,57,88,61,54,88,64,39,7,188,10,58,105,159,112, +128,172,49,63,177,106,136,183,111,47,252,80,195,40,81,76,66,49,28,100,93, +90,129,83,40,2,246,15,144,135,45,96,81,54,4,1,247,17,82,136,98,55,94,72,45, +45,91,73,47,1,1,51,93,71,42,172,150,71,108,78,51,32,13,1,4,59,67,94,58,27, +15,39,67,51,17,64,107,78,43,70,69,74,65,88,155,210,122,24,31,4,1,6,18,31, +51,73,51,87,97,63,98,116,53,196,171,157,29,74,127,98,255,255,0,87,254,78, +3,202,4,78,18,38,0,70,0,0,17,7,0,120,1,12,0,0,0,11,182,1,40,48,40,19,9,37, +1,43,53,0,0,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,67,0, +221,0,0,0,21,180,2,38,17,38,2,184,255,228,180,39,42,17,27,37,1,43,53,0,43, +53,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,116,1,112,0,0, +0,19,64,11,2,38,17,38,2,84,38,41,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0, +87,255,236,4,24,5,211,18,38,0,72,0,0,17,7,1,71,0,245,0,0,0,19,64,11,2,39, +17,38,2,8,44,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,24, +5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3,2,4,42, +40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,10,0,0,1,178,5,228,18,38, +0,241,0,0,17,6,0,67,160,0,0,21,180,1,4,17,38,1,184,255,194,180,5,8,0,2,37, +1,43,53,0,43,53,0,0,0,255,255,0,135,0,0,2,47,5,228,18,38,0,241,0,0,17,6,0, +116,63,0,0,19,64,11,1,4,17,38,1,63,4,7,0,2,37,1,43,53,0,43,53,0,255,255,255, +211,0,0,2,105,5,211,18,38,0,241,0,0,17,6,1,71,211,0,0,19,64,11,1,5,17,38, +1,2,10,4,0,2,37,1,43,53,0,43,53,0,255,255,0,8,0,0,2,53,5,123,18,38,0,241, +0,0,17,6,0,105,219,0,0,23,64,13,2,1,4,17,38,2,1,2,8,6,0,2,37,1,43,53,53,0, +43,53,53,0,0,2,0,86,255,236,4,39,5,234,0,39,0,57,0,190,64,94,100,51,1,100, +56,1,107,42,1,107,48,1,10,14,26,14,2,37,17,53,17,69,17,3,6,8,22,8,2,23,26, +29,3,50,15,28,31,28,2,28,28,50,35,71,40,64,19,16,13,3,40,17,64,14,19,72,22, +5,17,17,5,144,40,1,144,40,160,40,2,40,59,128,50,71,31,5,1,5,26,19,29,16,4, +17,27,27,22,45,80,13,80,10,1,10,184,255,192,64,28,7,10,72,82,17,1,36,17,52, +17,68,17,3,2,17,18,17,2,10,17,10,17,22,0,53,80,0,22,0,63,237,63,57,57,47, +47,93,93,93,43,93,51,237,17,51,47,18,23,57,1,47,93,237,26,16,204,93,113,17, +57,47,18,57,43,18,23,57,26,16,237,17,57,47,93,18,23,57,49,48,0,93,93,1,93, +0,93,93,93,93,5,34,46,2,53,52,62,2,51,50,22,23,46,1,39,5,53,55,46,1,39,51, +30,1,23,37,15,1,30,3,29,1,20,14,2,19,52,46,2,35,34,14,2,21,20,22,51,50,62, +2,2,54,125,181,118,56,52,116,186,133,71,117,43,43,115,76,254,211,218,56,120, +66,209,45,83,42,1,50,1,211,81,129,88,47,57,120,188,176,33,71,113,80,81,115, +73,33,144,145,81,118,75,36,20,73,132,185,111,107,182,134,75,32,27,86,176, +69,133,114,94,45,78,35,20,51,31,132,112,92,74,176,200,223,121,6,122,196,138, +74,1,245,94,137,90,44,45,92,137,91,190,178,44,90,139,0,255,255,0,140,0,0, +3,242,5,189,18,38,0,81,4,0,17,7,1,78,0,245,0,0,0,19,64,11,1,38,17,38,1,5, +47,61,19,36,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,228,18,38, +0,82,0,0,17,7,0,67,0,223,0,0,0,21,180,2,35,17,38,2,184,255,228,180,36,39, +8,0,37,1,43,53,0,43,53,0,255,255,0,86,255,236,4,29,5,228,18,38,0,82,0,0,17, +7,0,116,1,103,0,0,0,19,64,11,2,35,17,38,2,73,35,38,8,0,37,1,43,53,0,43,53, +0,0,0,255,255,0,86,255,236,4,29,5,211,18,38,0,82,0,0,17,7,1,71,0,240,0,0, +0,19,64,11,2,36,17,38,2,1,41,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86, +255,236,4,29,5,189,18,38,0,82,0,0,17,7,1,78,0,247,0,0,0,19,64,11,2,35,17, +38,2,13,44,58,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,123, +18,38,0,82,0,0,17,7,0,105,0,250,0,0,0,23,64,13,3,2,35,17,38,3,2,4,39,37,8, +0,37,1,43,53,53,0,43,53,53,0,0,0,0,3,0,65,0,223,4,36,4,117,0,3,0,7,0,11,0, +75,64,48,3,11,171,0,8,8,4,128,6,160,6,2,95,6,1,32,6,1,6,63,4,95,4,111,4,3, +4,9,174,64,8,144,8,2,8,4,173,5,0,174,79,1,159,1,2,1,5,179,0,63,222,93,237, +16,253,222,93,237,1,47,93,47,93,93,93,18,57,47,51,237,50,49,48,1,53,51,21, +1,53,33,21,1,53,51,21,1,222,168,253,187,3,227,253,186,168,3,190,183,183,254, +162,146,146,254,127,183,183,0,0,3,0,44,255,218,4,180,4,92,0,22,0,34,0,45, +0,161,64,93,117,33,133,33,2,117,27,133,27,2,122,38,138,38,2,122,44,138,44, +2,150,16,1,66,16,1,77,5,1,68,21,1,75,10,1,27,38,35,0,71,64,15,23,207,23,2, +159,23,175,23,255,23,3,23,47,128,35,71,0,12,1,0,12,16,12,32,12,64,12,240, +12,5,7,12,144,47,160,47,240,47,3,224,47,1,223,47,1,0,47,32,47,2,47,184,255, +192,64,16,13,21,72,37,26,30,41,80,18,14,16,30,80,7,3,22,0,63,51,237,63,51, +237,17,57,57,1,43,93,93,93,113,47,94,93,113,237,26,16,220,93,113,26,237,18, +57,57,49,48,93,93,0,93,93,93,93,1,93,93,0,93,1,16,2,35,34,38,39,7,35,55,46, +1,53,16,33,50,22,23,55,51,7,30,1,7,52,38,39,1,30,1,51,50,62,2,37,20,23,1, +46,1,35,34,14,2,4,88,250,238,97,156,60,100,167,184,41,42,1,229,103,156,57, +91,167,173,42,39,189,12,11,254,29,38,105,62,69,112,78,42,253,179,24,1,226, +37,104,66,69,111,78,41,2,30,254,228,254,234,48,50,116,214,68,182,116,2,48, +46,45,105,201,69,185,119,68,109,44,253,206,49,39,39,98,166,126,130,85,2,49, +45,36,41,99,164,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0, +67,0,236,0,0,0,21,180,1,38,17,38,1,184,255,236,180,39,42,36,19,37,1,43,53, +0,43,53,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0,116,1,87, +0,0,0,19,64,11,1,38,17,38,1,53,38,41,36,19,37,1,43,53,0,43,53,0,0,0,255,255, +0,139,255,236,3,241,5,211,18,38,0,88,6,0,17,7,1,71,0,239,0,0,0,21,180,1,39, +17,38,1,184,255,252,180,44,38,36,19,37,1,43,53,0,43,53,0,255,255,0,139,255, +236,3,241,5,123,18,38,0,88,6,0,17,7,0,105,0,237,0,0,0,25,182,2,1,38,17,38, +2,1,184,255,243,180,42,40,36,19,37,1,43,53,53,0,43,53,53,0,255,255,0,5,254, +87,3,252,5,228,18,38,0,92,0,0,17,7,0,116,1,27,0,0,0,19,64,11,1,32,17,38,1, +54,32,35,17,31,37,1,43,53,0,43,53,0,0,0,0,2,0,138,254,87,4,29,5,204,0,34, +0,54,0,109,64,76,102,52,118,52,2,105,38,121,38,2,73,25,89,25,2,70,10,86,10, +2,25,21,41,21,137,21,153,21,4,22,15,38,15,134,15,150,15,4,18,71,64,160,35, +1,35,56,128,45,7,33,70,0,34,16,34,48,34,240,34,4,8,34,33,27,26,50,80,23,22, +7,40,80,13,16,0,0,0,63,63,237,50,63,237,50,63,1,47,94,93,237,50,50,26,16, +220,93,26,237,49,48,0,93,93,93,93,93,93,19,51,17,20,6,7,6,7,51,62,3,51,50, +30,2,21,20,14,2,35,34,38,39,35,30,3,21,17,35,1,52,46,2,35,34,14,2,21,20,30, +2,51,50,62,2,138,180,1,1,1,1,6,25,64,82,101,63,112,153,93,40,40,93,153,112, +116,174,46,5,1,1,1,1,180,2,214,24,59,98,74,60,106,79,46,38,73,108,70,75,99, +59,24,5,204,254,89,30,55,21,25,22,52,73,47,21,80,145,205,125,123,208,150, +85,88,100,2,32,48,59,29,254,89,3,199,100,156,108,56,34,96,169,135,115,159, +98,43,58,110,159,255,255,0,5,254,87,3,252,5,123,18,38,0,92,0,0,17,7,0,105, +0,187,0,0,0,25,182,2,1,32,17,38,2,1,184,255,254,180,36,34,17,31,37,1,43,53, +53,0,43,53,53,0,255,255,0,4,0,0,5,82,6,161,18,38,0,36,0,0,17,7,1,73,1,104, +1,78,0,19,64,11,2,21,5,38,2,2,22,21,4,7,37,1,43,53,0,43,53,0,0,0,255,255, +0,87,255,236,4,115,5,83,18,38,0,68,0,0,17,7,1,73,0,233,0,0,0,21,180,2,66, +17,38,2,184,255,202,180,67,66,3,36,37,1,43,53,0,43,53,0,255,255,0,4,0,0,5, +82,6,243,18,38,0,36,0,0,17,7,2,155,1,121,0,0,0,19,64,11,2,21,5,38,2,3,26, +34,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,115,5,230,18,38,0, +68,0,0,17,7,1,74,1,7,0,0,0,21,180,2,66,17,38,2,184,255,204,180,71,83,3,36, +37,1,43,53,0,43,53,0,255,255,0,4,254,96,5,99,5,129,18,38,0,36,0,0,17,7,1, +77,3,181,0,11,0,13,185,0,2,255,207,180,33,33,7,7,37,43,53,0,255,255,0,87, +254,85,4,115,4,78,18,38,0,68,0,0,17,7,1,77,2,197,0,0,0,13,185,0,2,255,194, +180,78,78,36,36,37,43,53,0,255,255,0,104,255,236,5,121,6,240,18,38,0,38,0, +0,17,7,2,149,2,83,0,0,0,19,64,11,1,40,5,38,1,126,40,43,26,16,37,1,43,53,0, +43,53,0,0,0,255,255,0,87,255,236,3,202,5,228,18,38,0,70,0,0,17,7,0,116,1, +103,0,0,0,19,64,11,1,40,17,38,1,114,40,43,19,9,37,1,43,53,0,43,53,0,0,0,255, +255,0,104,255,236,5,121,6,254,18,38,0,38,0,0,17,7,2,150,1,204,0,0,0,19,64, +11,1,41,5,38,1,38,46,40,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236, +3,202,5,211,18,38,0,70,0,0,17,7,1,71,0,208,0,0,0,19,64,11,1,41,17,38,1,10, +46,40,19,9,37,1,43,53,0,43,53,0,0,0,255,255,0,104,255,236,5,121,6,241,18, +38,0,38,0,0,17,7,1,75,2,34,1,37,0,19,64,11,1,40,5,38,1,39,40,42,26,16,37, +1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,204,18,38,0,70,0,0,17, +7,1,75,1,44,0,0,0,11,182,1,17,40,42,19,9,37,1,43,53,0,0,0,255,255,0,104,255, +236,5,121,6,254,18,38,0,38,0,0,17,7,2,151,1,204,0,0,0,19,64,11,1,40,5,38, +1,38,42,48,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,211, +18,38,0,70,0,0,17,7,1,72,0,214,0,0,0,19,64,11,1,40,17,38,1,16,42,48,19,9, +37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,5,101,6,254,18,38,0,39,0,0,17, +7,2,151,1,102,0,0,0,21,180,2,26,5,38,2,184,255,171,180,28,34,6,0,37,1,43, +53,0,43,53,0,255,255,0,86,255,236,4,255,5,204,16,38,0,71,0,0,17,7,2,146,3, +186,0,75,0,18,64,10,2,61,0,2,83,61,61,19,19,37,1,43,53,0,63,53,255,255,0, +14,0,0,5,101,5,129,18,6,0,144,0,0,0,2,0,86,255,236,4,109,5,204,0,39,0,59, +0,146,64,86,85,42,101,42,2,90,58,106,58,2,57,1,73,1,2,54,10,70,10,2,9,4,25, +4,121,4,137,4,4,6,7,22,7,118,7,134,7,4,25,27,70,64,20,6,0,21,50,3,18,61,128, +40,71,31,6,1,6,63,61,1,143,61,1,33,21,27,19,81,24,15,20,1,239,20,255,20,2, +20,20,8,22,0,11,55,80,8,184,255,192,64,10,9,13,72,8,16,0,45,80,3,22,0,63, +237,50,63,43,237,50,63,18,57,47,93,113,51,237,50,63,1,93,114,47,93,237,26, +16,220,23,50,17,57,26,237,50,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17, +16,33,50,22,23,51,52,46,1,52,61,1,33,53,33,53,51,21,51,21,35,17,20,30,2,23, +35,46,3,53,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,3,53,50,165,122,205, +193,1,142,123,164,50,2,1,1,254,212,1,44,180,132,132,1,2,2,1,172,2,3,3,2,253, +218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64,31,174,104,90,1,20,1,24, +2,54,90,98,10,43,47,42,9,141,131,147,147,131,252,41,39,72,60,43,9,10,37,48, +53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102,163,0,0,255, +255,0,168,0,0,4,254,6,161,18,38,0,40,0,0,17,7,1,73,1,122,1,78,0,21,180,1, +12,5,38,1,184,255,237,180,13,12,0,10,37,1,43,53,0,43,53,0,255,255,0,87,255, +236,4,24,5,83,18,38,0,72,0,0,17,7,1,73,0,245,0,0,0,19,64,11,2,38,17,38,2, +3,39,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,243,18,38, +0,40,0,0,17,7,2,155,1,137,0,0,0,21,180,1,12,5,38,1,184,255,235,180,17,25, +0,10,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,230,18,38,0,72,0,0, +17,7,1,74,1,16,0,0,0,19,64,11,2,38,17,38,2,2,43,55,17,27,37,1,43,53,0,43, +53,0,0,0,255,255,0,168,0,0,4,254,6,241,18,38,0,40,0,0,17,7,1,75,1,201,1,37, +0,21,180,1,12,5,38,1,184,255,236,180,12,14,0,10,37,1,43,53,0,43,53,0,255, +255,0,87,255,236,4,24,5,204,18,38,0,72,0,0,17,7,1,75,1,68,0,0,0,12,182,2, +2,38,40,17,27,37,1,43,53,0,0,0,255,255,0,168,254,85,4,254,5,129,18,38,0,40, +0,0,17,7,1,77,3,80,0,0,0,13,185,0,1,255,194,180,24,24,11,11,37,43,53,0,255, +255,0,87,254,85,4,24,4,78,18,38,0,72,0,0,17,7,1,77,1,125,0,0,0,13,185,0,2, +254,242,180,50,50,9,9,37,43,53,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40, +0,0,17,7,2,151,1,111,0,0,0,21,180,1,12,5,38,1,184,255,231,180,14,20,0,10, +37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,211,18,38,0,72,0,0,17,7, +1,72,0,234,0,0,0,21,180,2,38,17,38,2,184,255,254,180,40,46,17,27,37,1,43, +53,0,43,53,0,255,255,0,103,255,236,5,160,6,254,18,38,0,42,0,0,17,7,2,150, +1,219,0,0,0,19,64,11,1,47,5,38,1,34,52,46,0,35,37,1,43,53,0,43,53,0,0,0,255, +255,0,86,254,87,3,239,5,211,18,38,0,74,0,0,17,7,1,71,0,216,0,0,0,19,64,11, +2,71,17,38,2,0,76,70,26,41,37,1,43,53,0,43,53,0,0,0,255,255,0,103,255,236, +5,160,6,243,18,38,0,42,0,0,17,7,2,155,1,246,0,0,0,19,64,11,1,46,5,38,1,39, +51,59,0,35,37,1,43,53,0,43,53,0,0,0,255,255,0,86,254,87,3,239,5,230,18,38, +0,74,0,0,17,7,1,74,0,249,0,0,0,19,64,11,2,70,17,38,2,0,75,87,26,41,37,1,43, +53,0,43,53,0,0,0,255,255,0,103,255,236,5,160,6,241,18,38,0,42,0,0,17,7,1, +75,2,53,1,37,0,19,64,11,1,46,5,38,1,39,46,48,0,35,37,1,43,53,0,43,53,0,0, +0,255,255,0,86,254,87,3,239,5,204,18,38,0,74,0,0,17,7,1,75,1,45,0,0,0,11, +182,2,0,70,72,26,41,37,1,43,53,0,0,0,255,255,0,103,254,78,5,160,5,150,18, +38,0,42,0,0,17,7,2,140,2,78,0,0,0,11,182,1,46,50,46,0,35,37,1,43,53,0,0,0, +255,255,0,86,254,87,3,239,6,32,16,38,0,74,0,0,17,7,2,147,1,56,0,0,0,21,180, +2,79,17,38,2,184,255,252,180,70,74,26,41,37,1,43,53,0,43,53,0,255,255,0,168, +0,0,5,32,6,254,18,38,0,43,0,0,17,7,2,150,1,153,0,0,0,19,64,11,1,13,5,38,1, +0,18,12,4,10,37,1,43,53,0,43,53,0,0,0,255,255,0,142,0,0,3,238,7,62,18,38, +0,75,0,0,17,7,2,150,0,242,0,64,0,21,180,1,35,2,38,1,184,255,255,180,40,34, +25,10,37,1,43,53,0,43,53,0,0,2,0,14,0,0,5,185,5,129,0,19,0,23,0,166,64,72, +23,11,3,90,8,7,4,4,20,4,2,7,4,16,15,19,90,20,12,59,0,1,4,0,1,56,164,0,1,155, +0,1,68,0,1,244,0,1,235,0,1,68,0,148,0,2,224,0,1,2,0,0,48,0,112,0,208,0,4, +7,0,32,25,1,160,25,176,25,192,25,3,25,184,255,192,64,36,14,17,72,47,25,1, +22,18,6,95,15,11,80,7,96,7,2,7,2,95,64,23,1,160,23,208,23,2,23,23,13,9,3, +4,0,18,0,63,50,63,51,57,47,93,113,237,220,93,50,50,237,50,50,1,93,43,93,113, +47,94,93,95,93,113,113,113,114,114,114,94,93,93,51,51,237,50,50,47,94,93, +51,51,237,50,50,49,48,33,17,33,17,35,17,35,53,51,53,51,21,33,53,51,21,51, +21,35,17,3,53,33,21,4,102,253,1,191,154,154,191,2,255,186,153,153,186,253, +1,2,141,253,115,4,1,154,230,230,230,230,154,251,255,3,45,212,212,0,1,0,10, +0,0,3,238,5,204,0,41,0,150,185,0,7,255,232,64,66,9,13,72,0,7,16,7,2,7,33, +24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,32,36,24,70,29,28,192,25,1, +0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240,43, +2,255,43,1,112,43,1,43,184,255,192,64,19,19,23,72,35,27,81,32,28,28,5,30, +0,25,11,21,0,18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63, +18,57,47,51,237,50,1,43,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16, +220,93,113,26,237,18,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52, +46,2,35,34,14,2,21,17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61, +30,70,84,100,62,104,133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180, +1,44,254,212,2,3,2,1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69, +35,46,84,120,75,253,170,4,182,131,147,147,131,148,33,66,56,39,7,255,255,255, +184,0,0,2,133,7,6,18,38,0,44,0,0,17,6,2,153,207,0,0,19,64,11,1,4,5,38,1,2, +13,27,0,2,37,1,43,53,0,43,53,0,255,255,255,184,0,0,2,133,5,189,18,38,0,241, +0,0,17,6,1,78,207,0,0,19,64,11,1,4,17,38,1,2,13,27,0,2,37,1,43,53,0,43,53, +0,255,255,0,12,0,0,2,49,6,161,18,38,0,44,0,0,17,7,1,73,255,217,1,78,0,19, +64,11,1,4,5,38,1,2,5,4,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0,12,0,0,2,49, +5,83,18,38,0,241,0,0,17,6,1,73,217,0,0,19,64,11,1,4,17,38,1,2,5,4,0,2,37, +1,43,53,0,43,53,0,255,255,255,210,0,0,2,108,6,243,18,38,0,44,0,0,17,6,2,155, +234,0,0,19,64,11,1,4,5,38,1,2,9,17,0,2,37,1,43,53,0,43,53,0,255,255,255,210, +0,0,2,108,5,230,18,38,0,241,0,0,17,6,1,74,245,0,0,19,64,11,1,4,17,38,1,3, +9,21,0,2,37,1,43,53,0,43,53,0,255,255,0,92,254,85,1,186,5,129,18,38,0,44, +0,0,17,6,1,77,12,0,0,10,182,1,0,16,16,3,3,37,43,53,0,0,255,255,0,31,254,85, +1,125,5,204,18,38,0,76,0,0,17,6,1,77,207,0,0,15,64,10,23,22,1,2,0,20,20,7, +7,37,43,53,93,0,255,255,0,189,0,0,1,124,6,241,18,38,0,44,0,0,17,7,1,75,0, +39,1,37,0,19,64,11,1,4,5,38,1,0,4,6,0,2,37,1,43,53,0,43,53,0,0,0,0,1,0,194, +0,0,1,118,4,58,0,3,1,137,64,24,3,70,4,0,36,0,2,9,0,0,4,5,52,5,1,0,5,16,5, +32,5,3,229,5,184,255,192,64,55,225,228,72,240,5,1,228,5,1,176,5,192,5,208, +5,3,132,5,148,5,164,5,3,64,5,1,52,5,1,0,5,16,5,32,5,3,212,5,228,5,244,5,3, +144,5,1,116,5,132,5,2,96,5,1,5,184,255,192,64,22,193,196,72,224,5,1,196,5, +212,5,2,176,5,1,20,5,36,5,52,5,3,5,184,255,192,183,182,185,72,0,5,1,175,5, +184,255,192,179,171,174,72,5,184,255,192,182,161,167,72,128,5,1,5,184,255, +192,64,38,150,156,72,208,5,1,100,5,116,5,164,5,180,5,196,5,5,32,5,1,4,5,20, +5,2,4,5,20,5,180,5,196,5,244,5,5,117,5,184,255,192,179,121,124,72,5,184,255, +192,179,110,113,72,5,184,255,192,64,24,99,102,72,224,5,1,180,5,196,5,212, +5,3,48,5,1,4,5,20,5,36,5,3,5,184,255,192,183,67,70,72,11,5,1,62,5,184,255, +192,64,9,56,59,72,203,5,219,5,2,5,184,255,192,64,42,45,48,72,27,5,43,5,2, +196,5,212,5,228,5,3,107,5,123,5,2,64,5,1,2,16,5,32,5,48,5,3,191,5,207,5,2, +32,5,64,5,2,5,184,255,192,64,13,13,16,72,15,5,31,5,2,7,1,15,0,21,0,63,63, +1,94,93,43,93,93,113,95,113,113,113,114,43,114,43,94,93,43,113,113,113,113, +43,43,43,94,93,113,113,113,113,43,114,43,43,94,93,43,93,93,93,93,43,113,113, +113,113,114,114,114,114,114,114,114,43,94,93,93,17,18,57,47,94,93,237,49, +48,51,17,51,17,194,180,4,58,251,198,0,0,0,255,255,0,170,255,236,5,73,5,129, +16,38,0,44,237,0,16,7,0,45,1,225,0,0,255,255,0,137,254,87,3,3,5,204,16,38, +0,76,0,0,17,7,0,77,1,198,0,0,0,30,64,18,3,2,111,8,1,48,8,1,16,8,1,8,1,0,16, +0,1,0,17,93,53,53,17,93,93,93,53,53,255,255,0,32,255,236,3,205,6,254,18,38, +0,45,0,0,17,7,2,150,1,55,0,0,0,19,64,11,1,23,5,38,1,190,28,22,3,16,37,1,43, +53,0,43,53,0,0,0,0,2,255,153,254,87,2,47,5,211,0,19,0,29,1,148,64,25,150, +29,166,29,2,152,28,168,28,2,3,18,24,12,16,72,18,40,8,11,72,164,21,1,21,184, +255,192,64,49,11,15,72,21,251,26,1,59,26,1,26,64,12,15,72,36,26,1,26,15,70, +12,3,3,4,12,20,12,36,12,68,12,4,7,12,12,31,30,144,31,1,2,0,31,16,31,2,219, +31,184,255,192,64,9,223,227,72,31,64,210,213,72,31,184,255,192,64,51,205, +209,72,143,31,1,64,31,80,31,2,95,31,111,31,239,31,255,31,4,32,31,48,31,64, +31,3,144,31,160,31,224,31,240,31,4,79,31,1,0,31,1,160,175,31,191,31,207,31, +3,31,184,255,192,64,57,147,150,72,239,31,1,176,31,192,31,208,31,3,95,31,1, +32,31,1,31,31,47,31,63,31,143,31,191,31,207,31,6,0,31,1,111,239,31,1,208, +31,1,63,31,1,111,31,143,31,159,31,175,31,255,31,5,31,184,255,192,64,101,79, +82,72,223,31,1,144,31,160,31,176,31,3,47,31,63,31,79,31,3,0,31,1,61,31,64, +53,56,72,112,31,128,31,144,31,176,31,4,15,31,31,31,2,255,31,1,31,64,35,38, +72,144,31,1,79,31,1,255,31,1,112,31,128,31,192,31,208,31,224,31,5,31,31,1, +24,142,64,28,148,26,128,22,22,15,26,47,26,63,26,127,26,239,26,5,26,13,15, +7,80,0,27,0,63,237,63,47,93,51,47,26,16,253,26,237,1,93,93,93,113,113,43, +113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93,93,113,113,113,113, +43,114,94,93,93,93,113,113,114,114,43,43,43,94,93,95,93,17,18,57,47,94,93, +51,47,16,237,47,93,43,93,113,204,43,93,49,48,0,43,43,1,95,93,93,19,34,38, +39,53,30,1,51,50,62,2,53,17,51,17,20,14,2,1,21,35,39,35,7,35,53,19,51,77, +34,65,28,13,36,13,38,49,28,10,180,21,54,93,1,154,105,219,2,232,104,234,204, +254,87,4,5,139,2,4,20,43,67,46,4,165,251,64,62,106,78,45,6,110,20,169,169, +20,1,14,0,255,255,0,168,254,78,5,63,5,129,18,38,0,46,0,0,17,7,2,140,1,221, +0,0,0,14,185,0,1,255,205,180,16,12,4,11,37,1,43,53,255,255,0,138,254,78,4, +3,5,204,18,38,0,78,0,0,17,7,2,140,1,78,0,0,0,14,185,0,1,255,235,180,16,12, +4,11,37,1,43,53,0,1,0,138,0,0,4,3,4,58,0,11,0,166,64,72,123,1,1,116,7,1,86, +9,102,9,2,123,0,139,0,155,0,3,89,0,105,0,2,67,10,1,58,2,1,42,9,1,155,8,1, +122,8,138,8,2,44,8,1,1,10,8,10,9,16,112,9,128,9,144,9,3,9,9,0,11,16,80,11, +1,144,11,208,11,240,11,3,11,184,255,192,64,40,7,11,72,11,7,3,70,0,4,16,4, +48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2,1,7,10,4,8,8,5,15,4,0,21, +0,63,50,63,51,17,23,57,1,93,93,47,94,93,237,50,47,43,93,113,56,51,57,47,93, +56,57,51,17,51,49,48,93,93,93,93,0,93,1,93,93,93,93,0,93,1,93,33,1,7,17,35, +17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73,1,206,1,238,108, +254,126,4,58,253,243,2,13,254,47,253,151,0,0,0,255,255,0,168,0,0,4,47,6,240, +18,38,0,47,0,0,17,7,2,149,0,173,0,0,0,21,180,1,6,5,38,1,184,255,94,180,6, +9,0,4,37,1,43,53,0,43,53,0,255,255,0,91,0,0,2,3,7,62,18,38,0,79,0,0,17,6, +2,149,19,78,0,19,64,11,1,4,2,38,1,75,4,7,0,2,37,1,43,53,0,43,53,0,255,255, +0,168,254,78,4,47,5,129,18,38,0,47,0,0,17,7,2,140,1,133,0,0,0,14,185,0,1, +255,253,180,10,6,0,4,37,1,43,53,255,255,0,126,254,78,1,71,5,204,18,38,0,79, +0,0,17,6,2,140,255,0,0,14,185,0,1,255,255,180,8,4,0,2,37,1,43,53,0,0,255, +255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,2,146,2,21,0,0,0,18,64,10,1, +15,3,1,138,10,6,0,4,37,1,43,53,0,63,53,255,255,0,138,0,0,2,105,5,204,16,38, +0,79,0,0,17,7,2,146,1,36,0,75,0,65,64,16,16,64,29,29,72,16,64,22,22,72,16, +64,18,18,72,16,184,255,192,179,17,17,72,16,184,255,192,64,12,16,16,72,16, +64,11,11,72,1,13,0,1,184,1,32,180,8,4,0,2,37,1,43,53,0,63,53,1,43,43,43,43, +43,43,0,255,255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,1,75,1,213,253,143, +0,11,182,1,95,6,8,0,4,37,1,43,53,0,0,0,255,255,0,138,0,0,2,146,5,204,16,38, +0,79,0,0,17,7,1,75,1,66,253,143,0,14,185,0,1,1,84,180,4,6,0,2,37,1,43,53, +0,1,0,20,0,0,4,47,5,129,0,13,0,119,64,49,121,0,137,0,2,100,8,116,8,132,8, +3,86,8,1,134,8,1,86,7,1,134,7,1,12,2,90,9,5,16,3,1,0,3,32,3,64,3,96,3,128, +3,208,3,240,3,7,3,12,184,255,224,179,19,22,72,9,184,255,224,64,24,19,22,72, +6,1,9,12,4,16,7,1,7,0,13,1,13,13,5,10,3,2,95,5,18,0,63,237,63,18,57,47,93, +205,93,23,57,43,43,1,47,93,113,47,51,237,50,49,48,113,114,113,114,0,93,93, +1,5,17,33,21,33,17,7,53,55,17,51,17,37,2,104,254,255,2,200,252,121,148,148, +191,1,1,3,29,149,254,20,156,2,26,85,158,85,2,201,253,165,148,0,1,0,16,0,0, +1,186,5,204,0,11,0,102,64,42,39,3,1,39,2,1,8,7,11,70,4,2,0,0,16,0,32,0,64, +0,4,7,0,0,12,13,255,13,1,112,13,128,13,192,13,208,13,4,31,13,1,4,184,255, +224,64,23,18,22,72,10,32,18,22,72,1,10,4,7,4,2,79,8,1,8,8,5,0,0,21,0,63,63, +57,47,93,205,23,57,43,43,1,93,93,93,17,18,57,47,94,93,51,51,237,50,50,49, +48,113,113,51,17,7,53,55,17,51,17,55,21,7,17,138,122,122,180,124,124,2,30, +68,158,68,3,16,253,88,72,159,71,253,122,255,255,0,168,0,0,5,32,6,240,18,38, +0,49,0,0,17,7,2,149,2,17,0,0,0,19,64,11,1,20,5,38,1,73,20,23,8,18,37,1,43, +53,0,43,53,0,0,0,255,255,0,140,0,0,3,242,5,228,18,38,0,81,4,0,17,7,0,116, +1,132,0,0,0,19,64,11,1,38,17,38,1,97,38,41,19,36,37,1,43,53,0,43,53,0,0,0, +255,255,0,168,254,78,5,32,5,129,18,38,0,49,0,0,17,7,2,140,1,252,0,0,0,14, +185,0,1,255,252,180,24,20,8,18,37,1,43,53,255,255,0,140,254,78,3,242,4,78, +18,38,0,81,4,0,17,7,2,140,1,91,0,0,0,11,182,1,0,42,38,19,36,37,1,43,53,0, +0,0,255,255,0,168,0,0,5,32,6,254,18,38,0,49,0,0,17,7,2,151,1,147,0,0,0,21, +180,1,20,5,38,1,184,255,250,180,22,28,8,18,37,1,43,53,0,43,53,0,255,255,0, +140,0,0,3,242,5,211,18,38,0,81,4,0,17,7,1,72,0,242,0,0,0,21,180,1,38,17,38, +1,184,255,254,180,40,46,19,36,37,1,43,53,0,43,53,0,255,255,255,254,0,0,4, +80,5,129,16,38,0,81,98,0,16,7,2,3,255,127,0,0,0,1,0,165,255,236,5,52,5,149, +0,55,0,162,64,16,154,53,1,149,7,165,7,2,131,41,147,41,163,41,3,48,184,255, +232,179,12,15,72,47,184,255,216,64,91,12,15,72,42,54,58,54,154,54,170,54, +4,6,143,5,159,5,175,5,3,5,5,51,39,26,90,0,27,16,27,64,27,3,27,51,90,0,14, +64,14,80,14,112,14,160,14,176,14,6,48,14,80,14,144,14,240,14,4,224,14,1,143, +14,159,14,175,14,3,0,14,48,14,2,7,14,39,20,95,45,4,33,3,26,18,9,95,0,6,6, +0,19,0,63,50,47,16,237,63,63,63,237,50,1,47,94,93,93,93,113,114,237,47,93, +237,50,17,57,47,93,51,49,48,0,93,43,1,43,0,93,93,93,5,34,46,2,39,55,30,1, +51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51, +62,3,51,50,30,2,21,17,20,14,2,3,173,56,96,79,63,24,127,37,100,59,64,78,41, +13,39,81,127,87,94,163,121,70,191,1,1,1,1,184,1,3,2,1,4,34,103,130,153,86, +124,177,112,53,30,86,152,20,24,40,54,30,115,45,65,58,107,153,95,1,66,108, +154,98,46,62,105,139,77,252,133,4,68,37,92,90,76,22,22,63,69,69,28,61,101, +70,39,64,133,204,139,254,165,130,208,146,78,0,0,0,0,1,0,140,254,87,3,242, +4,78,0,53,0,135,64,18,121,52,137,52,2,90,52,106,52,2,43,52,59,52,75,52,3, +46,184,255,232,64,74,9,12,72,3,46,19,46,2,3,3,24,49,70,64,160,12,1,96,12, +208,12,2,31,12,1,175,12,1,12,55,128,37,24,70,160,25,176,25,2,0,25,192,25, +208,25,3,0,25,16,25,32,25,64,25,224,25,240,25,6,7,25,37,18,80,43,16,31,15, +24,21,7,80,0,27,0,63,237,63,63,63,237,50,1,47,94,93,113,114,237,50,26,16, +220,93,113,113,114,26,237,17,57,47,49,48,93,43,0,93,93,93,1,34,38,39,53,30, +1,51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51, +62,3,51,50,30,2,21,17,20,14,2,3,1,34,65,28,13,36,13,38,49,28,10,23,52,85, +63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90,130,84,39,22, +54,93,254,87,4,5,139,2,4,20,43,67,46,3,25,79,106,65,27,45,85,125,81,253,141, +3,83,34,75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,252,169,62,106, +78,45,0,0,0,255,255,0,97,255,236,5,215,6,161,18,38,0,50,0,0,17,7,1,73,1,214, +1,78,0,19,64,11,2,40,5,38,2,0,41,40,10,0,37,1,43,53,0,43,53,0,0,0,255,255, +0,86,255,236,4,29,5,83,18,38,0,82,0,0,17,7,1,73,0,244,0,0,0,19,64,11,2,35, +17,38,2,0,36,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6, +243,18,38,0,50,0,0,17,7,2,155,1,231,0,0,0,19,64,11,2,40,5,38,2,0,45,53,10, +0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,230,18,38,0,82,0,0, +17,7,1,74,1,16,0,0,0,19,64,11,2,35,17,38,2,0,40,52,8,0,37,1,43,53,0,43,53, +0,0,0,255,255,0,97,255,236,5,215,6,241,18,38,0,50,0,0,17,7,2,154,1,226,0, +0,0,23,64,13,3,2,40,5,38,3,2,93,40,49,10,0,37,1,43,53,53,0,43,53,53,0,0,0, +255,255,0,86,255,236,4,34,5,228,18,38,0,82,0,0,17,7,1,79,1,9,0,0,0,23,64, +13,3,2,35,17,38,3,2,103,35,44,8,0,37,1,43,53,53,0,43,53,53,0,0,0,0,2,0,97, +255,246,7,166,5,140,0,30,0,49,0,170,64,119,137,13,1,102,13,1,105,12,1,86, +48,1,89,42,1,84,8,132,8,2,4,47,20,47,84,47,3,11,43,27,43,91,43,3,0,20,24, +28,90,34,0,26,32,26,48,26,3,26,22,26,22,29,15,34,47,34,79,34,3,63,34,95,34, +127,34,159,34,207,34,239,34,6,34,64,31,38,72,34,16,29,32,29,2,29,45,91,32, +10,1,15,10,31,10,2,10,127,51,1,27,95,24,24,21,29,95,30,18,22,95,21,3,40,95, +15,4,31,95,5,19,0,63,237,63,237,63,237,63,237,17,57,47,237,1,93,47,93,93, +237,47,93,47,43,93,113,18,57,57,47,47,93,16,237,50,57,57,49,48,0,93,93,93, +93,93,1,93,0,93,93,33,14,3,35,34,36,38,2,53,52,18,54,36,51,50,30,2,23,33, +21,33,17,33,21,33,17,33,21,37,50,54,55,17,46,2,34,35,34,14,2,21,20,30,2,3, +231,20,51,57,57,25,169,254,253,175,89,94,178,1,2,164,26,58,57,52,19,3,146, +252,221,2,231,253,25,3,76,251,111,32,76,26,11,32,37,37,15,125,187,125,63, +64,126,186,3,3,3,1,106,191,1,9,159,165,1,7,183,98,2,3,4,2,156,254,60,154, +254,21,156,145,2,2,4,87,1,2,1,74,142,206,131,129,209,148,80,0,3,0,86,255, +236,7,50,4,78,0,39,0,59,0,68,0,190,64,131,132,7,1,102,7,118,7,2,97,2,1,85, +2,1,90,66,106,66,2,108,61,1,90,61,1,69,58,85,58,101,58,3,69,52,85,52,101, +52,3,74,48,90,48,106,48,3,74,42,90,42,106,42,3,8,73,9,9,38,71,64,31,60,47, +60,63,60,3,144,60,1,60,70,128,17,30,68,0,71,144,40,1,32,40,1,40,50,71,25, +0,80,68,68,5,63,80,33,16,116,30,132,30,2,123,17,139,17,2,30,17,20,45,80,28, +16,55,80,20,22,5,80,14,239,8,1,128,8,1,8,8,14,22,0,63,51,47,93,93,16,237, +63,237,63,237,18,57,57,93,93,63,237,18,57,47,237,1,47,237,47,93,114,237,50, +57,57,26,16,220,93,113,26,237,50,47,237,49,48,0,93,93,93,93,93,93,93,93,93, +93,93,1,20,30,2,51,50,54,55,23,14,3,35,34,38,39,14,1,35,34,46,2,53,16,18, +51,32,23,62,1,51,50,30,2,29,1,37,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2, +37,46,1,35,34,14,2,7,4,46,35,73,114,80,117,141,25,158,17,61,102,153,108,137, +198,61,63,201,137,113,181,127,68,253,242,1,25,117,67,200,119,136,183,111, +47,252,63,42,77,110,68,69,114,81,45,47,81,108,62,69,114,81,44,3,7,15,144, +135,45,99,84,58,4,1,247,85,143,103,57,94,72,45,45,91,73,47,91,92,93,90,68, +140,211,143,1,23,1,25,177,94,83,88,155,210,122,24,39,126,164,98,39,41,99, +164,123,126,165,98,40,39,98,166,225,171,157,29,74,127,98,255,255,0,168,0, +0,5,104,6,240,18,38,0,53,0,0,17,7,2,149,1,225,0,0,0,21,180,2,31,5,38,2,184, +255,245,180,31,34,4,17,37,1,43,53,0,43,53,0,255,255,0,136,0,0,2,166,5,228, +18,38,0,85,0,0,17,7,0,116,0,182,0,0,0,19,64,11,1,32,17,38,1,74,32,35,6,21, +37,1,43,53,0,43,53,0,0,0,255,255,0,168,254,78,5,104,5,129,18,38,0,53,0,0, +17,7,2,140,2,5,0,0,0,14,185,0,2,255,225,180,35,31,4,17,37,1,43,53,255,255, +0,129,254,78,2,136,4,78,18,38,0,85,0,0,17,6,2,140,2,0,0,14,185,0,1,255,94, +180,36,32,6,21,37,1,43,53,0,0,255,255,0,168,0,0,5,104,6,254,18,38,0,53,0, +0,17,7,2,151,1,102,0,0,0,21,180,2,31,5,38,2,184,255,169,180,33,39,4,17,37, +1,43,53,0,43,53,0,255,255,0,56,0,0,2,206,5,211,18,38,0,85,0,0,17,6,1,72,56, +0,0,21,180,1,32,17,38,1,184,255,251,180,34,40,6,21,37,1,43,53,0,43,53,0,0, +0,255,255,0,93,255,236,4,248,7,45,18,38,0,54,0,0,17,7,0,116,1,234,1,73,0, +19,64,11,1,64,5,38,1,91,64,67,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255, +236,3,182,5,228,18,38,0,86,0,0,17,7,0,116,1,57,0,0,0,19,64,11,1,56,17,38, +1,93,56,59,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,93,255,236,4,248,7,26, +18,38,0,54,0,0,17,7,1,71,1,114,1,71,0,19,64,11,1,65,5,38,1,18,70,64,8,0,37, +1,43,53,0,43,53,0,0,0,255,255,0,57,255,236,3,182,5,211,18,38,0,86,0,0,17, +7,1,71,0,172,0,0,0,19,64,11,1,57,17,38,1,0,62,56,10,0,37,1,43,53,0,43,53, +0,0,0,255,255,0,93,254,78,4,248,5,150,18,38,0,54,0,0,17,7,0,120,1,166,0,0, +0,11,182,1,40,72,64,8,0,37,1,43,53,0,0,0,255,255,0,57,254,78,3,182,4,75,18, +38,0,86,0,0,17,7,0,120,0,218,0,0,0,11,182,1,15,64,56,10,0,37,1,43,53,0,0, +0,255,255,0,93,255,236,4,248,6,254,18,38,0,54,0,0,17,7,2,151,1,115,0,0,0, +19,64,11,1,64,5,38,1,19,66,72,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255, +236,3,182,5,211,18,38,0,86,0,0,17,7,1,72,0,173,0,0,0,19,64,11,1,56,17,38, +1,0,58,64,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,46,254,78,4,180,5,129,18, +38,0,55,0,0,17,7,2,140,1,139,0,0,0,14,185,0,1,255,254,180,12,8,4,6,37,1,43, +53,255,255,0,31,254,78,2,42,5,44,16,38,0,87,0,0,17,6,2,140,115,0,2,233,64, +255,35,64,232,232,72,35,64,231,231,72,35,64,228,228,72,35,64,227,227,72,35, +64,226,226,72,35,64,221,221,72,35,64,217,217,72,35,64,216,216,72,35,64,215, +215,72,35,64,214,214,72,35,64,213,213,72,35,64,210,210,72,35,64,206,206,72, +35,64,205,205,72,35,64,203,203,72,35,64,202,202,72,35,64,199,199,72,35,64, +196,196,72,35,64,195,195,72,35,64,194,194,72,35,64,192,192,72,35,64,191,191, +72,35,64,190,190,72,35,64,185,185,72,35,64,184,184,72,35,64,181,181,72,35, +64,180,180,72,35,64,179,179,72,35,64,178,178,72,35,64,174,174,72,35,64,173, +173,72,35,64,170,170,72,35,64,169,169,72,35,64,168,168,72,35,64,167,167,72, +35,64,163,163,72,35,64,162,162,72,35,64,160,160,72,35,64,159,159,72,35,64, +158,158,72,35,64,157,157,72,35,64,156,156,72,35,64,152,152,72,35,64,149,149, +72,35,64,148,148,72,35,64,147,147,72,35,64,146,146,72,35,64,145,145,72,35, +64,144,144,72,35,64,142,142,72,35,64,141,141,72,64,221,35,64,138,138,72,35, +64,137,137,72,35,64,136,136,72,35,64,134,134,72,35,64,133,133,72,35,64,131, +131,72,35,64,130,130,72,35,64,127,127,72,35,64,126,126,72,35,64,125,125,72, +35,64,124,124,72,35,64,123,123,72,35,64,122,122,72,35,64,121,121,72,35,64, +120,120,72,35,64,116,116,72,35,64,115,115,72,35,64,113,113,72,35,64,112,112, +72,35,64,111,111,72,35,64,110,110,72,35,64,109,109,72,35,64,106,106,72,35, +64,105,105,72,35,64,104,104,72,35,64,102,102,72,35,64,101,101,72,35,64,100, +100,72,35,64,99,99,72,35,64,98,98,72,35,64,95,95,72,35,64,94,94,72,35,64, +93,93,72,35,64,91,91,72,35,64,90,90,72,35,64,89,89,72,35,128,88,88,72,35, +64,87,87,72,35,64,84,84,72,35,64,83,83,72,35,64,80,80,72,35,64,79,79,72,35, +64,78,78,72,35,64,77,77,72,35,184,255,192,179,74,74,72,35,184,255,192,179, +71,71,72,35,184,255,192,179,63,63,72,35,184,255,192,64,9,60,60,72,35,64,52, +52,72,35,184,255,192,179,50,50,72,35,184,255,192,179,49,49,72,35,184,255, +192,64,9,45,45,72,35,64,41,41,72,35,184,255,192,179,39,39,72,35,184,255,192, +64,9,38,38,72,35,64,30,30,72,35,184,255,192,179,28,28,72,35,184,255,192,64, +9,27,27,72,35,64,19,19,72,35,184,255,192,179,17,17,72,35,184,255,192,179, +13,13,72,35,184,255,192,64,15,9,9,72,35,64,8,8,72,1,50,27,23,7,0,37,1,43, +53,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0,0,255,255,0,46,0,0,4,180, +6,254,18,38,0,55,0,0,17,7,2,151,1,33,0,0,0,21,180,1,8,5,38,1,184,255,251, +180,10,16,4,6,37,1,43,53,0,43,53,0,255,255,0,31,255,240,3,17,5,204,16,38, +0,87,0,0,17,7,2,146,1,204,0,75,0,17,177,1,1,184,1,136,180,27,23,7,0,37,1, +43,53,0,53,0,0,1,0,46,0,0,4,180,5,129,0,15,0,101,64,62,0,17,16,17,32,17,3, +9,3,2,5,15,14,6,12,5,14,9,6,127,12,175,12,191,12,3,47,12,143,12,2,12,64,23, +28,72,12,1,5,90,10,16,6,32,6,2,6,0,12,95,13,4,8,95,1,9,9,5,13,3,5,18,0,63, +63,18,57,47,51,237,50,16,237,50,1,47,93,51,253,50,204,43,93,113,17,57,43, +1,24,16,77,228,17,57,95,94,93,49,48,1,17,33,21,33,17,35,17,33,53,33,17,33, +53,33,21,2,208,1,25,254,231,190,254,233,1,23,254,28,4,134,4,229,254,60,154, +253,121,2,135,154,1,196,156,156,0,1,0,31,255,240,2,42,5,44,0,30,0,140,64, +91,40,30,1,40,29,1,40,26,1,40,25,1,12,32,9,15,72,156,12,172,12,2,12,40,9, +14,72,20,15,15,13,29,25,111,7,127,7,2,7,24,28,7,3,1,70,21,17,143,13,1,0,13, +16,13,32,13,3,7,13,128,32,1,47,32,1,27,19,80,20,0,15,80,28,127,16,191,16, +207,16,3,16,16,4,24,22,20,15,4,80,11,22,0,63,237,63,206,51,18,57,47,93,51, +237,50,16,237,50,1,93,93,47,94,93,113,51,51,237,23,50,47,93,51,51,17,51,17, +51,49,48,0,43,93,1,43,113,113,113,113,1,21,20,22,51,50,54,55,21,14,1,35,34, +53,17,35,53,51,17,35,53,51,55,51,21,51,21,35,17,51,21,1,80,51,63,26,49,29, +41,85,56,216,125,125,125,132,53,120,200,200,200,2,4,248,78,63,8,6,133,11, +13,245,1,31,131,1,48,131,242,242,131,254,208,131,255,255,0,158,255,236,5, +41,7,6,18,38,0,56,0,0,17,7,2,153,1,148,0,0,0,19,64,11,1,26,5,38,1,0,35,49, +5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5,189,18,38,0,88, +0,0,17,7,1,78,0,246,0,0,0,19,64,11,1,38,17,38,1,13,47,61,36,19,37,1,43,53, +0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,156,18,38,0,56,0,0,17,7,1,73,1, +159,1,73,0,19,64,11,1,26,5,38,1,1,27,26,5,20,37,1,43,53,0,43,53,0,0,0,255, +255,0,133,255,236,3,235,5,83,18,38,0,88,0,0,17,7,1,73,0,240,0,0,0,21,180, +1,38,17,38,1,184,255,254,180,39,38,36,19,37,1,43,53,0,43,53,0,255,255,0,158, +255,236,5,41,6,243,18,38,0,56,0,0,17,7,2,155,1,174,0,0,0,19,64,11,1,26,5, +38,1,0,31,39,5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5, +230,18,38,0,88,0,0,17,7,1,74,1,11,0,0,0,21,180,1,38,17,38,1,184,255,253,180, +43,55,36,19,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,7,62,18,38,0, +56,0,0,17,7,1,76,1,191,0,203,0,23,64,13,2,1,31,5,38,2,1,0,36,26,5,20,37,1, +43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,235,6,115,18,38,0,88,0, +0,17,7,1,76,1,20,0,0,0,23,64,13,2,1,43,17,38,2,1,1,48,38,36,19,37,1,43,53, +53,0,43,53,53,0,0,0,255,255,0,158,255,236,5,41,6,241,18,38,0,56,0,0,17,7, +2,154,1,157,0,0,0,23,64,13,2,1,26,5,38,2,1,81,26,35,5,20,37,1,43,53,53,0, +43,53,53,0,0,0,255,255,0,133,255,236,4,30,5,228,18,38,0,88,0,0,17,7,1,79, +1,5,0,0,0,23,64,13,2,1,38,17,38,2,1,100,38,47,36,19,37,1,43,53,53,0,43,53, +53,0,0,0,255,255,0,158,254,85,5,41,5,129,16,38,0,56,0,0,17,7,1,77,2,32,0, +0,0,40,185,0,1,254,103,181,39,39,21,21,37,51,184,255,192,179,21,21,72,51, +184,255,192,179,20,20,72,51,184,255,192,178,19,19,72,43,43,43,43,53,0,0,255, +255,0,133,254,85,4,5,4,58,18,38,0,88,0,0,17,7,1,77,2,87,0,0,0,13,185,0,1, +255,226,180,50,50,14,14,37,43,53,0,255,255,0,9,0,0,7,134,6,254,18,38,0,58, +0,0,17,7,2,150,2,121,0,0,0,21,180,1,48,5,38,1,184,255,253,180,53,47,15,46, +37,1,43,53,0,43,53,0,255,255,255,253,0,0,5,204,5,211,18,38,0,90,0,0,17,7, +1,71,1,148,0,0,0,21,180,1,44,17,38,1,184,255,251,180,49,43,15,42,37,1,43, +53,0,43,53,0,255,255,0,45,0,0,5,41,6,254,18,38,0,60,0,0,17,7,2,150,1,91,0, +0,0,21,180,1,10,5,38,1,184,255,251,180,15,9,4,8,37,1,43,53,0,43,53,0,255, +255,0,5,254,87,3,252,5,211,18,38,0,92,0,0,17,7,1,71,0,182,0,0,0,19,64,11, +1,33,17,38,1,0,38,32,17,31,37,1,43,53,0,43,53,0,0,0,255,255,0,45,0,0,5,41, +6,178,18,38,0,60,0,0,17,7,2,152,1,104,0,0,0,23,64,13,2,1,9,5,38,2,1,0,13, +11,4,8,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,65,0,0,4,163,6,240,18,38, +0,61,0,0,17,7,2,149,1,160,0,0,0,19,64,11,1,10,5,38,1,74,10,13,1,0,37,1,43, +53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,228,18,38,0,93,0,0,17,7,0,116,1, +53,0,0,0,19,64,11,1,10,17,38,1,93,10,13,0,8,37,1,43,53,0,43,53,0,0,0,255, +255,0,65,0,0,4,163,6,241,18,38,0,61,0,0,17,7,1,75,1,124,1,37,0,19,64,11,1, +10,5,38,1,0,10,12,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,204, +18,38,0,93,0,0,17,7,1,75,0,253,0,0,0,12,182,1,0,10,12,0,8,37,1,43,53,0,0, +0,255,255,0,65,0,0,4,163,6,254,18,38,0,61,0,0,17,7,2,151,1,56,0,0,0,19,64, +11,1,10,5,38,1,17,12,18,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182, +5,211,18,38,0,93,0,0,17,7,1,72,0,156,0,0,0,21,180,1,10,17,38,1,184,255,244, +180,12,18,0,8,37,1,43,53,0,43,53,0,0,1,0,138,0,0,2,17,5,202,0,19,0,125,185, +0,5,255,216,179,13,17,72,5,184,255,224,64,56,8,12,72,111,10,1,10,10,0,70, +0,1,16,1,48,1,240,1,4,8,1,255,21,1,224,21,1,223,21,1,176,21,192,21,2,159, +21,1,112,21,128,21,2,31,21,1,0,21,1,240,21,1,223,21,1,21,184,255,192,64,18, +34,37,72,79,21,1,112,21,1,31,21,1,14,80,7,0,0,21,0,63,63,237,1,93,93,113, +43,113,113,114,114,114,114,114,114,114,114,47,94,93,237,50,47,93,49,48,0, +43,43,33,35,17,52,62,2,51,50,22,23,21,46,1,35,34,14,2,21,1,62,180,22,59,102, +81,32,69,26,17,45,18,40,51,29,11,4,180,59,101,75,43,6,6,137,3,5,22,41,60, +39,0,0,0,0,1,0,192,254,78,3,195,5,174,0,27,0,148,64,107,133,6,1,122,18,138, +18,2,139,15,1,89,15,105,15,121,15,3,131,13,1,85,13,101,13,117,13,3,54,13, +1,38,7,1,38,8,1,34,22,50,22,114,22,130,22,4,21,17,37,17,53,17,3,27,212,8, +228,8,244,8,3,80,8,144,8,2,38,8,54,8,70,8,3,8,10,27,3,13,13,17,19,3,8,95, +14,159,14,2,14,12,16,80,9,17,17,13,3,81,15,24,127,24,175,24,3,24,13,0,47, +47,93,237,18,57,47,51,237,50,1,47,113,51,23,51,17,23,51,113,113,113,47,49, +48,93,0,93,1,93,93,93,93,93,93,93,93,93,1,46,1,35,34,14,2,15,1,51,7,35,3, +35,19,35,55,51,55,62,3,51,50,22,23,3,164,17,62,31,31,46,33,24,9,26,211,25, +213,254,180,254,152,27,151,29,12,40,71,109,81,32,82,35,5,32,5,10,19,40,64, +45,137,131,250,211,5,45,131,152,59,102,76,43,10,10,0,0,0,4,0,4,0,0,5,82,7, +62,0,26,0,39,0,61,0,67,1,36,64,18,122,64,138,64,2,102,5,118,5,134,5,3,86, +6,102,6,2,25,184,255,232,64,183,9,17,72,19,24,9,17,72,12,16,14,17,72,10,12, +1,12,38,9,10,32,8,39,32,7,32,40,130,0,68,66,132,66,2,66,62,50,130,17,175, +62,191,62,207,62,3,15,17,47,17,2,144,17,1,0,0,32,0,2,15,0,159,0,2,0,62,17, +17,62,0,3,6,11,5,32,32,10,7,139,7,1,90,7,106,7,122,7,3,7,16,6,32,6,48,6,3, +32,6,1,6,6,69,80,69,176,69,2,48,69,96,69,144,69,192,69,240,69,5,47,69,1,132, +10,1,85,10,101,10,117,10,3,10,11,62,62,45,141,112,22,128,22,2,22,22,57,127, +64,159,64,175,64,191,64,4,64,64,9,13,72,64,8,9,39,38,38,10,5,12,32,3,128, +57,1,63,57,1,0,57,1,57,7,7,10,0,47,51,47,47,93,93,93,23,51,18,57,47,51,205, +50,47,43,93,18,57,47,93,237,51,47,1,47,51,93,93,93,93,113,17,51,47,93,113, +51,93,93,17,18,57,17,51,17,18,23,57,47,47,47,93,113,93,113,93,16,237,16,205, +93,16,237,16,135,192,192,135,192,192,1,51,49,48,93,43,43,43,93,93,93,1,20, +6,7,6,7,1,35,3,33,3,35,1,38,39,46,1,53,52,62,2,51,50,30,2,3,46,3,39,14,3, +7,3,33,3,52,46,2,35,34,14,2,21,20,30,1,23,22,23,51,50,62,2,3,53,55,51,21, +5,3,158,38,33,16,18,2,29,195,161,253,126,162,198,2,36,21,18,33,38,38,66,88, +50,50,88,66,38,158,16,29,22,15,1,2,14,23,29,15,180,2,15,131,21,36,49,28,29, +49,36,21,21,36,24,21,24,9,28,49,36,21,247,217,207,254,202,5,112,45,79,30, +15,11,251,68,1,115,254,141,4,185,12,17,30,79,45,45,79,59,34,34,59,79,253, +254,36,74,60,41,4,4,41,62,73,36,254,95,3,119,25,44,33,19,19,33,44,25,26,44, +35,10,8,1,19,35,44,1,35,16,181,23,174,0,255,255,0,87,255,236,4,115,7,62,18, +38,0,68,0,0,16,39,1,76,1,20,255,85,17,7,0,116,1,99,1,90,0,35,64,14,3,2,101, +16,38,4,26,106,109,3,36,37,3,2,184,255,212,180,76,66,3,36,37,1,43,53,53,43, +53,0,43,53,53,0,0,0,255,255,0,24,0,0,7,168,6,240,18,38,0,134,0,0,17,7,2,149, +3,228,0,0,0,21,180,2,27,5,38,2,184,1,32,180,27,30,4,14,37,1,43,53,0,43,53, +0,255,255,0,66,255,236,6,194,5,228,18,38,0,166,0,0,17,7,0,116,2,175,0,0,0, +19,64,11,3,89,17,38,3,73,89,92,25,61,37,1,43,53,0,43,53,0,0,0,255,255,0,71, +255,203,5,244,6,240,18,38,0,152,0,0,17,7,2,149,2,75,0,0,0,19,64,11,3,52,5, +38,3,73,52,55,10,24,37,1,43,53,0,43,53,0,0,0,255,255,0,44,255,218,4,180,5, +228,18,38,0,184,0,0,17,7,0,116,1,178,0,0,0,19,64,11,3,46,17,38,3,94,46,49, +8,19,37,1,43,53,0,43,53,0,0,0,0,1,0,0,4,177,2,150,5,211,0,9,0,66,64,14,118, +9,134,9,2,120,8,136,8,2,128,0,1,0,184,255,192,64,27,11,15,72,0,191,6,1,6, +4,142,64,8,148,128,6,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93,51,26,253,26, +237,1,47,93,204,43,93,49,48,93,93,1,21,35,39,35,7,35,53,19,51,2,150,105,219, +2,232,104,234,204,4,197,20,169,169,20,1,14,0,0,1,0,0,4,177,2,150,5,211,0, +9,0,66,64,14,118,0,134,0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,27,11,15, +72,8,64,191,2,1,2,7,3,148,128,6,142,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93, +237,26,237,50,1,47,93,26,204,43,93,49,48,93,93,1,35,3,53,51,23,51,55,51,21, +1,182,204,234,104,232,2,219,105,4,177,1,14,20,169,169,20,0,0,1,0,51,4,212, +2,88,5,83,0,3,0,81,64,59,4,1,1,228,1,244,1,2,1,164,0,1,91,0,107,0,2,52,0, +68,0,2,0,2,32,18,25,72,2,142,1,64,28,33,72,47,1,1,2,15,1,63,1,175,1,191,1, +4,1,64,22,26,72,1,64,14,17,72,1,0,47,43,43,93,95,113,43,237,43,1,47,93,93, +93,47,93,113,49,48,1,33,53,33,2,88,253,219,2,37,4,212,127,0,1,255,221,4,177, +2,119,5,230,0,21,0,73,64,51,133,14,1,133,8,1,31,17,79,17,127,17,175,17,223, +17,5,239,17,1,17,64,5,64,29,60,72,5,16,80,5,96,5,2,5,149,128,11,143,15,0, +47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,237,113,50,1,47,43,26,204,93,113, +49,48,0,93,93,1,34,46,2,39,51,30,3,51,50,62,2,55,51,14,3,1,41,74,116,84,50, +8,117,8,39,56,72,42,42,71,56,38,8,117,9,50,83,116,4,177,51,85,112,61,43,59, +36,15,16,36,59,42,61,112,85,51,0,1,0,156,5,32,1,80,5,204,0,3,0,23,64,12,3, +134,0,64,14,17,72,0,0,83,1,0,0,63,237,1,47,43,237,49,48,19,53,51,21,156,180, +5,32,172,172,0,0,2,0,51,4,144,2,23,6,115,0,19,0,39,0,89,185,0,18,255,232, +64,14,9,14,72,12,24,9,14,72,8,24,9,14,72,2,184,255,232,64,42,9,14,72,20,130, +64,0,192,30,130,95,10,1,10,25,141,15,15,31,15,2,15,35,141,15,5,47,5,63,5, +79,5,127,5,159,5,191,5,239,5,8,5,0,47,93,237,220,93,237,1,47,93,237,26,220, +26,237,49,48,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,23,38,66,88,50,50,88,66,38,38,66, +88,50,50,88,66,38,108,21,36,49,28,29,49,36,21,21,36,49,29,28,49,36,21,5,130, +50,88,66,38,38,66,88,50,50,88,65,38,38,65,88,50,28,49,36,21,21,36,49,28,29, +49,38,21,21,38,49,0,0,0,0,1,0,80,254,85,1,174,0,0,0,23,0,76,64,55,14,24,9, +13,72,9,24,9,13,72,5,32,9,17,72,12,17,132,15,0,31,0,2,95,0,191,0,2,0,6,11, +64,7,10,72,11,20,141,16,3,1,32,3,80,3,96,3,112,3,176,3,192,3,6,3,0,47,93, +113,237,47,43,1,47,205,93,113,237,50,49,48,43,43,43,1,14,1,35,34,38,53,52, +62,2,55,51,14,3,21,20,22,51,50,54,55,1,174,28,71,40,105,106,34,48,53,20,133, +25,52,43,27,49,45,29,58,28,254,112,12,15,102,85,47,79,61,42,11,14,45,59,70, +39,42,48,13,11,0,1,255,233,4,177,2,182,5,189,0,27,2,77,185,0,26,255,232,64, +182,9,17,72,12,24,9,17,72,41,29,1,25,29,41,29,57,29,89,29,105,29,5,29,64, +229,232,72,29,64,217,220,72,11,29,1,208,169,29,185,29,201,29,3,155,29,1,9, +29,57,29,2,185,29,201,29,217,29,3,29,64,195,198,72,155,29,171,29,2,137,29, +1,123,29,1,73,29,1,137,29,185,29,2,29,64,171,175,72,6,29,54,29,2,158,153, +29,1,125,29,141,29,2,111,29,1,45,29,61,29,77,29,3,27,29,1,13,29,1,237,29, +253,29,2,29,128,136,139,72,137,29,153,29,2,91,29,107,29,123,29,3,29,192,127, +130,72,9,29,1,249,29,1,235,29,1,201,29,217,29,2,171,29,187,29,2,153,29,1, +22,29,38,29,102,29,118,29,134,29,5,4,29,1,110,29,184,255,64,64,96,101,109, +72,148,29,1,112,29,128,29,2,82,29,98,29,2,64,29,1,18,29,34,29,50,29,3,4,29, +1,228,29,244,29,2,214,29,1,196,29,1,176,29,1,162,29,1,128,29,144,29,2,82, +29,98,29,114,29,3,36,29,52,29,68,29,3,6,29,22,29,2,246,29,1,210,29,226,29, +2,192,29,1,146,29,162,29,178,29,3,100,29,116,29,132,29,3,29,184,255,192,64, +9,60,64,72,2,29,1,59,1,29,184,255,128,64,57,53,58,72,164,29,180,29,2,144, +29,1,100,29,116,29,132,29,3,48,29,64,29,80,29,3,4,29,20,29,36,29,3,208,29, +224,29,2,164,29,180,29,196,29,3,112,29,128,29,2,148,29,164,29,228,29,3,29, +184,255,192,64,19,26,31,72,128,29,1,84,29,100,29,116,29,3,29,64,7,10,72,23, +184,255,128,64,9,36,39,72,148,23,164,23,2,23,184,255,128,64,23,30,33,72,68, +23,1,48,23,1,2,0,23,16,23,32,23,3,208,23,224,23,2,23,184,255,192,64,43,13, +19,72,15,23,1,23,9,22,22,5,143,64,15,14,31,14,2,255,14,1,14,64,16,19,72,14, +128,19,143,8,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,50,237,26,221,43,93,113, +26,237,51,47,1,47,204,93,43,93,113,95,113,113,43,113,43,43,93,93,43,93,113, +113,113,114,114,114,114,114,43,95,94,93,43,93,93,93,93,93,113,113,113,113, +113,113,113,113,113,114,114,114,114,114,114,43,94,93,93,93,93,93,93,93,113, +43,113,113,43,113,114,114,114,114,114,114,94,93,43,93,113,113,113,113,43, +113,114,114,114,94,93,43,43,93,113,49,48,43,43,1,34,46,2,35,34,6,7,35,62, +3,51,50,30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45, +74,59,44,84,78,69,30,54,55,8,92,5,20,43,74,4,177,37,45,37,62,57,45,95,78, +50,37,45,37,63,56,44,95,78,51,0,0,0,2,0,22,4,177,3,25,5,228,0,5,0,11,0,111, +64,82,164,10,1,102,10,1,154,8,170,8,2,98,4,162,4,2,98,3,1,154,2,170,2,2,10, +159,6,1,15,6,31,6,127,6,223,6,4,7,6,4,64,63,0,79,0,143,0,175,0,191,0,207, +0,6,0,64,30,41,72,0,64,23,26,72,0,8,2,149,128,6,15,0,47,0,63,0,127,0,239, +0,5,0,0,47,93,50,26,237,50,1,47,43,43,93,26,205,220,94,93,113,205,49,48,93, +93,93,93,93,93,19,53,19,51,21,1,51,53,19,51,21,1,22,217,207,254,182,253,217, +207,254,182,4,177,20,1,31,29,254,234,20,1,31,29,254,234,0,0,1,0,205,4,194, +1,225,6,7,0,5,0,64,64,43,2,16,12,17,72,41,2,1,10,5,26,5,42,5,3,3,43,3,1,3, +64,0,2,128,132,0,148,0,2,112,0,1,2,16,0,32,0,64,0,96,0,4,0,0,47,93,95,93, +93,26,205,1,47,26,205,93,49,48,95,93,93,43,19,53,19,51,21,3,205,69,207,201, +4,194,33,1,36,37,254,224,0,3,0,29,4,176,2,139,6,65,0,5,0,9,0,13,0,83,64,53, +2,16,11,17,72,10,5,26,5,42,5,3,47,4,1,4,47,1,1,1,1,6,192,13,208,13,2,13,10, +192,9,208,9,2,9,6,11,7,144,6,2,0,0,10,192,6,1,15,6,63,6,2,6,0,47,93,93,51, +51,47,205,16,237,50,1,47,205,93,47,205,93,18,57,47,113,205,93,49,48,93,43, +19,53,19,51,21,3,37,53,51,21,33,53,51,21,250,69,187,181,254,216,150,1,66, +150,4,176,33,1,112,37,254,148,31,172,172,172,172,0,0,255,255,0,4,0,0,5,82, +5,131,16,38,0,36,0,0,17,7,1,80,255,108,255,124,0,94,179,2,0,24,1,184,255, +10,181,24,24,5,5,37,28,184,255,192,179,36,36,72,28,184,255,192,179,30,30, +72,28,184,255,192,179,24,24,72,28,184,255,192,179,21,21,72,28,184,255,192, +179,18,18,72,28,184,255,192,179,15,15,72,28,184,255,192,64,11,12,12,72,28, +64,11,11,72,2,23,3,0,63,53,1,43,43,43,43,43,43,43,43,43,93,53,0,1,0,187,1, +190,1,126,2,154,0,3,2,10,179,3,134,0,5,184,255,128,64,12,229,233,72,6,5,22, +5,2,246,5,1,5,184,255,128,64,33,222,225,72,150,5,166,5,2,116,5,132,5,2,86, +5,102,5,2,68,5,1,38,5,54,5,2,2,5,18,5,2,211,5,184,255,128,64,22,207,210,72, +198,5,214,5,2,180,5,1,150,5,166,5,2,116,5,132,5,2,5,184,255,192,64,36,195, +199,72,4,5,20,5,2,214,5,230,5,246,5,3,194,5,1,148,5,164,5,180,5,3,118,5,134, +5,2,84,5,100,5,2,5,184,255,192,64,34,174,181,72,164,5,180,5,196,5,3,70,5, +86,5,118,5,134,5,150,5,5,52,5,1,38,5,1,4,5,20,5,2,161,5,184,255,192,179,157, +160,72,5,184,255,192,64,37,152,155,72,100,5,116,5,2,54,5,70,5,86,5,3,36,5, +1,6,5,22,5,2,244,5,1,214,5,230,5,2,178,5,194,5,2,5,184,255,128,64,28,135, +138,72,86,5,102,5,2,36,5,52,5,68,5,3,2,5,18,5,2,212,5,228,5,244,5,3,5,184, +255,192,64,23,119,124,72,82,5,98,5,2,1,32,5,48,5,64,5,3,4,5,20,5,2,112,5, +184,255,128,64,9,103,111,72,68,5,84,5,2,5,184,255,192,179,99,102,72,5,184, +255,128,179,92,95,72,5,184,255,192,179,87,91,72,5,184,255,128,64,21,81,86, +72,36,5,52,5,68,5,3,228,5,1,176,5,192,5,208,5,3,5,184,255,192,64,16,67,70, +72,48,5,1,36,5,1,0,5,16,5,2,60,5,184,255,192,64,12,56,59,72,187,5,1,128,5, +144,5,2,5,184,255,192,64,41,45,48,72,11,5,1,208,5,224,5,2,164,5,180,5,196, +5,3,32,5,48,5,2,2,0,5,16,5,2,240,5,1,159,5,175,5,2,0,5,1,5,184,255,192,181, +13,17,72,0,155,1,0,47,237,1,43,93,93,93,113,95,113,113,113,114,43,114,114, +43,94,93,93,93,43,93,93,113,43,43,43,43,114,43,94,93,93,95,93,43,93,113,113, +113,43,113,113,113,114,114,114,114,43,43,94,93,93,93,93,93,43,113,113,113, +113,113,114,43,114,114,114,114,43,94,93,93,93,93,93,93,43,93,113,43,47,237, +49,48,19,53,51,21,187,195,1,190,220,220,0,0,255,255,255,245,0,0,5,238,5,131, +16,39,0,40,0,240,0,0,17,7,1,80,255,40,255,124,0,49,64,10,1,14,3,1,16,15,1, +0,15,1,184,255,113,64,19,15,15,1,1,37,0,208,0,1,191,0,1,47,0,1,47,0,1,0,16, +93,93,93,93,53,43,93,93,53,0,63,53,0,0,0,255,255,255,242,0,0,6,13,5,131,16, +39,0,43,0,237,0,0,17,7,1,80,255,37,255,124,0,95,185,0,19,255,192,179,21,21, +72,19,184,255,192,179,20,20,72,19,184,255,192,179,19,19,72,19,184,255,192, +179,17,17,72,19,184,255,192,64,13,14,14,72,1,14,3,1,16,15,1,0,15,1,184,255, +113,64,19,15,15,5,5,37,0,207,0,1,191,0,1,111,0,1,47,0,1,0,16,93,93,93,93, +53,43,93,93,53,0,63,53,1,43,43,43,43,43,0,255,255,255,232,0,0,2,85,5,131, +16,39,0,44,0,217,0,0,17,7,1,80,255,27,255,124,0,92,185,0,11,255,192,179,17, +17,72,11,184,255,192,64,23,12,12,72,11,64,11,11,72,11,64,9,9,72,1,6,3,1,16, +7,1,0,7,1,184,255,102,64,28,7,7,1,1,37,0,128,0,1,127,0,1,111,0,1,95,0,1,79, +0,1,47,0,1,47,0,1,0,16,93,93,93,93,93,93,93,53,43,93,93,53,0,63,53,1,43,43, +43,43,255,255,255,187,255,236,5,211,5,150,16,38,0,50,252,0,17,7,1,80,254, +238,255,124,0,39,64,10,2,42,3,2,192,40,1,0,40,1,184,255,94,64,11,40,40,10, +10,37,1,0,47,0,1,0,16,93,53,53,43,93,93,53,0,63,53,0,0,0,255,255,0,65,0,0, +6,171,5,131,16,39,0,60,1,130,0,0,17,7,1,80,255,116,255,124,5,192,64,21,16, +64,233,233,72,16,64,229,229,72,16,64,227,227,72,16,64,226,226,72,16,184,255, +192,179,224,224,72,16,184,255,192,64,19,222,222,72,16,64,220,220,72,16,64, +219,219,72,16,64,216,216,72,16,184,255,192,179,215,215,72,16,184,255,192, +64,19,211,211,72,16,64,207,207,72,16,64,206,206,72,16,64,205,205,72,16,184, +255,192,179,204,204,72,16,184,255,192,64,19,202,202,72,16,64,199,199,72,16, +64,186,186,72,16,64,184,184,72,16,184,255,192,179,183,183,72,16,184,255,192, +64,14,182,182,72,16,64,179,179,72,16,64,177,177,72,16,184,255,192,64,19,172, +172,72,16,64,166,166,72,16,64,164,164,72,16,64,163,163,72,16,184,255,192, +64,24,161,161,72,16,64,156,156,72,16,128,153,153,72,16,64,152,152,72,16,64, +151,151,72,16,184,255,192,179,149,149,72,16,184,255,128,179,148,148,72,16, +184,255,128,179,147,147,72,16,184,255,192,179,146,146,72,16,184,255,128,179, +145,145,72,16,184,255,192,179,144,144,72,16,184,255,128,179,141,141,72,16, +184,255,128,179,140,140,72,16,184,255,192,179,139,139,72,16,184,255,128,179, +138,138,72,16,184,255,192,179,137,137,72,16,184,255,192,179,136,136,72,16, +184,255,192,179,135,135,72,16,184,255,128,179,134,134,72,16,184,255,192,179, +133,133,72,16,184,255,128,179,131,131,72,16,184,255,192,179,130,130,72,16, +184,255,0,179,129,129,72,16,184,255,0,179,128,128,72,16,184,254,192,179,127, +127,72,16,184,255,0,179,126,126,72,16,184,255,0,179,125,125,72,16,184,255, +64,179,124,124,72,16,184,255,64,179,123,123,72,16,184,255,64,179,122,122, +72,16,184,255,0,179,121,121,72,16,184,254,192,179,120,120,72,16,184,255,0, +179,119,119,72,16,184,255,0,179,118,118,72,16,184,255,64,179,117,117,72,16, +184,255,0,179,116,116,72,16,184,255,64,179,115,115,72,16,184,255,0,179,114, +114,72,16,184,255,64,179,113,113,72,16,184,255,64,179,112,112,72,16,184,255, +64,179,111,111,72,16,184,255,128,179,110,110,72,16,184,255,64,179,109,109, +72,16,184,255,128,179,108,108,72,16,184,255,0,179,107,107,72,16,184,255,64, +179,106,106,72,16,184,255,0,179,105,105,72,16,184,255,64,179,104,104,72,16, +184,255,64,179,103,103,72,16,184,255,64,179,102,102,72,16,184,255,128,179, +101,101,72,16,184,255,64,179,100,100,72,16,184,255,64,179,99,99,72,16,184, +255,0,179,98,98,72,16,184,255,64,179,97,97,72,16,184,255,64,179,96,96,72, +16,184,255,64,179,95,95,72,16,184,255,64,179,94,94,72,16,184,255,64,179,93, +93,72,16,184,255,128,179,92,92,72,16,184,255,64,179,91,91,72,16,184,255,128, +179,90,90,72,16,184,255,64,179,89,89,72,16,184,255,128,179,88,88,72,16,184, +255,64,179,87,87,72,16,184,255,64,179,86,86,72,16,184,255,64,179,85,85,72, +16,184,255,64,179,84,84,72,16,184,255,64,179,83,83,72,16,184,255,128,179, +82,82,72,16,184,255,192,179,81,81,72,16,184,255,128,179,80,80,72,16,184,255, +128,179,79,79,72,16,184,255,64,179,78,78,72,16,184,255,64,179,77,77,72,16, +184,255,64,179,76,76,72,16,184,255,128,179,75,75,72,16,184,255,128,179,74, +74,72,16,184,255,128,179,73,73,72,16,184,255,64,179,72,72,72,16,184,255,128, +179,71,71,72,16,184,255,192,179,70,70,72,16,184,255,128,179,69,69,72,16,184, +255,192,179,68,68,72,16,184,255,192,179,67,67,72,16,184,255,128,179,66,66, +72,16,184,255,64,179,65,65,72,16,184,255,128,179,64,64,72,16,184,255,128, +179,63,63,72,16,184,255,128,179,62,62,72,16,184,255,192,179,61,61,72,16,184, +255,192,179,60,60,72,16,184,255,192,179,59,59,72,16,184,255,128,179,58,58, +72,16,184,255,128,179,57,57,72,16,184,255,128,179,56,56,72,16,184,255,128, +179,55,55,72,16,184,255,128,179,54,54,72,16,184,255,192,179,53,53,72,16,184, +255,192,179,52,52,72,16,184,255,128,179,51,51,72,16,184,255,192,179,50,50, +72,16,184,255,128,179,49,49,72,16,184,255,128,179,48,48,72,16,184,255,128, +179,47,47,72,16,184,255,192,179,46,46,72,16,184,255,128,179,45,45,72,16,184, +255,128,179,44,44,72,16,184,255,128,179,43,43,72,16,184,255,192,179,42,42, +72,16,184,255,192,179,41,41,72,16,184,255,192,179,40,40,72,16,184,255,192, +179,39,39,72,16,184,255,128,179,38,38,72,16,184,255,128,179,37,37,72,16,184, +255,128,179,36,36,72,16,184,255,192,179,35,35,72,16,184,255,128,179,34,34, +72,16,184,255,192,179,33,33,72,16,184,255,192,179,32,32,72,16,184,255,192, +179,31,31,72,16,184,255,192,179,30,30,72,16,184,255,192,179,29,29,72,16,184, +255,192,179,28,28,72,16,184,255,192,179,27,27,72,16,184,255,192,179,26,26, +72,16,184,255,192,179,25,25,72,16,184,255,192,179,24,24,72,16,184,255,128, +179,23,23,72,16,184,255,192,179,22,22,72,16,184,255,192,179,21,21,72,16,184, +255,192,179,17,17,72,16,184,255,128,179,16,16,72,16,184,255,192,179,15,15, +72,16,184,255,192,179,14,14,72,16,184,255,192,64,30,12,12,72,16,64,11,11, +72,1,11,3,1,128,12,1,112,12,1,96,12,1,64,12,1,16,12,1,0,12,1,184,255,166, +64,13,12,12,4,4,37,0,176,0,1,0,0,1,0,16,93,93,53,43,93,93,93,93,93,93,53, +0,63,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,187,0,0, +5,173,5,150,16,38,1,114,10,0,17,7,1,80,254,238,255,124,0,68,64,15,65,64,19, +19,72,1,60,3,1,144,58,1,16,58,1,184,255,62,64,28,58,58,53,53,37,0,159,0,1, +95,0,1,31,0,1,223,0,1,175,0,1,159,0,1,31,0,1,0,16,93,93,93,93,113,113,113, +53,43,93,93,53,0,63,53,1,43,0,0,255,255,255,176,0,0,2,30,6,65,16,38,1,130, +0,0,17,6,1,81,147,0,2,60,64,11,29,64,227,227,72,29,64,226,226,72,29,184,255, +192,179,223,223,72,29,184,255,192,179,220,220,72,29,184,255,192,64,19,219, +219,72,29,64,213,213,72,29,64,212,212,72,29,64,211,211,72,29,184,255,192, +179,207,207,72,29,184,255,192,179,206,206,72,29,184,255,192,64,19,205,205, +72,29,64,200,200,72,29,64,199,199,72,29,64,198,198,72,29,184,255,192,64,14, +192,192,72,29,64,182,182,72,29,64,177,177,72,29,184,255,192,179,175,175,72, +29,184,255,192,64,19,174,174,72,29,64,168,168,72,29,64,167,167,72,29,64,164, +164,72,29,184,255,192,179,161,161,72,29,184,255,192,64,19,160,160,72,29,64, +155,155,72,29,64,154,154,72,29,64,153,153,72,29,184,255,192,179,152,152,72, +29,184,255,192,64,19,151,151,72,29,64,141,141,72,29,64,132,132,72,29,64,131, +131,72,29,184,255,192,64,9,129,129,72,29,64,119,119,72,29,184,255,192,64, +14,115,115,72,29,64,110,110,72,29,64,109,109,72,29,184,255,192,64,19,106, +106,72,29,64,101,101,72,29,64,100,100,72,29,64,96,96,72,29,184,255,192,179, +94,94,72,29,184,255,192,64,19,93,93,72,29,64,87,87,72,29,64,86,86,72,29,64, +85,85,72,29,184,255,192,179,84,84,72,29,184,255,192,64,9,79,79,72,29,64,74, +74,72,29,184,255,192,64,24,61,61,72,29,64,56,56,72,29,64,55,55,72,29,64,54, +54,72,29,64,51,51,72,29,184,255,192,179,50,50,72,29,184,255,192,179,49,49, +72,29,184,255,192,64,19,48,48,72,29,64,42,42,72,29,64,41,41,72,29,64,40,40, +72,29,184,255,192,179,36,36,72,29,184,255,192,179,35,35,72,29,184,255,192, +64,19,34,34,72,29,64,29,29,72,29,64,24,24,72,29,64,23,23,72,29,184,255,192, +179,21,21,72,29,184,255,192,179,17,17,72,29,184,255,192,64,14,16,16,72,29, +64,9,9,72,29,64,8,8,72,29,184,255,192,64,12,7,7,72,3,2,1,14,17,38,3,2,1,184, +255,220,180,20,26,5,13,37,1,43,53,53,53,0,43,53,53,53,1,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,0,4,0,0,5,82,5,129, +18,6,0,36,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,0,1,0,168,0,1,4, +47,5,130,0,5,0,56,64,40,3,90,0,4,16,4,64,4,3,4,16,0,48,0,80,0,3,0,0,16,0, +32,0,64,0,96,0,128,0,160,0,7,7,0,2,95,5,3,3,18,0,63,63,237,1,47,94,93,113, +47,93,237,49,48,1,21,33,17,35,17,4,47,253,56,191,5,130,156,251,27,5,129,0, +2,0,61,0,0,5,26,5,129,0,5,0,18,0,176,64,26,106,7,122,7,138,7,3,101,17,117, +17,133,17,3,89,8,1,86,16,1,6,24,13,17,72,18,184,255,232,64,64,13,17,72,132, +2,1,70,2,102,2,118,2,3,139,1,1,73,1,105,1,121,1,3,2,1,12,12,0,6,95,3,1,16, +3,1,15,3,1,175,3,207,3,223,3,255,3,4,79,3,127,3,2,48,3,1,31,3,1,3,18,128, +0,1,0,184,255,192,64,29,21,30,72,0,48,20,1,47,20,1,0,3,6,3,18,95,5,18,12, +32,19,22,72,153,12,1,12,1,3,0,63,51,93,43,63,237,23,50,1,93,93,47,43,93,51, +47,93,93,93,93,113,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93,43,43,93, +93,93,93,49,48,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,62,2,5,217,1,254,251, +35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12,141, +156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,255,255,0,168,0,0,4,254,5,129, +18,6,0,40,0,0,255,255,0,65,0,0,4,163,5,129,18,6,0,61,0,0,255,255,0,168,0, +0,5,32,5,129,18,6,0,43,0,0,0,3,0,97,255,236,5,215,5,150,0,19,0,39,0,43,0, +179,64,130,105,12,1,102,17,1,89,22,1,86,32,1,86,28,1,26,23,90,23,2,21,27, +85,27,2,9,42,1,6,43,1,10,37,26,37,90,37,3,5,33,21,33,85,33,3,9,43,42,30,0, +91,15,20,1,59,207,20,239,20,2,0,20,1,239,20,255,20,2,176,20,1,111,20,1,48, +20,1,31,20,1,0,20,16,20,32,20,64,20,80,20,160,20,6,7,20,30,91,175,10,191, +10,2,32,10,1,15,10,31,10,2,10,43,95,40,40,35,25,95,15,4,35,95,5,19,128,45, +1,32,45,1,93,93,0,63,237,63,237,18,57,47,237,1,47,93,93,93,237,47,94,93,113, +113,113,113,113,114,114,94,93,237,18,57,57,49,48,94,93,93,93,93,93,93,93, +93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,37,33,21,33,5,215,95,180,254,252,165,174, +254,250,174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127, +63,65,127,189,123,132,191,123,59,252,226,2,75,253,181,2,199,165,254,242,192, +104,109,195,1,12,159,165,1,10,187,101,102,188,254,246,163,127,208,148,80, +80,148,208,127,127,211,153,85,86,153,212,208,160,0,0,0,255,255,0,189,0,0, +1,124,5,129,18,6,0,44,0,0,255,255,0,168,0,0,5,63,5,129,18,6,0,46,0,0,0,1, +0,10,0,1,5,78,5,130,0,16,0,202,64,11,116,16,132,16,2,123,15,139,15,2,13,184, +255,232,182,14,17,72,54,13,1,12,184,255,240,64,127,13,17,72,2,16,13,17,72, +1,24,14,17,72,57,1,1,111,18,1,48,18,1,47,18,1,0,18,1,21,16,37,16,53,16,3, +6,16,1,230,16,246,16,2,16,26,15,42,15,58,15,3,9,15,1,233,15,249,15,2,15,7, +7,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,13,175,14,191,14,2,14,26,1,42, +1,58,1,3,9,1,1,233,1,249,1,2,1,16,0,32,0,48,0,3,111,0,1,0,0,48,0,2,0,118, +7,134,7,2,7,15,3,14,0,18,0,63,50,63,51,93,1,47,93,93,113,50,93,113,113,47, +93,51,93,113,113,57,61,47,51,93,113,113,51,93,113,113,93,93,93,93,49,48,93, +43,43,43,93,43,93,93,37,35,1,46,1,39,38,39,6,7,14,1,7,1,35,1,51,5,78,201, +254,124,17,29,12,14,12,13,14,12,30,15,254,122,201,2,63,198,1,3,224,47,89, +35,41,37,39,41,35,89,45,252,32,5,129,0,255,255,0,168,0,0,6,2,5,129,18,6,0, +48,0,0,255,255,0,168,0,0,5,32,5,129,18,6,0,49,0,0,0,3,0,90,0,0,4,217,5,129, +0,3,0,7,0,11,0,75,64,49,82,3,1,10,9,5,3,95,6,1,15,6,31,6,175,6,191,6,4,6, +2,16,5,48,5,2,32,5,64,5,112,5,160,5,4,5,10,95,11,11,0,7,95,6,18,3,95,0,3, +0,63,237,63,237,17,57,47,237,1,47,93,113,51,47,93,113,51,18,57,57,49,48,113, +19,33,21,33,1,21,33,53,1,21,33,53,125,4,57,251,199,4,92,251,129,3,228,252, +183,5,129,156,251,183,156,156,2,133,154,154,0,0,0,255,255,0,97,255,236,5, +215,5,150,18,6,0,50,0,0,0,1,0,168,0,0,5,32,5,129,0,7,0,79,64,40,3,90,0,4, +16,4,64,4,3,7,4,7,90,64,111,0,127,0,143,0,191,0,4,0,0,9,128,32,9,1,32,9,160, +9,176,9,192,9,4,9,184,255,192,64,10,14,17,72,2,95,5,3,4,0,18,0,63,50,63,237, +1,43,93,113,26,16,204,47,93,26,237,47,94,93,237,49,48,33,17,33,17,35,17,33, +17,4,97,253,6,191,4,120,4,224,251,32,5,129,250,127,255,255,0,168,0,0,4,234, +5,129,18,6,0,51,0,0,0,1,0,108,0,0,4,161,5,129,0,12,0,188,64,135,169,3,1,105, +9,1,116,9,132,9,164,9,3,148,8,164,8,2,87,8,103,8,2,145,7,1,84,7,100,7,2,146, +10,162,10,2,116,10,132,10,2,70,10,86,10,102,10,3,57,3,185,3,2,249,3,1,103, +3,1,168,8,1,103,8,1,8,100,2,1,39,2,1,175,6,1,2,6,2,6,1,208,11,1,0,11,16,11, +48,11,80,11,96,11,128,11,6,7,11,70,7,1,11,7,1,7,3,3,10,175,1,191,1,2,32,1, +1,15,1,1,1,3,7,95,9,2,8,3,0,4,3,1,10,95,0,18,0,63,237,50,63,18,23,57,237, +50,1,47,93,93,93,51,51,47,51,113,113,47,94,93,93,18,57,57,47,47,93,113,113, +51,113,113,113,113,114,49,48,93,93,93,93,93,93,93,93,113,93,51,53,9,1,53, +33,21,33,1,21,1,33,21,108,2,26,253,247,3,231,252,240,1,202,254,22,3,109,162, +2,67,1,251,161,156,254,67,124,253,240,156,0,255,255,0,46,0,0,4,180,5,129, +18,6,0,55,0,0,255,255,0,45,0,0,5,41,5,129,18,6,0,60,0,0,0,3,0,117,255,245, +5,238,5,139,0,29,0,40,0,51,0,180,185,0,28,255,240,179,12,15,72,17,184,255, +240,179,12,15,72,27,184,255,240,179,12,15,72,18,184,255,240,64,72,12,15,72, +41,90,11,15,123,15,171,15,3,15,8,30,90,4,0,116,0,164,0,3,0,35,24,7,90,47, +21,4,8,1,20,8,36,8,68,8,116,8,164,8,244,8,6,8,20,53,68,53,2,0,53,1,132,53, +164,53,196,53,244,53,4,112,53,1,2,96,53,1,53,184,255,192,64,24,10,13,72,35, +46,96,10,6,10,34,49,96,20,24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57, +47,47,17,51,16,237,50,17,51,16,237,50,1,43,93,95,93,93,113,113,47,93,113, +51,51,253,50,50,220,93,237,16,220,93,237,49,48,0,43,43,43,43,1,20,14,2,43, +1,21,35,53,35,34,46,2,53,52,62,2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17, +51,50,62,2,37,20,30,2,59,1,17,35,34,6,5,238,64,131,197,133,83,185,83,133, +197,131,64,67,133,201,135,72,185,71,135,202,133,67,192,185,183,48,56,92,136, +89,43,252,7,43,89,136,92,56,52,182,182,2,224,105,188,143,84,227,227,84,143, +188,105,113,185,131,72,182,182,72,131,185,117,187,180,253,22,53,98,140,88, +88,140,98,53,2,234,180,255,255,0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,145, +0,0,6,30,5,129,0,35,0,203,64,127,90,31,106,31,2,85,30,101,30,2,90,4,106,4, +2,90,5,106,5,2,74,22,1,69,13,1,3,25,90,100,28,1,132,28,148,28,2,28,19,35, +90,0,10,90,107,7,1,139,7,155,7,2,7,16,219,0,1,4,0,100,0,132,0,3,219,0,1,4, +0,52,0,68,0,100,0,132,0,148,0,180,0,196,0,8,7,0,4,37,36,37,52,37,68,37,132, +37,196,37,212,37,7,228,37,244,37,2,160,37,1,132,37,148,37,2,96,37,112,37, +2,84,37,1,64,37,1,2,37,184,255,192,64,18,9,12,72,34,2,96,19,239,15,1,15,15, +26,17,8,3,0,18,0,63,63,51,51,57,47,93,51,237,50,1,43,95,93,93,93,93,93,93, +113,47,94,93,93,113,113,51,220,93,113,237,16,253,50,220,93,113,237,49,48, +95,93,93,93,0,93,1,93,0,93,33,17,35,34,46,2,53,17,51,17,20,30,2,59,1,17,51, +17,51,50,62,2,53,17,51,17,20,14,2,43,1,17,2,251,83,133,201,134,67,191,47, +93,139,92,56,185,56,95,140,91,45,191,68,134,201,132,83,1,171,84,142,189,104, +1,207,254,45,80,137,100,57,3,73,252,183,57,100,137,80,1,211,254,49,104,189, +142,84,254,85,0,0,0,1,0,87,0,0,5,163,5,150,0,57,0,225,64,91,101,36,1,101, +22,1,157,49,1,143,49,1,49,16,11,15,72,157,9,1,143,9,1,9,16,11,15,72,116,3, +132,3,2,54,3,1,54,2,118,2,2,54,56,118,56,2,116,55,132,55,2,54,55,1,42,26, +1,42,32,1,41,53,48,40,10,18,96,40,112,40,144,40,3,111,18,127,18,159,18,3, +40,18,40,18,24,34,91,80,53,1,53,184,255,192,64,69,27,30,72,191,53,207,53, +2,48,53,1,53,17,5,91,31,24,79,24,2,224,24,1,15,24,31,24,95,24,207,24,223, +24,5,160,24,1,111,24,159,24,2,0,24,32,24,48,24,3,8,24,95,59,1,10,15,19,39, +48,5,42,95,18,41,18,29,95,0,4,0,63,237,63,51,237,23,50,1,93,47,94,93,93,93, +113,113,114,253,196,47,93,93,43,114,237,17,57,57,47,47,93,93,17,51,17,51, +16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,1,50,30,2, +21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46,2,35,34,14,2,21,20,30, +2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,2,253,151,241,168,90,59,109, +157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116,169,108,109,170,116, +61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109,59,90,168,241,5,150, +86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51,126,143,159,85,116,181, +124,65,65,124,181,116,85,159,143,126,51,224,156,4,2,3,2,54,138,167,191,106, +147,234,162,86,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218, +0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,3,0,45, +0,0,5,41,6,178,0,8,0,12,0,16,2,114,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5, +1,3,5,1,16,3,5,184,255,232,64,255,12,15,72,12,133,9,16,133,64,13,5,4,14,2, +1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8,6,1,90,38,2,86,2,150,2,3, +118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,18,169,18,201,18,3,86,18,1,9,18, +57,18,2,25,18,89,18,137,18,249,18,4,6,18,1,202,249,18,1,230,18,1,9,18,25, +18,185,18,201,18,4,198,18,1,89,18,121,18,169,18,3,54,18,1,41,18,57,18,185, +18,233,18,4,11,18,1,153,249,18,1,198,18,214,18,2,178,18,1,164,18,1,150,18, +1,130,18,1,116,18,1,86,18,102,18,2,66,18,1,36,18,52,18,2,18,18,1,4,18,1,244, +18,1,230,18,1,196,18,212,18,2,166,18,182,18,2,146,18,1,132,18,1,118,18,1, +98,18,1,84,18,1,54,18,70,18,2,36,18,1,22,18,1,4,18,1,242,18,1,1,208,18,224, +18,2,196,18,1,160,18,176,18,2,148,18,1,112,18,1,100,18,1,64,18,1,20,18,36, +18,52,18,3,0,18,1,105,64,202,228,18,244,18,2,208,18,1,164,18,180,18,196,18, +3,128,18,144,18,2,116,18,1,80,18,96,18,2,68,18,1,32,18,1,4,18,20,18,2,244, +18,1,224,18,1,196,18,212,18,2,176,18,1,84,18,100,18,116,18,148,18,164,18, +5,48,18,64,18,2,36,18,1,0,18,1,196,18,244,18,2,144,18,1,4,18,20,18,36,18, +68,18,84,18,116,18,132,18,7,57,224,18,1,132,18,164,18,212,18,3,112,18,1,4, +18,36,18,52,18,84,18,100,18,5,228,18,244,18,2,192,18,1,180,18,1,144,18,1, +4,18,20,18,52,18,84,18,132,18,5,212,18,228,18,2,187,18,1,164,18,1,112,18, +1,2,48,18,96,18,2,15,18,47,18,2,10,14,145,9,95,13,1,13,64,9,12,72,13,0,3, +59,3,75,3,123,3,3,3,1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,47,43,93,51,237, +50,1,93,93,95,93,93,93,93,113,113,113,113,113,114,114,114,114,94,93,93,93, +113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,94,93, +93,93,93,93,93,93,93,93,95,93,113,113,113,113,113,113,113,113,113,113,113, +113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,113,113, +113,114,114,114,94,93,93,113,113,113,47,94,93,93,93,113,253,57,206,94,93, +93,50,43,1,24,16,77,230,50,47,26,237,220,237,49,48,43,95,94,93,93,43,93,93, +1,17,35,19,1,51,9,1,51,37,53,51,21,33,53,51,21,3,9,190,2,253,224,205,1,178, +1,176,205,253,249,163,253,211,165,2,72,253,184,2,72,3,57,253,97,2,159,121, +184,184,184,184,255,255,0,86,255,236,4,101,6,7,18,38,1,122,0,0,17,7,1,80, +1,33,0,0,0,19,64,11,2,60,17,38,2,26,60,63,8,23,37,1,43,53,0,43,53,0,0,0,255, +255,0,70,255,236,3,106,6,7,18,38,1,126,0,0,17,7,1,80,0,202,0,0,0,19,64,11, +1,58,17,38,1,73,58,61,16,6,37,1,43,53,0,43,53,0,0,0,255,255,0,106,254,88, +3,238,6,7,18,38,1,128,0,0,17,7,1,80,1,57,0,0,0,19,64,11,1,36,17,38,1,100, +36,39,17,34,37,1,43,53,0,43,53,0,0,0,255,255,0,137,0,0,1,178,6,7,18,38,1, +130,0,0,17,6,1,80,209,0,0,27,64,17,1,14,17,38,1,16,14,1,0,14,1,29,14,17,5, +13,37,1,43,93,93,53,0,43,53,0,255,255,0,133,255,236,3,254,6,65,18,38,1,142, +0,0,17,7,1,81,0,222,0,0,0,30,64,9,3,2,1,32,17,38,3,2,1,184,255,241,180,38, +44,10,0,37,1,43,53,53,53,0,43,53,53,53,0,2,0,86,255,236,4,101,4,78,0,39,0, +59,1,15,64,196,122,48,138,48,2,121,52,137,52,2,101,43,1,90,58,106,58,2,54, +14,70,14,2,29,31,45,31,2,29,38,45,38,2,47,37,1,29,37,1,75,36,107,36,2,47, +36,63,36,2,29,36,1,139,35,1,47,35,1,29,35,1,47,34,1,29,34,1,47,22,1,27,22, +1,47,21,1,27,21,1,75,20,107,20,2,47,20,1,27,20,1,45,19,1,27,19,1,121,6,137, +6,2,11,6,27,6,2,34,48,18,22,72,34,33,22,48,18,22,72,22,23,26,33,42,33,2,73, +23,1,26,23,42,23,2,33,23,159,28,175,28,191,28,3,28,64,29,33,72,28,64,0,16, +22,34,4,144,50,160,50,176,50,3,127,50,1,32,50,64,50,2,50,61,128,40,71,8,16, +61,1,0,50,28,16,4,23,33,21,23,15,55,80,11,16,45,80,5,22,0,63,237,63,237,63, +63,18,23,57,1,93,47,237,26,16,220,93,93,93,23,50,26,205,43,93,50,50,93,93, +93,17,51,43,17,51,43,49,48,0,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93, +93,93,93,93,93,93,93,93,93,93,0,93,1,93,0,93,1,93,37,14,3,35,34,2,17,16,18, +51,50,30,2,23,51,62,3,55,51,14,3,7,30,3,23,35,46,3,39,1,20,30,2,51,50,62, +2,55,46,3,35,34,14,2,3,75,26,65,87,111,70,205,193,217,209,69,112,86,63,20, +2,4,14,19,23,13,188,22,46,39,30,5,3,23,31,36,18,183,11,21,16,13,3,253,196, +28,59,93,66,54,100,82,61,14,12,45,71,102,70,66,96,64,31,237,56,94,69,38,1, +20,1,24,1,28,1,26,39,69,93,54,21,56,63,65,30,47,128,139,139,58,103,175,144, +110,39,28,66,65,58,20,1,49,112,160,103,48,52,107,160,108,86,154,115,68,46, +102,163,0,2,0,142,254,87,4,73,5,204,0,32,0,62,0,185,64,68,149,20,1,154,16, +1,123,7,139,7,2,122,60,138,60,2,106,3,122,3,138,3,3,102,31,118,31,2,74,50, +90,50,106,50,3,21,2,37,2,101,2,117,2,133,2,5,147,21,1,21,21,37,21,2,28,48, +23,72,52,48,48,64,48,2,96,48,1,48,184,255,192,64,58,20,23,72,48,52,48,52, +14,0,72,64,48,43,64,43,160,43,3,160,43,176,43,192,43,3,43,64,128,33,13,70, +0,14,16,14,48,14,3,8,14,28,48,80,49,49,38,57,80,18,0,13,27,33,38,80,9,5,22, +0,63,51,237,50,63,63,237,18,57,47,237,57,1,47,94,93,237,50,26,16,220,93,113, +26,237,18,57,57,47,47,43,93,113,16,237,17,57,49,48,93,93,93,93,93,0,93,93, +93,1,93,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35,17,52,54,51,50,30,2,21, +20,14,2,7,30,3,1,30,3,51,50,62,2,53,52,46,2,35,53,62,1,53,52,46,2,35,34,14, +2,21,4,73,53,111,173,120,102,160,56,6,3,3,180,228,226,99,152,102,53,35,61, +81,46,57,114,91,56,252,249,28,71,81,87,43,72,110,73,38,38,81,128,89,127,113, +27,57,87,60,70,104,68,34,1,149,89,154,116,66,55,39,57,92,53,254,215,5,172, +237,220,47,90,130,82,73,111,82,56,18,11,55,93,137,254,218,19,34,25,14,41, +76,106,66,65,110,81,45,142,27,139,122,44,77,57,32,35,77,122,88,0,0,0,0,1, +0,7,254,88,3,249,4,58,0,24,0,237,64,59,59,22,75,22,2,41,22,1,59,21,75,21, +2,26,21,42,21,2,9,21,1,42,12,58,12,74,12,3,25,12,1,77,13,1,13,16,13,16,72, +66,2,1,54,2,1,34,2,1,6,2,22,2,2,13,2,1,1,17,1,184,255,240,64,76,13,16,72, +24,15,7,7,13,14,16,15,14,47,14,2,57,31,14,63,14,95,14,127,14,159,14,191,14, +223,14,255,14,8,63,14,127,14,159,14,191,14,223,14,255,14,6,0,14,32,14,2,224, +14,1,191,14,1,160,14,1,95,14,159,14,2,0,14,16,14,64,14,3,8,14,1,0,184,255, +240,64,17,127,0,1,0,64,26,1,0,26,48,26,96,26,144,26,4,26,184,255,192,64,14, +21,26,72,7,15,24,3,25,20,27,13,13,0,15,0,63,50,47,63,17,23,51,1,43,93,113, +47,93,56,50,47,94,93,93,93,93,93,113,113,114,94,93,56,51,57,61,47,51,51,49, +48,43,94,93,94,93,93,93,93,43,93,93,93,93,93,93,93,93,19,51,19,30,3,23,62, +3,55,19,51,1,14,3,7,35,62,1,55,7,192,245,7,21,20,17,4,5,18,21,22,8,239,191, +254,122,17,31,27,23,7,191,17,48,24,4,58,253,93,22,63,67,63,22,21,62,67,63, +22,2,165,251,251,45,111,124,132,65,131,213,91,0,0,0,2,0,86,255,236,4,29,5, +204,0,19,0,50,0,156,64,81,115,28,131,28,2,106,28,1,118,46,134,46,2,106,46, +1,90,2,106,2,2,90,17,106,17,2,85,13,101,13,2,114,26,130,26,2,38,26,1,128, +25,1,114,25,1,51,25,67,25,2,50,50,31,71,0,64,25,46,5,47,47,41,31,0,1,144, +0,1,0,52,128,10,71,31,41,1,41,47,20,80,5,184,255,224,64,22,23,28,72,5,24, +18,22,72,111,5,1,90,5,1,5,46,48,0,15,80,36,22,0,63,237,63,57,57,93,93,43, +43,237,50,1,47,93,237,26,16,204,93,113,17,57,47,57,57,51,26,16,237,50,47, +49,48,93,93,93,93,93,93,93,93,93,93,93,93,1,52,46,2,39,14,3,21,20,30,2,51, +50,62,2,1,34,46,2,39,1,30,3,21,20,14,2,35,34,46,2,53,52,62,2,55,1,53,33,21, +3,96,49,69,76,26,73,134,102,60,35,73,111,77,81,112,69,31,254,255,13,42,45, +41,13,1,60,54,102,79,49,64,123,180,115,114,180,125,66,73,127,169,96,254,193, +2,221,1,215,85,145,115,86,27,26,81,114,146,91,76,131,96,55,54,95,131,3,191, +2,3,2,1,254,188,55,116,134,159,97,110,182,131,72,68,127,183,115,112,176,135, +97,33,1,83,119,132,0,1,0,70,255,236,3,106,4,78,0,57,0,179,64,49,140,37,1, +133,3,1,53,36,69,36,2,55,34,1,42,8,1,37,5,1,14,24,9,12,72,10,29,26,29,42, +29,3,42,70,21,48,27,48,27,48,16,35,35,6,64,37,48,72,6,184,255,192,179,14, +17,72,6,184,255,192,64,66,8,11,72,6,59,53,71,31,16,63,16,79,16,95,16,4,16, +64,37,43,72,16,128,59,1,31,59,95,59,2,21,48,80,15,47,31,47,79,47,95,47,175, +47,223,47,239,47,7,191,47,207,47,2,47,47,0,39,80,36,32,16,0,80,5,11,22,0, +63,51,237,63,51,237,18,57,47,93,113,237,57,1,93,113,47,43,93,237,16,198,43, +43,43,50,47,17,57,57,47,47,18,57,237,49,48,93,43,0,93,1,93,0,93,93,93,93, +37,50,62,2,55,23,14,3,35,34,46,2,53,52,62,2,55,53,46,3,53,52,62,2,51,50,22, +23,7,46,1,35,34,6,21,20,30,2,51,21,34,14,2,21,20,30,2,1,200,54,96,79,63,21, +105,32,84,106,130,78,96,141,92,45,42,72,96,54,51,85,61,34,50,95,136,87,118, +191,67,128,47,125,75,91,96,55,97,131,75,72,139,109,66,29,52,74,114,31,48, +56,26,100,39,71,53,32,46,84,116,69,58,95,69,42,5,2,6,40,64,86,51,62,106,77, +44,86,99,88,71,68,85,74,57,70,37,12,135,11,40,80,69,45,69,46,24,0,0,0,1,0, +86,254,159,3,96,5,204,0,56,0,209,64,117,169,38,1,156,29,172,29,2,149,55,165, +55,2,173,39,1,124,39,140,39,156,39,3,117,8,1,115,2,1,100,36,132,36,148,36, +164,36,4,139,24,155,24,171,24,3,57,24,1,44,31,156,31,172,31,3,44,30,60,30, +76,30,3,100,54,132,54,164,54,3,38,54,86,54,2,240,47,1,47,47,21,0,71,33,40, +50,50,10,31,21,79,21,2,191,21,1,21,64,29,33,72,0,21,16,21,32,21,64,21,4,7, +21,50,47,80,5,26,0,184,255,240,64,31,19,22,72,135,0,151,0,2,218,33,1,169, +33,185,33,201,33,3,136,33,152,33,2,26,33,0,3,15,48,0,15,0,47,63,18,23,57, +93,93,93,93,43,17,51,237,50,1,47,94,93,43,93,113,205,50,47,51,47,237,18,57, +47,113,49,48,93,93,93,93,0,93,93,1,93,0,93,93,1,93,93,93,0,93,1,93,1,20,30, +2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,55,53,14,3,35, +33,53,33,21,14,5,1,21,43,74,100,57,54,111,90,58,18,26,29,10,126,9,19,16,11, +36,66,94,57,42,89,82,73,54,31,49,85,113,127,135,64,12,34,36,34,11,254,167, +2,130,62,131,123,108,81,47,1,123,64,79,49,31,15,15,34,57,88,68,34,68,62,51, +17,56,12,33,38,39,19,34,45,33,25,13,10,23,36,50,74,100,67,83,176,176,175, +166,155,68,4,1,1,1,1,131,127,70,157,166,172,171,166,0,0,0,0,1,0,106,254,88, +3,238,4,78,0,35,0,100,185,0,32,255,232,64,46,9,12,72,35,70,64,80,0,1,159, +0,255,0,2,0,37,128,23,12,70,192,13,1,0,13,16,13,48,13,224,13,240,13,5,8,13, +240,37,1,255,37,1,112,37,1,37,184,255,192,64,14,19,23,72,35,27,23,6,80,29, +16,17,15,12,21,0,63,63,63,237,50,63,1,43,93,93,113,47,94,93,113,237,50,26, +16,220,93,113,26,237,49,48,43,1,17,52,46,2,35,34,14,2,21,17,35,17,52,38,39, +51,30,3,21,51,62,3,51,50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,22, +14,170,9,14,10,5,3,26,62,82,106,70,90,130,84,39,254,88,4,86,79,106,65,27, +45,85,125,81,253,141,3,83,68,121,42,21,48,49,47,20,47,76,53,29,44,92,145, +100,251,135,0,0,0,0,3,0,106,255,236,4,9,5,203,0,15,0,26,0,37,0,194,64,108, +153,19,169,19,2,150,24,166,24,2,138,2,1,133,5,1,138,14,1,133,10,1,124,36, +140,36,2,115,29,131,29,2,85,29,101,29,2,124,18,140,18,2,74,18,90,18,106,18, +3,115,25,131,25,2,69,25,85,25,101,25,3,6,13,22,13,2,6,10,1,9,5,1,9,2,1,7, +33,0,71,64,15,21,31,21,127,21,143,21,239,21,255,21,6,21,64,45,48,72,21,39, +128,32,22,71,32,8,1,8,184,255,192,183,29,35,72,8,48,39,1,39,184,255,192,64, +19,30,35,72,223,39,1,22,80,32,32,16,27,80,11,0,16,80,3,22,0,63,237,63,237, +18,57,47,237,1,93,43,113,47,43,93,237,50,26,16,220,43,113,26,237,51,49,48, +0,94,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,16,2,35,34,46, +1,2,53,16,18,51,50,30,1,18,1,50,62,2,55,33,30,3,19,34,14,2,7,33,46,3,4,9, +240,228,108,171,118,62,233,232,121,175,112,54,254,42,62,100,73,42,3,253,221, +3,44,71,94,66,62,99,72,42,3,2,35,3,40,69,97,2,221,254,131,254,140,92,186, +1,27,192,1,117,1,121,93,188,254,231,252,216,52,128,216,164,164,215,129,52, +4,217,51,126,212,161,161,212,126,51,0,0,0,1,0,137,0,0,1,141,4,58,0,13,1,13, +64,210,13,8,70,207,5,223,5,2,0,5,32,5,208,5,3,9,5,5,14,15,95,15,111,15,2, +32,15,1,224,15,240,15,2,111,15,127,15,143,15,3,0,15,16,15,32,15,3,205,207, +15,223,15,239,15,3,96,15,1,127,15,207,15,2,64,15,80,15,2,175,15,223,15,239, +15,3,96,15,112,15,2,15,15,31,15,2,154,255,15,1,208,15,224,15,2,63,15,1,159, +15,175,15,2,112,15,1,223,15,1,144,15,1,63,15,79,15,2,0,15,1,106,159,15,223, +15,239,15,3,96,15,112,15,2,15,15,1,239,15,255,15,2,128,15,208,15,2,63,15, +1,96,15,1,15,15,31,15,2,55,207,15,255,15,2,144,15,160,15,176,15,3,31,15,47, +15,63,15,3,176,15,192,15,208,15,3,15,15,31,15,111,15,3,144,15,160,15,224, +15,3,31,15,63,15,2,0,15,1,7,6,15,0,21,0,63,63,1,94,93,93,93,113,113,114,114, +114,94,93,93,113,113,113,114,114,114,94,93,93,93,93,113,113,114,114,114,94, +93,93,93,113,113,114,114,94,93,93,93,113,113,17,18,57,47,94,93,113,237,50, +49,48,51,46,3,53,17,51,17,20,30,2,23,199,15,24,15,8,180,11,21,30,18,16,53, +64,70,33,3,78,252,169,32,64,60,52,19,0,0,0,1,0,138,0,0,4,3,4,58,0,11,0,158, +64,114,148,9,164,9,2,102,9,118,9,134,9,3,172,0,1,139,0,155,0,2,105,0,121, +0,2,86,10,150,10,166,10,3,151,10,167,10,2,84,10,1,70,7,134,7,2,1,10,247,8, +1,8,10,9,16,9,9,0,11,16,0,11,160,11,2,0,11,16,11,32,11,64,11,160,11,224,11, +6,7,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2, +1,7,10,4,8,5,15,4,0,21,0,63,50,63,51,23,57,1,93,93,47,94,93,237,50,47,94, +93,113,56,51,57,47,56,57,51,113,17,51,49,48,0,93,93,93,1,93,93,93,93,93,93, +33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73, +1,206,1,238,109,254,127,4,58,253,243,2,13,254,47,253,151,0,0,0,0,1,0,14,0, +0,3,238,5,204,0,33,1,60,64,101,149,15,1,157,23,1,138,2,1,137,1,1,137,25,153, +25,2,140,21,156,21,2,115,0,131,0,147,0,3,140,20,156,20,2,106,20,122,20,2, +146,32,1,132,32,1,101,32,117,32,2,3,102,26,118,26,150,26,3,141,26,157,26, +2,2,126,26,1,108,26,1,3,84,18,1,148,31,1,101,31,117,31,133,31,3,86,31,1,146, +29,1,2,128,29,1,84,29,1,144,28,1,28,184,255,224,64,59,13,16,72,146,27,1,84, +27,100,27,116,27,3,93,0,109,0,2,149,17,1,73,17,1,150,18,1,138,18,1,101,18, +117,18,2,38,18,86,18,2,42,3,58,3,74,3,122,3,138,3,5,26,0,20,10,10,19,32,33, +184,255,240,64,69,33,20,19,16,31,19,63,19,2,31,19,63,19,95,19,127,19,159, +19,191,19,223,19,255,19,8,223,19,255,19,2,192,19,1,95,19,159,19,2,0,19,16, +19,64,19,3,8,19,0,35,48,35,96,35,160,35,176,35,5,26,0,13,33,19,21,6,80,13, +0,0,63,237,63,51,18,57,57,1,93,47,94,93,93,93,93,113,114,56,51,47,56,51,18, +57,47,18,57,57,49,48,93,93,93,93,93,93,93,0,93,1,93,93,43,93,93,93,95,93, +93,93,93,0,93,95,93,93,95,93,1,93,95,93,93,93,93,93,93,93,93,93,93,93,0,93, +1,39,46,3,35,34,6,7,39,62,1,51,50,30,2,23,1,35,3,46,3,39,14,3,7,1,35,1,207, +36,27,42,45,57,40,11,32,6,35,25,72,32,55,87,73,67,36,1,171,190,207,8,18,18, +16,5,7,22,25,24,8,254,255,187,3,197,99,73,105,67,31,7,3,130,9,15,36,81,131, +95,251,139,2,65,22,56,59,56,21,21,60,62,55,18,253,193,0,0,0,1,0,138,254,119, +4,6,4,58,0,41,0,108,64,55,13,40,14,17,72,90,8,106,8,2,35,70,5,15,34,95,34, +2,159,34,175,34,255,34,3,0,34,16,34,32,34,3,7,34,43,23,19,70,0,20,16,20,48, +20,240,20,4,8,20,96,43,128,43,2,43,184,255,192,64,15,20,23,72,41,21,34,21, +15,19,5,28,80,14,11,22,0,63,51,237,50,47,63,51,63,1,43,93,47,94,93,237,50, +16,220,94,93,93,113,50,237,49,48,0,93,1,43,33,46,3,53,35,14,3,35,34,38,39, +35,30,1,21,17,35,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,30,2,23,3,94, +1,3,3,3,4,26,56,69,86,57,82,120,32,4,3,1,182,182,25,59,98,74,67,100,67,33, +181,1,2,2,1,6,46,59,59,20,51,79,53,27,64,58,32,63,27,254,139,5,195,253,124, +69,116,85,47,52,91,126,75,2,105,252,175,34,76,67,49,7,0,0,1,0,0,0,0,3,178, +4,58,0,18,2,35,64,79,130,17,146,17,162,17,3,153,6,169,6,2,131,8,147,8,163, +8,3,3,87,8,103,8,119,8,3,6,5,9,32,14,17,72,9,9,7,15,16,16,0,70,64,91,12,107, +12,123,12,3,91,12,219,12,235,12,3,180,12,196,12,2,11,12,27,12,59,12,91,12, +107,12,5,7,12,20,128,8,7,184,255,240,64,255,7,11,20,27,20,2,11,20,27,20,75, +20,91,20,139,20,155,20,203,20,219,20,8,255,20,1,196,20,212,20,2,160,20,1, +132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4,20,20,20,2,199,224,20,1,196, +20,212,20,2,160,20,1,4,20,20,20,68,20,84,20,132,20,148,20,6,68,20,84,20,132, +20,148,20,196,20,212,20,6,27,20,1,4,20,1,219,20,1,196,20,1,155,20,1,132,20, +1,91,20,1,68,20,1,27,20,1,4,20,1,151,11,20,27,20,75,20,91,20,139,20,155,20, +203,20,219,20,8,155,20,203,20,219,20,3,132,20,1,96,20,1,68,20,84,20,2,32, +20,1,4,20,20,20,2,224,20,1,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20, +1,4,20,20,20,68,20,84,20,4,103,4,20,20,20,68,20,84,20,132,20,148,20,196,20, +212,20,8,219,20,1,196,20,1,155,20,1,132,20,1,91,20,1,68,20,1,27,20,1,4,20, +1,219,20,1,196,20,1,11,20,27,20,75,20,91,20,139,20,155,20,64,93,6,55,75,20, +91,20,139,20,155,20,203,20,219,20,6,63,20,1,32,20,1,4,20,20,20,2,224,20,1, +196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4, +20,20,20,2,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,2,80,20,1,47, +20,1,0,20,16,20,2,7,15,7,15,9,6,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93, +93,113,113,113,113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113, +113,113,113,113,113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114, +94,93,93,93,93,93,93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93, +93,93,93,113,114,47,56,51,26,16,220,94,93,93,113,114,26,237,50,17,51,17,57, +61,47,43,51,51,49,48,93,95,93,93,93,1,20,14,2,7,35,1,51,1,54,18,53,52,38, +39,51,30,1,3,178,63,106,140,77,170,254,122,189,1,55,142,124,29,20,177,24, +28,3,78,99,218,221,214,94,4,58,252,96,185,1,86,156,81,119,45,45,113,0,0,0, +1,0,86,254,159,3,106,5,204,0,74,1,0,64,125,122,71,138,71,2,101,33,117,33, +133,33,3,105,39,1,85,50,1,83,44,1,57,2,1,110,66,126,66,142,66,3,26,66,42, +66,2,12,29,28,29,44,29,3,13,40,9,12,72,12,73,28,73,44,73,108,73,124,73,140, +73,6,5,11,95,37,1,79,37,1,112,37,128,37,2,37,17,95,26,1,111,26,1,26,37,26, +52,63,31,70,11,32,11,1,23,11,23,11,0,31,63,63,63,79,63,111,63,127,63,143, +63,175,63,191,63,207,63,9,159,63,175,63,255,63,3,63,184,255,192,64,17,7,11, +72,63,42,71,31,0,1,0,5,37,80,31,11,24,42,184,255,240,64,32,19,22,72,151,42, +1,0,16,19,22,72,152,0,1,52,0,42,3,57,32,36,1,36,36,24,57,26,17,23,80,24,0, +0,63,237,50,50,47,18,57,47,93,18,23,57,93,43,93,43,18,57,57,237,57,1,47,93, +237,47,43,93,113,18,57,57,47,47,93,16,237,16,205,50,50,47,93,114,51,47,93, +113,114,18,57,49,48,93,43,93,0,93,93,1,93,0,93,93,93,1,93,0,93,19,52,62,2, +55,53,46,3,53,52,62,2,55,53,14,3,43,1,53,33,21,14,3,21,20,30,2,23,21,14,3, +21,20,30,2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,86,51,110,175, +125,68,118,87,51,50,79,97,47,12,68,80,76,18,74,2,122,77,144,112,68,60,99, +130,69,100,175,131,76,43,74,100,57,54,114,94,61,18,26,29,10,126,9,19,16,11, +39,70,97,57,42,89,82,73,54,31,1,98,76,147,124,90,19,2,5,39,68,96,62,64,93, +64,40,10,8,1,2,3,2,131,125,9,34,59,90,67,63,81,49,24,6,131,13,54,89,127,84, +64,79,49,31,15,15,34,57,88,68,34,68,62,51,17,56,12,33,38,39,19,34,45,33,25, +13,10,23,36,50,74,100,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0, +79,255,236,5,43,4,58,0,48,0,115,64,35,53,12,117,12,133,12,3,3,40,7,17,72, +3,40,7,17,72,46,80,32,96,32,2,46,32,35,70,64,111,5,1,80,5,1,5,184,255,192, +64,38,8,11,72,5,50,128,15,50,47,50,2,13,7,72,79,25,95,25,111,25,207,25,4, +25,14,20,34,7,20,80,31,15,14,21,40,80,0,22,0,63,237,63,63,237,50,50,1,47, +50,50,93,237,50,93,26,16,220,43,93,113,26,237,50,50,93,47,49,48,43,0,43,1, +93,5,34,46,2,53,17,33,21,20,14,2,7,35,62,3,61,1,34,14,2,7,53,62,3,51,33,21, +35,17,20,30,2,51,50,62,2,55,21,14,1,4,102,59,82,52,24,254,110,16,27,36,19, +188,19,39,32,20,39,79,69,53,12,12,43,51,54,23,4,37,234,13,24,35,22,7,23,25, +23,8,31,69,20,28,59,94,66,2,212,72,131,251,228,195,74,76,197,226,247,125, +80,7,10,13,7,139,6,11,8,4,131,253,83,44,56,32,13,2,2,3,1,129,8,12,0,2,0,132, +254,87,4,59,4,79,0,26,0,47,0,129,64,64,122,25,1,101,20,117,20,2,106,19,122, +19,2,106,45,122,45,2,75,8,91,8,107,8,3,125,30,1,107,30,1,74,30,90,30,2,0, +71,64,160,27,1,27,49,128,38,15,70,223,16,1,0,16,16,16,48,16,3,8,16,48,49, +1,49,184,255,192,64,21,30,35,72,223,49,1,96,49,128,49,2,32,80,22,16,15,27, +43,80,5,22,0,63,237,63,63,237,1,93,93,43,113,47,94,93,113,237,50,26,16,220, +93,26,237,49,48,93,93,93,0,93,1,93,93,0,93,1,93,1,20,14,2,35,34,46,2,39,35, +30,1,21,17,35,17,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,17,30,3,51,50, +62,2,4,59,63,115,161,98,62,98,80,66,28,4,2,2,180,60,116,169,110,103,181,134, +78,193,44,83,116,72,69,100,64,30,28,72,80,87,44,67,100,67,33,2,4,118,197, +142,79,20,37,53,33,30,61,32,254,87,3,238,119,193,136,74,79,150,219,131,104, +166,115,61,53,101,146,93,254,195,35,55,37,20,58,107,152,0,0,1,0,86,254,159, +3,156,4,78,0,57,0,209,64,38,137,55,1,139,54,1,143,53,1,123,53,1,106,50,1, +96,2,1,52,15,68,15,84,15,3,82,10,98,10,130,10,3,51,10,67,10,2,3,184,255,224, +64,52,12,17,72,3,24,11,14,72,26,31,106,31,122,31,138,31,4,139,30,1,10,37, +26,37,2,7,71,31,40,1,40,52,17,79,28,1,143,28,159,28,223,28,3,28,64,24,27, +72,96,28,1,28,184,255,192,183,7,12,72,28,48,59,1,59,184,255,192,64,19,30, +35,72,223,59,1,12,33,40,16,19,22,72,136,40,152,40,2,7,184,255,240,64,19,19, +22,72,135,7,151,7,2,33,7,40,3,22,53,0,80,47,16,22,0,47,63,237,51,18,23,57, +93,43,93,43,17,51,1,93,43,113,47,43,93,43,93,113,205,50,47,93,237,49,48,93, +93,0,93,43,1,43,0,93,93,93,1,93,0,93,1,93,93,0,93,93,1,34,14,4,21,20,30,2, +23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,51,50,30,2,23, +7,46,3,2,70,54,88,67,49,32,15,32,76,124,92,53,114,95,61,18,26,29,10,126,9, +19,16,11,35,68,97,63,66,113,94,72,50,26,20,46,75,110,148,97,68,99,73,54,22, +116,18,42,49,57,3,193,49,80,104,108,106,42,68,96,72,57,30,17,37,59,89,68, +34,68,62,51,17,56,12,33,38,39,19,30,44,36,31,17,18,40,51,68,93,122,81,47, +130,140,136,108,66,21,34,44,23,119,19,36,28,17,0,2,0,86,255,236,4,209,4,58, +0,28,0,47,0,132,64,94,133,12,1,122,13,138,13,2,131,46,1,101,46,117,46,2,100, +42,116,42,132,42,3,124,33,140,33,2,90,33,106,33,2,143,38,1,108,38,124,38, +2,74,38,90,38,2,15,17,31,17,111,17,127,17,4,7,17,0,71,64,15,29,143,29,191, +29,3,0,29,32,29,64,29,3,29,49,128,40,71,31,10,143,10,2,10,23,35,80,15,15, +43,80,5,22,0,63,237,63,237,50,1,47,93,237,26,16,220,93,113,26,237,196,94, +93,49,48,0,93,93,93,1,93,93,93,0,93,93,93,1,93,1,20,14,2,35,34,46,2,53,52, +62,2,51,33,21,35,34,46,2,39,21,30,3,7,52,46,2,39,35,34,14,2,21,20,22,51,50, +62,2,4,48,61,123,183,123,123,186,124,63,86,153,213,126,2,57,165,9,35,43,44, +17,28,55,43,26,189,20,34,45,25,89,83,143,107,61,151,147,78,117,76,38,1,235, +112,188,135,76,74,139,202,129,144,210,138,66,131,1,2,2,1,4,42,99,115,131, +78,74,132,116,99,42,50,105,160,110,207,206,52,97,139,0,1,0,29,255,236,3,24, +4,58,0,35,0,99,64,50,35,13,131,13,2,31,32,12,17,72,13,31,29,31,45,31,3,26, +13,26,127,5,143,5,2,5,15,70,0,34,32,34,2,34,34,36,37,79,37,1,208,37,1,159, +37,1,16,37,1,37,184,255,192,64,12,14,17,72,20,80,29,22,14,35,80,11,15,0,63, +237,50,63,237,1,43,93,93,93,113,17,18,57,47,93,253,204,93,51,51,47,49,48, +0,93,43,1,93,1,34,14,2,7,53,62,3,51,33,21,33,17,20,30,2,51,50,62,2,55,21, +14,1,35,34,46,2,53,17,1,25,39,79,69,53,12,12,43,51,54,23,2,68,254,208,13, +24,35,22,7,23,25,23,8,31,69,43,59,82,52,24,3,183,7,10,13,7,139,6,11,8,4,131, +253,83,44,56,32,13,2,2,3,1,129,8,12,28,59,94,66,2,212,0,0,0,1,0,133,255,236, +3,254,4,58,0,31,0,113,64,62,134,3,1,133,15,149,15,2,106,18,122,18,2,86,28, +1,25,8,41,8,2,27,0,71,64,15,21,1,47,21,159,21,2,160,21,1,21,33,128,13,70, +0,10,16,10,48,10,240,10,4,8,10,240,33,1,255,33,1,112,33,1,33,184,255,192, +64,13,20,23,72,31,33,1,26,11,15,16,80,5,22,0,63,237,63,51,1,93,43,93,93,113, +47,94,93,237,26,16,220,93,113,114,26,237,50,49,48,93,93,93,93,93,1,20,14, +2,35,34,46,2,53,17,51,17,20,22,51,50,62,2,53,52,46,2,39,51,30,3,3,254,53, +113,176,123,109,160,104,51,181,117,134,73,104,65,30,20,33,40,21,188,18,40, +32,21,2,59,137,218,154,82,50,107,166,116,2,151,253,99,146,148,50,108,170, +120,68,147,139,120,41,40,113,134,149,0,2,0,85,254,87,4,218,4,82,0,35,0,45, +0,130,64,21,101,34,1,101,33,117,33,133,33,3,74,21,90,21,2,69,21,85,21,2,45, +184,255,192,179,11,14,72,25,184,255,224,64,54,11,14,72,11,29,27,29,2,64,19, +80,19,2,19,19,24,71,13,7,36,71,224,0,1,0,43,6,72,27,0,7,64,7,2,7,64,47,1, +19,80,18,18,39,80,31,16,43,27,80,5,8,22,6,27,0,63,63,51,237,50,63,237,51, +47,237,1,113,47,93,51,253,50,220,113,237,16,220,237,50,47,93,49,48,93,0,43, +43,1,93,0,93,1,93,93,1,20,14,2,7,17,35,17,46,3,53,52,62,2,55,23,14,3,21,20, +22,23,17,52,54,51,50,30,2,7,52,38,35,34,6,21,17,62,1,4,218,74,132,184,110, +170,114,181,125,67,49,103,159,109,21,69,96,60,27,147,151,154,158,84,133,92, +49,189,87,80,68,76,162,149,2,53,151,215,140,71,6,254,105,1,151,5,72,138,207, +141,102,188,150,103,18,136,15,77,114,143,80,213,201,8,2,68,193,212,76,141, +199,121,193,211,129,140,253,185,7,218,0,0,0,1,0,21,254,88,4,27,4,80,0,27, +1,26,64,51,169,25,1,153,3,1,138,6,154,6,2,174,23,1,123,23,139,23,155,23,3, +84,21,1,173,27,1,140,27,156,27,2,123,27,1,90,27,106,27,2,41,27,57,27,2,26, +16,9,17,72,2,184,255,240,64,99,9,17,72,162,1,1,131,1,147,1,2,116,1,1,69,1, +85,1,101,1,3,38,1,54,1,2,166,25,1,153,25,1,39,25,55,25,71,25,3,3,101,19,117, +19,2,86,19,1,39,19,55,19,2,25,22,0,3,4,2,26,23,24,24,27,26,16,27,26,59,26, +91,26,123,26,155,26,187,26,219,26,7,219,26,251,26,2,4,26,20,26,68,26,3,7, +26,13,13,1,2,184,255,240,183,2,36,29,1,11,29,1,22,184,255,208,64,41,14,17, +72,70,22,1,53,22,1,139,0,1,125,0,1,2,75,0,91,0,107,0,3,63,0,1,0,25,3,22,4, +1,23,15,9,80,16,16,27,1,27,0,63,51,63,237,63,18,23,57,93,93,95,93,93,93,93, +43,1,93,93,47,56,51,51,47,47,94,93,93,113,56,51,51,47,51,17,18,23,57,49,48, +93,93,93,95,93,93,93,93,93,93,93,93,43,43,93,93,93,93,93,93,93,93,93,93,0, +93,37,1,35,1,3,46,3,35,34,6,7,39,62,1,51,50,30,2,23,19,1,51,9,1,35,2,30,254, +179,188,1,184,170,27,44,40,42,25,11,32,7,34,24,62,32,48,70,60,59,36,142,1, +8,187,254,144,1,150,190,239,253,105,3,57,1,87,54,82,55,28,7,3,131,9,11,27, +62,102,75,254,217,2,27,253,71,252,215,0,0,1,0,135,254,87,5,44,5,60,0,31,0, +128,64,90,121,18,1,18,16,7,10,72,121,19,137,19,153,19,3,121,11,1,11,16,7, +10,72,121,10,137,10,153,10,3,24,70,21,15,5,70,8,0,14,72,29,0,15,16,15,160, +15,208,15,4,8,15,128,33,176,33,224,33,3,111,33,1,32,33,1,255,33,1,80,33,128, +33,144,33,192,33,4,30,30,6,22,15,0,29,80,13,16,22,14,27,0,63,63,51,237,50, +63,51,51,47,1,93,93,113,113,113,47,94,93,51,253,50,220,237,16,220,237,49, +48,0,93,43,93,93,43,93,37,62,3,53,17,51,17,20,14,2,7,17,35,17,46,3,53,17, +51,17,20,30,2,23,17,51,3,46,87,124,80,37,182,59,124,193,134,170,134,192,124, +59,181,38,79,124,87,170,119,1,31,73,121,91,2,134,253,124,122,172,110,53,1, +254,107,1,149,1,53,110,172,122,2,132,253,122,90,121,73,32,1,4,197,0,0,0,0, +1,0,83,255,236,5,235,4,79,0,63,0,176,64,83,153,33,169,33,2,153,26,169,26, +2,119,16,1,122,58,138,58,2,10,37,26,37,42,37,154,37,170,37,5,10,22,26,22, +42,22,154,22,170,22,5,29,0,73,61,61,40,8,46,13,46,13,51,19,71,64,128,8,176, +8,2,15,8,1,7,8,65,128,51,71,63,40,1,40,0,65,1,48,65,1,240,65,1,65,184,255, +192,64,32,30,35,72,175,65,223,65,2,0,65,32,65,64,65,3,30,35,62,62,14,3,56, +80,24,35,22,46,13,80,45,14,16,0,63,51,237,50,63,51,237,50,17,57,47,18,57, +1,93,93,43,93,113,114,47,93,237,26,16,220,94,93,93,26,237,18,57,57,47,47, +17,18,57,47,237,57,49,48,0,93,93,1,93,93,0,93,93,1,20,22,51,50,62,2,53,52, +46,2,39,55,30,3,21,20,14,2,35,34,46,2,39,35,14,3,35,34,46,2,53,52,62,2,55, +23,14,3,21,20,30,2,51,50,62,2,61,1,51,3,115,114,102,65,87,53,22,29,61,97, +67,23,109,159,103,49,53,101,148,95,68,104,77,52,16,4,16,52,77,105,67,95,148, +101,53,49,103,159,109,23,68,96,62,28,22,52,86,65,51,82,57,30,166,1,193,157, +173,56,102,145,90,82,150,121,84,15,139,18,112,161,194,101,128,200,137,72, +36,68,99,64,64,99,68,36,72,137,200,128,101,194,161,112,18,139,15,84,121,150, +82,90,145,102,56,45,84,123,78,252,0,0,0,255,255,255,205,0,0,1,250,5,123,18, +38,1,130,0,0,17,6,0,105,160,0,0,25,182,2,1,14,17,38,2,1,184,255,217,180,18, +16,5,13,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,254,5,123, +18,38,1,142,0,0,17,7,0,105,0,242,0,0,0,25,182,2,1,32,17,38,2,1,184,255,244, +180,36,34,10,0,37,1,43,53,53,0,43,53,53,0,255,255,0,86,255,236,4,29,6,7,18, +38,0,82,0,0,17,7,1,80,1,41,0,0,0,19,64,11,2,35,17,38,2,70,35,38,8,0,37,1, +43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,254,6,7,18,38,1,142,0,0,17,7, +1,80,0,252,0,0,0,19,64,11,1,32,17,38,1,17,32,35,10,0,37,1,43,53,0,43,53,0, +0,0,255,255,0,83,255,236,5,235,6,7,18,38,1,146,0,0,17,7,1,80,1,255,0,0,0, +19,64,11,1,64,17,38,1,55,64,67,40,19,37,1,43,53,0,43,53,0,0,0,255,255,0,168, +0,0,4,254,6,178,16,38,0,40,0,0,17,7,2,152,1,121,0,0,0,153,185,0,21,255,192, +179,233,233,72,21,184,255,192,179,230,230,72,21,184,255,192,179,227,227,72, +21,184,255,192,179,224,224,72,21,184,255,192,179,221,221,72,21,184,255,192, +179,218,218,72,21,184,255,192,179,215,215,72,21,184,255,192,179,212,212,72, +21,184,255,192,179,209,209,72,21,184,255,192,179,206,206,72,21,184,255,192, +179,203,203,72,21,184,255,192,179,200,200,72,21,184,255,192,179,197,197,72, +21,184,255,192,64,10,11,11,72,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10, +37,1,43,53,53,0,43,53,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0, +1,0,46,255,236,6,79,5,129,0,45,0,133,64,13,155,31,171,31,2,101,37,117,37, +133,37,3,2,184,255,224,64,71,13,17,72,18,16,12,15,72,42,13,58,13,2,36,7,52, +7,2,20,20,10,42,1,39,90,45,175,40,1,0,40,1,40,10,90,0,29,16,29,176,29,224, +29,4,7,29,0,42,95,43,38,33,95,1,6,6,40,43,3,40,18,26,95,15,63,21,1,21,21, +15,19,0,63,51,47,93,16,237,63,63,18,57,47,51,237,50,16,237,50,1,47,94,93, +237,47,93,93,204,253,50,204,18,57,47,49,48,0,93,93,43,43,93,93,1,17,62,3, +51,50,22,29,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,61,1,52,38,35,34,14, +2,7,17,35,17,33,53,33,21,2,208,33,109,127,130,53,226,217,41,86,133,92,53, +88,75,64,29,111,18,41,48,56,33,84,80,129,144,51,123,120,105,33,190,254,28, +4,134,4,229,254,160,7,20,19,13,187,188,214,93,145,100,53,17,32,46,28,123, +16,33,26,17,101,111,219,119,122,10,15,17,8,253,12,4,229,156,156,0,255,255, +0,168,0,1,4,47,6,240,16,38,1,93,0,0,17,7,2,149,1,113,0,0,0,19,64,11,1,6,5, +38,1,33,6,9,4,0,37,1,43,53,0,43,53,0,0,0,0,1,0,104,255,236,5,121,5,150,0, +42,0,218,64,156,156,17,172,17,2,156,15,172,15,2,156,39,172,39,2,138,39,1, +156,41,172,41,2,138,41,1,137,31,1,117,11,1,117,10,165,10,2,166,26,1,73,26, +137,26,2,70,32,134,32,2,37,10,53,10,2,42,3,58,3,2,3,68,44,1,7,7,19,5,8,91, +116,29,132,29,2,203,29,219,29,2,68,29,1,43,29,1,29,37,235,19,1,100,19,116, +19,164,19,212,19,4,64,19,1,2,0,19,48,19,2,7,19,8,95,127,5,175,5,2,5,5,13, +34,79,38,1,38,38,0,95,34,4,13,95,24,16,18,32,18,2,48,18,64,18,112,18,128, +18,192,18,208,18,6,18,18,24,19,0,63,51,47,93,113,16,237,63,237,51,47,93,17, +18,57,47,113,237,1,47,94,93,95,93,93,113,51,47,93,93,93,113,237,50,17,57, +47,93,49,48,0,95,93,93,93,93,93,1,93,0,93,1,93,93,93,93,93,93,93,1,34,14, +2,7,33,21,33,30,3,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50, +4,23,7,46,3,3,24,111,173,124,73,10,2,142,253,114,9,77,128,176,109,90,141, +108,79,27,156,40,108,148,191,123,171,254,255,173,86,91,175,1,0,164,225,1, +46,71,181,20,68,102,137,4,250,68,126,178,110,154,112,185,132,72,50,82,105, +55,77,79,136,100,57,109,195,1,12,159,165,1,10,187,101,176,173,60,50,91,70, +42,0,0,255,255,0,93,255,236,4,248,5,150,18,6,0,54,0,0,255,255,0,189,0,0,1, +124,5,129,18,6,0,44,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2, +152,218,0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0, +255,255,0,32,255,236,3,104,5,129,18,6,0,45,0,0,0,2,0,18,255,240,8,11,5,129, +0,38,0,47,0,215,64,98,57,29,1,166,8,1,167,11,1,162,10,1,133,10,149,10,2,58, +10,1,154,15,170,15,2,141,13,157,13,173,13,3,121,13,1,116,47,132,47,148,47, +3,123,40,139,40,155,40,3,101,11,1,141,14,157,14,173,14,3,14,32,10,14,72,43, +30,123,30,139,30,155,30,4,42,31,122,31,2,0,90,48,39,1,0,39,16,39,2,7,39,20, +13,36,13,52,13,3,13,184,255,248,64,14,22,25,72,73,8,1,20,8,36,8,52,8,3,8, +184,255,248,64,39,22,25,72,9,31,73,31,2,8,13,31,3,175,20,191,20,2,20,33,44, +90,6,43,95,33,33,6,8,95,31,3,23,95,16,19,44,95,6,18,0,63,237,63,237,63,237, +18,57,47,237,1,47,237,50,47,93,23,51,113,43,113,113,43,113,47,94,93,113,237, +49,48,93,93,0,43,93,1,93,0,93,93,93,93,93,1,93,93,93,93,93,93,1,20,14,2,35, +33,17,33,3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,33,50,30,2, +7,52,38,35,33,17,33,50,54,8,11,61,121,182,121,253,183,254,96,49,22,43,49, +60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,3,2,1,126,125,186, +124,62,192,164,164,254,153,1,111,164,156,1,157,87,150,112,64,4,225,254,144, +172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161,1,254,253,172, +58,105,147,92,121,129,254,2,136,0,0,0,2,0,168,0,0,7,171,5,129,0,22,0,31,0, +110,64,25,116,31,132,31,148,31,3,123,24,139,24,155,24,3,38,20,54,20,2,0,90, +176,23,1,23,184,255,192,64,43,7,11,72,23,13,9,90,0,10,16,10,64,10,3,7,10, +17,28,90,14,0,6,1,8,6,27,95,17,17,8,95,13,13,10,15,11,3,10,18,28,95,6,18, +0,63,237,63,63,51,18,57,47,237,51,47,237,1,47,94,93,51,237,50,47,94,93,237, +50,47,43,93,237,49,48,0,93,93,93,1,20,14,2,35,33,17,33,17,35,17,51,17,33, +17,51,17,33,50,30,2,7,52,38,35,33,17,33,50,54,7,171,61,121,182,121,253,223, +253,194,191,191,2,62,191,1,86,125,186,124,62,192,164,164,254,193,1,71,164, +156,1,157,87,150,112,64,2,141,253,115,5,129,253,172,2,84,253,172,58,105,147, +92,121,129,254,2,136,0,0,0,0,1,0,46,0,0,6,47,5,129,0,27,0,131,64,13,155,2, +171,2,2,101,8,117,8,133,8,3,19,184,255,224,64,76,13,17,72,37,24,53,24,69, +24,3,18,13,10,90,16,175,11,1,0,11,48,11,2,11,27,90,0,0,48,0,192,0,208,0,4, +7,0,176,29,192,29,208,29,3,176,29,240,29,2,255,29,1,16,29,112,29,160,29,176, +29,4,9,4,95,18,23,23,0,17,13,95,14,3,11,0,18,0,63,50,63,237,50,18,57,47,51, +237,50,1,93,93,113,114,47,94,93,237,47,93,93,204,253,204,51,49,48,0,93,43, +93,93,33,17,52,38,35,34,14,2,7,17,35,17,33,53,33,21,33,17,62,3,51,50,22,21, +17,5,113,128,133,53,116,110,98,35,190,254,28,4,179,253,239,36,98,112,118, +56,229,214,2,63,122,109,10,15,18,7,253,12,4,229,156,156,254,160,8,20,18,13, +187,178,253,173,0,0,0,255,255,0,168,0,0,4,157,6,240,18,38,1,176,0,0,17,7, +2,149,1,172,0,0,0,19,64,11,1,23,5,38,1,37,23,26,0,13,37,1,43,53,0,43,53,0, +0,0,255,255,0,55,255,236,5,31,7,58,18,38,1,185,0,0,17,7,2,145,1,94,1,74,0, +19,64,11,1,26,5,38,1,7,31,39,21,25,37,1,43,53,0,43,53,0,0,0,0,1,0,168,254, +104,5,24,5,129,0,11,0,94,64,64,11,92,0,0,2,9,90,127,6,1,0,6,48,6,64,6,3,143, +6,159,6,207,6,3,0,6,64,6,2,6,5,90,0,2,16,2,64,2,3,7,2,16,13,1,32,13,128,13, +224,13,3,15,13,1,7,7,3,3,10,5,95,2,18,0,0,47,63,237,51,63,51,47,1,93,93,113, +47,94,93,237,47,93,93,113,113,237,18,57,47,237,49,48,1,17,33,17,51,17,33, +17,51,17,33,17,2,134,254,34,191,2,247,186,254,34,254,104,1,152,5,129,251, +31,4,225,250,127,254,104,255,255,0,4,0,0,5,82,5,129,18,6,0,36,0,0,0,2,0,168, +0,0,4,214,5,129,0,16,0,25,0,142,64,70,116,25,132,25,148,25,3,123,18,139,18, +155,18,3,153,14,1,38,14,1,9,9,0,90,223,17,1,80,17,128,17,2,31,17,1,255,17, +1,192,17,1,159,17,1,0,17,16,17,32,17,64,17,4,17,11,22,90,0,6,16,6,64,6,3, +7,6,48,27,1,27,184,255,192,64,27,30,35,72,223,27,1,21,95,64,11,1,160,11,208, +11,2,11,11,6,10,95,7,3,22,95,6,18,0,63,237,63,237,18,57,47,93,113,237,1,93, +43,113,47,94,93,237,50,47,93,93,93,93,113,113,113,237,50,47,49,48,0,93,93, +93,93,1,20,14,2,35,33,17,33,21,33,17,33,50,30,2,7,52,38,35,33,17,33,50,54, +4,214,61,121,182,121,253,183,3,158,253,33,1,126,125,186,124,62,192,164,164, +254,153,1,111,164,156,1,157,87,150,112,64,5,129,156,254,72,58,105,147,92, +121,129,254,2,136,0,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,255,255, +0,168,0,1,4,47,5,130,16,6,1,93,0,0,0,2,0,15,254,104,5,69,5,129,0,16,0,25, +0,194,64,95,150,10,1,150,20,1,150,15,1,144,19,1,134,19,1,115,22,131,22,2, +3,147,24,1,2,128,24,1,114,24,1,102,24,1,85,11,101,11,2,90,14,106,14,2,97, +23,145,23,2,83,23,1,53,23,69,23,2,2,92,3,3,0,90,191,17,207,17,2,160,17,1, +31,17,95,17,127,17,143,17,159,17,5,0,17,1,8,17,20,25,36,25,52,25,3,25,184, +255,248,64,11,22,25,72,20,19,36,19,52,19,3,19,184,255,248,64,28,22,25,72, +9,15,19,25,4,6,92,7,15,27,47,27,2,19,95,15,3,8,0,25,95,5,18,7,2,0,47,51,63, +237,50,50,63,237,1,93,47,237,23,51,43,113,43,113,47,94,93,93,93,93,237,50, +47,237,49,48,93,93,93,93,93,93,93,93,95,93,95,93,93,93,93,93,93,37,51,17, +35,17,33,17,35,17,51,62,3,55,19,33,3,17,33,3,14,3,7,4,150,175,180,252,50, +180,144,41,66,55,44,18,67,2,212,186,254,137,49,18,40,46,54,32,160,253,200, +1,152,254,104,2,56,51,138,181,228,141,1,254,251,31,4,65,254,144,134,221,178, +137,51,255,255,0,168,0,0,4,254,5,129,18,6,0,40,0,0,0,1,0,28,0,0,7,71,5,129, +0,41,1,72,64,41,133,8,1,117,31,133,31,2,117,14,1,99,24,1,108,25,124,25,140, +25,3,108,26,124,26,140,26,3,101,13,117,13,133,13,3,33,40,14,17,72,6,184,255, +216,64,35,14,17,72,58,24,74,24,2,41,24,1,53,15,69,15,117,15,3,3,39,15,1,27, +48,14,17,72,40,27,56,27,72,27,3,12,184,255,208,64,11,14,17,72,39,12,55,12, +71,12,3,31,184,255,224,179,14,17,72,31,184,255,240,64,73,10,13,72,8,32,14, +17,72,8,16,10,13,72,34,31,27,31,28,28,32,21,40,90,41,5,8,12,8,41,11,11,7, +18,52,41,1,116,41,196,41,228,41,3,41,33,32,16,32,64,29,32,72,228,32,1,155, +32,171,32,2,68,32,116,32,2,11,32,43,32,2,32,6,7,184,255,240,64,51,171,7,187, +7,2,7,68,43,116,43,132,43,228,43,4,47,43,1,2,15,43,1,31,8,34,5,8,5,39,0,96, +21,127,18,175,18,2,47,18,1,18,18,6,27,19,11,3,41,33,6,18,0,63,51,51,63,51, +51,18,57,47,93,113,51,237,50,57,57,17,51,17,51,1,93,95,93,93,47,93,56,51, +47,93,93,93,93,43,56,51,47,93,113,51,18,57,47,18,57,51,17,51,16,237,50,17, +57,47,57,51,17,51,49,48,43,43,43,43,93,43,93,43,93,95,93,93,93,43,43,93,93, +93,0,93,1,93,0,93,93,1,34,46,2,39,1,35,1,38,39,1,51,19,30,3,51,17,51,17,50, +62,2,55,19,51,1,6,7,1,35,1,14,3,35,17,35,3,82,17,45,48,46,17,254,85,222,1, +253,48,131,254,229,200,205,66,90,76,81,57,191,57,81,76,90,66,205,200,254, +229,131,48,1,253,222,254,85,17,46,48,45,17,191,2,133,6,11,13,8,253,85,3,7, +35,189,1,154,254,207,99,123,68,24,2,107,253,149,24,68,123,99,1,49,254,102, +189,35,252,249,2,171,8,13,11,6,253,123,0,1,0,67,255,236,4,112,5,149,0,60, +1,7,64,51,138,33,1,134,7,1,124,28,140,28,2,3,112,21,1,112,20,1,2,96,20,1, +101,8,117,8,133,8,3,132,34,1,101,34,117,34,2,124,13,1,90,13,106,13,2,59,23, +75,23,2,33,184,255,232,64,122,11,16,72,5,43,1,3,51,20,25,90,46,64,25,37,72, +46,46,56,90,16,139,36,155,36,171,36,3,127,20,1,2,95,20,111,20,2,36,20,36, +20,5,112,16,1,79,16,111,16,2,255,16,1,160,16,1,127,16,1,0,16,16,16,48,16, +3,16,175,5,191,5,2,5,64,32,45,72,5,64,13,16,72,5,51,20,95,127,21,175,21,2, +21,21,11,41,35,64,13,16,72,35,35,30,95,41,4,11,95,0,32,6,48,6,112,6,128,6, +4,208,6,1,6,184,255,192,182,13,17,72,6,6,0,19,0,63,50,47,43,93,113,16,237, +63,237,51,47,43,17,18,57,47,113,237,57,1,47,43,43,93,47,93,93,93,93,113,113, +18,57,57,47,47,93,95,93,113,16,237,50,47,43,237,18,57,49,48,0,95,93,1,43, +93,93,93,93,93,93,93,95,93,93,95,93,93,0,93,5,34,46,2,39,55,30,3,51,50,62, +2,53,52,38,43,1,53,51,50,54,53,52,46,2,35,34,14,2,7,39,62,3,51,50,30,2,21, +20,14,2,7,30,3,21,20,14,2,2,109,118,176,130,94,36,165,24,66,91,121,80,77, +122,85,45,192,202,71,71,181,173,39,72,104,65,77,114,83,56,19,178,33,96,132, +168,105,108,172,120,64,40,73,104,63,67,117,87,51,69,132,192,20,50,91,128, +79,77,55,98,75,44,37,69,100,64,133,118,148,119,123,55,86,59,30,40,68,90,49, +61,82,127,87,45,53,96,136,83,68,107,80,55,15,10,50,82,115,73,95,156,113,62, +0,1,0,168,0,0,5,24,5,129,0,19,0,123,64,17,172,18,1,138,18,154,18,2,147,8, +163,8,2,133,8,1,19,184,255,232,64,65,9,17,72,9,24,9,17,72,11,92,41,9,1,9, +64,12,80,12,144,12,3,224,12,1,143,12,159,12,175,12,3,0,12,48,12,2,12,166, +19,1,19,2,92,0,1,16,1,2,7,1,15,21,47,21,2,9,18,9,1,3,12,12,8,0,18,0,63,50, +50,47,63,51,51,47,1,93,47,94,93,237,50,113,47,93,93,93,113,51,113,237,49, +48,43,43,0,93,93,93,93,51,17,51,17,20,6,7,6,7,1,51,17,35,17,52,54,55,54,55, +1,168,172,2,2,2,2,2,238,222,170,1,2,1,2,253,26,5,129,252,100,51,98,39,46, +40,4,174,250,127,3,168,39,89,38,44,44,251,90,0,255,255,0,168,0,0,5,24,7,58, +18,38,1,174,0,0,17,7,2,145,1,146,1,74,0,19,64,11,1,20,5,38,1,6,25,33,0,10, +37,1,43,53,0,43,53,0,0,0,0,1,0,168,0,0,4,157,5,129,0,22,0,151,64,104,84,12, +116,12,132,12,3,84,15,1,139,8,1,122,8,1,89,8,105,8,2,140,14,1,14,24,13,16, +72,58,5,1,100,12,116,12,132,12,3,80,12,1,53,12,69,12,2,15,12,8,12,9,16,32, +9,96,9,128,9,3,9,9,13,2,21,90,32,22,1,22,14,13,16,15,13,127,13,207,13,239, +13,4,47,13,1,13,47,24,1,15,12,20,96,47,2,1,2,2,22,13,18,8,0,3,0,63,50,63, +51,57,47,93,237,50,57,1,93,47,93,113,56,51,47,93,237,50,17,57,47,93,56,57, +51,17,51,49,48,93,93,93,93,43,93,93,93,93,93,0,93,19,51,17,50,62,2,55,19, +51,1,6,7,1,35,1,14,3,35,17,35,168,191,57,81,76,90,66,205,200,254,229,131, +48,1,253,222,254,85,17,46,48,45,17,191,5,129,253,149,24,68,123,99,1,49,254, +102,189,35,252,249,2,171,8,13,11,6,253,123,0,0,0,0,1,0,18,255,240,4,153,5, +129,0,27,0,176,64,35,150,1,1,147,3,1,117,3,133,3,2,85,4,149,4,2,145,7,1,115, +7,131,7,2,85,7,101,7,2,129,6,145,6,2,6,184,255,216,64,46,12,15,72,37,6,53, +6,2,26,2,1,26,23,106,23,122,23,138,23,4,26,90,32,27,64,27,2,224,27,1,95,27, +1,0,27,1,8,27,20,6,36,6,52,6,3,6,184,255,248,64,14,22,25,72,73,1,1,20,1,36, +1,52,1,3,1,184,255,248,64,26,22,25,72,9,24,73,24,2,1,6,24,3,12,128,29,1,27, +18,1,95,24,3,16,95,9,19,0,63,237,63,237,63,1,93,47,23,51,113,43,113,113,43, +113,47,94,93,93,93,113,237,49,48,93,93,93,43,93,93,93,93,93,93,93,93,1,33, +3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,35,3,223,254,94,49, +22,43,49,60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,2,255,186, +4,225,254,144,172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161, +1,254,250,127,255,255,0,168,0,0,6,2,5,129,18,6,0,48,0,0,255,255,0,168,0,0, +5,32,5,129,18,6,0,43,0,0,255,255,0,97,255,236,5,215,5,150,18,6,0,50,0,0,255, +255,0,166,0,0,5,30,5,129,17,6,1,106,254,0,0,88,185,0,9,255,192,179,27,27, +72,9,184,255,192,179,21,21,72,9,184,255,192,179,20,20,72,9,184,255,192,179, +19,19,72,9,184,255,192,179,17,17,72,9,184,255,192,179,16,16,72,9,184,255, +192,179,15,15,72,9,184,255,192,179,14,14,72,9,184,255,192,183,11,11,72,9, +64,9,9,72,43,43,43,43,43,43,43,43,43,43,0,0,255,255,0,168,0,0,4,234,5,129, +18,6,0,51,0,0,255,255,0,104,255,236,5,121,5,150,18,6,0,38,0,0,255,255,0,46, +0,0,4,180,5,129,18,6,0,55,0,0,0,1,0,55,255,236,5,31,5,129,0,25,0,181,64,111, +217,24,1,139,24,1,90,24,106,24,122,24,3,41,24,1,85,23,101,23,133,23,3,70, +23,1,214,22,1,131,22,1,100,22,116,22,2,86,22,1,121,18,1,128,2,1,5,2,21,2, +2,132,1,1,131,0,1,84,0,100,0,2,70,0,1,198,23,214,23,2,113,23,129,23,2,86, +23,102,23,2,143,3,1,58,3,74,3,2,20,23,24,32,25,144,25,2,25,16,25,22,10,63, +21,79,21,111,21,127,21,4,21,184,255,240,64,14,21,23,20,21,5,24,24,21,3,11, +14,95,5,19,0,63,237,50,63,51,47,17,18,57,57,1,47,56,93,50,50,47,56,93,51, +57,57,49,48,0,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,93, +93,93,93,1,14,3,35,34,46,2,39,55,30,1,51,50,62,2,63,1,1,51,9,1,51,2,222,47, +81,90,109,75,32,66,64,58,23,81,35,83,48,37,58,53,57,38,49,253,195,218,1,193, +1,128,205,1,62,88,128,82,40,10,18,26,16,144,22,37,21,52,90,68,89,3,186,252, +240,3,16,0,0,3,0,118,255,245,5,159,5,139,0,29,0,40,0,51,0,143,64,92,70,28, +86,28,102,28,3,73,17,89,17,105,17,3,59,51,1,59,31,1,53,43,1,38,43,1,53,39, +1,38,39,1,41,90,15,8,30,90,0,35,24,7,90,46,21,224,8,1,79,8,1,32,8,1,8,32, +53,1,112,53,208,53,224,53,3,79,53,1,16,53,1,36,47,96,10,6,10,34,49,96,20, +24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57,47,47,17,51,16,237,50,17,51, +16,237,50,1,93,93,93,113,47,93,93,93,51,51,253,50,50,220,237,16,220,237,49, +48,0,93,93,93,93,93,93,1,93,93,1,20,14,2,43,1,21,35,53,35,34,46,2,53,52,62, +2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17,51,50,62,2,37,20,30,2,59,1,17, +35,34,6,5,159,64,131,197,133,40,191,40,133,197,131,64,67,133,201,135,29,191, +28,135,202,133,67,192,185,183,5,13,92,136,89,43,252,87,43,89,136,92,13,9, +182,182,2,224,105,188,143,84,227,227,84,143,188,105,113,185,131,72,182,182, +72,131,185,117,187,180,253,22,53,98,140,88,88,140,98,53,2,234,180,0,255,255, +0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,168,254,104,5,197,5,129,0,11,0,74, +64,47,1,92,2,2,11,90,0,8,1,175,8,1,0,8,64,8,112,8,3,8,7,90,0,4,16,4,64,4, +3,7,4,32,13,224,13,2,9,9,5,3,11,11,7,95,4,18,2,0,47,63,237,50,47,63,51,47, +1,93,47,94,93,237,47,93,93,113,237,50,47,237,49,48,37,17,35,17,33,17,51,17, +33,17,51,17,5,197,180,251,151,191,2,245,186,160,253,200,1,152,5,129,251,31, +4,225,251,31,0,0,0,1,0,160,0,0,4,174,5,129,0,25,0,134,64,70,164,14,1,20,40, +13,17,72,1,32,13,17,72,42,7,58,7,74,7,3,23,90,25,144,22,1,143,22,1,48,22, +64,22,2,207,22,1,112,22,1,111,22,1,16,22,64,22,2,22,12,90,207,11,1,0,11,16, +11,64,11,3,7,11,32,27,1,32,27,1,27,184,255,192,64,19,14,17,72,0,5,95,21,47, +16,1,16,16,11,24,18,22,22,11,3,0,63,51,47,63,18,57,47,93,51,237,50,1,43,93, +113,47,94,93,93,237,47,93,93,93,93,113,113,113,51,237,49,48,0,93,43,43,93, +1,14,3,35,34,46,2,53,17,51,17,20,22,51,50,62,2,55,17,51,17,35,3,240,36,94, +107,115,56,114,166,108,52,190,130,134,53,110,104,92,35,190,190,1,252,8,20, +18,12,47,92,137,89,2,82,253,194,123,108,10,15,17,7,2,244,250,127,0,0,1,0, +168,0,0,6,173,5,129,0,11,0,114,64,76,7,90,4,4,0,11,90,36,8,1,11,8,1,228,8, +1,219,8,1,148,8,1,123,8,1,4,8,20,8,100,8,3,8,3,90,4,0,68,0,228,0,3,7,0,235, +13,1,196,13,1,187,13,1,132,13,1,112,13,1,2,64,13,1,15,13,1,9,5,1,3,7,7,3, +95,0,18,0,63,237,50,47,63,51,51,1,93,93,95,93,93,93,93,93,47,94,93,237,47, +93,93,93,93,93,113,113,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33, +17,51,17,168,191,1,233,186,1,233,186,5,129,251,31,4,225,251,31,4,225,250, +127,0,1,0,168,254,104,7,47,5,129,0,15,0,125,64,84,132,17,148,17,180,17,3, +123,17,1,84,17,1,1,92,2,2,15,90,12,11,90,8,8,4,11,12,59,12,75,12,91,12,123, +12,139,12,155,12,203,12,8,219,12,251,12,2,207,12,1,2,159,12,1,128,12,1,111, +12,1,0,12,1,8,12,7,90,32,4,1,4,13,9,5,3,15,15,11,11,7,95,4,18,2,0,47,63,237, +50,47,50,47,63,51,51,1,47,93,237,47,94,93,93,93,93,95,93,93,113,18,57,47, +237,16,237,50,47,237,93,93,93,49,48,37,17,35,17,33,17,51,17,33,17,51,17,33, +17,51,17,7,47,180,250,45,191,1,211,186,1,210,186,160,253,200,1,152,5,129, +251,31,4,225,251,31,4,225,251,31,0,2,0,46,0,0,5,235,5,129,0,16,0,25,0,100, +64,68,116,25,132,25,148,25,3,123,18,139,18,155,18,3,153,3,1,38,3,1,64,27, +1,6,90,47,17,127,17,2,176,17,1,159,17,1,0,17,16,17,32,17,64,17,4,7,17,14, +0,22,90,32,12,1,12,21,95,0,0,12,14,95,15,3,22,95,12,18,0,63,237,63,237,18, +57,47,237,1,47,93,253,50,204,47,94,93,93,93,113,237,93,49,48,0,93,93,93,93, +1,33,50,30,2,21,20,14,2,35,33,17,33,53,33,1,52,38,35,33,17,33,50,54,2,184, +1,66,125,186,124,62,61,121,182,121,253,243,254,53,2,138,2,115,164,164,254, +213,1,51,164,156,3,45,58,105,147,90,87,150,112,64,4,229,156,252,26,121,129, +254,2,136,0,3,0,168,0,0,6,109,5,129,0,14,0,23,0,27,0,140,64,76,116,23,132, +23,148,23,3,123,16,139,16,155,16,3,153,12,1,38,12,1,27,90,159,24,207,24,223, +24,3,16,24,64,24,80,24,112,24,4,24,0,90,0,15,1,224,15,1,159,15,1,0,15,16, +15,32,15,64,15,4,15,9,20,90,0,6,16,6,64,6,3,7,6,128,29,1,29,184,255,192,64, +19,11,14,72,19,95,9,9,6,7,25,25,7,3,24,24,20,95,6,18,0,63,237,51,47,63,51, +47,17,18,57,47,237,1,43,93,47,94,93,237,50,47,93,93,93,113,237,47,93,93,237, +49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50,30,2,7,52,38,35,33,17, +33,50,54,1,17,51,17,4,214,61,121,182,121,253,183,191,1,126,125,186,124,62, +192,164,164,254,153,1,111,164,156,1,152,191,1,157,87,150,112,64,5,129,253, +172,58,105,147,92,121,129,254,2,136,254,225,5,129,250,127,0,2,0,168,0,0,4, +214,5,129,0,14,0,23,0,107,64,76,116,23,132,23,148,23,3,123,16,139,16,155, +16,3,153,12,1,38,12,1,0,90,31,15,1,160,15,176,15,2,159,15,1,0,15,16,15,32, +15,64,15,96,15,5,15,9,20,90,0,6,16,6,2,7,6,175,25,1,64,25,128,25,144,25,3, +19,95,9,9,6,7,3,20,95,6,18,0,63,237,63,18,57,47,237,1,93,93,47,94,93,237, +50,47,93,93,93,113,237,49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50, +30,2,7,52,38,35,33,17,33,50,54,4,214,61,121,182,121,253,183,191,1,126,125, +186,124,62,192,164,164,254,153,1,111,165,155,1,157,87,150,112,64,5,129,253, +172,58,105,147,96,121,131,254,4,131,0,1,0,105,255,236,5,121,5,150,0,42,0, +206,64,81,115,26,131,26,2,115,28,131,28,2,101,28,1,115,4,131,4,2,101,4,1, +115,2,131,2,2,101,2,1,101,12,1,101,11,1,135,17,1,106,17,1,90,33,138,33,2, +10,32,26,32,90,32,3,10,40,26,40,2,36,36,24,38,14,91,32,35,112,35,2,144,35, +176,35,2,127,35,1,64,35,1,35,184,255,192,64,63,7,10,72,35,6,80,24,96,24,2, +175,24,191,24,2,32,24,1,24,35,95,127,38,175,38,2,38,38,9,30,95,19,16,25,32, +25,2,48,25,64,25,112,25,128,25,192,25,208,25,6,25,25,19,19,79,5,1,5,5,0,95, +9,4,0,63,237,51,47,93,63,51,47,93,113,16,237,17,57,47,113,237,1,47,93,93, +113,51,47,43,93,93,93,113,237,51,18,57,47,49,48,0,93,1,93,93,0,93,93,93,1, +93,93,93,93,93,93,93,93,1,34,14,2,7,39,54,36,51,50,4,22,18,21,20,2,6,4,35, +34,46,2,39,55,30,3,51,50,62,2,55,33,53,33,46,3,2,201,88,137,102,69,19,181, +71,1,46,225,164,1,0,175,91,86,172,254,255,171,118,189,149,113,41,156,27,81, +109,140,87,109,176,128,77,9,253,114,2,142,10,73,124,173,4,250,42,70,91,50, +60,173,176,101,187,254,246,165,159,254,244,195,109,54,99,136,83,78,55,105, +83,50,72,132,185,112,154,110,178,126,68,0,0,2,0,168,255,236,7,179,5,150,0, +26,0,46,0,168,64,63,165,7,1,133,24,1,138,20,1,121,29,1,118,35,1,118,39,1, +74,19,138,19,2,58,30,122,30,2,53,34,117,34,2,42,44,58,44,122,44,3,37,40,53, +40,117,40,3,160,48,1,0,91,144,27,160,27,2,160,27,176,27,2,27,184,255,192, +64,54,7,11,72,27,16,12,90,0,13,16,13,64,13,3,7,13,37,91,17,48,10,112,10,2, +10,32,95,22,4,11,95,80,16,1,176,16,224,16,2,15,16,1,8,16,16,13,14,3,13,18, +42,95,5,19,0,63,237,63,63,18,57,47,94,93,93,113,237,63,237,1,47,93,51,237, +47,94,93,237,50,47,43,93,113,237,93,49,48,93,93,93,93,93,93,93,93,93,93,93, +1,20,2,14,1,35,34,46,2,39,33,17,35,17,51,17,33,62,3,51,50,30,1,18,7,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,7,179,90,170,245,155,156,239,165,90,7, +254,217,191,191,1,42,13,99,166,232,146,159,245,167,87,195,60,117,173,113, +116,175,117,58,60,117,173,114,121,176,114,54,2,199,165,254,242,192,104,99, +179,247,148,253,115,5,129,253,172,142,229,160,86,102,188,254,246,163,127, +208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,2,0,96,0,0,5,32,5,129, +0,17,0,30,0,239,64,22,156,29,172,29,2,138,29,1,147,20,1,117,20,133,20,2,67, +17,83,17,2,17,184,255,216,64,25,33,36,72,130,17,146,17,162,17,3,100,17,116, +17,2,86,17,1,67,16,83,16,2,3,16,184,255,216,64,117,33,36,72,172,16,1,155, +16,1,125,16,141,16,2,2,94,16,110,16,2,73,16,1,44,16,60,16,2,3,175,1,1,2,1, +104,14,16,72,94,1,110,1,2,73,1,1,44,1,60,1,2,16,1,1,6,24,24,14,18,90,6,6, +0,13,90,224,14,1,143,14,159,14,175,14,207,14,4,0,14,64,14,2,7,14,17,32,0, +1,15,0,31,0,2,0,1,15,95,47,24,95,24,111,24,143,24,4,24,24,0,26,95,11,3,14, +14,0,18,0,63,50,47,63,237,18,57,47,93,237,50,1,47,93,93,51,47,94,93,93,93, +237,18,57,47,237,17,51,17,18,57,17,51,49,48,93,93,93,43,95,93,95,93,93,93, +95,93,93,93,43,95,113,93,93,93,43,113,0,93,93,93,93,51,1,46,3,53,52,62,2, +51,33,17,35,17,33,1,19,20,30,2,51,33,17,33,34,14,2,96,1,144,91,130,84,39, +66,126,185,120,2,151,191,254,73,254,146,28,37,77,119,83,1,205,254,59,76,120, +84,44,2,95,16,78,108,130,67,94,150,104,55,250,127,2,73,253,183,3,236,57,98, +72,41,2,8,31,63,94,255,255,0,87,255,236,4,115,4,78,18,6,0,68,0,0,0,2,0,120, +255,236,4,63,5,222,0,19,0,56,0,158,64,69,137,44,1,122,45,138,45,2,102,21, +118,21,134,21,3,84,18,1,84,12,1,91,2,1,90,35,122,35,138,35,3,90,47,106,47, +138,47,3,123,46,139,46,2,73,46,105,46,2,42,42,23,71,64,208,0,1,144,0,1,0, +58,128,48,58,1,128,58,1,58,184,255,192,64,12,30,35,72,52,10,71,0,31,32,31, +2,31,184,255,192,64,23,26,35,72,31,52,5,80,20,20,42,48,41,1,64,41,240,41, +2,41,15,80,26,22,0,63,237,47,93,113,51,57,47,237,50,1,47,43,93,237,57,43, +93,113,26,16,220,93,113,26,237,50,47,49,48,0,93,93,93,93,93,93,93,93,93,93, +1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,3,50,18,17,16,2,35,34,46,2,53, +52,18,62,1,55,62,3,55,21,14,1,7,14,5,7,62,3,3,130,39,73,104,65,69,114,81, +44,44,77,105,62,69,112,78,42,243,222,210,250,238,113,178,123,65,58,128,206, +147,57,100,91,86,43,86,161,91,78,124,94,67,44,23,2,19,67,97,126,1,246,114, +151,91,37,39,92,150,112,114,150,89,36,36,88,151,2,127,254,251,254,250,254, +247,254,253,70,156,250,180,192,1,22,193,115,28,11,17,14,12,6,161,11,23,17, +14,33,50,73,108,149,101,55,97,72,41,0,0,0,0,3,0,142,0,0,3,231,4,58,0,23,0, +36,0,47,0,149,64,12,42,19,1,37,2,1,26,18,42,18,2,3,184,255,232,64,33,9,12, +72,139,10,155,10,2,10,38,44,71,5,5,24,16,71,64,47,30,159,30,2,160,30,1,30, +49,128,64,49,1,49,184,255,192,64,50,30,35,72,31,49,63,49,239,49,3,38,24,70, +192,22,1,0,22,16,22,48,22,224,22,240,22,5,8,22,10,36,81,143,38,159,38,175, +38,3,38,38,24,37,80,23,15,24,80,22,21,0,63,237,63,237,18,57,47,113,237,57, +1,47,94,93,113,237,50,93,43,113,26,16,220,93,113,26,237,17,57,47,237,18,57, +93,49,48,0,43,93,93,93,1,50,30,2,21,20,14,2,7,21,30,3,21,20,14,2,35,33,17, +19,51,50,62,2,53,52,46,2,43,1,25,1,51,50,62,2,53,52,38,35,2,52,76,144,112, +68,35,60,82,46,54,95,69,40,61,109,151,91,254,67,180,236,69,95,59,27,28,63, +100,71,224,216,68,91,55,23,102,121,4,58,24,62,104,81,53,81,58,37,9,7,7,35, +61,90,61,78,117,78,39,4,58,252,75,20,44,67,47,50,70,44,20,1,194,254,192,19, +39,61,43,82,76,0,1,0,142,0,0,2,175,4,58,0,5,0,54,64,35,0,64,18,39,72,48,0, +1,0,0,7,3,70,192,4,1,0,4,16,4,48,4,224,4,240,4,5,8,4,2,80,5,15,3,21,0,63, +63,237,1,47,94,93,113,237,17,51,47,93,43,49,48,1,21,33,17,35,17,2,175,254, +147,180,4,58,131,252,73,4,58,0,0,0,2,0,20,254,104,4,136,4,58,0,7,0,23,0,159, +64,65,134,3,1,32,3,1,102,1,1,34,5,114,5,130,5,3,34,20,1,34,17,1,137,18,1, +34,18,1,25,19,121,19,2,102,2,118,2,2,34,2,1,25,2,1,34,16,1,4,16,1,98,4,1, +4,4,36,4,68,4,84,4,4,8,73,9,184,255,192,64,42,18,25,72,9,9,22,70,64,111,7, +127,7,143,7,3,32,7,64,7,2,7,25,128,20,15,12,73,6,1,13,1,80,20,15,22,6,14, +80,11,21,13,8,0,47,51,63,237,50,50,63,237,1,47,51,51,237,51,51,26,16,220, +93,93,26,237,50,47,43,237,49,48,93,93,93,93,93,93,93,93,93,93,93,93,93,93, +93,93,1,33,6,2,14,1,7,33,1,35,17,33,17,35,17,51,62,2,18,55,33,17,51,3,66, +254,206,24,49,48,48,22,1,241,1,70,163,252,210,163,119,30,58,58,57,28,2,132, +146,3,183,177,254,249,194,136,50,253,229,1,152,254,104,2,27,50,143,220,1, +59,223,252,73,255,255,0,87,255,236,4,24,4,78,18,6,0,72,0,0,0,1,0,7,0,0,5, +83,4,58,0,39,1,97,64,88,165,23,1,165,14,1,171,34,1,164,3,1,172,24,1,154,24, +1,163,13,1,149,13,1,90,6,106,6,122,6,3,85,31,101,31,117,31,3,74,33,154,33, +170,33,3,69,4,149,4,165,4,3,42,28,58,28,2,37,9,53,9,2,34,31,170,26,1,26,31, +27,16,27,27,32,20,38,70,39,165,11,1,11,10,3,6,6,39,10,184,255,240,64,49,10, +10,17,39,39,5,33,32,16,15,32,1,255,32,1,160,32,1,159,32,1,80,32,1,63,32,1, +32,32,1,207,32,1,128,32,144,32,2,95,32,1,32,32,48,32,2,32,4,5,184,255,240, +64,64,31,5,47,5,2,127,5,159,5,2,63,5,159,5,223,5,255,5,4,5,15,41,1,255,41, +1,160,41,1,111,41,159,41,2,80,41,1,63,41,1,32,41,1,207,41,1,128,41,144,41, +2,79,41,95,41,2,48,41,1,31,6,34,3,6,184,255,240,64,37,11,17,72,6,3,37,0,80, +20,15,17,31,17,79,17,95,17,4,15,17,31,17,79,17,3,7,17,17,4,26,18,10,15,39, +33,4,21,0,63,51,51,63,51,51,18,57,47,94,93,113,51,237,50,57,57,43,17,51,17, +51,1,93,93,93,93,113,113,113,113,113,113,114,47,93,113,114,56,51,47,93,93, +93,93,113,113,113,113,113,113,114,56,51,18,57,47,51,57,47,56,18,57,17,51, +17,51,93,16,237,50,17,57,47,56,57,51,93,17,51,49,48,93,93,93,93,93,93,93, +93,93,93,93,93,0,93,93,1,34,38,39,1,35,1,46,1,39,3,51,23,30,3,51,17,51,17, +50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,2,83,26,65,19,254,234,200,1, +97,17,66,45,216,188,148,48,65,52,48,30,180,30,48,52,65,48,148,188,216,45, +66,17,1,97,200,254,234,19,65,26,180,1,221,12,8,254,15,2,80,14,85,66,1,69, +239,77,92,50,16,1,218,254,38,16,50,92,77,239,254,187,66,85,14,253,176,1,241, +8,12,254,35,0,0,0,1,0,49,255,236,3,94,4,78,0,55,0,175,64,28,5,53,21,53,2, +5,38,21,38,37,38,3,131,45,1,45,15,21,70,40,40,51,71,10,29,73,64,30,184,255, +192,64,86,30,36,72,143,15,1,30,15,30,15,3,144,10,1,144,10,160,10,2,31,10, +1,10,57,128,16,57,1,4,73,3,64,12,20,72,3,45,15,80,143,16,159,16,175,16,3, +16,16,35,7,0,29,1,144,29,224,29,240,29,3,29,29,24,80,35,16,7,80,0,96,4,112, +4,128,4,3,239,4,1,32,4,1,4,4,0,22,0,63,50,47,93,93,113,16,237,63,237,51,47, +93,113,17,18,57,47,113,237,57,1,47,43,237,93,26,16,204,93,93,113,17,57,57, +47,47,93,43,26,237,16,237,50,47,237,18,57,113,49,48,93,93,5,34,38,39,55,30, +1,51,50,54,53,52,46,2,35,53,50,62,2,53,52,38,35,34,14,2,7,39,62,3,51,50,30, +2,21,20,14,2,7,21,30,3,21,20,14,2,1,202,167,197,45,159,25,126,103,96,113, +55,92,120,64,64,114,86,49,99,93,35,70,60,42,7,162,12,62,97,128,78,85,138, +98,53,44,71,88,45,56,100,75,43,49,101,152,20,125,129,44,78,86,94,91,59,78, +45,18,137,15,38,67,52,74,86,14,33,55,42,20,68,98,63,29,42,76,104,63,57,88, +61,36,4,2,6,41,67,93,58,69,119,87,49,0,0,0,0,1,0,142,0,0,3,234,4,58,0,19, +0,186,64,25,9,17,1,233,17,249,17,2,4,15,1,228,15,244,15,2,11,5,1,235,5,251, +5,2,16,184,255,192,64,107,29,60,72,153,16,1,6,64,29,60,72,119,6,151,6,2,6, +7,1,230,7,246,7,2,156,7,1,105,7,137,7,2,31,17,47,17,79,17,3,9,72,64,7,64, +10,1,80,10,1,159,10,255,10,2,10,21,128,0,21,192,21,208,21,224,21,4,192,21, +1,128,21,144,21,176,21,192,21,208,21,5,17,1,72,192,18,1,0,18,16,18,48,18, +224,18,240,18,5,8,18,16,7,19,15,10,6,18,21,0,63,51,51,63,51,51,1,47,94,93, +113,237,50,93,113,114,26,16,220,93,113,114,50,26,237,49,48,0,93,1,93,93,113, +114,0,93,43,93,43,113,114,113,114,1,113,114,1,17,20,14,2,7,1,51,17,35,17, +52,62,2,55,1,35,17,1,60,3,3,3,1,1,243,197,172,2,3,3,2,254,6,192,4,58,253, +176,23,77,82,74,21,3,101,251,198,2,148,19,57,60,57,20,252,151,4,58,0,255, +255,0,142,0,0,3,234,5,240,18,38,1,206,0,0,17,7,2,145,0,234,0,0,0,19,64,11, +1,20,17,38,1,2,25,33,18,8,37,1,43,53,0,43,53,0,0,0,0,1,0,138,0,0,3,138,4, +58,0,21,0,202,64,17,117,16,133,16,149,16,3,57,15,121,15,137,15,153,15,4,13, +184,255,208,64,123,12,17,72,133,11,149,11,2,120,5,1,133,13,149,13,2,47,23, +79,23,2,73,16,1,56,16,1,16,13,121,8,137,8,153,8,3,8,71,13,1,54,13,1,13,9, +16,9,9,14,2,20,70,0,21,16,21,48,21,240,21,4,21,57,15,73,15,2,15,32,14,1,32, +14,144,14,2,144,14,1,79,14,1,48,14,1,47,14,1,16,14,1,14,16,14,13,19,80,15, +2,63,2,79,2,3,15,2,63,2,255,2,3,8,2,2,14,21,21,14,21,8,8,0,15,0,63,50,47, +63,51,47,17,57,47,94,93,113,237,50,1,47,56,93,93,93,93,93,113,114,51,113, +47,93,237,50,17,57,47,56,57,113,113,51,93,17,51,113,113,93,49,48,0,93,1,93, +93,43,93,93,19,51,17,50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,138,180, +30,48,52,65,48,148,188,216,45,66,17,1,97,200,254,234,19,65,26,180,4,58,254, +38,16,50,92,77,239,254,187,66,85,14,253,176,1,241,8,12,254,35,0,0,0,0,1,0, +11,255,236,4,29,4,58,0,25,0,186,64,42,26,21,1,130,7,1,116,7,1,85,7,101,7, +2,130,6,1,117,6,1,22,6,38,6,102,6,3,114,5,130,5,2,100,5,1,86,5,1,134,4,1, +4,184,255,240,64,61,12,15,72,26,3,1,116,2,1,7,24,12,17,72,25,70,64,127,0, +143,0,239,0,3,0,27,128,176,27,192,27,208,27,3,176,27,240,27,2,64,27,96,27, +112,27,160,27,176,27,192,27,6,131,23,1,23,54,6,1,6,2,184,255,240,64,26,24, +28,72,215,2,231,2,2,128,2,1,2,143,12,1,12,2,80,23,15,16,80,9,22,0,21,0,63, +63,237,63,237,1,47,93,51,93,93,43,51,113,51,93,93,113,114,26,16,220,93,26, +237,49,48,0,43,1,93,93,43,93,93,93,93,93,93,93,93,93,93,93,33,17,33,6,2,14, +3,35,34,38,39,53,30,1,51,50,62,3,18,55,33,17,3,104,254,137,25,42,44,51,71, +94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2,206,3,183,184,254,225,216, +149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,251,198,0,0,1,0,142,0,0,4,243, +4,58,0,28,1,3,64,21,137,18,153,18,2,134,12,150,12,2,107,17,123,17,2,100,13, +116,13,2,1,184,255,224,64,122,29,60,72,138,1,154,1,2,57,1,1,0,32,29,60,72, +133,0,149,0,2,54,0,86,0,2,143,19,159,19,2,93,19,109,19,125,19,3,59,19,75, +19,2,25,19,41,19,2,128,11,144,11,2,82,11,98,11,114,11,3,52,11,68,11,2,22, +11,38,11,2,1,0,15,15,8,21,72,64,19,80,22,1,159,22,255,22,2,22,30,128,144, +30,192,30,208,30,3,79,30,1,11,8,72,192,9,1,0,9,16,9,48,9,224,9,240,9,5,8, +9,28,2,2,184,255,192,64,22,29,60,72,2,32,19,22,72,84,2,1,19,2,10,15,22,15, +64,29,60,72,15,184,255,224,64,18,19,22,72,47,15,63,15,79,15,127,15,143,15, +5,15,1,9,21,0,63,51,51,93,43,43,51,63,51,51,93,43,43,17,51,1,47,94,93,113, +237,50,93,93,26,16,220,93,113,50,26,237,18,57,61,47,51,51,49,48,93,93,93, +93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,33,35,1,30,3,21,17,35,17,33, +19,30,1,23,62,1,55,19,33,17,35,17,52,62,2,55,3,19,153,254,188,1,3,1,1,174, +1,24,220,23,37,8,10,35,23,220,1,13,173,1,3,2,2,3,183,26,60,61,57,23,253,44, +4,58,253,107,63,151,72,72,151,63,2,149,251,198,2,212,22,60,64,60,23,0,1,0, +142,0,0,3,221,4,58,0,11,0,139,64,48,5,70,64,2,15,6,79,6,2,57,47,6,111,6,143, +6,255,6,4,191,6,1,143,6,159,6,255,6,3,6,13,128,0,13,192,13,208,13,224,13, +4,192,13,1,128,13,1,13,184,255,192,64,49,19,23,72,1,9,70,192,10,1,0,10,16, +10,48,10,224,10,240,10,5,10,8,80,176,1,192,1,2,159,1,175,1,191,1,3,15,1,63, +1,2,8,1,1,10,5,21,3,0,15,0,63,50,63,51,57,47,94,93,113,114,237,1,47,93,113, +237,50,43,93,113,114,26,16,220,93,113,114,94,93,50,26,237,49,48,1,17,33,17, +51,17,35,17,33,17,35,17,1,66,1,231,180,180,254,25,180,4,58,254,54,1,202,251, +198,1,237,254,19,4,58,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0, +142,0,0,3,199,4,58,0,7,0,109,64,80,1,70,64,15,2,79,2,2,57,47,2,111,2,143, +2,255,2,4,191,2,1,143,2,159,2,255,2,3,2,9,128,0,9,192,9,208,9,224,9,4,192, +9,1,128,9,176,9,192,9,208,9,4,47,9,1,5,70,192,6,1,0,6,16,6,48,6,224,6,240, +6,5,8,6,4,80,7,15,6,1,21,0,63,51,63,237,1,47,94,93,113,237,93,93,113,114, +26,16,220,93,113,114,94,93,26,237,49,48,1,17,35,17,33,17,35,17,3,199,180, +254,47,180,4,58,251,198,3,183,252,73,4,58,0,255,255,0,132,254,87,4,29,4,77, +18,6,0,83,0,0,255,255,0,87,255,236,3,202,4,78,18,6,0,70,0,0,0,1,0,35,0,0, +3,135,4,58,0,7,0,72,64,43,7,14,4,2,5,14,223,2,1,2,4,70,0,5,16,5,2,8,5,5,8, +9,160,9,1,95,9,1,48,9,64,9,2,47,9,1,4,21,3,7,80,0,15,0,63,237,50,63,1,93, +93,93,93,17,18,57,47,94,93,237,204,93,43,1,24,16,77,228,49,48,19,33,21,33, +17,35,17,33,35,3,100,254,168,180,254,168,4,58,131,252,73,3,183,0,0,0,255, +255,0,5,254,87,3,252,4,58,18,6,0,92,0,0,0,3,0,86,254,87,6,62,5,204,0,53,0, +74,0,95,0,229,64,13,141,93,157,93,173,93,3,78,24,14,17,72,72,184,255,232, +179,14,17,72,57,184,255,232,182,14,17,72,109,82,1,51,184,255,224,64,75,7, +10,72,15,26,31,26,47,26,3,24,32,7,10,72,0,3,16,3,32,3,3,7,4,54,71,64,25,14, +13,0,14,14,75,71,36,0,68,0,148,0,164,0,4,0,85,39,13,72,65,38,4,14,1,4,14, +36,14,68,14,100,14,132,14,180,14,228,14,7,7,14,52,97,1,97,184,255,192,64, +52,30,35,72,219,97,1,84,97,100,97,132,97,148,97,4,64,97,1,2,32,97,48,97,2, +31,97,1,0,97,1,38,0,31,45,80,3,70,80,49,28,16,8,18,91,3,59,80,5,22,22,13, +27,0,63,63,51,237,23,50,63,51,237,23,50,63,1,93,93,93,95,93,93,93,43,113, +47,94,93,113,51,51,237,50,50,220,93,237,43,1,24,16,77,244,26,237,49,48,95, +94,93,43,93,0,43,93,1,43,43,43,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35, +17,52,54,55,35,14,1,35,34,2,17,16,18,51,50,22,23,51,52,46,2,53,17,51,17,20, +14,2,21,51,62,1,51,50,30,2,5,20,30,2,51,50,62,2,55,53,52,46,2,35,34,14,2, +5,52,46,2,35,34,14,2,29,1,30,3,51,50,62,2,6,62,38,86,140,101,105,158,42,6, +2,3,170,2,3,5,46,149,111,186,179,185,180,112,149,45,5,2,2,1,170,1,1,1,5,46, +144,114,101,140,86,38,250,213,26,56,85,60,60,94,65,34,2,34,64,94,61,57,86, +57,29,4,110,23,52,88,64,53,92,70,40,1,35,65,92,60,65,88,53,23,2,34,123,208, +150,85,88,100,35,77,58,254,89,1,167,54,82,40,104,90,1,19,1,25,1,28,1,26,90, +98,10,41,46,42,12,1,163,254,92,11,43,47,43,12,104,89,80,145,205,129,112,160, +103,48,43,98,157,113,24,115,159,98,43,46,102,163,116,100,156,108,56,34,96, +169,135,23,108,150,93,41,58,110,159,0,0,0,255,255,0,23,0,0,3,234,4,58,18, +6,0,91,0,0,0,1,0,142,254,104,4,102,4,58,0,11,0,91,178,7,73,8,184,255,192, +64,54,18,21,72,8,8,5,70,64,223,2,1,207,2,223,2,2,2,64,25,28,72,0,2,48,2,2, +2,13,128,111,13,1,1,70,0,10,16,10,48,10,240,10,4,8,10,5,1,80,10,21,8,3,0, +15,0,63,50,47,63,237,50,1,47,94,93,237,93,26,16,220,93,43,93,113,26,237,50, +47,43,237,49,48,1,17,33,17,51,17,51,17,35,17,33,17,1,66,1,221,180,147,163, +252,203,4,58,252,73,3,183,252,73,253,229,1,152,4,58,0,1,0,122,0,0,3,156,4, +58,0,25,0,92,64,37,108,15,124,15,140,15,3,22,32,7,10,72,21,24,7,12,72,12, +70,64,9,175,13,1,127,13,143,13,239,13,3,13,27,128,1,70,24,184,255,192,64, +20,9,12,72,24,14,19,80,9,15,6,31,6,2,6,6,12,21,10,0,15,0,63,50,63,57,47,93, +51,237,50,1,47,43,237,26,16,220,93,113,50,26,237,49,48,43,43,0,93,1,17,20, +30,2,51,50,54,55,17,51,17,35,17,14,3,35,34,46,2,53,17,1,46,16,39,64,47,70, +132,74,180,180,38,81,87,93,51,66,101,69,36,4,58,254,110,34,59,44,25,26,21, +2,5,251,198,1,205,15,31,24,16,41,76,110,69,1,155,0,0,0,1,0,142,0,0,5,221, +4,58,0,11,0,116,64,52,7,70,4,4,0,11,70,64,4,8,52,8,2,36,8,132,8,212,8,228, +8,4,11,8,1,139,8,251,8,2,8,13,128,251,13,1,180,13,212,13,2,128,13,1,2,112, +13,1,95,13,1,13,184,255,192,64,23,9,12,72,3,70,0,0,16,0,48,0,3,8,0,9,5,1, +15,7,3,80,0,21,0,63,237,50,63,51,51,1,47,94,93,237,43,93,93,95,93,93,93,26, +16,220,93,113,113,114,26,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33, +17,51,17,142,180,1,154,180,1,153,180,4,58,252,73,3,183,252,73,3,183,251,198, +0,0,0,1,0,142,254,104,6,102,4,58,0,15,0,141,64,96,13,73,244,14,1,14,14,11, +70,8,7,70,64,4,4,0,107,8,1,4,8,1,84,8,228,8,2,59,8,1,107,8,123,8,139,8,251, +8,4,84,8,1,8,17,128,251,17,1,212,17,1,128,17,176,17,2,2,96,17,112,17,2,95, +17,1,32,17,48,17,64,17,3,3,70,0,0,16,0,48,0,240,0,4,8,0,14,9,5,1,15,11,7, +3,80,0,21,0,63,237,50,50,63,51,51,47,1,47,94,93,237,93,93,93,95,93,93,93, +26,16,204,93,93,113,113,114,114,17,57,47,26,237,16,237,50,47,93,237,49,48, +51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,142,180,1,149,180,1,148,180, +147,163,4,58,252,73,3,183,252,73,3,183,252,73,253,229,1,152,0,0,0,0,2,0,45, +0,0,4,172,4,58,0,14,0,25,0,113,185,0,5,255,224,179,7,10,72,2,184,255,224, +64,16,7,11,72,3,71,64,176,21,1,21,27,128,80,27,1,27,184,255,192,64,45,30, +35,72,255,27,1,14,11,15,70,32,9,1,32,9,1,9,25,81,175,14,191,14,207,14,3,15, +14,31,14,79,14,3,7,14,14,9,11,80,12,15,15,81,9,21,0,63,237,63,237,18,57,47, +94,93,113,237,1,47,93,113,253,204,51,93,43,113,26,16,220,93,26,237,49,48, +43,43,1,50,22,21,20,14,2,35,33,17,33,53,33,25,1,51,50,62,2,53,52,38,43,1, +3,13,205,210,52,104,155,103,254,103,254,184,1,252,202,69,96,59,26,116,133, +203,2,112,147,159,74,118,82,44,3,183,131,254,54,254,15,25,49,71,46,94,87, +0,3,0,142,0,0,5,50,4,58,0,12,0,23,0,27,0,105,185,0,5,255,224,179,7,10,72, +2,184,255,224,64,58,7,10,72,3,71,19,19,9,27,70,64,159,24,175,24,2,24,29,128, +12,13,70,16,9,32,9,64,9,3,9,23,81,175,12,191,12,207,12,3,15,12,31,12,79,12, +3,7,12,12,9,25,10,15,24,13,81,9,21,0,63,237,51,63,51,18,57,47,94,93,113,237, +1,47,93,237,50,26,16,220,93,26,237,18,57,47,237,49,48,43,43,1,50,22,21,20, +14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,1,17,51,17,2,38,205,210,52, +104,155,103,254,103,180,202,69,96,59,26,116,133,203,3,60,180,2,112,147,159, +74,118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,254,13,4,58,251,198,0,0, +0,0,2,0,142,0,0,3,215,4,58,0,12,0,23,0,132,185,0,5,255,224,179,7,10,72,2, +184,255,224,64,86,7,10,72,3,71,64,176,19,1,19,25,128,47,25,1,47,25,175,25, +2,63,25,95,25,127,25,159,25,191,25,207,25,223,25,255,25,8,25,64,35,39,72, +12,13,70,0,9,208,9,2,16,9,32,9,64,9,240,9,4,9,23,81,175,12,191,12,207,12, +3,15,12,31,12,79,12,3,7,12,12,9,10,15,13,81,9,21,0,63,237,63,18,57,47,94, +93,113,237,1,47,93,113,237,50,43,93,113,114,26,16,220,93,26,237,49,48,43, +43,1,50,22,21,20,14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,2,56,205, +210,52,104,155,103,254,85,180,220,69,96,59,26,116,133,221,2,112,147,159,74, +118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,0,0,0,0,1,0,55,255,236,3,190, +4,78,0,40,0,170,64,87,118,34,1,22,29,1,118,28,1,107,15,1,107,6,1,16,10,32, +10,2,10,10,0,31,71,64,12,31,9,1,144,9,1,9,42,128,20,70,21,21,1,70,31,0,1, +223,0,1,0,64,12,18,72,0,10,80,143,11,159,11,175,11,3,11,11,26,4,80,36,0,1, +16,1,32,1,96,1,112,1,128,1,192,1,208,1,8,1,184,255,192,64,29,27,34,72,1,1, +36,22,31,20,47,20,127,20,143,20,223,20,5,20,64,29,32,72,20,20,17,80,26,16, +0,63,237,51,47,43,93,63,51,47,43,93,16,237,17,57,47,113,237,1,47,43,113,114, +237,51,47,237,26,16,220,93,113,50,26,237,18,57,47,93,49,48,93,93,93,93,93, +19,55,30,1,51,50,62,2,55,33,53,33,46,3,35,34,6,7,39,62,3,51,50,30,2,21,20, +14,2,35,34,46,2,55,182,16,133,100,73,103,68,34,5,254,99,1,157,4,34,67,103, +73,109,118,15,185,13,66,105,145,93,90,170,134,81,51,114,182,130,99,151,106, +61,1,59,12,108,104,53,97,135,82,131,90,133,88,44,105,91,14,68,116,84,48,53, +128,216,163,120,205,151,86,54,92,122,0,0,0,0,2,0,142,255,236,5,170,4,78,0, +19,0,39,0,128,64,85,121,37,137,37,2,116,33,132,33,2,118,27,134,27,2,121,23, +137,23,2,150,18,166,18,2,30,71,15,15,8,31,8,2,7,8,8,11,0,71,64,160,20,1,20, +41,128,14,10,70,192,11,1,0,11,16,11,48,11,224,11,240,11,5,8,11,25,80,17,16, +9,80,47,14,1,14,14,11,12,15,11,21,35,80,3,22,0,63,237,63,63,18,57,47,93,237, +63,237,1,47,94,93,113,237,50,26,16,220,93,26,237,18,57,47,94,93,51,237,49, +48,0,93,1,93,93,93,93,1,16,2,35,34,46,2,39,35,17,35,17,51,17,51,18,33,50, +18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,170,235,223,102,161,115,65, +5,222,180,180,223,33,1,164,237,215,189,35,67,97,61,63,99,70,37,39,70,94,56, +62,100,70,38,2,30,254,228,254,234,62,128,192,131,254,19,4,58,254,54,1,222, +254,232,254,232,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0,0,2, +0,17,0,0,3,199,4,58,0,13,0,22,0,143,64,68,117,1,133,1,2,3,32,11,17,72,0,32, +40,43,72,223,0,239,0,2,0,32,29,37,72,52,0,1,43,0,1,41,4,1,4,48,7,10,72,7, +32,7,11,72,18,71,0,3,3,12,6,6,2,22,11,70,64,175,12,1,239,12,1,12,24,128,1, +2,184,255,240,64,22,91,2,107,2,2,2,3,0,81,47,21,1,21,21,1,15,81,9,15,12,1, +21,0,63,51,63,237,18,57,47,93,237,50,1,47,93,56,51,26,16,220,93,113,26,237, +51,18,57,47,18,57,17,51,237,49,48,43,0,43,93,1,93,113,43,113,43,43,93,9,1, +35,1,46,1,53,52,54,51,33,17,35,25,1,35,34,6,21,20,22,59,1,2,23,254,197,203, +1,88,131,118,216,207,1,176,180,234,130,120,107,124,253,1,202,254,54,1,215, +27,163,122,149,150,251,198,1,202,1,241,92,93,94,93,0,255,255,0,87,255,236, +4,24,5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3, +2,4,42,40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,0,1,0,10,254,87,3,238,5,204, +0,57,0,162,64,9,170,49,1,31,32,9,15,72,24,184,255,232,64,86,9,13,72,0,24, +16,24,2,7,36,36,57,28,70,64,80,45,1,159,45,1,45,59,128,10,7,57,70,4,3,192, +0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176,59,192,59,208,59,3,176,59,240,59, +2,255,59,1,112,59,160,59,176,59,3,57,21,40,80,33,27,15,51,80,22,10,2,81,7, +3,3,5,22,184,255,192,182,7,13,72,22,15,5,0,0,63,63,43,18,57,47,51,237,50, +16,237,50,63,237,63,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220, +93,113,26,237,17,57,47,49,48,0,94,93,43,43,1,93,51,17,35,53,51,53,51,21,33, +21,33,21,20,14,2,7,51,62,3,51,50,30,2,21,17,20,14,2,35,34,38,39,53,30,1,51, +50,62,2,53,17,52,46,2,35,34,14,2,21,17,142,132,132,180,1,44,254,212,2,3,2, +1,3,30,70,84,100,62,104,133,77,29,21,54,93,72,34,65,28,13,36,13,38,49,27, +10,17,48,88,70,64,103,73,40,4,182,131,147,147,131,148,33,66,56,39,7,55,77, +50,23,56,101,140,84,252,209,62,106,78,45,4,5,139,2,4,20,43,67,46,2,241,69, +104,69,35,46,84,120,75,253,170,0,0,0,255,255,0,142,0,0,2,200,5,228,18,38, +1,201,0,0,17,7,0,116,0,216,0,0,0,19,64,11,1,6,17,38,1,85,6,9,4,0,37,1,43, +53,0,43,53,0,0,0,0,1,0,87,255,236,3,222,4,78,0,40,0,171,64,113,116,30,1,116, +21,1,137,8,1,137,2,1,47,42,1,63,26,1,26,26,27,36,16,70,15,15,35,70,0,36,32, +36,2,0,36,64,36,96,36,128,36,160,36,192,36,224,36,7,8,36,24,27,71,31,5,1, +5,27,80,143,24,159,24,175,24,3,24,24,32,19,80,10,31,16,47,16,127,16,143,16, +223,16,5,16,64,29,32,72,16,16,10,16,32,80,0,0,35,16,35,32,35,96,35,112,35, +128,35,192,35,208,35,8,35,184,255,192,182,27,34,72,35,35,0,22,0,63,50,47, +43,93,16,237,63,51,47,43,93,16,237,18,57,47,113,237,1,47,93,237,50,47,94, +93,113,237,51,47,237,17,18,57,47,93,93,49,48,93,93,93,93,5,34,46,2,53,52, +62,2,51,50,30,2,23,7,46,1,35,34,14,2,7,33,21,33,30,3,51,50,54,55,23,14,3, +2,52,130,182,114,51,81,134,170,90,93,145,105,66,13,185,15,118,109,73,103, +67,34,4,1,156,254,99,4,35,68,103,74,100,133,16,182,9,61,106,151,20,86,151, +205,120,163,216,128,53,48,84,116,68,14,91,105,44,88,133,90,131,82,135,97, +53,103,109,12,67,122,92,54,0,255,255,0,57,255,236,3,182,4,75,18,6,0,86,0, +0,255,255,0,137,0,0,1,61,5,204,16,38,0,241,199,0,17,6,1,75,237,0,0,212,181, +9,64,56,56,72,9,184,255,192,64,9,55,55,72,9,64,54,54,72,9,184,255,192,179, +53,53,72,9,184,255,192,64,9,52,52,72,9,64,50,50,72,9,184,255,192,179,49,49, +72,9,184,255,192,64,9,48,48,72,9,64,42,42,72,9,184,255,192,179,41,41,72,9, +184,255,192,64,9,40,40,72,9,64,38,38,72,9,184,255,192,179,37,37,72,9,184, +255,192,179,36,36,72,9,184,255,192,179,35,35,72,9,184,255,192,64,16,34,34, +72,9,64,29,29,72,9,64,10,10,72,1,0,0,184,255,192,179,49,49,72,0,184,255,192, +64,9,40,41,72,0,64,25,27,72,0,184,255,192,182,18,18,72,128,0,1,0,184,255, +192,64,11,8,8,72,0,1,0,4,7,1,2,37,1,43,53,17,43,93,43,43,43,43,53,53,1,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,248,0,0,2, +37,5,123,18,38,0,241,0,0,17,6,0,105,203,0,0,25,182,2,1,4,17,38,2,1,184,255, +243,180,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,0,255,255,255,206,254,87,1,61, +5,204,18,6,0,77,0,0,0,2,0,11,255,236,6,236,4,58,0,34,0,45,1,42,64,82,163, +16,1,148,16,1,117,16,133,16,2,106,14,1,57,14,1,14,16,18,22,72,131,14,147, +14,163,14,3,117,14,1,106,13,1,57,13,1,13,16,18,22,72,163,13,1,87,13,103,13, +119,13,3,16,24,12,17,72,109,15,1,15,32,18,22,72,162,15,1,117,15,133,15,149, +15,3,54,15,70,15,2,5,184,255,224,179,7,10,72,2,184,255,224,64,18,7,11,72, +34,35,70,64,9,1,9,9,22,3,71,176,41,1,41,184,255,192,64,9,8,11,72,41,47,80, +47,1,47,184,255,192,64,93,30,35,72,255,47,1,48,47,1,109,11,1,31,11,63,11, +2,255,11,1,233,11,1,187,11,203,11,219,11,3,163,11,1,149,11,1,31,32,63,32, +2,255,32,1,106,32,1,41,32,1,163,32,1,53,32,1,11,15,32,3,22,45,81,175,34,191, +34,207,34,3,15,34,31,34,79,34,3,7,34,34,9,11,80,32,15,25,80,18,22,35,81,9, +21,0,63,237,63,237,63,237,18,57,47,94,93,113,237,1,47,23,51,93,93,113,113, +93,113,93,93,93,93,93,113,113,93,93,43,113,16,220,43,93,237,18,57,47,93,237, +50,49,48,43,43,93,93,93,43,113,0,43,1,93,93,43,113,113,93,93,43,113,113,93, +93,93,1,50,22,21,20,14,2,35,33,17,33,6,2,14,3,35,34,38,39,53,30,1,51,50,62, +3,18,55,33,25,1,51,50,62,2,53,52,38,43,1,5,77,205,210,52,104,155,103,254, +62,254,101,25,42,44,51,71,94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2, +242,242,69,96,59,26,116,133,243,2,112,147,159,74,118,82,44,3,183,184,254, +225,216,149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,254,54,254,15,25,49, +71,46,94,87,0,0,2,0,142,0,0,6,44,4,58,0,20,0,31,0,133,185,0,7,255,224,179, +7,10,72,4,184,255,224,64,23,7,11,72,1,21,70,19,11,11,15,5,71,64,176,27,1, +27,33,128,80,33,1,33,184,255,192,64,50,30,35,72,255,33,1,18,14,70,16,15,32, +15,64,15,3,15,31,81,1,1,13,80,175,18,191,18,207,18,3,15,18,31,18,79,18,3, +7,18,18,0,15,21,21,81,11,21,16,0,15,0,63,50,63,237,63,18,57,47,94,93,113, +237,51,47,237,1,47,93,237,50,93,43,113,26,16,220,93,26,237,18,57,47,51,237, +50,49,48,43,43,1,17,51,50,22,21,20,14,2,35,33,17,33,17,35,17,51,17,33,17, +19,51,50,62,2,53,52,38,43,1,3,169,228,205,210,52,104,155,103,254,102,254, +78,180,180,1,178,181,202,69,96,59,26,116,133,203,4,58,254,54,147,159,74,118, +82,44,1,237,254,19,4,58,254,54,1,202,252,69,25,49,71,46,94,87,0,0,0,0,1,0, +10,0,0,3,238,5,204,0,41,0,144,185,0,7,255,232,64,85,9,13,72,0,7,16,7,2,7, +33,24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,35,32,24,70,29,28,192,25, +1,0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240, +43,2,255,43,1,112,43,160,43,176,43,3,35,27,81,32,28,28,5,30,0,25,11,21,0, +18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63,18,57,47,51, +237,50,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220,93,113,26,237, +17,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21, +17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61,30,70,84,100,62,104, +133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180,1,44,254,212,2,3,2, +1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69,35,46,84,120,75,253, +170,4,182,131,147,147,131,148,33,66,56,39,7,0,0,255,255,0,138,0,0,3,138,5, +228,18,38,1,208,0,0,17,7,0,116,1,63,0,0,0,19,64,11,1,22,17,38,1,81,22,25, +0,14,37,1,43,53,0,43,53,0,0,0,255,255,0,5,254,87,3,252,5,240,18,38,0,92,0, +0,17,7,2,145,0,183,0,0,0,19,64,11,1,32,17,38,1,10,37,45,17,31,37,1,43,53, +0,43,53,0,0,0,0,1,0,142,254,104,3,221,4,58,0,11,0,125,64,89,9,73,15,10,79, +10,2,38,10,10,0,7,70,64,15,4,79,4,2,57,47,4,111,4,143,4,255,4,4,191,4,1,143, +4,159,4,255,4,3,4,13,128,3,70,192,0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176, +13,192,13,208,13,3,176,13,240,13,2,112,13,160,13,176,13,192,13,4,9,5,1,15, +8,3,80,0,0,47,237,51,63,51,47,1,93,113,114,47,94,93,113,237,26,16,220,93, +113,114,94,93,26,237,18,57,47,94,93,237,49,48,51,17,51,17,33,17,51,17,33, +17,35,17,142,180,1,231,180,254,170,163,4,58,252,73,3,183,251,198,254,104, +1,152,0,0,1,0,168,0,1,3,186,7,28,0,7,0,55,64,37,5,90,0,6,16,6,64,6,3,6,3, +70,255,0,1,0,0,16,0,64,0,128,0,176,0,208,0,6,7,0,4,95,1,7,3,5,18,0,63,63, +51,237,1,47,94,93,93,237,47,93,237,49,48,1,17,51,17,33,17,35,17,3,6,180,253, +173,191,5,129,1,155,253,201,251,28,5,128,0,0,0,0,1,0,142,0,0,3,10,5,204,0, +7,0,56,64,36,6,73,16,3,48,3,2,3,3,9,0,70,192,1,1,0,1,16,1,48,1,224,1,240, +1,5,8,1,4,0,7,80,2,15,0,21,0,63,63,237,63,1,47,94,93,113,237,17,51,47,93, +237,49,48,33,35,17,33,17,51,17,33,1,66,180,1,217,163,254,56,4,58,1,146,253, +235,255,255,0,9,0,0,7,134,6,240,18,38,0,58,0,0,17,7,2,148,2,65,0,0,0,21,180, +1,47,5,38,1,184,255,184,180,48,51,15,46,37,1,43,53,0,43,53,0,255,255,255, +253,0,0,5,204,5,228,18,38,0,90,0,0,17,7,0,67,1,72,0,0,0,21,180,1,43,17,38, +1,184,255,162,180,44,47,15,42,37,1,43,53,0,43,53,0,255,255,0,9,0,0,7,134, +6,240,18,38,0,58,0,0,17,7,2,149,2,247,0,0,0,19,64,11,1,47,5,38,1,75,47,50, +15,46,37,1,43,53,0,43,53,0,0,0,255,255,255,253,0,0,5,204,5,228,18,38,0,90, +0,0,17,7,0,116,2,38,0,0,0,19,64,11,1,43,17,38,1,93,43,46,15,42,37,1,43,53, +0,43,53,0,0,0,255,255,0,9,0,0,7,134,6,178,18,38,0,58,0,0,17,7,2,152,2,134, +0,0,0,23,64,13,2,1,47,5,38,2,1,2,51,49,15,46,37,1,43,53,53,0,43,53,53,0,0, +0,255,255,255,253,0,0,5,204,5,123,18,38,0,90,0,0,17,7,0,105,1,161,0,0,0,23, +64,13,2,1,43,17,38,2,1,0,47,45,15,42,37,1,43,53,53,0,43,53,53,0,0,0,255,255, +0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,148,1,34,0,0,0,21,180,1,9,5,38, +1,184,255,181,180,10,13,4,8,37,1,43,53,0,43,53,0,255,255,0,5,254,87,3,252, +5,228,18,38,0,92,0,0,17,6,0,67,105,0,0,21,180,1,32,17,38,1,184,255,167,180, +33,36,17,31,37,1,43,53,0,43,53,0,0,0,0,1,0,0,1,195,4,114,2,76,0,3,0,43,64, +30,2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38, +43,72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,4,114,1,195,137,137, +0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30,2,0,0,186,15,1,31,1,63,1,79,1,4,47, +1,63,1,111,1,175,1,223,1,5,1,64,38,43,72,1,0,47,43,93,113,237,1,47,47,49, +48,17,53,33,21,8,0,1,195,137,137,0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30, +2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38,43, +72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,8,0,1,195,137,137,0,255, +255,255,225,254,78,4,138,255,169,16,38,0,66,0,229,16,7,0,66,0,0,0,190,0,1, +0,127,3,184,1,72,5,129,0,12,0,47,64,16,4,32,11,17,72,7,64,11,17,72,7,12,150, +10,151,0,184,255,192,64,10,8,11,72,0,10,156,0,169,7,3,0,63,244,237,1,47,43, +237,237,50,43,49,48,43,19,53,52,62,2,55,51,14,1,21,51,21,127,10,20,30,20, +121,45,50,89,3,184,146,52,86,75,66,32,65,132,65,195,0,0,0,1,0,127,3,184,1, +72,5,129,0,12,0,52,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255,192, +180,11,17,72,6,11,184,255,192,64,10,8,11,72,11,10,156,5,169,11,3,0,63,228, +237,1,47,43,51,43,253,237,49,48,43,1,20,14,2,7,35,62,1,53,35,53,51,1,72,9, +20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,63,197,0,1,0,127,254, +250,1,72,0,195,0,12,0,51,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255, +192,180,11,17,72,6,11,184,255,192,64,9,8,11,72,11,5,169,11,156,10,0,47,253, +228,1,47,43,51,43,253,237,49,48,43,37,20,14,2,7,35,62,1,53,35,53,51,1,72, +9,20,29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,0,0,0,1,0,126, +3,184,1,71,5,129,0,12,0,47,64,16,8,32,11,17,72,5,64,11,17,72,5,1,150,2,151, +11,184,255,192,64,10,8,11,72,11,5,169,2,156,12,3,0,63,237,228,1,47,43,237, +237,50,43,49,48,43,1,21,35,20,22,23,35,46,3,61,1,1,65,88,49,45,123,20,29, +20,9,5,129,197,63,132,65,32,66,75,86,53,145,0,0,0,2,0,75,3,184,2,95,5,129, +0,12,0,25,0,89,64,58,17,32,11,17,72,4,32,11,17,72,20,64,11,17,72,20,25,150, +13,7,64,11,17,72,7,12,150,10,151,128,0,1,15,0,31,0,2,8,0,23,151,13,159,27, +175,27,2,10,23,156,13,0,0,13,169,6,20,3,0,63,51,228,50,47,16,237,50,1,93, +47,237,220,94,93,93,237,237,50,43,16,237,50,43,49,48,43,43,1,53,52,62,2,55, +51,14,1,21,51,21,33,53,52,62,2,55,51,14,1,21,51,21,1,151,10,19,29,20,122, +45,49,88,253,242,10,20,30,20,121,45,50,89,3,184,146,52,86,75,66,32,65,132, +65,195,146,52,86,75,66,32,65,132,65,195,0,0,2,0,75,3,184,2,95,5,129,0,12, +0,25,0,107,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22, +151,13,150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31, +11,2,8,11,19,184,255,192,64,24,11,17,72,19,63,24,1,24,159,27,175,27,2,10, +23,156,24,5,5,18,169,11,24,3,0,63,51,228,50,47,16,237,50,1,93,47,93,51,43, +220,94,93,93,50,43,253,237,16,253,237,49,48,43,43,1,20,14,2,7,35,62,1,53, +35,53,51,5,20,14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194, +254,181,9,20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,65,195,145, +53,86,75,66,32,65,132,65,195,0,0,0,2,0,75,254,250,2,95,0,195,0,12,0,25,0, +104,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22,151,13, +150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31,11,2, +8,11,19,184,255,192,64,21,11,17,72,19,24,159,27,175,27,2,5,5,18,169,24,11, +11,24,156,10,23,0,47,51,237,50,47,16,228,50,47,1,93,47,51,43,220,94,93,93, +50,43,253,237,16,253,237,49,48,43,43,37,20,14,2,7,35,62,1,53,35,53,51,5,20, +14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194,254,181,9,20, +29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,144,53,87,75,66,32, +65,132,65,195,0,0,0,1,0,138,255,118,3,234,5,204,0,11,0,64,64,37,11,192,0, +8,9,8,0,188,3,7,7,6,4,192,47,3,111,3,175,3,3,32,3,1,3,11,193,10,194,7,4,193, +5,194,7,0,1,0,47,63,246,237,16,244,237,1,47,93,113,237,51,51,47,16,237,50, +50,47,16,237,49,48,1,3,35,3,5,53,5,3,51,3,37,21,2,137,22,115,22,254,160,1, +96,28,215,28,1,97,3,232,251,142,4,114,27,164,29,1,120,254,136,29,164,0,0, +1,0,136,255,115,3,233,5,204,0,21,0,86,64,50,12,8,189,9,15,5,6,11,14,15,5, +9,190,19,1,189,0,20,17,0,16,3,4,16,3,32,0,1,0,19,193,18,194,15,12,193,13, +194,15,8,193,7,194,4,1,193,2,194,4,0,0,63,246,237,16,244,237,47,246,237,16, +244,237,1,47,93,23,51,47,17,51,51,16,237,50,237,23,50,47,16,237,50,49,48, +1,5,53,5,3,51,3,37,21,37,3,19,37,21,37,19,35,19,5,53,5,19,1,241,254,152,1, +104,16,175,16,1,105,254,151,26,26,1,104,254,152,16,175,16,254,151,1,105,26, +3,232,27,164,29,1,120,254,136,29,164,27,254,182,254,185,27,164,29,254,136, +1,120,29,164,27,1,71,0,0,0,0,1,0,81,1,145,2,124,3,188,0,19,0,73,185,0,17, +255,232,179,9,12,72,13,184,255,232,64,39,9,12,72,7,24,9,12,72,3,24,9,12,72, +128,0,1,15,0,63,0,2,0,191,10,1,10,143,5,1,0,5,48,5,2,5,15,15,1,15,0,47,93, +205,93,93,1,47,93,205,93,93,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52, +62,2,51,50,30,2,2,124,45,76,102,58,57,99,75,43,43,75,99,57,58,102,76,45,2, +170,58,102,77,44,44,77,102,58,57,100,74,43,43,74,100,0,0,0,3,1,22,0,0,6,234, +0,219,0,3,0,7,0,11,0,86,64,61,7,150,4,4,0,11,150,0,8,48,8,96,8,128,8,144, +8,160,8,208,8,240,8,8,0,8,48,8,64,8,96,8,144,8,192,8,208,8,240,8,8,8,8,3, +150,47,0,191,0,2,16,0,1,0,5,1,9,155,4,0,8,0,47,51,51,237,50,50,1,47,93,93, +237,47,94,93,113,237,18,57,47,237,49,48,33,53,51,21,33,53,51,21,33,53,51, +21,6,40,194,252,183,192,252,181,195,219,219,219,219,219,219,0,0,7,0,55,255, +245,7,200,5,141,0,3,0,23,0,43,0,63,0,83,0,103,0,123,3,217,64,12,118,0,134, +0,2,121,2,137,2,2,3,102,184,255,224,64,14,8,12,72,96,24,8,12,72,92,24,8,12, +72,86,184,255,224,179,8,12,72,62,184,255,232,64,14,8,12,72,56,24,8,12,72, +52,24,8,12,72,46,184,255,224,179,8,12,72,22,184,255,224,64,14,8,12,72,16, +24,8,12,72,12,24,8,12,72,6,184,255,224,64,13,8,12,72,74,180,59,181,49,0,1, +2,3,1,184,255,240,64,131,3,16,118,3,1,9,1,25,1,121,1,3,9,1,3,1,3,19,49,180, +102,64,1,38,64,182,64,198,64,214,64,4,64,64,19,114,180,99,181,89,180,105, +104,1,22,104,38,104,2,201,104,249,104,2,139,104,1,118,104,1,89,104,1,70,104, +1,41,104,1,27,104,1,233,104,1,150,104,198,104,2,121,104,1,107,104,1,86,104, +1,57,104,1,6,104,22,104,38,104,3,10,104,24,180,9,181,34,180,9,19,25,19,41, +19,73,19,89,19,121,19,137,19,153,19,8,34,19,64,45,49,72,19,184,255,192,64, +255,19,23,72,19,217,125,1,198,125,1,169,125,1,155,125,1,121,125,1,107,125, +1,93,125,1,73,125,1,59,125,1,45,125,1,9,125,25,125,2,251,125,1,237,125,1, +217,125,1,203,125,1,189,125,1,155,125,1,125,125,141,125,2,105,125,1,91,125, +1,77,125,1,54,125,1,41,125,1,11,125,27,125,2,204,233,125,249,125,2,214,125, +1,187,125,1,173,125,1,137,125,153,125,2,123,125,1,102,125,1,75,125,1,61,125, +1,9,125,1,219,125,251,125,2,205,125,1,153,125,169,125,2,107,125,139,125,2, +93,125,1,57,125,1,43,125,1,29,125,1,9,125,1,237,125,253,125,2,185,125,201, +125,217,125,3,123,125,171,125,2,89,125,1,11,125,59,125,75,125,3,155,249,125, +1,235,125,1,214,125,1,187,125,1,153,125,1,123,125,139,125,2,102,125,1,59, +125,75,125,2,9,125,25,125,2,246,125,1,217,125,1,205,125,1,169,125,185,125, +2,155,125,1,105,125,121,125,2,93,125,1,57,125,73,125,2,43,125,1,22,125,1, +249,125,1,237,125,1,201,125,64,249,1,187,125,1,153,125,1,123,125,1,102,125, +1,73,125,1,54,125,1,9,125,25,125,2,105,249,125,1,235,125,1,221,125,1,169, +125,1,150,125,1,121,125,1,107,125,1,73,125,1,59,125,1,25,125,1,11,125,1,253, +125,1,217,125,1,203,125,1,169,125,1,155,125,1,141,125,1,121,125,1,91,125, +107,125,2,57,125,1,27,125,43,125,2,249,125,1,235,125,1,169,125,201,125,2, +150,125,1,121,125,1,107,125,1,57,125,1,38,125,1,9,125,1,56,249,125,1,230, +125,1,201,125,1,182,125,1,153,125,1,139,125,1,89,125,1,70,125,1,41,125,1, +27,125,1,249,125,1,235,125,1,201,125,1,187,125,1,173,125,1,1,148,125,1,123, +125,1,100,125,1,75,125,1,63,125,1,27,125,1,15,125,1,228,125,1,203,125,1,176, +125,1,2,160,125,1,143,125,1,112,125,1,95,125,1,64,125,1,31,125,1,0,125,1, +8,109,182,84,183,119,182,94,19,69,182,44,183,79,182,54,19,39,182,14,183,29, +182,4,4,2,3,0,18,0,63,63,63,237,244,237,63,237,244,237,63,237,244,237,1,94, +93,93,93,93,93,93,93,95,93,93,93,113,113,113,113,113,113,113,95,113,113,113, +113,113,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93, +93,113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114, +114,114,114,94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113, +113,113,113,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,113,113, +113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,114,94,93, +93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113, +113,47,43,43,94,93,237,244,237,47,94,93,93,93,93,93,93,93,113,113,113,113, +113,113,113,114,114,253,244,237,18,57,47,93,113,237,17,57,57,47,47,94,93, +93,56,56,17,51,17,51,16,244,237,49,48,0,43,43,43,43,43,43,43,43,43,43,43, +43,1,95,93,93,33,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,19,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2,35,34,46,2,53, +52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2, +35,34,46,2,53,52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,48,155, +3,154,157,252,152,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19, +37,55,35,38,58,39,19,20,39,56,37,34,54,39,21,2,30,60,107,80,46,46,81,108, +62,63,108,80,46,46,81,110,210,19,37,55,35,38,58,39,19,20,39,56,37,34,54,39, +21,1,253,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19,37,55,35, +38,58,39,19,20,39,56,37,34,54,39,21,5,129,12,33,83,139,106,102,140,86,38, +37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71,97,59,26,26, +59,97,254,239,33,83,139,106,102,140,86,38,37,86,140,103,106,139,83,33,254, +151,73,98,58,24,24,59,97,73,71,97,59,26,26,59,97,1,176,33,83,139,106,102, +140,86,38,37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71, +97,59,26,26,59,97,0,0,0,0,1,0,85,3,122,1,89,5,129,0,3,0,40,64,25,3,16,10, +13,72,1,16,10,13,72,1,150,31,2,47,2,2,2,48,0,1,0,0,1,3,0,63,205,1,47,93,221, +93,237,49,48,43,43,27,1,51,3,85,64,196,158,3,122,2,7,253,249,255,255,0,85, +3,122,2,175,5,129,16,38,2,14,0,0,17,7,2,14,1,86,0,0,0,9,180,1,96,4,1,4,17, +93,53,0,0,1,0,88,0,141,2,81,3,172,0,8,0,72,64,55,106,3,122,3,138,3,3,106, +0,122,0,138,0,3,7,236,6,235,5,236,31,1,79,1,95,1,127,1,143,1,5,48,1,64,1, +96,1,112,1,160,1,5,1,0,239,15,3,47,3,111,3,127,3,4,3,0,47,93,228,1,47,93, +113,237,237,237,49,48,93,93,37,1,53,1,51,21,9,1,21,1,168,254,176,1,80,167, +254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,0,0,0,1,0,89,0,141, +2,82,3,172,0,8,0,66,64,48,101,6,117,6,133,6,3,101,0,117,0,133,0,3,4,236,1, +236,8,235,112,3,128,3,176,3,3,208,3,1,111,3,127,3,2,3,0,239,15,6,47,6,111, +6,127,6,4,6,0,47,93,228,1,47,93,93,113,253,237,237,49,48,93,93,37,35,53,9, +1,53,51,1,21,1,1,168,1,82,254,176,166,1,81,141,29,1,111,1,116,31,254,141, +63,0,0,0,255,255,0,185,0,0,3,71,5,129,16,38,0,4,0,0,17,7,0,4,1,200,0,0,0, +22,64,12,3,2,47,8,1,8,1,0,47,0,1,0,17,93,53,53,17,93,53,53,0,1,255,192,5, +223,2,235,6,84,0,3,0,13,179,1,0,2,1,0,47,205,1,47,47,49,48,1,33,53,33,2,235, +252,213,3,43,5,223,117,0,1,254,96,0,0,2,98,5,129,0,3,0,45,182,3,16,111,3, +1,3,1,184,255,240,64,18,239,1,1,1,64,13,18,72,1,64,8,11,72,1,2,3,0,18,0,63, +63,1,47,43,43,93,56,47,93,56,49,48,33,35,1,51,254,244,148,3,113,145,5,129, +0,0,1,0,101,2,7,2,131,4,157,0,33,0,111,185,0,30,255,216,64,30,9,17,72,23, +10,224,36,11,1,11,33,224,36,0,212,0,228,0,3,0,23,6,228,11,139,0,251,0,2,0, +184,255,192,64,38,10,13,72,4,0,1,0,29,17,17,75,29,91,29,2,29,64,21,25,72, +29,64,16,19,72,47,29,63,29,2,27,29,1,15,29,1,2,29,0,47,95,93,93,93,43,43, +93,51,47,16,204,93,43,93,50,237,50,1,47,93,237,47,93,237,50,49,48,0,43,1, +17,52,46,2,35,34,6,21,17,35,17,52,46,2,53,51,20,30,2,21,51,62,3,51,50,22, +21,17,2,2,13,29,47,35,72,85,128,1,1,2,119,2,2,2,2,15,38,49,64,42,110,97,2, +7,1,142,46,61,37,16,100,94,254,148,1,255,20,46,40,29,4,3,27,34,35,12,28,46, +32,17,108,121,254,79,0,0,0,1,0,4,0,0,4,46,5,129,0,17,0,106,64,69,7,3,7,3, +10,0,16,32,16,2,16,16,48,16,80,16,112,16,144,16,224,16,6,16,5,1,9,92,14,12, +10,8,12,81,5,31,13,1,0,13,1,13,4,95,15,1,31,1,63,1,79,1,4,63,1,1,15,1,1,8, +1,1,9,0,95,15,3,9,18,0,63,63,237,18,57,47,94,93,93,113,237,220,93,113,50, +237,50,1,47,51,51,237,50,50,47,93,113,18,57,57,47,47,49,48,1,17,33,21,33, +21,33,21,33,17,35,17,35,53,51,17,33,21,1,103,2,175,253,81,1,146,254,110,180, +175,175,3,123,4,230,254,36,157,213,129,254,233,1,23,129,3,233,155,0,1,0,58, +0,0,4,80,5,150,0,58,0,221,64,81,133,58,149,58,2,21,22,37,22,53,22,3,40,44, +0,48,17,13,6,30,111,29,29,0,52,110,6,43,39,48,110,18,14,10,10,0,79,6,95,6, +111,6,3,6,58,111,0,0,32,0,2,0,0,32,0,48,0,80,0,112,0,144,0,176,0,208,0,8, +0,0,16,0,48,0,192,0,224,0,5,8,0,184,255,192,64,70,14,18,72,0,42,16,81,17, +46,12,81,43,175,13,1,13,64,42,45,72,0,13,16,13,32,13,3,13,39,111,17,1,47, +17,95,17,111,17,143,17,159,17,223,17,239,17,7,17,17,52,35,115,41,30,1,30, +24,7,7,52,116,37,58,1,23,58,1,58,6,24,0,63,51,93,93,237,50,63,51,93,237,18, +57,47,93,113,51,222,93,43,93,50,237,50,16,237,50,1,47,43,94,93,113,114,237, +47,93,18,57,47,51,51,237,50,50,16,237,17,57,47,237,17,51,51,17,18,57,57,49, +48,0,93,93,1,14,3,35,33,53,62,1,61,1,35,53,51,53,35,53,51,53,52,62,2,51,50, +30,2,23,7,46,3,35,34,6,29,1,33,21,33,21,33,21,33,21,20,14,2,7,33,50,62,2, +55,4,80,9,57,89,115,67,253,70,89,86,186,186,186,186,48,99,152,103,70,123, +99,71,18,174,10,39,53,65,36,114,112,1,152,254,104,1,152,254,104,22,44,63, +40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160,121,25,129,140,129,130, +92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,138,129,140,129,7,56,106, +92,71,21,19,42,67,48,0,0,0,0,4,0,158,255,236,8,103,5,129,0,14,0,23,0,47,0, +98,1,193,64,71,134,2,1,117,91,133,91,2,91,73,107,73,139,73,3,143,68,1,109, +68,1,91,68,1,105,82,1,105,80,1,125,22,1,91,22,107,22,2,125,17,141,17,2,91, +17,107,17,2,84,57,100,57,2,54,57,70,57,2,37,97,53,97,69,97,3,76,32,9,14,72, +49,184,255,224,64,94,9,14,72,29,32,12,17,72,13,29,29,29,45,29,3,82,73,81, +81,48,72,65,0,70,15,24,39,75,37,41,72,30,34,32,30,57,73,15,56,1,102,56,1, +56,56,89,72,75,95,15,1,63,75,95,75,239,75,3,75,64,27,39,72,239,30,1,31,30, +95,30,127,30,3,15,30,75,75,30,15,3,8,64,65,80,65,96,65,3,127,65,143,65,2, +65,184,255,192,64,16,7,12,72,65,20,7,70,0,8,16,8,32,8,3,8,100,184,255,192, +179,91,95,72,100,184,255,192,179,80,88,72,100,184,255,192,179,70,74,72,100, +184,255,192,179,59,62,72,100,184,255,192,179,48,53,72,100,184,255,192,64, +11,27,31,72,79,100,95,100,111,100,3,100,184,255,192,179,7,10,72,89,184,255, +248,64,71,19,22,72,65,8,19,22,72,89,65,78,60,80,57,51,22,44,80,27,22,6,95, +20,87,80,121,82,1,72,82,88,82,104,82,3,82,78,40,32,80,33,78,37,33,35,35,33, +127,33,143,33,2,175,20,1,20,64,9,17,72,20,33,20,33,8,19,95,9,3,8,18,0,63, +63,237,18,57,57,47,47,43,93,93,17,51,47,17,51,51,16,237,50,47,51,93,93,237, +16,237,63,237,63,51,237,18,57,57,43,43,1,43,93,43,43,43,43,43,43,47,93,237, +50,47,43,93,113,18,23,57,47,47,47,93,113,43,93,93,16,237,51,47,93,113,237, +17,51,51,16,237,50,17,57,57,16,237,16,237,50,47,237,49,48,93,43,43,43,93, +0,93,93,1,93,93,93,93,0,93,93,93,93,93,1,93,0,93,1,93,1,20,14,2,43,1,17,35, +17,33,50,30,2,7,52,38,43,1,17,51,50,54,1,14,1,35,34,38,53,17,35,53,51,55, +51,21,51,21,35,17,20,22,51,50,54,55,37,20,6,35,34,46,2,39,55,30,1,51,50,62, +2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,21,20,30,2,23,30,3, +3,186,61,121,182,121,130,181,1,43,125,186,124,62,182,164,164,105,113,165, +155,2,123,35,74,48,105,93,104,111,53,110,157,157,41,55,23,40,26,2,232,183, +170,75,121,92,61,15,159,17,99,88,40,68,49,27,34,62,87,52,49,96,77,47,168, +161,141,165,22,161,6,31,45,54,30,155,32,57,80,48,48,100,82,52,3,217,92,159, +117,68,253,219,5,129,61,111,157,97,134,139,253,212,146,252,186,11,13,123, +122,1,197,131,242,242,131,254,98,78,73,8,6,98,120,129,24,54,88,64,26,61,58, +10,25,40,30,30,41,29,23,13,12,32,53,79,59,112,119,105,116,17,28,38,24,10, +85,25,36,28,22,11,11,31,54,87,0,1,0,16,255,236,4,86,5,150,0,61,0,232,185, +0,2,255,235,64,68,15,73,106,38,1,58,43,74,43,122,43,138,43,4,36,59,52,59, +68,59,116,59,132,59,5,46,55,55,4,57,45,51,110,20,24,15,14,26,15,3,20,37,110, +36,36,3,110,64,4,96,4,128,4,160,4,176,4,5,0,4,144,4,176,4,208,4,4,4,184,255, +192,64,94,24,27,72,4,48,24,81,25,57,15,81,54,15,16,31,16,127,16,143,16,159, +16,5,16,64,39,47,72,0,16,16,16,128,16,3,16,45,47,25,63,25,127,25,3,47,25, +63,25,175,25,207,25,4,47,25,175,25,2,25,25,0,40,115,216,37,1,124,37,140,37, +2,26,37,42,37,2,37,31,7,0,115,115,3,131,3,2,21,3,37,3,2,3,9,25,0,63,51,93, +93,237,63,51,93,93,93,237,18,57,47,93,113,114,51,220,93,43,113,50,237,50, +16,237,50,1,47,43,93,113,237,51,47,237,47,23,51,47,196,16,237,50,50,17,57, +47,196,49,48,0,93,93,93,43,37,50,54,55,23,14,3,35,34,46,2,39,35,55,51,46, +1,53,52,54,55,35,55,51,62,3,51,50,30,2,23,7,46,1,35,34,14,2,7,33,7,33,14, +1,21,20,22,23,33,7,33,30,3,2,179,100,120,14,185,13,63,103,147,97,120,177, +121,69,13,171,40,120,1,2,2,1,160,40,129,15,73,123,173,115,97,147,103,63,13, +185,14,121,106,68,106,79,50,11,1,190,40,254,99,2,1,2,2,1,196,40,254,108,9, +42,77,114,126,100,91,14,68,118,87,50,77,139,192,114,129,8,46,24,27,53,6,127, +122,189,130,67,50,87,118,68,14,91,100,39,87,137,99,127,16,47,23,22,37,19, +129,81,138,100,57,0,0,0,0,4,0,69,255,244,6,208,5,140,0,19,0,23,0,43,0,79, +0,192,64,14,118,20,134,20,2,121,22,137,22,2,133,47,1,66,184,255,232,64,9, +8,11,72,60,24,8,11,72,17,184,255,232,179,8,11,72,13,184,255,232,64,29,8,11, +72,7,24,8,11,72,3,24,8,11,72,22,23,20,21,74,180,73,73,52,180,53,178,63,23, +16,21,184,255,240,64,62,21,23,21,23,0,44,180,63,64,10,14,72,63,34,180,10, +178,0,180,0,24,16,24,32,24,80,24,96,24,208,24,224,24,240,24,8,24,38,52,1, +52,49,182,58,184,77,182,74,68,4,23,3,20,18,29,182,15,184,39,182,5,19,0,63, +237,244,237,63,63,63,51,237,244,237,51,93,1,47,93,253,244,237,47,43,237,18, +57,57,47,47,56,56,16,244,237,51,47,237,17,51,17,51,49,48,0,43,43,43,43,43, +43,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,19,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,20,30,2,51,50,54,55,23,14,3,35,34, +46,2,53,52,62,2,51,50,30,2,23,7,46,1,35,34,6,6,208,51,87,116,66,66,115,85, +49,48,86,117,68,66,115,85,50,251,59,155,3,154,157,149,22,43,63,40,42,64,44, +22,23,43,63,41,39,63,44,24,250,155,20,47,75,54,69,94,11,141,6,45,77,111,72, +94,132,82,38,59,97,124,65,68,106,76,48,9,143,10,83,75,108,87,1,178,125,171, +105,45,45,104,171,126,133,174,103,41,41,103,174,253,201,5,129,252,49,99,131, +78,32,33,78,131,98,95,128,79,34,34,79,128,2,124,75,124,90,50,82,87,9,54,99, +76,45,69,121,164,96,130,173,103,42,40,70,94,55,11,72,85,164,0,2,0,19,255, +236,2,126,5,149,0,39,0,55,0,185,64,9,138,32,1,53,40,14,17,72,26,184,255,232, +179,8,16,72,22,184,255,232,64,67,8,16,72,8,32,8,16,72,6,32,11,16,72,5,27, +21,27,2,5,21,21,21,2,3,4,4,29,16,40,32,40,2,96,40,112,40,128,40,192,40,4, +15,40,1,40,40,4,51,20,51,2,8,51,159,35,1,35,18,14,192,10,208,10,224,10,3, +10,184,255,192,179,34,38,72,10,184,255,192,64,26,7,11,72,10,79,57,1,18,51, +45,15,11,34,24,14,14,7,45,24,3,3,7,24,7,0,7,0,47,205,63,18,57,47,16,205,17, +57,47,18,57,57,205,17,57,57,1,93,47,43,43,93,198,51,205,93,50,0,94,93,1,51, +47,93,93,113,205,50,47,51,49,48,0,93,93,43,43,43,43,1,43,93,37,50,54,55,51, +14,1,35,34,38,61,1,14,1,7,53,62,1,55,17,52,62,2,51,50,30,2,21,20,14,2,7,21, +20,30,2,19,52,46,2,35,34,14,2,21,17,62,3,1,177,51,68,17,69,20,120,109,111, +127,32,66,34,35,66,31,25,59,98,72,52,79,53,27,44,79,110,66,19,32,42,115,14, +27,40,26,32,39,22,8,49,77,54,28,78,104,109,154,157,159,155,175,17,28,13,73, +14,29,16,2,75,59,108,83,49,42,78,111,69,99,180,152,118,38,244,57,83,54,26, +4,20,52,85,61,33,36,61,81,46,254,5,33,104,131,151,0,0,0,0,4,0,188,0,0,8,46, +5,129,0,19,0,35,0,55,0,59,0,244,64,124,141,0,1,0,24,13,16,72,61,0,1,25,0, +1,132,10,1,114,10,1,69,10,85,10,101,10,3,22,10,38,10,2,5,33,21,33,37,33,3, +4,29,20,29,2,11,24,27,24,2,11,22,27,22,2,47,61,1,58,20,73,36,19,73,16,0,16, +57,46,73,26,144,16,160,16,192,16,3,31,26,1,16,26,16,26,8,144,36,160,36,176, +36,3,47,36,1,0,36,1,36,10,1,7,73,48,8,64,8,80,8,3,0,8,16,8,32,8,144,8,4,8, +41,31,15,1,184,255,192,179,29,36,72,1,184,255,192,64,15,18,21,72,1,17,9,3, +51,23,192,57,208,57,2,57,184,255,192,64,21,35,44,72,57,56,11,64,29,36,72, +11,64,18,21,72,0,11,56,3,8,18,0,63,23,51,43,43,47,221,43,93,222,205,63,51, +51,43,43,63,205,1,47,93,113,237,50,50,47,93,93,93,18,57,57,47,47,93,93,16, +237,51,17,51,16,237,16,237,50,93,49,48,0,93,93,93,93,1,93,93,93,93,93,93, +43,93,33,1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,1,20,6,35,34, +38,53,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,53, +33,21,4,38,253,48,1,2,1,2,160,202,2,216,2,2,2,2,162,3,54,176,175,168,177, +43,87,131,88,93,131,84,39,159,24,47,69,45,46,71,48,25,26,48,67,41,46,72,50, +25,254,16,2,123,4,166,44,44,38,89,39,252,88,5,129,251,82,40,46,39,98,51,3, +156,250,127,2,178,188,203,201,190,91,145,101,53,53,100,145,92,81,107,64,26, +27,64,107,80,82,108,63,26,26,63,108,253,160,146,146,0,0,0,0,2,0,188,2,122, +7,25,5,129,0,39,0,47,0,148,64,9,9,24,19,23,72,136,9,1,8,184,255,232,64,16, +19,23,72,89,8,105,8,121,8,3,37,24,13,17,72,24,184,255,240,64,73,12,17,72, +44,41,196,42,24,21,196,64,22,224,22,2,22,22,0,64,47,1,47,0,42,16,42,64,42, +80,42,4,42,39,196,37,111,0,175,0,207,0,223,0,239,0,5,0,40,44,202,0,9,22,29, +4,0,42,32,42,80,42,128,42,4,42,2,15,23,37,15,3,45,3,0,63,23,51,17,51,204, +93,23,50,237,50,1,47,93,51,237,47,93,204,93,18,57,47,93,237,50,16,253,204, +49,48,43,43,93,43,93,43,1,17,53,6,7,14,1,7,3,35,3,46,1,39,38,39,6,21,6,20, +21,17,35,17,51,19,30,1,31,1,54,55,62,3,53,19,51,17,1,17,35,17,35,53,33,21, +6,155,5,4,4,5,2,230,108,163,2,24,14,17,20,1,1,128,190,223,2,5,2,6,20,16,7, +13,11,7,168,184,251,40,134,255,2,138,2,122,1,169,194,11,11,9,18,5,253,203, +1,157,5,64,38,44,55,10,10,8,18,6,253,201,3,7,253,205,4,13,7,18,51,41,18,34, +28,18,2,1,157,252,249,2,152,253,104,2,152,111,111,0,0,0,0,1,0,108,0,0,5,184, +5,150,0,57,0,221,64,95,101,36,1,101,22,1,157,49,1,143,49,1,49,16,11,15,72, +157,9,1,143,9,1,9,16,11,15,72,116,3,132,3,2,54,3,1,54,2,118,2,2,54,56,118, +56,2,116,55,132,55,2,54,55,1,42,26,1,42,32,1,41,53,48,40,10,18,32,40,96,40, +112,40,144,40,4,47,18,111,18,127,18,159,18,4,40,18,40,18,24,34,91,16,53,1, +53,184,255,192,64,65,23,29,72,191,53,207,53,2,0,53,48,53,2,53,17,5,91,31, +24,63,24,79,24,143,24,191,24,207,24,223,24,7,111,24,127,24,159,24,239,24, +255,24,5,0,24,48,24,2,8,24,10,15,19,39,48,5,42,95,18,41,18,29,95,0,4,0,63, +237,63,51,237,23,50,1,47,94,93,93,113,253,196,47,93,93,43,114,237,17,57,57, +47,47,93,93,17,51,17,51,16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43, +93,93,93,93,1,50,30,2,21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46, +2,35,34,14,2,21,20,30,2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,3,18, +151,241,168,90,59,109,157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116, +169,108,109,170,116,61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109, +59,90,168,241,5,150,86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51, +126,143,159,85,116,181,124,65,65,124,181,116,85,159,143,126,51,224,156,4, +2,3,2,54,138,167,191,106,147,234,162,86,0,0,0,2,0,88,255,222,4,124,4,72,0, +32,0,45,0,82,64,50,90,13,1,28,15,64,160,33,176,33,2,95,33,1,80,33,96,33,112, +33,3,33,47,128,32,47,1,45,208,17,1,17,5,16,45,45,22,39,10,16,22,21,27,1,6, +27,1,27,0,22,0,63,50,93,93,205,63,205,18,57,47,205,1,47,205,93,50,93,26,16, +220,93,113,113,26,205,50,49,48,93,5,34,46,2,53,52,62,2,51,50,30,2,21,33,17, +30,3,51,50,62,2,55,23,14,3,19,17,46,3,35,34,14,2,7,17,2,107,130,198,134,69, +95,152,189,95,112,194,142,81,252,197,22,64,78,88,46,75,116,93,76,35,72,36, +84,109,143,203,19,59,77,92,53,51,87,74,60,24,34,93,157,204,111,147,213,139, +66,79,146,210,130,254,156,24,45,35,20,31,60,87,56,42,57,100,76,44,2,138,1, +21,20,42,34,22,19,32,42,24,254,234,0,0,0,255,255,0,80,255,246,6,78,5,129, +16,38,0,121,0,0,16,39,2,20,2,249,0,0,17,7,2,144,3,204,253,206,0,63,64,40, +4,3,2,111,15,1,47,15,1,15,1,191,12,1,128,12,1,112,12,1,96,12,1,64,12,1,16, +12,1,12,98,64,11,11,72,4,3,2,60,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93, +53,17,93,93,53,53,53,0,0,0,255,255,0,61,255,246,6,78,5,141,16,39,2,20,2,249, +0,0,16,39,2,144,3,204,253,206,17,6,0,115,34,0,0,63,64,40,1,3,2,111,49,1,47, +49,1,49,0,191,1,1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,141,64,11,11,72, +1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53, +0,0,0,255,255,0,93,255,246,6,78,5,129,16,39,2,20,2,249,0,0,16,39,2,144,3, +204,253,206,17,6,2,142,40,0,0,63,64,40,1,3,2,111,49,1,47,49,1,49,0,191,1, +1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,126,64,11,11,72,1,3,2,49,24,0,63, +53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53,0,0,0,255,255,0,145, +255,246,6,78,5,129,16,39,2,20,2,189,0,0,16,39,2,144,3,204,253,206,17,6,2, +143,102,0,0,47,64,28,1,3,2,111,49,1,47,49,1,49,0,191,1,1,128,1,1,1,102,64, +11,11,72,1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,53,17,93,93,53,53,53,0,0, +0,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3,128,16,7,17,16,0,47, +205,1,47,205,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51,14, +1,7,33,21,2,129,29,59,31,72,58,130,82,82,130,58,72,31,59,29,3,221,1,41,34, +98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1,16,255,195,2,240,4,127, +0,17,0,26,64,10,15,64,0,0,15,12,3,17,128,7,0,47,26,205,204,50,57,57,1,47, +26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,35,1,213,34,98, +65,68,112,42,36,42,112,68,65,98,34,86,3,160,29,59,31,72,58,130,82,82,130, +58,72,31,59,29,252,35,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3, +128,7,17,16,17,0,47,205,1,47,221,26,204,50,57,57,49,48,1,46,1,39,51,30,1, +23,21,14,1,7,35,62,1,55,33,53,5,127,29,59,31,72,58,130,82,82,130,58,72,31, +59,29,252,35,1,127,34,98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1, +16,255,195,2,240,4,127,0,17,0,26,64,10,17,64,16,15,0,3,12,128,8,16,0,47,221, +26,204,50,57,57,1,47,26,205,49,48,37,62,1,55,21,14,1,7,35,46,1,39,53,30,1, +23,17,51,2,43,34,98,65,68,112,42,36,42,112,68,65,98,34,86,162,29,59,31,72, +58,130,82,82,130,58,72,31,59,29,3,221,0,0,1,1,162,0,100,6,94,2,68,0,31,0, +36,64,15,16,31,28,19,128,23,64,15,0,3,12,128,8,0,15,0,47,205,1,47,26,204, +50,57,57,26,221,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51, +14,1,7,33,46,1,39,51,30,1,23,21,14,1,7,35,62,1,55,2,129,29,59,31,72,58,130, +82,82,130,58,72,31,59,29,2,254,29,59,31,72,58,130,82,82,130,58,72,31,59,29, +1,41,34,98,65,68,112,42,36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112, +68,65,98,34,0,0,0,1,1,16,255,195,2,240,4,127,0,31,0,38,64,16,15,64,0,31,16, +19,28,128,24,64,0,15,12,3,128,7,0,47,26,204,50,57,57,26,221,26,204,50,57, +57,1,47,26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55, +21,14,1,7,35,46,1,39,53,30,1,23,1,213,34,98,65,68,112,42,36,42,112,68,65, +98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,3,160,29,59,31,72,58,130,82, +82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82,130,58,72,31,59,29,0, +2,1,16,255,72,2,240,4,127,0,3,0,35,0,40,64,17,1,19,0,4,35,20,23,32,28,3,0, +28,4,19,16,7,11,0,47,204,50,57,57,221,222,205,16,204,50,57,57,1,47,51,205, +50,49,48,5,33,21,33,19,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55, +21,14,1,7,35,46,1,39,53,30,1,23,1,16,1,224,254,32,197,34,98,65,68,112,42, +36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,104,80,4,88, +29,59,31,72,58,130,82,82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82, +130,58,72,31,59,29,0,0,2,0,56,255,229,3,186,5,197,0,47,0,69,0,222,64,93,156, +19,172,19,2,154,6,170,6,2,122,33,138,33,2,68,24,14,17,72,85,20,101,20,149, +20,165,20,4,140,7,1,74,7,90,7,122,7,3,74,56,90,56,2,67,56,11,15,72,58,67, +1,42,12,58,12,74,12,3,37,45,53,45,149,45,165,45,4,32,39,48,39,2,39,39,15, +169,48,249,48,2,40,48,1,48,28,0,70,64,96,31,1,31,184,255,192,64,64,18,21, +72,15,31,1,31,64,12,17,72,31,71,128,60,71,63,15,1,15,64,12,17,72,15,79,71, +1,39,34,80,43,53,81,27,0,22,64,22,128,22,192,22,4,7,22,22,47,43,111,43,223, +43,3,15,43,191,43,2,43,65,80,10,22,0,63,237,47,93,113,57,47,94,93,51,237, +16,237,50,1,93,47,43,93,237,26,16,220,43,93,43,113,26,237,51,51,113,113,18, +57,47,93,49,48,0,93,1,93,93,43,0,93,1,93,93,0,93,1,43,93,93,93,1,20,14,2, +7,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,51,62,1,53,52,38,35,34,14,2,7, +55,62,1,51,50,30,2,3,46,3,35,34,14,4,21,20,30,2,51,50,62,2,3,186,7,13,18, +11,31,96,130,162,97,93,127,78,35,22,47,73,102,132,83,42,77,64,50,16,4,1,3, +130,129,28,59,58,55,22,36,42,116,67,113,154,94,41,211,8,36,51,64,36,53,86, +67,49,32,15,21,42,65,44,66,108,83,56,3,170,46,104,106,106,48,128,206,144, +77,63,107,138,75,60,143,144,134,104,63,26,48,67,42,25,58,34,196,209,11,19, +28,17,147,23,39,88,149,195,254,147,42,74,55,32,51,84,110,116,116,48,53,91, +67,38,99,161,205,0,0,0,2,0,4,0,0,4,225,5,129,0,5,0,18,0,244,64,27,74,7,90, +7,106,7,3,69,17,85,17,101,17,3,3,56,8,1,55,16,1,6,24,14,17,72,18,184,255, +232,64,157,14,17,72,102,2,1,39,2,71,2,87,2,3,105,1,1,40,1,72,1,88,1,3,2,1, +12,12,0,6,59,3,1,20,3,1,244,3,1,107,3,155,3,187,3,235,3,4,52,3,84,3,2,0,3, +1,11,2,3,18,15,0,31,0,47,0,3,18,0,15,20,47,20,127,20,3,175,20,191,20,223, +20,255,20,4,32,20,112,20,144,20,3,15,20,63,20,143,20,3,58,175,20,207,20,223, +20,255,20,4,64,20,96,20,144,20,3,15,20,95,20,2,143,20,159,20,191,20,223,20, +4,0,20,32,20,80,20,112,20,4,0,3,6,3,18,95,5,18,12,32,19,22,72,153,12,1,12, +1,3,0,63,51,93,43,63,237,23,50,1,93,93,113,114,114,94,93,113,113,114,47,94, +93,51,47,95,94,93,93,93,93,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93, +43,43,93,93,95,93,93,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,5,2,5,217,1,254, +251,35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12, +141,156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,0,1,0,235,254,78,5,172,5, +129,0,7,0,54,64,36,3,90,79,4,175,4,191,4,207,4,4,4,7,90,32,0,1,15,0,1,0,0, +32,0,192,0,208,0,4,0,2,95,5,3,4,0,0,47,50,63,237,1,47,93,113,113,237,47,93, +237,49,48,1,17,33,17,35,17,33,17,4,244,252,182,191,4,193,254,78,6,145,249, +111,7,51,248,205,0,0,0,0,1,0,154,254,78,5,48,5,129,0,11,0,170,64,9,134,8, +150,8,2,163,9,1,9,184,255,192,64,26,13,16,72,163,7,1,2,144,7,1,114,7,130, +7,2,100,7,1,53,7,69,7,85,7,3,3,184,255,240,64,74,9,17,72,41,1,57,1,2,1,16, +12,17,72,8,143,6,159,6,175,6,3,2,72,17,73,15,2,127,2,2,2,6,2,6,0,207,10,1, +0,10,64,10,2,10,7,3,9,3,9,207,0,1,0,0,64,0,2,7,0,32,13,1,3,7,95,2,8,0,4,3, +1,9,95,0,0,47,237,57,63,18,57,57,237,57,1,93,47,94,93,93,51,51,47,47,51,47, +93,93,18,57,57,47,47,93,43,93,51,49,48,0,43,93,43,1,93,93,93,93,95,93,43, +93,93,19,53,9,1,53,33,21,33,9,1,33,21,154,2,123,253,149,4,66,252,178,2,72, +253,168,3,162,254,78,109,3,48,3,44,106,152,253,4,252,249,152,0,0,0,0,1,0, +101,2,96,4,72,2,242,0,3,0,32,64,20,0,2,32,2,80,2,112,2,4,2,16,0,32,0,2,0, +0,173,1,179,0,63,237,1,47,93,47,93,49,48,19,53,33,21,101,3,227,2,96,146,146, +0,0,0,0,1,0,51,255,242,4,98,6,84,0,8,0,185,185,0,0,255,232,64,135,14,17,72, +9,1,57,1,73,1,3,9,1,0,4,6,1,6,6,8,16,111,8,143,8,175,8,207,8,239,8,5,15,8, +47,8,79,8,111,8,143,8,5,8,95,2,1,2,2,15,3,47,3,79,3,111,3,4,11,3,175,10,1, +48,10,80,10,112,10,144,10,4,111,10,143,10,2,16,10,48,10,2,240,10,1,15,10, +47,10,79,10,3,57,239,10,1,176,10,208,10,2,143,10,175,10,207,10,239,10,4,112, +10,1,47,10,79,10,111,10,143,10,175,10,5,2,175,31,5,1,5,5,1,7,179,6,1,0,47, +51,63,18,57,47,93,237,1,93,113,113,114,114,94,93,93,113,113,114,114,47,94, +93,51,47,93,47,93,113,56,57,61,47,93,51,51,49,48,94,93,43,5,35,1,35,53,33, +19,1,51,2,110,106,254,229,182,1,14,242,1,174,129,14,3,24,117,253,78,5,135, +0,3,0,87,0,203,5,93,3,215,0,35,0,51,0,67,0,114,64,75,137,50,1,53,67,69,67, +2,10,15,1,10,3,1,5,33,1,5,21,1,39,26,8,52,4,18,0,0,47,32,47,64,47,112,47, +4,47,60,18,36,224,55,1,55,23,42,239,65,1,65,8,39,52,26,4,5,63,13,1,13,64, +18,21,72,0,13,80,13,2,13,31,15,23,1,23,0,47,93,51,220,93,43,113,50,23,57, +205,93,50,16,205,93,50,1,47,205,47,93,205,17,23,57,49,48,0,93,93,93,93,93, +1,93,1,20,14,2,35,34,38,39,14,3,35,34,46,2,53,52,62,2,51,50,22,23,62,3,51, +50,30,2,37,34,6,7,30,1,51,50,62,2,53,52,46,2,5,46,1,35,34,14,2,21,20,30,2, +51,50,54,5,93,44,82,115,70,97,168,70,32,75,84,90,46,69,115,83,46,44,82,116, +71,94,168,67,31,75,84,94,51,69,114,81,45,254,179,70,119,56,51,119,77,43,71, +51,27,29,51,71,254,93,51,119,78,43,70,49,27,25,48,71,47,70,120,2,78,78,141, +106,62,133,149,63,102,72,39,55,100,143,89,81,142,104,60,135,148,62,102,73, +40,55,101,143,168,126,130,128,128,40,70,94,54,54,92,69,39,250,128,128,40, +70,94,54,51,93,69,41,126,0,0,0,1,1,152,0,0,6,96,4,199,0,5,0,13,179,2,5,2, +5,0,47,205,1,47,205,49,48,1,51,17,33,21,33,1,152,94,4,106,251,56,4,199,251, +151,94,0,0,0,0,1,1,22,255,254,4,170,4,8,0,25,0,35,64,18,75,22,91,22,2,75, +16,91,16,2,25,0,12,13,13,0,19,6,0,47,205,47,51,1,47,205,47,205,49,48,0,93, +93,5,17,52,62,2,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,17,1,22,68,122, +167,98,99,169,123,70,103,53,95,130,78,78,130,94,52,2,2,0,116,192,138,76,76, +138,192,116,254,0,2,2,98,155,108,57,56,108,156,100,254,0,0,0,1,255,158,254, +78,2,148,5,227,0,35,2,3,64,30,10,34,26,34,42,34,3,5,16,21,16,37,16,3,9,3, +218,37,1,201,37,1,154,37,170,37,186,37,3,37,184,1,0,64,162,225,228,72,76, +37,1,0,47,37,63,37,2,9,37,1,220,37,64,211,217,72,37,64,205,209,72,134,37, +1,25,37,41,37,57,37,3,11,37,1,251,37,1,233,37,1,37,64,188,191,72,107,37,123, +37,139,37,3,93,37,1,75,37,1,41,37,57,37,2,27,37,1,9,37,1,249,37,1,37,128, +170,177,72,109,37,1,37,128,164,168,72,9,37,1,163,37,128,156,162,72,189,37, +1,121,37,153,37,169,37,3,75,37,91,37,107,37,3,37,192,140,147,72,155,37,171, +37,187,37,3,125,37,141,37,2,107,37,1,93,37,1,38,37,54,37,70,37,3,228,37,1, +214,37,1,180,37,196,37,2,6,37,1,112,37,184,255,192,64,110,119,122,72,37,64, +101,107,72,219,37,1,118,37,166,37,2,9,37,25,37,41,37,3,233,37,1,37,64,79, +82,72,37,128,74,78,72,25,37,41,37,2,11,37,1,251,37,1,217,37,233,37,2,171, +37,187,37,203,37,3,153,37,1,37,128,60,63,72,41,37,57,37,73,37,3,11,37,27, +37,2,55,233,37,249,37,2,187,37,203,37,219,37,3,141,37,157,37,173,37,3,123, +37,1,109,37,1,1,95,37,1,37,184,255,128,179,39,43,72,37,184,255,192,64,13, +34,38,72,144,37,160,37,2,2,16,37,1,37,184,255,192,64,46,28,31,72,223,37,1, +96,37,112,37,160,37,176,37,192,37,5,15,37,31,37,47,37,3,7,32,22,144,22,2, +22,22,31,70,12,47,4,159,4,2,4,4,32,12,1,12,184,255,192,64,15,16,19,72,12, +25,80,64,18,128,18,2,18,7,80,0,0,47,237,47,93,237,1,47,43,93,51,47,93,16, +237,50,47,93,94,93,93,93,43,113,95,113,43,43,114,95,114,114,114,114,114,94, +93,93,43,93,93,93,93,113,113,43,43,113,114,114,114,43,43,94,93,93,93,93,113, +113,113,113,113,43,114,114,114,43,94,93,43,93,43,93,113,113,113,113,113,113, +43,113,113,114,114,114,43,43,94,93,93,95,93,43,93,93,93,49,48,0,95,94,93, +93,19,34,38,39,53,30,1,51,50,62,2,53,3,52,62,2,51,50,22,23,21,46,1,35,34, +14,2,21,17,20,14,2,36,36,75,23,20,62,35,51,66,39,16,2,50,90,125,75,34,75, +22,18,61,36,51,66,39,16,50,89,124,254,78,11,8,147,8,16,37,64,84,48,4,188, +94,134,86,40,9,9,148,10,17,40,65,84,44,251,66,94,134,86,41,0,0,0,2,0,56,1, +80,4,44,3,244,0,33,0,67,1,31,64,26,36,16,12,16,72,2,16,12,16,72,65,24,11, +17,72,66,48,9,17,72,61,48,9,17,72,42,184,255,208,179,9,17,72,48,184,255,208, +64,19,9,17,72,31,24,9,17,72,32,48,9,17,72,26,48,9,17,72,13,184,255,232,179, +13,17,72,14,184,255,208,179,9,13,72,8,184,255,208,179,14,17,72,8,184,255, +208,64,41,9,12,72,63,16,28,48,28,80,28,3,0,28,16,28,64,28,96,28,128,28,160, +28,240,28,7,28,45,11,64,12,17,72,11,47,69,1,59,173,64,45,184,255,192,180, +35,60,72,45,34,184,255,192,179,23,28,72,34,184,255,192,64,27,16,20,72,34, +128,62,64,41,60,72,62,40,173,143,49,1,32,49,48,49,2,49,15,25,173,64,11,184, +255,192,180,39,60,72,11,0,184,255,192,179,23,28,72,0,184,255,192,64,29,16, +20,72,0,128,28,64,41,60,72,28,6,173,15,15,207,15,2,15,64,23,28,72,15,64,11, +19,72,15,0,47,43,43,93,237,196,43,26,221,43,43,196,43,26,237,16,220,93,93, +237,196,43,26,221,43,43,196,43,26,237,1,93,47,43,51,47,93,113,51,49,48,0, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,1,34,38,39,46,1,35,34,14,2,7,53, +62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,34,38,39,46,1,35,34,14,2,7, +53,62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,40,69,145,73,65,107,45,38, +65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68, +40,69,145,73,65,107,45,38,65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51, +23,69,123,52,32,59,61,68,2,246,43,26,22,23,12,22,33,21,144,37,47,13,21,27, +13,8,15,14,8,51,43,149,23,30,19,8,254,90,44,26,23,24,12,23,32,21,141,38,46, +13,20,26,13,8,15,14,8,50,42,147,23,32,19,8,0,1,0,65,0,55,4,36,5,16,0,19,0, +162,64,108,53,2,1,58,11,1,60,12,1,42,12,1,3,3,6,7,10,11,2,11,0,17,16,13,12, +1,12,12,11,1,2,4,9,19,100,14,116,14,2,80,14,1,2,48,14,1,0,14,16,14,32,14, +96,14,4,14,4,111,9,127,9,2,95,9,111,9,2,9,16,7,8,173,9,0,1,2,3,4,4,173,17, +6,31,5,47,5,95,5,111,5,223,5,5,5,10,11,12,13,4,80,9,208,9,2,15,9,1,9,0,47, +93,93,23,51,222,93,50,50,237,23,50,16,237,50,50,1,47,93,113,51,47,93,113, +95,113,113,51,18,23,57,16,135,192,192,192,192,16,135,192,192,192,192,49,48, +1,95,93,93,93,93,1,3,35,19,35,53,33,19,33,53,33,19,51,3,33,21,33,3,33,21, +1,192,152,145,151,237,1,55,190,254,11,2,61,154,143,152,1,21,254,162,191,2, +29,1,88,254,223,1,33,148,1,108,148,1,36,254,220,148,254,148,148,0,0,0,0,3, +0,100,0,244,4,71,4,80,0,3,0,7,0,11,0,49,64,27,11,7,2,8,4,0,8,173,9,9,1,5, +173,63,4,1,4,0,173,15,1,31,1,63,1,3,1,0,47,93,237,47,93,237,17,57,47,237, +1,47,51,51,47,51,51,49,48,19,53,33,21,1,53,33,21,1,53,33,21,100,3,227,252, +29,3,227,252,29,3,227,3,188,148,148,253,56,148,148,1,100,148,148,0,0,0,2, +0,63,0,0,4,36,4,207,0,6,0,10,0,123,185,0,5,255,216,64,17,18,22,72,3,40,18, +22,72,0,40,18,22,72,137,0,1,1,184,255,216,64,63,18,22,72,134,1,1,10,48,2, +80,2,2,0,2,16,2,32,2,64,2,96,2,128,2,160,2,7,2,7,7,0,64,12,15,72,0,8,173, +7,79,6,95,6,143,6,3,6,64,2,80,2,128,2,3,2,1,0,80,4,128,4,2,4,0,25,47,93,51, +51,205,93,205,93,24,47,237,1,47,43,51,47,47,93,113,51,49,48,0,93,43,93,43, +43,43,19,53,1,21,9,1,21,5,53,33,21,65,3,227,252,166,3,90,252,27,3,227,2,119, +205,1,139,154,254,168,254,168,153,236,145,145,0,0,2,0,65,0,0,4,36,4,207,0, +6,0,10,0,121,185,0,1,255,216,64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137, +6,1,5,184,255,216,64,62,18,22,72,134,5,1,9,48,6,80,6,2,0,6,16,6,32,6,64,6, +96,6,128,6,160,6,7,6,7,0,64,12,15,72,0,8,173,7,6,5,64,4,80,4,128,4,3,4,79, +0,95,0,143,0,3,0,80,2,128,2,2,2,0,25,47,93,205,93,205,93,51,51,24,47,237, +1,47,43,51,47,93,113,51,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21,1,53, +33,21,65,3,90,252,166,3,227,252,29,3,227,236,153,1,88,1,88,154,254,117,205, +253,137,145,145,0,0,0,0,2,0,157,0,0,4,55,4,129,0,4,0,9,0,35,64,18,105,9,121, +9,2,105,7,121,7,2,6,4,5,0,2,8,5,0,0,47,205,47,205,1,47,205,221,205,49,48, +0,93,93,51,17,9,1,17,37,33,17,9,1,157,1,205,1,205,252,182,2,250,254,131,254, +131,2,123,2,6,253,250,253,133,82,2,6,1,170,254,86,0,0,0,0,1,0,100,0,180,4, +71,2,242,0,5,0,19,183,5,170,0,2,0,4,173,1,0,47,237,47,1,47,47,237,49,48,55, +17,33,21,33,17,100,3,227,252,174,180,2,62,146,254,84,0,0,0,1,2,34,253,154, +3,210,6,170,0,23,0,29,182,4,32,8,11,72,9,0,184,1,0,180,1,19,12,6,1,0,47,47, +205,205,1,47,237,204,49,48,43,1,35,17,52,55,54,51,50,22,21,20,6,35,34,39, +46,1,39,38,35,34,7,6,21,2,181,147,84,82,128,63,75,51,37,30,13,8,26,20,33, +16,36,9,6,253,154,7,86,196,123,123,63,48,40,52,10,4,24,22,39,39,35,105,0, +0,0,1,1,5,253,154,2,181,6,170,0,28,0,32,185,0,4,255,224,180,8,11,72,12,2, +184,1,0,180,28,24,17,7,0,0,47,47,205,205,1,47,253,204,49,48,43,1,51,17,20, +7,14,1,35,34,46,2,53,52,62,2,51,50,23,30,1,23,22,51,50,55,54,53,2,34,147, +90,40,103,62,30,50,37,20,14,23,31,18,33,26,5,21,15,31,16,37,8,7,6,170,248, +168,205,125,56,54,16,29,39,24,20,34,24,14,16,2,23,20,37,41,31,106,0,0,0,1, +255,246,2,37,5,181,2,182,0,3,0,22,180,3,5,0,4,0,184,1,2,177,1,252,0,63,237, +17,1,51,17,51,49,48,3,53,33,21,10,5,191,2,37,145,145,0,0,1,1,216,253,147, +2,105,7,72,0,3,0,24,187,0,2,1,0,0,3,1,6,180,4,3,254,0,250,0,63,63,1,16,246, +237,49,48,1,51,17,35,1,216,145,145,7,72,246,75,0,0,0,1,2,141,253,147,5,181, +2,182,0,5,0,34,178,2,7,3,186,1,0,0,0,1,6,179,6,5,254,3,184,1,2,177,0,252, +0,63,237,63,1,16,246,237,17,51,49,48,1,33,21,33,17,35,2,141,3,40,253,105, +145,2,182,145,251,110,0,0,0,1,255,246,253,147,3,30,2,182,0,5,0,34,187,0,2, +1,0,0,5,1,6,181,6,0,6,4,254,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16,246, +237,49,48,3,53,33,17,35,17,10,3,40,145,2,37,145,250,221,4,146,0,0,0,0,1,2, +141,2,37,5,181,7,72,0,5,0,34,178,4,7,2,189,1,0,0,5,1,6,0,6,0,5,1,2,179,2, +252,0,250,0,63,63,237,1,16,246,237,17,51,49,48,1,51,17,33,21,33,2,141,145, +2,151,252,216,7,72,251,110,145,0,0,0,1,255,246,2,37,3,30,7,72,0,5,0,34,187, +0,5,1,0,0,2,1,6,181,6,0,6,3,250,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16, +244,237,49,48,3,53,33,17,51,17,10,2,151,145,2,37,145,4,146,250,221,0,0,0, +0,1,2,141,253,147,5,181,7,72,0,7,0,39,179,4,9,5,1,186,1,0,0,0,1,6,179,8,7, +254,5,184,1,2,179,2,252,0,250,0,63,63,237,63,1,16,246,237,50,17,51,49,48, +1,51,17,33,21,33,17,35,2,141,145,2,151,253,105,145,7,72,251,110,145,251,110, +0,1,255,246,253,147,3,30,7,72,0,7,0,39,177,7,4,186,1,0,0,2,1,6,183,8,0,8, +6,254,3,250,7,184,1,2,177,2,252,0,63,237,63,63,17,1,51,16,244,237,51,49,48, +3,53,33,17,51,17,35,17,10,2,151,145,145,2,37,145,4,146,246,75,4,146,0,0,1, +255,246,253,147,5,181,2,182,0,7,0,40,178,3,9,4,186,1,0,0,7,1,6,182,8,0,8, +6,254,4,0,184,1,2,177,1,252,0,63,237,50,63,17,1,51,16,246,237,17,51,49,48, +3,53,33,21,33,17,35,17,10,5,191,253,105,145,2,37,145,145,251,110,4,146,0, +1,255,246,2,37,5,181,7,72,0,7,0,40,178,7,9,5,186,1,0,0,2,1,6,182,8,0,8,3, +250,5,0,184,1,2,177,1,252,0,63,237,51,63,17,1,51,16,244,237,17,51,49,48,3, +53,33,17,51,17,33,21,10,2,151,145,2,151,2,37,145,4,146,251,110,145,0,1,255, +246,253,147,5,181,7,72,0,11,0,51,179,7,13,5,8,187,1,0,0,2,0,11,1,6,64,9,12, +0,12,10,254,3,250,8,11,184,1,2,178,5,2,252,0,63,51,237,50,63,63,17,1,51,16, +246,50,237,50,17,51,49,48,3,53,33,17,51,17,33,21,33,17,35,17,10,2,151,145, +2,151,253,105,145,2,37,145,4,146,251,110,145,251,110,4,146,0,0,0,2,255,246, +1,113,5,181,3,106,0,3,0,7,0,37,183,3,7,7,9,0,4,8,4,184,1,2,178,5,253,0,184, +1,2,177,1,251,0,63,237,63,237,17,1,51,50,17,51,17,51,49,48,3,53,33,21,1,53, +33,21,10,5,191,250,65,5,191,2,217,145,145,254,152,145,145,0,2,1,217,253,147, +3,210,7,72,0,3,0,7,0,42,65,9,0,5,1,0,0,4,1,7,0,8,0,1,1,0,0,0,1,4,182,8,7, +3,254,4,0,250,0,63,50,63,51,1,16,246,237,16,244,237,49,48,1,51,17,35,1,51, +17,35,1,217,145,145,1,104,145,145,7,72,246,75,9,181,246,75,0,0,0,1,2,141, +253,147,5,181,3,106,0,9,0,49,181,2,6,6,11,7,3,186,1,0,0,0,1,6,179,10,9,254, +7,184,1,2,178,4,253,3,184,1,2,177,0,251,0,63,237,63,237,63,1,16,246,237,50, +17,51,17,51,49,48,1,33,21,33,21,33,21,33,17,35,2,141,3,40,253,105,2,151,253, +105,145,3,106,145,215,145,252,34,0,0,1,1,217,253,147,5,181,2,182,0,9,0,51, +178,1,11,6,191,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,178,10,2,6,184,1,2,180,9, +252,4,8,254,0,63,51,63,237,50,1,16,244,237,16,246,237,17,51,49,48,1,21,33, +17,35,17,35,17,35,17,5,181,254,29,145,215,145,2,182,145,251,110,4,146,251, +110,5,35,0,0,0,0,2,1,217,253,147,5,181,3,106,0,5,0,11,0,63,180,2,8,8,13,9, +65,11,1,0,0,6,1,7,0,12,0,3,1,0,0,0,1,4,0,12,0,9,1,2,181,6,253,11,5,254,3, +184,1,2,177,0,251,0,63,237,63,51,63,237,1,16,246,237,16,244,237,17,51,17, +51,49,48,1,33,21,33,17,35,1,33,21,33,17,35,1,217,3,220,252,181,145,1,104, +2,116,254,29,145,3,106,145,250,186,4,111,145,252,34,0,0,1,255,246,253,147, +3,30,3,106,0,9,0,49,177,9,6,186,1,0,0,3,1,6,183,10,4,0,0,10,8,254,3,184,1, +2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63,17,1,51,17,51,16,244,237, +51,49,48,3,53,33,53,33,53,33,17,35,17,10,2,151,253,105,3,40,145,1,113,145, +215,145,250,41,3,222,0,0,0,1,255,246,253,147,3,210,2,182,0,9,0,52,65,9,0, +6,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,183,10,0,10,4,8,254,6,0,184,1,2,177,1, +252,0,63,237,50,63,51,17,1,51,16,244,237,16,246,237,49,48,3,53,33,17,35,17, +35,17,35,17,10,3,220,145,215,145,2,37,145,250,221,4,146,251,110,4,146,0,0, +0,0,2,255,246,253,147,3,210,3,106,0,5,0,11,0,63,180,4,9,9,12,11,65,11,1,0, +0,8,1,4,0,12,0,0,1,0,0,3,1,7,0,12,0,9,1,2,181,10,253,2,7,254,4,184,1,2,177, +5,251,0,63,237,63,51,63,237,1,16,244,237,16,246,237,17,51,17,51,49,48,1,17, +35,17,33,53,1,35,17,33,53,33,3,210,145,252,181,2,116,145,254,29,2,116,3,106, +250,41,5,70,145,250,41,3,222,145,0,0,1,2,141,1,113,5,181,7,72,0,9,0,49,181, +4,8,8,11,2,6,189,1,0,0,9,1,6,0,10,0,9,1,2,178,6,253,5,184,1,2,179,2,251,0, +250,0,63,63,237,63,237,1,16,246,237,50,17,51,17,51,49,48,1,51,17,33,21,33, +21,33,21,33,2,141,145,2,151,253,105,2,151,252,216,7,72,252,34,145,215,145, +0,0,1,1,217,2,37,5,181,7,72,0,9,0,52,178,4,11,2,65,11,1,0,0,9,1,7,0,10,0, +8,1,0,0,5,1,4,0,10,0,5,1,2,181,2,8,252,0,6,250,0,63,51,63,51,237,1,16,246, +237,16,244,237,17,51,49,48,1,51,17,33,21,33,17,51,17,51,3,65,145,1,227,252, +36,145,215,7,72,251,110,145,5,35,251,110,0,0,0,2,1,217,1,113,5,181,7,72,0, +5,0,11,0,63,180,10,4,4,13,8,65,11,1,0,0,11,1,7,0,12,0,2,1,0,0,5,1,4,0,12, +0,11,1,2,178,8,251,5,184,1,2,180,2,253,6,0,250,0,63,50,63,237,63,237,1,16, +246,237,16,244,237,17,51,17,51,49,48,1,51,17,33,21,33,1,51,17,33,21,33,1, +217,145,3,75,252,36,1,104,145,1,227,253,140,7,72,250,186,145,5,215,252,34, +145,0,0,1,255,246,1,113,3,30,7,72,0,9,0,50,188,0,9,1,0,0,6,0,2,1,6,183,10, +4,0,0,10,7,250,3,184,1,2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63, +17,1,51,17,51,16,244,50,237,49,48,3,53,33,53,33,53,33,17,51,17,10,2,151,253, +105,2,151,145,1,113,145,215,145,3,222,250,41,0,0,1,255,246,2,37,3,210,7,72, +0,9,0,52,65,9,0,0,1,0,0,7,1,7,0,10,0,6,1,0,0,3,1,4,183,10,1,10,8,4,250,6, +1,184,1,2,177,2,252,0,63,237,51,63,51,17,1,51,16,244,237,16,244,237,49,48, +1,33,53,33,17,51,17,51,17,51,3,210,252,36,1,227,145,215,145,2,37,145,4,146, +251,110,4,146,0,0,0,2,255,246,1,113,3,210,7,72,0,5,0,11,0,63,65,9,0,8,1,0, +0,11,1,4,0,12,0,0,1,0,0,3,1,7,181,12,9,1,1,12,9,184,1,2,181,10,251,4,6,250, +1,184,1,2,177,2,253,0,63,237,63,51,63,237,17,1,51,17,51,16,244,237,16,244, +237,49,48,1,33,53,33,17,51,33,51,17,33,53,33,3,210,252,36,3,75,145,254,7, +145,253,140,1,227,1,113,145,5,70,251,145,145,0,0,0,0,1,2,141,253,147,5,181, +7,72,0,11,0,54,182,4,8,8,13,6,2,10,186,1,0,0,11,1,6,179,12,11,254,9,184,1, +2,178,6,253,5,184,1,2,179,2,251,0,250,0,63,63,237,63,237,63,1,16,246,237, +50,50,17,51,17,51,49,48,1,51,17,33,21,33,21,33,21,33,17,35,2,141,145,2,151, +253,105,2,151,253,105,145,7,72,252,34,145,215,145,252,34,0,0,0,0,2,1,217, +253,147,5,181,7,72,0,7,0,11,0,56,178,4,13,10,186,1,0,0,11,1,4,178,12,2,6, +186,1,0,0,7,1,7,183,12,7,11,254,0,8,250,5,184,1,2,177,2,252,0,63,237,63,51, +63,51,1,16,244,237,50,16,246,237,17,51,49,48,1,51,17,33,21,33,17,35,1,51, +17,35,3,65,145,1,227,254,29,145,254,152,145,145,7,72,251,110,145,251,110, +9,181,246,75,0,0,3,1,217,253,147,5,181,7,72,0,3,0,9,0,15,0,73,181,14,6,6, +17,12,8,65,12,1,0,0,15,0,9,1,7,0,16,0,0,1,0,0,1,1,4,0,16,0,15,1,2,178,12, +251,7,184,1,2,183,4,253,10,2,250,9,1,254,0,63,51,63,51,63,237,63,237,1,16, +246,237,16,244,50,237,50,17,51,17,51,49,48,1,35,17,51,19,33,21,33,17,35,17, +51,17,33,21,33,2,106,145,145,215,2,116,254,29,145,145,1,227,253,140,253,147, +9,181,250,186,145,252,34,9,181,252,34,145,0,1,255,246,253,147,3,30,7,72,0, +11,0,56,185,0,9,1,0,178,6,2,10,184,1,6,64,10,12,4,0,0,12,10,254,7,250,3,184, +1,2,178,6,251,11,184,1,2,177,2,253,0,63,237,63,237,63,63,17,1,51,17,51,16, +246,50,50,237,49,48,3,53,33,53,33,53,33,17,51,17,35,17,10,2,151,253,105,2, +151,145,145,1,113,145,215,145,3,222,246,75,3,222,0,0,0,2,255,246,253,147, +3,210,7,72,0,7,0,11,0,59,65,10,0,10,1,0,0,11,1,7,0,12,0,5,1,0,0,2,0,6,1,4, +64,10,12,0,12,11,6,254,8,3,250,7,184,1,2,177,2,252,0,63,237,63,51,63,51,17, +1,51,16,246,50,237,16,244,237,49,48,3,53,33,17,51,17,35,17,1,51,17,35,10, +1,227,145,145,1,104,145,145,2,37,145,4,146,246,75,4,146,5,35,246,75,0,0,0, +0,3,255,246,253,147,3,210,7,72,0,3,0,9,0,15,0,73,181,7,13,13,16,6,10,65,12, +1,0,0,9,0,11,1,4,0,16,0,2,1,0,0,3,1,7,0,16,0,12,1,2,181,15,253,3,11,254,6, +184,1,2,180,9,251,0,4,250,0,63,51,63,237,63,51,63,237,1,16,244,237,16,246, +50,237,50,17,51,17,51,49,48,1,51,17,35,1,51,17,33,53,33,19,35,17,33,53,33, +3,65,145,145,254,152,145,253,140,1,227,145,145,254,29,2,116,7,72,246,75,9, +181,251,145,145,250,41,3,222,145,0,0,0,2,255,246,253,147,5,181,3,106,0,7, +0,11,0,57,180,11,3,3,13,4,186,1,0,0,7,1,6,181,12,8,0,0,12,8,184,1,2,181,9, +251,6,254,4,0,184,1,2,177,1,253,0,63,237,50,63,63,237,17,1,51,17,51,16,246, +237,17,51,17,51,49,48,3,53,33,21,33,17,35,17,1,53,33,21,10,5,191,253,105, +145,253,105,5,191,1,113,145,145,252,34,3,222,1,104,145,145,0,0,1,255,246, +253,147,5,181,2,182,0,11,0,58,178,3,13,8,191,1,0,0,11,1,4,0,12,0,4,1,0,0, +7,1,7,64,9,12,0,12,6,10,254,8,4,0,184,1,2,177,1,252,0,63,237,50,50,63,51, +17,1,51,16,244,237,16,246,237,17,51,49,48,3,53,33,21,33,17,35,17,35,17,35, +17,10,5,191,254,29,145,215,145,2,37,145,145,251,110,4,146,251,110,4,146,0, +3,255,246,253,147,5,181,3,106,0,5,0,11,0,15,0,74,180,13,8,8,17,9,186,1,0, +0,6,1,7,181,16,14,3,3,16,5,189,1,0,0,2,1,4,0,16,0,14,1,2,179,15,251,9,3,184, +1,2,181,6,4,253,11,1,254,0,63,51,63,51,237,50,63,237,1,16,246,237,17,51,17, +51,16,244,237,17,51,17,51,49,48,1,35,17,33,53,33,51,33,21,33,17,35,1,21,33, +53,2,106,145,254,29,2,116,215,2,116,254,29,145,2,116,250,65,253,147,3,222, +145,145,252,34,5,215,145,145,0,0,0,0,2,255,246,1,113,5,181,7,72,0,7,0,11, +0,58,64,9,7,11,11,13,0,8,8,12,5,189,1,0,0,2,1,6,0,12,0,8,1,2,181,9,253,3, +250,5,0,184,1,2,177,1,251,0,63,237,51,63,63,237,1,16,244,237,17,51,17,51, +17,51,17,51,49,48,3,53,33,17,51,17,33,21,1,53,33,21,10,2,151,145,2,151,250, +65,5,191,2,217,145,3,222,252,34,145,254,152,145,145,0,1,255,246,2,37,5,181, +7,72,0,11,0,58,178,11,13,9,191,1,0,0,6,1,7,0,12,0,5,1,0,0,2,1,4,64,9,12,0, +12,7,3,250,9,5,0,184,1,2,177,1,252,0,63,237,51,51,63,51,17,1,51,16,244,237, +16,244,237,17,51,49,48,3,53,33,17,51,17,51,17,51,17,33,21,10,1,227,145,215, +145,1,227,2,37,145,4,146,251,110,4,146,251,110,145,0,3,255,246,1,113,5,181, +7,72,0,5,0,11,0,15,0,76,64,9,4,15,15,17,9,12,12,16,8,65,11,1,0,0,11,1,4,0, +16,0,2,1,0,0,5,1,7,0,16,0,12,1,2,179,13,253,5,9,184,1,2,181,2,10,251,0,6, +250,0,63,51,63,51,237,50,63,237,1,16,244,237,16,244,237,17,51,17,51,17,51, +17,51,49,48,1,51,17,33,21,33,1,51,17,33,53,33,1,53,33,21,3,65,145,1,227,253, +140,254,152,145,253,140,1,227,254,29,5,191,7,72,252,34,145,4,111,251,145, +145,254,7,145,145,0,0,0,1,255,246,253,147,5,181,7,72,0,19,0,76,182,11,15, +15,21,13,9,16,184,1,0,178,6,2,19,184,1,6,64,11,20,4,0,0,20,18,254,7,250,12, +4,184,1,2,180,9,5,251,16,0,184,1,2,178,13,1,253,0,63,51,237,50,63,51,237, +50,63,63,17,1,51,17,51,16,246,50,50,237,50,50,17,51,17,51,49,48,3,53,33,53, +33,53,33,17,51,17,33,21,33,21,33,21,33,17,35,17,10,2,151,253,105,2,151,145, +2,151,253,105,2,151,253,105,145,1,113,145,215,145,3,222,252,34,145,215,145, +252,34,3,222,0,0,1,255,246,253,147,5,181,7,72,0,19,0,77,179,4,21,18,9,187, +1,0,0,15,0,12,1,4,178,20,2,5,187,1,0,0,19,0,8,1,7,64,9,20,13,20,0,16,250, +9,5,13,184,1,2,182,18,2,14,252,7,11,254,0,63,51,63,51,51,237,50,50,63,51, +17,1,51,16,244,50,237,50,16,246,50,237,50,17,51,49,48,1,51,17,33,21,33,17, +35,17,35,17,35,17,33,53,33,17,51,17,51,3,65,145,1,227,254,29,145,215,145, +254,29,1,227,145,215,7,72,251,110,145,251,110,4,146,251,110,4,146,145,4,146, +251,110,0,0,0,0,4,255,246,253,147,5,181,7,72,0,5,0,11,0,17,0,23,0,93,181, +4,14,14,25,2,15,187,1,0,0,5,0,12,1,7,182,24,21,9,9,24,20,11,187,1,0,0,23, +0,8,1,4,178,24,5,21,184,1,2,183,2,22,251,0,18,250,15,9,184,1,2,181,12,10, +253,17,7,254,0,63,51,63,51,237,50,63,51,63,51,237,50,1,16,246,50,237,50,17, +51,17,51,16,244,50,237,50,17,51,17,51,49,48,1,51,17,33,21,33,3,35,17,33,53, +33,51,33,21,33,17,35,1,51,17,33,53,33,3,65,145,1,227,253,140,215,145,254, +29,2,116,215,2,116,254,29,145,254,152,145,253,140,1,227,7,72,252,34,145,250, +186,3,222,145,145,252,34,9,181,251,145,145,0,0,0,0,1,0,0,2,109,5,171,7,72, +0,3,0,18,182,0,5,1,4,2,250,1,0,47,63,17,1,51,17,51,49,48,1,33,17,33,5,171, +250,85,5,171,2,109,4,219,0,0,0,1,0,0,253,147,5,171,2,109,0,3,0,18,182,0,5, +1,4,2,1,254,0,63,47,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253, +147,4,218,0,0,0,1,0,0,253,147,5,171,7,72,0,3,0,19,183,0,5,1,4,2,250,1,254, +0,63,63,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253,147,9,181,0, +0,1,0,0,253,147,2,214,7,72,0,3,0,17,182,1,4,0,2,250,1,254,0,63,63,1,47,17, +51,49,48,1,33,17,33,2,214,253,42,2,214,253,147,9,181,0,0,0,0,1,2,213,253, +147,5,171,7,72,0,3,0,17,182,0,5,1,2,250,1,254,0,63,63,1,47,17,51,49,48,1, +33,17,33,5,171,253,42,2,214,253,147,9,181,0,0,0,0,42,0,103,253,245,5,171, +6,163,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55, +0,59,0,63,0,67,0,71,0,75,0,79,0,83,0,87,0,91,0,95,0,99,0,103,0,107,0,111, +0,115,0,119,0,123,0,127,0,131,0,135,0,139,0,143,0,147,0,151,0,155,0,159,0, +163,0,167,2,49,181,161,157,153,149,145,165,184,1,1,182,164,109,85,69,45,13, +121,184,1,1,64,13,120,108,84,68,44,12,120,101,77,53,29,5,137,184,1,1,64,13, +136,100,76,52,28,4,136,113,89,65,41,17,125,184,1,1,64,13,124,112,88,64,40, +16,124,97,81,57,25,9,141,184,1,1,64,13,140,96,80,56,24,8,140,117,93,61,37, +21,129,184,1,1,64,33,128,116,92,60,36,20,128,120,136,124,140,128,128,140, +124,136,120,5,132,160,156,152,148,144,164,164,169,105,73,49,33,1,133,184, +1,1,64,15,104,72,48,32,0,10,132,1,8,3,132,167,143,139,135,184,1,3,180,132, +163,103,99,107,184,1,3,183,104,160,100,96,104,95,91,87,184,1,3,183,84,92, +88,84,159,83,79,75,184,1,3,183,72,156,80,76,72,67,63,71,184,1,3,183,68,64, +60,68,155,59,55,51,184,1,3,183,48,152,56,52,48,43,39,47,184,1,3,183,44,40, +36,44,151,31,27,35,184,1,3,183,32,148,28,24,32,23,19,15,184,1,3,183,12,20, +16,12,147,11,7,3,184,1,3,183,0,144,8,4,0,131,127,123,184,1,3,64,60,120,128, +124,120,22,84,1,27,72,1,25,68,1,27,48,1,27,44,1,20,32,1,104,84,72,68,48,44, +32,12,0,120,120,0,12,32,44,48,68,72,84,104,10,108,164,140,136,27,132,59,132, +2,15,132,1,2,132,119,115,111,184,1,3,178,116,112,108,0,47,51,51,237,50,50, +47,95,93,93,51,51,51,18,23,57,47,47,47,47,47,47,47,47,47,47,93,93,93,93,93, +93,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50, +17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50, +50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50, +17,51,51,51,16,237,50,50,50,16,237,50,50,50,1,47,95,94,93,51,51,51,51,51, +237,50,50,50,50,50,17,51,47,51,51,51,51,51,18,23,57,47,47,47,47,47,17,51, +51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50,50,50, +17,51,51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50, +50,50,17,51,51,51,51,51,16,237,50,50,50,50,50,16,237,50,50,50,50,50,49,48, +19,51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7, +51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51, +21,35,37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,7,51,21, +35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51,21,35, +37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,37, +51,21,35,37,51,21,35,1,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,17,51, +21,35,17,51,21,35,17,51,21,35,17,51,21,35,17,51,21,35,103,104,104,1,158,104, +104,1,160,103,103,253,145,104,104,1,159,104,104,1,159,104,104,207,103,103, +254,96,104,104,254,98,104,104,4,13,104,104,254,97,104,104,254,97,104,104, +207,104,104,1,158,104,104,1,160,103,103,207,104,104,254,97,104,104,254,97, +104,104,207,104,104,1,158,104,104,1,160,103,103,253,145,104,104,1,159,104, +104,1,159,104,104,207,103,103,254,96,104,104,254,98,104,104,207,104,104,1, +159,104,104,1,159,104,104,252,194,104,104,1,159,104,104,1,159,104,104,251, +243,104,104,1,158,104,104,1,160,103,103,1,158,104,104,104,104,104,104,104, +104,104,104,104,104,5,34,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96, +96,99,96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,97,97,97,97,97, +98,94,94,94,94,94,98,97,97,97,97,97,96,96,96,96,96,96,7,237,98,98,98,98,98, +1,35,96,96,96,96,96,254,223,98,254,223,96,254,221,96,254,221,97,254,222,97, +7,238,96,0,0,0,0,84,0,0,253,245,5,171,6,163,0,3,0,7,0,11,0,15,0,19,0,23,0, +27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,75,0,79,0,83, +0,87,0,91,0,95,0,99,0,103,0,107,0,111,0,115,0,119,0,123,0,127,0,131,0,135, +0,139,0,143,0,147,0,151,0,155,0,159,0,163,0,167,0,171,0,175,0,179,0,183,0, +187,0,191,0,195,0,199,0,203,0,207,0,211,0,215,0,219,0,223,0,227,0,231,0,235, +0,239,0,243,0,247,0,251,0,255,1,3,1,7,1,11,1,15,1,19,1,23,1,27,1,31,1,35, +1,39,1,43,1,47,1,51,1,55,1,59,1,63,1,67,1,71,1,75,1,79,0,0,19,51,21,35,55, +51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51, +21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21, +35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35, +55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35,55, +51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,37,51,21,35,55,51, +21,35,55,51,21,35,55,51,21,35,37,51,21,35,5,51,21,35,39,51,21,35,39,51,21, +35,39,51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35, +55,51,21,35,55,51,21,35,55,51,21,35,23,51,21,35,39,51,21,35,39,51,21,35,39, +51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35,55,51, +21,35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21, +35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35, +55,51,21,35,55,51,21,35,19,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23, +51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,17,51,21, +35,19,51,21,35,103,104,104,207,104,104,207,104,104,208,104,104,208,104,104, +207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104, +208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104, +207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104, +208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104, +207,104,104,251,140,103,103,1,158,103,103,207,104,104,208,104,104,208,103, +103,252,194,103,103,3,165,104,104,207,104,104,208,104,104,208,104,104,207, +104,104,207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104, +104,208,103,103,103,104,104,207,104,104,208,104,104,208,104,104,207,104,104, +207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208, +103,103,251,243,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208, +103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,207, +104,104,207,104,104,103,103,103,103,104,104,103,103,103,103,104,104,103,103, +103,103,104,104,103,103,103,103,104,104,103,103,103,103,103,103,104,104,5, +34,98,98,98,98,98,98,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96,96,96, +96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,96, +96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,97,97, +97,97,97,97,97,97,97,97,97,98,94,94,94,94,94,94,94,94,94,94,94,98,97,97,97, +97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96,7,237,98,98,98, +98,98,98,98,98,98,98,98,1,35,96,96,96,96,96,96,96,96,96,96,96,254,223,98, +97,96,96,96,99,96,96,96,99,96,96,97,98,94,98,97,96,96,7,237,98,1,35,96,0, +0,67,0,0,253,147,5,213,6,163,0,73,0,77,0,81,0,85,0,89,0,93,0,97,0,101,0,105, +0,109,0,113,0,117,0,121,0,125,0,129,0,133,0,137,0,141,0,145,0,149,0,153,0, +157,0,161,0,165,0,169,0,173,0,177,0,181,0,185,0,189,0,193,0,197,0,201,0,205, +0,209,0,213,0,217,0,221,0,225,0,229,0,233,0,237,0,241,0,245,0,249,0,253,1, +1,1,5,1,9,1,13,1,17,1,21,1,25,1,29,1,33,1,37,1,41,1,45,1,49,1,53,1,57,1,61, +1,65,1,69,1,73,1,77,1,81,0,0,1,33,17,51,53,35,17,51,53,35,17,51,53,35,17, +51,53,35,17,51,53,35,17,51,53,51,21,51,53,51,21,51,53,51,21,51,53,51,21,51, +53,51,21,51,53,51,21,51,53,51,21,35,21,51,17,35,21,51,17,35,21,51,17,35,21, +51,17,35,21,51,17,35,21,51,1,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53, +23,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,7,21,51,53,51,21,51,53,51, +21,51,53,51,21,51,53,5,35,21,51,55,21,51,53,51,21,51,53,51,21,51,53,5,21, +51,53,33,21,51,53,7,53,35,21,37,21,51,53,19,53,35,21,35,53,35,21,35,53,35, +21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53,19,53,35,21, +35,53,35,21,35,53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51, +21,51,53,19,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,1,35,21,51,39,35, +21,51,39,35,21,51,39,35,21,51,1,21,51,53,51,21,51,53,23,35,21,51,39,35,21, +51,7,21,51,53,51,21,51,53,7,35,21,51,55,21,51,53,5,21,51,53,23,53,35,21,23, +53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,19,53,35,21,35,53,35,21,7,21, +51,53,51,21,51,53,19,35,21,51,39,35,21,51,19,35,21,51,39,35,21,51,5,213,250, +43,106,106,106,106,106,106,106,106,106,106,106,107,106,107,106,107,107,107, +107,107,106,107,106,107,107,107,107,107,107,107,107,107,107,107,107,107,250, +149,107,106,107,106,107,107,107,107,107,107,214,107,107,214,106,106,213,106, +106,213,107,106,107,106,107,107,107,253,234,106,106,107,106,107,107,107,107, +252,170,107,1,63,107,213,107,1,171,107,107,107,107,107,107,106,107,106,107, +107,106,107,106,107,107,107,107,107,107,107,107,106,107,106,107,107,106,107, +106,107,107,107,107,107,107,214,107,107,214,106,106,213,106,106,2,22,107, +107,214,107,107,213,107,107,213,107,107,2,235,107,106,107,106,106,106,213, +106,106,213,107,106,107,107,106,106,107,106,254,86,107,213,107,213,106,107, +106,107,107,106,107,106,106,107,106,107,107,106,107,106,106,106,213,106,106, +107,107,107,213,107,107,253,147,1,34,97,1,34,97,1,35,96,1,33,98,1,33,98,1, +33,96,96,96,96,96,96,96,96,96,96,96,96,96,193,98,254,223,96,254,221,96,254, +221,96,254,221,94,254,221,96,6,106,96,96,96,96,96,96,96,96,192,98,98,98,98, +98,98,98,97,96,96,96,96,96,96,96,96,192,96,96,96,96,96,96,96,96,195,96,96, +96,96,96,96,96,96,96,96,254,223,97,97,97,97,97,97,97,97,98,94,94,94,94,94, +94,94,94,254,223,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,6,205, +98,98,98,98,98,98,98,1,34,98,98,98,98,98,98,98,254,223,96,96,96,96,192,98, +98,98,97,96,96,96,96,192,96,96,96,96,195,96,96,96,96,96,193,97,97,97,97,98, +94,94,94,94,254,223,97,97,97,97,96,96,96,96,96,6,205,98,98,98,1,34,98,98, +98,0,0,0,0,1,0,123,0,117,4,90,4,84,0,3,0,0,19,33,17,33,123,3,223,252,33,4, +84,252,33,0,0,2,0,6,0,0,4,207,4,201,0,3,0,7,0,21,183,7,1,4,0,4,0,5,3,0,47, +205,221,205,1,47,205,221,205,49,48,19,33,17,33,19,17,33,17,6,4,201,251,55, +76,4,49,4,201,251,55,4,125,251,207,4,49,0,0,1,0,109,1,127,2,105,3,123,0,3, +0,26,64,13,3,48,2,1,15,2,31,2,2,8,2,1,2,0,47,205,1,47,94,93,93,205,49,48, +1,33,17,33,2,105,254,4,1,252,1,127,1,252,0,0,0,2,0,109,1,127,2,105,3,123, +0,3,0,7,0,34,64,17,5,3,6,48,2,1,15,2,31,2,2,8,2,7,1,6,2,0,47,205,221,205, +1,47,94,93,93,205,221,205,49,48,1,33,17,33,3,17,33,17,2,105,254,4,1,252,76, +254,156,1,127,1,252,254,80,1,98,254,158,0,0,0,0,1,0,0,0,0,8,0,2,104,0,3,0, +0,17,33,17,33,8,0,248,0,2,104,253,152,0,0,0,1,1,158,0,0,6,76,4,174,0,2,0, +0,33,9,1,1,158,2,88,2,86,4,174,251,82,0,0,1,1,145,255,229,6,90,4,172,0,2, +0,0,9,2,1,145,4,201,251,55,4,172,253,158,253,155,0,1,1,158,255,229,6,76,4, +147,0,2,0,0,9,2,6,76,253,170,253,168,4,147,251,82,4,174,0,1,1,145,255,229, +6,90,4,172,0,2,0,0,1,17,1,6,90,251,55,4,172,251,57,2,101,0,0,2,0,8,0,0,3, +238,5,160,0,5,0,9,0,37,64,20,134,7,1,9,0,5,16,5,2,5,7,31,2,1,2,6,3,4,8,1, +0,47,51,63,51,1,47,93,51,47,93,51,49,48,93,33,35,9,1,51,9,4,2,35,82,254,55, +1,201,82,1,203,254,14,254,158,1,98,1,96,2,207,2,209,253,49,2,53,253,203,253, +194,2,62,0,2,0,167,0,162,4,46,4,41,0,19,0,39,0,46,64,28,68,37,84,37,2,75, +33,91,33,2,75,27,91,27,2,68,23,84,23,2,30,10,20,0,25,15,35,5,0,47,205,220, +205,1,47,205,220,205,49,48,93,93,93,93,19,52,62,2,51,50,30,2,21,20,14,2,35, +34,46,2,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,167,70,122,164,94,94, +165,123,71,71,123,165,94,94,164,122,70,86,57,98,133,76,76,134,99,58,58,99, +134,76,76,133,98,57,2,100,94,165,123,71,71,123,165,94,94,164,122,70,70,122, +164,94,76,132,99,57,57,99,132,76,76,134,99,58,58,99,134,0,0,0,0,1,0,178,0, +137,4,35,3,250,0,23,0,17,182,8,16,12,15,0,1,0,0,47,93,205,1,47,205,49,48, +1,50,23,30,1,23,30,1,21,20,7,6,35,34,39,38,53,52,54,55,62,1,55,54,2,106,110, +107,53,82,29,29,31,129,129,183,182,129,129,30,29,29,83,52,108,3,250,57,28, +82,52,54,110,57,183,129,129,129,129,183,58,109,54,52,82,28,57,0,0,0,2,0,41, +0,0,4,172,4,131,0,3,0,23,0,21,183,14,2,4,1,19,1,9,0,0,47,205,221,205,1,47, +205,221,205,49,48,51,17,33,17,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2, +41,4,131,252,4,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69,4, +131,251,125,2,65,91,160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0, +3,0,41,0,0,4,172,4,131,0,3,0,23,0,43,0,34,64,14,4,24,1,14,34,2,1,19,29,0, +9,39,1,0,0,47,221,221,206,16,221,206,1,47,221,221,206,16,221,206,49,48,51, +17,33,17,1,52,62,2,51,50,30,2,21,20,14,2,35,34,46,2,39,20,30,2,51,50,62,2, +53,52,46,2,35,34,14,2,41,4,131,252,81,58,99,133,75,75,133,99,58,58,99,133, +75,75,133,99,58,77,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69, +4,131,251,125,2,65,75,133,99,58,58,99,133,75,75,133,99,58,58,99,133,75,91, +160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0,2,0,115,1,133,2,99, +3,117,0,18,0,34,0,21,183,19,0,27,11,31,6,23,15,0,47,205,220,205,1,47,205, +220,205,49,48,1,20,6,7,14,1,35,34,39,46,1,53,52,55,54,51,50,23,22,7,52,39, +38,35,34,7,6,21,20,23,22,51,50,55,54,2,99,37,37,37,86,51,101,75,35,37,72, +74,102,103,71,74,76,51,51,70,70,51,51,51,49,72,72,49,51,2,125,53,86,37,35, +37,72,37,86,53,102,72,74,74,71,103,70,51,51,51,51,70,69,54,49,49,54,0,0,0, +5,1,177,255,229,6,121,4,172,0,17,0,33,0,45,0,57,0,68,0,147,64,93,20,32,36, +32,116,32,3,20,28,36,28,116,28,3,27,24,43,24,123,24,3,27,20,43,20,123,20, +3,68,34,40,63,52,46,40,46,40,46,8,18,31,0,1,0,26,8,49,37,43,55,43,62,58,104, +58,1,89,58,1,71,58,1,25,58,1,58,60,65,15,43,95,43,111,43,3,8,65,64,9,14,72, +43,65,43,65,4,22,15,13,1,13,30,4,0,47,205,220,93,205,18,57,57,47,47,43,94, +93,16,205,51,93,93,93,93,17,51,17,51,16,205,50,1,47,205,220,93,205,18,57, +57,47,47,16,205,51,16,205,51,49,48,0,93,93,93,93,1,20,7,6,35,34,39,38,53, +52,54,55,54,51,50,23,30,1,7,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54,1, +20,6,35,34,38,53,52,54,51,50,22,5,20,6,35,34,38,53,52,54,51,50,22,1,22,51, +50,55,23,6,35,34,38,39,6,121,180,179,253,253,179,180,90,90,178,254,254,178, +90,90,90,153,151,218,218,151,153,153,152,217,217,152,153,253,90,46,32,32, +45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,234,76,147,145,76,62,98, +185,94,141,48,2,72,254,178,179,179,178,254,128,215,91,178,178,91,215,128, +217,153,154,154,153,217,216,153,154,154,153,1,87,32,46,46,32,32,45,45,32, +32,46,46,32,32,45,45,254,191,137,137,35,186,95,91,0,0,4,1,209,255,229,6,153, +4,172,0,17,0,29,0,41,0,52,0,96,64,55,42,18,24,47,36,30,24,30,24,30,0,8,39, +27,21,33,21,48,52,104,52,1,89,52,1,75,52,1,61,52,1,52,50,45,15,21,31,21,95, +21,111,21,4,8,79,45,95,45,2,21,45,21,45,13,4,0,47,204,57,57,47,47,93,94,93, +16,206,51,93,93,93,93,17,51,17,51,16,206,50,1,47,205,57,57,47,47,16,206,51, +16,206,51,49,48,1,20,7,6,35,34,39,38,53,52,54,55,54,51,50,23,30,1,5,52,38, +35,34,6,21,20,22,51,50,54,37,52,38,35,34,6,21,20,22,51,50,54,1,30,1,51,50, +55,39,6,35,34,39,6,153,180,179,253,253,179,180,90,90,178,254,254,178,90,90, +253,0,46,32,32,45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,174,48,141, +94,185,98,62,76,145,147,76,2,72,254,178,179,179,178,254,128,215,91,178,178, +91,215,1,32,45,45,32,32,46,46,32,32,45,45,32,32,46,46,254,220,91,95,186,35, +137,137,0,2,1,70,255,115,6,14,4,59,0,51,0,70,0,139,185,0,47,255,240,64,13, +11,14,72,52,46,1,52,36,1,119,35,1,35,184,255,240,64,77,11,14,72,21,16,11, +14,72,59,20,1,59,9,1,8,16,11,14,72,59,47,1,52,35,1,52,21,1,59,8,1,66,143, +13,223,13,2,112,13,1,63,13,1,32,13,1,13,57,43,62,128,31,208,31,224,31,3,127, +31,1,48,31,1,47,31,1,31,52,15,51,63,51,79,51,3,8,51,0,47,94,93,205,220,93, +93,93,93,205,1,47,205,220,93,93,93,93,205,49,48,0,93,93,93,93,1,43,93,93, +43,43,93,93,93,43,1,51,21,30,3,23,55,23,7,30,1,23,51,21,35,14,1,7,23,7,39, +14,1,7,14,1,7,21,35,53,46,1,39,7,39,55,46,1,39,35,53,51,54,55,39,55,23,62, +1,55,23,34,6,7,6,21,20,23,30,1,51,50,55,54,53,52,39,46,1,3,137,66,32,57,54, +53,29,186,45,184,45,44,3,215,215,8,44,40,184,49,182,31,55,23,24,58,34,66, +63,110,48,188,43,182,40,46,8,215,215,12,80,180,40,189,57,112,54,31,69,117, +48,98,98,48,117,69,139,96,99,99,49,117,4,59,217,3,12,21,32,22,182,45,184, +59,113,57,62,60,110,51,188,43,182,23,32,11,9,12,5,217,217,9,46,35,180,45, +184,51,111,63,62,128,95,184,49,182,40,44,6,61,50,48,100,136,137,98,50,47, +97,97,138,137,99,48,50,0,0,0,2,1,218,0,80,4,38,4,129,0,28,0,47,0,98,64,62, +22,18,25,0,0,5,15,43,1,239,43,255,43,2,43,15,14,1,14,0,34,1,224,34,240,34, +2,34,5,22,25,19,0,28,16,28,80,28,3,28,0,39,1,240,39,1,39,18,0,0,128,0,2,8, +0,29,64,37,40,72,29,10,0,47,205,43,220,94,93,50,205,113,114,47,93,51,205, +50,1,47,205,113,114,220,93,205,113,114,17,57,47,51,205,50,49,48,1,46,1,39, +38,53,52,55,62,1,51,50,23,22,21,20,7,6,7,21,33,21,33,17,35,17,33,53,33,19, +34,7,14,1,21,20,22,23,22,51,50,55,54,53,52,38,39,38,2,220,55,90,35,71,83, +44,101,60,118,83,86,72,72,106,1,0,255,0,74,254,254,1,2,35,83,62,29,31,31, +29,62,83,87,59,61,30,29,62,2,66,8,46,42,80,108,122,83,43,43,86,83,122,109, +81,82,12,166,70,254,250,1,6,70,2,145,59,31,71,44,43,71,31,62,62,61,84,44, +71,31,59,0,2,1,81,0,250,4,175,4,129,0,65,0,81,0,70,64,40,49,65,59,15,78,1, +78,63,32,1,32,15,51,1,51,0,70,1,70,59,65,49,63,74,0,55,128,55,2,55,66,144, +20,1,20,15,63,1,8,63,0,47,94,93,204,93,205,220,93,205,18,57,57,1,47,205,114, +220,93,204,93,205,114,18,57,57,49,48,1,46,1,39,46,1,39,46,1,53,52,55,62,1, +51,50,22,23,30,1,51,50,54,55,54,51,50,21,20,7,14,1,21,20,22,23,30,1,21,20, +6,7,6,35,34,39,46,1,39,7,22,21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,7, +34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,3,255,17,54,37,28,40,14,5,3,6, +3,6,5,5,15,13,32,63,32,46,64,19,36,13,16,6,9,7,4,8,2,2,2,2,9,5,21,20,22,31, +11,237,84,86,87,118,118,87,84,84,85,122,71,83,154,90,62,61,61,64,88,89,60, +62,62,60,4,0,5,18,14,11,24,14,3,10,5,8,9,2,2,2,2,8,9,7,6,12,14,9,18,34,79, +45,31,64,34,11,16,5,5,7,3,6,39,42,82,42,238,81,109,125,86,88,84,84,117,117, +87,86,43,32,62,61,88,91,61,61,61,62,90,87,62,62,0,0,1,0,59,0,0,4,5,4,207, +0,47,0,40,64,25,38,32,10,48,10,96,10,112,10,4,10,14,34,64,8,11,72,34,23,79, +0,95,0,2,0,0,47,93,47,47,43,51,1,47,93,47,49,48,1,30,1,23,30,1,23,22,23,22, +21,20,7,6,35,34,39,22,23,30,1,31,1,33,55,50,55,62,3,39,14,1,35,34,39,38,53, +52,55,62,1,55,62,1,55,54,2,32,14,40,26,28,95,69,141,35,37,63,66,88,157,99, +3,36,38,163,137,8,252,232,6,125,86,43,66,44,20,1,45,132,83,90,66,63,30,23, +78,57,69,110,38,56,4,207,54,95,44,43,105,63,126,66,67,70,95,63,66,191,147, +87,86,99,9,37,37,49,25,69,91,119,75,96,95,66,63,91,74,59,42,85,47,59,113, +57,83,0,0,0,0,1,0,60,0,0,5,4,4,199,0,75,0,47,64,24,57,77,63,23,1,23,52,61, +67,13,47,30,4,18,31,18,1,27,18,27,18,1,41,1,0,47,47,18,57,57,47,47,93,18, +23,57,50,51,1,47,93,16,206,49,48,41,1,55,62,1,55,62,1,55,54,53,52,38,53,6, +7,14,1,35,34,38,39,38,53,52,55,54,51,50,22,23,46,1,39,46,1,53,52,55,62,1, +51,50,23,22,21,20,7,54,55,62,1,51,50,22,23,22,21,20,7,6,35,34,38,39,46,1, +39,30,1,23,30,1,23,22,23,4,70,252,182,8,84,108,27,41,64,26,52,2,58,90,43, +88,45,59,97,41,79,73,73,93,31,80,51,20,27,8,5,6,78,40,97,60,116,80,80,69, +84,16,14,30,17,51,86,36,73,80,80,112,62,132,50,17,43,26,3,23,23,22,67,46, +61,159,35,17,33,17,25,75,50,100,109,8,22,17,121,59,28,30,42,38,83,116,115, +79,80,25,26,34,52,19,17,38,20,115,78,38,40,80,78,109,86,98,40,3,5,3,37,41, +76,116,118,83,80,60,51,19,61,45,81,125,46,45,76,31,39,30,0,1,0,102,255,233, +4,90,4,121,0,39,0,38,64,23,18,2,1,4,2,1,8,29,41,16,12,64,12,80,12,112,12, +128,12,5,12,16,0,0,47,47,1,47,93,16,206,49,48,94,93,93,5,46,1,39,46,1,39, +46,1,39,46,1,53,52,55,54,51,50,23,30,1,23,62,1,51,50,22,23,22,21,20,7,14, +1,7,14,1,7,14,1,2,98,14,42,26,28,103,76,56,69,14,43,37,68,70,102,98,78,28, +47,17,34,142,88,50,85,35,70,41,20,78,60,75,108,32,31,44,23,56,101,48,50,147, +102,76,93,22,65,106,56,103,71,70,72,28,80,54,119,117,36,34,70,94,86,88,45, +119,75,96,152,55,54,110,0,0,0,0,1,0,66,255,231,3,210,4,199,0,26,0,18,183, +48,12,1,12,75,21,1,21,0,25,47,93,1,47,93,49,48,1,30,1,23,30,1,23,14,1,7,14, +1,7,46,1,39,46,1,39,46,1,39,62,1,55,62,1,2,7,45,113,69,69,116,47,39,120,83, +69,106,40,13,35,22,38,98,60,14,94,81,50,128,80,59,96,4,199,78,165,93,93,141, +53,40,150,111,93,159,72,25,58,32,57,135,80,20,119,99,59,160,107,77,148,0, +0,1,0,196,0,29,3,59,4,129,0,33,0,48,64,25,2,19,33,13,64,79,6,95,6,111,6,3, +6,128,27,33,18,10,10,47,0,1,0,31,24,0,47,205,204,93,57,47,57,1,47,205,26, +220,93,26,205,16,205,50,49,48,1,51,21,23,30,1,21,20,6,7,35,62,1,53,52,38, +39,38,39,17,20,6,7,6,35,34,38,53,52,55,54,51,50,23,1,233,76,153,51,58,48, +46,47,29,28,28,29,57,64,37,37,72,108,57,58,60,63,80,44,46,4,129,100,193,69, +163,85,78,134,59,65,124,59,60,99,40,81,9,254,6,63,98,38,75,54,46,73,60,60, +19,0,2,1,16,255,213,4,239,4,135,0,34,0,38,0,108,64,61,35,32,64,18,26,128, +36,15,64,111,0,1,0,128,15,9,1,9,9,0,26,1,26,17,35,86,35,1,67,35,1,35,16,36, +54,36,1,37,36,1,20,36,1,3,36,1,8,36,34,38,33,88,33,1,33,37,34,30,23,13,6, +0,47,205,47,205,47,51,51,93,17,51,17,51,94,93,93,93,93,17,51,51,93,93,17, +51,1,47,93,51,47,93,26,221,93,26,205,50,26,16,221,26,205,51,49,48,1,20,6, +7,14,1,35,34,38,53,52,55,54,51,50,23,17,5,17,20,6,7,6,35,34,38,53,52,55,54, +51,50,23,17,37,1,37,53,5,4,239,36,38,37,88,51,57,57,57,62,81,48,42,253,218, +37,35,74,106,57,58,59,60,84,45,45,2,186,253,144,2,38,253,218,1,68,63,101, +35,37,39,54,47,76,57,59,18,1,192,149,254,118,62,98,38,74,53,45,76,57,60,19, +2,240,178,254,103,149,117,152,0,0,0,3,0,29,0,0,3,118,5,204,0,27,0,31,0,35, +0,100,179,67,10,1,10,184,255,224,64,59,8,12,72,31,35,70,28,47,32,143,32,207, +32,3,31,32,79,32,111,32,143,32,4,32,79,16,95,16,2,16,16,1,70,144,2,1,111, +2,1,2,34,15,31,83,30,0,19,80,12,0,0,4,80,25,5,15,32,1,21,0,63,51,63,51,237, +50,63,237,63,237,63,1,47,93,93,237,50,47,93,47,93,113,51,237,50,49,48,0,43, +93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51, +21,19,53,51,21,3,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18, +40,51,29,11,211,134,180,180,180,3,183,252,73,3,183,131,122,59,101,75,43,6, +6,137,3,5,22,41,60,39,97,131,1,105,172,172,250,224,4,58,251,198,0,0,0,0,2, +0,29,0,0,3,119,5,204,0,27,0,31,0,90,179,67,10,1,10,184,255,224,64,53,8,12, +72,31,70,47,28,143,28,207,28,3,31,28,79,28,111,28,143,28,4,28,79,16,95,16, +2,16,16,1,70,144,2,1,111,2,1,2,30,0,19,80,12,0,0,4,80,25,5,15,28,1,21,0,63, +51,63,51,237,50,63,237,63,1,47,93,93,237,50,47,93,47,93,113,237,49,48,0,43, +93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51, +21,19,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51,29, +11,211,135,180,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41, +60,39,97,131,252,73,5,204,250,52,0,0,1,0,119,254,78,1,227,255,170,0,28,0, +75,185,0,2,255,232,179,9,17,72,27,184,255,224,64,40,9,17,72,22,22,8,16,131, +15,0,1,95,0,1,0,8,19,140,63,23,79,23,2,23,11,140,0,5,16,5,32,5,80,5,96,5, +112,5,6,5,0,47,93,237,47,93,237,1,47,221,93,113,237,18,57,47,49,48,43,43, +5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35,42,1,7,55,51,50,30,2,1, +227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14,29,14,31,62,52,84,60, +32,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,96,18,41,63,0,0,0,255,255, +0,243,1,190,1,182,2,154,17,6,0,119,56,0,0,18,64,11,0,127,0,1,111,0,1,95,0, +1,0,17,93,93,93,53,0,1,0,127,254,78,1,72,255,158,0,10,0,75,185,0,5,255,192, +179,9,17,72,2,184,255,192,64,28,9,17,72,7,151,0,150,4,9,8,146,16,3,32,3,2, +0,3,96,3,160,3,176,3,192,3,5,3,184,255,192,64,10,30,33,72,3,0,9,16,9,2,9, +0,47,93,204,43,93,113,237,1,47,51,253,237,49,48,43,43,5,20,6,7,35,62,1,53, +35,53,51,1,72,44,40,117,45,49,88,195,193,87,107,47,48,86,46,156,0,0,0,0,2, +0,14,2,51,2,150,5,129,0,10,0,23,0,108,64,74,86,10,1,86,9,1,121,6,137,6,2, +17,175,5,191,5,2,5,64,29,60,72,5,64,24,27,72,5,8,1,224,18,6,16,2,1,48,2,1, +64,2,144,2,2,2,0,4,229,8,5,95,17,111,17,127,17,3,15,17,31,17,127,17,143,17, +4,17,17,1,11,6,220,1,223,0,63,63,51,18,57,47,93,113,51,51,237,50,1,47,93, +113,114,51,51,237,50,47,43,43,93,51,49,48,93,114,114,1,21,35,53,33,53,1,51, +17,51,21,3,14,3,7,3,33,17,60,2,54,2,39,131,254,106,1,130,151,111,240,7,22, +24,22,7,199,1,23,1,2,229,178,178,111,2,45,253,213,113,2,23,13,37,39,35,11, +254,225,1,33,14,38,38,34,0,0,0,0,1,0,53,2,40,2,124,5,129,0,38,0,134,64,37, +37,36,53,36,69,36,3,3,24,9,13,72,19,34,1,4,34,1,3,31,30,25,224,139,27,1,6, +27,10,192,26,208,26,224,26,3,26,184,255,192,64,53,16,19,72,26,29,0,225,32, +19,96,19,2,32,19,96,19,160,19,224,19,4,19,22,228,34,34,16,30,229,27,220,68, +11,84,11,100,11,3,53,11,1,6,11,22,11,38,11,3,11,16,228,5,221,0,63,237,50, +93,93,93,63,237,18,57,47,237,1,47,93,113,237,50,47,43,93,51,51,95,113,237, +50,50,0,95,93,93,49,48,43,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53, +52,38,35,34,6,7,35,19,33,21,33,7,62,1,51,50,30,2,2,124,38,73,108,70,66,101, +74,44,9,133,5,24,39,54,36,71,86,81,75,51,77,23,129,33,1,250,254,114,19,29, +91,54,67,103,69,36,3,67,65,104,74,40,33,59,81,48,15,27,47,36,21,85,93,81, +85,37,23,1,212,113,245,26,33,39,71,102,0,0,0,1,0,43,2,52,2,120,5,129,0,14, +0,54,64,33,5,224,6,6,0,175,12,191,12,2,12,11,96,0,1,191,0,207,0,255,0,3,96, +0,1,0,0,12,229,13,220,5,223,0,63,63,237,50,1,47,93,93,113,51,47,93,17,57, +47,237,49,48,1,14,3,21,35,52,62,2,55,33,53,33,2,120,64,106,77,43,133,47,80, +107,60,254,52,2,77,5,28,97,176,176,187,108,102,188,179,175,88,113,0,3,0,45, +2,40,2,130,5,142,0,19,0,39,0,81,0,138,185,0,68,255,232,179,11,15,72,64,184, +255,232,64,82,11,15,72,47,24,9,13,72,43,24,9,13,72,5,15,21,15,2,76,55,71, +10,226,72,61,1,61,61,30,226,224,50,1,191,50,1,50,0,226,70,71,1,71,71,40,226, +32,20,96,20,2,32,20,96,20,160,20,224,20,4,20,76,56,25,228,15,15,35,26,5,1, +11,5,1,5,228,66,222,35,228,45,221,0,63,237,63,237,93,93,18,57,47,237,57,57, +1,47,93,113,237,50,47,113,237,47,93,93,237,51,47,113,237,18,57,57,0,93,49, +48,43,43,43,43,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,19,52,46,2,35,34, +14,2,21,20,30,2,51,50,62,2,55,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3,53, +52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,1,223,12,31,53,41,39,53,31,13,9,29, +54,45,48,54,27,7,21,13,35,61,49,45,59,36,15,15,36,61,46,46,61,34,14,142,35, +73,113,77,77,113,74,35,29,47,61,32,36,55,38,20,35,70,104,68,72,105,69,33, +20,38,56,36,36,63,46,26,4,169,28,48,34,19,19,34,48,28,23,47,39,25,25,39,48, +254,155,28,52,40,24,24,41,53,28,35,59,42,23,23,42,60,22,54,91,66,37,37,66, +90,54,46,72,52,32,5,3,8,37,52,64,35,45,79,59,34,35,60,79,44,35,63,52,37,7, +3,6,31,52,72,0,1,255,229,4,176,2,195,5,240,0,17,0,62,64,41,117,11,133,11, +2,117,7,133,7,2,12,73,15,13,191,13,239,13,3,13,6,73,64,5,12,5,128,9,142,15, +0,47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,205,50,1,47,26,237,220,93,237, +49,48,0,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,84,111,141,81,32, +2,164,6,104,93,93,104,6,164,2,32,81,141,4,176,57,91,115,57,103,96,96,103, +57,115,91,57,0,1,0,124,4,28,1,69,5,129,0,10,0,36,64,21,7,151,0,150,4,9,8, +146,80,3,96,3,2,160,3,176,3,2,3,9,3,0,63,204,93,113,237,1,47,51,253,237,49, +48,1,20,6,7,35,62,1,53,35,53,51,1,69,44,40,117,45,49,88,195,5,23,87,117,47, +48,96,46,167,0,0,1,0,130,4,187,1,75,6,32,0,10,0,47,64,30,4,9,150,7,151,10, +7,146,95,3,111,3,2,175,3,191,3,2,3,80,10,1,15,10,63,10,127,10,3,10,0,47,93, +113,205,93,113,237,1,47,237,237,50,49,48,19,52,54,55,51,14,1,21,51,21,35, +130,44,40,117,45,49,88,195,5,37,87,117,47,48,96,46,167,0,0,0,0,1,0,106,5, +250,2,18,6,240,0,5,0,48,64,30,117,3,133,3,2,128,4,1,64,4,1,4,64,1,2,64,16, +20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43,1,47,26,205,93,93, +49,48,93,1,37,53,51,23,21,1,160,254,202,207,217,5,250,217,29,226,20,0,1,0, +72,5,250,1,240,6,240,0,5,0,52,64,34,122,2,138,2,2,64,3,128,3,2,3,64,79,0, +143,0,2,0,2,64,16,20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43, +1,47,93,26,205,93,49,48,93,19,53,55,51,21,5,72,217,207,254,202,5,250,20,226, +29,217,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,9,134,9,2,120,8,136, +8,2,128,0,1,0,184,255,192,64,25,11,15,72,0,6,4,142,64,8,64,16,19,72,8,128, +6,95,1,1,1,64,9,12,72,1,0,47,43,93,51,26,221,43,26,237,1,47,204,43,93,49, +48,93,93,1,21,35,39,35,7,35,53,55,51,2,150,105,219,2,232,104,234,204,6,14, +20,139,139,20,240,0,0,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,0,134, +0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,25,11,15,72,8,64,2,7,3,64,16,19, +72,3,128,6,142,95,1,1,1,64,9,12,72,1,0,47,43,93,237,26,205,43,50,1,47,26, +204,43,93,49,48,93,93,1,35,39,53,51,23,51,55,51,21,1,182,204,234,104,232, +2,219,105,5,250,239,21,139,139,21,0,0,0,0,2,0,45,5,250,2,90,6,178,0,3,0,7, +0,35,64,19,3,133,0,7,133,4,1,5,145,0,95,4,1,4,64,9,12,72,4,0,47,43,93,51, +237,50,1,47,237,220,237,49,48,1,53,51,21,33,53,51,21,1,183,163,253,211,165, +5,250,184,184,184,184,0,0,1,255,233,5,250,2,182,7,6,0,27,0,68,181,89,2,105, +2,2,26,184,255,232,64,34,9,15,72,12,24,9,15,72,64,23,1,15,23,1,23,9,22,5, +143,64,14,128,19,143,8,95,0,1,0,64,9,12,72,0,0,47,43,93,50,237,26,221,26, +237,51,1,47,204,93,93,49,48,43,43,0,93,1,34,46,2,35,34,6,7,35,62,3,51,50, +30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45,74,59,44, +84,78,69,30,54,55,8,92,5,20,43,74,5,250,37,45,37,62,57,45,95,78,50,37,45, +37,63,56,44,95,78,51,0,0,0,0,2,0,32,5,250,3,15,6,241,0,5,0,11,0,88,64,60, +154,8,170,8,2,154,2,170,2,2,102,10,1,98,4,1,98,3,1,10,159,7,1,15,7,31,7,127, +7,223,7,4,7,7,4,64,0,64,9,31,72,0,8,2,64,16,20,72,2,128,6,95,0,1,0,64,9,12, +72,0,0,47,43,93,50,26,205,43,50,1,47,43,26,205,220,94,93,113,205,49,48,93, +93,93,93,93,19,53,55,51,21,5,51,53,55,51,21,5,32,197,207,254,202,253,197, +207,254,202,5,250,20,227,29,218,20,227,29,218,0,1,255,232,5,250,2,130,6,243, +0,17,0,55,64,32,4,11,1,4,7,1,17,15,19,1,100,13,64,5,12,5,64,16,20,72,5,128, +9,95,0,1,0,64,9,12,72,0,0,47,43,93,205,26,205,43,50,1,47,26,204,94,93,49, +48,0,94,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,52,74,116,84,50, +8,117,17,109,91,91,107,17,117,9,50,83,116,5,250,41,69,90,49,53,60,61,52,49, +90,69,41,0,0,0,0,0,0,1,0,0,21,86,0,1,3,140,12,0,0,9,9,72,0,3,0,36,255,143, +0,3,0,55,255,219,0,3,0,60,255,219,0,3,1,82,255,143,0,3,1,91,255,143,0,3,1, +94,255,143,0,3,1,101,255,143,0,3,1,109,255,219,0,3,1,110,255,219,0,3,1,116, +255,219,0,20,0,20,255,104,0,36,0,3,255,143,0,36,0,55,255,104,0,36,0,57,255, +104,0,36,0,58,255,180,0,36,0,60,255,104,0,36,0,89,255,219,0,36,0,90,255,219, +0,36,0,92,255,219,0,36,2,3,255,104,0,41,0,15,255,29,0,41,0,17,255,29,0,41, +0,36,255,143,0,47,0,3,255,180,0,47,0,55,255,104,0,47,0,57,255,104,0,47,0, +58,255,104,0,47,0,60,255,104,0,47,0,92,255,180,0,47,2,3,255,143,0,51,0,3, +255,219,0,51,0,15,254,248,0,51,0,17,254,248,0,51,0,36,255,104,0,53,0,55,255, +219,0,53,0,57,255,219,0,53,0,58,255,219,0,53,0,60,255,219,0,55,0,3,255,219, +0,55,0,15,255,29,0,55,0,16,255,143,0,55,0,17,255,29,0,55,0,29,255,29,0,55, +0,30,255,29,0,55,0,36,255,104,0,55,0,50,255,219,0,55,0,68,255,29,0,55,0,70, +255,29,0,55,0,72,255,29,0,55,0,76,255,180,0,55,0,82,255,29,0,55,0,85,255, +180,0,55,0,86,255,29,0,55,0,88,255,180,0,55,0,90,255,143,0,55,0,92,255,143, +0,57,0,15,255,68,0,57,0,16,255,143,0,57,0,17,255,68,0,57,0,29,255,180,0,57, +0,30,255,180,0,57,0,36,255,104,0,57,0,68,255,104,0,57,0,72,255,143,0,57,0, +76,255,219,0,57,0,82,255,143,0,57,0,85,255,180,0,57,0,88,255,180,0,57,0,92, +255,180,0,58,0,15,255,143,0,58,0,16,255,219,0,58,0,17,255,143,0,58,0,29,255, +219,0,58,0,30,255,219,0,58,0,36,255,180,0,58,0,68,255,180,0,58,0,72,255,219, +0,58,0,82,255,219,0,58,0,85,255,219,0,58,0,88,255,219,0,58,0,92,255,238,0, +60,0,3,255,219,0,60,0,15,254,248,0,60,0,16,255,68,0,60,0,17,254,248,0,60, +0,29,255,143,0,60,0,30,255,123,0,60,0,36,255,104,0,60,0,68,255,104,0,60,0, +72,255,68,0,60,0,76,255,180,0,60,0,82,255,68,0,60,0,83,255,104,0,60,0,84, +255,68,0,60,0,88,255,143,0,60,0,89,255,143,0,73,0,73,255,219,0,73,2,3,0,37, +0,85,0,15,255,143,0,85,0,17,255,143,0,85,2,3,0,76,0,89,0,15,255,104,0,89, +0,17,255,104,0,90,0,15,255,143,0,90,0,17,255,143,0,92,0,15,255,104,0,92,0, +17,255,104,1,82,1,98,255,213,1,82,1,105,255,213,1,82,1,109,255,104,1,82,1, +110,255,104,1,82,1,111,255,197,1,82,1,116,255,104,1,82,1,124,255,219,1,82, +1,134,255,219,1,82,1,144,255,219,1,87,1,110,255,190,1,88,1,90,0,170,1,88, +1,91,255,104,1,88,1,94,255,104,1,88,1,98,255,141,1,88,1,101,255,104,1,88, +1,105,255,141,1,88,1,111,255,141,1,88,1,114,255,158,1,88,1,119,255,104,1, +88,1,120,255,180,1,88,1,122,255,70,1,88,1,128,255,104,1,88,1,130,255,180, +1,88,1,131,255,104,1,88,1,133,255,104,1,88,1,136,255,70,1,88,1,140,255,70, +1,88,1,143,255,70,1,88,1,147,0,98,1,88,1,149,255,70,1,89,1,110,255,209,1, +89,1,116,255,209,1,91,0,3,255,143,1,91,1,98,255,213,1,91,1,105,255,213,1, +91,1,109,255,104,1,91,1,110,255,104,1,91,1,111,255,197,1,91,1,116,255,104, +1,91,1,124,255,219,1,91,1,134,255,219,1,91,1,144,255,219,1,91,2,3,255,104, +1,93,0,15,255,31,1,93,0,17,255,31,1,93,1,90,0,164,1,93,1,91,255,68,1,93,1, +94,255,68,1,93,1,101,255,68,1,93,1,130,255,168,1,93,1,147,0,88,1,94,0,3,255, +143,1,94,1,98,255,213,1,94,1,105,255,213,1,94,1,109,255,137,1,94,1,110,255, +104,1,94,1,116,255,104,1,98,1,91,255,219,1,98,1,94,255,219,1,98,1,101,255, +219,1,98,1,110,255,190,1,98,1,116,255,190,1,100,1,98,255,193,1,100,1,105, +255,193,1,100,1,111,255,143,1,100,1,117,255,231,1,100,1,122,255,231,1,100, +1,125,255,231,1,100,1,127,255,231,1,100,1,129,255,231,1,100,1,135,255,231, +1,100,1,136,255,231,1,100,1,140,255,231,1,100,1,143,255,231,1,100,1,146,255, +231,1,100,1,149,255,231,1,100,1,151,255,231,1,101,0,3,255,143,1,101,1,98, +255,213,1,101,1,105,255,213,1,101,1,109,255,104,1,101,1,110,255,104,1,101, +1,116,255,104,1,105,1,91,255,219,1,105,1,94,255,213,1,105,1,101,255,219,1, +105,1,110,255,190,1,105,1,116,255,190,1,107,0,3,255,219,1,107,0,15,254,250, +1,107,0,17,254,250,1,107,1,91,255,104,1,107,1,94,255,104,1,107,1,101,255, +104,1,108,1,137,255,158,1,108,1,141,255,158,1,109,0,3,255,219,1,109,0,15, +255,31,1,109,0,17,255,31,1,109,0,29,255,31,1,109,0,30,255,31,1,109,1,90,0, +188,1,109,1,91,255,104,1,109,1,94,255,104,1,109,1,98,255,219,1,109,1,101, +255,104,1,109,1,105,255,219,1,109,1,111,255,219,1,109,1,114,255,219,1,109, +1,117,255,31,1,109,1,118,255,31,1,109,1,121,255,78,1,109,1,122,255,31,1,109, +1,124,255,78,1,109,1,126,255,31,1,109,1,128,255,106,1,109,1,130,255,180,1, +109,1,133,255,106,1,109,1,134,255,143,1,109,1,136,255,31,1,109,1,140,255, +31,1,109,1,142,255,80,1,109,1,143,255,31,1,109,1,144,255,143,1,109,1,145, +255,106,1,109,1,147,0,188,1,109,1,148,255,78,1,109,1,149,255,31,1,109,1,150, +255,78,1,110,0,3,255,219,1,110,0,15,254,250,1,110,0,16,255,70,1,110,0,17, +254,250,1,110,0,29,255,143,1,110,0,30,255,143,1,110,1,90,0,188,1,110,1,91, +255,104,1,110,1,94,255,104,1,110,1,98,255,141,1,110,1,101,255,104,1,110,1, +105,255,141,1,110,1,111,255,141,1,110,1,114,255,158,1,110,1,119,255,104,1, +110,1,120,255,180,1,110,1,122,255,70,1,110,1,124,255,158,1,110,1,128,255, +104,1,110,1,130,255,180,1,110,1,131,255,104,1,110,1,133,255,104,1,110,1,136, +255,70,1,110,1,140,255,70,1,110,1,143,255,70,1,110,1,147,0,121,1,110,1,149, +255,70,1,111,1,91,255,197,1,111,1,110,255,190,1,111,1,116,255,190,1,113,1, +117,255,178,1,113,1,122,255,178,1,113,1,125,255,178,1,113,1,129,255,217,1, +113,1,136,255,178,1,113,1,140,255,178,1,113,1,143,255,178,1,113,1,146,255, +178,1,113,1,149,255,178,1,113,1,151,255,178,1,114,1,110,255,209,1,114,1,116, +255,209,1,116,0,3,255,219,1,116,1,90,0,170,1,116,1,91,255,104,1,116,1,94, +255,104,1,116,1,98,255,141,1,116,1,101,255,104,1,116,1,105,255,141,1,116, +1,111,255,141,1,116,1,114,255,158,1,116,1,119,255,104,1,116,1,120,255,180, +1,116,1,122,255,70,1,116,1,128,255,104,1,116,1,130,255,180,1,116,1,131,255, +104,1,116,1,133,255,104,1,116,1,136,255,70,1,116,1,140,255,70,1,116,1,143, +255,70,1,116,1,147,0,98,1,116,1,149,255,70,1,125,1,132,255,217,1,125,1,137, +255,227,1,125,1,141,255,227,1,125,1,144,255,201,1,127,1,117,255,119,1,127, +1,119,255,219,1,127,1,122,255,119,1,127,1,124,255,170,1,127,1,125,255,180, +1,127,1,128,255,219,1,127,1,129,255,158,1,127,1,130,255,219,1,127,1,131,255, +219,1,127,1,134,255,170,1,127,1,136,255,119,1,127,1,137,255,170,1,127,1,140, +255,119,1,127,1,141,255,170,1,127,1,143,255,119,1,127,1,146,255,119,1,127, +1,149,255,119,1,127,1,151,255,119,1,129,1,132,255,217,1,131,1,117,255,231, +1,131,1,122,255,231,1,131,1,125,255,231,1,131,1,127,255,231,1,131,1,129,255, +231,1,131,1,135,255,231,1,131,1,136,255,231,1,131,1,139,255,231,1,131,1,140, +255,231,1,131,1,143,255,231,1,131,1,146,255,231,1,131,1,149,255,231,1,131, +1,151,255,231,1,132,1,117,255,225,1,132,1,122,255,225,1,132,1,125,255,225, +1,132,1,135,255,225,1,132,1,136,255,225,1,132,1,139,255,209,1,132,1,140,255, +225,1,132,1,142,255,207,1,132,1,143,255,219,1,132,1,146,255,225,1,132,1,149, +255,225,1,132,1,150,255,207,1,132,1,151,255,225,1,135,1,117,255,201,1,135, +1,122,255,201,1,135,1,125,255,201,1,135,1,127,255,201,1,135,1,135,255,201, +1,135,1,136,255,201,1,135,1,139,255,201,1,135,1,140,255,201,1,135,1,143,255, +201,1,135,1,149,255,201,1,136,1,132,255,217,1,136,1,137,255,227,1,136,1,141, +255,227,1,136,1,144,255,201,1,137,1,117,255,227,1,137,1,122,255,227,1,137, +1,127,255,227,1,137,1,136,255,227,1,137,1,139,255,227,1,137,1,140,255,227, +1,137,1,143,255,227,1,137,1,146,255,227,1,137,1,151,255,227,1,138,1,132,255, +217,1,138,1,137,255,227,1,138,1,141,255,227,1,141,1,117,255,227,1,141,1,122, +255,227,1,141,1,125,255,227,1,141,1,127,255,227,1,141,1,136,255,227,1,141, +1,139,255,227,1,141,1,140,255,227,1,141,1,143,255,227,1,141,1,146,255,227, +1,141,1,151,255,227,1,143,1,132,255,217,1,143,1,137,255,227,1,143,1,141,255, +227,1,143,1,144,255,201,1,144,1,117,255,201,1,144,1,122,255,201,1,144,1,125, +255,201,1,144,1,127,255,201,1,144,1,136,255,201,1,144,1,139,255,201,1,144, +1,140,255,201,1,144,1,143,255,201,1,144,1,146,255,201,1,144,1,149,255,201, +1,144,1,151,255,201,1,146,1,132,255,217,1,146,1,137,255,227,1,146,1,141,255, +227,1,146,1,144,255,201,1,149,1,132,255,217,1,149,1,137,255,227,1,149,1,141, +255,227,1,149,1,144,255,201,1,151,1,132,255,217,1,151,1,137,255,227,1,151, +1,141,255,227,1,151,1,144,255,201,1,154,0,15,255,6,1,154,0,17,255,6,1,154, +0,108,255,119,1,154,0,123,255,119,1,154,1,255,255,211,1,160,2,3,255,96,1, +161,2,3,255,119,1,166,1,170,0,68,1,166,1,173,255,233,1,166,1,177,0,45,1,166, +1,180,255,211,1,166,1,181,255,233,1,166,1,183,255,211,1,166,1,184,255,96, +1,166,1,185,255,166,1,166,1,186,255,188,1,166,1,189,255,96,1,166,1,195,255, +211,1,166,1,198,0,23,1,166,1,216,255,211,1,166,1,217,255,233,1,166,1,218, +0,23,1,166,1,227,0,45,1,166,2,3,255,141,1,167,1,166,255,211,1,167,1,173,255, +233,1,167,1,180,255,233,1,167,1,183,255,233,1,167,1,184,255,164,1,167,1,185, +255,209,1,167,1,186,255,233,1,167,1,187,255,211,1,167,1,189,255,164,1,167, +1,192,255,188,1,167,1,195,255,233,1,167,1,197,255,233,1,167,1,209,255,233, +1,167,1,217,255,211,1,168,1,166,255,188,1,168,1,170,255,211,1,168,1,172,255, +211,1,168,1,173,255,188,1,168,1,177,255,233,1,168,1,180,255,188,1,168,1,183, +255,188,1,168,1,184,255,119,1,168,1,185,255,188,1,168,1,186,255,188,1,168, +1,187,255,166,1,168,1,189,255,164,1,168,1,192,255,141,1,168,1,197,255,188, +1,168,1,202,255,233,1,168,1,210,255,233,1,168,1,216,255,188,1,168,1,217,255, +233,1,168,1,219,255,233,1,168,1,221,255,188,1,168,1,229,255,233,1,169,0,15, +255,6,1,169,0,17,255,6,1,169,0,108,255,119,1,169,0,123,255,119,1,169,1,166, +255,119,1,169,1,170,255,119,1,169,1,173,255,211,1,169,1,177,255,141,1,169, +1,178,255,209,1,169,1,180,255,141,1,169,1,183,255,164,1,169,1,197,255,188, +1,169,1,198,255,141,1,169,1,200,255,141,1,169,1,202,255,119,1,169,1,203,255, +119,1,169,1,206,255,141,1,169,1,209,255,141,1,169,1,210,255,141,1,169,1,211, +255,141,1,169,1,212,255,119,1,169,1,214,255,141,1,169,1,217,255,119,1,169, +1,225,255,141,1,169,1,226,255,141,1,169,1,228,255,141,1,169,1,229,255,119, +1,169,1,255,255,211,1,170,1,185,0,23,1,170,1,186,255,211,1,170,1,189,255, +186,1,170,1,205,0,68,1,170,1,212,0,23,1,170,1,217,0,45,1,171,1,173,255,211, +1,171,1,215,255,233,1,172,1,173,255,233,1,172,1,180,255,211,1,172,1,183,255, +233,1,172,1,184,0,23,1,172,1,185,0,45,1,172,1,192,0,45,1,172,1,198,0,23,1, +172,1,203,255,231,1,172,1,212,255,233,1,172,1,217,255,233,1,173,1,177,255, +233,1,173,1,180,255,233,1,173,1,183,255,233,1,173,1,184,255,211,1,173,1,185, +255,233,1,173,1,186,255,233,1,173,1,189,255,211,1,173,1,197,255,233,1,176, +1,173,255,233,1,176,1,180,255,233,1,176,1,183,255,233,1,176,1,185,0,23,1, +176,1,186,255,186,1,177,1,186,255,233,1,177,1,199,0,23,1,177,1,217,0,23,1, +178,1,186,255,233,1,178,1,189,255,233,1,178,1,198,0,23,1,178,1,203,0,23,1, +178,1,212,0,23,1,178,1,215,0,23,1,178,1,217,0,23,1,178,1,221,255,233,1,178, +1,227,0,23,1,180,1,166,255,211,1,180,1,170,255,211,1,180,1,172,255,211,1, +180,1,177,255,233,1,180,1,185,255,211,1,180,1,187,255,164,1,180,1,189,255, +211,1,180,1,197,255,211,1,180,1,202,255,211,1,180,1,209,255,233,1,180,1,219, +255,233,1,182,0,15,254,125,1,182,0,17,254,125,1,182,0,29,255,211,1,182,0, +30,255,211,1,182,0,123,255,141,1,182,1,166,255,119,1,182,1,170,255,119,1, +182,1,172,255,233,1,182,1,173,255,211,1,182,1,177,255,141,1,182,1,178,255, +233,1,182,1,180,255,211,1,182,1,183,255,233,1,182,1,184,255,164,1,182,1,185, +255,211,1,182,1,186,255,233,1,182,1,187,255,164,1,182,1,197,255,211,1,182, +1,198,255,188,1,182,1,202,255,96,1,182,1,203,255,166,1,182,1,212,255,166, +1,182,1,227,255,211,1,182,1,229,255,188,1,183,1,166,255,211,1,183,1,170,255, +211,1,183,1,173,255,233,1,183,1,177,255,188,1,183,1,178,255,233,1,183,1,180, +255,211,1,183,1,184,255,188,1,183,1,185,255,188,1,183,1,187,255,141,1,183, +1,189,255,188,1,183,1,192,255,186,1,183,1,195,255,233,1,183,1,198,0,23,1, +183,1,204,0,45,1,183,1,221,255,233,1,184,0,15,255,29,1,184,0,17,255,29,1, +184,0,108,255,166,1,184,0,123,255,166,1,184,1,166,255,188,1,184,1,170,255, +188,1,184,1,172,0,23,1,184,1,173,255,233,1,184,1,177,255,211,1,184,1,180, +255,164,1,184,1,186,255,188,1,184,1,197,255,211,1,184,1,198,255,164,1,184, +1,200,255,166,1,184,1,203,255,141,1,184,1,206,255,166,1,184,1,208,255,166, +1,184,1,209,255,164,1,184,1,210,255,166,1,184,1,212,255,96,1,184,1,213,255, +166,1,184,1,214,255,141,1,184,1,215,255,141,1,184,1,217,255,141,1,184,1,219, +255,166,1,184,1,223,255,166,1,184,1,225,255,166,1,184,1,226,255,166,1,184, +1,228,255,166,1,184,1,229,255,141,1,184,1,255,255,211,1,185,0,15,254,240, +1,185,0,17,254,240,1,185,0,29,255,211,1,185,0,30,255,211,1,185,0,108,255, +166,1,185,0,123,255,164,1,185,1,166,255,119,1,185,1,170,255,164,1,185,1,173, +255,211,1,185,1,177,255,188,1,185,1,180,255,188,1,185,1,186,255,188,1,185, +1,195,255,211,1,185,1,197,255,211,1,185,1,199,255,211,1,185,1,200,255,141, +1,185,1,201,255,164,1,185,1,202,255,96,1,185,1,203,255,119,1,185,1,204,255, +188,1,185,1,205,255,141,1,185,1,206,255,164,1,185,1,207,255,188,1,185,1,208, +255,164,1,185,1,209,255,119,1,185,1,210,255,164,1,185,1,211,255,164,1,185, +1,212,255,119,1,185,1,213,255,164,1,185,1,214,255,164,1,185,1,215,255,119, +1,185,1,219,255,164,1,185,1,220,255,164,1,185,1,222,255,164,1,185,1,223,255, +164,1,185,1,228,255,164,1,185,1,229,255,119,1,185,1,255,255,233,1,186,1,166, +255,211,1,186,1,170,255,188,1,186,1,177,255,188,1,186,1,184,255,141,1,186, +1,185,255,164,1,186,1,189,255,211,1,186,1,197,255,186,1,186,1,209,255,188, +1,187,1,173,255,211,1,187,1,180,255,188,1,187,1,183,255,188,1,187,1,186,255, +188,1,187,1,195,255,186,1,187,1,212,255,233,1,187,1,217,255,211,1,188,1,180, +255,211,1,188,1,198,0,45,1,191,1,198,0,23,1,191,1,217,0,45,1,192,1,197,255, +188,1,192,2,3,255,119,1,194,1,166,255,211,1,194,1,170,255,211,1,194,1,172, +255,188,1,194,1,173,255,233,1,194,1,177,255,186,1,194,1,178,255,211,1,194, +1,180,255,211,1,194,1,183,255,211,1,194,1,184,255,51,1,194,1,187,255,164, +1,194,1,189,255,96,1,194,1,195,255,233,1,194,1,197,255,164,1,194,2,3,255, +96,1,195,1,170,255,188,1,195,1,172,255,231,1,195,1,173,255,233,1,195,1,177, +255,188,1,195,1,187,255,186,1,195,1,197,255,211,1,195,1,202,255,188,1,195, +1,204,0,23,1,195,1,209,255,188,1,195,1,210,255,233,1,195,1,229,255,233,1, +196,1,166,255,188,1,196,1,170,255,166,1,196,1,172,255,211,1,196,1,177,255, +164,1,196,1,180,255,233,1,196,1,183,255,233,1,196,1,184,255,141,1,196,1,187, +255,164,1,196,1,189,255,188,1,196,1,202,255,164,1,196,1,209,255,164,1,196, +1,210,255,233,1,198,1,205,255,233,1,198,1,216,255,211,1,198,1,217,255,233, +1,198,1,221,255,211,1,199,1,198,255,209,1,199,1,202,255,164,1,199,1,203,255, +233,1,199,1,204,255,233,1,199,1,205,255,211,1,199,1,209,255,164,1,199,1,210, +255,211,1,199,1,215,255,233,1,199,1,217,255,211,1,199,1,218,255,233,1,199, +1,219,255,188,1,199,1,221,255,188,1,199,1,224,255,188,1,199,1,227,255,233, +1,199,1,229,255,211,1,200,1,198,255,233,1,200,1,199,255,233,1,200,1,202,255, +233,1,200,1,203,255,233,1,200,1,204,255,233,1,200,1,205,255,233,1,200,1,209, +255,209,1,200,1,210,255,233,1,200,1,212,255,233,1,200,1,215,255,233,1,200, +1,216,255,211,1,200,1,217,255,211,1,200,1,218,255,233,1,200,1,221,255,164, +1,200,1,224,255,188,1,200,1,229,255,233,1,201,0,15,255,6,1,201,0,17,255,6, +1,201,1,198,255,211,1,201,1,202,255,164,1,201,1,203,255,211,1,201,1,205,255, +233,1,201,1,209,255,211,1,201,1,212,255,211,1,201,1,215,255,211,1,201,1,229, +255,233,1,202,1,224,255,211,1,202,1,227,0,23,1,203,1,199,255,233,1,203,1, +202,255,211,1,203,1,204,255,233,1,203,1,205,255,211,1,203,1,209,255,188,1, +203,1,216,255,188,1,203,1,217,255,233,1,203,1,219,255,211,1,203,1,221,255, +188,1,204,1,199,0,23,1,204,1,217,0,23,1,204,1,221,255,233,1,204,1,224,0,45, +1,205,1,199,255,233,1,205,1,202,255,211,1,205,1,203,255,233,1,205,1,205,255, +233,1,205,1,209,255,233,1,205,1,212,255,233,1,205,1,215,255,233,1,205,1,217, +255,233,1,205,1,218,255,233,1,205,1,221,255,188,1,205,1,224,255,211,1,208, +1,198,0,45,1,208,1,199,0,45,1,208,1,203,0,23,1,208,1,205,0,23,1,208,1,209, +0,23,1,208,1,212,0,23,1,208,1,215,0,23,1,208,1,216,0,23,1,208,1,217,0,23, +1,208,1,227,0,23,1,209,1,212,0,23,1,209,1,221,255,211,1,210,1,199,255,233, +1,210,1,205,255,233,1,210,1,217,0,23,1,212,1,202,255,211,1,212,1,204,255, +233,1,212,1,205,255,233,1,212,1,209,255,211,1,212,1,216,255,211,1,212,1,217, +255,233,1,212,1,219,255,233,1,212,1,221,255,211,1,214,1,202,255,209,1,214, +1,205,255,233,1,214,1,209,255,186,1,214,1,216,255,211,1,214,1,217,255,233, +1,214,1,219,255,233,1,214,1,221,255,211,1,214,1,229,255,233,1,215,1,204,0, +23,1,215,1,212,0,23,1,215,1,221,255,233,1,215,1,227,0,23,1,216,0,15,255,29, +1,216,0,17,255,29,1,216,1,198,255,233,1,216,1,202,255,188,1,216,1,203,255, +233,1,216,1,204,0,68,1,216,1,209,255,211,1,216,1,212,255,233,1,216,1,215, +255,233,1,216,1,217,0,23,1,217,0,15,255,51,1,217,0,17,255,51,1,217,0,123, +0,23,1,217,1,198,255,233,1,217,1,199,0,23,1,217,1,202,255,188,1,217,1,203, +255,233,1,217,1,204,0,23,1,217,1,209,255,211,1,217,1,210,255,233,1,217,1, +212,255,231,1,217,1,214,255,233,1,217,1,215,255,233,1,217,1,218,255,233,1, +217,1,227,255,233,1,217,1,229,255,233,1,218,1,199,255,233,1,218,1,202,255, +211,1,218,1,209,255,211,1,218,1,216,255,211,1,218,1,217,255,233,1,218,1,221, +255,211,1,218,1,229,255,233,1,219,1,198,255,233,1,219,1,199,255,233,1,219, +1,203,255,233,1,219,1,205,255,233,1,219,1,212,255,233,1,219,1,215,255,233, +1,219,1,216,255,233,1,219,1,218,255,233,1,219,1,221,255,211,1,220,1,203,255, +233,1,220,1,205,255,233,1,220,1,212,255,233,1,220,1,215,255,233,1,223,1,203, +255,233,1,223,1,212,255,233,1,223,1,217,0,23,1,226,1,216,255,96,1,226,1,221, +255,119,1,227,1,202,255,211,1,227,1,203,0,23,1,227,1,205,255,233,1,227,1, +209,255,211,1,227,1,212,0,23,1,227,1,216,255,211,1,227,1,219,255,233,1,227, +1,229,255,233,1,228,1,202,255,211,1,228,1,204,255,233,1,228,1,209,255,211, +1,228,1,210,255,233,1,228,1,216,255,211,1,228,1,219,255,233,1,228,1,221,255, +211,1,242,0,15,255,51,1,242,0,17,255,51,1,244,0,15,255,6,1,244,0,17,255,6, +1,244,0,29,255,211,1,244,0,30,255,211,1,244,0,108,255,96,1,244,0,123,255, +96,1,244,1,255,255,211,2,2,2,2,255,219,2,3,0,3,255,180,2,3,0,86,255,219,2, +3,2,3,255,219,2,8,1,153,255,96,2,8,1,162,255,96,2,8,1,184,255,96,2,8,1,189, +255,188,2,8,1,192,255,188,0,0,0,0,0,28,1,86,0,1,0,0,0,0,0,0,0,64,0,130,0, +1,0,0,0,0,0,1,0,15,0,227,0,1,0,0,0,0,0,2,0,7,1,3,0,1,0,0,0,0,0,3,0,26,1,65, +0,1,0,0,0,0,0,4,0,15,1,124,0,1,0,0,0,0,0,5,0,12,1,166,0,1,0,0,0,0,0,6,0,14, +1,209,0,1,0,0,0,0,0,7,0,122,2,214,0,1,0,0,0,0,0,8,0,20,3,123,0,1,0,0,0,0, +0,9,0,14,3,174,0,1,0,0,0,0,0,11,0,28,3,247,0,1,0,0,0,0,0,12,0,46,4,114,0, +1,0,0,0,0,0,13,0,127,5,161,0,1,0,0,0,0,0,14,0,43,6,121,0,3,0,1,4,9,0,0,0, +128,0,0,0,3,0,1,4,9,0,1,0,30,0,195,0,3,0,1,4,9,0,2,0,14,0,243,0,3,0,1,4,9, +0,3,0,52,1,11,0,3,0,1,4,9,0,4,0,30,1,92,0,3,0,1,4,9,0,5,0,24,1,140,0,3,0, +1,4,9,0,6,0,28,1,179,0,3,0,1,4,9,0,7,0,244,1,224,0,3,0,1,4,9,0,8,0,40,3,81, +0,3,0,1,4,9,0,9,0,28,3,144,0,3,0,1,4,9,0,11,0,56,3,189,0,3,0,1,4,9,0,12,0, +92,4,20,0,3,0,1,4,9,0,13,0,254,4,161,0,3,0,1,4,9,0,14,0,86,6,33,0,68,0,105, +0,103,0,105,0,116,0,105,0,122,0,101,0,100,0,32,0,100,0,97,0,116,0,97,0,32, +0,169,0,32,0,50,0,48,0,48,0,55,0,32,0,65,0,115,0,99,0,101,0,110,0,100,0,101, +0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110, +0,46,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32, +0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,0,68,105,103,105,116, +105,122,101,100,32,100,97,116,97,32,169,32,50,48,48,55,32,65,115,99,101,110, +100,101,114,32,67,111,114,112,111,114,97,116,105,111,110,46,32,65,108,108, +32,114,105,103,104,116,115,32,114,101,115,101,114,118,101,100,46,0,0,76,0, +105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0, +115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115,0,0,82,0,101, +0,103,0,117,0,108,0,97,0,114,0,0,82,101,103,117,108,97,114,0,0,65,0,115,0, +99,0,101,0,110,0,100,0,101,0,114,0,32,0,45,0,32,0,76,0,105,0,98,0,101,0,114, +0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0,115,0,0,65,115,99,101, +110,100,101,114,32,45,32,76,105,98,101,114,97,116,105,111,110,32,83,97,110, +115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83, +0,97,0,110,0,115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115, +0,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,48,0,50,0,0,86, +101,114,115,105,111,110,32,49,46,48,50,0,0,76,0,105,0,98,0,101,0,114,0,97, +0,116,0,105,0,111,0,110,0,83,0,97,0,110,0,115,0,0,76,105,98,101,114,97,116, +105,111,110,83,97,110,115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105, +0,111,0,110,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101, +0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,32,0,82,0,101,0,100,0,32,0,72,0, +97,0,116,0,44,0,32,0,73,0,110,0,99,0,46,0,32,0,114,0,101,0,103,0,105,0,115, +0,116,0,101,0,114,0,101,0,100,0,32,0,105,0,110,0,32,0,85,0,46,0,83,0,46,0, +32,0,80,0,97,0,116,0,101,0,110,0,116,0,32,0,97,0,110,0,100,0,32,0,84,0,114, +0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,79,0,102,0,102,0,105,0,99, +0,101,0,32,0,97,0,110,0,100,0,32,0,99,0,101,0,114,0,116,0,97,0,105,0,110, +0,32,0,111,0,116,0,104,0,101,0,114,0,32,0,106,0,117,0,114,0,105,0,115,0,100, +0,105,0,99,0,116,0,105,0,111,0,110,0,115,0,46,0,0,76,105,98,101,114,97,116, +105,111,110,32,105,115,32,97,32,116,114,97,100,101,109,97,114,107,32,111, +102,32,82,101,100,32,72,97,116,44,32,73,110,99,46,32,114,101,103,105,115, +116,101,114,101,100,32,105,110,32,85,46,83,46,32,80,97,116,101,110,116,32, +97,110,100,32,84,114,97,100,101,109,97,114,107,32,79,102,102,105,99,101,32, +97,110,100,32,99,101,114,116,97,105,110,32,111,116,104,101,114,32,106,117, +114,105,115,100,105,99,116,105,111,110,115,46,0,0,65,0,115,0,99,0,101,0,110, +0,100,0,101,0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105, +0,111,0,110,0,0,65,115,99,101,110,100,101,114,32,67,111,114,112,111,114,97, +116,105,111,110,0,0,83,0,116,0,101,0,118,0,101,0,32,0,77,0,97,0,116,0,116, +0,101,0,115,0,111,0,110,0,0,83,116,101,118,101,32,77,97,116,116,101,115,111, +110,0,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97, +0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99, +0,111,0,109,0,47,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101, +110,100,101,114,99,111,114,112,46,99,111,109,47,0,0,104,0,116,0,116,0,112, +0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,110,0,100,0, +101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,116,0,121,0, +112,0,101,0,100,0,101,0,115,0,105,0,103,0,110,0,101,0,114,0,115,0,46,0,104, +0,116,0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101, +110,100,101,114,99,111,114,112,46,99,111,109,47,116,121,112,101,100,101,115, +105,103,110,101,114,115,46,104,116,109,108,0,0,85,0,115,0,101,0,32,0,111, +0,102,0,32,0,116,0,104,0,105,0,115,0,32,0,76,0,105,0,98,0,101,0,114,0,97, +0,116,0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102, +0,116,0,119,0,97,0,114,0,101,0,32,0,105,0,115,0,32,0,115,0,117,0,98,0,106, +0,101,0,99,0,116,0,32,0,116,0,111,0,32,0,116,0,104,0,101,0,32,0,108,0,105, +0,99,0,101,0,110,0,115,0,101,0,32,0,97,0,103,0,114,0,101,0,101,0,109,0,101, +0,110,0,116,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,119,0,104,0,105,0,99, +0,104,0,32,0,121,0,111,0,117,0,32,0,97,0,99,0,99,0,101,0,112,0,116,0,101, +0,100,0,32,0,116,0,104,0,101,0,32,0,76,0,105,0,98,0,101,0,114,0,97,0,116, +0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102,0,116, +0,119,0,97,0,114,0,101,0,46,0,0,85,115,101,32,111,102,32,116,104,105,115, +32,76,105,98,101,114,97,116,105,111,110,32,102,111,110,116,32,115,111,102, +116,119,97,114,101,32,105,115,32,115,117,98,106,101,99,116,32,116,111,32, +116,104,101,32,108,105,99,101,110,115,101,32,97,103,114,101,101,109,101,110, +116,32,117,110,100,101,114,32,119,104,105,99,104,32,121,111,117,32,97,99, +99,101,112,116,101,100,32,116,104,101,32,76,105,98,101,114,97,116,105,111, +110,32,102,111,110,116,32,115,111,102,116,119,97,114,101,46,0,0,104,0,116, +0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0, +110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0, +108,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,46,0,104,0,116, +0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,110, +100,101,114,99,111,114,112,46,99,111,109,47,108,105,98,101,114,97,116,105, +111,110,46,104,116,109,108,0,0,0,2,0,0,0,0,0,0,255,39,0,150,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,2,156,0,0,0,1,0,2,1,2,0,4,0,5,0,6,0,7,0,8,0,9,0, +10,0,11,0,12,0,13,0,14,0,15,1,3,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0, +25,0,26,0,27,0,28,0,29,1,4,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0, +40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54, +0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69, +0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84, +0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,163,0, +132,0,133,0,189,0,150,0,232,0,134,0,142,0,139,0,157,0,169,0,164,0,138,0,218, +0,131,0,147,1,5,1,6,0,141,1,7,0,136,1,8,0,222,1,9,0,158,0,170,0,245,0,244, +0,246,0,162,0,173,0,201,0,199,0,174,0,98,0,99,0,144,0,100,0,203,0,101,0,200, +0,202,0,207,0,204,0,205,0,206,0,233,0,102,0,211,0,208,0,209,0,175,0,103,0, +240,0,145,0,214,0,212,0,213,0,104,0,235,0,237,0,137,0,106,0,105,0,107,0,109, +0,108,0,110,0,160,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0, +234,0,120,0,122,0,121,0,123,0,125,0,124,0,184,0,161,0,127,0,126,0,128,0,129, +0,236,0,238,0,186,1,10,1,11,1,12,1,13,1,14,1,15,0,253,0,254,1,16,1,17,1,18, +1,19,0,255,1,0,1,20,1,21,1,22,1,1,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30, +1,31,1,32,1,33,1,34,0,248,0,249,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1, +43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,0,250,0,215,1,51,1,52,1,53,1,54,1,55, +1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,0,226,0,227,1,66,1,67,1, +68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,0,176,0,177, +1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,0,251,0,252,0,228,0,229, +1,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104, +1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,0,187,1,113,1,114,1,115,1, +116,0,230,0,231,1,117,0,166,1,118,1,119,1,120,1,121,1,122,1,123,0,216,0,225, +1,124,0,219,0,220,0,221,0,224,0,217,0,223,1,125,1,126,1,127,1,128,1,129,1, +130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,1,138,0,168,1,139,1,140,1,141, +1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151,1,152,1,153,1, +154,1,155,1,156,1,157,0,159,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165, +1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,0,151,1,176,1, +177,1,178,0,155,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188, +1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1, +201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213, +1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1, +226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238, +1,239,1,240,1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1, +251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10, +2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25, +2,26,2,27,2,28,2,29,2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,0,178,0, +179,2,39,2,40,0,182,0,183,0,196,2,41,0,180,0,181,0,197,0,130,0,194,0,135, +0,171,0,198,2,42,2,43,0,190,0,191,2,44,2,45,2,46,2,47,0,247,2,48,2,49,2,50, +2,51,2,52,2,53,0,140,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2, +64,2,65,2,66,0,152,2,67,0,154,0,153,0,239,0,165,0,146,2,68,2,69,0,156,0,167, +0,143,2,70,0,148,0,149,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80, +2,81,2,82,2,83,2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95, +2,96,2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108, +2,109,2,110,2,111,2,112,2,113,2,114,2,115,2,116,2,117,2,118,2,119,2,120,2, +121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,0,185,2,132, +2,133,2,134,2,135,2,136,2,137,2,138,2,139,2,140,2,141,2,142,2,143,2,144,2, +145,2,146,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,2,155,2,156,2,157, +2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,7,117,110,105, +48,48,65,48,7,117,110,105,48,48,65,68,7,117,110,105,48,51,55,69,7,117,110, +105,48,48,66,50,7,117,110,105,48,48,66,51,7,117,110,105,48,48,66,53,7,117, +110,105,50,50,49,57,7,117,110,105,48,48,66,57,7,65,109,97,99,114,111,110, +7,97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97,98,114,101,118,101, +7,65,111,103,111,110,101,107,7,97,111,103,111,110,101,107,11,67,99,105,114, +99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,10, +67,100,111,116,97,99,99,101,110,116,10,99,100,111,116,97,99,99,101,110,116, +6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,68,99,114,111,97,116,7,69, +109,97,99,114,111,110,7,101,109,97,99,114,111,110,6,69,98,114,101,118,101, +6,101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110,116,10,101,100, +111,116,97,99,99,101,110,116,7,69,111,103,111,110,101,107,7,101,111,103,111, +110,101,107,6,69,99,97,114,111,110,6,101,99,97,114,111,110,11,71,99,105,114, +99,117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108,101,120,10, +71,100,111,116,97,99,99,101,110,116,10,103,100,111,116,97,99,99,101,110,116, +12,71,99,111,109,109,97,97,99,99,101,110,116,12,103,99,111,109,109,97,97, +99,99,101,110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104,99,105, +114,99,117,109,102,108,101,120,4,72,98,97,114,4,104,98,97,114,6,73,116,105, +108,100,101,6,105,116,105,108,100,101,7,73,109,97,99,114,111,110,7,105,109, +97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101,118,101,7,73,111, +103,111,110,101,107,7,105,111,103,111,110,101,107,2,73,74,2,105,106,11,74, +99,105,114,99,117,109,102,108,101,120,11,106,99,105,114,99,117,109,102,108, +101,120,12,75,99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109,109, +97,97,99,99,101,110,116,12,107,103,114,101,101,110,108,97,110,100,105,99, +6,76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97, +99,99,101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97, +114,111,110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,6, +78,97,99,117,116,101,6,110,97,99,117,116,101,12,78,99,111,109,109,97,97,99, +99,101,110,116,12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99,97,114, +111,110,6,110,99,97,114,111,110,11,110,97,112,111,115,116,114,111,112,104, +101,3,69,110,103,3,101,110,103,7,79,109,97,99,114,111,110,7,111,109,97,99, +114,111,110,6,79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104,117, +110,103,97,114,117,109,108,97,117,116,13,111,104,117,110,103,97,114,117,109, +108,97,117,116,6,82,97,99,117,116,101,6,114,97,99,117,116,101,12,82,99,111, +109,109,97,97,99,99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110, +116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,83,97,99,117,116,101, +6,115,97,99,117,116,101,11,83,99,105,114,99,117,109,102,108,101,120,11,115, +99,105,114,99,117,109,102,108,101,120,12,84,99,111,109,109,97,97,99,99,101, +110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,6,84,99,97,114,111, +110,6,116,99,97,114,111,110,4,84,98,97,114,4,116,98,97,114,6,85,116,105,108, +100,101,6,117,116,105,108,100,101,7,85,109,97,99,114,111,110,7,117,109,97, +99,114,111,110,6,85,98,114,101,118,101,6,117,98,114,101,118,101,5,85,114, +105,110,103,5,117,114,105,110,103,13,85,104,117,110,103,97,114,117,109,108, +97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,85,111, +103,111,110,101,107,7,117,111,103,111,110,101,107,11,87,99,105,114,99,117, +109,102,108,101,120,11,119,99,105,114,99,117,109,102,108,101,120,11,89,99, +105,114,99,117,109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101, +120,6,90,97,99,117,116,101,6,122,97,99,117,116,101,10,90,100,111,116,97,99, +99,101,110,116,10,122,100,111,116,97,99,99,101,110,116,5,108,111,110,103, +115,10,65,114,105,110,103,97,99,117,116,101,10,97,114,105,110,103,97,99,117, +116,101,7,65,69,97,99,117,116,101,7,97,101,97,99,117,116,101,11,79,115,108, +97,115,104,97,99,117,116,101,11,111,115,108,97,115,104,97,99,117,116,101, +7,117,110,105,48,50,67,57,5,116,111,110,111,115,13,100,105,101,114,101,115, +105,115,116,111,110,111,115,10,65,108,112,104,97,116,111,110,111,115,9,97, +110,111,116,101,108,101,105,97,12,69,112,115,105,108,111,110,116,111,110, +111,115,8,69,116,97,116,111,110,111,115,9,73,111,116,97,116,111,110,111,115, +12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111, +110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,17,105,111, +116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,5,65,108,112,104, +97,4,66,101,116,97,5,71,97,109,109,97,7,69,112,115,105,108,111,110,4,90,101, +116,97,3,69,116,97,5,84,104,101,116,97,4,73,111,116,97,5,75,97,112,112,97, +6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111, +110,2,80,105,3,82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112,115,105, +108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,12,73,111,116,97,100,105, +101,114,101,115,105,115,15,85,112,115,105,108,111,110,100,105,101,114,101, +115,105,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108, +111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,9,105,111,116, +97,116,111,110,111,115,20,117,112,115,105,108,111,110,100,105,101,114,101, +115,105,115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116,97,5,103, +97,109,109,97,5,100,101,108,116,97,7,101,112,115,105,108,111,110,4,122,101, +116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112, +97,6,108,97,109,98,100,97,2,110,117,2,120,105,7,111,109,105,99,114,111,110, +3,114,104,111,6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97,117,7, +117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111, +109,101,103,97,12,105,111,116,97,100,105,101,114,101,115,105,115,15,117,112, +115,105,108,111,110,100,105,101,114,101,115,105,115,12,111,109,105,99,114, +111,110,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111, +115,10,111,109,101,103,97,116,111,110,111,115,9,97,102,105,105,49,48,48,50, +51,9,97,102,105,105,49,48,48,53,49,9,97,102,105,105,49,48,48,53,50,9,97,102, +105,105,49,48,48,53,51,9,97,102,105,105,49,48,48,53,52,9,97,102,105,105,49, +48,48,53,53,9,97,102,105,105,49,48,48,53,54,9,97,102,105,105,49,48,48,53, +55,9,97,102,105,105,49,48,48,53,56,9,97,102,105,105,49,48,48,53,57,9,97,102, +105,105,49,48,48,54,48,9,97,102,105,105,49,48,48,54,49,9,97,102,105,105,49, +48,48,54,50,9,97,102,105,105,49,48,49,52,53,9,97,102,105,105,49,48,48,49, +55,9,97,102,105,105,49,48,48,49,56,9,97,102,105,105,49,48,48,49,57,9,97,102, +105,105,49,48,48,50,48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105,49, +48,48,50,50,9,97,102,105,105,49,48,48,50,52,9,97,102,105,105,49,48,48,50, +53,9,97,102,105,105,49,48,48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102, +105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50,57,9,97,102,105,105,49, +48,48,51,48,9,97,102,105,105,49,48,48,51,49,9,97,102,105,105,49,48,48,51, +50,9,97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48,48,51,52,9,97,102, +105,105,49,48,48,51,53,9,97,102,105,105,49,48,48,51,54,9,97,102,105,105,49, +48,48,51,55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105,49,48,48,51, +57,9,97,102,105,105,49,48,48,52,48,9,97,102,105,105,49,48,48,52,49,9,97,102, +105,105,49,48,48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102,105,105,49, +48,48,52,52,9,97,102,105,105,49,48,48,52,53,9,97,102,105,105,49,48,48,52, +54,9,97,102,105,105,49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9,97,102, +105,105,49,48,48,52,57,9,97,102,105,105,49,48,48,54,53,9,97,102,105,105,49, +48,48,54,54,9,97,102,105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54, +56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105,49,48,48,55,48,9,97,102, +105,105,49,48,48,55,50,9,97,102,105,105,49,48,48,55,51,9,97,102,105,105,49, +48,48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102,105,105,49,48,48,55, +54,9,97,102,105,105,49,48,48,55,55,9,97,102,105,105,49,48,48,55,56,9,97,102, +105,105,49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9,97,102,105,105,49, +48,48,56,49,9,97,102,105,105,49,48,48,56,50,9,97,102,105,105,49,48,48,56, +51,9,97,102,105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56,53,9,97,102, +105,105,49,48,48,56,54,9,97,102,105,105,49,48,48,56,55,9,97,102,105,105,49, +48,48,56,56,9,97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48,48,57, +48,9,97,102,105,105,49,48,48,57,49,9,97,102,105,105,49,48,48,57,50,9,97,102, +105,105,49,48,48,57,51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105,49, +48,48,57,53,9,97,102,105,105,49,48,48,57,54,9,97,102,105,105,49,48,48,57, +55,9,97,102,105,105,49,48,48,55,49,9,97,102,105,105,49,48,48,57,57,9,97,102, +105,105,49,48,49,48,48,9,97,102,105,105,49,48,49,48,49,9,97,102,105,105,49, +48,49,48,50,9,97,102,105,105,49,48,49,48,51,9,97,102,105,105,49,48,49,48, +52,9,97,102,105,105,49,48,49,48,53,9,97,102,105,105,49,48,49,48,54,9,97,102, +105,105,49,48,49,48,55,9,97,102,105,105,49,48,49,48,56,9,97,102,105,105,49, +48,49,48,57,9,97,102,105,105,49,48,49,49,48,9,97,102,105,105,49,48,49,57, +51,9,97,102,105,105,49,48,48,53,48,9,97,102,105,105,49,48,48,57,56,6,87,103, +114,97,118,101,6,119,103,114,97,118,101,6,87,97,99,117,116,101,6,119,97,99, +117,116,101,9,87,100,105,101,114,101,115,105,115,9,119,100,105,101,114,101, +115,105,115,6,89,103,114,97,118,101,6,121,103,114,97,118,101,9,97,102,105, +105,48,48,50,48,56,13,117,110,100,101,114,115,99,111,114,101,100,98,108,13, +113,117,111,116,101,114,101,118,101,114,115,101,100,6,109,105,110,117,116, +101,6,115,101,99,111,110,100,9,101,120,99,108,97,109,100,98,108,7,117,110, +105,50,48,51,69,7,117,110,105,50,50,49,53,7,117,110,105,50,48,55,70,4,108, +105,114,97,6,112,101,115,101,116,97,4,69,117,114,111,9,97,102,105,105,54, +49,50,52,56,9,97,102,105,105,54,49,50,56,57,9,97,102,105,105,54,49,51,53, +50,7,117,110,105,50,49,50,54,9,101,115,116,105,109,97,116,101,100,9,111,110, +101,101,105,103,104,116,104,12,116,104,114,101,101,101,105,103,104,116,104, +115,11,102,105,118,101,101,105,103,104,116,104,115,12,115,101,118,101,110, +101,105,103,104,116,104,115,9,97,114,114,111,119,108,101,102,116,7,97,114, +114,111,119,117,112,10,97,114,114,111,119,114,105,103,104,116,9,97,114,114, +111,119,100,111,119,110,9,97,114,114,111,119,98,111,116,104,9,97,114,114, +111,119,117,112,100,110,12,97,114,114,111,119,117,112,100,110,98,115,101, +7,117,110,105,50,50,48,54,10,111,114,116,104,111,103,111,110,97,108,12,105, +110,116,101,114,115,101,99,116,105,111,110,11,101,113,117,105,118,97,108, +101,110,99,101,5,104,111,117,115,101,13,114,101,118,108,111,103,105,99,97, +108,110,111,116,10,105,110,116,101,103,114,97,108,116,112,10,105,110,116, +101,103,114,97,108,98,116,8,83,70,49,48,48,48,48,48,8,83,70,49,49,48,48,48, +48,8,83,70,48,49,48,48,48,48,8,83,70,48,51,48,48,48,48,8,83,70,48,50,48,48, +48,48,8,83,70,48,52,48,48,48,48,8,83,70,48,56,48,48,48,48,8,83,70,48,57,48, +48,48,48,8,83,70,48,54,48,48,48,48,8,83,70,48,55,48,48,48,48,8,83,70,48,53, +48,48,48,48,8,83,70,52,51,48,48,48,48,8,83,70,50,52,48,48,48,48,8,83,70,53, +49,48,48,48,48,8,83,70,53,50,48,48,48,48,8,83,70,51,57,48,48,48,48,8,83,70, +50,50,48,48,48,48,8,83,70,50,49,48,48,48,48,8,83,70,50,53,48,48,48,48,8,83, +70,53,48,48,48,48,48,8,83,70,52,57,48,48,48,48,8,83,70,51,56,48,48,48,48, +8,83,70,50,56,48,48,48,48,8,83,70,50,55,48,48,48,48,8,83,70,50,54,48,48,48, +48,8,83,70,51,54,48,48,48,48,8,83,70,51,55,48,48,48,48,8,83,70,52,50,48,48, +48,48,8,83,70,49,57,48,48,48,48,8,83,70,50,48,48,48,48,48,8,83,70,50,51,48, +48,48,48,8,83,70,52,55,48,48,48,48,8,83,70,52,56,48,48,48,48,8,83,70,52,49, +48,48,48,48,8,83,70,52,53,48,48,48,48,8,83,70,52,54,48,48,48,48,8,83,70,52, +48,48,48,48,48,8,83,70,53,52,48,48,48,48,8,83,70,53,51,48,48,48,48,8,83,70, +52,52,48,48,48,48,7,117,112,98,108,111,99,107,7,100,110,98,108,111,99,107, +5,98,108,111,99,107,7,108,102,98,108,111,99,107,7,114,116,98,108,111,99,107, +7,108,116,115,104,97,100,101,5,115,104,97,100,101,7,100,107,115,104,97,100, +101,9,102,105,108,108,101,100,98,111,120,6,72,50,50,48,55,51,6,72,49,56,53, +52,51,6,72,49,56,53,53,49,10,102,105,108,108,101,100,114,101,99,116,7,116, +114,105,97,103,117,112,7,116,114,105,97,103,114,116,7,116,114,105,97,103, +100,110,7,116,114,105,97,103,108,102,6,99,105,114,99,108,101,6,72,49,56,53, +51,51,9,105,110,118,98,117,108,108,101,116,9,105,110,118,99,105,114,99,108, +101,10,111,112,101,110,98,117,108,108,101,116,9,115,109,105,108,101,102,97, +99,101,12,105,110,118,115,109,105,108,101,102,97,99,101,3,115,117,110,6,102, +101,109,97,108,101,4,109,97,108,101,5,115,112,97,100,101,4,99,108,117,98, +5,104,101,97,114,116,7,100,105,97,109,111,110,100,11,109,117,115,105,99,97, +108,110,111,116,101,14,109,117,115,105,99,97,108,110,111,116,101,100,98,108, +7,117,110,105,70,66,48,49,7,117,110,105,70,66,48,50,7,117,110,105,70,48,48, +53,6,109,105,100,100,111,116,7,117,110,105,70,48,48,52,7,117,110,105,50,48, +55,52,7,117,110,105,50,48,55,53,7,117,110,105,50,48,55,55,7,117,110,105,50, +48,55,56,8,103,108,121,112,104,53,55,49,8,103,108,121,112,104,53,55,50,8, +103,108,121,112,104,53,55,51,8,103,108,121,112,104,53,55,52,8,103,108,121, +112,104,53,55,53,8,103,108,121,112,104,53,55,54,8,103,108,121,112,104,53, +55,55,8,103,108,121,112,104,53,55,56,8,103,108,121,112,104,53,55,57,8,103, +108,121,112,104,53,56,48,8,103,108,121,112,104,53,56,49,0,0,0,0,0,0,3,0,8, +0,2,0,17,0,1,255,255,0,3,0,1,0,0,0,14,0,0,0,24,0,0,0,0,0,2,0,1,0,1,2,155, +0,1,0,4,0,0,0,2,0,0,0,1,0,0,0,10,0,76,0,78,0,4,68,70,76,84,0,26,99,121,114, +108,0,36,103,114,101,107,0,46,108,97,116,110,0,56,0,4,0,0,0,0,255,255,0,0, +0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0, +0,0,0,0,1,0,0,0,10,0,84,0,98,0,4,68,70,76,84,0,26,99,121,114,108,0,38,103, +114,101,107,0,50,108,97,116,110,0,62,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0, +0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0, +0,0,1,107,101,114,110,0,8,0,0,0,1,0,0,0,1,0,4,0,2,0,0,0,1,0,8,0,1,15,112, +0,4,0,0,0,105,0,220,1,6,1,12,1,50,1,64,1,94,1,112,1,130,1,204,2,2,2,52,2, +114,2,124,2,138,2,148,2,138,2,158,2,196,2,202,3,28,3,38,3,84,3,118,3,144, +3,166,3,228,3,254,4,20,4,46,4,56,4,190,5,44,5,58,3,28,5,100,5,186,5,204,6, +22,6,28,6,82,6,136,5,186,6,178,6,216,6,230,5,186,7,16,5,186,5,186,5,186,7, +62,7,84,7,90,7,96,7,166,7,224,8,54,8,168,8,194,8,204,8,246,9,24,9,46,9,60, +9,98,9,144,9,242,10,48,10,174,11,72,11,106,11,136,11,146,11,156,11,166,11, +224,12,14,12,64,12,82,12,144,12,210,12,252,13,6,13,44,13,62,13,108,13,150, +13,160,13,174,13,208,13,242,14,4,14,46,14,112,14,142,14,180,14,198,14,212, +14,222,15,0,15,30,15,40,15,70,15,76,15,90,0,10,0,36,255,143,0,55,255,219, +0,60,255,219,1,82,255,143,1,91,255,143,1,94,255,143,1,101,255,143,1,109,255, +219,1,110,255,219,1,116,255,219,0,1,0,20,255,104,0,9,0,3,255,143,0,55,255, +104,0,57,255,104,0,58,255,180,0,60,255,104,0,89,255,219,0,90,255,219,0,92, +255,219,2,3,255,104,0,3,0,15,255,29,0,17,255,29,0,36,255,143,0,7,0,3,255, +180,0,55,255,104,0,57,255,104,0,58,255,104,0,60,255,104,0,92,255,180,2,3, +255,143,0,4,0,3,255,219,0,15,254,248,0,17,254,248,0,36,255,104,0,4,0,55,255, +219,0,57,255,219,0,58,255,219,0,60,255,219,0,18,0,3,255,219,0,15,255,29,0, +16,255,143,0,17,255,29,0,29,255,29,0,30,255,29,0,36,255,104,0,50,255,219, +0,68,255,29,0,70,255,29,0,72,255,29,0,76,255,180,0,82,255,29,0,85,255,180, +0,86,255,29,0,88,255,180,0,90,255,143,0,92,255,143,0,13,0,15,255,68,0,16, +255,143,0,17,255,68,0,29,255,180,0,30,255,180,0,36,255,104,0,68,255,104,0, +72,255,143,0,76,255,219,0,82,255,143,0,85,255,180,0,88,255,180,0,92,255,180, +0,12,0,15,255,143,0,16,255,219,0,17,255,143,0,29,255,219,0,30,255,219,0,36, +255,180,0,68,255,180,0,72,255,219,0,82,255,219,0,85,255,219,0,88,255,219, +0,92,255,238,0,15,0,3,255,219,0,15,254,248,0,16,255,68,0,17,254,248,0,29, +255,143,0,30,255,123,0,36,255,104,0,68,255,104,0,72,255,68,0,76,255,180,0, +82,255,68,0,83,255,104,0,84,255,68,0,88,255,143,0,89,255,143,0,2,0,73,255, +219,2,3,0,37,0,3,0,15,255,143,0,17,255,143,2,3,0,76,0,2,0,15,255,104,0,17, +255,104,0,2,0,15,255,143,0,17,255,143,0,9,1,98,255,213,1,105,255,213,1,109, +255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124,255,219,1,134,255, +219,1,144,255,219,0,1,1,110,255,190,0,20,1,90,0,170,1,91,255,104,1,94,255, +104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255,158, +1,119,255,104,1,120,255,180,1,122,255,70,1,128,255,104,1,130,255,180,1,131, +255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1, +149,255,70,0,2,1,110,255,209,1,116,255,209,0,11,0,3,255,143,1,98,255,213, +1,105,255,213,1,109,255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124, +255,219,1,134,255,219,1,144,255,219,2,3,255,104,0,8,0,15,255,31,0,17,255, +31,1,90,0,164,1,91,255,68,1,94,255,68,1,101,255,68,1,130,255,168,1,147,0, +88,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,137,1,110,255,104, +1,116,255,104,0,5,1,91,255,219,1,94,255,219,1,101,255,219,1,110,255,190,1, +116,255,190,0,15,1,98,255,193,1,105,255,193,1,111,255,143,1,117,255,231,1, +122,255,231,1,125,255,231,1,127,255,231,1,129,255,231,1,135,255,231,1,136, +255,231,1,140,255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255, +231,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,104,1,110,255,104, +1,116,255,104,0,5,1,91,255,219,1,94,255,213,1,101,255,219,1,110,255,190,1, +116,255,190,0,6,0,3,255,219,0,15,254,250,0,17,254,250,1,91,255,104,1,94,255, +104,1,101,255,104,0,2,1,137,255,158,1,141,255,158,0,33,0,3,255,219,0,15,255, +31,0,17,255,31,0,29,255,31,0,30,255,31,1,90,0,188,1,91,255,104,1,94,255,104, +1,98,255,219,1,101,255,104,1,105,255,219,1,111,255,219,1,114,255,219,1,117, +255,31,1,118,255,31,1,121,255,78,1,122,255,31,1,124,255,78,1,126,255,31,1, +128,255,106,1,130,255,180,1,133,255,106,1,134,255,143,1,136,255,31,1,140, +255,31,1,142,255,80,1,143,255,31,1,144,255,143,1,145,255,106,1,147,0,188, +1,148,255,78,1,149,255,31,1,150,255,78,0,27,0,3,255,219,0,15,254,250,0,16, +255,70,0,17,254,250,0,29,255,143,0,30,255,143,1,90,0,188,1,91,255,104,1,94, +255,104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255, +158,1,119,255,104,1,120,255,180,1,122,255,70,1,124,255,158,1,128,255,104, +1,130,255,180,1,131,255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143, +255,70,1,147,0,121,1,149,255,70,0,3,1,91,255,197,1,110,255,190,1,116,255, +190,0,10,1,117,255,178,1,122,255,178,1,125,255,178,1,129,255,217,1,136,255, +178,1,140,255,178,1,143,255,178,1,146,255,178,1,149,255,178,1,151,255,178, +0,21,0,3,255,219,1,90,0,170,1,91,255,104,1,94,255,104,1,98,255,141,1,101, +255,104,1,105,255,141,1,111,255,141,1,114,255,158,1,119,255,104,1,120,255, +180,1,122,255,70,1,128,255,104,1,130,255,180,1,131,255,104,1,133,255,104, +1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1,149,255,70,0,4,1,132, +255,217,1,137,255,227,1,141,255,227,1,144,255,201,0,18,1,117,255,119,1,119, +255,219,1,122,255,119,1,124,255,170,1,125,255,180,1,128,255,219,1,129,255, +158,1,130,255,219,1,131,255,219,1,134,255,170,1,136,255,119,1,137,255,170, +1,140,255,119,1,141,255,170,1,143,255,119,1,146,255,119,1,149,255,119,1,151, +255,119,0,1,1,132,255,217,0,13,1,117,255,231,1,122,255,231,1,125,255,231, +1,127,255,231,1,129,255,231,1,135,255,231,1,136,255,231,1,139,255,231,1,140, +255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255,231,0,13,1,117, +255,225,1,122,255,225,1,125,255,225,1,135,255,225,1,136,255,225,1,139,255, +209,1,140,255,225,1,142,255,207,1,143,255,219,1,146,255,225,1,149,255,225, +1,150,255,207,1,151,255,225,0,10,1,117,255,201,1,122,255,201,1,125,255,201, +1,127,255,201,1,135,255,201,1,136,255,201,1,139,255,201,1,140,255,201,1,143, +255,201,1,149,255,201,0,9,1,117,255,227,1,122,255,227,1,127,255,227,1,136, +255,227,1,139,255,227,1,140,255,227,1,143,255,227,1,146,255,227,1,151,255, +227,0,3,1,132,255,217,1,137,255,227,1,141,255,227,0,10,1,117,255,227,1,122, +255,227,1,125,255,227,1,127,255,227,1,136,255,227,1,139,255,227,1,140,255, +227,1,143,255,227,1,146,255,227,1,151,255,227,0,11,1,117,255,201,1,122,255, +201,1,125,255,201,1,127,255,201,1,136,255,201,1,139,255,201,1,140,255,201, +1,143,255,201,1,146,255,201,1,149,255,201,1,151,255,201,0,5,0,15,255,6,0, +17,255,6,0,108,255,119,0,123,255,119,1,255,255,211,0,1,2,3,255,96,0,1,2,3, +255,119,0,17,1,170,0,68,1,173,255,233,1,177,0,45,1,180,255,211,1,181,255, +233,1,183,255,211,1,184,255,96,1,185,255,166,1,186,255,188,1,189,255,96,1, +195,255,211,1,198,0,23,1,216,255,211,1,217,255,233,1,218,0,23,1,227,0,45, +2,3,255,141,0,14,1,166,255,211,1,173,255,233,1,180,255,233,1,183,255,233, +1,184,255,164,1,185,255,209,1,186,255,233,1,187,255,211,1,189,255,164,1,192, +255,188,1,195,255,233,1,197,255,233,1,209,255,233,1,217,255,211,0,21,1,166, +255,188,1,170,255,211,1,172,255,211,1,173,255,188,1,177,255,233,1,180,255, +188,1,183,255,188,1,184,255,119,1,185,255,188,1,186,255,188,1,187,255,166, +1,189,255,164,1,192,255,141,1,197,255,188,1,202,255,233,1,210,255,233,1,216, +255,188,1,217,255,233,1,219,255,233,1,221,255,188,1,229,255,233,0,28,0,15, +255,6,0,17,255,6,0,108,255,119,0,123,255,119,1,166,255,119,1,170,255,119, +1,173,255,211,1,177,255,141,1,178,255,209,1,180,255,141,1,183,255,164,1,197, +255,188,1,198,255,141,1,200,255,141,1,202,255,119,1,203,255,119,1,206,255, +141,1,209,255,141,1,210,255,141,1,211,255,141,1,212,255,119,1,214,255,141, +1,217,255,119,1,225,255,141,1,226,255,141,1,228,255,141,1,229,255,119,1,255, +255,211,0,6,1,185,0,23,1,186,255,211,1,189,255,186,1,205,0,68,1,212,0,23, +1,217,0,45,0,2,1,173,255,211,1,215,255,233,0,10,1,173,255,233,1,180,255,211, +1,183,255,233,1,184,0,23,1,185,0,45,1,192,0,45,1,198,0,23,1,203,255,231,1, +212,255,233,1,217,255,233,0,8,1,177,255,233,1,180,255,233,1,183,255,233,1, +184,255,211,1,185,255,233,1,186,255,233,1,189,255,211,1,197,255,233,0,5,1, +173,255,233,1,180,255,233,1,183,255,233,1,185,0,23,1,186,255,186,0,3,1,186, +255,233,1,199,0,23,1,217,0,23,0,9,1,186,255,233,1,189,255,233,1,198,0,23, +1,203,0,23,1,212,0,23,1,215,0,23,1,217,0,23,1,221,255,233,1,227,0,23,0,11, +1,166,255,211,1,170,255,211,1,172,255,211,1,177,255,233,1,185,255,211,1,187, +255,164,1,189,255,211,1,197,255,211,1,202,255,211,1,209,255,233,1,219,255, +233,0,24,0,15,254,125,0,17,254,125,0,29,255,211,0,30,255,211,0,123,255,141, +1,166,255,119,1,170,255,119,1,172,255,233,1,173,255,211,1,177,255,141,1,178, +255,233,1,180,255,211,1,183,255,233,1,184,255,164,1,185,255,211,1,186,255, +233,1,187,255,164,1,197,255,211,1,198,255,188,1,202,255,96,1,203,255,166, +1,212,255,166,1,227,255,211,1,229,255,188,0,15,1,166,255,211,1,170,255,211, +1,173,255,233,1,177,255,188,1,178,255,233,1,180,255,211,1,184,255,188,1,185, +255,188,1,187,255,141,1,189,255,188,1,192,255,186,1,195,255,233,1,198,0,23, +1,204,0,45,1,221,255,233,0,31,0,15,255,29,0,17,255,29,0,108,255,166,0,123, +255,166,1,166,255,188,1,170,255,188,1,172,0,23,1,173,255,233,1,177,255,211, +1,180,255,164,1,186,255,188,1,197,255,211,1,198,255,164,1,200,255,166,1,203, +255,141,1,206,255,166,1,208,255,166,1,209,255,164,1,210,255,166,1,212,255, +96,1,213,255,166,1,214,255,141,1,215,255,141,1,217,255,141,1,219,255,166, +1,223,255,166,1,225,255,166,1,226,255,166,1,228,255,166,1,229,255,141,1,255, +255,211,0,38,0,15,254,240,0,17,254,240,0,29,255,211,0,30,255,211,0,108,255, +166,0,123,255,164,1,166,255,119,1,170,255,164,1,173,255,211,1,177,255,188, +1,180,255,188,1,186,255,188,1,195,255,211,1,197,255,211,1,199,255,211,1,200, +255,141,1,201,255,164,1,202,255,96,1,203,255,119,1,204,255,188,1,205,255, +141,1,206,255,164,1,207,255,188,1,208,255,164,1,209,255,119,1,210,255,164, +1,211,255,164,1,212,255,119,1,213,255,164,1,214,255,164,1,215,255,119,1,219, +255,164,1,220,255,164,1,222,255,164,1,223,255,164,1,228,255,164,1,229,255, +119,1,255,255,233,0,8,1,166,255,211,1,170,255,188,1,177,255,188,1,184,255, +141,1,185,255,164,1,189,255,211,1,197,255,186,1,209,255,188,0,7,1,173,255, +211,1,180,255,188,1,183,255,188,1,186,255,188,1,195,255,186,1,212,255,233, +1,217,255,211,0,2,1,180,255,211,1,198,0,45,0,2,1,198,0,23,1,217,0,45,0,2, +1,197,255,188,2,3,255,119,0,14,1,166,255,211,1,170,255,211,1,172,255,188, +1,173,255,233,1,177,255,186,1,178,255,211,1,180,255,211,1,183,255,211,1,184, +255,51,1,187,255,164,1,189,255,96,1,195,255,233,1,197,255,164,2,3,255,96, +0,11,1,170,255,188,1,172,255,231,1,173,255,233,1,177,255,188,1,187,255,186, +1,197,255,211,1,202,255,188,1,204,0,23,1,209,255,188,1,210,255,233,1,229, +255,233,0,12,1,166,255,188,1,170,255,166,1,172,255,211,1,177,255,164,1,180, +255,233,1,183,255,233,1,184,255,141,1,187,255,164,1,189,255,188,1,202,255, +164,1,209,255,164,1,210,255,233,0,4,1,205,255,233,1,216,255,211,1,217,255, +233,1,221,255,211,0,15,1,198,255,209,1,202,255,164,1,203,255,233,1,204,255, +233,1,205,255,211,1,209,255,164,1,210,255,211,1,215,255,233,1,217,255,211, +1,218,255,233,1,219,255,188,1,221,255,188,1,224,255,188,1,227,255,233,1,229, +255,211,0,16,1,198,255,233,1,199,255,233,1,202,255,233,1,203,255,233,1,204, +255,233,1,205,255,233,1,209,255,209,1,210,255,233,1,212,255,233,1,215,255, +233,1,216,255,211,1,217,255,211,1,218,255,233,1,221,255,164,1,224,255,188, +1,229,255,233,0,10,0,15,255,6,0,17,255,6,1,198,255,211,1,202,255,164,1,203, +255,211,1,205,255,233,1,209,255,211,1,212,255,211,1,215,255,211,1,229,255, +233,0,2,1,224,255,211,1,227,0,23,0,9,1,199,255,233,1,202,255,211,1,204,255, +233,1,205,255,211,1,209,255,188,1,216,255,188,1,217,255,233,1,219,255,211, +1,221,255,188,0,4,1,199,0,23,1,217,0,23,1,221,255,233,1,224,0,45,0,11,1,199, +255,233,1,202,255,211,1,203,255,233,1,205,255,233,1,209,255,233,1,212,255, +233,1,215,255,233,1,217,255,233,1,218,255,233,1,221,255,188,1,224,255,211, +0,10,1,198,0,45,1,199,0,45,1,203,0,23,1,205,0,23,1,209,0,23,1,212,0,23,1, +215,0,23,1,216,0,23,1,217,0,23,1,227,0,23,0,2,1,212,0,23,1,221,255,211,0, +3,1,199,255,233,1,205,255,233,1,217,0,23,0,8,1,202,255,211,1,204,255,233, +1,205,255,233,1,209,255,211,1,216,255,211,1,217,255,233,1,219,255,233,1,221, +255,211,0,8,1,202,255,209,1,205,255,233,1,209,255,186,1,216,255,211,1,217, +255,233,1,219,255,233,1,221,255,211,1,229,255,233,0,4,1,204,0,23,1,212,0, +23,1,221,255,233,1,227,0,23,0,10,0,15,255,29,0,17,255,29,1,198,255,233,1, +202,255,188,1,203,255,233,1,204,0,68,1,209,255,211,1,212,255,233,1,215,255, +233,1,217,0,23,0,16,0,15,255,51,0,17,255,51,0,123,0,23,1,198,255,233,1,199, +0,23,1,202,255,188,1,203,255,233,1,204,0,23,1,209,255,211,1,210,255,233,1, +212,255,231,1,214,255,233,1,215,255,233,1,218,255,233,1,227,255,233,1,229, +255,233,0,7,1,199,255,233,1,202,255,211,1,209,255,211,1,216,255,211,1,217, +255,233,1,221,255,211,1,229,255,233,0,9,1,198,255,233,1,199,255,233,1,203, +255,233,1,205,255,233,1,212,255,233,1,215,255,233,1,216,255,233,1,218,255, +233,1,221,255,211,0,4,1,203,255,233,1,205,255,233,1,212,255,233,1,215,255, +233,0,3,1,203,255,233,1,212,255,233,1,217,0,23,0,2,1,216,255,96,1,221,255, +119,0,8,1,202,255,211,1,203,0,23,1,205,255,233,1,209,255,211,1,212,0,23,1, +216,255,211,1,219,255,233,1,229,255,233,0,7,1,202,255,211,1,204,255,233,1, +209,255,211,1,210,255,233,1,216,255,211,1,219,255,233,1,221,255,211,0,2,0, +15,255,51,0,17,255,51,0,7,0,15,255,6,0,17,255,6,0,29,255,211,0,30,255,211, +0,108,255,96,0,123,255,96,1,255,255,211,0,1,2,2,255,219,0,3,0,3,255,180,0, +86,255,219,2,3,255,219,0,5,1,153,255,96,1,162,255,96,1,184,255,96,1,189,255, +188,1,192,255,188,0,1,0,105,0,3,0,20,0,36,0,41,0,47,0,51,0,53,0,55,0,57,0, +58,0,60,0,73,0,85,0,89,0,90,0,92,1,82,1,87,1,88,1,89,1,91,1,93,1,94,1,98, +1,100,1,101,1,105,1,107,1,108,1,109,1,110,1,111,1,113,1,114,1,116,1,125,1, +127,1,129,1,131,1,132,1,135,1,136,1,137,1,138,1,141,1,143,1,144,1,146,1,149, +1,151,1,154,1,160,1,161,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1, +176,1,177,1,178,1,180,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,191,1,192, +1,194,1,195,1,196,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,208,1, +209,1,210,1,212,1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,223,1,226,1,227, +1,228,1,242,1,244,2,2,2,3,2,8,0,0,0,1,0,0,0,0,199,254,176,223,0,0,0,0,191, +26,255,128,0,0,0,0,196,4,48,20,}; +#endif diff --git a/contrib/media/updf_newlib/generated/font_droid.h b/contrib/media/updf_newlib/generated/font_droid.h new file mode 100755 index 000000000..ef0ee8ff5 --- /dev/null +++ b/contrib/media/updf_newlib/generated/font_droid.h @@ -0,0 +1,11257 @@ +#ifndef __STRICT_ANSI__ +#if defined(__linux__) || defined(__FreeBSD__) +#define HAVE_INCBIN +#endif +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_DroidSans[139280]; +asm(".globl pdf_font_DroidSans"); +asm(".balign 8"); +asm("pdf_font_DroidSans:"); +asm(".incbin \"fonts/droid/DroidSans.ttf\""); +#else +static const unsigned char pdf_font_DroidSans[139280] = { +0,1,0,0,0,19,1,0,0,4,0,48,70,70,84,77,75,29,224,116,0,2,31,244,0,0,0,28,71, +68,69,70,2,201,0,4,0,2,14,208,0,0,0,32,71,80,79,83,236,144,228,222,0,2,15, +64,0,0,16,180,71,83,85,66,147,60,130,75,0,2,14,240,0,0,0,80,79,83,47,50,247, +26,134,136,0,0,1,184,0,0,0,96,99,109,97,112,29,150,101,90,0,0,12,136,0,0, +6,242,99,118,116,32,65,244,67,234,0,0,29,92,0,0,2,20,102,112,103,109,115, +211,35,176,0,0,19,124,0,0,7,5,103,97,115,112,0,24,0,9,0,2,14,192,0,0,0,16, +103,108,121,102,155,28,79,66,0,0,36,172,0,1,184,160,104,101,97,100,248,253, +254,54,0,0,1,60,0,0,0,54,104,104,101,97,14,75,8,159,0,0,1,116,0,0,0,36,104, +109,116,120,38,164,8,117,0,0,2,24,0,0,10,112,107,101,114,110,174,170,185, +111,0,1,221,76,0,0,21,90,108,111,99,97,120,114,13,144,0,0,31,112,0,0,5,58, +109,97,120,112,7,1,7,208,0,0,1,152,0,0,0,32,110,97,109,101,35,87,171,194, +0,1,242,168,0,0,7,251,112,111,115,116,26,213,54,16,0,1,250,164,0,0,20,25, +112,114,101,112,122,200,94,246,0,0,26,132,0,0,2,213,0,1,0,0,0,1,5,30,235, +107,75,224,95,15,60,245,0,31,8,0,0,0,0,0,201,129,215,160,0,0,0,0,201,129, +215,160,254,96,253,147,8,103,7,72,0,0,0,8,0,2,0,0,0,0,0,0,0,1,0,0,7,62,254, +78,0,67,8,192,254,96,254,244,8,103,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,156, +0,1,0,0,2,156,1,82,0,84,0,140,0,5,0,2,0,16,0,47,0,90,0,0,3,158,5,192,0,3, +0,1,0,3,4,185,1,144,0,5,0,8,5,154,5,51,0,0,1,27,5,154,5,51,0,0,3,209,0,102, +2,18,8,5,2,11,6,4,2,2,2,2,2,4,160,0,2,175,80,0,120,251,0,0,0,0,0,0,0,0,49, +65,83,67,0,64,0,33,251,2,5,211,254,81,1,51,7,62,1,178,96,0,0,159,223,215, +0,0,4,58,5,129,0,0,0,32,0,2,2,236,0,68,0,0,0,0,2,170,0,0,2,57,0,0,2,57,0, +185,2,215,0,87,4,115,0,9,4,115,0,22,7,29,0,73,5,86,0,72,1,135,0,104,2,170, +0,127,2,170,0,12,3,29,0,33,4,172,0,100,2,57,0,184,2,170,0,91,2,57,0,187,2, +57,0,0,4,115,0,80,4,115,0,156,4,115,0,103,4,115,0,78,4,115,0,47,4,115,0,82, +4,115,0,104,4,115,0,105,4,115,0,89,4,115,0,96,2,57,0,187,2,57,0,184,4,172, +0,101,4,172,0,100,4,172,0,101,4,115,0,84,8,31,0,161,5,86,0,4,5,86,0,168,5, +199,0,104,5,199,0,168,5,86,0,168,4,227,0,168,6,57,0,103,5,199,0,168,2,57, +0,189,4,0,0,32,5,86,0,168,4,115,0,168,6,170,0,168,5,199,0,168,6,57,0,97,5, +86,0,168,6,57,0,97,5,199,0,168,5,86,0,93,4,227,0,46,5,199,0,158,5,86,0,9, +7,141,0,9,5,86,0,46,5,86,0,45,4,227,0,65,2,57,0,146,2,57,0,0,2,57,0,16,3, +193,0,10,4,115,255,225,2,170,0,106,4,115,0,87,4,115,0,132,4,0,0,87,4,115, +0,86,4,115,0,87,2,57,0,29,4,115,0,86,4,115,0,142,1,199,0,137,1,199,255,206, +4,0,0,138,1,199,0,138,6,170,0,136,4,115,0,136,4,115,0,86,4,115,0,132,4,115, +0,86,2,170,0,136,4,0,0,57,2,57,0,31,4,115,0,133,4,0,0,7,5,199,255,253,4,0, +0,23,4,0,0,5,4,0,0,49,2,172,0,34,2,20,0,183,2,172,0,34,4,172,0,92,2,170,0, +242,4,115,0,135,4,115,0,58,4,115,0,113,4,115,255,254,2,20,0,183,4,115,0,115, +2,170,0,45,5,229,0,31,2,246,0,26,4,115,0,83,4,172,0,100,5,229,0,31,4,107, +255,239,3,51,0,122,4,100,0,65,2,170,0,41,2,170,0,27,2,170,0,72,4,156,0,140, +4,76,0,80,2,57,0,187,2,170,0,119,2,170,0,80,2,236,0,27,4,115,0,83,6,172,0, +56,6,172,0,56,6,172,0,73,4,227,0,131,5,86,0,4,5,86,0,4,5,86,0,4,5,86,0,4, +5,86,0,4,5,86,0,4,8,0,0,24,5,199,0,104,5,86,0,168,5,86,0,168,5,86,0,168,5, +86,0,168,2,57,0,9,2,57,0,142,2,57,255,210,2,57,0,7,5,199,0,14,5,199,0,168, +6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,4,172,0,142,6,57,0,71,5, +199,0,158,5,199,0,158,5,199,0,158,5,199,0,158,5,86,0,45,5,86,0,168,4,227, +0,142,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,7, +29,0,66,4,0,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,2,57,0,10,2, +57,0,135,2,57,255,211,2,57,0,8,4,115,0,86,4,115,0,140,4,115,0,86,4,115,0, +86,4,115,0,86,4,115,0,86,4,115,0,86,4,100,0,65,4,227,0,44,4,115,0,139,4,115, +0,139,4,115,0,139,4,115,0,139,4,0,0,5,4,115,0,138,4,0,0,5,5,86,0,4,4,115, +0,87,5,86,0,4,4,115,0,87,5,86,0,4,4,115,0,87,5,199,0,104,4,0,0,87,5,199,0, +104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,168,4,235, +0,86,5,199,0,14,4,115,0,86,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5, +86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,6,57,0,103, +4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0, +86,5,199,0,168,4,115,0,142,5,199,0,14,4,115,0,10,2,57,255,184,2,57,255,184, +2,57,0,12,2,57,0,12,2,57,255,210,2,57,255,210,2,57,0,92,1,199,0,31,2,57,0, +189,2,57,0,194,5,225,0,170,3,141,0,137,4,0,0,32,1,199,255,153,5,86,0,168, +4,0,0,138,4,0,0,138,4,115,0,168,1,199,0,91,4,115,0,168,1,199,0,126,4,115, +0,168,2,85,0,138,4,115,0,168,2,172,0,138,4,115,0,20,1,199,0,16,5,199,0,168, +4,115,0,140,5,199,0,168,4,115,0,140,5,199,0,168,4,115,0,140,4,213,255,254, +5,201,0,165,4,115,0,140,6,57,0,97,4,115,0,86,6,57,0,97,4,115,0,86,6,57,0, +97,4,115,0,86,8,0,0,97,7,141,0,86,5,199,0,168,2,170,0,136,5,199,0,168,2,170, +0,129,5,199,0,168,2,170,0,56,5,86,0,93,4,0,0,57,5,86,0,93,4,0,0,57,5,86,0, +93,4,0,0,57,5,86,0,93,4,0,0,57,4,227,0,46,2,57,0,31,4,227,0,46,3,0,0,31,4, +227,0,46,2,57,0,31,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199, +0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0, +158,4,115,0,133,7,141,0,9,5,199,255,253,5,86,0,45,4,0,0,5,5,86,0,45,4,227, +0,65,4,0,0,49,4,227,0,65,4,0,0,49,4,227,0,65,4,0,0,49,1,199,0,138,4,115,0, +192,5,86,0,4,4,115,0,87,8,0,0,24,7,29,0,66,6,57,0,71,4,227,0,44,2,170,0,0, +2,170,0,0,2,170,0,51,2,170,255,221,2,170,0,156,2,170,0,51,2,170,0,80,2,170, +255,233,2,170,0,22,2,170,0,205,2,170,0,29,5,87,0,4,2,57,0,187,6,70,255,245, +6,180,255,242,3,18,255,232,6,50,255,187,6,216,0,65,6,5,255,187,1,199,255, +176,5,86,0,4,5,86,0,168,4,104,0,168,5,88,0,61,5,86,0,168,4,227,0,65,5,199, +0,168,6,57,0,97,2,57,0,189,5,86,0,168,5,88,0,10,6,170,0,168,5,199,0,168,5, +51,0,90,6,57,0,97,5,199,0,168,5,86,0,168,4,242,0,108,4,227,0,46,5,86,0,45, +6,98,0,117,5,86,0,46,6,175,0,145,5,251,0,87,2,57,0,7,5,86,0,45,4,160,0,86, +3,145,0,70,4,115,0,106,1,199,0,137,4,96,0,133,4,160,0,86,4,154,0,142,4,0, +0,7,4,116,0,86,3,145,0,70,3,135,0,86,4,115,0,106,4,115,0,106,1,199,0,137, +4,0,0,138,4,0,0,14,4,156,0,138,4,0,0,0,3,149,0,86,4,115,0,86,5,133,0,79,4, +141,0,132,3,219,0,86,4,240,0,86,3,41,0,29,4,96,0,133,5,48,0,85,4,51,0,21, +5,180,0,135,6,63,0,83,1,199,255,205,4,96,0,133,4,115,0,86,4,96,0,133,6,63, +0,83,5,87,0,168,6,235,0,46,4,85,0,168,5,192,0,104,5,86,0,93,2,57,0,189,2, +57,0,7,4,0,0,32,8,117,0,18,8,21,0,168,6,213,0,46,4,169,0,168,5,21,0,55,5, +192,0,168,5,86,0,4,5,64,0,168,5,86,0,168,4,85,0,168,5,107,0,15,5,86,0,168, +7,99,0,28,4,213,0,67,5,192,0,168,5,192,0,168,4,169,0,168,5,64,0,18,6,170, +0,168,5,199,0,168,6,57,0,97,5,192,0,166,5,86,0,168,5,199,0,104,4,227,0,46, +5,21,0,55,6,21,0,118,5,86,0,46,5,235,0,168,5,85,0,160,7,85,0,168,7,128,0, +168,6,85,0,46,7,21,0,168,5,64,0,168,5,192,0,105,8,21,0,168,5,199,0,96,4,115, +0,87,4,149,0,120,4,64,0,142,2,235,0,142,4,171,0,20,4,115,0,87,5,90,0,7,3, +171,0,49,4,120,0,142,4,120,0,142,3,128,0,138,4,171,0,11,5,128,0,142,4,107, +0,142,4,115,0,86,4,85,0,142,4,115,0,132,4,0,0,87,3,170,0,35,4,0,0,5,6,149, +0,86,4,0,0,23,4,149,0,142,4,43,0,122,6,107,0,142,6,149,0,142,5,0,0,45,5,192, +0,142,4,43,0,142,4,21,0,55,6,0,0,142,4,85,0,17,4,115,0,87,4,115,0,10,2,235, +0,142,4,21,0,87,4,0,0,57,1,199,0,137,2,57,255,248,1,199,255,206,7,64,0,11, +6,128,0,142,4,115,0,10,3,128,0,138,4,0,0,5,4,107,0,142,3,233,0,168,3,74,0, +142,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253, +5,86,0,45,4,0,0,5,4,115,0,0,8,0,0,0,8,0,0,0,4,107,255,225,1,199,0,127,1,199, +0,127,1,199,0,127,1,199,0,126,2,170,0,75,2,170,0,75,2,170,0,75,4,115,0,138, +4,115,0,136,2,205,0,81,8,0,1,22,8,0,0,55,1,128,0,85,2,213,0,85,2,170,0,88, +2,170,0,89,4,0,0,185,2,170,255,192,1,86,254,96,2,235,0,101,4,115,0,4,4,115, +0,58,8,192,0,158,4,115,0,16,7,21,0,69,2,150,0,19,8,149,0,188,8,0,0,188,6, +37,0,108,4,205,0,88,6,172,0,80,6,172,0,61,6,172,0,93,6,172,0,145,8,0,1,162, +4,0,1,16,8,0,1,162,4,0,1,16,8,0,1,162,4,0,1,16,4,0,1,16,3,244,0,56,4,229, +0,4,6,150,0,235,5,180,0,154,4,172,0,101,4,100,0,51,5,180,0,87,7,213,1,152, +5,192,1,22,2,49,255,158,4,100,0,56,4,100,0,65,4,171,0,100,4,100,0,63,4,100, +0,65,4,213,0,157,4,172,0,100,4,213,2,34,4,213,1,5,5,171,255,246,5,0,1,216, +5,171,2,141,5,171,255,246,5,171,2,141,5,171,255,246,5,171,2,141,5,171,255, +246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,1,217,5, +171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255,246, +5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255, +246,5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171, +255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255, +246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,0,0,5,171, +0,0,5,171,0,0,5,171,0,0,5,171,2,213,5,171,0,103,5,171,0,0,5,213,0,0,4,213, +0,123,4,213,0,6,2,214,0,109,2,214,0,109,8,0,0,0,7,235,1,158,7,235,1,145,7, +235,1,158,7,235,1,145,3,244,0,8,4,213,0,167,4,213,0,178,4,213,0,41,4,213, +0,41,2,214,0,115,8,43,1,177,8,107,1,209,7,85,1,70,6,0,1,218,6,0,1,81,4,64, +0,59,5,64,0,60,4,192,0,102,4,21,0,66,4,0,0,196,6,0,1,16,4,0,0,29,4,0,0,29, +2,170,0,119,2,170,0,243,2,170,0,127,2,170,0,14,2,170,0,53,2,170,0,43,2,170, +0,45,2,170,255,229,1,199,0,124,1,199,0,130,2,90,0,106,2,90,0,72,2,152,0,0, +2,152,0,0,2,135,0,45,2,160,255,233,3,47,0,32,2,72,255,232,0,0,0,3,0,0,0,3, +0,0,0,28,0,1,0,0,0,0,4,232,0,3,0,1,0,0,0,28,0,4,4,204,0,0,0,190,0,128,0,6, +0,62,0,126,1,127,1,146,1,255,2,199,2,201,2,221,3,126,3,138,3,140,3,161,3, +206,4,12,4,79,4,92,4,95,4,145,30,133,30,243,32,21,32,30,32,34,32,38,32,48, +32,51,32,58,32,60,32,62,32,68,32,127,32,164,32,167,32,172,33,5,33,19,33,22, +33,34,33,38,33,46,33,94,33,149,33,168,34,2,34,6,34,15,34,18,34,21,34,26,34, +31,34,41,34,43,34,72,34,97,34,101,35,2,35,16,35,33,37,0,37,2,37,12,37,16, +37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,108,37,128,37,132,37,136,37, +140,37,147,37,161,37,172,37,178,37,186,37,188,37,196,37,203,37,207,37,217, +37,230,38,60,38,64,38,66,38,96,38,99,38,102,38,107,240,2,240,5,251,2,255, +255,0,0,0,32,0,160,1,146,1,250,2,198,2,201,2,216,3,126,3,132,3,140,3,142, +3,163,4,1,4,14,4,81,4,94,4,144,30,128,30,242,32,19,32,23,32,32,32,38,32,48, +32,50,32,57,32,60,32,62,32,68,32,127,32,163,32,167,32,172,33,5,33,19,33,22, +33,34,33,38,33,46,33,91,33,144,33,168,34,2,34,6,34,15,34,17,34,21,34,25,34, +30,34,41,34,43,34,72,34,96,34,100,35,2,35,16,35,32,37,0,37,2,37,12,37,16, +37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,80,37,128,37,132,37,136,37,140, +37,144,37,160,37,170,37,178,37,186,37,188,37,196,37,202,37,207,37,216,37, +230,38,58,38,64,38,66,38,96,38,99,38,101,38,106,240,1,240,5,251,1,255,255, +255,227,0,0,255,174,255,71,254,129,254,128,254,114,252,160,253,204,253,203, +253,202,253,201,253,151,253,150,253,149,253,148,253,100,227,118,227,10,225, +235,225,234,225,233,225,230,225,221,225,220,225,215,225,214,225,213,225,208, +225,150,225,115,225,113,225,109,225,21,225,8,225,6,224,251,224,248,224,241, +224,197,224,148,224,130,224,41,224,38,224,30,224,29,223,255,0,0,224,19,224, +10,224,9,223,237,223,214,223,212,223,56,223,43,223,28,221,62,221,61,221,52, +221,49,221,46,221,43,221,40,221,33,221,26,221,19,221,12,220,249,220,230,220, +227,220,224,220,221,220,218,220,206,220,198,220,193,220,186,220,185,220,178, +220,173,220,170,220,162,220,150,220,67,220,64,220,63,220,34,220,32,220,31, +220,28,18,135,18,133,7,135,0,1,0,0,0,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,98,0,99,0,100,0,101,0, +102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,16,0,110,0,111,0,112,0,113, +0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0, +126,0,127,0,128,0,129,0,130,0,131,0,132,0,133,0,134,0,135,0,136,0,137,0,138, +0,139,0,140,0,141,0,142,0,143,0,144,0,145,0,146,0,147,0,148,0,149,0,150,0, +151,0,152,0,153,0,154,0,155,0,156,0,157,0,158,0,159,0,160,0,161,0,162,0,163, +0,164,0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0, +176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188, +0,189,0,190,0,191,0,192,0,193,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0, +201,0,202,0,203,0,204,0,205,0,206,0,207,0,208,0,209,0,210,0,211,0,212,0,213, +0,214,0,215,0,216,0,217,0,218,0,219,0,220,0,221,0,222,0,223,0,224,0,225,0, +226,0,227,0,228,0,229,0,230,0,231,0,232,0,233,0,234,0,235,0,236,0,237,0,238, +0,239,0,240,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,0, +251,0,252,0,253,0,254,0,255,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10, +1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25, +1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40, +1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55, +1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,0,119,2,48,0,6,2,10,0,0,0,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,0,4,0,5,0,6,0,7,0, +8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0, +23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37, +0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52, +0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67, +0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82, +0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97, +0,0,0,132,0,133,0,135,0,137,0,145,0,150,0,156,0,161,0,160,0,162,0,164,0,163, +0,165,0,167,0,169,0,168,0,170,0,171,0,173,0,172,0,174,0,175,0,177,0,179,0, +178,0,180,0,182,0,181,0,186,0,185,0,187,0,188,2,9,0,112,0,99,0,100,0,104, +2,11,0,118,0,159,0,110,0,106,2,29,0,116,0,105,2,54,0,134,0,152,2,49,0,113, +2,56,2,57,0,102,0,117,2,43,2,46,2,45,1,137,2,52,0,107,0,122,1,114,0,166,0, +184,0,127,0,98,0,109,2,48,1,64,2,53,2,44,0,108,0,123,2,12,0,3,0,128,0,131, +0,149,1,18,1,19,1,254,1,255,2,6,2,7,2,2,2,3,0,183,2,119,0,191,1,56,2,20,2, +25,2,16,2,17,2,136,2,137,2,10,0,119,2,4,2,8,2,13,0,130,0,138,0,129,0,139, +0,136,0,141,0,142,0,143,0,140,0,147,0,148,0,0,0,146,0,154,0,155,0,153,0,241, +1,71,1,78,0,111,1,74,1,75,1,76,0,120,1,79,1,77,1,72,0,0,64,69,89,88,85,84, +83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59, +58,57,56,55,54,53,49,48,47,46,45,44,40,39,38,37,36,35,34,33,31,24,20,17,16, +15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,44,69,35,70,96,32,176,38,96,176,4,38,35, +72,72,45,44,69,35,70,35,97,32,176,38,97,176,4,38,35,72,72,45,44,69,35,70, +96,176,32,97,32,176,70,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,32,96, +32,176,38,97,176,32,97,176,4,38,35,72,72,45,44,69,35,70,96,176,64,97,32,176, +102,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,64,96,32,176,38,97,176, +64,97,176,4,38,35,72,72,45,44,1,16,32,60,0,60,45,44,32,69,35,32,176,205,68, +35,32,184,1,90,81,88,35,32,176,141,68,35,89,32,176,237,81,88,35,32,176,77, +68,35,89,32,176,4,38,81,88,35,32,176,13,68,35,89,33,33,45,44,32,32,69,24, +104,68,32,176,1,96,32,69,176,70,118,104,138,69,96,68,45,44,1,177,11,10,67, +35,67,101,10,45,44,0,177,10,11,67,35,67,11,45,44,0,176,40,35,112,177,1,40, +62,1,176,40,35,112,177,2,40,69,58,177,2,0,8,13,45,44,32,69,176,3,37,69,97, +100,176,80,81,88,69,68,27,33,33,89,45,44,73,176,14,35,68,45,44,32,69,176, +0,67,96,68,45,44,1,176,6,67,176,7,67,101,10,45,44,32,105,176,64,97,176,0, +139,32,177,44,192,138,140,184,16,0,98,96,43,12,100,35,100,97,92,88,176,3, +97,89,45,44,138,3,69,138,138,135,176,17,43,176,41,35,68,176,41,122,228,24, +45,44,69,101,176,44,35,68,69,176,43,35,68,45,44,75,82,88,69,68,27,33,33,89, +45,44,75,81,88,69,68,27,33,33,89,45,44,1,176,5,37,16,35,32,138,245,0,176, +1,96,35,237,236,45,44,1,176,5,37,16,35,32,138,245,0,176,1,97,35,237,236,45, +44,1,176,6,37,16,245,0,237,236,45,44,70,35,70,96,138,138,70,35,32,70,138, +96,138,97,184,255,128,98,35,32,16,35,138,177,12,12,138,112,69,96,32,176,0, +80,88,176,1,97,184,255,186,139,27,176,70,140,89,176,16,96,104,1,58,45,44, +32,69,176,3,37,70,82,75,176,19,81,91,88,176,2,37,70,32,104,97,176,3,37,176, +3,37,63,35,33,56,27,33,17,89,45,44,32,69,176,3,37,70,80,88,176,2,37,70,32, +104,97,176,3,37,176,3,37,63,35,33,56,27,33,17,89,45,44,0,176,7,67,176,6,67, +11,45,44,33,33,12,100,35,100,139,184,64,0,98,45,44,33,176,128,81,88,12,100, +35,100,139,184,32,0,98,27,178,0,64,47,43,89,176,2,96,45,44,33,176,192,81, +88,12,100,35,100,139,184,21,85,98,27,178,0,128,47,43,89,176,2,96,45,44,12, +100,35,100,139,184,64,0,98,96,35,33,45,44,75,83,88,138,176,4,37,73,100,35, +69,105,176,64,139,97,176,128,98,176,32,97,106,176,14,35,68,35,16,176,14,246, +27,33,35,138,18,17,32,57,47,89,45,44,75,83,88,32,176,3,37,73,100,105,32,176, +5,38,176,6,37,73,100,35,97,176,128,98,176,32,97,106,176,14,35,68,176,4,38, +16,176,14,246,138,16,176,14,35,68,176,14,246,176,14,35,68,176,14,237,27,138, +176,4,38,17,18,32,57,35,32,57,47,47,89,45,44,69,35,69,96,35,69,96,35,69,96, +35,118,104,24,176,128,98,32,45,44,176,72,43,45,44,32,69,176,0,84,88,176,64, +68,32,69,176,64,97,68,27,33,33,89,45,44,69,177,48,47,69,35,69,97,96,176,1, +96,105,68,45,44,75,81,88,176,47,35,112,176,20,35,66,27,33,33,89,45,44,75, +81,88,32,176,3,37,69,105,83,88,68,27,33,33,89,27,33,33,89,45,44,69,176,20, +67,176,0,96,99,176,1,96,105,68,45,44,176,47,69,68,45,44,69,35,32,69,138,96, +68,45,44,69,35,69,96,68,45,44,75,35,81,88,185,0,51,255,224,177,52,32,27,179, +51,0,52,0,89,68,68,45,44,176,22,67,88,176,3,38,69,138,88,100,102,176,31,96, +27,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,89,35,88,101,89,176,41, +35,68,35,16,176,41,224,27,33,33,33,33,33,89,45,44,176,2,67,84,88,75,83,35, +75,81,90,88,56,27,33,33,89,27,33,33,33,33,89,45,44,176,22,67,88,176,4,37, +69,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,35,88,27,101,89,176,41, +35,68,176,5,37,176,8,37,8,32,88,2,27,3,89,176,4,37,16,176,5,37,32,70,176, +4,37,35,66,60,176,4,37,176,7,37,8,176,7,37,16,176,6,37,32,70,176,4,37,176, +1,96,35,66,60,32,88,1,27,0,89,176,4,37,16,176,5,37,176,41,224,176,41,32,69, +101,68,176,7,37,16,176,6,37,176,41,224,176,5,37,176,8,37,8,32,88,2,27,3,89, +176,5,37,176,3,37,67,72,176,4,37,176,7,37,8,176,6,37,176,3,37,176,1,96,67, +72,27,33,89,33,33,33,33,33,33,33,45,44,2,176,4,37,32,32,70,176,4,37,35,66, +176,5,37,8,176,3,37,69,72,33,33,33,33,45,44,2,176,3,37,32,176,4,37,8,176, +2,37,67,72,33,33,33,45,44,69,35,32,69,24,32,176,0,80,32,88,35,101,35,89,35, +104,32,176,64,80,88,33,176,64,89,35,88,101,89,138,96,68,45,44,75,83,35,75, +81,90,88,32,69,138,96,68,27,33,33,89,45,44,75,84,88,32,69,138,96,68,27,33, +33,89,45,44,75,83,35,75,81,90,88,56,27,33,33,89,45,44,176,0,33,75,84,88,56, +27,33,33,89,45,44,176,2,67,84,88,176,70,43,27,33,33,33,33,89,45,44,176,2, +67,84,88,176,71,43,27,33,33,33,89,45,44,176,2,67,84,88,176,72,43,27,33,33, +33,33,89,45,44,176,2,67,84,88,176,73,43,27,33,33,33,89,45,44,32,138,8,35, +75,83,138,75,81,90,88,35,56,27,33,33,89,45,44,0,176,2,37,73,176,0,83,88,32, +176,64,56,17,27,33,89,45,44,1,70,35,70,96,35,70,97,35,32,16,32,70,138,97, +184,255,128,98,138,177,64,64,138,112,69,96,104,58,45,44,32,138,35,73,100, +138,35,83,88,60,27,33,89,45,44,75,82,88,125,27,122,89,45,44,176,18,0,75,1, +75,84,66,45,44,177,2,0,66,177,35,1,136,81,177,64,1,136,83,90,88,185,16,0, +0,32,136,84,88,178,2,1,2,67,96,66,89,177,36,1,136,81,88,185,32,0,0,64,136, +84,88,178,2,2,2,67,96,66,177,36,1,136,84,88,178,2,32,2,67,96,66,0,75,1,75, +82,88,178,2,8,2,67,96,66,89,27,185,64,0,0,128,136,84,88,178,2,4,2,67,96,66, +89,185,64,0,0,128,99,184,1,0,136,84,88,178,2,8,2,67,96,66,89,185,64,0,1,0, +99,184,2,0,136,84,88,178,2,16,2,67,96,66,89,185,64,0,2,0,99,184,4,0,136,84, +88,178,2,64,2,67,96,66,89,89,89,89,89,45,44,69,24,104,35,75,81,88,35,32,69, +32,100,176,64,80,88,124,89,104,138,96,89,68,45,44,176,0,22,176,2,37,176,2, +37,1,176,1,35,62,0,176,2,35,62,177,1,2,6,12,176,10,35,101,66,176,11,35,66, +1,176,1,35,63,0,176,2,35,63,177,1,2,6,12,176,6,35,101,66,176,7,35,66,176, +1,22,1,45,44,122,138,16,69,35,245,24,45,0,0,0,177,9,64,190,1,7,0,1,0,31,1, +7,0,1,0,159,1,4,64,142,1,192,253,1,175,253,1,0,253,1,10,79,251,1,32,251,1, +245,80,40,31,242,70,40,31,241,70,42,31,240,70,43,31,95,239,127,239,2,15,239, +79,239,95,239,143,239,175,239,5,11,229,228,30,31,227,226,70,31,15,226,1,64, +226,70,22,31,225,224,70,31,207,224,223,224,239,224,3,64,224,51,54,70,224, +70,24,31,221,61,223,85,222,61,3,85,223,1,3,85,220,3,255,31,15,213,31,213, +2,15,213,31,213,2,64,202,24,27,70,207,194,1,189,192,60,31,193,80,38,31,188, +190,40,31,255,185,1,80,184,112,184,128,184,3,184,255,192,64,255,184,18,50, +70,31,183,63,183,79,183,111,183,127,183,159,183,175,183,7,112,178,160,178, +176,178,3,15,178,1,144,181,1,176,181,1,15,181,1,8,15,179,63,179,239,179,3, +128,176,144,176,2,176,176,192,176,208,176,3,47,175,63,175,2,160,173,176,173, +2,192,173,208,173,2,47,172,63,172,2,159,171,1,192,170,208,170,2,79,169,143, +169,2,47,169,111,169,191,169,255,169,4,156,155,36,31,80,155,1,111,150,1,191, +150,1,150,70,29,31,149,148,23,31,127,148,143,148,255,148,3,48,145,64,145, +2,128,145,1,112,143,128,143,2,144,143,1,192,143,208,143,2,79,140,95,140,111, +140,3,134,70,255,31,159,133,1,132,131,49,31,116,115,63,31,115,80,38,31,111, +110,60,31,110,70,53,31,26,1,24,85,25,51,24,85,7,51,3,85,6,3,255,31,96,80, +38,31,95,80,38,31,92,70,49,31,91,90,72,31,90,70,49,31,19,50,18,85,5,1,3,85, +4,50,3,85,111,3,1,15,3,63,3,2,239,81,255,81,2,64,81,53,56,70,64,81,37,40, +70,207,64,84,80,1,73,70,32,31,72,70,53,31,71,70,53,31,175,70,1,223,70,239, +70,2,128,70,1,22,50,21,85,17,1,15,85,16,50,15,85,2,1,0,85,1,0,1,31,31,15, +63,15,95,15,127,15,4,15,15,47,15,79,15,111,15,143,15,223,15,255,15,7,63,15, +127,15,239,15,3,111,0,1,128,22,1,5,1,184,1,144,177,84,83,43,43,75,184,7,255, +82,75,176,7,80,91,176,1,136,176,37,83,176,1,136,176,64,81,90,176,6,136,176, +0,85,90,91,88,177,1,1,142,89,133,141,141,0,66,29,75,176,50,83,88,176,96,29, +89,75,176,100,83,88,176,64,29,89,75,176,128,83,88,176,16,29,177,22,0,66,89, +116,115,116,117,43,43,43,43,43,1,115,116,117,43,43,43,0,116,43,43,115,115, +117,43,43,43,1,43,43,43,0,43,43,43,43,43,43,1,43,43,0,43,43,1,43,115,43,0, +116,115,116,117,115,116,115,43,1,43,116,117,0,115,43,115,116,1,115,115,116, +0,115,116,116,115,116,115,1,94,115,115,116,115,115,0,115,43,115,115,1,43, +0,43,1,43,0,115,43,116,117,43,43,43,43,1,43,43,116,43,43,94,115,43,0,43,94, +115,116,1,43,43,43,0,43,115,115,94,115,115,115,1,115,115,115,24,94,0,0,0, +5,204,5,204,0,125,5,129,0,21,0,121,5,129,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,58,0,20,0,119,0,0,255,236,0,0,0,0,255,236,0,0,0,0,255,236,0,0,254,87,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,8,0,0,0,0,0,0,180,0,189,0,175,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0, +126,0,0,0,172,0,0,0,0,0,0,0,0,0,0,0,0,0,191,0,195,0,171,0,0,0,0,0,155,0,141, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,0,170,0,0,0,0,0, +0,0,148,0,153,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106, +0,131,0,141,0,164,0,180,0,0,0,0,0,0,0,0,0,0,0,96,0,106,0,121,0,152,0,172, +0,184,0,167,0,0,1,34,1,51,0,195,0,107,0,0,0,0,0,0,0,219,0,201,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,225,1,201,0,146,0,168,0,107,0,146,0,183, +0,107,0,155,0,0,2,123,2,242,0,146,2,82,0,110,2,215,3,129,0,130,0,137,0,160, +0,159,1,105,0,143,0,0,1,96,0,164,1,91,0,94,0,130,0,0,0,0,0,0,0,94,0,101,0, +111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,144,0,165,0,122,0,128,0,0,0,0,0,0, +0,0,0,0,5,129,255,243,0,13,252,167,0,131,0,137,0,143,0,150,0,105,0,113,0, +0,0,0,0,0,0,0,0,0,0,168,1,249,0,0,0,0,3,31,0,167,0,174,0,181,0,0,0,0,0,129, +0,0,0,0,0,0,0,0,7,72,3,106,2,182,2,2,253,147,0,0,0,145,0,103,0,145,0,97,1, +217,0,0,2,141,3,65,0,68,5,17,0,0,0,44,0,44,0,44,0,44,1,22,1,96,2,4,3,4,3, +230,4,240,5,14,5,84,5,158,5,246,6,50,6,114,6,144,6,178,6,218,7,80,7,150,8, +32,8,222,9,68,9,226,10,140,10,206,11,158,12,80,12,126,12,200,13,18,13,74, +13,146,14,20,15,100,16,22,16,172,17,64,17,160,17,222,18,40,18,202,19,22,19, +96,19,194,20,44,20,88,21,184,22,64,22,182,23,26,23,192,24,94,25,40,26,38, +26,146,27,42,29,162,30,254,32,64,32,148,32,190,32,242,33,28,34,172,34,202, +34,244,35,160,36,54,36,172,37,54,37,166,38,32,38,238,39,88,39,166,40,102, +41,0,41,68,42,246,43,100,43,212,44,112,45,20,45,98,46,16,46,114,46,230,48, +52,50,86,51,226,53,124,54,24,54,136,55,126,55,240,56,112,57,142,58,18,58, +196,59,100,59,234,60,238,62,28,62,144,63,134,64,72,64,168,64,210,65,178,65, +200,66,36,66,110,66,232,67,126,67,170,68,42,68,106,68,138,68,244,69,48,69, +166,70,14,70,48,70,90,70,124,71,8,71,32,71,56,71,80,71,104,71,130,71,154, +72,14,72,34,72,58,72,82,72,106,72,132,72,156,72,178,72,200,72,224,73,80,73, +104,73,128,73,152,73,176,73,200,73,226,74,68,74,252,75,20,75,44,75,68,75, +94,75,118,75,212,76,154,76,178,76,202,76,226,76,250,77,20,77,46,78,38,78, +58,78,82,78,106,78,130,78,156,78,180,78,202,78,224,78,248,79,172,79,196,79, +220,79,244,80,12,80,36,80,62,80,126,81,26,81,50,81,74,81,98,81,124,81,148, +82,24,82,50,82,74,82,98,82,122,82,146,82,166,82,186,82,210,82,234,83,2,83, +26,83,50,83,70,83,94,83,118,83,142,83,164,83,172,84,74,84,98,84,122,84,146, +84,170,84,194,84,214,84,234,84,254,85,22,85,46,85,70,85,94,85,118,85,142, +85,166,85,186,85,206,85,230,85,254,86,22,86,142,87,20,87,42,87,64,87,88,87, +110,87,132,87,154,87,172,87,192,87,216,88,170,88,182,88,210,88,234,89,228, +89,248,90,12,90,124,90,148,90,170,90,190,90,210,90,232,91,22,91,42,91,62, +91,150,91,224,91,248,92,16,92,36,92,56,92,80,92,104,92,116,93,20,93,164,93, +188,93,212,93,236,94,4,94,30,94,56,94,216,95,154,95,178,95,202,95,222,95, +242,96,10,96,34,96,58,96,82,96,106,96,130,96,150,96,170,96,194,96,218,96, +238,98,112,98,136,98,158,98,238,99,96,99,120,99,144,99,168,99,192,99,216, +99,240,100,10,100,36,100,62,100,88,100,122,100,142,100,166,100,190,100,214, +100,238,101,8,101,32,101,56,101,80,101,100,101,124,101,148,101,244,102,108, +103,104,103,140,103,164,103,188,103,212,103,236,104,34,104,88,104,142,104, +214,104,238,105,86,105,162,106,244,107,70,107,118,107,188,107,248,109,10, +109,50,109,112,109,172,109,206,112,188,112,236,114,22,114,30,114,38,114,82, +114,208,114,216,114,224,114,232,115,138,115,146,115,154,116,34,116,42,116, +50,116,116,116,124,116,182,116,190,117,56,117,64,117,72,117,234,117,242,118, +140,119,78,119,102,120,194,120,218,120,242,121,10,121,36,121,64,122,30,122, +212,123,118,124,16,124,186,125,114,125,218,126,124,127,28,127,136,128,94, +128,208,130,6,130,234,130,242,131,112,131,246,132,174,133,52,133,156,134, +4,134,138,135,74,135,188,136,108,136,134,136,160,136,184,136,208,136,232, +137,66,137,198,137,222,138,142,138,150,138,158,138,182,138,190,139,116,139, +224,140,78,140,102,140,126,140,198,140,206,141,66,141,74,141,82,141,224,141, +232,142,210,143,168,144,10,144,34,144,152,145,30,145,38,145,46,145,54,145, +108,145,116,145,124,145,132,146,12,146,156,146,164,146,226,147,78,147,158, +147,250,148,88,148,206,149,44,149,214,150,112,151,26,151,34,151,198,152,86, +152,130,152,254,153,6,153,250,154,160,155,34,155,58,155,200,156,80,157,2, +157,96,157,104,157,178,157,186,157,194,157,250,158,2,158,250,159,2,159,72, +159,160,159,242,160,86,160,184,161,28,161,134,162,24,162,150,163,6,163,32, +163,192,163,216,164,106,164,114,164,232,165,2,165,10,165,228,166,90,166,222, +166,246,167,14,167,100,167,148,167,194,167,218,167,242,168,10,168,34,168, +60,168,86,168,110,168,134,168,168,168,202,168,236,168,248,169,40,169,90,169, +140,169,188,170,18,170,114,170,208,171,12,171,102,171,172,171,238,174,134, +174,168,174,186,174,246,175,46,175,70,175,90,175,126,175,232,176,60,176,252, +178,100,179,50,180,4,180,178,181,136,182,32,182,224,183,78,183,128,183,178, +183,228,184,14,184,60,184,106,184,152,184,198,185,14,185,86,185,166,186,118, +187,22,187,70,187,184,187,214,188,72,188,226,188,250,189,52,190,108,191,92, +191,212,192,8,192,96,192,184,192,230,193,0,193,54,193,116,193,140,193,166, +193,200,193,234,194,12,194,46,194,84,194,122,194,160,194,198,194,248,195, +30,195,72,195,118,195,166,195,224,196,14,196,62,196,120,196,166,196,214,197, +16,197,62,197,110,197,168,197,220,198,18,198,86,198,138,198,194,199,8,199, +62,199,114,199,184,199,238,200,34,200,106,200,178,200,252,201,88,201,112, +201,136,201,160,201,184,201,208,203,232,205,196,207,132,207,146,207,178,207, +206,207,246,208,4,208,18,208,32,208,46,208,60,208,106,208,188,208,238,209, +32,209,114,209,180,210,100,210,228,211,148,212,14,212,166,213,6,213,140,213, +224,214,26,214,102,214,220,215,70,215,164,215,246,216,8,216,68,216,164,217, +34,217,88,218,12,218,74,218,114,218,160,218,200,218,242,219,40,219,94,219, +130,219,208,220,20,220,80,0,0,0,2,0,68,0,0,2,100,5,85,0,3,0,7,0,46,177,1, +0,47,60,178,7,4,8,237,50,177,6,5,220,60,178,3,2,8,237,50,0,177,3,0,47,60, +178,5,4,8,237,50,178,7,6,9,252,60,178,1,2,8,237,50,51,17,33,17,37,33,17,33, +68,2,32,254,36,1,152,254,104,5,85,250,171,68,4,205,0,0,0,2,0,185,0,0,1,127, +5,129,0,3,0,7,1,172,64,158,3,91,2,2,150,7,166,7,2,7,150,57,4,73,4,89,4,3, +4,64,23,27,72,6,4,1,11,4,38,9,1,201,9,217,9,2,118,9,166,9,2,25,9,41,9,2,6, +9,1,215,73,9,1,38,9,1,217,9,1,118,9,1,41,9,1,6,9,1,121,9,1,86,9,1,9,9,1,163, +169,9,1,130,9,1,84,9,100,9,116,9,3,137,9,1,98,9,114,9,2,68,9,84,9,2,34,9, +50,9,2,20,9,1,2,9,1,242,9,1,212,9,228,9,2,178,9,194,9,2,148,9,164,9,2,114, +9,130,9,2,84,9,100,9,2,66,9,1,20,9,36,9,52,9,3,2,9,1,110,9,184,255,128,64, +17,102,109,72,73,9,1,9,64,94,98,72,45,9,61,9,2,9,184,1,0,64,153,85,88,72, +9,128,81,84,72,125,9,141,9,157,9,3,95,9,111,9,2,9,128,71,75,72,9,192,67,70, +72,9,128,63,66,72,125,9,1,91,9,107,9,2,61,9,77,9,2,25,9,41,9,2,11,9,1,55, +235,9,251,9,2,205,9,221,9,2,171,9,187,9,2,9,64,45,48,72,59,9,75,9,91,9,3, +29,9,45,9,2,1,203,9,219,9,235,9,3,159,9,175,9,191,9,3,27,9,43,9,59,9,107, +9,123,9,5,15,9,1,2,127,9,143,9,159,9,191,9,207,9,5,64,9,96,9,2,15,9,31,9, +2,7,112,1,1,95,1,1,1,5,156,4,2,3,0,63,47,253,206,93,93,1,94,93,93,93,95,113, +113,113,113,95,114,114,43,114,114,114,94,93,93,93,93,93,43,43,43,113,113, +43,43,114,43,114,43,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113, +114,114,114,94,93,93,93,113,113,113,113,114,114,94,93,93,93,93,113,47,94, +93,43,93,237,113,51,47,237,49,48,1,35,3,51,3,53,51,21,1,103,148,24,196,198, +194,1,141,3,244,250,127,201,201,0,0,2,0,87,3,198,2,128,5,129,0,3,0,7,0,104, +64,33,48,3,1,128,3,1,3,16,2,32,2,96,2,112,2,128,2,5,96,2,112,2,2,80,2,96, +2,176,2,192,2,4,2,184,255,192,179,37,40,72,2,184,255,192,64,32,25,28,72,2, +48,7,1,128,7,1,7,111,6,127,6,143,6,3,47,6,63,6,2,6,5,32,0,1,0,6,2,3,0,63, +51,205,93,50,1,47,113,114,205,93,113,220,43,43,93,113,114,205,93,113,49,48, +1,35,3,51,1,35,3,51,2,106,142,20,184,254,121,141,21,184,3,198,1,187,254,69, +1,187,0,0,0,2,0,9,0,0,4,105,5,121,0,27,0,31,0,214,64,134,90,25,1,90,21,1, +68,14,1,68,19,1,54,19,1,68,30,1,38,30,54,30,2,68,23,1,38,23,54,23,2,3,16, +1,8,29,28,21,20,9,20,20,11,14,15,18,19,10,9,19,12,16,4,10,4,1,0,25,24,5,24, +24,27,3,3,7,30,31,22,23,6,23,5,6,4,7,8,11,4,12,13,1,14,29,30,4,13,0,15,28, +31,4,16,17,18,21,22,25,4,17,16,13,1,208,13,1,79,17,143,17,159,17,3,63,17, +79,17,2,13,17,13,17,5,20,23,24,3,19,3,6,9,10,3,5,0,47,23,51,63,23,51,18,57, +57,47,47,93,113,93,113,17,23,51,16,205,23,50,17,23,51,16,205,23,50,1,47,51, +51,135,192,192,192,192,1,23,51,16,135,192,192,192,192,1,47,23,51,135,192, +192,192,192,1,51,16,135,192,192,192,192,49,48,1,93,93,93,93,93,93,93,93,93, +93,1,3,33,21,33,3,35,19,33,3,35,19,35,53,51,19,35,53,33,19,51,3,33,19,51, +3,51,21,33,3,33,19,3,128,78,1,4,254,229,88,110,86,254,149,84,110,84,201,225, +78,252,1,18,89,110,88,1,107,88,110,88,211,253,64,80,1,106,78,3,117,254,143, +108,254,104,1,152,254,104,1,152,108,1,113,108,1,152,254,104,1,152,254,104, +108,254,143,1,113,0,3,0,22,255,114,4,82,5,236,0,48,0,59,0,70,1,46,64,92,154, +14,1,154,13,1,150,68,1,133,39,1,138,57,154,57,2,137,53,153,53,2,132,37,1, +118,6,134,6,150,6,3,70,63,86,63,134,63,3,52,38,100,38,116,38,3,37,2,1,25, +27,1,24,34,55,3,47,9,21,65,3,32,48,1,48,48,16,49,30,111,29,41,111,0,49,32, +49,2,0,49,32,49,48,49,80,49,112,49,5,8,3,49,184,255,192,179,29,35,72,49,184, +255,192,64,117,17,22,72,49,4,111,3,64,16,24,72,3,60,111,16,33,66,115,207, +54,1,157,54,1,5,136,54,1,120,10,216,10,2,199,34,215,34,2,182,34,1,135,34, +167,34,2,215,65,1,166,65,1,119,65,1,60,16,65,34,10,54,41,49,8,0,125,30,141, +30,2,26,30,1,30,24,22,64,19,23,72,22,15,21,47,21,63,21,95,21,4,21,55,9,115, +47,148,4,164,4,2,112,4,128,4,2,5,4,21,4,85,4,101,4,4,46,4,0,0,47,50,50,93, +93,93,205,237,50,47,93,205,43,51,51,93,93,18,23,57,93,93,93,93,93,93,93,93, +95,93,93,237,50,1,47,237,214,43,237,47,43,43,95,94,93,113,253,212,237,17, +18,57,47,114,23,51,205,23,50,49,48,93,0,93,93,93,93,93,93,1,93,93,93,0,93, +1,93,37,46,1,39,55,30,3,23,17,39,46,3,53,52,62,2,55,53,51,21,30,3,23,7,46, +1,39,17,30,5,21,20,14,2,7,21,35,1,52,46,2,39,17,62,3,1,20,30,2,23,17,14,3, +2,6,217,245,34,170,11,46,78,113,78,20,77,148,116,71,64,115,158,95,124,100, +145,102,66,20,174,20,122,117,59,114,103,88,64,36,56,114,175,119,124,1,160, +47,81,106,58,65,108,77,42,253,92,40,70,95,55,72,100,61,27,20,9,185,165,37, +53,87,64,39,5,1,240,5,18,50,83,128,98,84,124,83,44,4,131,131,5,45,80,115, +75,33,94,105,11,254,67,14,30,41,56,79,109,72,77,131,100,62,6,162,2,24,63, +80,51,32,15,254,44,4,31,56,81,2,197,54,74,50,33,14,1,165,4,33,52,68,0,0,0, +0,5,0,73,255,244,6,212,5,141,0,19,0,23,0,43,0,63,0,83,0,212,64,11,118,20, +134,20,2,121,22,137,22,2,42,184,255,232,64,14,8,12,72,37,24,8,12,72,32,24, +8,12,72,26,184,255,232,179,8,12,72,17,184,255,232,179,8,12,72,13,184,255, +232,64,18,8,12,72,7,24,8,12,72,3,24,8,12,72,22,23,20,21,21,184,255,240,64, +84,23,16,23,21,23,21,0,39,54,180,10,178,0,180,0,44,16,44,32,44,3,0,44,64, +44,2,0,44,16,44,32,44,80,44,96,44,112,44,224,44,240,44,8,44,64,180,29,178, +74,180,15,39,1,239,39,255,39,2,39,64,10,13,72,39,79,182,34,184,69,182,24, +4,22,3,21,18,49,182,15,184,59,182,5,19,0,63,237,244,237,63,63,63,237,244, +237,1,47,43,113,114,237,244,237,47,93,113,114,253,244,237,17,18,57,57,47, +47,56,56,17,51,17,51,49,48,0,43,43,43,43,43,43,43,43,1,93,93,1,20,14,2,35, +34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2, +53,52,62,2,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,52,46,2,35,34,14, +2,21,20,30,2,51,50,62,2,6,212,51,87,116,66,66,115,85,49,48,86,117,68,66,115, +85,50,251,59,155,3,154,157,251,223,64,114,86,49,50,85,116,66,67,116,85,49, +49,86,118,4,250,22,43,63,40,42,64,44,22,23,43,63,41,39,63,44,24,251,240,22, +42,62,40,43,65,44,22,23,43,64,42,38,62,44,24,1,178,125,171,105,45,45,104, +171,126,133,174,103,41,41,103,174,253,201,5,129,12,41,102,172,131,126,172, +107,46,46,106,172,127,131,172,102,41,252,37,99,131,78,32,33,78,131,98,95, +128,79,34,34,79,128,2,124,98,130,78,32,33,78,130,97,95,130,79,34,34,79,130, +0,0,3,0,72,255,236,5,54,5,137,0,57,0,73,0,89,1,20,64,73,137,1,1,140,36,1, +123,42,139,42,2,98,82,114,82,130,82,3,102,71,1,127,78,1,91,78,1,73,43,89, +43,105,43,3,54,48,134,48,2,37,40,1,44,35,124,35,140,35,3,28,5,44,5,60,5,92, +5,4,10,10,26,10,42,10,3,10,2,26,2,42,2,3,31,184,255,232,64,56,9,13,72,10, +25,26,25,42,25,3,48,41,38,69,4,54,66,73,23,33,73,58,45,44,140,74,1,74,77, +18,3,23,3,58,44,80,23,1,3,44,1,23,58,44,44,58,23,3,13,15,54,1,175,54,1,54, +184,255,192,64,61,9,12,72,54,80,72,63,13,79,13,2,13,143,3,1,141,77,1,98,69, +114,69,2,54,69,70,69,2,3,74,48,41,77,44,38,18,69,9,8,63,81,144,28,1,192,28, +1,15,28,63,28,2,28,85,81,8,22,51,80,0,22,0,63,237,63,237,47,93,93,113,237, +18,23,57,93,93,93,93,1,47,93,237,47,43,93,113,18,23,57,47,47,47,0,93,1,93, +17,18,57,17,23,57,93,16,205,16,237,16,237,17,23,57,49,48,93,43,0,93,93,93, +93,1,93,93,93,0,93,93,93,93,1,93,0,93,93,5,34,38,39,14,3,35,34,46,2,53,52, +62,2,55,46,3,53,52,62,2,51,50,30,2,21,20,14,2,7,30,1,23,62,1,55,23,14,1,7, +30,1,51,50,54,55,21,14,1,1,52,46,2,35,34,6,21,20,22,23,62,3,3,46,1,39,14, +1,21,20,30,2,51,50,62,2,4,169,96,144,58,30,76,93,109,64,117,171,110,53,51, +91,126,75,18,29,22,12,40,85,133,93,73,123,90,50,66,112,148,83,62,146,85,61, +81,29,145,35,107,70,53,106,49,32,59,26,28,75,254,150,27,48,69,42,96,100,37, +28,65,116,86,50,74,89,164,66,113,123,35,72,109,73,44,79,68,55,12,66,61,26, +48,38,23,60,105,143,83,79,129,105,83,33,34,77,78,78,35,66,115,85,49,38,72, +106,68,75,117,92,75,33,114,201,97,90,199,121,43,139,227,103,54,44,7,9,135, +11,11,4,121,37,60,43,23,103,91,59,129,56,26,55,65,79,252,158,105,230,122, +48,148,105,55,95,71,41,19,30,38,0,0,1,0,104,3,198,1,32,5,129,0,3,0,33,64, +19,48,3,1,128,3,1,3,16,2,32,2,2,2,32,0,1,0,2,3,0,63,205,93,1,47,93,205,93, +113,49,48,1,35,3,51,1,10,141,21,184,3,198,1,187,0,1,0,127,254,88,2,158,5, +204,0,22,0,66,64,45,135,13,1,135,9,1,88,20,1,88,2,1,17,24,14,17,72,5,24,14, +17,72,16,6,16,16,6,128,6,2,6,11,242,0,0,16,0,32,0,3,0,16,27,5,0,0,63,63,1, +47,93,237,204,93,56,50,49,48,43,43,93,93,93,93,19,52,62,2,55,51,14,3,21,20, +30,2,23,35,46,3,53,127,42,90,140,97,174,94,137,88,43,43,88,137,94,174,97, +140,90,42,2,20,139,254,234,220,105,105,221,235,254,139,139,254,236,220,105, +105,220,234,253,140,0,0,0,1,0,12,254,88,2,43,5,204,0,22,0,72,64,13,136,13, +1,136,9,1,87,20,1,87,2,1,17,184,255,232,179,14,17,72,5,184,255,232,180,14, +17,72,16,6,184,255,240,64,16,31,6,143,6,2,6,0,242,143,11,1,11,16,0,5,27,0, +63,63,1,47,93,253,204,93,56,50,49,48,43,43,93,93,93,93,1,20,14,2,7,35,62, +3,53,52,46,2,39,51,30,3,21,2,43,42,90,140,97,174,94,137,88,43,43,88,137,94, +174,97,140,90,42,2,16,140,253,234,220,105,105,220,236,254,139,139,254,235, +221,105,105,220,234,254,139,0,0,0,0,1,0,33,2,178,2,253,5,129,0,14,0,107,64, +75,77,5,93,5,109,5,3,75,4,91,4,107,4,3,66,8,82,8,2,67,7,83,7,2,0,6,12,3,13, +95,4,1,15,4,1,4,3,32,2,48,2,2,2,14,47,10,63,10,2,10,9,8,191,13,207,13,2,16, +13,32,13,2,13,240,5,1,223,5,1,0,5,1,5,14,3,0,63,204,93,93,93,1,47,93,93,204, +51,204,93,221,204,93,51,204,113,114,18,23,57,49,48,93,93,93,93,1,37,23,5, +23,7,11,1,39,55,37,55,5,3,51,1,200,1,8,45,254,230,185,119,150,156,119,189, +254,232,45,1,11,12,136,4,90,103,132,73,250,72,1,2,255,0,72,248,73,134,107, +1,41,0,0,0,1,0,100,0,180,4,71,4,158,0,11,0,71,64,46,211,11,1,133,11,1,220, +4,1,138,4,1,9,1,170,6,16,2,32,2,2,2,217,2,1,56,2,136,2,2,2,0,4,173,9,214, +7,1,55,7,135,7,2,7,5,179,0,63,51,93,93,51,237,50,50,93,93,1,47,93,51,237, +50,49,48,93,93,93,93,1,17,35,17,33,53,33,17,51,17,33,21,2,159,147,254,88, +1,168,147,1,168,2,96,254,84,1,172,146,1,172,254,84,146,0,0,1,0,184,254,250, +1,129,0,219,0,12,0,78,185,0,4,255,224,183,11,17,72,10,151,0,150,7,184,255, +192,64,22,9,17,72,7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2, +12,184,255,192,64,14,38,41,72,12,64,13,16,72,12,7,168,0,155,11,0,47,253,228, +1,47,43,43,93,113,114,51,43,253,237,49,48,43,37,21,20,14,2,7,35,62,1,53,35, +53,1,129,9,20,29,20,123,45,49,88,219,168,53,87,75,66,32,65,132,65,219,0,0, +0,0,1,0,91,1,208,2,79,2,112,0,3,0,33,64,20,0,2,64,2,112,2,3,2,0,0,187,159, +1,207,1,2,47,1,1,1,0,47,93,113,237,1,47,47,93,49,48,19,53,33,21,91,1,244, +1,208,160,160,0,0,0,1,0,187,0,0,1,126,0,219,0,3,0,46,64,32,3,150,0,0,144, +0,2,64,0,80,0,176,0,224,0,240,0,5,144,0,160,0,2,0,64,13,16,72,0,1,155,0,0, +47,237,1,47,43,93,113,114,237,49,48,51,53,51,21,187,195,219,219,0,1,0,0,255, +236,2,57,5,204,0,3,0,51,64,26,121,0,137,0,2,1,24,13,17,72,41,2,1,2,16,0,2, +16,2,32,2,128,2,4,2,0,184,255,240,180,0,1,0,0,19,0,63,63,1,47,56,205,93,56, +49,48,93,43,93,21,1,51,1,1,155,158,254,105,20,5,224,250,32,0,0,2,0,80,255, +236,4,35,5,150,0,19,0,39,0,112,64,80,89,37,105,37,2,70,33,86,33,102,33,3, +86,27,102,27,2,89,23,105,23,2,4,18,1,118,17,134,17,2,121,13,137,13,2,11,12, +1,11,8,1,121,7,137,7,2,118,3,134,3,2,4,2,1,7,0,110,64,144,20,160,20,2,20, +41,128,30,110,63,10,1,10,25,115,15,7,35,115,5,25,0,63,237,63,237,1,47,93, +237,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93,93,93,93,93,1,20, +2,14,1,35,34,46,1,2,53,52,18,62,1,51,50,30,1,18,7,52,46,2,35,34,14,2,21,20, +30,2,51,50,62,2,4,35,77,133,180,102,103,178,131,75,75,132,180,106,101,177, +132,76,183,40,78,113,72,76,116,79,40,41,79,114,73,71,114,79,43,2,193,203, +254,235,171,74,74,170,1,21,204,213,1,23,166,67,67,166,254,233,213,168,223, +133,55,56,133,223,167,162,222,135,59,59,135,222,0,1,0,156,0,0,4,15,5,129, +0,10,0,94,64,32,32,9,128,9,2,9,9,8,110,2,144,4,1,4,47,1,143,1,2,1,1,4,6,3, +0,2,16,2,2,7,2,5,184,255,240,64,26,16,22,72,68,5,84,5,100,5,3,5,4,3,16,16, +22,72,4,3,6,6,8,1,116,0,24,0,63,237,50,63,51,51,43,47,51,93,43,1,47,94,93, +23,51,47,93,47,93,16,237,50,47,93,49,48,51,53,33,17,5,53,37,51,17,33,21,156, +1,103,254,194,1,77,166,1,87,153,4,60,227,170,229,251,24,153,0,0,0,1,0,103, +0,0,4,12,5,150,0,40,0,161,64,77,117,4,1,117,26,133,26,2,122,16,138,16,2,101, +37,1,86,37,1,41,33,89,33,105,33,3,105,35,1,28,35,1,25,21,1,117,27,133,27, +2,6,27,1,39,29,110,64,8,64,38,42,72,64,8,1,143,8,1,8,42,128,18,110,19,116, +38,132,38,2,19,38,16,0,32,0,2,0,184,255,192,64,31,30,38,72,0,8,38,142,18, +1,92,18,108,18,124,18,3,10,18,26,18,2,18,13,115,24,7,1,38,116,0,24,0,63,237, +57,63,237,51,93,93,93,18,57,1,47,43,93,51,51,93,47,237,26,16,220,93,113,43, +26,237,50,49,48,93,93,0,93,93,93,93,1,93,93,0,93,93,93,51,53,62,5,53,52,46, +2,35,34,14,2,7,39,62,3,51,50,30,2,21,20,14,6,7,33,21,103,51,147,162,159,128, +79,36,68,95,58,54,95,74,47,7,184,9,66,116,163,107,105,164,113,60,51,85,112, +122,124,109,86,24,2,223,127,117,179,145,124,124,136,86,60,91,62,31,30,60, +89,59,17,76,134,101,58,50,98,144,94,71,128,116,108,103,101,102,105,57,153, +0,0,0,0,1,0,78,255,236,4,25,5,150,0,59,0,216,64,149,122,3,138,3,2,117,2,133, +2,2,117,58,133,58,2,117,51,133,51,2,117,47,133,47,2,117,13,133,13,2,122,37, +138,37,2,91,17,107,17,2,26,41,1,21,8,1,118,46,134,46,2,7,46,1,73,39,1,38, +110,54,25,49,95,25,111,25,2,39,25,39,25,10,19,32,110,49,49,0,110,64,31,19, +47,19,159,19,3,144,19,1,19,61,128,11,110,239,10,1,63,10,1,10,54,25,116,26, +26,16,141,38,1,92,38,108,38,124,38,3,10,38,26,38,2,38,35,115,44,7,16,115, +129,11,1,83,11,99,11,115,11,3,20,11,1,5,11,1,11,5,25,0,63,51,93,93,93,93, +237,63,237,51,93,93,93,18,57,47,237,57,1,47,93,113,237,26,16,220,93,113,26, +237,50,47,237,17,18,57,57,47,47,93,17,18,57,237,113,49,48,0,93,93,93,93,1, +93,0,93,93,1,93,93,93,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53, +52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,14, +2,7,21,30,3,4,25,63,121,179,115,131,179,116,58,9,186,8,43,74,108,74,136,155, +69,103,121,51,102,98,51,110,91,59,133,131,119,147,12,181,11,80,123,158,89, +118,170,108,51,34,72,111,78,85,126,82,41,1,133,97,152,105,55,65,107,137,73, +17,56,92,66,36,134,132,78,95,53,18,156,21,55,94,73,113,131,122,111,14,93, +138,91,45,59,101,136,77,62,108,86,62,16,4,9,59,88,112,0,0,2,0,47,0,0,4,55, +5,129,0,10,0,23,0,117,64,80,154,15,1,153,6,1,136,6,1,133,16,149,16,2,118, +16,1,24,22,1,118,22,134,22,150,22,3,22,5,64,12,21,72,5,91,10,107,10,123,10, +3,10,8,1,111,23,6,31,2,1,112,2,224,2,2,0,2,16,2,48,2,80,2,224,2,5,8,2,0,4, +115,8,22,22,1,11,6,6,1,24,0,63,63,51,18,57,47,51,237,50,1,47,94,93,113,114, +51,51,237,50,50,93,47,43,51,93,113,49,48,93,93,93,93,0,93,1,17,35,17,33,53, +1,51,17,51,21,1,14,3,7,1,14,3,7,33,3,113,170,253,104,2,133,189,198,254,144, +2,16,20,21,8,254,151,5,19,20,20,6,1,242,1,63,254,193,1,63,140,3,182,252,76, +142,3,119,5,29,36,37,12,253,236,8,26,27,26,7,0,1,0,82,255,236,4,29,5,129, +0,44,0,181,64,28,86,13,102,13,134,13,3,85,2,101,2,2,90,3,106,3,2,85,43,101, +43,2,85,42,101,42,2,38,184,255,216,64,89,14,17,72,21,8,1,6,10,1,25,36,153, +36,2,137,36,217,36,2,3,68,33,1,6,35,32,14,17,72,35,11,0,110,64,31,21,1,47, +21,159,21,2,144,21,1,21,46,128,36,31,37,110,33,32,32,11,110,208,10,1,63,10, +1,10,26,115,40,40,16,36,116,33,6,16,115,115,11,131,11,2,103,11,1,22,11,1, +11,5,25,0,63,51,93,93,93,237,63,237,18,57,47,237,1,47,93,113,237,51,47,51, +237,50,50,26,16,220,93,113,114,26,237,17,57,43,49,48,95,113,95,113,114,0, +93,1,93,0,43,93,1,93,0,93,1,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50, +62,2,53,52,46,2,35,34,14,2,7,35,19,33,21,33,3,62,1,51,50,30,2,4,29,64,126, +187,123,111,165,114,67,14,182,11,40,69,101,72,70,114,81,44,42,78,113,72,45, +76,65,53,23,176,47,3,33,253,131,27,48,144,99,105,168,118,64,1,203,106,176, +127,70,52,91,122,70,21,40,75,59,35,43,84,122,79,65,109,79,44,16,28,37,20, +2,246,153,254,65,37,53,64,117,162,0,0,0,0,2,0,104,255,236,4,25,5,150,0,36, +0,56,0,175,64,48,140,21,1,122,22,138,22,2,89,7,105,7,2,90,3,106,3,122,3,3, +84,2,100,2,2,84,35,100,35,116,35,3,84,34,100,34,116,34,3,53,30,69,30,2,133, +50,1,50,184,255,240,64,45,10,13,72,132,26,1,37,26,53,26,69,26,117,26,4,22, +26,1,21,111,20,20,0,110,64,47,37,159,37,2,144,37,1,37,58,128,47,29,110,16, +10,32,10,2,10,184,255,192,64,24,30,38,72,10,29,42,117,32,32,52,24,115,25, +21,153,21,2,21,15,7,52,115,5,25,0,63,237,63,51,93,237,18,57,47,237,50,1,47, +43,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,93,93,43,93,0,93, +93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,46,1,2,53,52,18,62,1,51,50,30,2, +23,7,46,1,35,34,14,2,21,62,1,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51, +50,62,2,4,25,59,115,170,111,123,184,122,61,69,130,187,118,72,126,103,78,23, +172,28,123,81,74,120,84,45,49,178,115,96,156,111,61,183,36,72,106,70,49,100, +81,51,40,75,106,66,65,103,72,38,1,205,106,177,127,71,94,177,1,1,164,188,1, +28,190,96,30,67,110,80,31,91,81,70,139,210,140,91,95,62,117,167,112,73,118, +83,45,29,65,106,76,78,135,100,58,45,85,122,0,0,1,0,105,0,0,4,12,5,129,0,14, +0,68,64,45,122,11,138,11,2,105,11,1,5,110,6,6,0,80,12,1,16,12,32,12,2,12, +11,95,0,1,0,0,32,0,64,0,96,0,128,0,5,0,0,12,116,13,6,5,24,0,63,63,237,50, +1,47,93,113,51,47,93,113,18,57,47,237,49,48,93,93,1,6,10,2,21,35,52,26,2, +55,33,53,33,4,12,106,178,128,71,188,80,136,180,101,253,11,3,163,4,239,162, +254,213,254,209,254,193,180,169,1,69,1,57,1,46,147,153,0,0,0,0,3,0,89,255, +236,4,26,5,150,0,41,0,61,0,81,0,191,64,132,117,40,133,40,2,117,33,133,33, +2,117,29,133,29,2,117,28,133,28,2,117,24,133,24,2,122,23,138,23,2,122,19, +138,19,2,122,12,1,122,8,138,8,2,122,7,138,7,2,122,3,138,3,2,117,2,133,2,2, +85,69,101,69,2,85,75,101,75,2,90,65,106,65,2,52,110,21,42,110,31,15,36,31, +79,21,1,21,31,21,31,10,0,110,64,15,62,31,62,2,31,62,47,62,159,62,3,144,62, +1,62,83,128,72,110,208,10,1,10,36,15,67,117,57,57,77,47,117,26,7,77,117,5, +25,0,63,237,63,237,18,57,47,237,57,57,1,47,113,237,26,16,220,93,113,114,26, +237,17,57,57,47,47,113,18,57,57,16,237,16,237,49,48,93,93,93,93,0,93,93,1, +93,93,93,93,0,93,93,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3, +53,52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,3,52,46,2,35,34,14,2,21,20,30, +2,51,50,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,26,57,117,182, +124,124,181,119,57,47,79,101,54,59,93,63,33,57,112,166,109,115,169,111,54, +33,63,93,61,61,104,76,44,222,27,62,100,73,71,98,63,28,22,58,102,80,85,103, +55,17,35,28,68,115,86,79,111,69,32,32,70,114,81,82,112,68,29,1,137,90,151, +110,62,62,109,151,89,77,120,87,53,9,4,14,62,87,106,59,74,131,99,57,58,99, +132,74,58,106,87,61,12,4,10,53,87,120,2,76,53,88,63,35,35,63,88,53,42,88, +72,46,46,72,88,253,163,51,95,73,45,45,74,97,52,65,107,77,42,42,77,109,0,0, +0,2,0,96,255,236,4,18,5,150,0,36,0,56,0,190,64,105,169,39,1,163,11,1,149, +12,165,12,2,170,17,1,153,17,1,116,35,132,35,2,116,32,132,32,148,32,3,122, +31,138,31,154,31,3,122,27,138,27,154,27,3,123,26,139,26,155,26,3,90,40,106, +40,2,89,2,105,2,2,16,24,10,13,72,54,8,1,37,0,110,47,19,63,19,2,79,19,191, +19,2,0,19,32,19,48,19,64,19,176,19,5,7,19,58,11,111,10,10,47,110,32,29,1, +29,184,255,192,64,27,32,38,72,29,19,52,115,95,24,111,24,2,24,24,5,42,115, +34,7,14,115,23,11,1,11,5,25,0,63,51,93,237,63,237,17,57,47,93,237,50,1,47, +43,93,237,51,47,237,16,220,94,93,113,114,237,51,49,48,93,43,93,93,0,93,1, +93,93,0,93,93,1,93,93,0,93,93,1,93,1,20,2,14,1,35,34,46,2,39,55,30,1,51,50, +62,2,55,14,3,35,34,46,2,53,52,62,2,51,50,18,7,52,46,2,35,34,14,2,21,20,30, +2,51,50,62,2,4,18,71,132,189,118,81,130,102,72,22,172,28,119,91,73,121,85, +48,2,21,73,93,108,55,96,155,108,59,63,120,175,111,235,242,196,37,73,107,70, +65,104,72,39,35,70,104,69,50,103,83,53,2,221,188,254,229,188,94,33,70,112, +79,27,91,85,69,138,208,140,47,74,51,27,69,124,175,107,109,176,123,66,254, +164,175,78,138,102,59,46,85,122,75,71,122,89,51,34,70,107,0,0,0,0,2,0,187, +0,0,1,126,4,58,0,3,0,7,0,54,64,36,3,7,150,0,0,4,144,4,2,64,4,80,4,224,4,240, +4,4,144,4,160,4,2,4,64,13,16,72,4,5,156,4,0,156,1,15,0,63,237,47,237,1,47, +43,93,113,114,51,237,50,49,48,19,53,51,21,3,53,51,21,187,195,195,195,3,107, +207,207,252,149,207,207,0,0,0,2,0,184,254,250,1,129,4,58,0,12,0,16,0,89,185, +0,4,255,224,64,10,11,17,72,16,10,151,0,150,13,7,184,255,192,64,22,9,17,72, +7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2,12,184,255,192,64, +18,38,41,72,12,64,13,16,72,12,13,156,14,15,7,168,0,156,11,0,47,253,228,63, +237,1,47,43,43,93,113,114,51,43,51,253,237,51,49,48,43,37,21,20,14,2,7,35, +62,1,53,35,53,17,53,51,21,1,129,9,20,29,20,123,45,49,88,195,207,156,53,87, +75,66,32,65,132,65,207,2,156,207,207,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106, +185,0,5,255,216,64,17,18,22,72,3,40,18,22,72,0,40,18,22,72,137,0,1,1,184, +255,216,64,51,18,22,72,134,1,1,6,0,2,32,2,80,2,112,2,4,2,32,0,1,0,63,6,127, +6,143,6,3,6,48,2,112,2,128,2,3,2,1,0,15,4,63,4,111,4,159,4,207,4,5,4,0,25, +47,93,51,51,205,93,205,93,1,24,47,93,47,93,51,49,48,0,93,43,93,43,43,43,19, +53,1,21,9,1,21,101,3,227,252,166,3,90,2,59,205,1,162,154,254,146,254,145, +153,0,0,0,0,2,0,100,1,88,4,71,3,236,0,3,0,7,0,70,64,49,7,64,2,96,2,2,0,2, +32,2,112,2,208,2,4,2,4,223,0,1,32,0,1,0,4,173,31,5,47,5,95,5,111,5,223,5, +5,5,0,173,80,1,208,1,2,15,1,1,1,0,47,93,93,237,222,93,237,1,47,93,93,51,47, +93,113,51,49,48,19,53,33,21,1,53,33,21,100,3,227,252,29,3,227,3,88,148,148, +254,0,148,148,0,0,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106,185,0,1,255,216, +64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137,6,1,5,184,255,216,64,51,18, +22,72,134,5,1,0,6,32,6,80,6,112,6,4,6,3,32,0,1,0,6,5,48,4,112,4,128,4,3,4, +63,0,127,0,143,0,3,0,15,2,63,2,111,2,159,2,207,2,5,2,0,25,47,93,205,93,205, +93,51,51,1,24,47,93,51,47,93,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21, +101,3,90,252,166,3,227,154,153,1,111,1,110,154,254,94,205,0,2,0,84,0,0,4, +39,5,150,0,37,0,41,0,137,64,68,117,36,133,36,2,117,35,133,35,2,90,26,106, +26,2,90,21,1,90,14,122,14,138,14,3,90,13,122,13,138,13,3,58,6,74,6,2,9,72, +10,10,176,41,192,41,2,41,150,38,38,19,27,70,28,0,70,0,19,32,19,64,19,144, +19,176,19,5,19,184,255,192,64,23,38,44,72,19,19,33,95,10,143,10,2,10,39,156, +38,76,27,1,27,24,95,33,4,0,63,237,51,93,47,253,198,93,17,57,1,47,43,93,237, +47,237,18,57,47,237,113,51,47,237,49,48,0,93,1,93,93,0,93,93,93,1,93,1,20, +14,6,7,35,62,7,53,52,46,2,35,34,6,7,39,62,3,51,50,30,2,1,53,51,21,4,39,37, +62,79,82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184, +11,67,121,179,122,114,178,123,64,253,143,195,4,8,71,108,85,67,60,58,68,83, +55,69,104,80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103, +148,251,157,201,201,0,0,0,0,2,0,161,254,229,7,110,5,204,0,93,0,114,1,101, +64,255,122,17,138,17,2,117,15,133,15,2,117,27,133,27,2,121,47,137,47,2,116, +38,132,38,2,102,38,1,99,70,1,86,69,102,69,2,123,26,139,26,2,73,26,1,74,56, +90,56,106,56,3,59,102,1,82,63,1,54,63,70,63,2,82,64,1,38,64,54,64,70,64,3, +131,3,1,37,3,53,3,69,3,3,37,2,53,2,69,2,133,2,4,25,8,57,8,2,11,8,1,11,8,27, +8,2,8,32,12,17,72,22,92,102,92,134,92,3,80,58,96,58,2,5,58,21,58,53,58,69, +58,4,137,57,1,93,57,1,10,57,26,57,2,9,7,1,125,52,141,52,2,11,52,75,52,2,10, +22,26,22,42,22,3,104,212,24,37,41,211,10,112,34,132,72,1,72,10,49,80,24,1, +80,24,1,24,10,24,10,82,0,210,64,95,49,111,49,2,143,49,159,49,2,49,116,128, +61,210,0,82,16,82,32,82,3,82,44,213,5,5,107,214,19,99,214,29,36,29,47,19, +63,19,79,19,3,32,29,48,29,64,29,3,19,29,19,29,77,54,214,89,0,149,71,1,71, +66,214,77,0,47,237,51,93,63,237,18,57,57,47,47,93,93,17,51,16,237,16,237, +51,47,237,1,47,93,237,26,16,220,93,113,26,237,18,57,57,47,47,93,114,17,18, +57,93,50,50,16,237,50,16,237,49,48,93,93,93,93,0,93,93,93,1,93,93,93,43,93, +0,93,93,1,93,93,93,0,93,93,1,93,93,0,93,93,1,93,93,0,93,93,1,93,93,93,0,93, +1,93,0,93,1,20,14,2,35,34,46,2,53,52,54,55,35,14,3,35,34,46,2,53,52,62,2, +51,50,30,2,23,51,55,51,3,14,1,21,20,22,51,50,62,2,53,52,46,2,35,34,14,4,21, +20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,62,2,36,51,50,4,22,18, +5,52,46,2,35,34,14,2,21,20,22,51,50,62,2,55,62,1,7,110,67,118,165,97,56,79, +50,22,2,1,6,24,69,93,117,71,84,125,81,40,71,132,185,114,60,96,73,54,18,6, +39,156,116,19,18,43,38,62,107,79,45,83,161,238,156,134,227,184,139,94,48, +86,165,243,158,105,182,152,120,44,55,50,135,166,196,111,190,254,217,203,105, +63,118,170,215,0,255,144,201,1,36,191,92,253,162,34,63,89,56,86,130,87,45, +95,99,69,120,96,70,18,9,14,2,243,144,239,172,96,27,47,64,38,15,43,12,45,89, +69,43,58,103,141,83,120,221,169,102,27,48,67,40,160,254,6,84,120,49,48,46, +81,142,192,112,129,222,162,92,64,116,161,192,219,115,141,238,171,96,33,48, +57,24,112,30,63,52,33,115,206,1,28,169,139,1,0,220,180,128,70,118,200,254, +248,155,50,84,60,33,85,138,173,87,120,136,62,102,132,71,36,80,0,0,0,0,2,0, +4,0,0,5,82,5,129,0,7,0,20,1,18,64,206,102,2,118,2,134,2,3,102,19,118,19,134, +19,3,105,1,121,1,137,1,3,105,20,121,20,137,20,3,115,6,131,6,2,101,6,1,124, +5,140,5,2,106,5,1,122,0,138,0,2,57,0,89,0,105,0,3,117,3,133,3,2,54,3,86,3, +102,3,3,90,4,1,72,4,1,85,7,1,71,7,1,19,2,3,1,20,0,21,6,37,6,53,6,3,6,6,1, +230,6,246,6,2,26,5,42,5,58,5,3,9,5,1,233,5,249,5,2,6,5,13,13,4,26,0,42,0, +58,0,3,9,0,1,233,0,249,0,2,0,16,7,32,7,48,7,3,32,7,1,7,7,22,21,3,37,3,53, +3,3,6,3,1,230,3,246,3,2,3,175,4,191,4,2,4,80,22,176,22,2,48,22,96,22,144, +22,192,22,240,22,5,47,22,1,1,2,95,20,19,19,118,13,1,13,5,3,4,0,18,0,63,50, +63,51,93,57,47,51,237,50,1,93,93,113,47,93,51,93,113,113,17,51,47,93,113, +51,93,113,113,18,57,61,47,51,51,93,113,113,93,113,113,18,57,57,18,57,57,49, +48,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,3,33,3,35,1,51,9,1, +46,3,39,14,3,7,3,33,4,143,161,253,126,162,198,2,63,217,2,54,253,174,16,29, +22,15,1,2,14,23,29,15,180,2,15,1,156,254,100,5,129,250,127,4,2,40,82,67,45, +5,5,46,68,82,40,254,49,0,3,0,168,0,0,4,234,5,129,0,22,0,33,0,46,0,155,64, +108,155,24,171,24,2,147,32,1,133,32,1,147,45,1,117,45,133,45,2,122,36,138, +36,154,36,3,5,11,21,11,37,11,3,6,2,22,2,38,2,3,171,18,1,159,18,1,107,18,123, +18,139,18,3,18,28,13,90,23,64,13,17,72,23,23,41,0,90,64,31,34,47,34,2,175, +34,1,34,48,128,28,41,90,0,6,16,6,64,6,3,7,6,18,40,95,127,28,1,28,28,41,27, +95,7,3,41,95,6,18,0,63,237,63,237,18,57,47,113,237,57,1,47,94,93,237,50,26, +16,220,93,113,26,237,18,57,47,43,237,17,57,93,93,93,49,48,93,93,0,93,93,93, +93,93,93,1,20,14,2,35,33,17,33,50,30,2,21,20,14,2,7,30,3,1,52,38,35,33,17, +33,50,62,2,19,52,46,2,35,33,17,33,50,62,2,4,234,84,142,188,104,253,196,2, +0,117,184,128,67,33,67,101,67,85,131,88,46,254,238,156,148,254,191,1,65,84, +116,72,32,81,49,92,129,80,254,156,1,115,73,123,89,50,1,141,107,151,95,44, +5,129,39,84,129,90,59,104,85,61,15,10,58,90,119,2,66,114,98,254,66,33,61, +86,253,190,67,94,60,28,254,4,24,60,100,0,1,0,104,255,236,5,121,5,150,0,39, +0,173,64,79,121,14,137,14,2,117,13,133,13,2,123,37,139,37,2,106,38,1,124, +36,140,36,2,106,36,1,106,28,1,85,7,1,90,3,1,42,29,106,29,2,134,23,1,42,23, +106,23,2,5,8,21,8,2,5,2,21,2,2,5,91,80,26,96,26,2,175,26,191,26,2,32,26,1, +15,26,1,26,34,16,184,255,192,64,42,7,13,72,16,16,41,32,41,1,79,35,1,35,35, +0,95,31,4,0,15,16,15,2,48,15,64,15,112,15,128,15,192,15,208,15,6,15,15,10, +95,21,19,0,63,237,51,47,93,113,63,237,51,47,93,1,93,17,51,47,43,51,47,93, +93,93,113,237,49,48,93,93,93,93,93,0,93,93,1,93,93,93,93,0,93,93,1,93,1,34, +14,2,21,20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50, +4,23,7,46,3,3,24,120,185,125,64,69,129,187,117,82,135,109,86,33,156,38,112, +151,191,118,171,254,255,173,86,91,175,1,0,164,225,1,46,71,181,20,68,102,137, +4,250,80,148,208,127,127,211,152,84,43,78,107,65,78,79,136,100,57,109,195, +1,12,159,165,1,10,187,101,176,173,60,50,91,70,42,0,2,0,168,0,0,5,101,5,129, +0,12,0,25,0,100,64,70,169,24,1,123,24,1,172,23,1,27,23,43,23,59,23,123,23, +4,169,16,1,27,16,43,16,59,16,123,16,4,123,15,1,153,3,1,121,2,1,0,90,64,47, +13,1,13,27,128,64,27,1,20,90,0,6,16,6,64,6,3,7,6,19,95,7,3,20,95,6,18,0,63, +237,63,237,1,47,94,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93, +93,93,93,1,20,2,14,1,35,33,17,33,50,4,22,18,7,52,46,2,35,33,17,33,50,62,2, +5,101,106,184,251,145,253,241,1,210,163,1,19,198,111,192,82,148,206,123,254, +241,1,58,111,189,138,78,2,207,176,254,243,181,93,5,129,81,169,254,252,180, +143,203,130,61,251,177,72,142,212,0,0,1,0,168,0,0,4,254,5,129,0,11,0,77,181, +7,3,7,3,0,10,184,255,192,64,37,7,11,72,10,10,13,5,9,90,0,0,16,0,64,0,3,7, +0,32,13,1,8,95,127,5,1,5,5,9,4,95,1,3,9,95,0,18,0,63,237,63,237,18,57,47, +113,237,1,93,47,94,93,237,50,17,51,47,43,18,57,57,47,47,49,48,51,17,33,21, +33,17,33,21,33,17,33,21,168,4,45,252,146,3,50,252,206,3,151,5,129,156,254, +60,154,254,21,156,0,0,1,0,168,0,0,4,145,5,129,0,9,0,105,185,0,2,255,192,182, +13,24,72,2,2,6,8,184,255,192,64,58,7,12,72,8,8,11,1,5,90,0,6,16,6,64,6,3, +7,6,48,11,1,4,95,239,1,1,15,1,63,1,111,1,127,1,159,1,175,1,207,1,223,1,8, +8,1,64,23,30,72,1,1,5,0,95,7,3,5,18,0,63,63,237,18,57,47,43,94,93,113,237, +1,93,47,94,93,237,50,17,51,47,43,18,57,47,43,49,48,1,17,33,21,33,17,35,17, +33,21,1,103,3,18,252,238,191,3,233,4,229,253,244,158,253,197,5,129,156,0, +1,0,103,255,236,5,160,5,150,0,45,0,185,64,130,134,43,1,106,43,1,66,37,82, +37,2,5,24,21,24,85,24,3,86,23,1,86,19,1,5,18,21,18,85,18,3,122,12,138,12, +2,89,12,105,12,2,106,3,1,106,2,1,73,37,89,37,2,53,29,1,123,13,139,13,2,64, +10,1,10,10,36,92,31,64,33,33,0,127,31,143,31,2,31,47,128,32,47,96,47,128, +47,3,21,91,175,0,191,0,2,32,0,1,15,0,1,0,33,95,240,34,1,34,34,5,26,95,41, +19,16,95,5,48,11,64,11,2,144,11,224,11,2,11,11,5,4,0,63,51,47,93,113,16,237, +63,237,17,57,47,93,237,1,47,93,93,93,237,93,26,16,204,93,17,57,47,26,16,237, +50,47,93,49,48,0,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,19,52,18,54, +36,51,50,30,2,23,7,46,3,35,34,14,2,21,20,30,2,51,50,62,2,55,53,33,53,33,17, +14,3,35,34,36,38,2,103,89,177,1,6,173,130,196,144,100,35,182,26,73,104,137, +88,128,189,124,61,66,130,193,127,83,140,113,86,29,254,91,2,85,47,127,158, +188,107,178,254,246,177,89,2,199,165,1,10,187,101,46,86,123,77,54,52,85,60, +33,80,148,208,127,127,211,153,85,28,45,55,28,254,160,254,26,48,87,66,38,109, +195,1,12,0,0,0,0,1,0,168,0,0,5,32,5,129,0,11,0,103,64,29,11,90,64,8,143,0, +159,0,175,0,223,0,4,0,13,128,64,13,1,64,13,192,13,208,13,224,13,4,13,184, +255,192,64,37,14,17,72,7,3,90,0,4,16,4,64,4,3,7,4,2,95,80,7,1,176,7,224,7, +2,15,7,1,8,7,7,9,5,3,4,0,18,0,63,50,63,51,57,47,94,93,93,113,237,1,47,94, +93,237,50,43,93,113,26,16,220,93,50,26,237,49,48,33,17,33,17,35,17,51,17, +33,17,51,17,4,97,253,6,191,191,2,250,191,2,141,253,115,5,129,253,172,2,84, +250,127,0,0,0,1,0,189,0,0,1,124,5,129,0,3,0,122,64,70,3,90,15,0,1,12,0,0, +1,61,16,0,32,0,208,0,3,96,0,112,0,2,0,0,16,0,64,0,80,0,176,0,5,7,0,175,5, +1,0,5,160,5,176,5,3,0,5,16,5,64,5,80,5,160,5,176,5,192,5,240,5,8,32,5,144, +5,240,5,3,5,184,255,192,179,56,61,72,5,184,255,192,179,45,48,72,5,184,255, +192,182,13,16,72,1,3,0,18,0,63,63,1,43,43,43,93,113,114,93,47,94,93,113,114, +94,93,94,93,237,49,48,51,17,51,17,189,191,5,129,250,127,0,0,0,1,0,32,255, +236,3,104,5,129,0,21,0,124,64,15,137,2,1,130,5,1,123,10,1,100,6,116,6,2,6, +184,255,224,64,66,14,17,72,0,14,32,14,2,128,14,144,14,224,14,240,14,4,14, +14,3,17,90,64,64,12,80,12,96,12,3,111,12,1,12,23,128,15,3,1,3,32,23,1,32, +23,64,23,80,23,96,23,4,14,95,15,3,9,95,0,64,4,1,4,4,0,19,0,63,50,47,93,16, +237,63,237,1,93,113,47,113,26,16,220,93,113,26,237,18,57,47,93,113,49,48, +0,43,1,93,93,93,0,93,5,34,38,39,55,30,3,51,50,54,53,17,33,53,33,17,20,14, +2,1,201,171,219,35,187,10,46,64,78,41,104,120,254,241,1,205,56,107,154,20, +178,192,31,65,93,60,28,143,138,3,69,156,252,35,101,162,115,62,0,1,0,168,0, +0,5,63,5,129,0,11,0,154,64,103,171,1,1,157,1,1,138,8,154,8,2,138,1,154,1, +170,1,3,102,2,1,131,7,147,7,2,100,7,1,157,0,173,0,2,107,0,123,0,139,0,3,89, +0,1,86,10,1,155,10,1,36,10,1,1,10,106,8,250,8,2,8,10,144,9,160,9,2,9,9,0, +11,16,0,11,1,11,11,13,7,2,3,90,0,4,16,4,64,4,3,7,4,7,10,1,2,4,4,8,5,3,0,4, +18,0,63,51,63,51,18,23,57,1,47,94,93,237,50,50,17,51,47,93,56,51,57,47,93, +57,51,113,17,51,49,48,0,93,93,1,93,93,93,93,0,93,93,93,1,93,93,0,93,93,33, +1,7,17,35,17,51,17,1,51,9,1,4,82,253,205,184,191,191,2,167,225,253,168,2, +168,2,168,140,253,228,5,129,253,62,2,194,253,156,252,227,0,0,0,0,1,0,168, +0,0,4,47,5,129,0,5,0,56,64,40,16,4,48,4,2,0,4,16,4,32,4,64,4,96,4,128,4,160, +4,240,4,8,4,3,90,0,0,16,0,64,0,3,7,0,1,3,3,95,0,18,0,63,237,63,1,47,94,93, +237,47,93,113,49,48,51,17,51,17,33,21,168,191,2,200,5,129,251,27,156,0,0, +0,0,1,0,168,0,0,6,2,5,129,0,44,2,44,64,12,152,41,1,151,31,1,12,16,18,24,72, +12,184,255,240,179,13,17,72,13,184,255,240,64,27,18,24,72,40,13,1,13,16,13, +17,72,42,32,33,37,72,42,32,18,28,72,42,32,9,17,72,30,184,255,224,179,33,37, +72,30,184,255,224,179,18,28,72,30,184,255,224,64,255,9,17,72,13,12,36,36, +27,44,92,42,36,0,52,0,2,212,0,1,139,0,155,0,2,4,0,1,8,0,46,139,46,1,116,46, +1,59,46,1,203,46,1,180,46,1,11,46,1,207,171,46,1,52,46,1,32,46,1,20,46,1, +0,46,1,244,46,1,208,46,1,196,46,1,176,46,1,116,46,132,46,164,46,3,96,46,1, +84,46,1,64,46,1,52,46,1,16,46,1,4,46,1,151,240,46,1,180,46,196,46,228,46, +3,160,46,1,116,46,148,46,2,80,46,1,68,46,1,48,46,1,4,46,36,46,2,244,46,1, +224,46,1,180,46,212,46,2,144,46,1,132,46,1,112,46,1,52,46,68,46,100,46,3, +32,46,1,20,46,1,244,46,1,208,46,1,116,46,132,46,164,46,196,46,4,96,46,1,52, +46,84,46,2,16,46,1,4,46,1,103,116,46,148,46,180,46,196,46,228,46,5,80,46, +1,4,46,36,46,68,46,3,20,46,52,46,68,46,100,46,132,46,180,46,212,46,244,46, +8,164,46,196,46,244,46,3,139,46,1,4,46,52,46,84,46,116,46,4,55,64,83,228, +46,1,203,46,1,36,46,68,46,116,46,148,46,180,46,5,11,46,1,212,46,244,46,2, +187,46,1,100,46,132,46,2,75,46,1,20,46,52,46,2,251,46,1,164,46,196,46,228, +46,3,128,46,1,2,64,46,80,46,112,46,3,63,46,1,0,46,32,46,2,30,27,92,0,28,64, +28,2,7,28,6,21,21,184,255,192,64,16,18,37,72,42,21,29,3,75,36,1,0,13,36,3, +28,18,0,63,23,51,93,63,51,51,43,17,51,1,47,94,93,237,50,93,93,93,95,93,93, +93,113,113,113,113,113,114,114,114,114,94,93,93,93,113,114,114,114,94,93, +93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114, +114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,94,93, +93,93,113,113,113,16,220,94,93,93,93,113,50,237,18,57,61,47,51,51,49,48,43, +43,43,43,43,43,43,93,43,43,43,93,93,33,17,52,54,55,54,55,6,7,14,1,7,1,35, +1,46,3,39,38,39,22,23,30,1,21,17,35,17,51,1,30,3,23,62,3,55,1,51,17,5,86, +2,2,2,3,14,15,13,31,15,254,148,134,254,143,6,13,15,15,7,17,16,1,2,2,2,170, +251,1,119,7,20,18,15,3,3,16,21,20,8,1,112,245,3,172,51,106,44,51,48,51,50, +43,97,39,252,64,3,192,15,40,45,47,23,53,57,56,55,47,103,39,252,84,5,129,252, +47,20,63,66,59,16,16,60,66,62,20,3,209,250,127,0,0,0,0,1,0,168,0,0,5,32,5, +129,0,19,0,196,185,0,10,255,224,64,39,12,43,72,54,10,70,10,2,0,32,12,43,72, +41,0,57,0,73,0,3,11,16,29,33,72,11,32,18,28,72,150,11,166,11,2,41,11,1,1, +184,255,240,179,29,33,72,1,184,255,224,64,53,18,28,72,154,1,170,1,2,3,38, +1,1,19,92,0,68,16,84,16,148,16,3,224,16,1,2,0,16,48,16,64,16,112,16,192,16, +208,16,6,16,64,21,1,64,21,192,21,208,21,224,21,4,21,184,255,192,64,16,14, +17,72,10,7,92,0,8,16,8,64,8,3,7,8,1,184,255,192,64,16,29,43,72,17,1,9,3,11, +64,29,43,72,11,0,8,18,0,63,51,51,43,63,51,51,43,1,47,94,93,237,50,43,93,113, +47,93,95,93,113,51,237,49,48,0,93,95,93,43,43,93,93,43,43,1,93,43,93,43,33, +1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,4,58,253,14,2,3,2,3, +170,222,2,250,3,3,2,4,172,4,176,49,48,41,91,35,252,88,5,129,251,72,49,49, +42,99,45,3,156,250,127,0,0,0,0,2,0,97,255,236,5,215,5,150,0,19,0,39,0,108, +64,74,91,37,1,26,37,1,9,37,1,82,33,1,21,33,1,7,33,1,84,27,1,21,27,1,91,23, +1,25,23,1,102,17,1,104,12,1,0,91,64,15,20,1,20,41,128,32,41,128,41,2,30,91, +175,10,191,10,2,32,10,1,15,10,31,10,2,10,25,95,15,4,35,95,5,19,0,63,237,63, +237,1,47,93,93,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93,93, +93,93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,215,95,180,254,252,165,174,254,250, +174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63,65, +127,189,123,132,191,123,59,2,199,165,254,242,192,104,109,195,1,12,159,165, +1,10,187,101,102,188,254,246,163,127,208,148,80,80,148,208,127,127,211,153, +85,86,153,212,0,2,0,168,0,0,4,234,5,129,0,14,0,23,0,117,64,83,169,2,1,147, +23,1,155,16,171,16,2,10,3,26,3,42,3,3,5,12,21,12,37,12,3,0,90,64,15,25,128, +64,25,1,64,25,1,20,7,90,0,8,16,8,64,8,3,8,6,95,31,20,47,20,79,20,95,20,127, +20,5,15,20,207,20,255,20,3,7,20,64,9,17,72,20,20,7,19,95,9,3,7,18,0,63,63, +237,18,57,47,43,94,93,113,237,1,47,93,237,50,93,113,26,16,220,26,237,49,48, +0,93,93,93,93,93,1,20,14,2,35,33,17,35,17,33,50,30,2,7,52,38,35,33,17,33, +50,54,4,234,61,121,182,121,254,98,191,2,81,125,186,124,62,192,164,164,254, +133,1,131,165,155,3,217,92,159,117,68,253,219,5,129,61,111,157,97,134,139, +253,212,146,0,0,0,2,0,97,254,125,5,215,5,150,0,36,0,56,0,162,64,113,108,20, +124,20,140,20,3,104,24,1,104,29,1,101,34,1,87,6,1,85,49,1,90,39,1,90,45,1, +108,19,124,19,140,19,3,26,19,90,19,2,26,40,90,40,2,21,44,85,44,2,26,54,90, +54,2,8,54,1,21,50,85,50,2,7,50,1,13,13,22,5,27,0,91,64,15,37,1,37,58,128, +47,91,175,27,191,27,2,32,27,1,15,27,31,27,2,27,32,58,128,58,2,42,95,32,4, +52,95,5,22,19,10,95,17,0,47,237,63,51,237,63,237,1,93,47,93,93,93,237,26, +16,220,113,26,237,17,57,57,50,47,49,48,93,93,93,93,93,93,0,93,93,93,93,93, +1,93,93,93,0,93,93,1,20,14,2,7,30,3,51,50,54,55,21,14,1,35,34,46,2,39,46, +2,2,53,52,18,54,36,51,50,4,22,18,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62, +2,5,215,77,145,211,134,21,53,68,83,51,28,64,23,38,91,49,86,128,97,70,27,158, +239,159,80,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63, +65,127,189,123,132,191,123,59,2,199,149,247,186,117,18,64,90,57,27,8,5,134, +9,13,51,95,138,87,8,115,193,1,3,152,165,1,10,187,101,102,188,254,246,163, +127,208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,0,0,2,0,168,0,0, +5,104,5,129,0,17,0,30,0,210,64,62,169,13,1,138,20,154,20,170,20,3,148,29, +1,117,29,133,29,2,174,0,1,157,0,1,124,0,140,0,2,74,0,90,0,106,0,3,3,160,1, +1,114,1,130,1,146,1,3,2,99,1,1,64,1,1,51,1,1,37,1,1,3,16,184,255,112,64,87, +17,73,112,16,128,16,144,16,3,84,16,100,16,2,66,16,1,2,35,16,51,16,2,1,16, +16,25,18,90,11,11,0,0,17,48,17,64,17,96,17,144,17,160,17,6,17,64,32,144,32, +160,32,3,25,3,90,0,4,16,4,64,4,3,7,4,16,2,95,47,25,95,25,111,25,143,25,4, +25,25,0,24,95,5,3,4,0,18,0,63,50,63,237,18,57,47,93,237,50,1,47,94,93,237, +50,93,47,93,51,57,47,237,18,57,17,51,49,48,93,95,93,93,93,43,95,93,93,93, +93,95,93,93,95,93,93,93,93,0,93,93,93,93,33,1,33,17,35,17,33,50,30,2,21,20, +14,2,7,1,3,52,46,2,35,33,17,33,50,62,2,4,140,254,146,254,73,191,2,151,120, +185,126,66,39,84,130,91,1,144,248,44,84,120,76,254,59,1,205,82,120,77,37, +2,73,253,183,5,129,55,104,150,94,67,130,108,78,16,253,161,3,236,64,94,63, +31,253,248,41,72,98,0,0,0,0,1,0,93,255,236,4,248,5,150,0,63,0,226,64,110, +150,62,1,68,62,1,166,59,1,134,54,1,132,49,1,151,40,1,169,33,1,11,33,27,33, +43,33,155,33,4,89,29,169,29,2,139,17,1,139,7,1,150,2,1,4,2,20,2,2,132,58, +1,96,54,1,105,21,1,118,17,1,42,90,41,41,0,90,64,176,19,1,19,65,128,9,90,8, +64,16,19,72,8,8,52,90,0,31,16,31,64,31,3,7,31,19,16,19,22,72,120,19,136,19, +152,19,3,59,19,1,52,184,255,240,64,47,19,22,72,119,52,135,52,151,52,3,58, +52,1,19,52,5,47,95,111,42,1,89,42,1,75,42,1,6,42,1,42,36,4,14,95,96,9,1,82, +9,1,68,9,1,9,5,19,0,63,51,93,93,93,237,63,51,93,93,93,93,237,18,57,57,93, +93,43,93,93,43,1,47,94,93,237,51,47,43,237,26,16,220,93,26,237,50,47,237, +49,48,0,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,20,14,2,35, +32,36,39,55,30,3,51,50,62,2,53,52,46,2,39,46,5,53,52,62,2,51,50,30,2,23,7, +46,3,35,34,14,2,21,20,30,2,23,30,5,4,248,69,144,219,150,254,249,254,218,40, +185,14,58,99,146,102,85,142,102,57,63,114,158,96,59,119,109,96,70,40,81,144, +196,114,131,186,128,77,23,188,14,53,86,123,83,98,133,81,35,63,108,142,80, +65,129,118,103,76,43,1,133,89,150,109,61,184,174,37,55,90,65,36,29,60,95, +66,69,86,56,38,22,13,31,43,58,81,107,70,100,143,92,42,41,82,121,80,33,51, +80,54,28,35,60,81,47,63,81,54,36,18,15,31,43,58,84,114,0,0,0,1,0,46,0,0,4, +180,5,129,0,7,1,212,64,255,9,9,1,201,9,217,9,249,9,3,187,9,1,73,9,89,9,121, +9,137,9,4,59,9,1,9,9,25,9,2,246,9,1,153,9,201,9,2,139,9,1,9,9,25,9,73,9,105, +9,4,199,217,9,233,9,2,203,9,1,182,9,1,41,9,89,9,105,9,137,9,153,9,5,27,9, +1,6,9,1,25,9,41,9,89,9,121,9,153,9,169,9,217,9,7,233,9,249,9,2,219,9,1,169, +9,1,150,9,1,57,9,105,9,2,45,9,1,1,11,9,1,151,107,9,123,9,139,9,171,9,187, +9,235,9,251,9,7,84,9,1,11,9,43,9,59,9,3,187,9,251,9,2,164,9,1,59,9,75,9,123, +9,3,36,9,1,139,9,155,9,187,9,203,9,251,9,5,127,9,1,2,79,9,95,9,2,48,9,1,15, +9,1,103,207,9,223,9,2,176,9,1,15,9,79,9,95,9,143,9,4,240,9,1,159,9,175,9, +207,9,223,9,4,112,9,1,95,9,1,64,9,1,31,9,1,31,9,63,9,95,9,111,9,159,9,223, +9,239,9,7,0,9,1,55,239,9,1,128,64,93,9,144,9,208,9,3,111,9,1,80,9,1,47,9, +1,0,9,1,208,9,1,175,9,1,144,9,1,111,9,127,9,2,16,9,32,9,64,9,80,9,4,255,9, +1,224,9,1,191,9,1,64,9,96,9,144,9,160,9,4,63,9,1,32,9,1,15,9,1,7,3,5,4,14, +1,90,2,64,2,7,14,112,7,160,7,176,7,3,32,7,128,7,2,7,184,255,192,64,15,23, +28,72,7,32,2,1,2,0,4,95,5,3,1,18,0,63,63,237,50,1,47,93,204,43,93,113,43, +1,26,24,16,77,253,228,50,95,94,93,93,93,93,93,93,93,113,113,113,113,113,114, +114,114,114,114,114,94,93,93,113,113,113,113,113,113,114,114,114,94,93,93, +93,95,93,93,113,113,113,113,114,114,114,94,93,95,93,93,93,93,93,93,113,114, +114,114,114,114,114,94,93,93,93,93,113,113,113,113,113,114,49,48,1,17,35, +17,33,53,33,21,2,208,190,254,28,4,134,4,229,251,27,4,229,156,156,0,0,0,0, +1,0,158,255,236,5,41,5,129,0,25,0,136,64,61,89,23,105,23,2,89,3,105,3,2,89, +2,105,2,2,69,16,1,69,10,1,21,90,64,64,18,80,18,160,18,3,48,18,144,18,240, +18,3,143,18,159,18,175,18,3,18,27,128,64,27,1,64,27,192,27,208,27,224,27, +4,27,184,255,192,64,36,14,17,72,8,90,79,5,95,5,111,5,3,143,5,159,5,2,207, +5,1,0,5,16,5,64,5,3,7,5,19,6,3,13,95,0,19,0,63,237,63,51,1,47,94,93,93,113, +114,237,43,93,113,26,16,220,93,113,114,26,237,49,48,0,93,93,93,93,93,5,34, +46,2,53,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,14,2,2,219,116,208,157, +92,191,57,102,139,83,82,146,110,63,190,93,160,215,20,62,131,201,138,3,129, +252,143,107,149,94,43,44,96,155,111,3,100,252,145,141,207,136,66,0,1,0,9, +0,0,5,77,5,129,0,16,0,235,64,181,74,14,90,14,106,14,3,69,4,85,4,101,4,3,140, +15,1,58,15,90,15,106,15,122,15,4,131,3,1,53,3,85,3,101,3,117,3,4,116,0,132, +0,2,9,0,1,140,1,1,123,1,1,6,1,1,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0, +37,0,53,0,3,6,0,1,230,0,246,0,2,1,0,9,9,2,26,15,42,15,58,15,3,3,8,15,1,232, +15,248,15,2,15,52,16,84,16,2,32,16,1,2,16,16,1,48,16,96,16,144,16,192,16, +240,16,5,16,21,3,37,3,53,3,3,6,3,1,230,3,246,3,2,3,175,2,191,2,2,2,32,18, +80,18,2,48,18,96,18,144,18,192,18,240,18,5,47,18,1,15,2,3,121,9,1,9,1,18, +0,63,51,93,63,51,1,93,93,113,47,93,51,93,113,113,47,93,113,95,113,113,51, +93,113,95,113,18,57,61,47,51,51,93,113,113,93,113,113,49,48,93,93,93,93,93, +93,93,93,93,93,93,33,35,1,51,1,30,1,23,22,23,54,55,62,1,55,1,51,3,14,198, +253,193,201,1,134,15,30,12,14,13,12,14,12,29,17,1,132,201,5,129,252,32,45, +89,35,41,39,37,41,35,88,48,3,224,0,0,1,0,9,0,0,7,134,5,129,0,46,4,87,64,73, +121,44,1,117,17,1,123,2,139,2,2,73,2,1,116,12,132,12,2,70,12,1,122,30,138, +30,2,73,30,89,30,105,30,3,117,31,133,31,2,71,31,87,31,103,31,3,142,45,1,91, +45,107,45,123,45,3,129,16,1,100,16,116,16,2,85,16,1,1,32,13,17,72,13,184, +255,224,64,255,13,17,72,131,0,1,117,0,1,68,0,84,0,100,0,3,54,0,1,140,14,1, +122,14,1,75,14,91,14,107,14,3,14,16,9,12,72,26,14,42,14,58,14,3,9,14,1,233, +14,249,14,2,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,14,13,22,26,30,42, +30,58,30,3,9,30,1,233,30,249,30,2,21,31,37,31,53,31,3,6,31,1,230,31,246,31, +2,31,30,7,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0,37,0,53,0,3,6,0,1,230, +0,246,0,2,1,0,39,123,39,1,116,22,132,22,2,22,7,39,39,7,22,3,15,26,45,42,45, +58,45,3,3,8,45,1,232,45,248,45,2,45,219,46,1,207,46,1,187,46,1,175,46,1,155, +46,1,143,46,1,123,46,1,111,46,1,91,46,1,79,46,1,2,79,46,143,46,175,46,3,46, +64,25,28,72,32,46,48,46,2,15,46,1,9,46,5,16,1,229,16,245,16,2,182,16,198, +16,214,16,3,3,16,8,15,56,15,120,15,136,15,152,15,184,15,6,12,15,64,64,255, +25,38,72,15,119,48,151,48,215,48,3,54,48,70,48,86,48,3,23,48,39,48,2,6,48, +1,55,48,103,48,119,48,167,48,183,48,199,48,231,48,247,48,8,38,48,1,7,48,23, +48,2,201,199,48,215,48,231,48,3,120,48,152,48,168,48,184,48,4,105,48,1,40, +48,56,48,88,48,3,25,48,1,7,48,1,232,48,1,217,48,1,168,48,200,48,2,153,48, +1,138,48,1,88,48,104,48,2,73,48,1,55,48,1,8,48,24,48,2,231,48,1,200,48,1, +167,48,1,8,48,24,48,40,48,72,48,136,48,5,153,199,48,1,88,48,104,48,136,48, +152,48,168,48,5,73,48,1,40,48,1,9,48,25,48,2,216,48,232,48,2,203,48,1,154, +48,170,48,186,48,3,139,48,1,48,192,124,127,72,57,48,1,42,48,1,25,48,1,10, +48,1,249,48,1,234,48,1,217,48,1,202,48,1,184,48,1,137,48,153,48,169,48,3, +120,48,1,105,48,1,58,48,74,48,90,48,3,41,48,1,26,48,1,12,48,1,104,253,48, +1,236,48,1,221,48,1,204,48,1,64,255,189,48,1,171,48,1,156,48,1,139,48,1,124, +48,1,107,48,1,92,48,1,75,48,1,60,48,1,43,48,1,28,48,1,11,48,1,252,48,1,235, +48,1,220,48,1,203,48,1,188,48,1,171,48,1,156,48,1,0,141,48,1,127,48,1,109, +48,1,95,48,1,77,48,1,47,48,63,48,2,29,48,1,15,48,1,253,48,1,239,48,1,221, +48,1,207,48,1,189,48,1,175,48,1,157,48,1,143,48,1,109,48,125,48,2,91,48,1, +77,48,1,59,48,1,45,48,1,27,48,1,13,48,1,56,251,48,1,237,48,1,219,48,1,205, +48,1,187,48,1,173,48,1,155,48,1,141,48,1,123,48,1,109,48,1,75,48,91,48,2, +57,48,1,43,48,1,25,48,1,11,48,1,249,48,1,235,48,1,221,48,1,203,48,1,189,48, +1,171,48,1,157,48,1,139,48,1,125,48,1,107,48,1,93,48,1,75,48,1,61,48,1,1, +43,48,1,31,48,1,2,95,48,127,48,159,48,191,48,223,48,255,48,6,0,48,1,8,68, +7,84,7,2,7,30,45,3,15,3,39,64,15,22,123,22,139,22,2,22,32,9,14,72,22,1,14, +18,0,63,51,51,43,93,17,51,63,23,51,93,1,94,93,93,95,113,113,95,113,113,113, +113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114, +114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,113, +113,113,113,113,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114, +114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93, +93,93,93,93,113,113,113,113,43,113,113,113,113,114,114,114,114,114,94,93, +93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93, +93,93,113,113,113,113,47,43,94,93,51,95,93,93,113,47,94,93,93,43,93,95,113, +113,113,113,113,113,113,113,113,113,51,93,113,95,113,18,23,57,61,47,47,47, +93,93,17,51,51,93,113,113,93,113,113,17,51,51,93,113,113,93,113,113,17,51, +51,93,113,113,93,113,113,49,48,43,93,93,93,93,93,93,93,43,43,93,93,93,93, +93,93,93,93,93,93,93,93,93,93,93,33,35,3,46,1,39,38,39,6,7,14,1,7,3,35,1, +51,19,30,1,23,22,23,54,55,62,3,55,19,51,19,30,3,23,22,23,50,62,2,55,19,51, +5,231,228,244,11,25,10,12,12,13,12,11,24,11,246,228,254,97,199,253,17,31, +11,13,11,15,16,7,14,15,15,6,245,183,245,6,15,15,14,7,16,15,1,16,24,29,15, +249,199,3,127,38,104,47,55,57,58,55,48,102,38,252,129,5,129,252,129,63,124, +49,58,52,69,67,28,62,60,55,23,3,109,252,147,23,55,59,62,28,67,70,69,104,121, +52,3,127,0,0,1,0,46,0,0,5,43,5,129,0,11,2,119,64,255,92,4,1,73,4,1,59,4,1, +38,11,1,75,0,91,0,2,41,0,57,0,2,68,2,84,2,2,38,2,54,2,2,9,3,25,3,41,3,3,81, +10,1,69,10,1,51,10,1,6,10,22,10,2,93,8,1,76,8,1,43,8,59,8,2,9,8,25,8,2,82, +6,1,67,6,1,3,38,6,54,6,2,7,6,23,6,2,12,219,13,1,196,13,1,171,13,1,144,13, +1,132,13,1,96,13,1,84,13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13, +1,160,13,1,148,13,1,112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,204, +224,13,1,212,13,1,176,13,1,164,13,1,128,13,1,116,13,1,80,13,1,68,13,1,32, +13,1,20,13,1,36,13,84,13,132,13,180,13,228,13,5,4,13,52,13,100,13,148,13, +196,13,244,13,6,156,52,13,100,13,148,13,196,13,244,13,5,11,13,1,27,13,75, +13,123,13,171,13,219,13,5,139,13,187,13,235,13,3,4,13,20,13,52,13,68,13,4, +106,84,13,100,13,132,13,148,64,156,13,180,13,196,13,228,13,244,13,8,59,13, +1,36,13,1,11,13,1,244,13,1,219,13,1,196,13,1,171,13,1,148,13,1,123,13,1,100, +13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13,1,160,13,1,148,13,1, +112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,57,224,13,1,212,13,1,176, +13,1,164,13,1,128,13,1,20,13,68,13,116,13,3,36,13,84,13,132,13,180,13,228, +13,5,84,13,100,13,148,13,244,13,4,64,13,1,2,0,13,48,13,2,6,8,10,7,1,4,4,9, +5,9,5,9,3,0,11,16,192,11,240,11,2,11,184,255,192,64,16,26,30,72,175,11,1, +144,11,1,127,11,1,0,11,1,11,184,255,192,181,11,15,72,11,2,3,184,255,240,64, +41,16,3,32,3,2,224,3,240,3,2,31,3,175,3,191,3,207,3,4,3,114,7,1,52,7,68,7, +84,7,3,4,7,10,1,4,8,5,3,3,0,18,0,63,50,63,51,23,57,93,93,1,47,93,93,113,56, +51,47,43,93,93,93,93,43,93,56,51,18,57,57,47,47,18,23,57,50,51,93,95,93,93, +113,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113, +113,113,113,113,113,113,113,114,114,114,114,94,93,93,113,114,114,94,93,113, +114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93, +93,113,113,113,113,113,113,113,113,113,113,49,48,94,93,93,95,93,93,93,93, +93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,9,1,35,9,1,51,9,1,51,9,1, +4,88,254,89,254,80,211,2,24,254,17,211,1,136,1,125,211,254,30,2,11,2,104, +253,152,2,220,2,165,253,215,2,41,253,98,253,29,0,0,0,1,0,45,0,0,5,41,5,129, +0,8,2,83,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5,1,3,5,1,16,3,5,184,255,232, +64,255,12,15,72,5,4,14,2,1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8, +6,1,90,38,2,86,2,150,2,3,118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,10,169, +10,201,10,3,86,10,1,9,10,57,10,2,25,10,89,10,137,10,249,10,4,6,10,1,202,249, +10,1,230,10,1,9,10,25,10,185,10,201,10,4,198,10,1,89,10,121,10,169,10,3,54, +10,1,41,10,57,10,185,10,233,10,4,11,10,1,153,249,10,1,198,10,214,10,2,178, +10,1,164,10,1,150,10,1,130,10,1,116,10,1,86,10,102,10,2,66,10,1,36,10,52, +10,2,18,10,1,4,10,1,244,10,1,230,10,1,196,10,212,10,2,166,10,182,10,2,146, +10,1,132,10,1,118,10,1,98,10,1,84,10,1,54,10,70,10,2,36,10,1,22,10,1,4,10, +1,242,10,1,1,208,10,224,10,2,196,10,1,160,10,176,10,2,148,10,1,112,10,1,100, +10,1,64,10,1,20,10,36,10,52,10,3,0,10,1,105,228,10,244,10,2,208,10,64,182, +1,164,10,180,10,196,10,3,128,10,144,10,2,116,10,1,80,10,96,10,2,68,10,1,32, +10,1,4,10,20,10,2,244,10,1,224,10,1,196,10,212,10,2,176,10,1,84,10,100,10, +116,10,148,10,164,10,5,48,10,64,10,2,36,10,1,0,10,1,196,10,244,10,2,144,10, +1,4,10,20,10,36,10,68,10,84,10,116,10,132,10,7,57,224,10,1,132,10,164,10, +212,10,3,112,10,1,4,10,36,10,52,10,84,10,100,10,5,228,10,244,10,2,192,10, +1,180,10,1,144,10,1,4,10,20,10,52,10,84,10,132,10,5,212,10,228,10,2,187,10, +1,164,10,1,112,10,1,2,48,10,96,10,2,15,10,47,10,2,0,3,59,3,75,3,123,3,3,3, +1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,1,93,93,95,93,93,93,93,113,113,113, +113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113,113,114,114, +114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,95,93,113,113,113, +113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114, +114,114,114,94,93,93,113,113,113,114,114,114,94,93,93,113,113,113,47,94,93, +93,93,113,253,57,206,94,93,93,50,43,1,24,16,77,230,50,49,48,43,95,94,93,93, +43,93,93,1,17,35,17,1,51,9,1,51,3,9,190,253,226,210,1,173,1,171,210,2,72, +253,184,2,72,3,57,253,97,2,159,0,0,0,0,1,0,65,0,0,4,163,5,129,0,9,0,122,64, +35,100,4,116,4,132,4,3,109,3,125,3,141,3,3,91,3,1,41,3,57,3,73,3,3,114,8, +130,8,2,84,8,100,8,2,8,184,255,240,64,9,10,13,72,9,3,16,7,1,7,184,255,192, +64,18,12,17,72,7,8,4,15,2,31,2,2,2,64,12,15,72,2,11,184,255,192,64,14,13, +17,72,7,3,4,95,5,3,2,8,95,1,18,0,63,237,50,63,237,50,50,1,43,47,43,93,51, +51,47,43,93,51,51,49,48,43,93,93,93,93,93,93,41,1,53,1,33,53,33,21,1,33,4, +163,251,158,3,90,252,239,3,234,252,166,3,137,143,4,86,156,139,251,166,0,0, +1,0,146,254,87,2,41,5,204,0,7,0,49,64,30,7,48,2,1,224,2,1,2,4,241,63,1,1, +143,1,191,1,2,32,1,1,1,4,245,1,0,5,245,0,27,0,63,237,63,237,1,47,93,93,113, +237,205,93,113,50,49,48,19,17,33,21,35,17,51,21,146,1,151,233,233,254,87, +7,117,129,249,141,129,0,1,0,0,255,236,2,57,5,204,0,3,0,71,64,40,120,1,136, +1,2,0,24,13,17,72,9,3,25,3,73,3,3,70,2,1,10,2,26,2,42,2,3,3,16,0,3,16,3,32, +3,128,3,4,3,1,184,255,240,183,143,1,1,1,1,0,0,19,0,63,63,1,47,93,56,205,93, +56,49,48,93,93,93,43,93,5,1,51,1,1,151,254,105,158,1,155,20,5,224,250,32, +0,0,0,0,1,0,16,254,87,1,167,5,204,0,7,0,49,64,31,4,63,0,1,239,0,1,0,7,241, +64,2,80,2,2,192,2,208,2,224,2,3,2,4,245,5,0,1,245,0,27,0,63,237,63,237,1, +47,93,113,253,205,93,113,50,49,48,19,53,51,17,35,53,33,17,16,233,233,1,151, +254,87,129,6,115,129,248,139,0,1,0,10,2,161,3,183,5,129,0,6,2,243,181,0,24, +18,22,72,2,184,255,232,179,18,22,72,5,184,255,232,64,47,18,22,72,118,5,134, +5,2,4,24,18,22,72,121,4,137,4,2,3,54,6,70,6,2,102,6,118,6,134,6,230,6,4,6, +6,22,6,38,6,70,6,86,6,102,6,6,6,184,255,192,179,48,65,72,6,184,255,192,64, +57,18,22,72,6,5,4,57,3,73,3,2,105,3,121,3,137,3,3,9,3,25,3,41,3,89,3,105, +3,5,9,3,64,18,22,72,3,6,1,22,1,134,1,3,57,38,1,54,1,70,1,246,1,4,230,1,1, +1,184,255,192,182,60,63,72,153,1,1,1,184,255,224,64,255,30,33,72,56,1,72, +1,2,39,1,1,22,1,1,183,1,199,1,2,6,1,70,1,86,1,102,1,150,1,166,1,6,9,1,6,8, +1,246,8,1,164,8,1,121,8,1,6,8,1,246,8,1,201,8,217,8,2,187,8,1,9,8,25,8,41, +8,169,8,4,201,201,8,217,8,2,54,8,118,8,134,8,150,8,4,153,8,233,8,2,102,8, +118,8,2,9,8,25,8,57,8,3,198,8,1,139,8,1,57,8,73,8,121,8,3,43,8,1,4,8,1,152, +228,8,244,8,2,208,8,1,162,8,178,8,194,8,3,132,8,148,8,2,82,8,98,8,114,8,3, +64,8,1,50,8,1,36,8,1,2,8,18,8,2,228,8,244,8,2,214,8,1,196,8,1,146,8,162,8, +178,8,3,116,8,132,8,2,102,8,1,50,8,66,8,82,8,3,20,8,36,8,2,6,8,1,242,8,1, +212,8,228,8,2,166,8,182,8,2,130,8,146,8,2,100,8,116,8,2,86,8,1,52,8,68,8, +2,32,8,1,4,8,20,8,2,104,230,8,246,8,2,192,8,1,146,8,162,8,64,24,178,8,3,116, +8,132,8,2,82,8,98,8,2,52,8,68,8,2,22,8,38,8,2,8,184,255,128,64,24,85,88,72, +182,8,198,8,2,132,8,148,8,164,8,3,102,8,118,8,2,68,8,1,8,184,255,192,182, +72,75,72,228,8,1,8,184,255,192,64,12,66,69,72,148,8,1,114,8,130,8,2,8,184, +255,128,64,120,59,62,72,18,8,34,8,2,1,0,8,1,56,240,8,1,212,8,228,8,2,176, +8,1,100,8,132,8,148,8,164,8,4,64,8,80,8,2,36,8,52,8,2,228,8,244,8,2,171,8, +187,8,2,116,8,132,8,148,8,3,75,8,1,52,8,1,11,8,1,235,8,251,8,2,208,8,1,196, +8,1,176,8,1,132,8,148,8,164,8,3,96,8,112,8,2,2,0,8,16,8,64,8,80,8,4,8,34, +1,1,3,1,19,1,2,1,4,3,3,3,0,0,47,50,47,63,51,93,93,1,94,93,95,93,93,93,93, +93,93,113,113,113,113,113,113,114,114,114,114,114,114,94,93,95,93,43,93,93, +43,93,43,113,113,113,113,43,114,114,114,114,114,114,114,94,93,93,93,93,93, +93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114, +114,114,94,93,93,93,93,93,113,113,113,114,114,94,93,93,93,93,113,113,113, +113,114,25,47,94,93,93,113,113,113,43,113,43,113,114,94,93,205,43,94,93,113, +114,51,51,205,43,43,93,113,114,49,48,95,93,43,93,43,43,43,9,2,35,1,51,1,3, +19,254,203,254,206,162,1,112,203,1,114,2,161,2,121,253,135,2,224,253,32,0, +0,0,0,1,255,225,254,105,4,138,254,235,0,3,0,35,64,23,16,2,96,2,128,2,160, +2,208,2,5,96,2,128,2,240,2,3,2,0,0,186,1,0,47,237,1,47,47,93,113,49,48,3, +53,33,21,31,4,169,254,105,130,130,0,1,0,106,4,177,2,18,5,228,0,5,0,47,64, +31,117,3,133,3,2,64,4,128,4,2,4,64,16,1,1,1,2,149,128,15,0,47,0,63,0,127, +0,239,0,5,0,0,47,93,26,237,1,47,93,26,205,93,49,48,93,9,1,53,51,19,21,1,180, +254,182,207,217,4,177,1,22,29,254,225,20,0,0,0,0,2,0,87,255,236,4,115,4,78, +0,50,0,65,0,161,64,50,121,61,137,61,2,121,12,137,12,2,2,40,9,13,72,10,5,26, +5,2,43,24,9,17,72,5,28,21,28,2,37,37,30,70,64,46,9,111,56,127,56,143,56,3, +56,67,128,20,71,21,184,255,192,64,20,21,28,72,21,21,63,71,31,3,1,3,48,67, +192,67,2,160,67,1,67,184,255,192,64,32,30,35,72,33,81,40,22,57,81,9,9,26, +51,95,20,1,47,20,143,20,2,20,20,15,80,26,16,46,51,80,0,22,0,63,237,50,63, +237,51,47,93,113,17,18,57,47,237,63,237,1,43,93,113,47,93,237,51,47,43,237, +26,16,220,93,50,50,26,237,50,47,49,48,93,43,93,43,0,93,93,5,34,38,53,52,62, +2,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,21,17,20,22,51,50,54,55,21, +14,1,35,34,46,2,39,35,14,3,39,50,62,2,61,1,7,14,3,21,20,22,1,158,163,164, +81,131,168,87,243,28,58,87,59,52,84,62,38,6,188,10,56,103,155,110,204,206, +42,59,15,30,14,34,67,38,51,73,46,24,3,6,29,69,92,117,35,86,129,85,42,197, +66,119,90,53,95,20,172,150,107,137,78,30,2,4,59,67,94,58,27,15,39,67,51,17, +64,107,78,43,187,177,254,46,80,81,4,3,112,8,8,27,55,81,54,52,84,59,32,135, +63,98,116,53,89,4,1,17,50,90,73,88,96,0,0,2,0,132,255,236,4,29,5,204,0,31, +0,51,0,146,64,9,105,49,121,49,2,121,35,1,31,184,255,224,64,24,7,10,72,134, +30,150,30,2,73,27,89,27,2,73,4,89,4,2,134,1,150,1,2,1,184,255,224,64,63,7, +10,72,0,71,64,160,32,1,32,53,128,42,5,19,70,0,18,16,18,48,18,240,18,4,8,18, +176,53,1,63,53,1,112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,37,80, +29,16,18,0,12,21,5,47,80,2,22,0,63,237,50,63,63,63,237,50,1,93,93,113,113, +114,114,47,94,93,237,50,50,26,16,220,93,26,237,49,48,43,93,93,93,93,43,93, +93,1,16,33,34,38,39,35,20,14,2,7,35,62,3,53,17,51,17,20,6,7,6,7,51,62,1,51, +50,18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,29,254,114,123,163,51, +2,3,3,3,1,174,1,2,2,1,180,1,1,1,1,4,50,165,122,205,193,189,28,62,96,69,71, +109,73,38,38,73,108,70,66,96,64,31,2,34,253,202,89,99,26,56,48,34,4,9,43, +60,72,39,4,237,254,89,30,55,21,25,22,104,90,254,236,254,226,112,160,103,48, +46,102,166,120,116,158,99,43,46,102,163,0,0,0,1,0,87,255,236,3,202,4,78,0, +39,0,117,64,81,121,16,1,121,23,1,99,37,1,99,3,1,32,70,31,31,8,70,160,9,1, +9,9,41,0,71,31,19,1,19,35,80,26,31,32,127,32,143,32,223,32,4,32,32,26,16, +32,8,112,8,128,8,208,8,224,8,5,0,8,16,8,96,8,112,8,128,8,192,8,208,8,7,8, +8,5,80,14,22,31,41,1,93,0,63,237,51,47,93,113,63,51,47,93,16,237,1,47,93, +237,17,51,125,47,113,24,237,51,47,237,49,48,93,93,93,93,1,20,30,2,51,50,54, +55,23,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,7,46,1,35,34,14,2,1,19,27, +64,105,77,96,129,15,182,9,60,103,148,97,127,178,111,50,36,65,88,103,114,58, +91,142,103,64,13,185,14,114,105,77,103,64,27,2,34,93,156,113,62,104,108,12, +67,124,94,57,86,151,205,120,109,167,125,85,51,23,50,87,118,68,14,90,106,51, +103,156,0,0,0,0,2,0,86,255,236,3,239,5,204,0,31,0,51,0,123,64,87,85,34,101, +34,2,90,50,106,50,2,57,1,73,1,2,54,10,70,10,2,9,4,25,4,121,4,137,4,4,6,7, +22,7,118,7,134,7,4,19,70,64,42,0,143,18,239,18,2,18,53,128,32,71,31,6,1,6, +112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,21,18,0,11,47,80,8,16, +0,37,80,3,22,0,63,237,50,63,237,50,63,63,1,93,93,113,113,47,93,237,26,16, +220,93,50,50,26,237,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17,16,33,50, +22,23,51,52,46,1,52,53,17,51,17,20,30,2,23,35,46,3,53,1,20,30,2,51,50,62, +2,53,52,46,2,35,34,14,2,3,53,50,165,122,205,193,1,142,123,164,50,2,1,1,180, +1,2,2,1,172,2,3,3,2,253,218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64, +31,174,104,90,1,20,1,24,2,54,90,98,10,43,47,42,9,1,163,251,19,39,72,60,43, +9,10,37,48,53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102, +163,0,0,0,2,0,87,255,236,4,24,4,78,0,28,0,37,0,107,64,46,90,35,106,35,2,90, +30,106,30,2,85,3,101,3,2,8,73,9,9,27,71,64,31,29,1,144,29,1,29,39,128,37, +0,71,31,17,1,17,48,39,192,39,208,39,3,39,184,255,192,64,19,30,35,72,8,8,5, +0,80,37,37,5,32,80,22,16,5,80,14,22,0,63,237,63,237,18,57,47,237,17,57,47, +1,43,113,47,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,0,93,93, +1,20,30,2,51,50,54,55,23,14,3,35,34,2,17,52,62,2,51,50,30,2,29,1,39,46,1, +35,34,14,2,7,1,20,35,73,114,80,117,141,25,158,17,61,102,153,108,240,251,76, +132,176,100,136,183,111,47,186,15,144,135,45,99,84,58,4,1,247,85,143,103, +57,94,72,45,45,91,73,47,1,30,1,26,152,211,132,59,88,155,210,122,24,138,171, +157,29,74,127,98,0,0,0,1,0,29,0,0,2,60,5,202,0,27,0,161,64,11,3,10,19,10, +51,10,67,10,4,13,10,184,255,224,64,106,8,12,72,26,15,16,1,14,16,25,16,1,70, +5,0,2,1,18,2,31,29,47,29,79,29,95,29,127,29,143,29,159,29,7,15,29,63,29,127, +29,175,29,191,29,223,29,239,29,7,59,95,29,191,29,2,127,29,143,29,159,29,3, +29,64,86,100,72,29,64,39,44,72,32,29,48,29,96,29,3,175,29,223,29,239,29,3, +64,29,1,15,29,47,29,2,19,80,12,0,0,3,80,25,6,15,1,21,0,63,63,51,237,50,63, +237,1,93,93,93,113,43,43,113,114,94,93,113,47,94,93,51,237,50,50,47,94,93, +51,49,48,0,43,94,93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35, +34,14,2,29,1,51,21,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51, +29,11,211,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41,60,39, +97,131,0,2,0,86,254,87,3,239,4,75,0,49,0,69,0,217,64,72,122,49,138,49,2,118, +7,134,7,2,101,62,1,85,12,101,12,2,90,58,106,58,2,38,3,54,3,2,38,18,1,41,33, +1,9,23,25,23,121,23,137,23,4,6,29,22,29,118,29,134,29,4,9,47,70,64,50,34, +48,14,1,127,14,223,14,2,14,71,128,6,70,5,184,255,192,64,81,23,28,72,5,5,60, +71,15,26,1,10,26,32,71,64,71,2,207,71,1,0,71,32,71,144,71,176,71,4,80,223, +71,1,192,71,1,79,71,1,128,71,160,71,2,15,71,47,71,2,208,71,240,71,2,15,71, +1,8,41,15,34,55,80,31,16,15,65,80,21,22,9,80,53,6,1,38,6,1,6,0,27,0,63,50, +93,93,237,63,237,50,63,237,50,63,1,94,93,93,113,113,114,114,114,94,93,93, +113,47,94,93,237,51,47,43,237,26,16,220,93,113,50,50,26,237,49,48,0,94,93, +93,93,93,93,93,93,93,93,93,1,34,46,2,39,55,30,1,51,50,62,2,61,1,35,14,3,35, +34,46,2,53,52,62,2,51,50,22,23,51,52,62,2,55,51,14,3,21,17,20,6,19,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,2,36,93,144,102,64,14,181,18,123,100,61, +100,70,38,2,20,59,85,112,72,103,147,93,43,43,97,155,111,115,169,46,2,3,3, +4,2,171,1,2,2,1,223,44,49,80,103,54,69,99,65,31,31,64,98,68,54,103,82,50, +254,87,38,71,98,60,26,75,81,34,75,120,86,174,41,75,58,35,69,138,205,135,130, +208,145,77,105,97,25,62,55,40,3,9,43,60,73,39,252,197,227,229,3,198,113,161, +102,48,48,103,161,112,117,159,98,42,46,100,158,0,0,0,0,1,0,142,0,0,3,238, +5,204,0,33,0,109,185,0,8,255,192,64,36,7,11,72,11,70,64,80,12,1,159,12,255, +12,2,12,35,128,0,35,192,35,208,35,224,35,4,192,35,1,15,35,1,128,35,1,35,184, +255,192,64,32,19,23,72,28,24,70,192,25,1,0,25,16,25,48,25,224,25,240,25,5, +8,25,26,0,25,11,21,0,18,80,5,16,0,63,237,50,63,51,63,1,47,94,93,113,237,50, +43,93,113,113,114,26,16,220,93,113,26,237,49,48,43,1,62,3,51,50,30,2,21,17, +35,17,52,46,2,35,34,14,2,21,17,35,17,51,17,20,14,2,7,1,61,30,70,84,100,62, +104,133,77,29,181,17,48,88,70,64,103,73,40,180,180,2,3,2,1,3,129,55,77,50, +23,56,101,140,84,253,47,2,174,69,104,69,35,46,84,120,75,253,130,5,204,254, +126,33,66,56,39,7,0,0,0,2,0,137,0,0,1,61,5,204,0,3,0,7,0,115,64,13,3,7,70, +0,0,4,16,4,48,4,3,8,4,184,255,192,64,42,21,24,72,4,4,8,9,255,9,1,224,9,1, +223,9,1,176,9,192,9,2,159,9,1,112,9,128,9,2,31,9,1,0,9,1,240,9,1,223,9,1, +9,184,255,192,64,17,34,37,72,79,9,1,31,9,1,5,15,4,21,0,83,1,0,0,63,237,63, +63,1,93,113,43,113,113,114,114,114,114,114,114,114,114,17,18,57,47,43,94, +93,51,237,50,49,48,19,53,51,21,3,17,51,17,137,180,180,180,5,32,172,172,250, +224,4,58,251,198,0,0,0,0,2,255,206,254,87,1,61,5,204,0,3,0,23,1,51,64,151, +7,24,12,16,72,7,40,8,11,72,3,4,70,21,12,12,0,0,21,16,21,32,21,64,21,4,7,21, +21,24,25,144,25,1,63,25,1,0,25,16,25,2,219,25,64,210,213,72,208,25,224,25, +2,143,25,1,64,25,80,25,2,15,25,31,25,95,25,111,25,255,25,5,144,25,160,25, +224,25,240,25,4,79,25,1,0,25,1,160,63,25,175,25,191,25,207,25,4,239,25,1, +176,25,192,25,208,25,3,63,25,79,25,95,25,3,32,25,1,143,25,191,25,207,25,3, +0,25,1,111,239,25,1,208,25,1,63,25,143,25,2,111,25,143,25,159,25,175,25,255, +25,5,25,184,255,192,64,84,79,82,72,223,25,1,144,25,160,25,176,25,3,47,25, +63,25,79,25,3,0,25,1,61,25,64,53,56,72,112,25,128,25,144,25,176,25,4,15,25, +31,25,2,255,25,1,25,64,35,38,72,144,25,1,79,25,1,255,25,1,112,25,128,25,192, +25,208,25,224,25,5,31,25,1,22,15,16,80,9,27,0,83,1,0,0,63,237,63,237,63,1, +93,93,93,113,113,43,113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93, +93,113,113,113,113,114,94,93,93,93,113,114,114,114,43,94,93,93,93,17,18,57, +47,94,93,51,51,47,16,237,50,49,48,0,43,43,19,53,51,21,17,20,14,2,35,34,38, +39,53,30,1,51,50,62,2,53,17,51,137,180,21,54,93,72,34,65,28,13,36,13,38,49, +28,10,180,5,32,172,172,250,90,62,106,78,45,4,5,139,2,4,20,43,67,46,4,165, +0,0,1,0,138,0,0,4,3,5,204,0,11,0,251,64,84,124,2,1,122,8,1,118,7,1,86,9,102, +9,134,9,150,9,4,139,0,155,0,2,89,0,105,0,121,0,3,116,10,132,10,148,10,3,68, +10,1,1,10,10,11,42,8,1,3,8,9,16,116,9,1,9,9,0,11,16,84,11,116,11,148,11,3, +116,11,148,11,180,11,212,11,228,11,244,11,6,48,11,1,2,11,184,255,192,64,105, +7,10,72,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,31,13,63,13,2,31,13,63,13,95, +13,255,13,4,15,13,31,13,63,13,95,13,127,13,5,57,13,64,83,86,72,96,13,128, +13,160,13,192,13,208,13,5,223,13,1,0,13,96,13,128,13,160,13,4,0,13,16,13, +48,13,64,13,128,13,160,13,192,13,224,13,240,13,9,7,2,1,7,10,4,8,15,5,0,4, +21,0,21,0,63,63,63,63,23,57,1,94,93,113,113,114,43,94,93,113,114,47,94,93, +237,50,47,43,95,93,93,113,56,51,51,47,93,56,51,95,114,17,57,17,51,49,48,93, +93,93,93,93,0,93,1,93,0,93,33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132, +180,180,1,219,211,254,73,1,206,1,238,109,254,127,5,204,252,97,2,13,254,47, +253,151,0,0,0,1,0,138,0,0,1,62,5,204,0,3,0,111,64,52,3,70,192,0,1,208,0,1, +0,0,16,0,48,0,240,0,4,8,0,224,5,240,5,2,223,5,1,176,5,192,5,2,159,5,1,112, +5,128,5,2,15,5,31,5,2,240,5,1,223,5,1,5,184,255,192,64,27,34,37,72,79,5,1, +255,5,1,112,5,128,5,192,5,208,5,224,5,5,31,5,1,1,0,0,21,0,63,63,1,93,93,93, +113,43,113,113,114,114,114,114,114,114,47,94,93,113,114,237,49,48,51,17,51, +17,138,180,5,204,250,52,0,0,1,0,136,0,0,6,35,4,78,0,59,2,194,185,0,42,255, +224,179,8,11,72,32,184,255,224,64,255,8,11,72,34,59,70,0,0,13,46,70,217,47, +249,47,2,182,47,1,41,47,89,47,137,47,3,6,47,1,166,47,182,47,214,47,230,47, +4,137,47,1,118,47,1,89,47,1,6,47,22,47,70,47,3,7,47,25,12,70,198,13,1,6,13, +22,13,54,13,230,13,246,13,5,8,13,251,61,1,201,61,217,61,233,61,3,187,61,1, +153,61,1,139,61,1,105,61,121,61,2,91,61,1,73,61,1,43,61,59,61,2,249,61,1, +235,61,1,217,61,1,203,61,1,189,61,1,153,61,1,139,61,1,105,61,1,91,61,1,41, +61,57,61,2,27,61,1,9,61,1,202,235,61,251,61,2,105,61,137,61,153,61,185,61, +201,61,5,91,61,1,77,61,1,41,61,57,61,2,27,61,1,249,61,1,235,61,1,201,61,217, +61,2,187,61,1,153,61,1,139,61,1,125,61,1,1,43,61,75,61,91,61,107,61,4,31, +61,1,4,61,1,203,61,235,61,2,175,61,191,61,2,139,61,1,127,61,1,43,61,75,61, +91,61,107,61,4,31,61,1,11,61,1,154,255,61,1,235,61,64,255,1,223,61,1,187, +61,1,175,61,1,139,61,155,61,2,127,61,1,91,61,107,61,2,79,61,1,59,61,1,36, +61,1,11,61,1,235,61,1,223,61,1,187,61,1,175,61,1,155,61,1,127,61,143,61,2, +100,61,1,75,61,1,63,61,1,43,61,1,15,61,31,61,2,235,61,1,223,61,1,123,61,139, +61,171,61,187,61,4,111,61,1,59,61,1,31,61,1,11,61,1,106,187,61,203,61,235, +61,3,175,61,1,139,61,1,127,61,1,91,61,1,79,61,1,27,61,1,251,61,1,223,61,239, +61,2,187,61,203,61,2,175,61,1,100,61,148,61,2,27,61,43,61,75,61,3,4,61,1, +244,61,1,139,61,171,61,219,61,3,127,61,1,107,61,1,52,61,1,27,61,1,15,61,1, +57,187,61,219,61,251,61,3,160,61,1,116,61,148,61,2,43,61,75,61,91,61,3,31, +61,1,11,61,1,203,61,235,61,251,61,3,164,61,1,27,61,75,61,91,61,123,61,4,244, +61,1,208,61,1,2,96,61,144,61,160,61,192,61,4,79,61,1,48,61,1,47,61,1,0,64, +19,61,1,8,34,53,80,40,16,25,6,80,31,16,19,15,47,13,0,21,0,63,50,50,63,63, +237,50,63,237,50,1,94,93,93,93,93,93,95,93,93,113,113,113,114,114,114,114, +114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114, +114,114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113, +113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93, +93,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114,114,114,94, +93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,47, +94,93,113,237,50,47,94,93,93,93,93,93,113,113,113,113,237,18,57,47,237,57, +49,48,0,43,43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21, +51,62,3,51,50,22,23,51,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21, +17,3,0,20,47,76,55,57,92,65,35,179,1,2,2,1,170,1,2,3,2,3,24,56,75,97,64,123, +143,28,3,24,60,80,100,64,82,119,76,36,178,20,47,76,55,57,92,65,35,2,174,79, +106,65,27,45,85,125,81,253,141,3,83,34,75,67,48,7,5,44,57,59,20,47,76,53, +29,98,107,47,76,53,29,44,92,145,100,253,47,2,174,79,106,65,27,43,84,126,83, +253,141,0,1,0,136,0,0,3,238,4,78,0,37,0,109,185,0,34,255,224,64,36,7,11,72, +37,70,64,80,0,1,159,0,255,0,2,0,39,128,0,39,192,39,208,39,224,39,4,192,39, +1,15,39,1,128,39,1,39,184,255,192,64,32,19,23,72,25,12,70,192,13,1,0,13,16, +13,48,13,224,13,240,13,5,8,13,25,6,80,31,16,19,15,13,0,21,0,63,50,63,63,237, +50,1,47,94,93,113,237,50,43,93,113,113,114,26,16,220,93,113,26,237,49,48, +43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51, +50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26, +62,82,106,70,90,130,84,39,2,174,79,106,65,27,45,85,125,81,253,141,3,83,34, +75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,253,47,0,0,0,0,2,0,86, +255,236,4,29,4,78,0,14,0,34,0,116,64,59,121,32,137,32,2,116,28,132,28,2,118, +22,134,22,2,121,18,137,18,2,150,12,166,12,2,4,12,20,12,2,11,9,27,9,2,11,5, +27,5,2,4,2,20,2,2,7,0,71,64,144,15,1,15,36,128,48,36,1,36,184,255,192,64, +20,30,35,72,223,36,1,25,71,31,8,1,8,20,80,10,16,30,80,3,22,0,63,237,63,237, +1,47,93,237,93,43,113,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93, +93,1,16,2,35,34,46,2,53,16,33,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51, +50,62,2,4,29,250,238,113,178,123,65,1,229,126,183,117,56,189,39,75,108,68, +69,111,78,41,44,77,105,62,69,112,78,42,2,30,254,228,254,234,68,140,211,143, +2,48,70,140,210,140,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0, +0,2,0,132,254,87,4,29,4,77,0,38,0,58,0,148,64,16,105,56,121,56,2,105,42,121, +42,2,134,36,150,36,2,36,184,255,224,64,19,7,10,72,73,31,89,31,2,73,7,89,7, +2,134,3,150,3,2,3,184,255,224,64,63,7,10,72,0,71,64,160,39,1,39,60,128,49, +28,15,70,0,16,16,16,48,16,240,16,4,8,16,176,60,1,63,60,1,112,60,144,60,2, +31,60,1,255,60,1,192,60,224,60,2,28,44,80,34,16,22,15,15,27,8,54,80,5,22, +0,63,237,50,63,63,63,237,50,1,93,93,113,113,114,114,47,94,93,237,50,50,26, +16,220,93,26,237,49,48,43,93,93,93,43,93,93,93,1,20,14,2,35,34,38,39,35,30, +3,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51,50,30,2,7,52,46,2,35,34,14, +2,21,20,30,2,51,50,62,2,4,29,40,93,153,112,116,174,46,5,1,1,1,1,180,1,2,2, +1,174,1,3,3,3,4,25,64,82,101,63,112,153,93,40,189,24,59,98,74,60,106,79,46, +38,73,108,70,75,99,59,24,2,34,123,208,150,85,88,100,2,32,48,59,29,254,89, +5,6,39,72,59,42,9,3,36,51,58,26,52,73,47,21,80,145,205,129,100,156,108,56, +34,96,169,135,115,159,98,43,58,110,159,0,0,2,0,86,254,87,3,240,4,78,0,34, +0,54,0,165,64,119,85,47,101,47,2,90,43,106,43,2,57,32,73,32,2,54,9,70,9,2, +9,1,25,1,121,1,137,1,4,6,5,22,5,118,5,134,5,4,9,22,70,64,35,11,127,23,223, +23,2,23,56,128,45,71,15,3,1,10,3,32,56,64,56,2,207,56,1,0,56,32,56,144,56, +176,56,4,80,223,56,1,192,56,1,79,56,1,128,56,160,56,2,15,56,47,56,2,208,56, +240,56,2,15,56,1,8,22,27,17,16,11,40,80,6,16,29,50,80,0,22,0,63,237,50,63, +237,50,63,63,1,94,93,93,113,113,114,114,114,94,93,93,113,47,94,93,237,26, +16,220,93,50,50,26,237,49,48,0,94,93,93,93,93,93,93,5,34,2,17,16,18,51,50, +30,2,23,51,52,62,2,55,51,14,1,21,17,35,17,52,54,55,54,55,35,14,3,1,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,1,228,206,192,197,201,67,103,81,61,25, +2,3,3,4,2,173,2,5,180,1,1,1,1,2,26,63,82,103,1,16,41,75,107,66,69,98,61,29, +27,61,97,70,60,106,79,46,20,1,22,1,22,1,26,1,28,24,47,70,47,25,61,54,39,3, +17,144,134,251,54,1,183,26,56,25,28,29,51,75,49,23,2,62,118,160,96,41,51, +105,161,110,108,160,104,51,37,97,169,0,0,0,1,0,136,0,0,2,136,4,78,0,31,0, +62,64,40,16,21,48,21,2,21,21,33,12,31,70,192,0,1,0,0,16,0,48,0,224,0,240, +0,5,8,0,25,40,19,22,72,25,12,18,16,7,15,0,21,0,63,63,63,51,205,43,1,47,94, +93,113,237,50,17,51,47,93,49,48,51,17,52,46,2,39,51,30,3,21,51,62,3,51,50, +22,23,21,46,1,35,34,14,2,21,17,142,1,2,2,1,170,1,3,3,1,4,19,43,58,80,57,22, +40,11,18,48,30,62,87,55,26,3,62,34,71,66,58,23,23,59,62,57,20,62,91,59,29, +7,3,165,5,5,56,99,137,81,253,204,0,0,1,0,57,255,236,3,182,4,75,0,55,0,189, +64,85,116,46,132,46,2,111,21,127,21,143,21,3,107,22,1,37,54,1,42,27,1,21, +52,1,5,2,21,2,2,11,30,27,30,2,36,73,35,35,0,72,64,32,19,48,19,2,144,19,160, +19,176,19,3,19,57,128,11,73,10,64,25,30,72,10,10,44,72,79,29,95,29,2,32,29, +1,29,96,57,192,57,2,128,57,1,57,184,255,192,64,42,39,42,72,63,57,1,16,57, +1,19,44,5,41,80,32,0,36,1,144,36,240,36,2,36,36,32,16,14,80,5,96,11,112,11, +2,128,11,1,11,11,5,22,0,63,51,47,93,113,16,237,63,51,47,93,113,16,237,18, +57,57,1,93,93,43,93,113,47,93,113,237,51,47,43,237,26,16,220,93,113,26,237, +50,47,237,49,48,93,93,0,93,1,93,93,0,93,93,93,1,20,14,2,35,34,46,2,39,55, +30,1,51,50,62,2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,6,21, +20,30,2,23,30,5,3,182,59,112,163,105,94,151,114,77,18,159,23,144,128,58,97, +70,39,46,82,117,70,65,128,103,64,211,202,179,211,28,162,9,48,68,85,46,122, +116,43,77,108,65,43,90,85,75,56,33,1,43,76,119,81,43,29,64,105,76,31,87,81, +16,39,65,48,49,63,42,31,19,17,42,69,102,77,148,155,126,139,20,42,57,35,15, +74,75,44,57,39,29,16,11,25,35,47,66,88,0,0,0,0,1,0,31,255,240,2,42,5,44,0, +22,0,123,64,87,40,14,1,105,14,121,14,137,14,3,40,13,1,105,13,121,13,137,13, +3,139,4,1,4,32,9,13,72,108,4,124,4,156,4,172,4,4,4,32,9,12,72,111,22,127, +22,2,22,12,13,22,3,16,70,9,8,143,5,1,0,5,16,5,32,5,64,5,4,7,5,128,24,1,15, +6,80,12,63,10,1,10,9,15,19,80,3,22,0,63,237,63,205,93,51,237,50,1,93,47,94, +93,113,51,51,237,23,50,47,93,49,48,0,43,93,1,43,93,93,113,93,113,37,14,1, +35,34,53,17,35,53,51,55,51,21,51,21,35,17,20,22,51,50,54,55,2,42,41,85,56, +216,125,132,53,120,200,200,51,63,26,49,29,8,11,13,245,2,210,131,242,242,131, +253,85,78,63,8,6,0,0,0,0,1,0,133,255,236,3,235,4,58,0,37,0,121,64,69,150, +3,1,26,33,42,33,58,33,3,25,14,70,64,47,11,143,11,2,191,11,1,143,11,159,11, +255,11,3,11,39,128,1,70,223,36,239,36,2,0,36,16,36,48,36,240,36,4,8,36,176, +39,192,39,208,39,3,176,39,240,39,2,255,39,1,112,39,1,39,184,255,192,64,13, +19,23,72,25,6,80,31,22,19,21,12,0,15,0,63,50,63,63,237,50,1,43,93,93,113, +114,47,94,93,113,237,26,16,220,93,113,114,26,237,51,49,48,0,93,93,1,17,20, +30,2,51,50,62,2,53,17,51,17,20,30,2,23,35,46,3,53,35,14,3,35,34,46,2,53,17, +1,58,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90, +130,84,39,4,58,253,82,79,106,65,27,45,85,125,81,2,115,252,173,34,75,67,48, +7,5,44,57,59,20,47,76,53,29,44,92,144,101,2,209,0,0,1,0,7,0,0,3,249,4,58, +0,16,2,91,64,55,57,1,73,1,2,153,1,1,54,0,70,0,2,134,0,150,0,2,58,15,74,15, +2,154,15,1,105,15,121,15,137,15,3,53,3,69,3,2,149,3,1,3,103,3,119,3,135,3, +3,14,16,13,17,72,4,184,255,240,64,62,13,17,72,1,0,9,9,2,15,16,16,43,16,123, +16,2,4,16,20,16,2,4,16,20,16,68,16,84,16,132,16,148,16,196,16,212,16,8,219, +16,1,68,16,84,16,132,16,148,16,196,16,5,27,16,1,4,16,1,8,16,3,2,184,255,240, +64,255,11,2,91,2,2,42,2,11,18,27,18,2,11,18,27,18,75,18,91,18,139,18,155, +18,203,18,219,18,8,255,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18, +1,68,18,84,18,2,32,18,1,4,18,20,18,2,199,224,18,1,196,18,212,18,2,160,18, +1,4,18,20,18,68,18,84,18,132,18,148,18,6,68,18,84,18,132,18,148,18,196,18, +212,18,6,27,18,1,4,18,1,219,18,1,196,18,1,155,18,1,132,18,1,91,18,1,68,18, +1,27,18,1,4,18,1,151,11,18,27,18,75,18,91,18,139,18,155,18,203,18,219,18, +8,155,18,203,18,219,18,3,132,18,1,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18, +2,224,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,4,18,20,18,68, +18,84,18,4,103,4,18,20,18,68,18,84,18,132,18,148,18,196,18,212,18,8,219,18, +1,196,18,1,155,18,1,132,18,1,91,18,1,68,18,1,27,18,1,4,18,1,219,18,1,196, +18,1,11,18,27,18,75,18,64,99,91,18,139,18,155,18,6,55,75,18,91,18,139,18, +155,18,203,18,219,18,6,63,18,1,32,18,1,4,18,20,18,2,224,18,1,196,18,212,18, +2,160,18,1,132,18,148,18,2,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18,2,196, +18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,2,80,18,1,47,18,1,0,18,16,18, +2,7,15,2,15,9,1,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93,93,113,113,113, +113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113, +113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114,94,93,93,93,93,93, +93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93,93,93,93,113,114,47, +94,93,56,51,47,94,93,93,93,93,113,114,114,56,51,18,57,61,47,51,51,49,48,43, +43,93,95,93,113,93,93,113,93,113,93,113,33,35,1,51,19,30,3,23,62,3,55,19, +51,2,101,213,254,119,192,238,7,19,20,17,6,6,19,20,21,8,246,191,4,58,253,64, +22,63,68,63,21,21,63,66,63,22,2,194,0,0,0,0,1,255,253,0,0,5,204,4,58,0,42, +3,177,64,36,229,23,1,58,41,74,41,2,122,41,138,41,154,41,3,53,16,69,16,2,117, +16,133,16,149,16,3,54,29,70,29,2,54,29,1,29,184,255,240,64,22,13,17,72,57, +28,73,28,2,57,28,1,28,16,13,17,72,54,0,70,0,2,0,184,255,240,64,9,11,17,72, +54,13,70,13,2,13,184,255,240,64,51,11,17,72,57,1,73,1,2,1,16,11,17,72,57, +14,73,14,2,3,14,16,9,17,72,14,13,22,29,28,7,1,0,35,40,35,1,88,35,1,22,7,35, +35,7,22,3,15,41,42,16,42,184,255,192,64,73,47,50,72,73,42,1,52,42,1,38,42, +1,249,42,1,198,42,230,42,2,164,42,1,150,42,1,121,42,1,54,42,70,42,102,42, +3,25,42,1,244,42,1,182,42,230,42,2,132,42,148,42,2,102,42,118,42,2,57,42, +1,38,42,1,20,42,1,6,42,1,8,42,16,15,184,255,240,64,255,9,15,89,15,105,15, +121,15,4,10,15,198,44,230,44,246,44,3,164,44,1,150,44,1,121,44,1,102,44,1, +84,44,1,54,44,70,44,2,25,44,1,244,44,1,230,44,1,196,44,1,182,44,1,153,44, +1,134,44,1,116,44,1,102,44,1,57,44,1,20,44,36,44,2,6,44,1,202,249,44,1,150, +44,182,44,198,44,230,44,4,105,44,1,54,44,70,44,2,9,44,25,44,2,230,44,1,185, +44,1,86,44,102,44,134,44,3,57,44,1,43,44,1,20,44,1,6,44,1,228,44,1,214,44, +1,196,44,1,182,44,1,162,44,1,148,44,1,134,44,1,114,44,1,100,44,1,86,44,1, +52,44,68,44,2,34,44,1,20,44,1,6,44,1,153,246,44,1,194,44,210,44,2,180,44, +1,166,44,1,132,44,1,118,44,1,84,44,100,44,2,66,44,1,52,44,1,22,44,38,44,2, +4,44,1,226,44,242,44,2,212,44,1,198,44,1,164,44,1,146,44,1,132,44,1,102,44, +118,44,2,84,44,1,54,44,70,44,2,36,44,1,22,44,1,4,44,1,244,44,64,213,1,230, +44,1,196,44,1,178,44,1,164,44,1,102,44,134,44,150,44,3,68,44,84,44,2,54,44, +1,20,44,1,6,44,1,105,246,44,1,226,44,1,212,44,1,150,44,182,44,198,44,3,116, +44,132,44,2,54,44,70,44,102,44,3,36,44,1,6,44,22,44,2,244,44,1,182,44,230, +44,2,148,44,164,44,2,134,44,1,105,44,1,86,44,1,68,44,1,6,44,54,44,2,228,44, +1,214,44,1,196,44,1,166,44,182,44,2,137,44,1,114,44,1,1,96,44,1,4,44,36,44, +84,44,3,56,164,44,196,44,212,44,244,44,4,128,44,1,116,44,1,75,44,1,48,44, +1,20,44,36,44,2,251,44,1,196,44,1,160,44,1,148,44,1,123,44,1,52,44,68,44, +100,44,3,27,44,1,240,44,1,228,44,1,203,44,1,100,44,132,44,148,44,180,44,4, +63,44,1,2,0,44,16,44,2,8,7,184,255,224,64,40,14,17,72,66,7,1,52,7,1,34,7, +1,7,28,41,3,15,15,35,40,12,17,72,45,35,1,22,40,12,17,72,45,22,1,1,22,35,3, +14,21,0,63,23,51,93,43,93,43,63,23,51,93,93,93,43,1,94,93,95,93,93,93,93, +93,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93,93,95,93,93, +93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114, +94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113, +113,113,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93, +93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114,114,94, +93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,47,94,93, +56,51,47,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114, +43,56,51,18,23,57,61,47,47,47,113,114,17,51,51,17,51,51,17,51,51,49,48,43, +95,113,43,113,43,113,43,113,43,93,113,43,93,113,93,113,93,113,113,33,35,3, +46,1,39,38,39,6,7,14,1,7,3,35,1,51,19,30,1,23,22,23,54,55,62,1,55,19,51,19, +30,1,23,22,23,54,55,62,1,55,19,51,4,150,209,173,8,17,8,10,9,9,10,8,19,8,178, +208,254,209,178,183,7,14,7,7,8,8,9,8,16,6,196,193,189,7,16,7,8,8,8,8,7,15, +7,191,176,2,186,27,80,38,44,47,45,44,38,82,31,253,74,4,58,253,33,23,67,32, +37,39,38,36,31,64,21,2,231,253,25,26,66,29,34,35,38,36,31,67,26,2,223,0,0, +1,0,23,0,0,3,234,4,58,0,11,2,214,64,72,148,2,1,134,2,1,141,8,157,8,2,121, +8,1,130,6,146,6,2,118,6,1,141,0,157,0,2,121,0,1,55,10,119,10,2,28,10,1,122, +4,1,19,4,1,3,24,1,120,1,136,1,152,1,4,23,7,135,7,151,7,3,6,8,10,1,7,4,4,9, +9,16,5,184,255,240,64,59,5,9,5,9,3,0,11,16,41,11,57,11,2,4,11,20,11,2,214, +11,230,11,246,11,3,196,11,1,150,11,166,11,182,11,3,132,11,1,6,11,38,11,70, +11,102,11,134,11,150,11,166,11,198,11,230,11,9,8,11,184,255,192,181,24,31, +72,11,2,3,184,255,240,64,11,9,3,1,9,3,57,3,2,10,3,13,184,255,128,64,116,223, +233,72,118,13,1,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,230, +13,246,13,2,210,13,1,192,13,1,178,13,1,132,13,148,13,164,13,3,118,13,1,100, +13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,199,246,13,1,228,13,1, +214,13,1,196,13,1,182,13,1,164,13,1,6,13,70,13,86,13,134,13,150,13,166,13, +198,13,214,13,230,13,9,150,13,198,13,2,13,184,255,192,64,187,183,192,72,132, +13,1,86,13,102,13,118,13,3,68,13,1,38,13,54,13,2,4,13,1,151,38,13,54,13,102, +13,118,13,166,13,182,13,198,13,230,13,246,13,9,230,13,1,132,13,1,118,13,1, +68,13,84,13,100,13,3,54,13,1,36,13,1,22,13,1,4,13,1,246,13,1,228,13,1,214, +13,1,196,13,1,182,13,1,164,13,1,118,13,134,13,150,13,3,100,13,1,6,13,22,13, +38,13,70,13,86,13,5,103,6,13,70,13,86,13,134,13,150,13,198,13,214,13,230, +13,8,153,13,217,13,2,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13, +1,214,13,230,13,246,13,3,196,13,1,6,13,38,13,54,13,70,13,4,55,102,13,166, +13,182,13,230,13,246,13,5,13,184,255,192,64,54,61,66,72,57,13,1,34,13,1,1, +0,13,16,13,2,244,13,1,192,13,208,13,224,13,3,180,13,1,128,13,144,13,160,13, +3,116,13,1,96,13,1,84,13,1,64,13,1,52,13,1,32,13,1,13,184,255,192,64,34,18, +24,72,160,13,1,2,0,13,16,13,80,13,112,13,128,13,144,13,6,7,10,4,4,7,1,3,2, +8,6,15,0,2,21,0,63,51,63,51,18,23,57,17,1,51,94,93,95,93,43,113,113,113,113, +113,113,113,113,113,113,114,95,114,114,43,114,94,93,93,93,113,113,113,113, +113,113,113,113,114,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113, +113,113,114,94,93,93,93,93,93,43,93,113,114,114,114,114,114,114,94,93,93, +93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,43,47,94, +93,114,56,51,47,43,94,93,113,113,113,113,114,114,56,51,18,57,57,47,47,56, +56,18,23,57,50,51,49,48,0,93,93,1,95,93,93,93,93,93,93,93,93,93,93,93,93, +33,9,1,35,9,1,51,9,1,51,9,1,3,33,254,221,254,219,194,1,129,254,145,199,1, +14,1,12,201,254,145,1,134,1,188,254,68,2,44,2,14,254,91,1,165,253,244,253, +210,0,0,0,0,1,0,5,254,87,3,252,4,58,0,31,2,207,64,59,147,3,1,147,2,1,153, +16,1,150,0,1,141,16,157,16,2,141,0,157,0,2,122,29,138,29,154,29,3,105,29, +1,157,30,1,30,16,13,16,72,146,19,1,134,19,1,114,19,1,86,19,102,19,2,146,18, +1,3,18,184,255,240,64,36,13,16,72,16,0,24,8,24,8,24,17,30,31,16,153,31,1, +134,31,1,89,31,1,70,31,1,25,31,1,6,31,1,8,31,18,17,184,255,240,64,36,17,6, +33,1,6,33,38,33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230, +33,246,33,12,199,230,33,246,33,2,33,184,255,192,64,255,217,233,72,196,33, +1,166,33,182,33,2,132,33,1,6,33,38,33,54,33,70,33,102,33,118,33,6,6,33,38, +33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230,33,246,33,12, +6,33,22,33,38,33,70,33,86,33,102,33,134,33,166,33,198,33,230,33,246,33,11, +151,244,33,1,224,33,1,194,33,210,33,2,180,33,1,160,33,1,130,33,146,33,2,116, +33,1,96,33,1,66,33,82,33,2,52,33,1,32,33,1,2,33,18,33,2,228,33,244,33,2,194, +33,210,33,2,164,33,180,33,2,130,33,146,33,2,100,33,116,33,2,66,33,82,33,2, +36,33,52,33,2,2,33,18,33,2,228,33,244,33,2,194,33,210,33,2,164,33,180,33, +2,130,33,146,33,2,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2, +33,1,103,228,33,244,33,2,214,33,1,194,33,1,164,33,180,33,2,150,33,1,130,33, +1,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2,33,1,228,33,244, +33,2,214,33,1,64,166,194,33,1,1,160,33,176,33,2,132,33,148,33,2,96,33,112, +33,2,68,33,84,33,2,32,33,48,33,2,4,33,20,33,2,224,33,240,33,2,196,33,212, +33,2,160,33,176,33,2,132,33,148,33,2,96,33,112,33,2,68,33,84,33,2,32,33,48, +33,2,4,33,20,33,2,55,224,33,1,196,33,212,33,2,160,33,1,132,33,148,33,2,96, +33,1,68,33,84,33,2,32,33,1,4,33,20,33,2,224,33,1,196,33,212,33,2,160,33,1, +132,33,148,33,2,96,33,1,2,0,33,32,33,48,33,80,33,4,80,33,128,33,144,33,192, +33,4,47,33,1,0,33,16,33,2,7,16,0,24,0,32,30,17,15,12,80,5,27,0,63,237,63, +51,17,51,51,17,51,1,94,93,93,93,113,95,113,113,113,113,113,114,114,114,114, +114,114,114,114,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,95,113, +113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93, +93,93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114, +114,114,114,114,114,94,93,113,114,114,114,114,43,114,94,93,113,47,56,51,47, +94,93,93,93,93,93,93,56,51,18,57,57,61,47,24,47,17,51,51,49,48,43,95,93,93, +93,93,93,43,93,93,93,0,93,93,1,93,93,93,93,33,14,3,35,34,38,39,53,30,1,51, +50,54,63,1,1,51,19,30,3,23,62,3,55,19,51,2,92,38,79,98,120,78,34,58,32,19, +48,17,79,136,51,17,254,83,192,228,10,31,31,24,2,3,23,29,30,10,212,190,98, +157,111,59,4,7,135,3,3,118,129,43,4,53,253,170,27,90,90,72,9,11,65,80,82, +30,2,106,0,1,0,49,0,0,3,182,4,58,0,9,1,11,64,78,157,2,173,2,2,139,2,1,89, +2,105,2,2,146,7,162,7,2,116,7,132,7,2,70,7,86,7,102,7,3,40,8,1,3,8,2,123, +6,1,4,6,20,6,36,6,164,6,180,6,212,6,228,6,7,7,6,7,3,11,1,59,1,91,1,3,10,1, +64,39,55,72,1,64,17,20,72,1,11,184,255,192,64,40,92,100,72,192,11,1,180,11, +1,160,11,1,148,11,1,128,11,1,116,11,1,96,11,1,84,11,1,64,11,1,52,11,68,11, +100,11,132,11,4,11,184,255,192,64,32,73,82,72,32,11,1,20,11,1,0,11,1,63,68, +11,100,11,132,11,164,11,4,4,11,36,11,68,11,100,11,4,11,184,255,192,179,51, +62,72,11,184,255,192,64,18,31,39,72,224,11,1,2,0,11,32,11,80,11,112,11,4, +7,11,184,255,192,64,13,16,20,72,6,3,80,4,15,1,7,80,0,21,0,63,237,50,63,237, +50,1,43,94,93,95,93,43,43,113,114,94,93,93,93,43,93,113,113,113,113,113,113, +113,113,113,43,47,43,43,94,93,51,51,47,94,93,113,51,51,95,113,49,48,93,93, +93,93,93,93,51,53,1,33,53,33,21,1,33,21,49,2,149,253,147,3,56,253,106,2,187, +137,3,38,139,137,252,218,139,0,0,0,1,0,34,254,87,2,136,5,204,0,45,0,96,64, +65,3,32,9,12,72,19,32,9,13,72,23,45,33,28,40,240,17,11,31,5,63,5,2,143,5, +1,64,5,1,5,33,11,245,47,12,111,12,2,15,12,79,12,223,12,239,12,4,47,12,79, +12,111,12,3,12,12,0,24,245,21,0,43,245,0,27,0,63,237,63,237,18,57,47,93,113, +114,237,57,1,47,93,93,113,51,51,237,50,50,205,50,49,48,43,43,1,34,46,2,53, +17,52,46,2,39,53,62,3,53,17,52,54,59,1,21,35,34,6,21,17,20,14,2,7,21,30,3, +21,17,20,22,59,1,21,2,1,65,99,66,34,29,55,80,51,51,80,55,29,133,131,135,63, +91,77,30,52,71,41,43,71,51,29,77,91,63,254,87,41,76,108,68,1,105,63,88,56, +28,2,127,2,28,56,88,62,1,106,141,152,129,107,108,254,156,50,84,64,44,10,2, +10,44,65,84,51,254,155,106,109,129,0,1,0,183,254,78,1,93,5,204,0,3,1,207, +64,21,3,171,6,0,1,11,0,0,4,5,214,5,230,5,246,5,3,194,5,1,5,184,255,128,179, +226,229,72,5,184,255,192,64,10,222,225,72,2,5,18,5,2,218,5,184,255,128,179, +214,217,72,5,184,255,192,64,20,210,213,72,180,5,196,5,2,162,5,1,1,112,5,128, +5,144,5,3,5,184,255,192,64,20,199,202,72,0,5,1,240,5,1,212,5,228,5,2,176, +5,192,5,2,5,184,255,192,64,43,187,190,72,48,5,64,5,80,5,3,4,5,20,5,36,5,3, +240,5,1,196,5,212,5,228,5,3,128,5,144,5,160,5,3,4,5,20,5,36,5,3,164,5,184, +255,192,179,168,171,72,5,184,255,128,179,160,163,72,5,184,255,192,64,14,156, +159,72,112,5,128,5,144,5,3,228,5,1,5,184,255,192,64,11,145,148,72,176,5,192, +5,208,5,3,5,184,255,192,64,15,133,136,72,48,5,1,20,5,36,5,2,0,5,1,5,184,255, +192,64,15,122,125,72,128,5,1,4,5,20,5,36,5,3,110,5,184,255,192,64,10,114, +117,72,192,5,1,84,5,1,5,184,255,192,182,102,105,72,16,5,1,5,184,255,192,64, +9,91,94,72,80,5,96,5,2,5,184,255,192,64,15,79,82,72,203,5,219,5,2,160,5,176, +5,2,2,5,184,255,192,64,10,68,71,72,15,5,31,5,2,62,5,184,255,192,64,29,56, +61,72,207,5,1,96,5,112,5,160,5,176,5,4,31,5,1,0,5,1,160,5,224,5,240,5,3,5, +184,255,192,64,28,25,28,72,5,64,17,21,72,64,5,112,5,128,5,144,5,4,15,5,31, +5,47,5,3,7,1,0,0,0,47,63,1,94,93,93,43,43,113,114,114,114,114,43,94,93,43, +95,93,93,43,113,43,114,43,114,114,43,94,93,93,43,113,113,113,43,113,43,113, +114,43,43,43,94,93,93,93,93,113,113,43,113,113,113,114,43,114,95,114,114, +43,43,94,93,43,43,93,93,17,18,57,47,94,93,237,49,48,19,17,51,17,183,166,254, +78,7,126,248,130,0,0,0,0,1,0,34,254,87,2,135,5,204,0,45,0,98,185,0,40,255, +224,179,9,12,72,24,184,255,224,64,55,9,13,72,20,44,32,26,38,240,15,9,48,3, +1,192,3,208,3,2,3,9,32,245,47,31,111,31,2,15,31,79,31,223,31,239,31,4,47, +31,79,31,111,31,3,31,31,21,45,245,44,27,20,245,21,0,0,63,237,63,237,18,57, +47,93,113,114,237,57,1,47,93,113,51,51,253,50,50,205,50,49,48,43,43,19,50, +54,53,17,52,62,2,55,53,46,3,53,17,52,38,43,1,53,51,50,22,21,17,20,30,2,23, +21,14,3,21,17,20,14,2,43,1,53,94,91,79,28,51,71,43,42,70,52,29,79,91,60,132, +131,133,29,55,81,52,52,81,55,29,34,66,99,65,132,254,216,109,106,1,101,51, +84,65,44,10,2,10,44,64,84,50,1,100,108,107,129,152,141,254,150,62,88,56,28, +2,127,2,28,56,88,63,254,151,68,108,76,41,129,0,0,0,0,1,0,92,2,41,4,80,3,39, +0,32,0,154,64,26,90,3,138,3,2,25,2,41,2,57,2,3,30,48,10,16,72,13,31,1,25, +48,9,12,72,13,184,255,208,179,9,13,72,7,184,255,208,64,19,9,13,72,0,27,32, +27,112,27,3,27,32,10,1,10,24,173,64,10,184,255,192,180,38,60,72,10,0,184, +255,192,179,23,28,72,0,184,255,192,64,41,14,20,72,0,128,27,64,41,60,72,27, +5,173,31,14,79,14,159,14,3,111,14,127,14,159,14,175,14,207,14,239,14,255, +14,7,14,64,9,13,72,14,0,47,43,93,113,237,196,43,26,221,43,43,196,43,26,237, +1,47,93,47,93,49,48,0,43,43,43,93,43,93,93,1,34,38,39,38,35,34,14,2,7,53, +62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,76,69,145,73,129,88,38,65,60, +56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68,2,41, +44,26,45,12,23,32,21,143,38,46,13,20,26,13,8,15,14,8,50,42,149,23,30,19,8, +0,0,0,2,0,242,254,185,1,184,4,58,0,3,0,7,2,19,64,133,2,91,3,3,166,5,182,5, +2,5,150,105,6,185,6,2,70,6,86,6,2,57,6,1,6,64,23,27,72,182,6,198,6,2,73,6, +89,6,105,6,3,22,6,54,6,2,9,6,1,10,6,121,9,137,9,153,9,201,9,4,70,9,1,9,9, +57,9,2,249,9,1,182,9,1,105,9,121,9,169,9,3,38,9,1,9,9,1,204,217,9,233,9,2, +150,9,1,73,9,89,9,121,9,3,6,9,1,185,9,201,9,2,134,9,1,116,9,1,86,9,102,9, +2,68,9,1,22,9,38,9,54,9,3,9,184,255,192,64,14,168,171,72,180,9,1,134,9,150, +9,166,9,3,9,184,255,192,64,22,159,162,72,36,9,1,6,9,22,9,2,156,182,9,198, +9,214,9,246,9,4,9,184,255,64,64,14,147,150,72,102,9,1,150,9,166,9,182,9,3, +9,184,255,192,64,24,137,144,72,98,9,114,9,130,9,3,64,9,80,9,2,34,9,50,9,2, +16,9,1,9,184,255,64,182,117,124,72,128,9,1,9,184,255,64,64,10,110,115,72, +4,9,20,9,2,108,9,184,255,64,64,62,101,107,72,180,9,196,9,212,9,3,150,9,166, +9,2,132,9,1,118,9,1,82,9,98,9,2,36,9,52,9,68,9,3,6,9,22,9,2,246,9,1,194,9, +210,9,2,1,144,9,160,9,176,9,3,100,9,116,9,132,9,3,9,184,255,128,64,16,71, +75,72,212,9,228,9,244,9,3,160,9,176,9,2,9,184,255,192,64,61,59,64,72,16,9, +32,9,2,4,9,1,55,180,9,228,9,244,9,3,128,9,144,9,2,84,9,100,9,116,9,3,27,9, +1,0,9,1,240,9,1,196,9,212,9,228,9,3,84,9,100,9,164,9,212,9,228,9,244,9,6, +9,184,255,192,64,20,26,31,72,64,9,1,2,15,9,1,7,0,6,156,7,15,0,3,1,3,0,47, +93,63,253,206,1,94,93,95,93,43,93,113,113,114,114,114,114,114,94,93,93,43, +93,93,43,113,113,95,113,113,114,114,114,114,114,114,114,43,94,93,43,93,43, +113,113,113,113,43,113,114,43,114,94,93,93,43,93,93,43,113,113,113,113,113, +113,114,114,114,114,94,93,93,93,93,93,113,113,113,47,94,93,93,93,93,43,113, +113,113,237,113,51,47,237,49,48,1,51,19,35,19,21,35,53,1,10,148,24,196,198, +194,2,173,252,12,5,129,201,201,0,0,0,1,0,135,255,225,3,250,5,129,0,43,0,137, +64,31,88,14,104,14,2,87,20,103,20,2,26,28,1,21,6,1,6,3,1,25,10,22,0,11,1, +11,11,3,39,71,17,184,255,192,64,56,8,11,72,17,31,70,30,30,3,70,4,34,80,217, +31,1,124,31,140,31,2,25,31,1,31,22,96,25,112,25,2,160,25,1,25,23,3,12,213, +3,1,112,3,128,3,2,21,3,101,3,2,3,0,80,9,10,0,47,221,237,51,93,93,93,51,63, +221,93,113,50,50,93,93,93,237,1,47,237,51,47,237,47,43,237,18,57,47,113,51, +205,50,49,48,0,93,93,93,93,93,1,50,54,55,23,14,3,7,21,35,53,46,3,53,52,62, +2,55,53,51,21,30,3,23,7,46,1,35,34,14,2,21,20,30,2,2,84,96,129,15,182,8,51, +88,126,83,124,111,154,95,43,66,111,146,80,124,78,120,86,54,12,185,14,114, +105,77,103,64,27,27,64,105,1,21,104,108,12,62,116,92,62,8,168,168,10,93,149, +195,113,150,206,131,63,7,155,155,8,55,85,109,63,14,90,106,51,103,156,105, +93,156,113,62,0,0,1,0,58,0,0,4,80,5,150,0,50,0,210,64,83,70,23,1,54,2,70, +2,2,21,18,37,18,53,18,3,36,0,39,13,6,26,111,25,25,39,0,44,110,6,35,39,110, +14,95,10,1,10,10,0,79,6,95,6,111,6,3,6,50,111,0,0,32,0,2,0,0,32,0,48,0,80, +0,112,0,144,0,176,0,208,0,8,0,0,16,0,48,0,192,0,224,0,5,0,184,255,192,64, +64,14,18,72,0,38,11,81,35,15,14,31,14,175,14,3,15,14,63,14,111,14,127,14, +159,14,175,14,207,14,223,14,8,8,14,64,37,42,72,14,64,27,32,72,14,14,44,31, +115,26,20,7,7,44,116,22,50,118,50,134,50,3,50,6,24,0,63,51,93,237,50,63,51, +237,18,57,47,43,43,94,93,113,51,237,50,1,47,43,93,113,114,237,47,93,18,57, +47,113,51,237,50,16,237,17,18,57,47,237,17,51,17,18,57,49,48,0,93,1,93,0, +93,1,14,3,35,33,53,62,1,61,1,35,53,51,17,52,62,2,51,50,30,2,23,7,46,3,35, +34,6,21,17,33,21,33,21,20,14,2,7,33,50,62,2,55,4,80,9,57,89,115,67,253,70, +89,86,186,186,48,99,152,103,70,123,99,71,18,174,10,39,53,65,36,114,112,1, +152,254,104,22,44,63,40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160, +121,144,129,1,24,92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,254,224, +129,126,56,106,92,71,21,19,42,67,48,0,0,0,2,0,113,0,225,4,2,4,115,0,35,0, +55,0,153,64,119,74,29,90,29,106,29,3,44,29,60,29,2,74,25,90,25,106,25,3,44, +25,60,25,2,69,11,85,11,101,11,3,35,11,51,11,2,69,7,85,7,101,7,3,35,7,51,7, +2,74,34,90,34,106,34,3,45,34,61,34,2,69,20,85,20,101,20,3,35,20,51,20,2,69, +16,85,16,101,16,3,35,16,51,16,2,74,2,90,2,106,2,3,45,2,61,2,2,46,176,18,36, +176,207,0,223,0,2,0,0,1,0,47,57,1,41,176,27,51,176,9,0,47,237,220,237,1,93, +47,93,93,237,220,237,49,48,93,93,93,93,93,93,93,93,0,93,93,93,93,93,93,93, +93,19,52,54,55,39,55,23,62,1,51,50,22,23,55,23,7,30,1,21,20,6,7,23,7,39,14, +1,35,34,38,39,7,39,55,46,1,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,137, +41,37,100,104,99,54,127,73,71,126,54,97,104,96,37,43,44,38,100,102,101,54, +126,71,72,128,52,105,102,102,37,41,154,44,77,102,58,57,102,77,44,44,77,102, +57,58,102,77,44,2,172,71,127,54,100,103,101,39,43,42,38,97,105,96,54,127, +71,71,128,53,100,105,101,37,41,42,38,105,105,102,54,127,73,58,102,76,44,44, +76,102,58,58,102,76,45,45,76,102,0,1,255,254,0,0,4,118,5,129,0,22,0,185,64, +134,151,0,167,0,2,152,17,168,17,2,73,22,1,70,18,1,155,21,171,21,2,74,21,106, +21,122,21,138,21,4,148,19,164,19,2,69,19,101,19,117,19,133,19,4,19,15,18, +31,18,79,18,143,18,4,18,9,21,0,22,16,22,64,22,128,22,4,22,20,4,0,8,92,17, +13,0,9,16,9,64,9,128,9,4,7,9,3,15,81,16,7,11,81,4,47,12,159,12,175,12,3,12, +64,41,45,72,0,12,16,12,32,12,160,12,4,12,20,0,0,16,1,15,16,175,16,2,8,16, +16,8,21,18,3,8,18,0,63,63,51,18,57,47,94,93,113,51,51,222,93,43,113,50,237, +50,16,237,50,1,47,94,93,51,51,253,50,50,57,204,93,50,16,204,93,50,49,48,93, +93,93,93,93,93,93,93,1,33,21,33,21,33,21,33,17,35,17,33,53,33,55,33,53,33, +1,51,9,1,51,2,208,1,65,254,129,1,127,254,129,178,254,131,1,125,2,254,129, +1,64,254,91,199,1,115,1,119,199,2,197,125,154,127,254,209,1,47,127,154,125, +2,188,253,121,2,135,0,2,0,183,254,78,1,93,5,204,0,3,0,7,1,221,64,23,3,7,171, +0,6,4,1,11,4,4,8,9,214,9,230,9,246,9,3,194,9,1,9,184,255,128,179,226,229, +72,9,184,255,192,64,10,222,225,72,2,9,18,9,2,218,9,184,255,128,179,214,217, +72,9,184,255,192,64,20,210,213,72,180,9,196,9,2,162,9,1,1,112,9,128,9,144, +9,3,9,184,255,192,64,20,199,202,72,0,9,1,240,9,1,212,9,228,9,2,176,9,192, +9,2,9,184,255,192,64,43,187,190,72,48,9,64,9,80,9,3,4,9,20,9,36,9,3,240,9, +1,196,9,212,9,228,9,3,128,9,144,9,160,9,3,4,9,20,9,36,9,3,164,9,184,255,192, +179,168,171,72,9,184,255,128,179,160,163,72,9,184,255,192,64,14,156,159,72, +112,9,128,9,144,9,3,228,9,1,9,184,255,192,64,11,145,148,72,176,9,192,9,208, +9,3,9,184,255,192,64,15,133,136,72,48,9,1,20,9,36,9,2,0,9,1,9,184,255,192, +64,15,122,125,72,128,9,1,4,9,20,9,36,9,3,110,9,184,255,192,64,10,114,117, +72,192,9,1,84,9,1,9,184,255,192,182,102,105,72,16,9,1,9,184,255,192,64,9, +91,94,72,80,9,96,9,2,9,184,255,192,64,15,79,82,72,203,9,219,9,2,160,9,176, +9,2,2,9,184,255,192,64,10,68,71,72,15,9,31,9,2,62,9,184,255,192,64,29,56, +61,72,207,9,1,96,9,112,9,160,9,176,9,4,31,9,1,0,9,1,160,9,224,9,240,9,3,9, +184,255,192,64,33,25,28,72,9,64,17,21,72,64,9,112,9,128,9,144,9,4,15,9,31, +9,47,9,3,7,5,0,5,0,1,4,1,0,0,63,47,18,57,57,47,47,1,94,93,93,43,43,113,114, +114,114,114,43,94,93,43,95,93,93,43,113,43,114,43,114,114,43,94,93,93,43, +113,113,113,43,113,43,113,114,43,43,43,94,93,93,93,93,113,113,43,113,113, +113,114,43,114,95,114,114,43,43,94,93,43,43,93,93,17,18,57,47,94,93,51,237, +50,49,48,19,17,51,17,3,17,51,17,183,166,166,166,2,194,3,10,252,246,251,140, +3,11,252,245,0,0,0,0,2,0,115,255,84,4,0,5,204,0,77,0,97,1,79,64,144,117,47, +133,47,2,122,8,138,8,2,100,85,1,43,85,107,85,2,45,81,109,81,2,45,57,109,57, +125,57,141,57,4,85,96,117,96,133,96,3,83,62,115,62,131,62,3,83,90,115,90, +131,90,3,121,80,137,80,2,111,80,1,90,80,1,45,80,1,116,16,132,16,2,54,16,70, +16,2,42,73,1,37,42,1,37,45,1,43,3,1,25,3,1,5,31,21,31,2,5,36,21,36,2,11,76, +27,76,2,14,73,75,34,73,55,144,75,1,75,55,75,55,78,70,29,65,24,6,73,5,5,24, +73,160,78,1,0,78,32,78,64,78,144,78,4,78,184,255,192,179,29,33,72,78,184, +255,192,64,18,21,26,72,78,45,73,44,44,88,73,0,65,32,65,176,65,3,65,184,255, +192,64,68,34,38,72,65,217,55,1,203,55,1,188,55,1,152,55,1,245,3,1,230,3,1, +149,3,1,121,83,1,106,83,1,218,83,1,155,83,1,228,14,244,14,2,166,14,1,119, +14,135,14,2,104,14,1,14,83,93,55,4,0,50,81,45,39,11,81,6,0,0,0,63,50,237, +47,51,237,18,23,57,93,93,93,93,93,93,113,113,93,93,93,93,93,93,93,1,47,43, +93,237,51,47,237,47,43,43,93,113,237,50,16,237,17,18,57,57,17,57,57,47,47, +114,16,237,16,237,49,48,93,93,93,93,93,0,93,93,1,93,0,93,93,93,93,93,93,93, +93,93,93,93,93,1,93,93,93,1,50,30,2,23,7,46,3,35,34,6,21,20,30,2,23,30,3, +21,20,14,2,7,30,3,21,20,14,2,35,34,46,2,39,55,30,3,51,50,62,2,53,52,46,2, +39,46,3,53,52,62,2,55,46,3,53,52,54,1,52,46,2,39,14,3,21,20,30,2,23,62,3, +2,76,79,138,108,73,15,161,8,46,68,84,46,125,129,50,83,109,59,68,139,112,70, +28,55,82,54,49,79,55,30,58,112,164,107,93,154,117,79,19,161,12,54,78,100, +57,58,102,76,45,57,95,123,65,65,131,104,65,32,59,84,53,42,75,57,33,211,1, +225,53,88,113,61,58,89,60,31,49,82,108,60,54,93,68,39,5,204,30,63,98,69,20, +45,58,34,13,79,71,45,64,46,32,14,16,46,73,106,76,45,87,73,55,13,21,51,64, +81,51,73,117,83,44,27,64,104,77,31,55,67,37,13,18,40,65,47,54,72,51,36,16, +15,46,73,105,74,45,83,71,53,15,14,46,64,80,48,139,155,252,203,48,69,51,35, +14,3,33,52,69,39,46,66,48,34,15,1,24,47,70,0,0,0,0,2,0,45,4,195,2,90,5,123, +0,3,0,7,0,193,178,3,133,0,184,255,192,179,19,22,72,0,184,255,192,64,131,13, +16,72,0,7,133,4,64,19,22,72,4,64,14,17,72,4,1,5,145,0,59,4,1,45,4,1,11,4, +27,4,2,57,253,4,1,235,4,1,219,4,1,201,4,1,171,4,187,4,2,153,4,1,141,4,1,1, +4,128,44,48,72,27,4,43,4,2,15,4,1,235,4,251,4,2,191,4,207,4,223,4,3,171,4, +1,159,4,1,123,4,139,4,2,111,4,1,91,4,1,79,4,1,59,4,1,31,4,47,4,2,2,15,4,63, +4,175,4,191,4,4,4,64,22,25,72,4,64,14,17,72,4,0,47,43,43,93,95,113,113,113, +113,113,113,113,113,113,113,114,114,43,95,114,114,114,114,114,114,114,94, +93,93,93,51,237,50,1,47,43,43,237,220,43,43,237,49,48,1,53,51,21,33,53,51, +21,1,183,163,253,211,165,4,195,184,184,184,184,0,0,0,0,3,0,31,255,240,5,197, +5,150,0,25,0,49,0,91,0,245,64,111,138,81,1,10,73,26,73,42,73,3,10,69,26,69, +42,69,3,76,60,1,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,138, +90,154,90,2,53,81,69,81,2,58,61,1,133,52,149,52,2,54,46,70,46,2,54,41,70, +41,2,57,35,73,35,2,57,30,73,30,2,50,196,81,61,95,71,111,71,2,71,61,71,61, +14,0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,68, +15,23,72,26,38,195,111,14,127,14,2,14,60,55,201,66,87,201,76,82,76,15,66, +127,66,2,15,66,31,66,127,66,143,66,159,66,255,66,6,0,76,1,0,76,16,76,112, +76,128,76,144,76,240,76,6,66,76,66,76,7,33,200,21,4,43,200,7,19,0,63,237, +63,237,18,57,57,47,47,93,113,93,113,17,51,16,237,16,237,51,1,47,113,237,47, +43,93,113,237,17,57,57,47,47,93,17,51,237,49,48,0,93,93,93,93,93,93,93,93, +1,93,93,93,93,113,93,93,113,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18, +7,52,46,4,35,34,14,2,21,20,30,2,51,50,62,4,37,20,30,2,51,50,62,2,55,23,14, +3,35,34,46,2,53,52,62,2,51,50,30,2,23,7,46,3,35,34,14,2,5,197,52,94,131,161, +185,100,99,185,160,133,94,52,52,94,132,161,184,100,150,1,7,197,113,92,45, +82,116,140,161,87,130,228,171,99,99,171,228,130,87,161,140,116,82,45,252, +137,33,67,100,67,49,75,56,39,14,115,22,58,82,111,75,101,149,98,48,48,97,146, +98,75,112,80,55,18,114,12,38,55,72,47,69,99,64,30,2,195,100,185,161,131,94, +52,52,94,131,161,185,100,100,184,161,132,94,52,114,196,254,249,150,86,161, +139,115,82,45,99,171,228,130,131,229,171,98,45,81,115,140,161,89,72,120,86, +48,27,45,55,29,35,43,81,63,38,64,114,158,94,97,157,111,59,36,59,75,39,33, +26,50,38,23,46,83,118,0,2,0,26,2,139,2,253,5,152,0,50,0,65,0,203,64,21,45, +40,10,17,72,46,40,10,17,72,3,40,11,17,72,7,24,11,14,72,29,184,255,216,64, +16,9,17,72,23,51,1,39,39,32,226,47,11,212,56,1,56,184,255,192,64,18,19,22, +72,144,56,1,100,56,116,56,132,56,3,80,56,1,2,56,184,255,192,64,20,10,13,72, +56,20,227,21,21,63,227,5,64,22,38,72,5,192,67,1,67,184,255,192,64,51,13,18, +72,26,57,1,11,57,1,57,228,152,20,1,20,8,10,13,72,20,16,11,1,2,11,1,11,11, +26,35,7,51,1,51,228,0,42,42,0,0,32,0,80,0,3,0,0,17,228,26,222,0,63,237,51, +47,93,51,47,16,237,93,50,17,57,47,93,93,51,43,93,237,93,93,1,43,93,47,43, +237,51,47,237,47,43,95,93,93,93,43,113,51,51,237,50,47,0,93,49,48,1,43,43, +43,43,43,1,34,46,2,53,52,62,2,63,1,53,52,46,2,35,34,6,7,39,62,3,51,50,30, +2,21,17,20,22,51,50,54,55,21,14,1,35,34,46,2,39,35,14,1,39,50,62,2,61,1,7, +14,3,21,20,22,1,4,53,86,62,33,51,86,113,62,178,21,39,56,35,67,81,9,149,7, +43,75,108,71,68,109,77,42,28,35,12,22,9,19,42,22,41,57,38,20,2,4,38,132,51, +48,80,57,32,138,41,74,55,32,58,2,139,29,56,82,52,69,92,56,24,1,4,60,46,60, +35,14,59,76,10,47,82,62,35,29,60,95,66,254,204,58,50,5,3,104,5,8,22,39,51, +29,77,70,111,34,55,71,37,65,4,2,11,29,52,43,56,65,0,0,2,0,83,0,141,4,32,3, +172,0,8,0,17,0,113,64,84,106,12,122,12,138,12,3,106,9,122,9,138,9,3,106,3, +122,3,138,3,3,106,0,122,0,138,0,3,17,236,15,235,14,236,95,10,127,10,143,10, +3,64,10,96,10,2,31,10,1,10,7,236,6,235,5,236,176,1,1,95,1,1,32,1,96,1,128, +1,3,1,9,0,239,12,15,3,47,3,111,3,127,3,4,3,0,47,93,51,228,50,1,47,93,113, +113,237,237,237,47,93,93,113,237,237,237,49,48,93,93,93,93,37,1,53,1,51,21, +9,1,21,33,1,53,1,51,21,9,1,21,3,118,254,174,1,82,168,254,174,1,84,253,131, +254,176,1,80,167,254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,1, +109,63,1,115,31,254,140,254,145,29,0,1,0,100,0,180,4,71,2,242,0,5,0,51,64, +19,223,2,1,32,2,1,2,5,170,224,0,1,159,0,1,80,0,1,0,184,255,192,64,9,9,12, +72,0,2,173,0,3,179,0,63,204,237,1,47,43,93,93,93,237,47,93,93,49,48,37,17, +33,53,33,17,3,182,252,174,3,227,180,1,172,146,253,194,0,0,4,0,31,255,240, +5,197,5,150,0,25,0,49,0,63,0,72,0,240,183,4,61,20,61,36,61,3,58,184,255,224, +64,94,11,16,72,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,61, +32,9,13,72,54,46,70,46,2,54,41,70,41,2,57,35,73,35,2,57,30,73,30,2,6,69,22, +69,2,51,62,62,69,63,69,53,196,54,64,196,59,59,50,63,63,16,54,63,54,63,14, +0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,60,15, +23,72,26,38,195,111,14,127,14,2,14,50,50,54,62,52,201,69,9,68,25,68,2,68, +201,55,15,54,31,54,127,54,3,223,55,1,0,55,16,55,112,55,3,54,69,55,55,69,54, +3,7,33,200,21,4,43,200,7,19,0,63,237,63,237,18,23,57,47,47,47,93,113,93,16, +237,93,16,237,50,17,51,47,1,47,113,237,47,43,93,113,237,17,57,57,47,47,56, +17,51,51,47,237,16,237,50,17,18,57,17,51,0,93,49,48,93,93,93,93,43,1,93,93, +93,93,43,93,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18,7,52,46,4,35,34, +14,2,21,20,30,2,51,50,62,4,1,3,35,17,35,17,33,50,22,21,20,6,7,19,3,52,38, +43,1,17,51,50,54,5,197,52,94,131,161,185,100,99,185,160,133,94,52,52,94,132, +161,184,100,150,1,7,197,113,92,45,82,116,140,161,87,130,228,171,99,99,171, +228,130,87,161,140,116,82,45,254,82,199,161,127,1,51,142,151,104,85,221,159, +95,81,170,182,80,84,2,195,100,185,161,131,94,52,52,94,131,161,185,100,100, +184,161,132,94,52,114,196,254,249,150,86,161,139,115,82,45,99,171,228,130, +131,229,171,98,45,81,115,140,161,254,181,1,80,254,176,3,63,126,111,102,123, +19,254,162,2,80,69,72,254,211,85,0,0,1,255,239,5,172,4,124,6,10,0,3,0,14, +180,1,0,2,140,1,0,47,237,1,47,47,49,48,1,33,53,33,4,124,251,115,4,141,5,172, +94,0,0,0,0,2,0,122,3,92,2,184,5,150,0,19,0,39,0,66,185,0,17,255,232,179,9, +12,72,13,184,255,232,64,33,9,12,72,7,24,9,12,72,3,24,9,12,72,20,172,0,30, +172,0,10,16,10,32,10,3,10,35,175,5,25,175,15,4,0,63,237,220,237,1,47,93,237, +220,237,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7, +52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,184,45,78,105,59,59,104,78,46, +46,78,104,59,59,105,78,45,109,27,48,65,38,37,65,48,28,28,48,65,37,38,65,48, +27,4,121,59,104,77,45,45,77,104,59,60,104,77,44,44,77,104,60,37,66,49,28, +28,49,66,37,37,65,49,29,29,49,65,0,0,0,2,0,65,0,0,4,36,4,195,0,11,0,15,0, +85,64,53,13,222,4,1,140,4,1,4,2,14,209,11,1,131,11,1,11,9,1,170,6,32,2,1, +2,13,173,12,151,2,1,2,0,4,173,9,152,7,1,7,239,5,1,80,5,128,5,160,5,208,5, +4,5,0,47,93,93,51,93,51,237,50,50,93,47,237,1,47,93,51,253,50,222,93,93,196, +16,222,93,93,196,49,48,1,17,35,17,33,53,33,17,51,17,33,21,1,53,33,21,2,124, +147,254,88,1,168,147,1,168,252,29,3,227,2,168,254,117,1,139,145,1,138,254, +118,145,253,88,145,145,0,0,1,0,41,2,51,2,131,5,141,0,34,0,142,64,56,6,18, +1,6,17,1,6,12,1,106,31,122,31,138,31,3,89,15,105,15,2,106,14,1,73,14,89,14, +2,10,3,26,3,2,10,2,26,2,58,2,74,2,4,58,17,90,17,106,17,3,6,23,22,23,2,23, +184,255,224,64,40,9,15,72,33,25,225,32,8,1,32,8,96,8,160,8,224,8,4,8,14,224, +15,15,32,191,0,1,0,8,32,14,11,228,20,222,1,32,229,0,223,0,63,237,50,63,237, +51,18,57,1,47,93,51,51,47,237,47,93,113,237,50,49,48,43,0,93,93,1,93,93,0, +93,93,93,93,1,113,113,113,19,39,62,5,53,52,38,35,34,6,7,39,62,3,51,50,30, +2,21,20,14,4,7,33,21,43,2,27,88,100,103,82,52,71,74,68,88,8,133,6,46,76,107, +68,65,103,71,37,54,83,102,95,78,18,1,187,2,51,103,61,96,81,72,73,80,49,62, +75,73,68,8,51,87,64,37,33,60,86,54,62,100,86,75,73,74,42,113,0,0,1,0,27,2, +39,2,130,5,141,0,53,0,150,64,17,102,6,1,102,8,1,86,9,102,9,2,89,34,105,34, +2,42,184,255,232,64,80,11,15,72,2,32,9,13,72,48,45,21,21,15,8,28,225,45,45, +0,225,32,15,96,15,2,32,15,96,15,160,15,224,15,4,15,34,225,8,35,1,35,35,9, +225,191,8,1,8,64,24,37,72,8,49,21,228,22,22,12,105,34,1,72,34,88,34,2,34, +31,228,40,222,12,228,71,9,1,9,3,221,0,63,51,93,237,63,237,51,93,93,18,57, +47,237,57,1,47,43,93,237,51,47,113,237,47,93,113,237,50,47,237,17,18,57,47, +18,57,49,48,0,43,43,93,93,93,93,1,20,6,35,34,46,2,39,55,30,1,51,50,54,53, +52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,6, +7,21,30,3,2,130,155,142,87,116,73,36,6,136,9,88,85,77,83,37,56,67,29,61,57, +29,61,50,32,74,71,68,84,6,135,7,50,79,102,59,69,104,70,35,86,90,52,75,48, +22,3,27,116,128,39,64,81,43,13,67,69,72,76,45,54,29,9,109,13,31,53,40,60, +69,70,65,12,58,86,57,28,33,59,79,46,75,110,20,2,5,37,54,69,0,0,1,0,72,4,177, +1,240,5,228,0,5,0,55,64,37,70,4,1,122,2,138,2,2,128,3,1,3,64,143,0,1,0,64, +9,13,72,0,2,149,128,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,26,237,1,47,43, +93,26,205,93,49,48,93,93,19,53,19,51,21,1,72,217,207,254,182,4,177,20,1,31, +29,254,234,0,1,0,140,254,87,4,109,4,58,0,39,0,136,64,74,29,32,9,17,72,138, +37,154,37,2,108,37,124,37,2,37,24,14,17,72,22,22,13,70,64,31,79,12,1,127, +12,143,12,159,12,3,12,64,32,35,72,12,64,20,23,72,0,12,1,12,41,128,39,2,70, +0,1,16,1,48,1,224,1,240,1,5,8,1,96,41,128,41,2,41,184,255,192,64,17,20,23, +72,31,8,80,35,22,19,80,26,22,12,1,15,0,27,0,63,63,51,63,237,63,237,50,1,43, +93,47,94,93,237,50,26,16,220,93,43,43,93,113,50,26,237,50,47,49,48,43,0,93, +93,1,43,19,17,51,17,20,30,2,51,50,54,53,17,51,17,20,30,2,51,50,54,55,21,14, +1,35,34,46,2,39,35,14,1,35,34,38,39,17,140,181,32,58,84,52,128,146,180,11, +20,29,18,11,32,11,26,51,36,54,71,44,20,2,3,52,147,100,67,109,31,254,87,5, +227,253,82,78,106,65,28,174,162,2,115,252,208,44,56,32,13,5,3,129,8,12,30, +52,71,41,95,99,41,38,254,28,0,0,0,0,1,0,80,254,248,3,245,5,129,0,19,0,61, +64,39,12,1,15,2,191,2,207,2,3,2,5,95,6,111,6,127,6,175,6,191,6,5,0,6,16,6, +48,6,3,6,7,7,1,0,4,17,3,6,1,0,47,51,63,205,50,18,57,47,1,47,93,93,205,220, +93,205,47,49,48,1,17,35,17,35,17,35,17,34,46,2,53,52,62,2,51,33,21,3,116, +112,217,113,80,133,96,53,50,95,138,87,2,51,5,27,249,221,6,35,249,221,3,190, +45,88,133,89,84,133,93,50,102,0,0,1,0,187,1,190,1,126,2,154,0,3,0,38,64,24, +3,150,0,0,16,0,176,0,3,7,0,0,155,15,1,31,1,2,1,64,15,38,72,1,0,47,43,93,237, +1,47,94,93,237,49,48,19,53,51,21,187,195,1,190,220,220,0,0,0,1,0,119,254, +78,1,227,0,0,0,27,0,126,64,16,24,32,20,23,72,25,32,20,23,72,70,26,86,26,2, +2,184,255,232,179,9,17,72,27,184,255,224,64,62,9,17,72,24,16,25,32,25,48, +25,3,25,131,23,22,22,8,16,131,47,0,1,31,0,1,15,0,111,0,2,8,0,239,8,1,8,19, +25,64,9,13,72,25,25,5,23,11,140,32,5,80,5,96,5,112,5,176,5,192,5,6,5,0,47, +93,237,47,18,57,47,43,205,1,47,93,221,94,93,113,114,237,18,57,47,51,237,93, +50,49,48,43,43,93,43,43,5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35, +42,1,7,55,51,7,30,1,1,227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14, +29,14,65,107,39,94,94,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,182,100, +3,81,0,0,1,0,80,2,51,2,125,5,129,0,10,0,75,64,44,32,5,48,5,2,96,9,1,9,9,8, +224,2,32,4,48,4,2,4,111,0,1,0,0,4,6,3,32,2,144,2,2,2,5,4,4,3,6,220,8,1,228, +0,223,0,63,237,50,63,51,51,47,51,1,47,93,23,51,47,93,47,0,93,1,16,237,50, +47,93,49,48,0,93,19,53,51,17,7,53,55,51,17,51,21,80,211,202,210,123,215,2, +51,107,2,108,138,120,137,253,29,107,0,0,0,0,2,0,27,2,139,2,211,5,152,0,15, +0,35,0,130,185,0,13,255,232,179,7,12,72,9,184,255,224,64,43,7,12,72,4,32, +7,12,72,2,32,7,12,72,0,227,4,16,36,16,52,16,100,16,4,148,16,180,16,196,16, +212,16,244,16,5,128,16,1,2,0,16,1,16,184,255,192,64,38,12,16,72,16,26,227, +6,64,22,33,72,6,239,37,1,112,37,128,37,2,47,37,1,31,228,0,3,32,3,80,3,3,3, +3,21,228,11,222,0,63,237,51,47,93,237,1,93,93,93,47,43,237,47,43,93,95,93, +93,113,237,49,48,0,43,43,43,43,1,20,6,35,34,38,53,52,62,2,51,50,30,2,7,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,211,176,175,168,177,43,87,131,88, +93,131,84,39,149,25,50,72,48,48,75,51,26,28,51,70,43,49,75,52,27,4,18,188, +203,201,190,91,145,101,53,53,100,145,92,83,110,65,27,27,66,110,82,84,110, +66,26,26,66,110,0,2,0,83,0,141,4,32,3,172,0,8,0,17,0,133,64,100,101,15,117, +15,133,15,3,101,9,117,9,133,9,3,101,6,117,6,133,6,3,101,0,117,0,133,0,3,13, +236,10,236,17,235,15,12,1,239,12,1,112,12,128,12,2,208,12,1,63,12,111,12, +127,12,3,0,12,1,12,4,236,1,236,8,235,112,3,128,3,176,3,3,176,3,208,3,2,63, +3,1,0,3,32,3,2,3,10,0,239,14,15,5,47,5,111,5,127,5,4,5,0,47,93,51,228,50, +1,47,93,93,93,113,253,237,237,47,93,93,93,113,113,114,253,237,237,49,48,93, +93,93,93,37,35,53,9,1,53,51,1,21,1,35,53,9,1,53,51,1,21,2,206,168,1,82,254, +176,166,1,82,252,221,170,1,82,254,176,168,1,79,141,29,1,111,1,116,31,254, +141,63,254,147,29,1,111,1,116,31,254,141,63,255,255,0,56,0,0,6,78,5,129,16, +38,0,121,232,0,16,39,2,20,2,249,0,0,17,7,2,141,3,184,253,207,0,31,64,18,1, +191,12,1,112,12,1,96,12,1,16,12,1,12,3,2,17,24,0,63,53,53,1,17,93,93,93,93, +53,0,0,0,255,255,0,56,0,0,6,117,5,129,16,38,0,121,232,0,16,39,2,20,2,249, +0,0,17,7,0,114,3,242,253,207,0,47,64,30,2,111,15,1,47,15,1,15,1,191,12,1, +112,12,1,96,12,1,16,12,1,12,51,64,11,11,72,2,15,24,0,63,53,1,43,17,93,93, +93,93,53,17,93,93,53,0,0,0,255,255,0,73,0,0,6,78,5,141,16,39,2,20,3,13,0, +0,16,39,2,141,3,184,253,207,17,6,0,115,46,0,0,33,64,20,0,112,0,1,96,0,1,16, +0,1,0,83,64,11,11,72,1,2,6,24,0,63,53,53,1,43,17,93,93,93,53,0,0,2,0,131, +254,164,4,86,4,58,0,37,0,41,0,159,64,112,121,4,137,4,2,122,35,138,35,2,122, +36,138,36,2,84,26,100,26,2,58,6,74,6,122,6,138,6,4,10,72,9,9,176,39,192,39, +2,39,150,40,40,0,28,70,95,27,127,27,2,27,64,29,60,72,27,64,23,27,72,32,27, +1,27,19,70,0,64,29,60,72,0,64,23,27,72,0,64,13,17,72,32,0,1,0,32,43,1,19, +33,9,40,156,41,15,67,27,1,27,24,95,47,33,63,33,2,111,33,207,33,2,33,0,47, +93,113,237,51,93,63,253,206,17,57,1,93,47,93,43,43,43,237,47,93,43,43,93, +237,18,57,47,237,113,51,47,237,49,48,93,0,93,1,93,0,93,1,93,55,52,62,6,55, +51,14,7,21,20,30,2,51,50,54,55,23,14,3,35,34,46,2,1,21,35,53,131,37,62,79, +82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184,11,67, +121,179,122,114,178,123,64,2,113,195,50,71,108,85,67,60,58,68,83,55,69,104, +80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103,147,4,100, +201,201,0,0,0,255,255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,148,1,78,0, +0,0,21,180,2,21,5,38,2,184,255,225,180,22,25,4,7,37,1,43,53,0,43,53,0,255, +255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,149,1,219,0,0,0,19,64,11,2,21, +5,38,2,76,21,24,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,6,254,18, +38,0,36,0,0,17,7,2,150,1,96,0,0,0,19,64,11,2,22,5,38,2,0,27,21,4,7,37,1,43, +53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,7,6,18,38,0,36,0,0,17,7,2,153,1,94, +0,0,0,19,64,11,2,21,5,38,2,2,30,44,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0, +4,0,0,5,82,6,178,18,38,0,36,0,0,17,7,2,152,1,108,0,0,0,23,64,13,3,2,21,5, +38,3,2,4,25,23,4,7,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,4,0,0,5,82,6, +251,18,38,0,36,0,0,17,7,1,76,1,137,0,136,0,22,64,12,3,2,56,3,3,2,3,31,21, +4,7,37,1,43,53,53,0,63,53,53,0,2,0,24,0,0,7,168,5,129,0,15,0,26,0,136,64, +86,116,25,1,114,2,1,86,2,102,2,2,115,3,131,3,2,85,3,101,3,2,127,5,143,5,2, +109,5,1,92,5,1,25,5,41,5,2,0,7,1,11,7,11,7,0,16,14,32,14,2,14,2,25,3,17,3, +4,17,9,13,90,26,5,0,2,95,25,25,5,4,12,95,9,9,13,16,8,95,5,3,4,18,13,95,0, +18,0,63,237,63,63,237,50,18,57,47,237,17,18,57,47,237,1,47,51,51,237,50,51, +47,51,17,18,57,57,47,93,18,57,57,47,47,113,49,48,93,93,93,93,93,93,93,93, +93,33,17,33,3,35,1,33,21,33,17,33,21,33,17,33,21,1,35,14,5,7,3,33,3,201,253, +220,198,199,2,174,4,185,253,9,2,187,253,69,3,32,252,33,151,1,16,22,27,24, +18,2,217,1,222,1,156,254,100,5,129,156,254,60,154,254,21,156,4,238,3,35,50, +58,51,38,5,254,51,0,0,255,255,0,104,254,78,5,121,5,150,18,38,0,38,0,0,17, +7,0,120,1,254,0,0,0,11,182,1,58,48,40,26,16,37,1,43,53,0,0,0,255,255,0,168, +0,0,4,254,6,240,18,38,0,40,0,0,17,7,2,148,1,63,0,0,0,21,180,1,12,5,38,1,184, +255,170,180,13,16,0,10,37,1,43,53,0,43,53,0,255,255,0,168,0,0,4,254,6,240, +18,38,0,40,0,0,17,7,2,149,1,223,0,0,0,19,64,11,1,12,5,38,1,40,12,15,0,10, +37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40,0,0,17, +7,2,150,1,119,0,0,0,21,180,1,13,5,38,1,184,255,239,180,18,12,0,10,37,1,43, +53,0,43,53,0,255,255,0,168,0,0,4,254,6,178,18,38,0,40,0,0,17,7,2,152,1,121, +0,0,0,25,182,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10,37,1,43,53,53,0,43, +53,53,0,255,255,0,9,0,0,1,177,6,240,18,38,0,44,0,0,17,6,2,148,159,0,0,21, +180,1,4,5,38,1,184,255,193,180,5,8,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0, +142,0,0,2,54,6,240,18,38,0,44,0,0,17,6,2,149,70,0,0,19,64,11,1,4,5,38,1,69, +4,7,0,2,37,1,43,53,0,43,53,0,255,255,255,210,0,0,2,104,6,254,18,38,0,44,0, +0,17,6,2,150,210,0,0,19,64,11,1,5,5,38,1,0,10,4,0,2,37,1,43,53,0,43,53,0, +255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218,0,0,23,64,13,2,1, +4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,2,0,14,0,0,5,101,5,129, +0,16,0,33,0,112,64,69,117,10,1,91,32,139,32,2,91,31,139,31,2,90,20,138,20, +2,91,19,1,10,31,26,31,2,10,20,26,20,2,26,26,28,8,90,64,15,17,1,17,35,128, +24,28,90,14,16,16,1,14,27,16,95,24,127,0,1,0,0,2,28,95,14,18,23,95,2,3,0, +63,237,63,237,17,57,47,113,51,237,50,1,47,51,51,47,16,237,50,26,16,220,113, +26,237,18,57,47,49,48,93,93,93,0,93,1,93,93,0,93,19,51,17,33,50,4,22,18,21, +20,2,14,1,35,33,17,35,37,52,46,2,35,33,17,33,21,33,17,33,50,62,2,14,154,1, +210,163,1,19,198,111,106,184,251,145,253,241,154,4,151,82,148,206,123,254, +241,1,150,254,106,1,58,111,189,138,78,3,33,2,96,81,169,254,252,180,176,254, +243,181,93,2,135,72,143,203,130,61,254,57,154,254,18,72,142,212,0,255,255, +0,168,0,0,5,32,7,6,18,38,0,49,0,0,17,7,2,153,1,161,0,0,0,19,64,11,1,20,5, +38,1,12,29,43,8,18,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6, +240,18,38,0,50,0,0,17,7,2,148,1,182,0,0,0,21,180,2,40,5,38,2,184,255,216, +180,41,44,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255,236,5,215,6,240,18,38, +0,50,0,0,17,7,2,149,2,37,0,0,0,19,64,11,2,40,5,38,2,37,40,43,10,0,37,1,43, +53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,254,18,38,0,50,0,0,17,7,2,150, +1,213,0,0,0,19,64,11,2,41,5,38,2,4,46,40,10,0,37,1,43,53,0,43,53,0,0,0,255, +255,0,97,255,236,5,215,7,6,18,38,0,50,0,0,17,7,2,153,1,193,0,0,0,21,180,2, +40,5,38,2,184,255,245,180,49,63,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255, +236,5,215,6,178,18,38,0,50,0,0,17,7,2,152,1,215,0,0,0,25,182,3,2,40,5,38, +3,2,184,255,255,180,44,42,10,0,37,1,43,53,53,0,43,53,53,0,0,1,0,142,0,225, +4,31,4,115,0,11,0,129,185,0,5,255,232,179,18,22,72,3,184,255,232,64,14,18, +22,72,11,24,18,22,72,9,24,18,22,72,8,184,255,232,179,18,22,72,6,184,255,232, +64,14,18,22,72,2,24,18,22,72,0,24,18,22,72,7,184,255,232,64,14,18,22,72,1, +24,18,22,72,10,24,18,22,72,4,184,255,232,64,23,18,22,72,212,4,228,4,2,180, +4,196,4,212,4,3,32,4,1,4,0,7,1,7,0,25,47,113,1,47,93,93,113,49,48,0,43,43, +1,43,43,43,43,43,43,0,43,43,43,43,19,9,1,55,9,1,23,9,1,7,9,1,142,1,98,254, +160,104,1,94,1,94,105,254,162,1,96,102,254,159,254,156,1,74,1,98,1,96,103, +254,159,1,95,105,254,164,254,160,105,1,97,254,157,0,3,0,71,255,203,5,244, +5,186,0,27,0,39,0,51,0,196,64,141,89,44,1,8,37,1,84,33,1,5,26,21,26,101,26, +3,139,23,1,123,22,139,22,2,108,22,1,90,22,1,105,16,1,10,12,26,12,2,132,9, +1,116,8,132,8,2,99,8,1,85,8,1,27,50,91,50,2,114,43,130,43,2,84,43,1,20,38, +84,38,2,85,37,1,140,31,1,74,31,90,31,122,31,3,4,21,20,21,100,21,3,11,7,27, +7,107,7,3,32,44,40,0,91,64,15,28,1,28,53,128,32,53,1,40,91,175,14,191,14, +2,32,14,1,15,14,31,14,2,14,43,31,35,47,95,23,19,4,35,95,9,5,19,0,63,51,237, +63,51,237,17,57,57,1,47,93,93,93,237,93,26,16,220,113,26,237,18,57,57,49, +48,0,93,93,93,93,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93, +93,1,20,2,6,4,35,34,38,39,7,35,55,38,2,53,52,18,54,36,51,50,22,23,55,51,7, +22,18,7,52,38,39,1,30,1,51,50,62,2,37,20,22,23,1,46,1,35,34,14,2,5,215,95, +180,254,252,165,127,206,81,120,190,200,88,86,92,178,1,5,169,125,207,82,121, +192,201,85,87,195,49,49,253,59,59,150,93,132,191,123,59,252,15,50,51,2,195, +59,151,92,126,190,127,63,2,199,165,254,242,192,104,58,54,145,241,97,1,10, +160,165,1,10,187,101,56,54,146,242,94,254,253,160,112,184,72,252,171,44,47, +86,153,212,125,113,190,75,3,85,42,46,80,148,208,0,0,255,255,0,158,255,236, +5,41,6,240,18,38,0,56,0,0,17,7,2,148,1,141,0,0,0,21,180,1,26,5,38,1,184,255, +232,180,27,30,5,20,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,6,240, +18,38,0,56,0,0,17,7,2,149,1,237,0,0,0,19,64,11,1,26,5,38,1,37,26,29,5,20, +37,1,43,53,0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,254,18,38,0,56,0,0, +17,7,2,150,1,152,0,0,0,19,64,11,1,27,5,38,1,0,32,26,5,20,37,1,43,53,0,43, +53,0,0,0,255,255,0,158,255,236,5,41,6,178,18,38,0,56,0,0,17,7,2,152,1,158, +0,0,0,25,182,2,1,26,5,38,2,1,184,255,254,180,30,28,5,20,37,1,43,53,53,0,43, +53,53,0,255,255,0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,149,1,208,0,0,0, +19,64,11,1,9,5,38,1,65,9,12,4,8,37,1,43,53,0,43,53,0,0,0,0,2,0,168,0,0,4, +234,5,129,0,16,0,27,0,95,64,63,150,15,1,116,26,132,26,2,123,18,139,18,2,0, +90,16,17,48,17,144,17,3,255,17,1,0,17,16,17,32,17,64,17,4,17,22,11,7,90,0, +8,16,8,64,8,3,7,8,22,95,6,21,95,11,6,11,6,11,7,9,3,7,18,0,63,63,18,57,57, +47,47,16,237,16,237,1,47,94,93,237,50,50,47,93,93,113,237,49,48,0,93,93,93, +1,20,14,2,35,33,17,35,17,51,21,33,50,30,2,7,52,38,35,33,17,33,50,62,2,4,234, +59,121,182,123,254,98,191,191,1,146,125,186,124,62,192,164,164,254,133,1, +131,82,121,79,38,2,223,88,159,120,71,254,215,5,129,252,60,111,156,99,134, +149,253,192,44,79,107,0,0,0,0,1,0,142,255,236,4,143,5,204,0,67,0,214,64,150, +149,51,1,133,63,149,63,2,133,47,149,47,2,133,46,149,46,2,118,65,1,118,56, +1,83,26,131,26,147,26,3,92,39,108,39,124,39,3,107,22,1,58,22,1,145,52,1,21, +52,37,52,2,22,66,38,66,118,66,3,26,3,42,3,2,61,72,24,54,72,31,32,24,1,31, +31,1,9,24,31,31,24,9,3,43,0,72,64,48,17,160,17,2,160,17,176,17,2,17,69,128, +42,70,0,43,16,43,48,43,3,8,43,112,69,1,63,69,79,69,2,212,31,1,197,31,1,182, +31,1,219,17,1,202,17,1,185,17,1,31,17,5,36,80,49,0,43,21,14,80,5,22,0,63, +237,63,63,237,18,57,57,93,93,93,93,93,93,1,93,93,47,94,93,237,26,16,220,93, +113,26,237,18,23,57,47,47,47,93,93,16,237,16,237,49,48,0,93,1,93,93,93,93, +93,0,93,93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,38,47,1,30,3,51,50,54,53, +52,46,4,53,52,62,4,53,52,46,2,35,34,14,2,21,17,35,17,52,62,2,51,50,30,2,21, +20,14,4,21,20,30,4,4,143,41,87,136,94,80,148,55,2,25,67,74,78,37,92,98,54, +81,95,81,54,33,49,58,49,33,33,63,90,57,68,107,73,39,180,63,120,174,110,102, +155,105,53,33,51,58,51,33,55,82,95,82,55,1,39,66,115,85,49,25,24,164,14,25, +19,11,86,79,56,77,62,57,73,98,73,51,73,58,48,52,63,43,37,62,45,26,35,77,122, +88,252,3,4,3,118,173,112,54,46,80,109,62,61,90,69,53,47,48,28,38,59,57,64, +85,114,0,0,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,67,0, +188,0,0,0,21,180,2,66,17,38,2,184,255,149,180,67,70,3,36,37,1,43,53,0,43, +53,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,116,1,84,0,0, +0,19,64,11,2,66,17,38,2,11,66,69,3,36,37,1,43,53,0,43,53,0,0,0,255,255,0, +87,255,236,4,115,5,211,18,38,0,68,0,0,17,7,1,71,0,218,0,0,0,21,180,2,67,17, +38,2,184,255,192,180,72,66,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236, +4,115,5,189,18,38,0,68,0,0,17,7,1,78,0,245,0,0,0,21,180,2,66,17,38,2,184, +255,224,180,75,89,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,115,5, +123,18,38,0,68,0,0,17,7,0,105,0,235,0,0,0,25,182,3,2,66,17,38,3,2,184,255, +202,180,70,68,3,36,37,1,43,53,53,0,43,53,53,0,255,255,0,87,255,236,4,115, +6,115,18,38,0,68,0,0,17,7,1,76,1,8,0,0,0,25,182,3,2,71,17,38,3,2,184,255, +200,180,76,66,3,36,37,1,43,53,53,0,43,53,53,0,0,3,0,66,255,236,6,194,4,78, +0,62,0,79,0,88,0,251,64,96,134,54,1,122,36,1,123,58,1,117,8,133,8,2,101,68, +117,68,133,68,3,124,86,1,106,86,1,126,81,1,106,81,1,101,4,117,4,2,41,47,1, +41,44,1,24,40,9,13,72,10,28,26,28,2,17,53,88,1,70,33,31,79,79,79,95,79,127, +79,4,79,79,80,25,9,73,10,10,61,71,64,31,80,47,80,63,80,3,144,80,1,80,90,128, +44,71,45,184,255,192,64,19,21,28,72,45,45,71,71,25,64,12,15,72,25,62,80,80, +80,6,53,184,255,184,64,43,17,73,53,83,80,56,16,63,81,33,33,74,50,143,44,1, +43,44,1,44,44,39,80,50,16,17,74,80,22,22,6,80,15,239,9,1,128,9,1,9,9,15,22, +0,63,51,47,93,93,16,237,63,237,50,63,237,51,47,93,93,17,18,57,47,237,63,237, +50,43,18,57,47,237,1,47,43,237,51,47,43,237,26,16,220,93,113,26,237,50,47, +237,17,18,57,47,93,51,237,50,57,57,49,48,93,43,0,93,93,1,93,0,93,93,93,93, +1,93,0,93,1,93,0,93,93,1,21,30,3,51,50,54,55,23,14,3,35,32,3,14,3,35,34,38, +53,52,62,4,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,23,62,1,51,50,30, +2,29,1,37,7,14,5,21,20,22,51,50,62,2,53,37,46,1,35,34,14,2,7,3,200,1,34,70, +109,78,117,141,25,158,17,61,102,153,108,254,191,102,29,74,102,137,93,167, +169,38,67,91,107,117,60,240,26,57,88,61,54,88,64,39,7,188,10,58,105,159,112, +128,172,49,63,177,106,136,183,111,47,252,80,195,40,81,76,66,49,28,100,93, +90,129,83,40,2,246,15,144,135,45,96,81,54,4,1,247,17,82,136,98,55,94,72,45, +45,91,73,47,1,1,51,93,71,42,172,150,71,108,78,51,32,13,1,4,59,67,94,58,27, +15,39,67,51,17,64,107,78,43,70,69,74,65,88,155,210,122,24,31,4,1,6,18,31, +51,73,51,87,97,63,98,116,53,196,171,157,29,74,127,98,255,255,0,87,254,78, +3,202,4,78,18,38,0,70,0,0,17,7,0,120,1,12,0,0,0,11,182,1,40,48,40,19,9,37, +1,43,53,0,0,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,67,0, +221,0,0,0,21,180,2,38,17,38,2,184,255,228,180,39,42,17,27,37,1,43,53,0,43, +53,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,116,1,112,0,0, +0,19,64,11,2,38,17,38,2,84,38,41,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0, +87,255,236,4,24,5,211,18,38,0,72,0,0,17,7,1,71,0,245,0,0,0,19,64,11,2,39, +17,38,2,8,44,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,24, +5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3,2,4,42, +40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,10,0,0,1,178,5,228,18,38, +0,241,0,0,17,6,0,67,160,0,0,21,180,1,4,17,38,1,184,255,194,180,5,8,0,2,37, +1,43,53,0,43,53,0,0,0,255,255,0,135,0,0,2,47,5,228,18,38,0,241,0,0,17,6,0, +116,63,0,0,19,64,11,1,4,17,38,1,63,4,7,0,2,37,1,43,53,0,43,53,0,255,255,255, +211,0,0,2,105,5,211,18,38,0,241,0,0,17,6,1,71,211,0,0,19,64,11,1,5,17,38, +1,2,10,4,0,2,37,1,43,53,0,43,53,0,255,255,0,8,0,0,2,53,5,123,18,38,0,241, +0,0,17,6,0,105,219,0,0,23,64,13,2,1,4,17,38,2,1,2,8,6,0,2,37,1,43,53,53,0, +43,53,53,0,0,2,0,86,255,236,4,39,5,234,0,39,0,57,0,190,64,94,100,51,1,100, +56,1,107,42,1,107,48,1,10,14,26,14,2,37,17,53,17,69,17,3,6,8,22,8,2,23,26, +29,3,50,15,28,31,28,2,28,28,50,35,71,40,64,19,16,13,3,40,17,64,14,19,72,22, +5,17,17,5,144,40,1,144,40,160,40,2,40,59,128,50,71,31,5,1,5,26,19,29,16,4, +17,27,27,22,45,80,13,80,10,1,10,184,255,192,64,28,7,10,72,82,17,1,36,17,52, +17,68,17,3,2,17,18,17,2,10,17,10,17,22,0,53,80,0,22,0,63,237,63,57,57,47, +47,93,93,93,43,93,51,237,17,51,47,18,23,57,1,47,93,237,26,16,204,93,113,17, +57,47,18,57,43,18,23,57,26,16,237,17,57,47,93,18,23,57,49,48,0,93,93,1,93, +0,93,93,93,93,5,34,46,2,53,52,62,2,51,50,22,23,46,1,39,5,53,55,46,1,39,51, +30,1,23,37,15,1,30,3,29,1,20,14,2,19,52,46,2,35,34,14,2,21,20,22,51,50,62, +2,2,54,125,181,118,56,52,116,186,133,71,117,43,43,115,76,254,211,218,56,120, +66,209,45,83,42,1,50,1,211,81,129,88,47,57,120,188,176,33,71,113,80,81,115, +73,33,144,145,81,118,75,36,20,73,132,185,111,107,182,134,75,32,27,86,176, +69,133,114,94,45,78,35,20,51,31,132,112,92,74,176,200,223,121,6,122,196,138, +74,1,245,94,137,90,44,45,92,137,91,190,178,44,90,139,0,255,255,0,140,0,0, +3,242,5,189,18,38,0,81,4,0,17,7,1,78,0,245,0,0,0,19,64,11,1,38,17,38,1,5, +47,61,19,36,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,228,18,38, +0,82,0,0,17,7,0,67,0,223,0,0,0,21,180,2,35,17,38,2,184,255,228,180,36,39, +8,0,37,1,43,53,0,43,53,0,255,255,0,86,255,236,4,29,5,228,18,38,0,82,0,0,17, +7,0,116,1,103,0,0,0,19,64,11,2,35,17,38,2,73,35,38,8,0,37,1,43,53,0,43,53, +0,0,0,255,255,0,86,255,236,4,29,5,211,18,38,0,82,0,0,17,7,1,71,0,240,0,0, +0,19,64,11,2,36,17,38,2,1,41,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86, +255,236,4,29,5,189,18,38,0,82,0,0,17,7,1,78,0,247,0,0,0,19,64,11,2,35,17, +38,2,13,44,58,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,123, +18,38,0,82,0,0,17,7,0,105,0,250,0,0,0,23,64,13,3,2,35,17,38,3,2,4,39,37,8, +0,37,1,43,53,53,0,43,53,53,0,0,0,0,3,0,65,0,223,4,36,4,117,0,3,0,7,0,11,0, +75,64,48,3,11,171,0,8,8,4,128,6,160,6,2,95,6,1,32,6,1,6,63,4,95,4,111,4,3, +4,9,174,64,8,144,8,2,8,4,173,5,0,174,79,1,159,1,2,1,5,179,0,63,222,93,237, +16,253,222,93,237,1,47,93,47,93,93,93,18,57,47,51,237,50,49,48,1,53,51,21, +1,53,33,21,1,53,51,21,1,222,168,253,187,3,227,253,186,168,3,190,183,183,254, +162,146,146,254,127,183,183,0,0,3,0,44,255,218,4,180,4,92,0,22,0,34,0,45, +0,161,64,93,117,33,133,33,2,117,27,133,27,2,122,38,138,38,2,122,44,138,44, +2,150,16,1,66,16,1,77,5,1,68,21,1,75,10,1,27,38,35,0,71,64,15,23,207,23,2, +159,23,175,23,255,23,3,23,47,128,35,71,0,12,1,0,12,16,12,32,12,64,12,240, +12,5,7,12,144,47,160,47,240,47,3,224,47,1,223,47,1,0,47,32,47,2,47,184,255, +192,64,16,13,21,72,37,26,30,41,80,18,14,16,30,80,7,3,22,0,63,51,237,63,51, +237,17,57,57,1,43,93,93,93,113,47,94,93,113,237,26,16,220,93,113,26,237,18, +57,57,49,48,93,93,0,93,93,93,93,1,93,93,0,93,1,16,2,35,34,38,39,7,35,55,46, +1,53,16,33,50,22,23,55,51,7,30,1,7,52,38,39,1,30,1,51,50,62,2,37,20,23,1, +46,1,35,34,14,2,4,88,250,238,97,156,60,100,167,184,41,42,1,229,103,156,57, +91,167,173,42,39,189,12,11,254,29,38,105,62,69,112,78,42,253,179,24,1,226, +37,104,66,69,111,78,41,2,30,254,228,254,234,48,50,116,214,68,182,116,2,48, +46,45,105,201,69,185,119,68,109,44,253,206,49,39,39,98,166,126,130,85,2,49, +45,36,41,99,164,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0, +67,0,236,0,0,0,21,180,1,38,17,38,1,184,255,236,180,39,42,36,19,37,1,43,53, +0,43,53,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0,116,1,87, +0,0,0,19,64,11,1,38,17,38,1,53,38,41,36,19,37,1,43,53,0,43,53,0,0,0,255,255, +0,139,255,236,3,241,5,211,18,38,0,88,6,0,17,7,1,71,0,239,0,0,0,21,180,1,39, +17,38,1,184,255,252,180,44,38,36,19,37,1,43,53,0,43,53,0,255,255,0,139,255, +236,3,241,5,123,18,38,0,88,6,0,17,7,0,105,0,237,0,0,0,25,182,2,1,38,17,38, +2,1,184,255,243,180,42,40,36,19,37,1,43,53,53,0,43,53,53,0,255,255,0,5,254, +87,3,252,5,228,18,38,0,92,0,0,17,7,0,116,1,27,0,0,0,19,64,11,1,32,17,38,1, +54,32,35,17,31,37,1,43,53,0,43,53,0,0,0,0,2,0,138,254,87,4,29,5,204,0,34, +0,54,0,109,64,76,102,52,118,52,2,105,38,121,38,2,73,25,89,25,2,70,10,86,10, +2,25,21,41,21,137,21,153,21,4,22,15,38,15,134,15,150,15,4,18,71,64,160,35, +1,35,56,128,45,7,33,70,0,34,16,34,48,34,240,34,4,8,34,33,27,26,50,80,23,22, +7,40,80,13,16,0,0,0,63,63,237,50,63,237,50,63,1,47,94,93,237,50,50,26,16, +220,93,26,237,49,48,0,93,93,93,93,93,93,19,51,17,20,6,7,6,7,51,62,3,51,50, +30,2,21,20,14,2,35,34,38,39,35,30,3,21,17,35,1,52,46,2,35,34,14,2,21,20,30, +2,51,50,62,2,138,180,1,1,1,1,6,25,64,82,101,63,112,153,93,40,40,93,153,112, +116,174,46,5,1,1,1,1,180,2,214,24,59,98,74,60,106,79,46,38,73,108,70,75,99, +59,24,5,204,254,89,30,55,21,25,22,52,73,47,21,80,145,205,125,123,208,150, +85,88,100,2,32,48,59,29,254,89,3,199,100,156,108,56,34,96,169,135,115,159, +98,43,58,110,159,255,255,0,5,254,87,3,252,5,123,18,38,0,92,0,0,17,7,0,105, +0,187,0,0,0,25,182,2,1,32,17,38,2,1,184,255,254,180,36,34,17,31,37,1,43,53, +53,0,43,53,53,0,255,255,0,4,0,0,5,82,6,161,18,38,0,36,0,0,17,7,1,73,1,104, +1,78,0,19,64,11,2,21,5,38,2,2,22,21,4,7,37,1,43,53,0,43,53,0,0,0,255,255, +0,87,255,236,4,115,5,83,18,38,0,68,0,0,17,7,1,73,0,233,0,0,0,21,180,2,66, +17,38,2,184,255,202,180,67,66,3,36,37,1,43,53,0,43,53,0,255,255,0,4,0,0,5, +82,6,243,18,38,0,36,0,0,17,7,2,155,1,121,0,0,0,19,64,11,2,21,5,38,2,3,26, +34,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,115,5,230,18,38,0, +68,0,0,17,7,1,74,1,7,0,0,0,21,180,2,66,17,38,2,184,255,204,180,71,83,3,36, +37,1,43,53,0,43,53,0,255,255,0,4,254,96,5,99,5,129,18,38,0,36,0,0,17,7,1, +77,3,181,0,11,0,13,185,0,2,255,207,180,33,33,7,7,37,43,53,0,255,255,0,87, +254,85,4,115,4,78,18,38,0,68,0,0,17,7,1,77,2,197,0,0,0,13,185,0,2,255,194, +180,78,78,36,36,37,43,53,0,255,255,0,104,255,236,5,121,6,240,18,38,0,38,0, +0,17,7,2,149,2,83,0,0,0,19,64,11,1,40,5,38,1,126,40,43,26,16,37,1,43,53,0, +43,53,0,0,0,255,255,0,87,255,236,3,202,5,228,18,38,0,70,0,0,17,7,0,116,1, +103,0,0,0,19,64,11,1,40,17,38,1,114,40,43,19,9,37,1,43,53,0,43,53,0,0,0,255, +255,0,104,255,236,5,121,6,254,18,38,0,38,0,0,17,7,2,150,1,204,0,0,0,19,64, +11,1,41,5,38,1,38,46,40,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236, +3,202,5,211,18,38,0,70,0,0,17,7,1,71,0,208,0,0,0,19,64,11,1,41,17,38,1,10, +46,40,19,9,37,1,43,53,0,43,53,0,0,0,255,255,0,104,255,236,5,121,6,241,18, +38,0,38,0,0,17,7,1,75,2,34,1,37,0,19,64,11,1,40,5,38,1,39,40,42,26,16,37, +1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,204,18,38,0,70,0,0,17, +7,1,75,1,44,0,0,0,11,182,1,17,40,42,19,9,37,1,43,53,0,0,0,255,255,0,104,255, +236,5,121,6,254,18,38,0,38,0,0,17,7,2,151,1,204,0,0,0,19,64,11,1,40,5,38, +1,38,42,48,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,211, +18,38,0,70,0,0,17,7,1,72,0,214,0,0,0,19,64,11,1,40,17,38,1,16,42,48,19,9, +37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,5,101,6,254,18,38,0,39,0,0,17, +7,2,151,1,102,0,0,0,21,180,2,26,5,38,2,184,255,171,180,28,34,6,0,37,1,43, +53,0,43,53,0,255,255,0,86,255,236,4,255,5,204,16,38,0,71,0,0,17,7,2,146,3, +186,0,75,0,18,64,10,2,61,0,2,83,61,61,19,19,37,1,43,53,0,63,53,255,255,0, +14,0,0,5,101,5,129,18,6,0,144,0,0,0,2,0,86,255,236,4,109,5,204,0,39,0,59, +0,146,64,86,85,42,101,42,2,90,58,106,58,2,57,1,73,1,2,54,10,70,10,2,9,4,25, +4,121,4,137,4,4,6,7,22,7,118,7,134,7,4,25,27,70,64,20,6,0,21,50,3,18,61,128, +40,71,31,6,1,6,63,61,1,143,61,1,33,21,27,19,81,24,15,20,1,239,20,255,20,2, +20,20,8,22,0,11,55,80,8,184,255,192,64,10,9,13,72,8,16,0,45,80,3,22,0,63, +237,50,63,43,237,50,63,18,57,47,93,113,51,237,50,63,1,93,114,47,93,237,26, +16,220,23,50,17,57,26,237,50,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17, +16,33,50,22,23,51,52,46,1,52,61,1,33,53,33,53,51,21,51,21,35,17,20,30,2,23, +35,46,3,53,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,3,53,50,165,122,205, +193,1,142,123,164,50,2,1,1,254,212,1,44,180,132,132,1,2,2,1,172,2,3,3,2,253, +218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64,31,174,104,90,1,20,1,24, +2,54,90,98,10,43,47,42,9,141,131,147,147,131,252,41,39,72,60,43,9,10,37,48, +53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102,163,0,0,255, +255,0,168,0,0,4,254,6,161,18,38,0,40,0,0,17,7,1,73,1,122,1,78,0,21,180,1, +12,5,38,1,184,255,237,180,13,12,0,10,37,1,43,53,0,43,53,0,255,255,0,87,255, +236,4,24,5,83,18,38,0,72,0,0,17,7,1,73,0,245,0,0,0,19,64,11,2,38,17,38,2, +3,39,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,243,18,38, +0,40,0,0,17,7,2,155,1,137,0,0,0,21,180,1,12,5,38,1,184,255,235,180,17,25, +0,10,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,230,18,38,0,72,0,0, +17,7,1,74,1,16,0,0,0,19,64,11,2,38,17,38,2,2,43,55,17,27,37,1,43,53,0,43, +53,0,0,0,255,255,0,168,0,0,4,254,6,241,18,38,0,40,0,0,17,7,1,75,1,201,1,37, +0,21,180,1,12,5,38,1,184,255,236,180,12,14,0,10,37,1,43,53,0,43,53,0,255, +255,0,87,255,236,4,24,5,204,18,38,0,72,0,0,17,7,1,75,1,68,0,0,0,12,182,2, +2,38,40,17,27,37,1,43,53,0,0,0,255,255,0,168,254,85,4,254,5,129,18,38,0,40, +0,0,17,7,1,77,3,80,0,0,0,13,185,0,1,255,194,180,24,24,11,11,37,43,53,0,255, +255,0,87,254,85,4,24,4,78,18,38,0,72,0,0,17,7,1,77,1,125,0,0,0,13,185,0,2, +254,242,180,50,50,9,9,37,43,53,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40, +0,0,17,7,2,151,1,111,0,0,0,21,180,1,12,5,38,1,184,255,231,180,14,20,0,10, +37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,211,18,38,0,72,0,0,17,7, +1,72,0,234,0,0,0,21,180,2,38,17,38,2,184,255,254,180,40,46,17,27,37,1,43, +53,0,43,53,0,255,255,0,103,255,236,5,160,6,254,18,38,0,42,0,0,17,7,2,150, +1,219,0,0,0,19,64,11,1,47,5,38,1,34,52,46,0,35,37,1,43,53,0,43,53,0,0,0,255, +255,0,86,254,87,3,239,5,211,18,38,0,74,0,0,17,7,1,71,0,216,0,0,0,19,64,11, +2,71,17,38,2,0,76,70,26,41,37,1,43,53,0,43,53,0,0,0,255,255,0,103,255,236, +5,160,6,243,18,38,0,42,0,0,17,7,2,155,1,246,0,0,0,19,64,11,1,46,5,38,1,39, +51,59,0,35,37,1,43,53,0,43,53,0,0,0,255,255,0,86,254,87,3,239,5,230,18,38, +0,74,0,0,17,7,1,74,0,249,0,0,0,19,64,11,2,70,17,38,2,0,75,87,26,41,37,1,43, +53,0,43,53,0,0,0,255,255,0,103,255,236,5,160,6,241,18,38,0,42,0,0,17,7,1, +75,2,53,1,37,0,19,64,11,1,46,5,38,1,39,46,48,0,35,37,1,43,53,0,43,53,0,0, +0,255,255,0,86,254,87,3,239,5,204,18,38,0,74,0,0,17,7,1,75,1,45,0,0,0,11, +182,2,0,70,72,26,41,37,1,43,53,0,0,0,255,255,0,103,254,78,5,160,5,150,18, +38,0,42,0,0,17,7,2,140,2,78,0,0,0,11,182,1,46,50,46,0,35,37,1,43,53,0,0,0, +255,255,0,86,254,87,3,239,6,32,16,38,0,74,0,0,17,7,2,147,1,56,0,0,0,21,180, +2,79,17,38,2,184,255,252,180,70,74,26,41,37,1,43,53,0,43,53,0,255,255,0,168, +0,0,5,32,6,254,18,38,0,43,0,0,17,7,2,150,1,153,0,0,0,19,64,11,1,13,5,38,1, +0,18,12,4,10,37,1,43,53,0,43,53,0,0,0,255,255,0,142,0,0,3,238,7,62,18,38, +0,75,0,0,17,7,2,150,0,242,0,64,0,21,180,1,35,2,38,1,184,255,255,180,40,34, +25,10,37,1,43,53,0,43,53,0,0,2,0,14,0,0,5,185,5,129,0,19,0,23,0,166,64,72, +23,11,3,90,8,7,4,4,20,4,2,7,4,16,15,19,90,20,12,59,0,1,4,0,1,56,164,0,1,155, +0,1,68,0,1,244,0,1,235,0,1,68,0,148,0,2,224,0,1,2,0,0,48,0,112,0,208,0,4, +7,0,32,25,1,160,25,176,25,192,25,3,25,184,255,192,64,36,14,17,72,47,25,1, +22,18,6,95,15,11,80,7,96,7,2,7,2,95,64,23,1,160,23,208,23,2,23,23,13,9,3, +4,0,18,0,63,50,63,51,57,47,93,113,237,220,93,50,50,237,50,50,1,93,43,93,113, +47,94,93,95,93,113,113,113,114,114,114,94,93,93,51,51,237,50,50,47,94,93, +51,51,237,50,50,49,48,33,17,33,17,35,17,35,53,51,53,51,21,33,53,51,21,51, +21,35,17,3,53,33,21,4,102,253,1,191,154,154,191,2,255,186,153,153,186,253, +1,2,141,253,115,4,1,154,230,230,230,230,154,251,255,3,45,212,212,0,1,0,10, +0,0,3,238,5,204,0,41,0,150,185,0,7,255,232,64,66,9,13,72,0,7,16,7,2,7,33, +24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,32,36,24,70,29,28,192,25,1, +0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240,43, +2,255,43,1,112,43,1,43,184,255,192,64,19,19,23,72,35,27,81,32,28,28,5,30, +0,25,11,21,0,18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63, +18,57,47,51,237,50,1,43,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16, +220,93,113,26,237,18,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52, +46,2,35,34,14,2,21,17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61, +30,70,84,100,62,104,133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180, +1,44,254,212,2,3,2,1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69, +35,46,84,120,75,253,170,4,182,131,147,147,131,148,33,66,56,39,7,255,255,255, +184,0,0,2,133,7,6,18,38,0,44,0,0,17,6,2,153,207,0,0,19,64,11,1,4,5,38,1,2, +13,27,0,2,37,1,43,53,0,43,53,0,255,255,255,184,0,0,2,133,5,189,18,38,0,241, +0,0,17,6,1,78,207,0,0,19,64,11,1,4,17,38,1,2,13,27,0,2,37,1,43,53,0,43,53, +0,255,255,0,12,0,0,2,49,6,161,18,38,0,44,0,0,17,7,1,73,255,217,1,78,0,19, +64,11,1,4,5,38,1,2,5,4,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0,12,0,0,2,49, +5,83,18,38,0,241,0,0,17,6,1,73,217,0,0,19,64,11,1,4,17,38,1,2,5,4,0,2,37, +1,43,53,0,43,53,0,255,255,255,210,0,0,2,108,6,243,18,38,0,44,0,0,17,6,2,155, +234,0,0,19,64,11,1,4,5,38,1,2,9,17,0,2,37,1,43,53,0,43,53,0,255,255,255,210, +0,0,2,108,5,230,18,38,0,241,0,0,17,6,1,74,245,0,0,19,64,11,1,4,17,38,1,3, +9,21,0,2,37,1,43,53,0,43,53,0,255,255,0,92,254,85,1,186,5,129,18,38,0,44, +0,0,17,6,1,77,12,0,0,10,182,1,0,16,16,3,3,37,43,53,0,0,255,255,0,31,254,85, +1,125,5,204,18,38,0,76,0,0,17,6,1,77,207,0,0,15,64,10,23,22,1,2,0,20,20,7, +7,37,43,53,93,0,255,255,0,189,0,0,1,124,6,241,18,38,0,44,0,0,17,7,1,75,0, +39,1,37,0,19,64,11,1,4,5,38,1,0,4,6,0,2,37,1,43,53,0,43,53,0,0,0,0,1,0,194, +0,0,1,118,4,58,0,3,1,137,64,24,3,70,4,0,36,0,2,9,0,0,4,5,52,5,1,0,5,16,5, +32,5,3,229,5,184,255,192,64,55,225,228,72,240,5,1,228,5,1,176,5,192,5,208, +5,3,132,5,148,5,164,5,3,64,5,1,52,5,1,0,5,16,5,32,5,3,212,5,228,5,244,5,3, +144,5,1,116,5,132,5,2,96,5,1,5,184,255,192,64,22,193,196,72,224,5,1,196,5, +212,5,2,176,5,1,20,5,36,5,52,5,3,5,184,255,192,183,182,185,72,0,5,1,175,5, +184,255,192,179,171,174,72,5,184,255,192,182,161,167,72,128,5,1,5,184,255, +192,64,38,150,156,72,208,5,1,100,5,116,5,164,5,180,5,196,5,5,32,5,1,4,5,20, +5,2,4,5,20,5,180,5,196,5,244,5,5,117,5,184,255,192,179,121,124,72,5,184,255, +192,179,110,113,72,5,184,255,192,64,24,99,102,72,224,5,1,180,5,196,5,212, +5,3,48,5,1,4,5,20,5,36,5,3,5,184,255,192,183,67,70,72,11,5,1,62,5,184,255, +192,64,9,56,59,72,203,5,219,5,2,5,184,255,192,64,42,45,48,72,27,5,43,5,2, +196,5,212,5,228,5,3,107,5,123,5,2,64,5,1,2,16,5,32,5,48,5,3,191,5,207,5,2, +32,5,64,5,2,5,184,255,192,64,13,13,16,72,15,5,31,5,2,7,1,15,0,21,0,63,63, +1,94,93,43,93,93,113,95,113,113,113,114,43,114,43,94,93,43,113,113,113,113, +43,43,43,94,93,113,113,113,113,43,114,43,43,94,93,43,93,93,93,93,43,113,113, +113,113,114,114,114,114,114,114,114,43,94,93,93,17,18,57,47,94,93,237,49, +48,51,17,51,17,194,180,4,58,251,198,0,0,0,255,255,0,170,255,236,5,73,5,129, +16,38,0,44,237,0,16,7,0,45,1,225,0,0,255,255,0,137,254,87,3,3,5,204,16,38, +0,76,0,0,17,7,0,77,1,198,0,0,0,30,64,18,3,2,111,8,1,48,8,1,16,8,1,8,1,0,16, +0,1,0,17,93,53,53,17,93,93,93,53,53,255,255,0,32,255,236,3,205,6,254,18,38, +0,45,0,0,17,7,2,150,1,55,0,0,0,19,64,11,1,23,5,38,1,190,28,22,3,16,37,1,43, +53,0,43,53,0,0,0,0,2,255,153,254,87,2,47,5,211,0,19,0,29,1,148,64,25,150, +29,166,29,2,152,28,168,28,2,3,18,24,12,16,72,18,40,8,11,72,164,21,1,21,184, +255,192,64,49,11,15,72,21,251,26,1,59,26,1,26,64,12,15,72,36,26,1,26,15,70, +12,3,3,4,12,20,12,36,12,68,12,4,7,12,12,31,30,144,31,1,2,0,31,16,31,2,219, +31,184,255,192,64,9,223,227,72,31,64,210,213,72,31,184,255,192,64,51,205, +209,72,143,31,1,64,31,80,31,2,95,31,111,31,239,31,255,31,4,32,31,48,31,64, +31,3,144,31,160,31,224,31,240,31,4,79,31,1,0,31,1,160,175,31,191,31,207,31, +3,31,184,255,192,64,57,147,150,72,239,31,1,176,31,192,31,208,31,3,95,31,1, +32,31,1,31,31,47,31,63,31,143,31,191,31,207,31,6,0,31,1,111,239,31,1,208, +31,1,63,31,1,111,31,143,31,159,31,175,31,255,31,5,31,184,255,192,64,101,79, +82,72,223,31,1,144,31,160,31,176,31,3,47,31,63,31,79,31,3,0,31,1,61,31,64, +53,56,72,112,31,128,31,144,31,176,31,4,15,31,31,31,2,255,31,1,31,64,35,38, +72,144,31,1,79,31,1,255,31,1,112,31,128,31,192,31,208,31,224,31,5,31,31,1, +24,142,64,28,148,26,128,22,22,15,26,47,26,63,26,127,26,239,26,5,26,13,15, +7,80,0,27,0,63,237,63,47,93,51,47,26,16,253,26,237,1,93,93,93,113,113,43, +113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93,93,113,113,113,113, +43,114,94,93,93,93,113,113,114,114,43,43,43,94,93,95,93,17,18,57,47,94,93, +51,47,16,237,47,93,43,93,113,204,43,93,49,48,0,43,43,1,95,93,93,19,34,38, +39,53,30,1,51,50,62,2,53,17,51,17,20,14,2,1,21,35,39,35,7,35,53,19,51,77, +34,65,28,13,36,13,38,49,28,10,180,21,54,93,1,154,105,219,2,232,104,234,204, +254,87,4,5,139,2,4,20,43,67,46,4,165,251,64,62,106,78,45,6,110,20,169,169, +20,1,14,0,255,255,0,168,254,78,5,63,5,129,18,38,0,46,0,0,17,7,2,140,1,221, +0,0,0,14,185,0,1,255,205,180,16,12,4,11,37,1,43,53,255,255,0,138,254,78,4, +3,5,204,18,38,0,78,0,0,17,7,2,140,1,78,0,0,0,14,185,0,1,255,235,180,16,12, +4,11,37,1,43,53,0,1,0,138,0,0,4,3,4,58,0,11,0,166,64,72,123,1,1,116,7,1,86, +9,102,9,2,123,0,139,0,155,0,3,89,0,105,0,2,67,10,1,58,2,1,42,9,1,155,8,1, +122,8,138,8,2,44,8,1,1,10,8,10,9,16,112,9,128,9,144,9,3,9,9,0,11,16,80,11, +1,144,11,208,11,240,11,3,11,184,255,192,64,40,7,11,72,11,7,3,70,0,4,16,4, +48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2,1,7,10,4,8,8,5,15,4,0,21, +0,63,50,63,51,17,23,57,1,93,93,47,94,93,237,50,47,43,93,113,56,51,57,47,93, +56,57,51,17,51,49,48,93,93,93,93,0,93,1,93,93,93,93,0,93,1,93,33,1,7,17,35, +17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73,1,206,1,238,108, +254,126,4,58,253,243,2,13,254,47,253,151,0,0,0,255,255,0,168,0,0,4,47,6,240, +18,38,0,47,0,0,17,7,2,149,0,173,0,0,0,21,180,1,6,5,38,1,184,255,94,180,6, +9,0,4,37,1,43,53,0,43,53,0,255,255,0,91,0,0,2,3,7,62,18,38,0,79,0,0,17,6, +2,149,19,78,0,19,64,11,1,4,2,38,1,75,4,7,0,2,37,1,43,53,0,43,53,0,255,255, +0,168,254,78,4,47,5,129,18,38,0,47,0,0,17,7,2,140,1,133,0,0,0,14,185,0,1, +255,253,180,10,6,0,4,37,1,43,53,255,255,0,126,254,78,1,71,5,204,18,38,0,79, +0,0,17,6,2,140,255,0,0,14,185,0,1,255,255,180,8,4,0,2,37,1,43,53,0,0,255, +255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,2,146,2,21,0,0,0,18,64,10,1, +15,3,1,138,10,6,0,4,37,1,43,53,0,63,53,255,255,0,138,0,0,2,105,5,204,16,38, +0,79,0,0,17,7,2,146,1,36,0,75,0,65,64,16,16,64,29,29,72,16,64,22,22,72,16, +64,18,18,72,16,184,255,192,179,17,17,72,16,184,255,192,64,12,16,16,72,16, +64,11,11,72,1,13,0,1,184,1,32,180,8,4,0,2,37,1,43,53,0,63,53,1,43,43,43,43, +43,43,0,255,255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,1,75,1,213,253,143, +0,11,182,1,95,6,8,0,4,37,1,43,53,0,0,0,255,255,0,138,0,0,2,146,5,204,16,38, +0,79,0,0,17,7,1,75,1,66,253,143,0,14,185,0,1,1,84,180,4,6,0,2,37,1,43,53, +0,1,0,20,0,0,4,47,5,129,0,13,0,119,64,49,121,0,137,0,2,100,8,116,8,132,8, +3,86,8,1,134,8,1,86,7,1,134,7,1,12,2,90,9,5,16,3,1,0,3,32,3,64,3,96,3,128, +3,208,3,240,3,7,3,12,184,255,224,179,19,22,72,9,184,255,224,64,24,19,22,72, +6,1,9,12,4,16,7,1,7,0,13,1,13,13,5,10,3,2,95,5,18,0,63,237,63,18,57,47,93, +205,93,23,57,43,43,1,47,93,113,47,51,237,50,49,48,113,114,113,114,0,93,93, +1,5,17,33,21,33,17,7,53,55,17,51,17,37,2,104,254,255,2,200,252,121,148,148, +191,1,1,3,29,149,254,20,156,2,26,85,158,85,2,201,253,165,148,0,1,0,16,0,0, +1,186,5,204,0,11,0,102,64,42,39,3,1,39,2,1,8,7,11,70,4,2,0,0,16,0,32,0,64, +0,4,7,0,0,12,13,255,13,1,112,13,128,13,192,13,208,13,4,31,13,1,4,184,255, +224,64,23,18,22,72,10,32,18,22,72,1,10,4,7,4,2,79,8,1,8,8,5,0,0,21,0,63,63, +57,47,93,205,23,57,43,43,1,93,93,93,17,18,57,47,94,93,51,51,237,50,50,49, +48,113,113,51,17,7,53,55,17,51,17,55,21,7,17,138,122,122,180,124,124,2,30, +68,158,68,3,16,253,88,72,159,71,253,122,255,255,0,168,0,0,5,32,6,240,18,38, +0,49,0,0,17,7,2,149,2,17,0,0,0,19,64,11,1,20,5,38,1,73,20,23,8,18,37,1,43, +53,0,43,53,0,0,0,255,255,0,140,0,0,3,242,5,228,18,38,0,81,4,0,17,7,0,116, +1,132,0,0,0,19,64,11,1,38,17,38,1,97,38,41,19,36,37,1,43,53,0,43,53,0,0,0, +255,255,0,168,254,78,5,32,5,129,18,38,0,49,0,0,17,7,2,140,1,252,0,0,0,14, +185,0,1,255,252,180,24,20,8,18,37,1,43,53,255,255,0,140,254,78,3,242,4,78, +18,38,0,81,4,0,17,7,2,140,1,91,0,0,0,11,182,1,0,42,38,19,36,37,1,43,53,0, +0,0,255,255,0,168,0,0,5,32,6,254,18,38,0,49,0,0,17,7,2,151,1,147,0,0,0,21, +180,1,20,5,38,1,184,255,250,180,22,28,8,18,37,1,43,53,0,43,53,0,255,255,0, +140,0,0,3,242,5,211,18,38,0,81,4,0,17,7,1,72,0,242,0,0,0,21,180,1,38,17,38, +1,184,255,254,180,40,46,19,36,37,1,43,53,0,43,53,0,255,255,255,254,0,0,4, +80,5,129,16,38,0,81,98,0,16,7,2,3,255,127,0,0,0,1,0,165,255,236,5,52,5,149, +0,55,0,162,64,16,154,53,1,149,7,165,7,2,131,41,147,41,163,41,3,48,184,255, +232,179,12,15,72,47,184,255,216,64,91,12,15,72,42,54,58,54,154,54,170,54, +4,6,143,5,159,5,175,5,3,5,5,51,39,26,90,0,27,16,27,64,27,3,27,51,90,0,14, +64,14,80,14,112,14,160,14,176,14,6,48,14,80,14,144,14,240,14,4,224,14,1,143, +14,159,14,175,14,3,0,14,48,14,2,7,14,39,20,95,45,4,33,3,26,18,9,95,0,6,6, +0,19,0,63,50,47,16,237,63,63,63,237,50,1,47,94,93,93,93,113,114,237,47,93, +237,50,17,57,47,93,51,49,48,0,93,43,1,43,0,93,93,93,5,34,46,2,39,55,30,1, +51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51, +62,3,51,50,30,2,21,17,20,14,2,3,173,56,96,79,63,24,127,37,100,59,64,78,41, +13,39,81,127,87,94,163,121,70,191,1,1,1,1,184,1,3,2,1,4,34,103,130,153,86, +124,177,112,53,30,86,152,20,24,40,54,30,115,45,65,58,107,153,95,1,66,108, +154,98,46,62,105,139,77,252,133,4,68,37,92,90,76,22,22,63,69,69,28,61,101, +70,39,64,133,204,139,254,165,130,208,146,78,0,0,0,0,1,0,140,254,87,3,242, +4,78,0,53,0,135,64,18,121,52,137,52,2,90,52,106,52,2,43,52,59,52,75,52,3, +46,184,255,232,64,74,9,12,72,3,46,19,46,2,3,3,24,49,70,64,160,12,1,96,12, +208,12,2,31,12,1,175,12,1,12,55,128,37,24,70,160,25,176,25,2,0,25,192,25, +208,25,3,0,25,16,25,32,25,64,25,224,25,240,25,6,7,25,37,18,80,43,16,31,15, +24,21,7,80,0,27,0,63,237,63,63,63,237,50,1,47,94,93,113,114,237,50,26,16, +220,93,113,113,114,26,237,17,57,47,49,48,93,43,0,93,93,93,1,34,38,39,53,30, +1,51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51, +62,3,51,50,30,2,21,17,20,14,2,3,1,34,65,28,13,36,13,38,49,28,10,23,52,85, +63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90,130,84,39,22, +54,93,254,87,4,5,139,2,4,20,43,67,46,3,25,79,106,65,27,45,85,125,81,253,141, +3,83,34,75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,252,169,62,106, +78,45,0,0,0,255,255,0,97,255,236,5,215,6,161,18,38,0,50,0,0,17,7,1,73,1,214, +1,78,0,19,64,11,2,40,5,38,2,0,41,40,10,0,37,1,43,53,0,43,53,0,0,0,255,255, +0,86,255,236,4,29,5,83,18,38,0,82,0,0,17,7,1,73,0,244,0,0,0,19,64,11,2,35, +17,38,2,0,36,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6, +243,18,38,0,50,0,0,17,7,2,155,1,231,0,0,0,19,64,11,2,40,5,38,2,0,45,53,10, +0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,230,18,38,0,82,0,0, +17,7,1,74,1,16,0,0,0,19,64,11,2,35,17,38,2,0,40,52,8,0,37,1,43,53,0,43,53, +0,0,0,255,255,0,97,255,236,5,215,6,241,18,38,0,50,0,0,17,7,2,154,1,226,0, +0,0,23,64,13,3,2,40,5,38,3,2,93,40,49,10,0,37,1,43,53,53,0,43,53,53,0,0,0, +255,255,0,86,255,236,4,34,5,228,18,38,0,82,0,0,17,7,1,79,1,9,0,0,0,23,64, +13,3,2,35,17,38,3,2,103,35,44,8,0,37,1,43,53,53,0,43,53,53,0,0,0,0,2,0,97, +255,246,7,166,5,140,0,30,0,49,0,170,64,119,137,13,1,102,13,1,105,12,1,86, +48,1,89,42,1,84,8,132,8,2,4,47,20,47,84,47,3,11,43,27,43,91,43,3,0,20,24, +28,90,34,0,26,32,26,48,26,3,26,22,26,22,29,15,34,47,34,79,34,3,63,34,95,34, +127,34,159,34,207,34,239,34,6,34,64,31,38,72,34,16,29,32,29,2,29,45,91,32, +10,1,15,10,31,10,2,10,127,51,1,27,95,24,24,21,29,95,30,18,22,95,21,3,40,95, +15,4,31,95,5,19,0,63,237,63,237,63,237,63,237,17,57,47,237,1,93,47,93,93, +237,47,93,47,43,93,113,18,57,57,47,47,93,16,237,50,57,57,49,48,0,93,93,93, +93,93,1,93,0,93,93,33,14,3,35,34,36,38,2,53,52,18,54,36,51,50,30,2,23,33, +21,33,17,33,21,33,17,33,21,37,50,54,55,17,46,2,34,35,34,14,2,21,20,30,2,3, +231,20,51,57,57,25,169,254,253,175,89,94,178,1,2,164,26,58,57,52,19,3,146, +252,221,2,231,253,25,3,76,251,111,32,76,26,11,32,37,37,15,125,187,125,63, +64,126,186,3,3,3,1,106,191,1,9,159,165,1,7,183,98,2,3,4,2,156,254,60,154, +254,21,156,145,2,2,4,87,1,2,1,74,142,206,131,129,209,148,80,0,3,0,86,255, +236,7,50,4,78,0,39,0,59,0,68,0,190,64,131,132,7,1,102,7,118,7,2,97,2,1,85, +2,1,90,66,106,66,2,108,61,1,90,61,1,69,58,85,58,101,58,3,69,52,85,52,101, +52,3,74,48,90,48,106,48,3,74,42,90,42,106,42,3,8,73,9,9,38,71,64,31,60,47, +60,63,60,3,144,60,1,60,70,128,17,30,68,0,71,144,40,1,32,40,1,40,50,71,25, +0,80,68,68,5,63,80,33,16,116,30,132,30,2,123,17,139,17,2,30,17,20,45,80,28, +16,55,80,20,22,5,80,14,239,8,1,128,8,1,8,8,14,22,0,63,51,47,93,93,16,237, +63,237,63,237,18,57,57,93,93,63,237,18,57,47,237,1,47,237,47,93,114,237,50, +57,57,26,16,220,93,113,26,237,50,47,237,49,48,0,93,93,93,93,93,93,93,93,93, +93,93,1,20,30,2,51,50,54,55,23,14,3,35,34,38,39,14,1,35,34,46,2,53,16,18, +51,32,23,62,1,51,50,30,2,29,1,37,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2, +37,46,1,35,34,14,2,7,4,46,35,73,114,80,117,141,25,158,17,61,102,153,108,137, +198,61,63,201,137,113,181,127,68,253,242,1,25,117,67,200,119,136,183,111, +47,252,63,42,77,110,68,69,114,81,45,47,81,108,62,69,114,81,44,3,7,15,144, +135,45,99,84,58,4,1,247,85,143,103,57,94,72,45,45,91,73,47,91,92,93,90,68, +140,211,143,1,23,1,25,177,94,83,88,155,210,122,24,39,126,164,98,39,41,99, +164,123,126,165,98,40,39,98,166,225,171,157,29,74,127,98,255,255,0,168,0, +0,5,104,6,240,18,38,0,53,0,0,17,7,2,149,1,225,0,0,0,21,180,2,31,5,38,2,184, +255,245,180,31,34,4,17,37,1,43,53,0,43,53,0,255,255,0,136,0,0,2,166,5,228, +18,38,0,85,0,0,17,7,0,116,0,182,0,0,0,19,64,11,1,32,17,38,1,74,32,35,6,21, +37,1,43,53,0,43,53,0,0,0,255,255,0,168,254,78,5,104,5,129,18,38,0,53,0,0, +17,7,2,140,2,5,0,0,0,14,185,0,2,255,225,180,35,31,4,17,37,1,43,53,255,255, +0,129,254,78,2,136,4,78,18,38,0,85,0,0,17,6,2,140,2,0,0,14,185,0,1,255,94, +180,36,32,6,21,37,1,43,53,0,0,255,255,0,168,0,0,5,104,6,254,18,38,0,53,0, +0,17,7,2,151,1,102,0,0,0,21,180,2,31,5,38,2,184,255,169,180,33,39,4,17,37, +1,43,53,0,43,53,0,255,255,0,56,0,0,2,206,5,211,18,38,0,85,0,0,17,6,1,72,56, +0,0,21,180,1,32,17,38,1,184,255,251,180,34,40,6,21,37,1,43,53,0,43,53,0,0, +0,255,255,0,93,255,236,4,248,7,45,18,38,0,54,0,0,17,7,0,116,1,234,1,73,0, +19,64,11,1,64,5,38,1,91,64,67,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255, +236,3,182,5,228,18,38,0,86,0,0,17,7,0,116,1,57,0,0,0,19,64,11,1,56,17,38, +1,93,56,59,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,93,255,236,4,248,7,26, +18,38,0,54,0,0,17,7,1,71,1,114,1,71,0,19,64,11,1,65,5,38,1,18,70,64,8,0,37, +1,43,53,0,43,53,0,0,0,255,255,0,57,255,236,3,182,5,211,18,38,0,86,0,0,17, +7,1,71,0,172,0,0,0,19,64,11,1,57,17,38,1,0,62,56,10,0,37,1,43,53,0,43,53, +0,0,0,255,255,0,93,254,78,4,248,5,150,18,38,0,54,0,0,17,7,0,120,1,166,0,0, +0,11,182,1,40,72,64,8,0,37,1,43,53,0,0,0,255,255,0,57,254,78,3,182,4,75,18, +38,0,86,0,0,17,7,0,120,0,218,0,0,0,11,182,1,15,64,56,10,0,37,1,43,53,0,0, +0,255,255,0,93,255,236,4,248,6,254,18,38,0,54,0,0,17,7,2,151,1,115,0,0,0, +19,64,11,1,64,5,38,1,19,66,72,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255, +236,3,182,5,211,18,38,0,86,0,0,17,7,1,72,0,173,0,0,0,19,64,11,1,56,17,38, +1,0,58,64,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,46,254,78,4,180,5,129,18, +38,0,55,0,0,17,7,2,140,1,139,0,0,0,14,185,0,1,255,254,180,12,8,4,6,37,1,43, +53,255,255,0,31,254,78,2,42,5,44,16,38,0,87,0,0,17,6,2,140,115,0,2,233,64, +255,35,64,232,232,72,35,64,231,231,72,35,64,228,228,72,35,64,227,227,72,35, +64,226,226,72,35,64,221,221,72,35,64,217,217,72,35,64,216,216,72,35,64,215, +215,72,35,64,214,214,72,35,64,213,213,72,35,64,210,210,72,35,64,206,206,72, +35,64,205,205,72,35,64,203,203,72,35,64,202,202,72,35,64,199,199,72,35,64, +196,196,72,35,64,195,195,72,35,64,194,194,72,35,64,192,192,72,35,64,191,191, +72,35,64,190,190,72,35,64,185,185,72,35,64,184,184,72,35,64,181,181,72,35, +64,180,180,72,35,64,179,179,72,35,64,178,178,72,35,64,174,174,72,35,64,173, +173,72,35,64,170,170,72,35,64,169,169,72,35,64,168,168,72,35,64,167,167,72, +35,64,163,163,72,35,64,162,162,72,35,64,160,160,72,35,64,159,159,72,35,64, +158,158,72,35,64,157,157,72,35,64,156,156,72,35,64,152,152,72,35,64,149,149, +72,35,64,148,148,72,35,64,147,147,72,35,64,146,146,72,35,64,145,145,72,35, +64,144,144,72,35,64,142,142,72,35,64,141,141,72,64,221,35,64,138,138,72,35, +64,137,137,72,35,64,136,136,72,35,64,134,134,72,35,64,133,133,72,35,64,131, +131,72,35,64,130,130,72,35,64,127,127,72,35,64,126,126,72,35,64,125,125,72, +35,64,124,124,72,35,64,123,123,72,35,64,122,122,72,35,64,121,121,72,35,64, +120,120,72,35,64,116,116,72,35,64,115,115,72,35,64,113,113,72,35,64,112,112, +72,35,64,111,111,72,35,64,110,110,72,35,64,109,109,72,35,64,106,106,72,35, +64,105,105,72,35,64,104,104,72,35,64,102,102,72,35,64,101,101,72,35,64,100, +100,72,35,64,99,99,72,35,64,98,98,72,35,64,95,95,72,35,64,94,94,72,35,64, +93,93,72,35,64,91,91,72,35,64,90,90,72,35,64,89,89,72,35,128,88,88,72,35, +64,87,87,72,35,64,84,84,72,35,64,83,83,72,35,64,80,80,72,35,64,79,79,72,35, +64,78,78,72,35,64,77,77,72,35,184,255,192,179,74,74,72,35,184,255,192,179, +71,71,72,35,184,255,192,179,63,63,72,35,184,255,192,64,9,60,60,72,35,64,52, +52,72,35,184,255,192,179,50,50,72,35,184,255,192,179,49,49,72,35,184,255, +192,64,9,45,45,72,35,64,41,41,72,35,184,255,192,179,39,39,72,35,184,255,192, +64,9,38,38,72,35,64,30,30,72,35,184,255,192,179,28,28,72,35,184,255,192,64, +9,27,27,72,35,64,19,19,72,35,184,255,192,179,17,17,72,35,184,255,192,179, +13,13,72,35,184,255,192,64,15,9,9,72,35,64,8,8,72,1,50,27,23,7,0,37,1,43, +53,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0,0,255,255,0,46,0,0,4,180, +6,254,18,38,0,55,0,0,17,7,2,151,1,33,0,0,0,21,180,1,8,5,38,1,184,255,251, +180,10,16,4,6,37,1,43,53,0,43,53,0,255,255,0,31,255,240,3,17,5,204,16,38, +0,87,0,0,17,7,2,146,1,204,0,75,0,17,177,1,1,184,1,136,180,27,23,7,0,37,1, +43,53,0,53,0,0,1,0,46,0,0,4,180,5,129,0,15,0,101,64,62,0,17,16,17,32,17,3, +9,3,2,5,15,14,6,12,5,14,9,6,127,12,175,12,191,12,3,47,12,143,12,2,12,64,23, +28,72,12,1,5,90,10,16,6,32,6,2,6,0,12,95,13,4,8,95,1,9,9,5,13,3,5,18,0,63, +63,18,57,47,51,237,50,16,237,50,1,47,93,51,253,50,204,43,93,113,17,57,43, +1,24,16,77,228,17,57,95,94,93,49,48,1,17,33,21,33,17,35,17,33,53,33,17,33, +53,33,21,2,208,1,25,254,231,190,254,233,1,23,254,28,4,134,4,229,254,60,154, +253,121,2,135,154,1,196,156,156,0,1,0,31,255,240,2,42,5,44,0,30,0,140,64, +91,40,30,1,40,29,1,40,26,1,40,25,1,12,32,9,15,72,156,12,172,12,2,12,40,9, +14,72,20,15,15,13,29,25,111,7,127,7,2,7,24,28,7,3,1,70,21,17,143,13,1,0,13, +16,13,32,13,3,7,13,128,32,1,47,32,1,27,19,80,20,0,15,80,28,127,16,191,16, +207,16,3,16,16,4,24,22,20,15,4,80,11,22,0,63,237,63,206,51,18,57,47,93,51, +237,50,16,237,50,1,93,93,47,94,93,113,51,51,237,23,50,47,93,51,51,17,51,17, +51,49,48,0,43,93,1,43,113,113,113,113,1,21,20,22,51,50,54,55,21,14,1,35,34, +53,17,35,53,51,17,35,53,51,55,51,21,51,21,35,17,51,21,1,80,51,63,26,49,29, +41,85,56,216,125,125,125,132,53,120,200,200,200,2,4,248,78,63,8,6,133,11, +13,245,1,31,131,1,48,131,242,242,131,254,208,131,255,255,0,158,255,236,5, +41,7,6,18,38,0,56,0,0,17,7,2,153,1,148,0,0,0,19,64,11,1,26,5,38,1,0,35,49, +5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5,189,18,38,0,88, +0,0,17,7,1,78,0,246,0,0,0,19,64,11,1,38,17,38,1,13,47,61,36,19,37,1,43,53, +0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,156,18,38,0,56,0,0,17,7,1,73,1, +159,1,73,0,19,64,11,1,26,5,38,1,1,27,26,5,20,37,1,43,53,0,43,53,0,0,0,255, +255,0,133,255,236,3,235,5,83,18,38,0,88,0,0,17,7,1,73,0,240,0,0,0,21,180, +1,38,17,38,1,184,255,254,180,39,38,36,19,37,1,43,53,0,43,53,0,255,255,0,158, +255,236,5,41,6,243,18,38,0,56,0,0,17,7,2,155,1,174,0,0,0,19,64,11,1,26,5, +38,1,0,31,39,5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5, +230,18,38,0,88,0,0,17,7,1,74,1,11,0,0,0,21,180,1,38,17,38,1,184,255,253,180, +43,55,36,19,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,7,62,18,38,0, +56,0,0,17,7,1,76,1,191,0,203,0,23,64,13,2,1,31,5,38,2,1,0,36,26,5,20,37,1, +43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,235,6,115,18,38,0,88,0, +0,17,7,1,76,1,20,0,0,0,23,64,13,2,1,43,17,38,2,1,1,48,38,36,19,37,1,43,53, +53,0,43,53,53,0,0,0,255,255,0,158,255,236,5,41,6,241,18,38,0,56,0,0,17,7, +2,154,1,157,0,0,0,23,64,13,2,1,26,5,38,2,1,81,26,35,5,20,37,1,43,53,53,0, +43,53,53,0,0,0,255,255,0,133,255,236,4,30,5,228,18,38,0,88,0,0,17,7,1,79, +1,5,0,0,0,23,64,13,2,1,38,17,38,2,1,100,38,47,36,19,37,1,43,53,53,0,43,53, +53,0,0,0,255,255,0,158,254,85,5,41,5,129,16,38,0,56,0,0,17,7,1,77,2,32,0, +0,0,40,185,0,1,254,103,181,39,39,21,21,37,51,184,255,192,179,21,21,72,51, +184,255,192,179,20,20,72,51,184,255,192,178,19,19,72,43,43,43,43,53,0,0,255, +255,0,133,254,85,4,5,4,58,18,38,0,88,0,0,17,7,1,77,2,87,0,0,0,13,185,0,1, +255,226,180,50,50,14,14,37,43,53,0,255,255,0,9,0,0,7,134,6,254,18,38,0,58, +0,0,17,7,2,150,2,121,0,0,0,21,180,1,48,5,38,1,184,255,253,180,53,47,15,46, +37,1,43,53,0,43,53,0,255,255,255,253,0,0,5,204,5,211,18,38,0,90,0,0,17,7, +1,71,1,148,0,0,0,21,180,1,44,17,38,1,184,255,251,180,49,43,15,42,37,1,43, +53,0,43,53,0,255,255,0,45,0,0,5,41,6,254,18,38,0,60,0,0,17,7,2,150,1,91,0, +0,0,21,180,1,10,5,38,1,184,255,251,180,15,9,4,8,37,1,43,53,0,43,53,0,255, +255,0,5,254,87,3,252,5,211,18,38,0,92,0,0,17,7,1,71,0,182,0,0,0,19,64,11, +1,33,17,38,1,0,38,32,17,31,37,1,43,53,0,43,53,0,0,0,255,255,0,45,0,0,5,41, +6,178,18,38,0,60,0,0,17,7,2,152,1,104,0,0,0,23,64,13,2,1,9,5,38,2,1,0,13, +11,4,8,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,65,0,0,4,163,6,240,18,38, +0,61,0,0,17,7,2,149,1,160,0,0,0,19,64,11,1,10,5,38,1,74,10,13,1,0,37,1,43, +53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,228,18,38,0,93,0,0,17,7,0,116,1, +53,0,0,0,19,64,11,1,10,17,38,1,93,10,13,0,8,37,1,43,53,0,43,53,0,0,0,255, +255,0,65,0,0,4,163,6,241,18,38,0,61,0,0,17,7,1,75,1,124,1,37,0,19,64,11,1, +10,5,38,1,0,10,12,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,204, +18,38,0,93,0,0,17,7,1,75,0,253,0,0,0,12,182,1,0,10,12,0,8,37,1,43,53,0,0, +0,255,255,0,65,0,0,4,163,6,254,18,38,0,61,0,0,17,7,2,151,1,56,0,0,0,19,64, +11,1,10,5,38,1,17,12,18,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182, +5,211,18,38,0,93,0,0,17,7,1,72,0,156,0,0,0,21,180,1,10,17,38,1,184,255,244, +180,12,18,0,8,37,1,43,53,0,43,53,0,0,1,0,138,0,0,2,17,5,202,0,19,0,125,185, +0,5,255,216,179,13,17,72,5,184,255,224,64,56,8,12,72,111,10,1,10,10,0,70, +0,1,16,1,48,1,240,1,4,8,1,255,21,1,224,21,1,223,21,1,176,21,192,21,2,159, +21,1,112,21,128,21,2,31,21,1,0,21,1,240,21,1,223,21,1,21,184,255,192,64,18, +34,37,72,79,21,1,112,21,1,31,21,1,14,80,7,0,0,21,0,63,63,237,1,93,93,113, +43,113,113,114,114,114,114,114,114,114,114,47,94,93,237,50,47,93,49,48,0, +43,43,33,35,17,52,62,2,51,50,22,23,21,46,1,35,34,14,2,21,1,62,180,22,59,102, +81,32,69,26,17,45,18,40,51,29,11,4,180,59,101,75,43,6,6,137,3,5,22,41,60, +39,0,0,0,0,1,0,192,254,78,3,195,5,174,0,27,0,148,64,107,133,6,1,122,18,138, +18,2,139,15,1,89,15,105,15,121,15,3,131,13,1,85,13,101,13,117,13,3,54,13, +1,38,7,1,38,8,1,34,22,50,22,114,22,130,22,4,21,17,37,17,53,17,3,27,212,8, +228,8,244,8,3,80,8,144,8,2,38,8,54,8,70,8,3,8,10,27,3,13,13,17,19,3,8,95, +14,159,14,2,14,12,16,80,9,17,17,13,3,81,15,24,127,24,175,24,3,24,13,0,47, +47,93,237,18,57,47,51,237,50,1,47,113,51,23,51,17,23,51,113,113,113,47,49, +48,93,0,93,1,93,93,93,93,93,93,93,93,93,1,46,1,35,34,14,2,15,1,51,7,35,3, +35,19,35,55,51,55,62,3,51,50,22,23,3,164,17,62,31,31,46,33,24,9,26,211,25, +213,254,180,254,152,27,151,29,12,40,71,109,81,32,82,35,5,32,5,10,19,40,64, +45,137,131,250,211,5,45,131,152,59,102,76,43,10,10,0,0,0,4,0,4,0,0,5,82,7, +62,0,26,0,39,0,61,0,67,1,36,64,18,122,64,138,64,2,102,5,118,5,134,5,3,86, +6,102,6,2,25,184,255,232,64,183,9,17,72,19,24,9,17,72,12,16,14,17,72,10,12, +1,12,38,9,10,32,8,39,32,7,32,40,130,0,68,66,132,66,2,66,62,50,130,17,175, +62,191,62,207,62,3,15,17,47,17,2,144,17,1,0,0,32,0,2,15,0,159,0,2,0,62,17, +17,62,0,3,6,11,5,32,32,10,7,139,7,1,90,7,106,7,122,7,3,7,16,6,32,6,48,6,3, +32,6,1,6,6,69,80,69,176,69,2,48,69,96,69,144,69,192,69,240,69,5,47,69,1,132, +10,1,85,10,101,10,117,10,3,10,11,62,62,45,141,112,22,128,22,2,22,22,57,127, +64,159,64,175,64,191,64,4,64,64,9,13,72,64,8,9,39,38,38,10,5,12,32,3,128, +57,1,63,57,1,0,57,1,57,7,7,10,0,47,51,47,47,93,93,93,23,51,18,57,47,51,205, +50,47,43,93,18,57,47,93,237,51,47,1,47,51,93,93,93,93,113,17,51,47,93,113, +51,93,93,17,18,57,17,51,17,18,23,57,47,47,47,93,113,93,113,93,16,237,16,205, +93,16,237,16,135,192,192,135,192,192,1,51,49,48,93,43,43,43,93,93,93,1,20, +6,7,6,7,1,35,3,33,3,35,1,38,39,46,1,53,52,62,2,51,50,30,2,3,46,3,39,14,3, +7,3,33,3,52,46,2,35,34,14,2,21,20,30,1,23,22,23,51,50,62,2,3,53,55,51,21, +5,3,158,38,33,16,18,2,29,195,161,253,126,162,198,2,36,21,18,33,38,38,66,88, +50,50,88,66,38,158,16,29,22,15,1,2,14,23,29,15,180,2,15,131,21,36,49,28,29, +49,36,21,21,36,24,21,24,9,28,49,36,21,247,217,207,254,202,5,112,45,79,30, +15,11,251,68,1,115,254,141,4,185,12,17,30,79,45,45,79,59,34,34,59,79,253, +254,36,74,60,41,4,4,41,62,73,36,254,95,3,119,25,44,33,19,19,33,44,25,26,44, +35,10,8,1,19,35,44,1,35,16,181,23,174,0,255,255,0,87,255,236,4,115,7,62,18, +38,0,68,0,0,16,39,1,76,1,20,255,85,17,7,0,116,1,99,1,90,0,35,64,14,3,2,101, +16,38,4,26,106,109,3,36,37,3,2,184,255,212,180,76,66,3,36,37,1,43,53,53,43, +53,0,43,53,53,0,0,0,255,255,0,24,0,0,7,168,6,240,18,38,0,134,0,0,17,7,2,149, +3,228,0,0,0,21,180,2,27,5,38,2,184,1,32,180,27,30,4,14,37,1,43,53,0,43,53, +0,255,255,0,66,255,236,6,194,5,228,18,38,0,166,0,0,17,7,0,116,2,175,0,0,0, +19,64,11,3,89,17,38,3,73,89,92,25,61,37,1,43,53,0,43,53,0,0,0,255,255,0,71, +255,203,5,244,6,240,18,38,0,152,0,0,17,7,2,149,2,75,0,0,0,19,64,11,3,52,5, +38,3,73,52,55,10,24,37,1,43,53,0,43,53,0,0,0,255,255,0,44,255,218,4,180,5, +228,18,38,0,184,0,0,17,7,0,116,1,178,0,0,0,19,64,11,3,46,17,38,3,94,46,49, +8,19,37,1,43,53,0,43,53,0,0,0,0,1,0,0,4,177,2,150,5,211,0,9,0,66,64,14,118, +9,134,9,2,120,8,136,8,2,128,0,1,0,184,255,192,64,27,11,15,72,0,191,6,1,6, +4,142,64,8,148,128,6,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93,51,26,253,26, +237,1,47,93,204,43,93,49,48,93,93,1,21,35,39,35,7,35,53,19,51,2,150,105,219, +2,232,104,234,204,4,197,20,169,169,20,1,14,0,0,1,0,0,4,177,2,150,5,211,0, +9,0,66,64,14,118,0,134,0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,27,11,15, +72,8,64,191,2,1,2,7,3,148,128,6,142,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93, +237,26,237,50,1,47,93,26,204,43,93,49,48,93,93,1,35,3,53,51,23,51,55,51,21, +1,182,204,234,104,232,2,219,105,4,177,1,14,20,169,169,20,0,0,1,0,51,4,212, +2,88,5,83,0,3,0,81,64,59,4,1,1,228,1,244,1,2,1,164,0,1,91,0,107,0,2,52,0, +68,0,2,0,2,32,18,25,72,2,142,1,64,28,33,72,47,1,1,2,15,1,63,1,175,1,191,1, +4,1,64,22,26,72,1,64,14,17,72,1,0,47,43,43,93,95,113,43,237,43,1,47,93,93, +93,47,93,113,49,48,1,33,53,33,2,88,253,219,2,37,4,212,127,0,1,255,221,4,177, +2,119,5,230,0,21,0,73,64,51,133,14,1,133,8,1,31,17,79,17,127,17,175,17,223, +17,5,239,17,1,17,64,5,64,29,60,72,5,16,80,5,96,5,2,5,149,128,11,143,15,0, +47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,237,113,50,1,47,43,26,204,93,113, +49,48,0,93,93,1,34,46,2,39,51,30,3,51,50,62,2,55,51,14,3,1,41,74,116,84,50, +8,117,8,39,56,72,42,42,71,56,38,8,117,9,50,83,116,4,177,51,85,112,61,43,59, +36,15,16,36,59,42,61,112,85,51,0,1,0,156,5,32,1,80,5,204,0,3,0,23,64,12,3, +134,0,64,14,17,72,0,0,83,1,0,0,63,237,1,47,43,237,49,48,19,53,51,21,156,180, +5,32,172,172,0,0,2,0,51,4,144,2,23,6,115,0,19,0,39,0,89,185,0,18,255,232, +64,14,9,14,72,12,24,9,14,72,8,24,9,14,72,2,184,255,232,64,42,9,14,72,20,130, +64,0,192,30,130,95,10,1,10,25,141,15,15,31,15,2,15,35,141,15,5,47,5,63,5, +79,5,127,5,159,5,191,5,239,5,8,5,0,47,93,237,220,93,237,1,47,93,237,26,220, +26,237,49,48,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,23,38,66,88,50,50,88,66,38,38,66, +88,50,50,88,66,38,108,21,36,49,28,29,49,36,21,21,36,49,29,28,49,36,21,5,130, +50,88,66,38,38,66,88,50,50,88,65,38,38,65,88,50,28,49,36,21,21,36,49,28,29, +49,38,21,21,38,49,0,0,0,0,1,0,80,254,85,1,174,0,0,0,23,0,76,64,55,14,24,9, +13,72,9,24,9,13,72,5,32,9,17,72,12,17,132,15,0,31,0,2,95,0,191,0,2,0,6,11, +64,7,10,72,11,20,141,16,3,1,32,3,80,3,96,3,112,3,176,3,192,3,6,3,0,47,93, +113,237,47,43,1,47,205,93,113,237,50,49,48,43,43,43,1,14,1,35,34,38,53,52, +62,2,55,51,14,3,21,20,22,51,50,54,55,1,174,28,71,40,105,106,34,48,53,20,133, +25,52,43,27,49,45,29,58,28,254,112,12,15,102,85,47,79,61,42,11,14,45,59,70, +39,42,48,13,11,0,1,255,233,4,177,2,182,5,189,0,27,2,77,185,0,26,255,232,64, +182,9,17,72,12,24,9,17,72,41,29,1,25,29,41,29,57,29,89,29,105,29,5,29,64, +229,232,72,29,64,217,220,72,11,29,1,208,169,29,185,29,201,29,3,155,29,1,9, +29,57,29,2,185,29,201,29,217,29,3,29,64,195,198,72,155,29,171,29,2,137,29, +1,123,29,1,73,29,1,137,29,185,29,2,29,64,171,175,72,6,29,54,29,2,158,153, +29,1,125,29,141,29,2,111,29,1,45,29,61,29,77,29,3,27,29,1,13,29,1,237,29, +253,29,2,29,128,136,139,72,137,29,153,29,2,91,29,107,29,123,29,3,29,192,127, +130,72,9,29,1,249,29,1,235,29,1,201,29,217,29,2,171,29,187,29,2,153,29,1, +22,29,38,29,102,29,118,29,134,29,5,4,29,1,110,29,184,255,64,64,96,101,109, +72,148,29,1,112,29,128,29,2,82,29,98,29,2,64,29,1,18,29,34,29,50,29,3,4,29, +1,228,29,244,29,2,214,29,1,196,29,1,176,29,1,162,29,1,128,29,144,29,2,82, +29,98,29,114,29,3,36,29,52,29,68,29,3,6,29,22,29,2,246,29,1,210,29,226,29, +2,192,29,1,146,29,162,29,178,29,3,100,29,116,29,132,29,3,29,184,255,192,64, +9,60,64,72,2,29,1,59,1,29,184,255,128,64,57,53,58,72,164,29,180,29,2,144, +29,1,100,29,116,29,132,29,3,48,29,64,29,80,29,3,4,29,20,29,36,29,3,208,29, +224,29,2,164,29,180,29,196,29,3,112,29,128,29,2,148,29,164,29,228,29,3,29, +184,255,192,64,19,26,31,72,128,29,1,84,29,100,29,116,29,3,29,64,7,10,72,23, +184,255,128,64,9,36,39,72,148,23,164,23,2,23,184,255,128,64,23,30,33,72,68, +23,1,48,23,1,2,0,23,16,23,32,23,3,208,23,224,23,2,23,184,255,192,64,43,13, +19,72,15,23,1,23,9,22,22,5,143,64,15,14,31,14,2,255,14,1,14,64,16,19,72,14, +128,19,143,8,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,50,237,26,221,43,93,113, +26,237,51,47,1,47,204,93,43,93,113,95,113,113,43,113,43,43,93,93,43,93,113, +113,113,114,114,114,114,114,43,95,94,93,43,93,93,93,93,93,113,113,113,113, +113,113,113,113,113,114,114,114,114,114,114,43,94,93,93,93,93,93,93,93,113, +43,113,113,43,113,114,114,114,114,114,114,94,93,43,93,113,113,113,113,43, +113,114,114,114,94,93,43,43,93,113,49,48,43,43,1,34,46,2,35,34,6,7,35,62, +3,51,50,30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45, +74,59,44,84,78,69,30,54,55,8,92,5,20,43,74,4,177,37,45,37,62,57,45,95,78, +50,37,45,37,63,56,44,95,78,51,0,0,0,2,0,22,4,177,3,25,5,228,0,5,0,11,0,111, +64,82,164,10,1,102,10,1,154,8,170,8,2,98,4,162,4,2,98,3,1,154,2,170,2,2,10, +159,6,1,15,6,31,6,127,6,223,6,4,7,6,4,64,63,0,79,0,143,0,175,0,191,0,207, +0,6,0,64,30,41,72,0,64,23,26,72,0,8,2,149,128,6,15,0,47,0,63,0,127,0,239, +0,5,0,0,47,93,50,26,237,50,1,47,43,43,93,26,205,220,94,93,113,205,49,48,93, +93,93,93,93,93,19,53,19,51,21,1,51,53,19,51,21,1,22,217,207,254,182,253,217, +207,254,182,4,177,20,1,31,29,254,234,20,1,31,29,254,234,0,0,1,0,205,4,194, +1,225,6,7,0,5,0,64,64,43,2,16,12,17,72,41,2,1,10,5,26,5,42,5,3,3,43,3,1,3, +64,0,2,128,132,0,148,0,2,112,0,1,2,16,0,32,0,64,0,96,0,4,0,0,47,93,95,93, +93,26,205,1,47,26,205,93,49,48,95,93,93,43,19,53,19,51,21,3,205,69,207,201, +4,194,33,1,36,37,254,224,0,3,0,29,4,176,2,139,6,65,0,5,0,9,0,13,0,83,64,53, +2,16,11,17,72,10,5,26,5,42,5,3,47,4,1,4,47,1,1,1,1,6,192,13,208,13,2,13,10, +192,9,208,9,2,9,6,11,7,144,6,2,0,0,10,192,6,1,15,6,63,6,2,6,0,47,93,93,51, +51,47,205,16,237,50,1,47,205,93,47,205,93,18,57,47,113,205,93,49,48,93,43, +19,53,19,51,21,3,37,53,51,21,33,53,51,21,250,69,187,181,254,216,150,1,66, +150,4,176,33,1,112,37,254,148,31,172,172,172,172,0,0,255,255,0,4,0,0,5,82, +5,131,16,38,0,36,0,0,17,7,1,80,255,108,255,124,0,94,179,2,0,24,1,184,255, +10,181,24,24,5,5,37,28,184,255,192,179,36,36,72,28,184,255,192,179,30,30, +72,28,184,255,192,179,24,24,72,28,184,255,192,179,21,21,72,28,184,255,192, +179,18,18,72,28,184,255,192,179,15,15,72,28,184,255,192,64,11,12,12,72,28, +64,11,11,72,2,23,3,0,63,53,1,43,43,43,43,43,43,43,43,43,93,53,0,1,0,187,1, +190,1,126,2,154,0,3,2,10,179,3,134,0,5,184,255,128,64,12,229,233,72,6,5,22, +5,2,246,5,1,5,184,255,128,64,33,222,225,72,150,5,166,5,2,116,5,132,5,2,86, +5,102,5,2,68,5,1,38,5,54,5,2,2,5,18,5,2,211,5,184,255,128,64,22,207,210,72, +198,5,214,5,2,180,5,1,150,5,166,5,2,116,5,132,5,2,5,184,255,192,64,36,195, +199,72,4,5,20,5,2,214,5,230,5,246,5,3,194,5,1,148,5,164,5,180,5,3,118,5,134, +5,2,84,5,100,5,2,5,184,255,192,64,34,174,181,72,164,5,180,5,196,5,3,70,5, +86,5,118,5,134,5,150,5,5,52,5,1,38,5,1,4,5,20,5,2,161,5,184,255,192,179,157, +160,72,5,184,255,192,64,37,152,155,72,100,5,116,5,2,54,5,70,5,86,5,3,36,5, +1,6,5,22,5,2,244,5,1,214,5,230,5,2,178,5,194,5,2,5,184,255,128,64,28,135, +138,72,86,5,102,5,2,36,5,52,5,68,5,3,2,5,18,5,2,212,5,228,5,244,5,3,5,184, +255,192,64,23,119,124,72,82,5,98,5,2,1,32,5,48,5,64,5,3,4,5,20,5,2,112,5, +184,255,128,64,9,103,111,72,68,5,84,5,2,5,184,255,192,179,99,102,72,5,184, +255,128,179,92,95,72,5,184,255,192,179,87,91,72,5,184,255,128,64,21,81,86, +72,36,5,52,5,68,5,3,228,5,1,176,5,192,5,208,5,3,5,184,255,192,64,16,67,70, +72,48,5,1,36,5,1,0,5,16,5,2,60,5,184,255,192,64,12,56,59,72,187,5,1,128,5, +144,5,2,5,184,255,192,64,41,45,48,72,11,5,1,208,5,224,5,2,164,5,180,5,196, +5,3,32,5,48,5,2,2,0,5,16,5,2,240,5,1,159,5,175,5,2,0,5,1,5,184,255,192,181, +13,17,72,0,155,1,0,47,237,1,43,93,93,93,113,95,113,113,113,114,43,114,114, +43,94,93,93,93,43,93,93,113,43,43,43,43,114,43,94,93,93,95,93,43,93,113,113, +113,43,113,113,113,114,114,114,114,43,43,94,93,93,93,93,93,43,113,113,113, +113,113,114,43,114,114,114,114,43,94,93,93,93,93,93,93,43,93,113,43,47,237, +49,48,19,53,51,21,187,195,1,190,220,220,0,0,255,255,255,245,0,0,5,238,5,131, +16,39,0,40,0,240,0,0,17,7,1,80,255,40,255,124,0,49,64,10,1,14,3,1,16,15,1, +0,15,1,184,255,113,64,19,15,15,1,1,37,0,208,0,1,191,0,1,47,0,1,47,0,1,0,16, +93,93,93,93,53,43,93,93,53,0,63,53,0,0,0,255,255,255,242,0,0,6,13,5,131,16, +39,0,43,0,237,0,0,17,7,1,80,255,37,255,124,0,95,185,0,19,255,192,179,21,21, +72,19,184,255,192,179,20,20,72,19,184,255,192,179,19,19,72,19,184,255,192, +179,17,17,72,19,184,255,192,64,13,14,14,72,1,14,3,1,16,15,1,0,15,1,184,255, +113,64,19,15,15,5,5,37,0,207,0,1,191,0,1,111,0,1,47,0,1,0,16,93,93,93,93, +53,43,93,93,53,0,63,53,1,43,43,43,43,43,0,255,255,255,232,0,0,2,85,5,131, +16,39,0,44,0,217,0,0,17,7,1,80,255,27,255,124,0,92,185,0,11,255,192,179,17, +17,72,11,184,255,192,64,23,12,12,72,11,64,11,11,72,11,64,9,9,72,1,6,3,1,16, +7,1,0,7,1,184,255,102,64,28,7,7,1,1,37,0,128,0,1,127,0,1,111,0,1,95,0,1,79, +0,1,47,0,1,47,0,1,0,16,93,93,93,93,93,93,93,53,43,93,93,53,0,63,53,1,43,43, +43,43,255,255,255,187,255,236,5,211,5,150,16,38,0,50,252,0,17,7,1,80,254, +238,255,124,0,39,64,10,2,42,3,2,192,40,1,0,40,1,184,255,94,64,11,40,40,10, +10,37,1,0,47,0,1,0,16,93,53,53,43,93,93,53,0,63,53,0,0,0,255,255,0,65,0,0, +6,171,5,131,16,39,0,60,1,130,0,0,17,7,1,80,255,116,255,124,5,192,64,21,16, +64,233,233,72,16,64,229,229,72,16,64,227,227,72,16,64,226,226,72,16,184,255, +192,179,224,224,72,16,184,255,192,64,19,222,222,72,16,64,220,220,72,16,64, +219,219,72,16,64,216,216,72,16,184,255,192,179,215,215,72,16,184,255,192, +64,19,211,211,72,16,64,207,207,72,16,64,206,206,72,16,64,205,205,72,16,184, +255,192,179,204,204,72,16,184,255,192,64,19,202,202,72,16,64,199,199,72,16, +64,186,186,72,16,64,184,184,72,16,184,255,192,179,183,183,72,16,184,255,192, +64,14,182,182,72,16,64,179,179,72,16,64,177,177,72,16,184,255,192,64,19,172, +172,72,16,64,166,166,72,16,64,164,164,72,16,64,163,163,72,16,184,255,192, +64,24,161,161,72,16,64,156,156,72,16,128,153,153,72,16,64,152,152,72,16,64, +151,151,72,16,184,255,192,179,149,149,72,16,184,255,128,179,148,148,72,16, +184,255,128,179,147,147,72,16,184,255,192,179,146,146,72,16,184,255,128,179, +145,145,72,16,184,255,192,179,144,144,72,16,184,255,128,179,141,141,72,16, +184,255,128,179,140,140,72,16,184,255,192,179,139,139,72,16,184,255,128,179, +138,138,72,16,184,255,192,179,137,137,72,16,184,255,192,179,136,136,72,16, +184,255,192,179,135,135,72,16,184,255,128,179,134,134,72,16,184,255,192,179, +133,133,72,16,184,255,128,179,131,131,72,16,184,255,192,179,130,130,72,16, +184,255,0,179,129,129,72,16,184,255,0,179,128,128,72,16,184,254,192,179,127, +127,72,16,184,255,0,179,126,126,72,16,184,255,0,179,125,125,72,16,184,255, +64,179,124,124,72,16,184,255,64,179,123,123,72,16,184,255,64,179,122,122, +72,16,184,255,0,179,121,121,72,16,184,254,192,179,120,120,72,16,184,255,0, +179,119,119,72,16,184,255,0,179,118,118,72,16,184,255,64,179,117,117,72,16, +184,255,0,179,116,116,72,16,184,255,64,179,115,115,72,16,184,255,0,179,114, +114,72,16,184,255,64,179,113,113,72,16,184,255,64,179,112,112,72,16,184,255, +64,179,111,111,72,16,184,255,128,179,110,110,72,16,184,255,64,179,109,109, +72,16,184,255,128,179,108,108,72,16,184,255,0,179,107,107,72,16,184,255,64, +179,106,106,72,16,184,255,0,179,105,105,72,16,184,255,64,179,104,104,72,16, +184,255,64,179,103,103,72,16,184,255,64,179,102,102,72,16,184,255,128,179, +101,101,72,16,184,255,64,179,100,100,72,16,184,255,64,179,99,99,72,16,184, +255,0,179,98,98,72,16,184,255,64,179,97,97,72,16,184,255,64,179,96,96,72, +16,184,255,64,179,95,95,72,16,184,255,64,179,94,94,72,16,184,255,64,179,93, +93,72,16,184,255,128,179,92,92,72,16,184,255,64,179,91,91,72,16,184,255,128, +179,90,90,72,16,184,255,64,179,89,89,72,16,184,255,128,179,88,88,72,16,184, +255,64,179,87,87,72,16,184,255,64,179,86,86,72,16,184,255,64,179,85,85,72, +16,184,255,64,179,84,84,72,16,184,255,64,179,83,83,72,16,184,255,128,179, +82,82,72,16,184,255,192,179,81,81,72,16,184,255,128,179,80,80,72,16,184,255, +128,179,79,79,72,16,184,255,64,179,78,78,72,16,184,255,64,179,77,77,72,16, +184,255,64,179,76,76,72,16,184,255,128,179,75,75,72,16,184,255,128,179,74, +74,72,16,184,255,128,179,73,73,72,16,184,255,64,179,72,72,72,16,184,255,128, +179,71,71,72,16,184,255,192,179,70,70,72,16,184,255,128,179,69,69,72,16,184, +255,192,179,68,68,72,16,184,255,192,179,67,67,72,16,184,255,128,179,66,66, +72,16,184,255,64,179,65,65,72,16,184,255,128,179,64,64,72,16,184,255,128, +179,63,63,72,16,184,255,128,179,62,62,72,16,184,255,192,179,61,61,72,16,184, +255,192,179,60,60,72,16,184,255,192,179,59,59,72,16,184,255,128,179,58,58, +72,16,184,255,128,179,57,57,72,16,184,255,128,179,56,56,72,16,184,255,128, +179,55,55,72,16,184,255,128,179,54,54,72,16,184,255,192,179,53,53,72,16,184, +255,192,179,52,52,72,16,184,255,128,179,51,51,72,16,184,255,192,179,50,50, +72,16,184,255,128,179,49,49,72,16,184,255,128,179,48,48,72,16,184,255,128, +179,47,47,72,16,184,255,192,179,46,46,72,16,184,255,128,179,45,45,72,16,184, +255,128,179,44,44,72,16,184,255,128,179,43,43,72,16,184,255,192,179,42,42, +72,16,184,255,192,179,41,41,72,16,184,255,192,179,40,40,72,16,184,255,192, +179,39,39,72,16,184,255,128,179,38,38,72,16,184,255,128,179,37,37,72,16,184, +255,128,179,36,36,72,16,184,255,192,179,35,35,72,16,184,255,128,179,34,34, +72,16,184,255,192,179,33,33,72,16,184,255,192,179,32,32,72,16,184,255,192, +179,31,31,72,16,184,255,192,179,30,30,72,16,184,255,192,179,29,29,72,16,184, +255,192,179,28,28,72,16,184,255,192,179,27,27,72,16,184,255,192,179,26,26, +72,16,184,255,192,179,25,25,72,16,184,255,192,179,24,24,72,16,184,255,128, +179,23,23,72,16,184,255,192,179,22,22,72,16,184,255,192,179,21,21,72,16,184, +255,192,179,17,17,72,16,184,255,128,179,16,16,72,16,184,255,192,179,15,15, +72,16,184,255,192,179,14,14,72,16,184,255,192,64,30,12,12,72,16,64,11,11, +72,1,11,3,1,128,12,1,112,12,1,96,12,1,64,12,1,16,12,1,0,12,1,184,255,166, +64,13,12,12,4,4,37,0,176,0,1,0,0,1,0,16,93,93,53,43,93,93,93,93,93,93,53, +0,63,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,187,0,0, +5,173,5,150,16,38,1,114,10,0,17,7,1,80,254,238,255,124,0,68,64,15,65,64,19, +19,72,1,60,3,1,144,58,1,16,58,1,184,255,62,64,28,58,58,53,53,37,0,159,0,1, +95,0,1,31,0,1,223,0,1,175,0,1,159,0,1,31,0,1,0,16,93,93,93,93,113,113,113, +53,43,93,93,53,0,63,53,1,43,0,0,255,255,255,176,0,0,2,30,6,65,16,38,1,130, +0,0,17,6,1,81,147,0,2,60,64,11,29,64,227,227,72,29,64,226,226,72,29,184,255, +192,179,223,223,72,29,184,255,192,179,220,220,72,29,184,255,192,64,19,219, +219,72,29,64,213,213,72,29,64,212,212,72,29,64,211,211,72,29,184,255,192, +179,207,207,72,29,184,255,192,179,206,206,72,29,184,255,192,64,19,205,205, +72,29,64,200,200,72,29,64,199,199,72,29,64,198,198,72,29,184,255,192,64,14, +192,192,72,29,64,182,182,72,29,64,177,177,72,29,184,255,192,179,175,175,72, +29,184,255,192,64,19,174,174,72,29,64,168,168,72,29,64,167,167,72,29,64,164, +164,72,29,184,255,192,179,161,161,72,29,184,255,192,64,19,160,160,72,29,64, +155,155,72,29,64,154,154,72,29,64,153,153,72,29,184,255,192,179,152,152,72, +29,184,255,192,64,19,151,151,72,29,64,141,141,72,29,64,132,132,72,29,64,131, +131,72,29,184,255,192,64,9,129,129,72,29,64,119,119,72,29,184,255,192,64, +14,115,115,72,29,64,110,110,72,29,64,109,109,72,29,184,255,192,64,19,106, +106,72,29,64,101,101,72,29,64,100,100,72,29,64,96,96,72,29,184,255,192,179, +94,94,72,29,184,255,192,64,19,93,93,72,29,64,87,87,72,29,64,86,86,72,29,64, +85,85,72,29,184,255,192,179,84,84,72,29,184,255,192,64,9,79,79,72,29,64,74, +74,72,29,184,255,192,64,24,61,61,72,29,64,56,56,72,29,64,55,55,72,29,64,54, +54,72,29,64,51,51,72,29,184,255,192,179,50,50,72,29,184,255,192,179,49,49, +72,29,184,255,192,64,19,48,48,72,29,64,42,42,72,29,64,41,41,72,29,64,40,40, +72,29,184,255,192,179,36,36,72,29,184,255,192,179,35,35,72,29,184,255,192, +64,19,34,34,72,29,64,29,29,72,29,64,24,24,72,29,64,23,23,72,29,184,255,192, +179,21,21,72,29,184,255,192,179,17,17,72,29,184,255,192,64,14,16,16,72,29, +64,9,9,72,29,64,8,8,72,29,184,255,192,64,12,7,7,72,3,2,1,14,17,38,3,2,1,184, +255,220,180,20,26,5,13,37,1,43,53,53,53,0,43,53,53,53,1,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,0,4,0,0,5,82,5,129, +18,6,0,36,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,0,1,0,168,0,1,4, +47,5,130,0,5,0,56,64,40,3,90,0,4,16,4,64,4,3,4,16,0,48,0,80,0,3,0,0,16,0, +32,0,64,0,96,0,128,0,160,0,7,7,0,2,95,5,3,3,18,0,63,63,237,1,47,94,93,113, +47,93,237,49,48,1,21,33,17,35,17,4,47,253,56,191,5,130,156,251,27,5,129,0, +2,0,61,0,0,5,26,5,129,0,5,0,18,0,176,64,26,106,7,122,7,138,7,3,101,17,117, +17,133,17,3,89,8,1,86,16,1,6,24,13,17,72,18,184,255,232,64,64,13,17,72,132, +2,1,70,2,102,2,118,2,3,139,1,1,73,1,105,1,121,1,3,2,1,12,12,0,6,95,3,1,16, +3,1,15,3,1,175,3,207,3,223,3,255,3,4,79,3,127,3,2,48,3,1,31,3,1,3,18,128, +0,1,0,184,255,192,64,29,21,30,72,0,48,20,1,47,20,1,0,3,6,3,18,95,5,18,12, +32,19,22,72,153,12,1,12,1,3,0,63,51,93,43,63,237,23,50,1,93,93,47,43,93,51, +47,93,93,93,93,113,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93,43,43,93, +93,93,93,49,48,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,62,2,5,217,1,254,251, +35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12,141, +156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,255,255,0,168,0,0,4,254,5,129, +18,6,0,40,0,0,255,255,0,65,0,0,4,163,5,129,18,6,0,61,0,0,255,255,0,168,0, +0,5,32,5,129,18,6,0,43,0,0,0,3,0,97,255,236,5,215,5,150,0,19,0,39,0,43,0, +179,64,130,105,12,1,102,17,1,89,22,1,86,32,1,86,28,1,26,23,90,23,2,21,27, +85,27,2,9,42,1,6,43,1,10,37,26,37,90,37,3,5,33,21,33,85,33,3,9,43,42,30,0, +91,15,20,1,59,207,20,239,20,2,0,20,1,239,20,255,20,2,176,20,1,111,20,1,48, +20,1,31,20,1,0,20,16,20,32,20,64,20,80,20,160,20,6,7,20,30,91,175,10,191, +10,2,32,10,1,15,10,31,10,2,10,43,95,40,40,35,25,95,15,4,35,95,5,19,128,45, +1,32,45,1,93,93,0,63,237,63,237,18,57,47,237,1,47,93,93,93,237,47,94,93,113, +113,113,113,113,114,114,94,93,237,18,57,57,49,48,94,93,93,93,93,93,93,93, +93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,37,33,21,33,5,215,95,180,254,252,165,174, +254,250,174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127, +63,65,127,189,123,132,191,123,59,252,226,2,75,253,181,2,199,165,254,242,192, +104,109,195,1,12,159,165,1,10,187,101,102,188,254,246,163,127,208,148,80, +80,148,208,127,127,211,153,85,86,153,212,208,160,0,0,0,255,255,0,189,0,0, +1,124,5,129,18,6,0,44,0,0,255,255,0,168,0,0,5,63,5,129,18,6,0,46,0,0,0,1, +0,10,0,1,5,78,5,130,0,16,0,202,64,11,116,16,132,16,2,123,15,139,15,2,13,184, +255,232,182,14,17,72,54,13,1,12,184,255,240,64,127,13,17,72,2,16,13,17,72, +1,24,14,17,72,57,1,1,111,18,1,48,18,1,47,18,1,0,18,1,21,16,37,16,53,16,3, +6,16,1,230,16,246,16,2,16,26,15,42,15,58,15,3,9,15,1,233,15,249,15,2,15,7, +7,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,13,175,14,191,14,2,14,26,1,42, +1,58,1,3,9,1,1,233,1,249,1,2,1,16,0,32,0,48,0,3,111,0,1,0,0,48,0,2,0,118, +7,134,7,2,7,15,3,14,0,18,0,63,50,63,51,93,1,47,93,93,113,50,93,113,113,47, +93,51,93,113,113,57,61,47,51,93,113,113,51,93,113,113,93,93,93,93,49,48,93, +43,43,43,93,43,93,93,37,35,1,46,1,39,38,39,6,7,14,1,7,1,35,1,51,5,78,201, +254,124,17,29,12,14,12,13,14,12,30,15,254,122,201,2,63,198,1,3,224,47,89, +35,41,37,39,41,35,89,45,252,32,5,129,0,255,255,0,168,0,0,6,2,5,129,18,6,0, +48,0,0,255,255,0,168,0,0,5,32,5,129,18,6,0,49,0,0,0,3,0,90,0,0,4,217,5,129, +0,3,0,7,0,11,0,75,64,49,82,3,1,10,9,5,3,95,6,1,15,6,31,6,175,6,191,6,4,6, +2,16,5,48,5,2,32,5,64,5,112,5,160,5,4,5,10,95,11,11,0,7,95,6,18,3,95,0,3, +0,63,237,63,237,17,57,47,237,1,47,93,113,51,47,93,113,51,18,57,57,49,48,113, +19,33,21,33,1,21,33,53,1,21,33,53,125,4,57,251,199,4,92,251,129,3,228,252, +183,5,129,156,251,183,156,156,2,133,154,154,0,0,0,255,255,0,97,255,236,5, +215,5,150,18,6,0,50,0,0,0,1,0,168,0,0,5,32,5,129,0,7,0,79,64,40,3,90,0,4, +16,4,64,4,3,7,4,7,90,64,111,0,127,0,143,0,191,0,4,0,0,9,128,32,9,1,32,9,160, +9,176,9,192,9,4,9,184,255,192,64,10,14,17,72,2,95,5,3,4,0,18,0,63,50,63,237, +1,43,93,113,26,16,204,47,93,26,237,47,94,93,237,49,48,33,17,33,17,35,17,33, +17,4,97,253,6,191,4,120,4,224,251,32,5,129,250,127,255,255,0,168,0,0,4,234, +5,129,18,6,0,51,0,0,0,1,0,108,0,0,4,161,5,129,0,12,0,188,64,135,169,3,1,105, +9,1,116,9,132,9,164,9,3,148,8,164,8,2,87,8,103,8,2,145,7,1,84,7,100,7,2,146, +10,162,10,2,116,10,132,10,2,70,10,86,10,102,10,3,57,3,185,3,2,249,3,1,103, +3,1,168,8,1,103,8,1,8,100,2,1,39,2,1,175,6,1,2,6,2,6,1,208,11,1,0,11,16,11, +48,11,80,11,96,11,128,11,6,7,11,70,7,1,11,7,1,7,3,3,10,175,1,191,1,2,32,1, +1,15,1,1,1,3,7,95,9,2,8,3,0,4,3,1,10,95,0,18,0,63,237,50,63,18,23,57,237, +50,1,47,93,93,93,51,51,47,51,113,113,47,94,93,93,18,57,57,47,47,93,113,113, +51,113,113,113,113,114,49,48,93,93,93,93,93,93,93,93,113,93,51,53,9,1,53, +33,21,33,1,21,1,33,21,108,2,26,253,247,3,231,252,240,1,202,254,22,3,109,162, +2,67,1,251,161,156,254,67,124,253,240,156,0,255,255,0,46,0,0,4,180,5,129, +18,6,0,55,0,0,255,255,0,45,0,0,5,41,5,129,18,6,0,60,0,0,0,3,0,117,255,245, +5,238,5,139,0,29,0,40,0,51,0,180,185,0,28,255,240,179,12,15,72,17,184,255, +240,179,12,15,72,27,184,255,240,179,12,15,72,18,184,255,240,64,72,12,15,72, +41,90,11,15,123,15,171,15,3,15,8,30,90,4,0,116,0,164,0,3,0,35,24,7,90,47, +21,4,8,1,20,8,36,8,68,8,116,8,164,8,244,8,6,8,20,53,68,53,2,0,53,1,132,53, +164,53,196,53,244,53,4,112,53,1,2,96,53,1,53,184,255,192,64,24,10,13,72,35, +46,96,10,6,10,34,49,96,20,24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57, +47,47,17,51,16,237,50,17,51,16,237,50,1,43,93,95,93,93,113,113,47,93,113, +51,51,253,50,50,220,93,237,16,220,93,237,49,48,0,43,43,43,43,1,20,14,2,43, +1,21,35,53,35,34,46,2,53,52,62,2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17, +51,50,62,2,37,20,30,2,59,1,17,35,34,6,5,238,64,131,197,133,83,185,83,133, +197,131,64,67,133,201,135,72,185,71,135,202,133,67,192,185,183,48,56,92,136, +89,43,252,7,43,89,136,92,56,52,182,182,2,224,105,188,143,84,227,227,84,143, +188,105,113,185,131,72,182,182,72,131,185,117,187,180,253,22,53,98,140,88, +88,140,98,53,2,234,180,255,255,0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,145, +0,0,6,30,5,129,0,35,0,203,64,127,90,31,106,31,2,85,30,101,30,2,90,4,106,4, +2,90,5,106,5,2,74,22,1,69,13,1,3,25,90,100,28,1,132,28,148,28,2,28,19,35, +90,0,10,90,107,7,1,139,7,155,7,2,7,16,219,0,1,4,0,100,0,132,0,3,219,0,1,4, +0,52,0,68,0,100,0,132,0,148,0,180,0,196,0,8,7,0,4,37,36,37,52,37,68,37,132, +37,196,37,212,37,7,228,37,244,37,2,160,37,1,132,37,148,37,2,96,37,112,37, +2,84,37,1,64,37,1,2,37,184,255,192,64,18,9,12,72,34,2,96,19,239,15,1,15,15, +26,17,8,3,0,18,0,63,63,51,51,57,47,93,51,237,50,1,43,95,93,93,93,93,93,93, +113,47,94,93,93,113,113,51,220,93,113,237,16,253,50,220,93,113,237,49,48, +95,93,93,93,0,93,1,93,0,93,33,17,35,34,46,2,53,17,51,17,20,30,2,59,1,17,51, +17,51,50,62,2,53,17,51,17,20,14,2,43,1,17,2,251,83,133,201,134,67,191,47, +93,139,92,56,185,56,95,140,91,45,191,68,134,201,132,83,1,171,84,142,189,104, +1,207,254,45,80,137,100,57,3,73,252,183,57,100,137,80,1,211,254,49,104,189, +142,84,254,85,0,0,0,1,0,87,0,0,5,163,5,150,0,57,0,225,64,91,101,36,1,101, +22,1,157,49,1,143,49,1,49,16,11,15,72,157,9,1,143,9,1,9,16,11,15,72,116,3, +132,3,2,54,3,1,54,2,118,2,2,54,56,118,56,2,116,55,132,55,2,54,55,1,42,26, +1,42,32,1,41,53,48,40,10,18,96,40,112,40,144,40,3,111,18,127,18,159,18,3, +40,18,40,18,24,34,91,80,53,1,53,184,255,192,64,69,27,30,72,191,53,207,53, +2,48,53,1,53,17,5,91,31,24,79,24,2,224,24,1,15,24,31,24,95,24,207,24,223, +24,5,160,24,1,111,24,159,24,2,0,24,32,24,48,24,3,8,24,95,59,1,10,15,19,39, +48,5,42,95,18,41,18,29,95,0,4,0,63,237,63,51,237,23,50,1,93,47,94,93,93,93, +113,113,114,253,196,47,93,93,43,114,237,17,57,57,47,47,93,93,17,51,17,51, +16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,1,50,30,2, +21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46,2,35,34,14,2,21,20,30, +2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,2,253,151,241,168,90,59,109, +157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116,169,108,109,170,116, +61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109,59,90,168,241,5,150, +86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51,126,143,159,85,116,181, +124,65,65,124,181,116,85,159,143,126,51,224,156,4,2,3,2,54,138,167,191,106, +147,234,162,86,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218, +0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,3,0,45, +0,0,5,41,6,178,0,8,0,12,0,16,2,114,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5, +1,3,5,1,16,3,5,184,255,232,64,255,12,15,72,12,133,9,16,133,64,13,5,4,14,2, +1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8,6,1,90,38,2,86,2,150,2,3, +118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,18,169,18,201,18,3,86,18,1,9,18, +57,18,2,25,18,89,18,137,18,249,18,4,6,18,1,202,249,18,1,230,18,1,9,18,25, +18,185,18,201,18,4,198,18,1,89,18,121,18,169,18,3,54,18,1,41,18,57,18,185, +18,233,18,4,11,18,1,153,249,18,1,198,18,214,18,2,178,18,1,164,18,1,150,18, +1,130,18,1,116,18,1,86,18,102,18,2,66,18,1,36,18,52,18,2,18,18,1,4,18,1,244, +18,1,230,18,1,196,18,212,18,2,166,18,182,18,2,146,18,1,132,18,1,118,18,1, +98,18,1,84,18,1,54,18,70,18,2,36,18,1,22,18,1,4,18,1,242,18,1,1,208,18,224, +18,2,196,18,1,160,18,176,18,2,148,18,1,112,18,1,100,18,1,64,18,1,20,18,36, +18,52,18,3,0,18,1,105,64,202,228,18,244,18,2,208,18,1,164,18,180,18,196,18, +3,128,18,144,18,2,116,18,1,80,18,96,18,2,68,18,1,32,18,1,4,18,20,18,2,244, +18,1,224,18,1,196,18,212,18,2,176,18,1,84,18,100,18,116,18,148,18,164,18, +5,48,18,64,18,2,36,18,1,0,18,1,196,18,244,18,2,144,18,1,4,18,20,18,36,18, +68,18,84,18,116,18,132,18,7,57,224,18,1,132,18,164,18,212,18,3,112,18,1,4, +18,36,18,52,18,84,18,100,18,5,228,18,244,18,2,192,18,1,180,18,1,144,18,1, +4,18,20,18,52,18,84,18,132,18,5,212,18,228,18,2,187,18,1,164,18,1,112,18, +1,2,48,18,96,18,2,15,18,47,18,2,10,14,145,9,95,13,1,13,64,9,12,72,13,0,3, +59,3,75,3,123,3,3,3,1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,47,43,93,51,237, +50,1,93,93,95,93,93,93,93,113,113,113,113,113,114,114,114,114,94,93,93,93, +113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,94,93, +93,93,93,93,93,93,93,93,95,93,113,113,113,113,113,113,113,113,113,113,113, +113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,113,113, +113,114,114,114,94,93,93,113,113,113,47,94,93,93,93,113,253,57,206,94,93, +93,50,43,1,24,16,77,230,50,47,26,237,220,237,49,48,43,95,94,93,93,43,93,93, +1,17,35,19,1,51,9,1,51,37,53,51,21,33,53,51,21,3,9,190,2,253,224,205,1,178, +1,176,205,253,249,163,253,211,165,2,72,253,184,2,72,3,57,253,97,2,159,121, +184,184,184,184,255,255,0,86,255,236,4,101,6,7,18,38,1,122,0,0,17,7,1,80, +1,33,0,0,0,19,64,11,2,60,17,38,2,26,60,63,8,23,37,1,43,53,0,43,53,0,0,0,255, +255,0,70,255,236,3,106,6,7,18,38,1,126,0,0,17,7,1,80,0,202,0,0,0,19,64,11, +1,58,17,38,1,73,58,61,16,6,37,1,43,53,0,43,53,0,0,0,255,255,0,106,254,88, +3,238,6,7,18,38,1,128,0,0,17,7,1,80,1,57,0,0,0,19,64,11,1,36,17,38,1,100, +36,39,17,34,37,1,43,53,0,43,53,0,0,0,255,255,0,137,0,0,1,178,6,7,18,38,1, +130,0,0,17,6,1,80,209,0,0,27,64,17,1,14,17,38,1,16,14,1,0,14,1,29,14,17,5, +13,37,1,43,93,93,53,0,43,53,0,255,255,0,133,255,236,3,254,6,65,18,38,1,142, +0,0,17,7,1,81,0,222,0,0,0,30,64,9,3,2,1,32,17,38,3,2,1,184,255,241,180,38, +44,10,0,37,1,43,53,53,53,0,43,53,53,53,0,2,0,86,255,236,4,101,4,78,0,39,0, +59,1,15,64,196,122,48,138,48,2,121,52,137,52,2,101,43,1,90,58,106,58,2,54, +14,70,14,2,29,31,45,31,2,29,38,45,38,2,47,37,1,29,37,1,75,36,107,36,2,47, +36,63,36,2,29,36,1,139,35,1,47,35,1,29,35,1,47,34,1,29,34,1,47,22,1,27,22, +1,47,21,1,27,21,1,75,20,107,20,2,47,20,1,27,20,1,45,19,1,27,19,1,121,6,137, +6,2,11,6,27,6,2,34,48,18,22,72,34,33,22,48,18,22,72,22,23,26,33,42,33,2,73, +23,1,26,23,42,23,2,33,23,159,28,175,28,191,28,3,28,64,29,33,72,28,64,0,16, +22,34,4,144,50,160,50,176,50,3,127,50,1,32,50,64,50,2,50,61,128,40,71,8,16, +61,1,0,50,28,16,4,23,33,21,23,15,55,80,11,16,45,80,5,22,0,63,237,63,237,63, +63,18,23,57,1,93,47,237,26,16,220,93,93,93,23,50,26,205,43,93,50,50,93,93, +93,17,51,43,17,51,43,49,48,0,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93, +93,93,93,93,93,93,93,93,93,93,0,93,1,93,0,93,1,93,37,14,3,35,34,2,17,16,18, +51,50,30,2,23,51,62,3,55,51,14,3,7,30,3,23,35,46,3,39,1,20,30,2,51,50,62, +2,55,46,3,35,34,14,2,3,75,26,65,87,111,70,205,193,217,209,69,112,86,63,20, +2,4,14,19,23,13,188,22,46,39,30,5,3,23,31,36,18,183,11,21,16,13,3,253,196, +28,59,93,66,54,100,82,61,14,12,45,71,102,70,66,96,64,31,237,56,94,69,38,1, +20,1,24,1,28,1,26,39,69,93,54,21,56,63,65,30,47,128,139,139,58,103,175,144, +110,39,28,66,65,58,20,1,49,112,160,103,48,52,107,160,108,86,154,115,68,46, +102,163,0,2,0,142,254,87,4,73,5,204,0,32,0,62,0,185,64,68,149,20,1,154,16, +1,123,7,139,7,2,122,60,138,60,2,106,3,122,3,138,3,3,102,31,118,31,2,74,50, +90,50,106,50,3,21,2,37,2,101,2,117,2,133,2,5,147,21,1,21,21,37,21,2,28,48, +23,72,52,48,48,64,48,2,96,48,1,48,184,255,192,64,58,20,23,72,48,52,48,52, +14,0,72,64,48,43,64,43,160,43,3,160,43,176,43,192,43,3,43,64,128,33,13,70, +0,14,16,14,48,14,3,8,14,28,48,80,49,49,38,57,80,18,0,13,27,33,38,80,9,5,22, +0,63,51,237,50,63,63,237,18,57,47,237,57,1,47,94,93,237,50,26,16,220,93,113, +26,237,18,57,57,47,47,43,93,113,16,237,17,57,49,48,93,93,93,93,93,0,93,93, +93,1,93,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35,17,52,54,51,50,30,2,21, +20,14,2,7,30,3,1,30,3,51,50,62,2,53,52,46,2,35,53,62,1,53,52,46,2,35,34,14, +2,21,4,73,53,111,173,120,102,160,56,6,3,3,180,228,226,99,152,102,53,35,61, +81,46,57,114,91,56,252,249,28,71,81,87,43,72,110,73,38,38,81,128,89,127,113, +27,57,87,60,70,104,68,34,1,149,89,154,116,66,55,39,57,92,53,254,215,5,172, +237,220,47,90,130,82,73,111,82,56,18,11,55,93,137,254,218,19,34,25,14,41, +76,106,66,65,110,81,45,142,27,139,122,44,77,57,32,35,77,122,88,0,0,0,0,1, +0,7,254,88,3,249,4,58,0,24,0,237,64,59,59,22,75,22,2,41,22,1,59,21,75,21, +2,26,21,42,21,2,9,21,1,42,12,58,12,74,12,3,25,12,1,77,13,1,13,16,13,16,72, +66,2,1,54,2,1,34,2,1,6,2,22,2,2,13,2,1,1,17,1,184,255,240,64,76,13,16,72, +24,15,7,7,13,14,16,15,14,47,14,2,57,31,14,63,14,95,14,127,14,159,14,191,14, +223,14,255,14,8,63,14,127,14,159,14,191,14,223,14,255,14,6,0,14,32,14,2,224, +14,1,191,14,1,160,14,1,95,14,159,14,2,0,14,16,14,64,14,3,8,14,1,0,184,255, +240,64,17,127,0,1,0,64,26,1,0,26,48,26,96,26,144,26,4,26,184,255,192,64,14, +21,26,72,7,15,24,3,25,20,27,13,13,0,15,0,63,50,47,63,17,23,51,1,43,93,113, +47,93,56,50,47,94,93,93,93,93,93,113,113,114,94,93,56,51,57,61,47,51,51,49, +48,43,94,93,94,93,93,93,93,43,93,93,93,93,93,93,93,93,19,51,19,30,3,23,62, +3,55,19,51,1,14,3,7,35,62,1,55,7,192,245,7,21,20,17,4,5,18,21,22,8,239,191, +254,122,17,31,27,23,7,191,17,48,24,4,58,253,93,22,63,67,63,22,21,62,67,63, +22,2,165,251,251,45,111,124,132,65,131,213,91,0,0,0,2,0,86,255,236,4,29,5, +204,0,19,0,50,0,156,64,81,115,28,131,28,2,106,28,1,118,46,134,46,2,106,46, +1,90,2,106,2,2,90,17,106,17,2,85,13,101,13,2,114,26,130,26,2,38,26,1,128, +25,1,114,25,1,51,25,67,25,2,50,50,31,71,0,64,25,46,5,47,47,41,31,0,1,144, +0,1,0,52,128,10,71,31,41,1,41,47,20,80,5,184,255,224,64,22,23,28,72,5,24, +18,22,72,111,5,1,90,5,1,5,46,48,0,15,80,36,22,0,63,237,63,57,57,93,93,43, +43,237,50,1,47,93,237,26,16,204,93,113,17,57,47,57,57,51,26,16,237,50,47, +49,48,93,93,93,93,93,93,93,93,93,93,93,93,1,52,46,2,39,14,3,21,20,30,2,51, +50,62,2,1,34,46,2,39,1,30,3,21,20,14,2,35,34,46,2,53,52,62,2,55,1,53,33,21, +3,96,49,69,76,26,73,134,102,60,35,73,111,77,81,112,69,31,254,255,13,42,45, +41,13,1,60,54,102,79,49,64,123,180,115,114,180,125,66,73,127,169,96,254,193, +2,221,1,215,85,145,115,86,27,26,81,114,146,91,76,131,96,55,54,95,131,3,191, +2,3,2,1,254,188,55,116,134,159,97,110,182,131,72,68,127,183,115,112,176,135, +97,33,1,83,119,132,0,1,0,70,255,236,3,106,4,78,0,57,0,179,64,49,140,37,1, +133,3,1,53,36,69,36,2,55,34,1,42,8,1,37,5,1,14,24,9,12,72,10,29,26,29,42, +29,3,42,70,21,48,27,48,27,48,16,35,35,6,64,37,48,72,6,184,255,192,179,14, +17,72,6,184,255,192,64,66,8,11,72,6,59,53,71,31,16,63,16,79,16,95,16,4,16, +64,37,43,72,16,128,59,1,31,59,95,59,2,21,48,80,15,47,31,47,79,47,95,47,175, +47,223,47,239,47,7,191,47,207,47,2,47,47,0,39,80,36,32,16,0,80,5,11,22,0, +63,51,237,63,51,237,18,57,47,93,113,237,57,1,93,113,47,43,93,237,16,198,43, +43,43,50,47,17,57,57,47,47,18,57,237,49,48,93,43,0,93,1,93,0,93,93,93,93, +37,50,62,2,55,23,14,3,35,34,46,2,53,52,62,2,55,53,46,3,53,52,62,2,51,50,22, +23,7,46,1,35,34,6,21,20,30,2,51,21,34,14,2,21,20,30,2,1,200,54,96,79,63,21, +105,32,84,106,130,78,96,141,92,45,42,72,96,54,51,85,61,34,50,95,136,87,118, +191,67,128,47,125,75,91,96,55,97,131,75,72,139,109,66,29,52,74,114,31,48, +56,26,100,39,71,53,32,46,84,116,69,58,95,69,42,5,2,6,40,64,86,51,62,106,77, +44,86,99,88,71,68,85,74,57,70,37,12,135,11,40,80,69,45,69,46,24,0,0,0,1,0, +86,254,159,3,96,5,204,0,56,0,209,64,117,169,38,1,156,29,172,29,2,149,55,165, +55,2,173,39,1,124,39,140,39,156,39,3,117,8,1,115,2,1,100,36,132,36,148,36, +164,36,4,139,24,155,24,171,24,3,57,24,1,44,31,156,31,172,31,3,44,30,60,30, +76,30,3,100,54,132,54,164,54,3,38,54,86,54,2,240,47,1,47,47,21,0,71,33,40, +50,50,10,31,21,79,21,2,191,21,1,21,64,29,33,72,0,21,16,21,32,21,64,21,4,7, +21,50,47,80,5,26,0,184,255,240,64,31,19,22,72,135,0,151,0,2,218,33,1,169, +33,185,33,201,33,3,136,33,152,33,2,26,33,0,3,15,48,0,15,0,47,63,18,23,57, +93,93,93,93,43,17,51,237,50,1,47,94,93,43,93,113,205,50,47,51,47,237,18,57, +47,113,49,48,93,93,93,93,0,93,93,1,93,0,93,93,1,93,93,93,0,93,1,93,1,20,30, +2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,55,53,14,3,35, +33,53,33,21,14,5,1,21,43,74,100,57,54,111,90,58,18,26,29,10,126,9,19,16,11, +36,66,94,57,42,89,82,73,54,31,49,85,113,127,135,64,12,34,36,34,11,254,167, +2,130,62,131,123,108,81,47,1,123,64,79,49,31,15,15,34,57,88,68,34,68,62,51, +17,56,12,33,38,39,19,34,45,33,25,13,10,23,36,50,74,100,67,83,176,176,175, +166,155,68,4,1,1,1,1,131,127,70,157,166,172,171,166,0,0,0,0,1,0,106,254,88, +3,238,4,78,0,35,0,100,185,0,32,255,232,64,46,9,12,72,35,70,64,80,0,1,159, +0,255,0,2,0,37,128,23,12,70,192,13,1,0,13,16,13,48,13,224,13,240,13,5,8,13, +240,37,1,255,37,1,112,37,1,37,184,255,192,64,14,19,23,72,35,27,23,6,80,29, +16,17,15,12,21,0,63,63,63,237,50,63,1,43,93,93,113,47,94,93,113,237,50,26, +16,220,93,113,26,237,49,48,43,1,17,52,46,2,35,34,14,2,21,17,35,17,52,38,39, +51,30,3,21,51,62,3,51,50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,22, +14,170,9,14,10,5,3,26,62,82,106,70,90,130,84,39,254,88,4,86,79,106,65,27, +45,85,125,81,253,141,3,83,68,121,42,21,48,49,47,20,47,76,53,29,44,92,145, +100,251,135,0,0,0,0,3,0,106,255,236,4,9,5,203,0,15,0,26,0,37,0,194,64,108, +153,19,169,19,2,150,24,166,24,2,138,2,1,133,5,1,138,14,1,133,10,1,124,36, +140,36,2,115,29,131,29,2,85,29,101,29,2,124,18,140,18,2,74,18,90,18,106,18, +3,115,25,131,25,2,69,25,85,25,101,25,3,6,13,22,13,2,6,10,1,9,5,1,9,2,1,7, +33,0,71,64,15,21,31,21,127,21,143,21,239,21,255,21,6,21,64,45,48,72,21,39, +128,32,22,71,32,8,1,8,184,255,192,183,29,35,72,8,48,39,1,39,184,255,192,64, +19,30,35,72,223,39,1,22,80,32,32,16,27,80,11,0,16,80,3,22,0,63,237,63,237, +18,57,47,237,1,93,43,113,47,43,93,237,50,26,16,220,43,113,26,237,51,49,48, +0,94,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,16,2,35,34,46, +1,2,53,16,18,51,50,30,1,18,1,50,62,2,55,33,30,3,19,34,14,2,7,33,46,3,4,9, +240,228,108,171,118,62,233,232,121,175,112,54,254,42,62,100,73,42,3,253,221, +3,44,71,94,66,62,99,72,42,3,2,35,3,40,69,97,2,221,254,131,254,140,92,186, +1,27,192,1,117,1,121,93,188,254,231,252,216,52,128,216,164,164,215,129,52, +4,217,51,126,212,161,161,212,126,51,0,0,0,1,0,137,0,0,1,141,4,58,0,13,1,13, +64,210,13,8,70,207,5,223,5,2,0,5,32,5,208,5,3,9,5,5,14,15,95,15,111,15,2, +32,15,1,224,15,240,15,2,111,15,127,15,143,15,3,0,15,16,15,32,15,3,205,207, +15,223,15,239,15,3,96,15,1,127,15,207,15,2,64,15,80,15,2,175,15,223,15,239, +15,3,96,15,112,15,2,15,15,31,15,2,154,255,15,1,208,15,224,15,2,63,15,1,159, +15,175,15,2,112,15,1,223,15,1,144,15,1,63,15,79,15,2,0,15,1,106,159,15,223, +15,239,15,3,96,15,112,15,2,15,15,1,239,15,255,15,2,128,15,208,15,2,63,15, +1,96,15,1,15,15,31,15,2,55,207,15,255,15,2,144,15,160,15,176,15,3,31,15,47, +15,63,15,3,176,15,192,15,208,15,3,15,15,31,15,111,15,3,144,15,160,15,224, +15,3,31,15,63,15,2,0,15,1,7,6,15,0,21,0,63,63,1,94,93,93,93,113,113,114,114, +114,94,93,93,113,113,113,114,114,114,94,93,93,93,93,113,113,114,114,114,94, +93,93,93,113,113,114,114,94,93,93,93,113,113,17,18,57,47,94,93,113,237,50, +49,48,51,46,3,53,17,51,17,20,30,2,23,199,15,24,15,8,180,11,21,30,18,16,53, +64,70,33,3,78,252,169,32,64,60,52,19,0,0,0,1,0,138,0,0,4,3,4,58,0,11,0,158, +64,114,148,9,164,9,2,102,9,118,9,134,9,3,172,0,1,139,0,155,0,2,105,0,121, +0,2,86,10,150,10,166,10,3,151,10,167,10,2,84,10,1,70,7,134,7,2,1,10,247,8, +1,8,10,9,16,9,9,0,11,16,0,11,160,11,2,0,11,16,11,32,11,64,11,160,11,224,11, +6,7,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2, +1,7,10,4,8,5,15,4,0,21,0,63,50,63,51,23,57,1,93,93,47,94,93,237,50,47,94, +93,113,56,51,57,47,56,57,51,113,17,51,49,48,0,93,93,93,1,93,93,93,93,93,93, +33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73, +1,206,1,238,109,254,127,4,58,253,243,2,13,254,47,253,151,0,0,0,0,1,0,14,0, +0,3,238,5,204,0,33,1,60,64,101,149,15,1,157,23,1,138,2,1,137,1,1,137,25,153, +25,2,140,21,156,21,2,115,0,131,0,147,0,3,140,20,156,20,2,106,20,122,20,2, +146,32,1,132,32,1,101,32,117,32,2,3,102,26,118,26,150,26,3,141,26,157,26, +2,2,126,26,1,108,26,1,3,84,18,1,148,31,1,101,31,117,31,133,31,3,86,31,1,146, +29,1,2,128,29,1,84,29,1,144,28,1,28,184,255,224,64,59,13,16,72,146,27,1,84, +27,100,27,116,27,3,93,0,109,0,2,149,17,1,73,17,1,150,18,1,138,18,1,101,18, +117,18,2,38,18,86,18,2,42,3,58,3,74,3,122,3,138,3,5,26,0,20,10,10,19,32,33, +184,255,240,64,69,33,20,19,16,31,19,63,19,2,31,19,63,19,95,19,127,19,159, +19,191,19,223,19,255,19,8,223,19,255,19,2,192,19,1,95,19,159,19,2,0,19,16, +19,64,19,3,8,19,0,35,48,35,96,35,160,35,176,35,5,26,0,13,33,19,21,6,80,13, +0,0,63,237,63,51,18,57,57,1,93,47,94,93,93,93,93,113,114,56,51,47,56,51,18, +57,47,18,57,57,49,48,93,93,93,93,93,93,93,0,93,1,93,93,43,93,93,93,95,93, +93,93,93,0,93,95,93,93,95,93,1,93,95,93,93,93,93,93,93,93,93,93,93,93,0,93, +1,39,46,3,35,34,6,7,39,62,1,51,50,30,2,23,1,35,3,46,3,39,14,3,7,1,35,1,207, +36,27,42,45,57,40,11,32,6,35,25,72,32,55,87,73,67,36,1,171,190,207,8,18,18, +16,5,7,22,25,24,8,254,255,187,3,197,99,73,105,67,31,7,3,130,9,15,36,81,131, +95,251,139,2,65,22,56,59,56,21,21,60,62,55,18,253,193,0,0,0,1,0,138,254,119, +4,6,4,58,0,41,0,108,64,55,13,40,14,17,72,90,8,106,8,2,35,70,5,15,34,95,34, +2,159,34,175,34,255,34,3,0,34,16,34,32,34,3,7,34,43,23,19,70,0,20,16,20,48, +20,240,20,4,8,20,96,43,128,43,2,43,184,255,192,64,15,20,23,72,41,21,34,21, +15,19,5,28,80,14,11,22,0,63,51,237,50,47,63,51,63,1,43,93,47,94,93,237,50, +16,220,94,93,93,113,50,237,49,48,0,93,1,43,33,46,3,53,35,14,3,35,34,38,39, +35,30,1,21,17,35,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,30,2,23,3,94, +1,3,3,3,4,26,56,69,86,57,82,120,32,4,3,1,182,182,25,59,98,74,67,100,67,33, +181,1,2,2,1,6,46,59,59,20,51,79,53,27,64,58,32,63,27,254,139,5,195,253,124, +69,116,85,47,52,91,126,75,2,105,252,175,34,76,67,49,7,0,0,1,0,0,0,0,3,178, +4,58,0,18,2,35,64,79,130,17,146,17,162,17,3,153,6,169,6,2,131,8,147,8,163, +8,3,3,87,8,103,8,119,8,3,6,5,9,32,14,17,72,9,9,7,15,16,16,0,70,64,91,12,107, +12,123,12,3,91,12,219,12,235,12,3,180,12,196,12,2,11,12,27,12,59,12,91,12, +107,12,5,7,12,20,128,8,7,184,255,240,64,255,7,11,20,27,20,2,11,20,27,20,75, +20,91,20,139,20,155,20,203,20,219,20,8,255,20,1,196,20,212,20,2,160,20,1, +132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4,20,20,20,2,199,224,20,1,196, +20,212,20,2,160,20,1,4,20,20,20,68,20,84,20,132,20,148,20,6,68,20,84,20,132, +20,148,20,196,20,212,20,6,27,20,1,4,20,1,219,20,1,196,20,1,155,20,1,132,20, +1,91,20,1,68,20,1,27,20,1,4,20,1,151,11,20,27,20,75,20,91,20,139,20,155,20, +203,20,219,20,8,155,20,203,20,219,20,3,132,20,1,96,20,1,68,20,84,20,2,32, +20,1,4,20,20,20,2,224,20,1,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20, +1,4,20,20,20,68,20,84,20,4,103,4,20,20,20,68,20,84,20,132,20,148,20,196,20, +212,20,8,219,20,1,196,20,1,155,20,1,132,20,1,91,20,1,68,20,1,27,20,1,4,20, +1,219,20,1,196,20,1,11,20,27,20,75,20,91,20,139,20,155,20,64,93,6,55,75,20, +91,20,139,20,155,20,203,20,219,20,6,63,20,1,32,20,1,4,20,20,20,2,224,20,1, +196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4, +20,20,20,2,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,2,80,20,1,47, +20,1,0,20,16,20,2,7,15,7,15,9,6,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93, +93,113,113,113,113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113, +113,113,113,113,113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114, +94,93,93,93,93,93,93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93, +93,93,93,113,114,47,56,51,26,16,220,94,93,93,113,114,26,237,50,17,51,17,57, +61,47,43,51,51,49,48,93,95,93,93,93,1,20,14,2,7,35,1,51,1,54,18,53,52,38, +39,51,30,1,3,178,63,106,140,77,170,254,122,189,1,55,142,124,29,20,177,24, +28,3,78,99,218,221,214,94,4,58,252,96,185,1,86,156,81,119,45,45,113,0,0,0, +1,0,86,254,159,3,106,5,204,0,74,1,0,64,125,122,71,138,71,2,101,33,117,33, +133,33,3,105,39,1,85,50,1,83,44,1,57,2,1,110,66,126,66,142,66,3,26,66,42, +66,2,12,29,28,29,44,29,3,13,40,9,12,72,12,73,28,73,44,73,108,73,124,73,140, +73,6,5,11,95,37,1,79,37,1,112,37,128,37,2,37,17,95,26,1,111,26,1,26,37,26, +52,63,31,70,11,32,11,1,23,11,23,11,0,31,63,63,63,79,63,111,63,127,63,143, +63,175,63,191,63,207,63,9,159,63,175,63,255,63,3,63,184,255,192,64,17,7,11, +72,63,42,71,31,0,1,0,5,37,80,31,11,24,42,184,255,240,64,32,19,22,72,151,42, +1,0,16,19,22,72,152,0,1,52,0,42,3,57,32,36,1,36,36,24,57,26,17,23,80,24,0, +0,63,237,50,50,47,18,57,47,93,18,23,57,93,43,93,43,18,57,57,237,57,1,47,93, +237,47,43,93,113,18,57,57,47,47,93,16,237,16,205,50,50,47,93,114,51,47,93, +113,114,18,57,49,48,93,43,93,0,93,93,1,93,0,93,93,93,1,93,0,93,19,52,62,2, +55,53,46,3,53,52,62,2,55,53,14,3,43,1,53,33,21,14,3,21,20,30,2,23,21,14,3, +21,20,30,2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,86,51,110,175, +125,68,118,87,51,50,79,97,47,12,68,80,76,18,74,2,122,77,144,112,68,60,99, +130,69,100,175,131,76,43,74,100,57,54,114,94,61,18,26,29,10,126,9,19,16,11, +39,70,97,57,42,89,82,73,54,31,1,98,76,147,124,90,19,2,5,39,68,96,62,64,93, +64,40,10,8,1,2,3,2,131,125,9,34,59,90,67,63,81,49,24,6,131,13,54,89,127,84, +64,79,49,31,15,15,34,57,88,68,34,68,62,51,17,56,12,33,38,39,19,34,45,33,25, +13,10,23,36,50,74,100,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0, +79,255,236,5,43,4,58,0,48,0,115,64,35,53,12,117,12,133,12,3,3,40,7,17,72, +3,40,7,17,72,46,80,32,96,32,2,46,32,35,70,64,111,5,1,80,5,1,5,184,255,192, +64,38,8,11,72,5,50,128,15,50,47,50,2,13,7,72,79,25,95,25,111,25,207,25,4, +25,14,20,34,7,20,80,31,15,14,21,40,80,0,22,0,63,237,63,63,237,50,50,1,47, +50,50,93,237,50,93,26,16,220,43,93,113,26,237,50,50,93,47,49,48,43,0,43,1, +93,5,34,46,2,53,17,33,21,20,14,2,7,35,62,3,61,1,34,14,2,7,53,62,3,51,33,21, +35,17,20,30,2,51,50,62,2,55,21,14,1,4,102,59,82,52,24,254,110,16,27,36,19, +188,19,39,32,20,39,79,69,53,12,12,43,51,54,23,4,37,234,13,24,35,22,7,23,25, +23,8,31,69,20,28,59,94,66,2,212,72,131,251,228,195,74,76,197,226,247,125, +80,7,10,13,7,139,6,11,8,4,131,253,83,44,56,32,13,2,2,3,1,129,8,12,0,2,0,132, +254,87,4,59,4,79,0,26,0,47,0,129,64,64,122,25,1,101,20,117,20,2,106,19,122, +19,2,106,45,122,45,2,75,8,91,8,107,8,3,125,30,1,107,30,1,74,30,90,30,2,0, +71,64,160,27,1,27,49,128,38,15,70,223,16,1,0,16,16,16,48,16,3,8,16,48,49, +1,49,184,255,192,64,21,30,35,72,223,49,1,96,49,128,49,2,32,80,22,16,15,27, +43,80,5,22,0,63,237,63,63,237,1,93,93,43,113,47,94,93,113,237,50,26,16,220, +93,26,237,49,48,93,93,93,0,93,1,93,93,0,93,1,93,1,20,14,2,35,34,46,2,39,35, +30,1,21,17,35,17,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,17,30,3,51,50, +62,2,4,59,63,115,161,98,62,98,80,66,28,4,2,2,180,60,116,169,110,103,181,134, +78,193,44,83,116,72,69,100,64,30,28,72,80,87,44,67,100,67,33,2,4,118,197, +142,79,20,37,53,33,30,61,32,254,87,3,238,119,193,136,74,79,150,219,131,104, +166,115,61,53,101,146,93,254,195,35,55,37,20,58,107,152,0,0,1,0,86,254,159, +3,156,4,78,0,57,0,209,64,38,137,55,1,139,54,1,143,53,1,123,53,1,106,50,1, +96,2,1,52,15,68,15,84,15,3,82,10,98,10,130,10,3,51,10,67,10,2,3,184,255,224, +64,52,12,17,72,3,24,11,14,72,26,31,106,31,122,31,138,31,4,139,30,1,10,37, +26,37,2,7,71,31,40,1,40,52,17,79,28,1,143,28,159,28,223,28,3,28,64,24,27, +72,96,28,1,28,184,255,192,183,7,12,72,28,48,59,1,59,184,255,192,64,19,30, +35,72,223,59,1,12,33,40,16,19,22,72,136,40,152,40,2,7,184,255,240,64,19,19, +22,72,135,7,151,7,2,33,7,40,3,22,53,0,80,47,16,22,0,47,63,237,51,18,23,57, +93,43,93,43,17,51,1,93,43,113,47,43,93,43,93,113,205,50,47,93,237,49,48,93, +93,0,93,43,1,43,0,93,93,93,1,93,0,93,1,93,93,0,93,93,1,34,14,4,21,20,30,2, +23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,51,50,30,2,23, +7,46,3,2,70,54,88,67,49,32,15,32,76,124,92,53,114,95,61,18,26,29,10,126,9, +19,16,11,35,68,97,63,66,113,94,72,50,26,20,46,75,110,148,97,68,99,73,54,22, +116,18,42,49,57,3,193,49,80,104,108,106,42,68,96,72,57,30,17,37,59,89,68, +34,68,62,51,17,56,12,33,38,39,19,30,44,36,31,17,18,40,51,68,93,122,81,47, +130,140,136,108,66,21,34,44,23,119,19,36,28,17,0,2,0,86,255,236,4,209,4,58, +0,28,0,47,0,132,64,94,133,12,1,122,13,138,13,2,131,46,1,101,46,117,46,2,100, +42,116,42,132,42,3,124,33,140,33,2,90,33,106,33,2,143,38,1,108,38,124,38, +2,74,38,90,38,2,15,17,31,17,111,17,127,17,4,7,17,0,71,64,15,29,143,29,191, +29,3,0,29,32,29,64,29,3,29,49,128,40,71,31,10,143,10,2,10,23,35,80,15,15, +43,80,5,22,0,63,237,63,237,50,1,47,93,237,26,16,220,93,113,26,237,196,94, +93,49,48,0,93,93,93,1,93,93,93,0,93,93,93,1,93,1,20,14,2,35,34,46,2,53,52, +62,2,51,33,21,35,34,46,2,39,21,30,3,7,52,46,2,39,35,34,14,2,21,20,22,51,50, +62,2,4,48,61,123,183,123,123,186,124,63,86,153,213,126,2,57,165,9,35,43,44, +17,28,55,43,26,189,20,34,45,25,89,83,143,107,61,151,147,78,117,76,38,1,235, +112,188,135,76,74,139,202,129,144,210,138,66,131,1,2,2,1,4,42,99,115,131, +78,74,132,116,99,42,50,105,160,110,207,206,52,97,139,0,1,0,29,255,236,3,24, +4,58,0,35,0,99,64,50,35,13,131,13,2,31,32,12,17,72,13,31,29,31,45,31,3,26, +13,26,127,5,143,5,2,5,15,70,0,34,32,34,2,34,34,36,37,79,37,1,208,37,1,159, +37,1,16,37,1,37,184,255,192,64,12,14,17,72,20,80,29,22,14,35,80,11,15,0,63, +237,50,63,237,1,43,93,93,93,113,17,18,57,47,93,253,204,93,51,51,47,49,48, +0,93,43,1,93,1,34,14,2,7,53,62,3,51,33,21,33,17,20,30,2,51,50,62,2,55,21, +14,1,35,34,46,2,53,17,1,25,39,79,69,53,12,12,43,51,54,23,2,68,254,208,13, +24,35,22,7,23,25,23,8,31,69,43,59,82,52,24,3,183,7,10,13,7,139,6,11,8,4,131, +253,83,44,56,32,13,2,2,3,1,129,8,12,28,59,94,66,2,212,0,0,0,1,0,133,255,236, +3,254,4,58,0,31,0,113,64,62,134,3,1,133,15,149,15,2,106,18,122,18,2,86,28, +1,25,8,41,8,2,27,0,71,64,15,21,1,47,21,159,21,2,160,21,1,21,33,128,13,70, +0,10,16,10,48,10,240,10,4,8,10,240,33,1,255,33,1,112,33,1,33,184,255,192, +64,13,20,23,72,31,33,1,26,11,15,16,80,5,22,0,63,237,63,51,1,93,43,93,93,113, +47,94,93,237,26,16,220,93,113,114,26,237,50,49,48,93,93,93,93,93,1,20,14, +2,35,34,46,2,53,17,51,17,20,22,51,50,62,2,53,52,46,2,39,51,30,3,3,254,53, +113,176,123,109,160,104,51,181,117,134,73,104,65,30,20,33,40,21,188,18,40, +32,21,2,59,137,218,154,82,50,107,166,116,2,151,253,99,146,148,50,108,170, +120,68,147,139,120,41,40,113,134,149,0,2,0,85,254,87,4,218,4,82,0,35,0,45, +0,130,64,21,101,34,1,101,33,117,33,133,33,3,74,21,90,21,2,69,21,85,21,2,45, +184,255,192,179,11,14,72,25,184,255,224,64,54,11,14,72,11,29,27,29,2,64,19, +80,19,2,19,19,24,71,13,7,36,71,224,0,1,0,43,6,72,27,0,7,64,7,2,7,64,47,1, +19,80,18,18,39,80,31,16,43,27,80,5,8,22,6,27,0,63,63,51,237,50,63,237,51, +47,237,1,113,47,93,51,253,50,220,113,237,16,220,237,50,47,93,49,48,93,0,43, +43,1,93,0,93,1,93,93,1,20,14,2,7,17,35,17,46,3,53,52,62,2,55,23,14,3,21,20, +22,23,17,52,54,51,50,30,2,7,52,38,35,34,6,21,17,62,1,4,218,74,132,184,110, +170,114,181,125,67,49,103,159,109,21,69,96,60,27,147,151,154,158,84,133,92, +49,189,87,80,68,76,162,149,2,53,151,215,140,71,6,254,105,1,151,5,72,138,207, +141,102,188,150,103,18,136,15,77,114,143,80,213,201,8,2,68,193,212,76,141, +199,121,193,211,129,140,253,185,7,218,0,0,0,1,0,21,254,88,4,27,4,80,0,27, +1,26,64,51,169,25,1,153,3,1,138,6,154,6,2,174,23,1,123,23,139,23,155,23,3, +84,21,1,173,27,1,140,27,156,27,2,123,27,1,90,27,106,27,2,41,27,57,27,2,26, +16,9,17,72,2,184,255,240,64,99,9,17,72,162,1,1,131,1,147,1,2,116,1,1,69,1, +85,1,101,1,3,38,1,54,1,2,166,25,1,153,25,1,39,25,55,25,71,25,3,3,101,19,117, +19,2,86,19,1,39,19,55,19,2,25,22,0,3,4,2,26,23,24,24,27,26,16,27,26,59,26, +91,26,123,26,155,26,187,26,219,26,7,219,26,251,26,2,4,26,20,26,68,26,3,7, +26,13,13,1,2,184,255,240,183,2,36,29,1,11,29,1,22,184,255,208,64,41,14,17, +72,70,22,1,53,22,1,139,0,1,125,0,1,2,75,0,91,0,107,0,3,63,0,1,0,25,3,22,4, +1,23,15,9,80,16,16,27,1,27,0,63,51,63,237,63,18,23,57,93,93,95,93,93,93,93, +43,1,93,93,47,56,51,51,47,47,94,93,93,113,56,51,51,47,51,17,18,23,57,49,48, +93,93,93,95,93,93,93,93,93,93,93,93,43,43,93,93,93,93,93,93,93,93,93,93,0, +93,37,1,35,1,3,46,3,35,34,6,7,39,62,1,51,50,30,2,23,19,1,51,9,1,35,2,30,254, +179,188,1,184,170,27,44,40,42,25,11,32,7,34,24,62,32,48,70,60,59,36,142,1, +8,187,254,144,1,150,190,239,253,105,3,57,1,87,54,82,55,28,7,3,131,9,11,27, +62,102,75,254,217,2,27,253,71,252,215,0,0,1,0,135,254,87,5,44,5,60,0,31,0, +128,64,90,121,18,1,18,16,7,10,72,121,19,137,19,153,19,3,121,11,1,11,16,7, +10,72,121,10,137,10,153,10,3,24,70,21,15,5,70,8,0,14,72,29,0,15,16,15,160, +15,208,15,4,8,15,128,33,176,33,224,33,3,111,33,1,32,33,1,255,33,1,80,33,128, +33,144,33,192,33,4,30,30,6,22,15,0,29,80,13,16,22,14,27,0,63,63,51,237,50, +63,51,51,47,1,93,93,113,113,113,47,94,93,51,253,50,220,237,16,220,237,49, +48,0,93,43,93,93,43,93,37,62,3,53,17,51,17,20,14,2,7,17,35,17,46,3,53,17, +51,17,20,30,2,23,17,51,3,46,87,124,80,37,182,59,124,193,134,170,134,192,124, +59,181,38,79,124,87,170,119,1,31,73,121,91,2,134,253,124,122,172,110,53,1, +254,107,1,149,1,53,110,172,122,2,132,253,122,90,121,73,32,1,4,197,0,0,0,0, +1,0,83,255,236,5,235,4,79,0,63,0,176,64,83,153,33,169,33,2,153,26,169,26, +2,119,16,1,122,58,138,58,2,10,37,26,37,42,37,154,37,170,37,5,10,22,26,22, +42,22,154,22,170,22,5,29,0,73,61,61,40,8,46,13,46,13,51,19,71,64,128,8,176, +8,2,15,8,1,7,8,65,128,51,71,63,40,1,40,0,65,1,48,65,1,240,65,1,65,184,255, +192,64,32,30,35,72,175,65,223,65,2,0,65,32,65,64,65,3,30,35,62,62,14,3,56, +80,24,35,22,46,13,80,45,14,16,0,63,51,237,50,63,51,237,50,17,57,47,18,57, +1,93,93,43,93,113,114,47,93,237,26,16,220,94,93,93,26,237,18,57,57,47,47, +17,18,57,47,237,57,49,48,0,93,93,1,93,93,0,93,93,1,20,22,51,50,62,2,53,52, +46,2,39,55,30,3,21,20,14,2,35,34,46,2,39,35,14,3,35,34,46,2,53,52,62,2,55, +23,14,3,21,20,30,2,51,50,62,2,61,1,51,3,115,114,102,65,87,53,22,29,61,97, +67,23,109,159,103,49,53,101,148,95,68,104,77,52,16,4,16,52,77,105,67,95,148, +101,53,49,103,159,109,23,68,96,62,28,22,52,86,65,51,82,57,30,166,1,193,157, +173,56,102,145,90,82,150,121,84,15,139,18,112,161,194,101,128,200,137,72, +36,68,99,64,64,99,68,36,72,137,200,128,101,194,161,112,18,139,15,84,121,150, +82,90,145,102,56,45,84,123,78,252,0,0,0,255,255,255,205,0,0,1,250,5,123,18, +38,1,130,0,0,17,6,0,105,160,0,0,25,182,2,1,14,17,38,2,1,184,255,217,180,18, +16,5,13,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,254,5,123, +18,38,1,142,0,0,17,7,0,105,0,242,0,0,0,25,182,2,1,32,17,38,2,1,184,255,244, +180,36,34,10,0,37,1,43,53,53,0,43,53,53,0,255,255,0,86,255,236,4,29,6,7,18, +38,0,82,0,0,17,7,1,80,1,41,0,0,0,19,64,11,2,35,17,38,2,70,35,38,8,0,37,1, +43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,254,6,7,18,38,1,142,0,0,17,7, +1,80,0,252,0,0,0,19,64,11,1,32,17,38,1,17,32,35,10,0,37,1,43,53,0,43,53,0, +0,0,255,255,0,83,255,236,5,235,6,7,18,38,1,146,0,0,17,7,1,80,1,255,0,0,0, +19,64,11,1,64,17,38,1,55,64,67,40,19,37,1,43,53,0,43,53,0,0,0,255,255,0,168, +0,0,4,254,6,178,16,38,0,40,0,0,17,7,2,152,1,121,0,0,0,153,185,0,21,255,192, +179,233,233,72,21,184,255,192,179,230,230,72,21,184,255,192,179,227,227,72, +21,184,255,192,179,224,224,72,21,184,255,192,179,221,221,72,21,184,255,192, +179,218,218,72,21,184,255,192,179,215,215,72,21,184,255,192,179,212,212,72, +21,184,255,192,179,209,209,72,21,184,255,192,179,206,206,72,21,184,255,192, +179,203,203,72,21,184,255,192,179,200,200,72,21,184,255,192,179,197,197,72, +21,184,255,192,64,10,11,11,72,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10, +37,1,43,53,53,0,43,53,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0, +1,0,46,255,236,6,79,5,129,0,45,0,133,64,13,155,31,171,31,2,101,37,117,37, +133,37,3,2,184,255,224,64,71,13,17,72,18,16,12,15,72,42,13,58,13,2,36,7,52, +7,2,20,20,10,42,1,39,90,45,175,40,1,0,40,1,40,10,90,0,29,16,29,176,29,224, +29,4,7,29,0,42,95,43,38,33,95,1,6,6,40,43,3,40,18,26,95,15,63,21,1,21,21, +15,19,0,63,51,47,93,16,237,63,63,18,57,47,51,237,50,16,237,50,1,47,94,93, +237,47,93,93,204,253,50,204,18,57,47,49,48,0,93,93,43,43,93,93,1,17,62,3, +51,50,22,29,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,61,1,52,38,35,34,14, +2,7,17,35,17,33,53,33,21,2,208,33,109,127,130,53,226,217,41,86,133,92,53, +88,75,64,29,111,18,41,48,56,33,84,80,129,144,51,123,120,105,33,190,254,28, +4,134,4,229,254,160,7,20,19,13,187,188,214,93,145,100,53,17,32,46,28,123, +16,33,26,17,101,111,219,119,122,10,15,17,8,253,12,4,229,156,156,0,255,255, +0,168,0,1,4,47,6,240,16,38,1,93,0,0,17,7,2,149,1,113,0,0,0,19,64,11,1,6,5, +38,1,33,6,9,4,0,37,1,43,53,0,43,53,0,0,0,0,1,0,104,255,236,5,121,5,150,0, +42,0,218,64,156,156,17,172,17,2,156,15,172,15,2,156,39,172,39,2,138,39,1, +156,41,172,41,2,138,41,1,137,31,1,117,11,1,117,10,165,10,2,166,26,1,73,26, +137,26,2,70,32,134,32,2,37,10,53,10,2,42,3,58,3,2,3,68,44,1,7,7,19,5,8,91, +116,29,132,29,2,203,29,219,29,2,68,29,1,43,29,1,29,37,235,19,1,100,19,116, +19,164,19,212,19,4,64,19,1,2,0,19,48,19,2,7,19,8,95,127,5,175,5,2,5,5,13, +34,79,38,1,38,38,0,95,34,4,13,95,24,16,18,32,18,2,48,18,64,18,112,18,128, +18,192,18,208,18,6,18,18,24,19,0,63,51,47,93,113,16,237,63,237,51,47,93,17, +18,57,47,113,237,1,47,94,93,95,93,93,113,51,47,93,93,93,113,237,50,17,57, +47,93,49,48,0,95,93,93,93,93,93,1,93,0,93,1,93,93,93,93,93,93,93,1,34,14, +2,7,33,21,33,30,3,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50, +4,23,7,46,3,3,24,111,173,124,73,10,2,142,253,114,9,77,128,176,109,90,141, +108,79,27,156,40,108,148,191,123,171,254,255,173,86,91,175,1,0,164,225,1, +46,71,181,20,68,102,137,4,250,68,126,178,110,154,112,185,132,72,50,82,105, +55,77,79,136,100,57,109,195,1,12,159,165,1,10,187,101,176,173,60,50,91,70, +42,0,0,255,255,0,93,255,236,4,248,5,150,18,6,0,54,0,0,255,255,0,189,0,0,1, +124,5,129,18,6,0,44,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2, +152,218,0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0, +255,255,0,32,255,236,3,104,5,129,18,6,0,45,0,0,0,2,0,18,255,240,8,11,5,129, +0,38,0,47,0,215,64,98,57,29,1,166,8,1,167,11,1,162,10,1,133,10,149,10,2,58, +10,1,154,15,170,15,2,141,13,157,13,173,13,3,121,13,1,116,47,132,47,148,47, +3,123,40,139,40,155,40,3,101,11,1,141,14,157,14,173,14,3,14,32,10,14,72,43, +30,123,30,139,30,155,30,4,42,31,122,31,2,0,90,48,39,1,0,39,16,39,2,7,39,20, +13,36,13,52,13,3,13,184,255,248,64,14,22,25,72,73,8,1,20,8,36,8,52,8,3,8, +184,255,248,64,39,22,25,72,9,31,73,31,2,8,13,31,3,175,20,191,20,2,20,33,44, +90,6,43,95,33,33,6,8,95,31,3,23,95,16,19,44,95,6,18,0,63,237,63,237,63,237, +18,57,47,237,1,47,237,50,47,93,23,51,113,43,113,113,43,113,47,94,93,113,237, +49,48,93,93,0,43,93,1,93,0,93,93,93,93,93,1,93,93,93,93,93,93,1,20,14,2,35, +33,17,33,3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,33,50,30,2, +7,52,38,35,33,17,33,50,54,8,11,61,121,182,121,253,183,254,96,49,22,43,49, +60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,3,2,1,126,125,186, +124,62,192,164,164,254,153,1,111,164,156,1,157,87,150,112,64,4,225,254,144, +172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161,1,254,253,172, +58,105,147,92,121,129,254,2,136,0,0,0,2,0,168,0,0,7,171,5,129,0,22,0,31,0, +110,64,25,116,31,132,31,148,31,3,123,24,139,24,155,24,3,38,20,54,20,2,0,90, +176,23,1,23,184,255,192,64,43,7,11,72,23,13,9,90,0,10,16,10,64,10,3,7,10, +17,28,90,14,0,6,1,8,6,27,95,17,17,8,95,13,13,10,15,11,3,10,18,28,95,6,18, +0,63,237,63,63,51,18,57,47,237,51,47,237,1,47,94,93,51,237,50,47,94,93,237, +50,47,43,93,237,49,48,0,93,93,93,1,20,14,2,35,33,17,33,17,35,17,51,17,33, +17,51,17,33,50,30,2,7,52,38,35,33,17,33,50,54,7,171,61,121,182,121,253,223, +253,194,191,191,2,62,191,1,86,125,186,124,62,192,164,164,254,193,1,71,164, +156,1,157,87,150,112,64,2,141,253,115,5,129,253,172,2,84,253,172,58,105,147, +92,121,129,254,2,136,0,0,0,0,1,0,46,0,0,6,47,5,129,0,27,0,131,64,13,155,2, +171,2,2,101,8,117,8,133,8,3,19,184,255,224,64,76,13,17,72,37,24,53,24,69, +24,3,18,13,10,90,16,175,11,1,0,11,48,11,2,11,27,90,0,0,48,0,192,0,208,0,4, +7,0,176,29,192,29,208,29,3,176,29,240,29,2,255,29,1,16,29,112,29,160,29,176, +29,4,9,4,95,18,23,23,0,17,13,95,14,3,11,0,18,0,63,50,63,237,50,18,57,47,51, +237,50,1,93,93,113,114,47,94,93,237,47,93,93,204,253,204,51,49,48,0,93,43, +93,93,33,17,52,38,35,34,14,2,7,17,35,17,33,53,33,21,33,17,62,3,51,50,22,21, +17,5,113,128,133,53,116,110,98,35,190,254,28,4,179,253,239,36,98,112,118, +56,229,214,2,63,122,109,10,15,18,7,253,12,4,229,156,156,254,160,8,20,18,13, +187,178,253,173,0,0,0,255,255,0,168,0,0,4,157,6,240,18,38,1,176,0,0,17,7, +2,149,1,172,0,0,0,19,64,11,1,23,5,38,1,37,23,26,0,13,37,1,43,53,0,43,53,0, +0,0,255,255,0,55,255,236,5,31,7,58,18,38,1,185,0,0,17,7,2,145,1,94,1,74,0, +19,64,11,1,26,5,38,1,7,31,39,21,25,37,1,43,53,0,43,53,0,0,0,0,1,0,168,254, +104,5,24,5,129,0,11,0,94,64,64,11,92,0,0,2,9,90,127,6,1,0,6,48,6,64,6,3,143, +6,159,6,207,6,3,0,6,64,6,2,6,5,90,0,2,16,2,64,2,3,7,2,16,13,1,32,13,128,13, +224,13,3,15,13,1,7,7,3,3,10,5,95,2,18,0,0,47,63,237,51,63,51,47,1,93,93,113, +47,94,93,237,47,93,93,113,113,237,18,57,47,237,49,48,1,17,33,17,51,17,33, +17,51,17,33,17,2,134,254,34,191,2,247,186,254,34,254,104,1,152,5,129,251, +31,4,225,250,127,254,104,255,255,0,4,0,0,5,82,5,129,18,6,0,36,0,0,0,2,0,168, +0,0,4,214,5,129,0,16,0,25,0,142,64,70,116,25,132,25,148,25,3,123,18,139,18, +155,18,3,153,14,1,38,14,1,9,9,0,90,223,17,1,80,17,128,17,2,31,17,1,255,17, +1,192,17,1,159,17,1,0,17,16,17,32,17,64,17,4,17,11,22,90,0,6,16,6,64,6,3, +7,6,48,27,1,27,184,255,192,64,27,30,35,72,223,27,1,21,95,64,11,1,160,11,208, +11,2,11,11,6,10,95,7,3,22,95,6,18,0,63,237,63,237,18,57,47,93,113,237,1,93, +43,113,47,94,93,237,50,47,93,93,93,93,113,113,113,237,50,47,49,48,0,93,93, +93,93,1,20,14,2,35,33,17,33,21,33,17,33,50,30,2,7,52,38,35,33,17,33,50,54, +4,214,61,121,182,121,253,183,3,158,253,33,1,126,125,186,124,62,192,164,164, +254,153,1,111,164,156,1,157,87,150,112,64,5,129,156,254,72,58,105,147,92, +121,129,254,2,136,0,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,255,255, +0,168,0,1,4,47,5,130,16,6,1,93,0,0,0,2,0,15,254,104,5,69,5,129,0,16,0,25, +0,194,64,95,150,10,1,150,20,1,150,15,1,144,19,1,134,19,1,115,22,131,22,2, +3,147,24,1,2,128,24,1,114,24,1,102,24,1,85,11,101,11,2,90,14,106,14,2,97, +23,145,23,2,83,23,1,53,23,69,23,2,2,92,3,3,0,90,191,17,207,17,2,160,17,1, +31,17,95,17,127,17,143,17,159,17,5,0,17,1,8,17,20,25,36,25,52,25,3,25,184, +255,248,64,11,22,25,72,20,19,36,19,52,19,3,19,184,255,248,64,28,22,25,72, +9,15,19,25,4,6,92,7,15,27,47,27,2,19,95,15,3,8,0,25,95,5,18,7,2,0,47,51,63, +237,50,50,63,237,1,93,47,237,23,51,43,113,43,113,47,94,93,93,93,93,237,50, +47,237,49,48,93,93,93,93,93,93,93,93,95,93,95,93,93,93,93,93,93,37,51,17, +35,17,33,17,35,17,51,62,3,55,19,33,3,17,33,3,14,3,7,4,150,175,180,252,50, +180,144,41,66,55,44,18,67,2,212,186,254,137,49,18,40,46,54,32,160,253,200, +1,152,254,104,2,56,51,138,181,228,141,1,254,251,31,4,65,254,144,134,221,178, +137,51,255,255,0,168,0,0,4,254,5,129,18,6,0,40,0,0,0,1,0,28,0,0,7,71,5,129, +0,41,1,72,64,41,133,8,1,117,31,133,31,2,117,14,1,99,24,1,108,25,124,25,140, +25,3,108,26,124,26,140,26,3,101,13,117,13,133,13,3,33,40,14,17,72,6,184,255, +216,64,35,14,17,72,58,24,74,24,2,41,24,1,53,15,69,15,117,15,3,3,39,15,1,27, +48,14,17,72,40,27,56,27,72,27,3,12,184,255,208,64,11,14,17,72,39,12,55,12, +71,12,3,31,184,255,224,179,14,17,72,31,184,255,240,64,73,10,13,72,8,32,14, +17,72,8,16,10,13,72,34,31,27,31,28,28,32,21,40,90,41,5,8,12,8,41,11,11,7, +18,52,41,1,116,41,196,41,228,41,3,41,33,32,16,32,64,29,32,72,228,32,1,155, +32,171,32,2,68,32,116,32,2,11,32,43,32,2,32,6,7,184,255,240,64,51,171,7,187, +7,2,7,68,43,116,43,132,43,228,43,4,47,43,1,2,15,43,1,31,8,34,5,8,5,39,0,96, +21,127,18,175,18,2,47,18,1,18,18,6,27,19,11,3,41,33,6,18,0,63,51,51,63,51, +51,18,57,47,93,113,51,237,50,57,57,17,51,17,51,1,93,95,93,93,47,93,56,51, +47,93,93,93,93,43,56,51,47,93,113,51,18,57,47,18,57,51,17,51,16,237,50,17, +57,47,57,51,17,51,49,48,43,43,43,43,93,43,93,43,93,95,93,93,93,43,43,93,93, +93,0,93,1,93,0,93,93,1,34,46,2,39,1,35,1,38,39,1,51,19,30,3,51,17,51,17,50, +62,2,55,19,51,1,6,7,1,35,1,14,3,35,17,35,3,82,17,45,48,46,17,254,85,222,1, +253,48,131,254,229,200,205,66,90,76,81,57,191,57,81,76,90,66,205,200,254, +229,131,48,1,253,222,254,85,17,46,48,45,17,191,2,133,6,11,13,8,253,85,3,7, +35,189,1,154,254,207,99,123,68,24,2,107,253,149,24,68,123,99,1,49,254,102, +189,35,252,249,2,171,8,13,11,6,253,123,0,1,0,67,255,236,4,112,5,149,0,60, +1,7,64,51,138,33,1,134,7,1,124,28,140,28,2,3,112,21,1,112,20,1,2,96,20,1, +101,8,117,8,133,8,3,132,34,1,101,34,117,34,2,124,13,1,90,13,106,13,2,59,23, +75,23,2,33,184,255,232,64,122,11,16,72,5,43,1,3,51,20,25,90,46,64,25,37,72, +46,46,56,90,16,139,36,155,36,171,36,3,127,20,1,2,95,20,111,20,2,36,20,36, +20,5,112,16,1,79,16,111,16,2,255,16,1,160,16,1,127,16,1,0,16,16,16,48,16, +3,16,175,5,191,5,2,5,64,32,45,72,5,64,13,16,72,5,51,20,95,127,21,175,21,2, +21,21,11,41,35,64,13,16,72,35,35,30,95,41,4,11,95,0,32,6,48,6,112,6,128,6, +4,208,6,1,6,184,255,192,182,13,17,72,6,6,0,19,0,63,50,47,43,93,113,16,237, +63,237,51,47,43,17,18,57,47,113,237,57,1,47,43,43,93,47,93,93,93,93,113,113, +18,57,57,47,47,93,95,93,113,16,237,50,47,43,237,18,57,49,48,0,95,93,1,43, +93,93,93,93,93,93,93,95,93,93,95,93,93,0,93,5,34,46,2,39,55,30,3,51,50,62, +2,53,52,38,43,1,53,51,50,54,53,52,46,2,35,34,14,2,7,39,62,3,51,50,30,2,21, +20,14,2,7,30,3,21,20,14,2,2,109,118,176,130,94,36,165,24,66,91,121,80,77, +122,85,45,192,202,71,71,181,173,39,72,104,65,77,114,83,56,19,178,33,96,132, +168,105,108,172,120,64,40,73,104,63,67,117,87,51,69,132,192,20,50,91,128, +79,77,55,98,75,44,37,69,100,64,133,118,148,119,123,55,86,59,30,40,68,90,49, +61,82,127,87,45,53,96,136,83,68,107,80,55,15,10,50,82,115,73,95,156,113,62, +0,1,0,168,0,0,5,24,5,129,0,19,0,123,64,17,172,18,1,138,18,154,18,2,147,8, +163,8,2,133,8,1,19,184,255,232,64,65,9,17,72,9,24,9,17,72,11,92,41,9,1,9, +64,12,80,12,144,12,3,224,12,1,143,12,159,12,175,12,3,0,12,48,12,2,12,166, +19,1,19,2,92,0,1,16,1,2,7,1,15,21,47,21,2,9,18,9,1,3,12,12,8,0,18,0,63,50, +50,47,63,51,51,47,1,93,47,94,93,237,50,113,47,93,93,93,113,51,113,237,49, +48,43,43,0,93,93,93,93,51,17,51,17,20,6,7,6,7,1,51,17,35,17,52,54,55,54,55, +1,168,172,2,2,2,2,2,238,222,170,1,2,1,2,253,26,5,129,252,100,51,98,39,46, +40,4,174,250,127,3,168,39,89,38,44,44,251,90,0,255,255,0,168,0,0,5,24,7,58, +18,38,1,174,0,0,17,7,2,145,1,146,1,74,0,19,64,11,1,20,5,38,1,6,25,33,0,10, +37,1,43,53,0,43,53,0,0,0,0,1,0,168,0,0,4,157,5,129,0,22,0,151,64,104,84,12, +116,12,132,12,3,84,15,1,139,8,1,122,8,1,89,8,105,8,2,140,14,1,14,24,13,16, +72,58,5,1,100,12,116,12,132,12,3,80,12,1,53,12,69,12,2,15,12,8,12,9,16,32, +9,96,9,128,9,3,9,9,13,2,21,90,32,22,1,22,14,13,16,15,13,127,13,207,13,239, +13,4,47,13,1,13,47,24,1,15,12,20,96,47,2,1,2,2,22,13,18,8,0,3,0,63,50,63, +51,57,47,93,237,50,57,1,93,47,93,113,56,51,47,93,237,50,17,57,47,93,56,57, +51,17,51,49,48,93,93,93,93,43,93,93,93,93,93,0,93,19,51,17,50,62,2,55,19, +51,1,6,7,1,35,1,14,3,35,17,35,168,191,57,81,76,90,66,205,200,254,229,131, +48,1,253,222,254,85,17,46,48,45,17,191,5,129,253,149,24,68,123,99,1,49,254, +102,189,35,252,249,2,171,8,13,11,6,253,123,0,0,0,0,1,0,18,255,240,4,153,5, +129,0,27,0,176,64,35,150,1,1,147,3,1,117,3,133,3,2,85,4,149,4,2,145,7,1,115, +7,131,7,2,85,7,101,7,2,129,6,145,6,2,6,184,255,216,64,46,12,15,72,37,6,53, +6,2,26,2,1,26,23,106,23,122,23,138,23,4,26,90,32,27,64,27,2,224,27,1,95,27, +1,0,27,1,8,27,20,6,36,6,52,6,3,6,184,255,248,64,14,22,25,72,73,1,1,20,1,36, +1,52,1,3,1,184,255,248,64,26,22,25,72,9,24,73,24,2,1,6,24,3,12,128,29,1,27, +18,1,95,24,3,16,95,9,19,0,63,237,63,237,63,1,93,47,23,51,113,43,113,113,43, +113,47,94,93,93,93,113,237,49,48,93,93,93,43,93,93,93,93,93,93,93,93,1,33, +3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,35,3,223,254,94,49, +22,43,49,60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,2,255,186, +4,225,254,144,172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161, +1,254,250,127,255,255,0,168,0,0,6,2,5,129,18,6,0,48,0,0,255,255,0,168,0,0, +5,32,5,129,18,6,0,43,0,0,255,255,0,97,255,236,5,215,5,150,18,6,0,50,0,0,255, +255,0,166,0,0,5,30,5,129,17,6,1,106,254,0,0,88,185,0,9,255,192,179,27,27, +72,9,184,255,192,179,21,21,72,9,184,255,192,179,20,20,72,9,184,255,192,179, +19,19,72,9,184,255,192,179,17,17,72,9,184,255,192,179,16,16,72,9,184,255, +192,179,15,15,72,9,184,255,192,179,14,14,72,9,184,255,192,183,11,11,72,9, +64,9,9,72,43,43,43,43,43,43,43,43,43,43,0,0,255,255,0,168,0,0,4,234,5,129, +18,6,0,51,0,0,255,255,0,104,255,236,5,121,5,150,18,6,0,38,0,0,255,255,0,46, +0,0,4,180,5,129,18,6,0,55,0,0,0,1,0,55,255,236,5,31,5,129,0,25,0,181,64,111, +217,24,1,139,24,1,90,24,106,24,122,24,3,41,24,1,85,23,101,23,133,23,3,70, +23,1,214,22,1,131,22,1,100,22,116,22,2,86,22,1,121,18,1,128,2,1,5,2,21,2, +2,132,1,1,131,0,1,84,0,100,0,2,70,0,1,198,23,214,23,2,113,23,129,23,2,86, +23,102,23,2,143,3,1,58,3,74,3,2,20,23,24,32,25,144,25,2,25,16,25,22,10,63, +21,79,21,111,21,127,21,4,21,184,255,240,64,14,21,23,20,21,5,24,24,21,3,11, +14,95,5,19,0,63,237,50,63,51,47,17,18,57,57,1,47,56,93,50,50,47,56,93,51, +57,57,49,48,0,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,93, +93,93,93,1,14,3,35,34,46,2,39,55,30,1,51,50,62,2,63,1,1,51,9,1,51,2,222,47, +81,90,109,75,32,66,64,58,23,81,35,83,48,37,58,53,57,38,49,253,195,218,1,193, +1,128,205,1,62,88,128,82,40,10,18,26,16,144,22,37,21,52,90,68,89,3,186,252, +240,3,16,0,0,3,0,118,255,245,5,159,5,139,0,29,0,40,0,51,0,143,64,92,70,28, +86,28,102,28,3,73,17,89,17,105,17,3,59,51,1,59,31,1,53,43,1,38,43,1,53,39, +1,38,39,1,41,90,15,8,30,90,0,35,24,7,90,46,21,224,8,1,79,8,1,32,8,1,8,32, +53,1,112,53,208,53,224,53,3,79,53,1,16,53,1,36,47,96,10,6,10,34,49,96,20, +24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57,47,47,17,51,16,237,50,17,51, +16,237,50,1,93,93,93,113,47,93,93,93,51,51,253,50,50,220,237,16,220,237,49, +48,0,93,93,93,93,93,93,1,93,93,1,20,14,2,43,1,21,35,53,35,34,46,2,53,52,62, +2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17,51,50,62,2,37,20,30,2,59,1,17, +35,34,6,5,159,64,131,197,133,40,191,40,133,197,131,64,67,133,201,135,29,191, +28,135,202,133,67,192,185,183,5,13,92,136,89,43,252,87,43,89,136,92,13,9, +182,182,2,224,105,188,143,84,227,227,84,143,188,105,113,185,131,72,182,182, +72,131,185,117,187,180,253,22,53,98,140,88,88,140,98,53,2,234,180,0,255,255, +0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,168,254,104,5,197,5,129,0,11,0,74, +64,47,1,92,2,2,11,90,0,8,1,175,8,1,0,8,64,8,112,8,3,8,7,90,0,4,16,4,64,4, +3,7,4,32,13,224,13,2,9,9,5,3,11,11,7,95,4,18,2,0,47,63,237,50,47,63,51,47, +1,93,47,94,93,237,47,93,93,113,237,50,47,237,49,48,37,17,35,17,33,17,51,17, +33,17,51,17,5,197,180,251,151,191,2,245,186,160,253,200,1,152,5,129,251,31, +4,225,251,31,0,0,0,1,0,160,0,0,4,174,5,129,0,25,0,134,64,70,164,14,1,20,40, +13,17,72,1,32,13,17,72,42,7,58,7,74,7,3,23,90,25,144,22,1,143,22,1,48,22, +64,22,2,207,22,1,112,22,1,111,22,1,16,22,64,22,2,22,12,90,207,11,1,0,11,16, +11,64,11,3,7,11,32,27,1,32,27,1,27,184,255,192,64,19,14,17,72,0,5,95,21,47, +16,1,16,16,11,24,18,22,22,11,3,0,63,51,47,63,18,57,47,93,51,237,50,1,43,93, +113,47,94,93,93,237,47,93,93,93,93,113,113,113,51,237,49,48,0,93,43,43,93, +1,14,3,35,34,46,2,53,17,51,17,20,22,51,50,62,2,55,17,51,17,35,3,240,36,94, +107,115,56,114,166,108,52,190,130,134,53,110,104,92,35,190,190,1,252,8,20, +18,12,47,92,137,89,2,82,253,194,123,108,10,15,17,7,2,244,250,127,0,0,1,0, +168,0,0,6,173,5,129,0,11,0,114,64,76,7,90,4,4,0,11,90,36,8,1,11,8,1,228,8, +1,219,8,1,148,8,1,123,8,1,4,8,20,8,100,8,3,8,3,90,4,0,68,0,228,0,3,7,0,235, +13,1,196,13,1,187,13,1,132,13,1,112,13,1,2,64,13,1,15,13,1,9,5,1,3,7,7,3, +95,0,18,0,63,237,50,47,63,51,51,1,93,93,95,93,93,93,93,93,47,94,93,237,47, +93,93,93,93,93,113,113,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33, +17,51,17,168,191,1,233,186,1,233,186,5,129,251,31,4,225,251,31,4,225,250, +127,0,1,0,168,254,104,7,47,5,129,0,15,0,125,64,84,132,17,148,17,180,17,3, +123,17,1,84,17,1,1,92,2,2,15,90,12,11,90,8,8,4,11,12,59,12,75,12,91,12,123, +12,139,12,155,12,203,12,8,219,12,251,12,2,207,12,1,2,159,12,1,128,12,1,111, +12,1,0,12,1,8,12,7,90,32,4,1,4,13,9,5,3,15,15,11,11,7,95,4,18,2,0,47,63,237, +50,47,50,47,63,51,51,1,47,93,237,47,94,93,93,93,93,95,93,93,113,18,57,47, +237,16,237,50,47,237,93,93,93,49,48,37,17,35,17,33,17,51,17,33,17,51,17,33, +17,51,17,7,47,180,250,45,191,1,211,186,1,210,186,160,253,200,1,152,5,129, +251,31,4,225,251,31,4,225,251,31,0,2,0,46,0,0,5,235,5,129,0,16,0,25,0,100, +64,68,116,25,132,25,148,25,3,123,18,139,18,155,18,3,153,3,1,38,3,1,64,27, +1,6,90,47,17,127,17,2,176,17,1,159,17,1,0,17,16,17,32,17,64,17,4,7,17,14, +0,22,90,32,12,1,12,21,95,0,0,12,14,95,15,3,22,95,12,18,0,63,237,63,237,18, +57,47,237,1,47,93,253,50,204,47,94,93,93,93,113,237,93,49,48,0,93,93,93,93, +1,33,50,30,2,21,20,14,2,35,33,17,33,53,33,1,52,38,35,33,17,33,50,54,2,184, +1,66,125,186,124,62,61,121,182,121,253,243,254,53,2,138,2,115,164,164,254, +213,1,51,164,156,3,45,58,105,147,90,87,150,112,64,4,229,156,252,26,121,129, +254,2,136,0,3,0,168,0,0,6,109,5,129,0,14,0,23,0,27,0,140,64,76,116,23,132, +23,148,23,3,123,16,139,16,155,16,3,153,12,1,38,12,1,27,90,159,24,207,24,223, +24,3,16,24,64,24,80,24,112,24,4,24,0,90,0,15,1,224,15,1,159,15,1,0,15,16, +15,32,15,64,15,4,15,9,20,90,0,6,16,6,64,6,3,7,6,128,29,1,29,184,255,192,64, +19,11,14,72,19,95,9,9,6,7,25,25,7,3,24,24,20,95,6,18,0,63,237,51,47,63,51, +47,17,18,57,47,237,1,43,93,47,94,93,237,50,47,93,93,93,113,237,47,93,93,237, +49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50,30,2,7,52,38,35,33,17, +33,50,54,1,17,51,17,4,214,61,121,182,121,253,183,191,1,126,125,186,124,62, +192,164,164,254,153,1,111,164,156,1,152,191,1,157,87,150,112,64,5,129,253, +172,58,105,147,92,121,129,254,2,136,254,225,5,129,250,127,0,2,0,168,0,0,4, +214,5,129,0,14,0,23,0,107,64,76,116,23,132,23,148,23,3,123,16,139,16,155, +16,3,153,12,1,38,12,1,0,90,31,15,1,160,15,176,15,2,159,15,1,0,15,16,15,32, +15,64,15,96,15,5,15,9,20,90,0,6,16,6,2,7,6,175,25,1,64,25,128,25,144,25,3, +19,95,9,9,6,7,3,20,95,6,18,0,63,237,63,18,57,47,237,1,93,93,47,94,93,237, +50,47,93,93,93,113,237,49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50, +30,2,7,52,38,35,33,17,33,50,54,4,214,61,121,182,121,253,183,191,1,126,125, +186,124,62,192,164,164,254,153,1,111,165,155,1,157,87,150,112,64,5,129,253, +172,58,105,147,96,121,131,254,4,131,0,1,0,105,255,236,5,121,5,150,0,42,0, +206,64,81,115,26,131,26,2,115,28,131,28,2,101,28,1,115,4,131,4,2,101,4,1, +115,2,131,2,2,101,2,1,101,12,1,101,11,1,135,17,1,106,17,1,90,33,138,33,2, +10,32,26,32,90,32,3,10,40,26,40,2,36,36,24,38,14,91,32,35,112,35,2,144,35, +176,35,2,127,35,1,64,35,1,35,184,255,192,64,63,7,10,72,35,6,80,24,96,24,2, +175,24,191,24,2,32,24,1,24,35,95,127,38,175,38,2,38,38,9,30,95,19,16,25,32, +25,2,48,25,64,25,112,25,128,25,192,25,208,25,6,25,25,19,19,79,5,1,5,5,0,95, +9,4,0,63,237,51,47,93,63,51,47,93,113,16,237,17,57,47,113,237,1,47,93,93, +113,51,47,43,93,93,93,113,237,51,18,57,47,49,48,0,93,1,93,93,0,93,93,93,1, +93,93,93,93,93,93,93,93,1,34,14,2,7,39,54,36,51,50,4,22,18,21,20,2,6,4,35, +34,46,2,39,55,30,3,51,50,62,2,55,33,53,33,46,3,2,201,88,137,102,69,19,181, +71,1,46,225,164,1,0,175,91,86,172,254,255,171,118,189,149,113,41,156,27,81, +109,140,87,109,176,128,77,9,253,114,2,142,10,73,124,173,4,250,42,70,91,50, +60,173,176,101,187,254,246,165,159,254,244,195,109,54,99,136,83,78,55,105, +83,50,72,132,185,112,154,110,178,126,68,0,0,2,0,168,255,236,7,179,5,150,0, +26,0,46,0,168,64,63,165,7,1,133,24,1,138,20,1,121,29,1,118,35,1,118,39,1, +74,19,138,19,2,58,30,122,30,2,53,34,117,34,2,42,44,58,44,122,44,3,37,40,53, +40,117,40,3,160,48,1,0,91,144,27,160,27,2,160,27,176,27,2,27,184,255,192, +64,54,7,11,72,27,16,12,90,0,13,16,13,64,13,3,7,13,37,91,17,48,10,112,10,2, +10,32,95,22,4,11,95,80,16,1,176,16,224,16,2,15,16,1,8,16,16,13,14,3,13,18, +42,95,5,19,0,63,237,63,63,18,57,47,94,93,93,113,237,63,237,1,47,93,51,237, +47,94,93,237,50,47,43,93,113,237,93,49,48,93,93,93,93,93,93,93,93,93,93,93, +1,20,2,14,1,35,34,46,2,39,33,17,35,17,51,17,33,62,3,51,50,30,1,18,7,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,7,179,90,170,245,155,156,239,165,90,7, +254,217,191,191,1,42,13,99,166,232,146,159,245,167,87,195,60,117,173,113, +116,175,117,58,60,117,173,114,121,176,114,54,2,199,165,254,242,192,104,99, +179,247,148,253,115,5,129,253,172,142,229,160,86,102,188,254,246,163,127, +208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,2,0,96,0,0,5,32,5,129, +0,17,0,30,0,239,64,22,156,29,172,29,2,138,29,1,147,20,1,117,20,133,20,2,67, +17,83,17,2,17,184,255,216,64,25,33,36,72,130,17,146,17,162,17,3,100,17,116, +17,2,86,17,1,67,16,83,16,2,3,16,184,255,216,64,117,33,36,72,172,16,1,155, +16,1,125,16,141,16,2,2,94,16,110,16,2,73,16,1,44,16,60,16,2,3,175,1,1,2,1, +104,14,16,72,94,1,110,1,2,73,1,1,44,1,60,1,2,16,1,1,6,24,24,14,18,90,6,6, +0,13,90,224,14,1,143,14,159,14,175,14,207,14,4,0,14,64,14,2,7,14,17,32,0, +1,15,0,31,0,2,0,1,15,95,47,24,95,24,111,24,143,24,4,24,24,0,26,95,11,3,14, +14,0,18,0,63,50,47,63,237,18,57,47,93,237,50,1,47,93,93,51,47,94,93,93,93, +237,18,57,47,237,17,51,17,18,57,17,51,49,48,93,93,93,43,95,93,95,93,93,93, +95,93,93,93,43,95,113,93,93,93,43,113,0,93,93,93,93,51,1,46,3,53,52,62,2, +51,33,17,35,17,33,1,19,20,30,2,51,33,17,33,34,14,2,96,1,144,91,130,84,39, +66,126,185,120,2,151,191,254,73,254,146,28,37,77,119,83,1,205,254,59,76,120, +84,44,2,95,16,78,108,130,67,94,150,104,55,250,127,2,73,253,183,3,236,57,98, +72,41,2,8,31,63,94,255,255,0,87,255,236,4,115,4,78,18,6,0,68,0,0,0,2,0,120, +255,236,4,63,5,222,0,19,0,56,0,158,64,69,137,44,1,122,45,138,45,2,102,21, +118,21,134,21,3,84,18,1,84,12,1,91,2,1,90,35,122,35,138,35,3,90,47,106,47, +138,47,3,123,46,139,46,2,73,46,105,46,2,42,42,23,71,64,208,0,1,144,0,1,0, +58,128,48,58,1,128,58,1,58,184,255,192,64,12,30,35,72,52,10,71,0,31,32,31, +2,31,184,255,192,64,23,26,35,72,31,52,5,80,20,20,42,48,41,1,64,41,240,41, +2,41,15,80,26,22,0,63,237,47,93,113,51,57,47,237,50,1,47,43,93,237,57,43, +93,113,26,16,220,93,113,26,237,50,47,49,48,0,93,93,93,93,93,93,93,93,93,93, +1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,3,50,18,17,16,2,35,34,46,2,53, +52,18,62,1,55,62,3,55,21,14,1,7,14,5,7,62,3,3,130,39,73,104,65,69,114,81, +44,44,77,105,62,69,112,78,42,243,222,210,250,238,113,178,123,65,58,128,206, +147,57,100,91,86,43,86,161,91,78,124,94,67,44,23,2,19,67,97,126,1,246,114, +151,91,37,39,92,150,112,114,150,89,36,36,88,151,2,127,254,251,254,250,254, +247,254,253,70,156,250,180,192,1,22,193,115,28,11,17,14,12,6,161,11,23,17, +14,33,50,73,108,149,101,55,97,72,41,0,0,0,0,3,0,142,0,0,3,231,4,58,0,23,0, +36,0,47,0,149,64,12,42,19,1,37,2,1,26,18,42,18,2,3,184,255,232,64,33,9,12, +72,139,10,155,10,2,10,38,44,71,5,5,24,16,71,64,47,30,159,30,2,160,30,1,30, +49,128,64,49,1,49,184,255,192,64,50,30,35,72,31,49,63,49,239,49,3,38,24,70, +192,22,1,0,22,16,22,48,22,224,22,240,22,5,8,22,10,36,81,143,38,159,38,175, +38,3,38,38,24,37,80,23,15,24,80,22,21,0,63,237,63,237,18,57,47,113,237,57, +1,47,94,93,113,237,50,93,43,113,26,16,220,93,113,26,237,17,57,47,237,18,57, +93,49,48,0,43,93,93,93,1,50,30,2,21,20,14,2,7,21,30,3,21,20,14,2,35,33,17, +19,51,50,62,2,53,52,46,2,43,1,25,1,51,50,62,2,53,52,38,35,2,52,76,144,112, +68,35,60,82,46,54,95,69,40,61,109,151,91,254,67,180,236,69,95,59,27,28,63, +100,71,224,216,68,91,55,23,102,121,4,58,24,62,104,81,53,81,58,37,9,7,7,35, +61,90,61,78,117,78,39,4,58,252,75,20,44,67,47,50,70,44,20,1,194,254,192,19, +39,61,43,82,76,0,1,0,142,0,0,2,175,4,58,0,5,0,54,64,35,0,64,18,39,72,48,0, +1,0,0,7,3,70,192,4,1,0,4,16,4,48,4,224,4,240,4,5,8,4,2,80,5,15,3,21,0,63, +63,237,1,47,94,93,113,237,17,51,47,93,43,49,48,1,21,33,17,35,17,2,175,254, +147,180,4,58,131,252,73,4,58,0,0,0,2,0,20,254,104,4,136,4,58,0,7,0,23,0,159, +64,65,134,3,1,32,3,1,102,1,1,34,5,114,5,130,5,3,34,20,1,34,17,1,137,18,1, +34,18,1,25,19,121,19,2,102,2,118,2,2,34,2,1,25,2,1,34,16,1,4,16,1,98,4,1, +4,4,36,4,68,4,84,4,4,8,73,9,184,255,192,64,42,18,25,72,9,9,22,70,64,111,7, +127,7,143,7,3,32,7,64,7,2,7,25,128,20,15,12,73,6,1,13,1,80,20,15,22,6,14, +80,11,21,13,8,0,47,51,63,237,50,50,63,237,1,47,51,51,237,51,51,26,16,220, +93,93,26,237,50,47,43,237,49,48,93,93,93,93,93,93,93,93,93,93,93,93,93,93, +93,93,1,33,6,2,14,1,7,33,1,35,17,33,17,35,17,51,62,2,18,55,33,17,51,3,66, +254,206,24,49,48,48,22,1,241,1,70,163,252,210,163,119,30,58,58,57,28,2,132, +146,3,183,177,254,249,194,136,50,253,229,1,152,254,104,2,27,50,143,220,1, +59,223,252,73,255,255,0,87,255,236,4,24,4,78,18,6,0,72,0,0,0,1,0,7,0,0,5, +83,4,58,0,39,1,97,64,88,165,23,1,165,14,1,171,34,1,164,3,1,172,24,1,154,24, +1,163,13,1,149,13,1,90,6,106,6,122,6,3,85,31,101,31,117,31,3,74,33,154,33, +170,33,3,69,4,149,4,165,4,3,42,28,58,28,2,37,9,53,9,2,34,31,170,26,1,26,31, +27,16,27,27,32,20,38,70,39,165,11,1,11,10,3,6,6,39,10,184,255,240,64,49,10, +10,17,39,39,5,33,32,16,15,32,1,255,32,1,160,32,1,159,32,1,80,32,1,63,32,1, +32,32,1,207,32,1,128,32,144,32,2,95,32,1,32,32,48,32,2,32,4,5,184,255,240, +64,64,31,5,47,5,2,127,5,159,5,2,63,5,159,5,223,5,255,5,4,5,15,41,1,255,41, +1,160,41,1,111,41,159,41,2,80,41,1,63,41,1,32,41,1,207,41,1,128,41,144,41, +2,79,41,95,41,2,48,41,1,31,6,34,3,6,184,255,240,64,37,11,17,72,6,3,37,0,80, +20,15,17,31,17,79,17,95,17,4,15,17,31,17,79,17,3,7,17,17,4,26,18,10,15,39, +33,4,21,0,63,51,51,63,51,51,18,57,47,94,93,113,51,237,50,57,57,43,17,51,17, +51,1,93,93,93,93,113,113,113,113,113,113,114,47,93,113,114,56,51,47,93,93, +93,93,113,113,113,113,113,113,114,56,51,18,57,47,51,57,47,56,18,57,17,51, +17,51,93,16,237,50,17,57,47,56,57,51,93,17,51,49,48,93,93,93,93,93,93,93, +93,93,93,93,93,0,93,93,1,34,38,39,1,35,1,46,1,39,3,51,23,30,3,51,17,51,17, +50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,2,83,26,65,19,254,234,200,1, +97,17,66,45,216,188,148,48,65,52,48,30,180,30,48,52,65,48,148,188,216,45, +66,17,1,97,200,254,234,19,65,26,180,1,221,12,8,254,15,2,80,14,85,66,1,69, +239,77,92,50,16,1,218,254,38,16,50,92,77,239,254,187,66,85,14,253,176,1,241, +8,12,254,35,0,0,0,1,0,49,255,236,3,94,4,78,0,55,0,175,64,28,5,53,21,53,2, +5,38,21,38,37,38,3,131,45,1,45,15,21,70,40,40,51,71,10,29,73,64,30,184,255, +192,64,86,30,36,72,143,15,1,30,15,30,15,3,144,10,1,144,10,160,10,2,31,10, +1,10,57,128,16,57,1,4,73,3,64,12,20,72,3,45,15,80,143,16,159,16,175,16,3, +16,16,35,7,0,29,1,144,29,224,29,240,29,3,29,29,24,80,35,16,7,80,0,96,4,112, +4,128,4,3,239,4,1,32,4,1,4,4,0,22,0,63,50,47,93,93,113,16,237,63,237,51,47, +93,113,17,18,57,47,113,237,57,1,47,43,237,93,26,16,204,93,93,113,17,57,57, +47,47,93,43,26,237,16,237,50,47,237,18,57,113,49,48,93,93,5,34,38,39,55,30, +1,51,50,54,53,52,46,2,35,53,50,62,2,53,52,38,35,34,14,2,7,39,62,3,51,50,30, +2,21,20,14,2,7,21,30,3,21,20,14,2,1,202,167,197,45,159,25,126,103,96,113, +55,92,120,64,64,114,86,49,99,93,35,70,60,42,7,162,12,62,97,128,78,85,138, +98,53,44,71,88,45,56,100,75,43,49,101,152,20,125,129,44,78,86,94,91,59,78, +45,18,137,15,38,67,52,74,86,14,33,55,42,20,68,98,63,29,42,76,104,63,57,88, +61,36,4,2,6,41,67,93,58,69,119,87,49,0,0,0,0,1,0,142,0,0,3,234,4,58,0,19, +0,186,64,25,9,17,1,233,17,249,17,2,4,15,1,228,15,244,15,2,11,5,1,235,5,251, +5,2,16,184,255,192,64,107,29,60,72,153,16,1,6,64,29,60,72,119,6,151,6,2,6, +7,1,230,7,246,7,2,156,7,1,105,7,137,7,2,31,17,47,17,79,17,3,9,72,64,7,64, +10,1,80,10,1,159,10,255,10,2,10,21,128,0,21,192,21,208,21,224,21,4,192,21, +1,128,21,144,21,176,21,192,21,208,21,5,17,1,72,192,18,1,0,18,16,18,48,18, +224,18,240,18,5,8,18,16,7,19,15,10,6,18,21,0,63,51,51,63,51,51,1,47,94,93, +113,237,50,93,113,114,26,16,220,93,113,114,50,26,237,49,48,0,93,1,93,93,113, +114,0,93,43,93,43,113,114,113,114,1,113,114,1,17,20,14,2,7,1,51,17,35,17, +52,62,2,55,1,35,17,1,60,3,3,3,1,1,243,197,172,2,3,3,2,254,6,192,4,58,253, +176,23,77,82,74,21,3,101,251,198,2,148,19,57,60,57,20,252,151,4,58,0,255, +255,0,142,0,0,3,234,5,240,18,38,1,206,0,0,17,7,2,145,0,234,0,0,0,19,64,11, +1,20,17,38,1,2,25,33,18,8,37,1,43,53,0,43,53,0,0,0,0,1,0,138,0,0,3,138,4, +58,0,21,0,202,64,17,117,16,133,16,149,16,3,57,15,121,15,137,15,153,15,4,13, +184,255,208,64,123,12,17,72,133,11,149,11,2,120,5,1,133,13,149,13,2,47,23, +79,23,2,73,16,1,56,16,1,16,13,121,8,137,8,153,8,3,8,71,13,1,54,13,1,13,9, +16,9,9,14,2,20,70,0,21,16,21,48,21,240,21,4,21,57,15,73,15,2,15,32,14,1,32, +14,144,14,2,144,14,1,79,14,1,48,14,1,47,14,1,16,14,1,14,16,14,13,19,80,15, +2,63,2,79,2,3,15,2,63,2,255,2,3,8,2,2,14,21,21,14,21,8,8,0,15,0,63,50,47, +63,51,47,17,57,47,94,93,113,237,50,1,47,56,93,93,93,93,93,113,114,51,113, +47,93,237,50,17,57,47,56,57,113,113,51,93,17,51,113,113,93,49,48,0,93,1,93, +93,43,93,93,19,51,17,50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,138,180, +30,48,52,65,48,148,188,216,45,66,17,1,97,200,254,234,19,65,26,180,4,58,254, +38,16,50,92,77,239,254,187,66,85,14,253,176,1,241,8,12,254,35,0,0,0,0,1,0, +11,255,236,4,29,4,58,0,25,0,186,64,42,26,21,1,130,7,1,116,7,1,85,7,101,7, +2,130,6,1,117,6,1,22,6,38,6,102,6,3,114,5,130,5,2,100,5,1,86,5,1,134,4,1, +4,184,255,240,64,61,12,15,72,26,3,1,116,2,1,7,24,12,17,72,25,70,64,127,0, +143,0,239,0,3,0,27,128,176,27,192,27,208,27,3,176,27,240,27,2,64,27,96,27, +112,27,160,27,176,27,192,27,6,131,23,1,23,54,6,1,6,2,184,255,240,64,26,24, +28,72,215,2,231,2,2,128,2,1,2,143,12,1,12,2,80,23,15,16,80,9,22,0,21,0,63, +63,237,63,237,1,47,93,51,93,93,43,51,113,51,93,93,113,114,26,16,220,93,26, +237,49,48,0,43,1,93,93,43,93,93,93,93,93,93,93,93,93,93,93,33,17,33,6,2,14, +3,35,34,38,39,53,30,1,51,50,62,3,18,55,33,17,3,104,254,137,25,42,44,51,71, +94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2,206,3,183,184,254,225,216, +149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,251,198,0,0,1,0,142,0,0,4,243, +4,58,0,28,1,3,64,21,137,18,153,18,2,134,12,150,12,2,107,17,123,17,2,100,13, +116,13,2,1,184,255,224,64,122,29,60,72,138,1,154,1,2,57,1,1,0,32,29,60,72, +133,0,149,0,2,54,0,86,0,2,143,19,159,19,2,93,19,109,19,125,19,3,59,19,75, +19,2,25,19,41,19,2,128,11,144,11,2,82,11,98,11,114,11,3,52,11,68,11,2,22, +11,38,11,2,1,0,15,15,8,21,72,64,19,80,22,1,159,22,255,22,2,22,30,128,144, +30,192,30,208,30,3,79,30,1,11,8,72,192,9,1,0,9,16,9,48,9,224,9,240,9,5,8, +9,28,2,2,184,255,192,64,22,29,60,72,2,32,19,22,72,84,2,1,19,2,10,15,22,15, +64,29,60,72,15,184,255,224,64,18,19,22,72,47,15,63,15,79,15,127,15,143,15, +5,15,1,9,21,0,63,51,51,93,43,43,51,63,51,51,93,43,43,17,51,1,47,94,93,113, +237,50,93,93,26,16,220,93,113,50,26,237,18,57,61,47,51,51,49,48,93,93,93, +93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,33,35,1,30,3,21,17,35,17,33, +19,30,1,23,62,1,55,19,33,17,35,17,52,62,2,55,3,19,153,254,188,1,3,1,1,174, +1,24,220,23,37,8,10,35,23,220,1,13,173,1,3,2,2,3,183,26,60,61,57,23,253,44, +4,58,253,107,63,151,72,72,151,63,2,149,251,198,2,212,22,60,64,60,23,0,1,0, +142,0,0,3,221,4,58,0,11,0,139,64,48,5,70,64,2,15,6,79,6,2,57,47,6,111,6,143, +6,255,6,4,191,6,1,143,6,159,6,255,6,3,6,13,128,0,13,192,13,208,13,224,13, +4,192,13,1,128,13,1,13,184,255,192,64,49,19,23,72,1,9,70,192,10,1,0,10,16, +10,48,10,224,10,240,10,5,10,8,80,176,1,192,1,2,159,1,175,1,191,1,3,15,1,63, +1,2,8,1,1,10,5,21,3,0,15,0,63,50,63,51,57,47,94,93,113,114,237,1,47,93,113, +237,50,43,93,113,114,26,16,220,93,113,114,94,93,50,26,237,49,48,1,17,33,17, +51,17,35,17,33,17,35,17,1,66,1,231,180,180,254,25,180,4,58,254,54,1,202,251, +198,1,237,254,19,4,58,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0, +142,0,0,3,199,4,58,0,7,0,109,64,80,1,70,64,15,2,79,2,2,57,47,2,111,2,143, +2,255,2,4,191,2,1,143,2,159,2,255,2,3,2,9,128,0,9,192,9,208,9,224,9,4,192, +9,1,128,9,176,9,192,9,208,9,4,47,9,1,5,70,192,6,1,0,6,16,6,48,6,224,6,240, +6,5,8,6,4,80,7,15,6,1,21,0,63,51,63,237,1,47,94,93,113,237,93,93,113,114, +26,16,220,93,113,114,94,93,26,237,49,48,1,17,35,17,33,17,35,17,3,199,180, +254,47,180,4,58,251,198,3,183,252,73,4,58,0,255,255,0,132,254,87,4,29,4,77, +18,6,0,83,0,0,255,255,0,87,255,236,3,202,4,78,18,6,0,70,0,0,0,1,0,35,0,0, +3,135,4,58,0,7,0,72,64,43,7,14,4,2,5,14,223,2,1,2,4,70,0,5,16,5,2,8,5,5,8, +9,160,9,1,95,9,1,48,9,64,9,2,47,9,1,4,21,3,7,80,0,15,0,63,237,50,63,1,93, +93,93,93,17,18,57,47,94,93,237,204,93,43,1,24,16,77,228,49,48,19,33,21,33, +17,35,17,33,35,3,100,254,168,180,254,168,4,58,131,252,73,3,183,0,0,0,255, +255,0,5,254,87,3,252,4,58,18,6,0,92,0,0,0,3,0,86,254,87,6,62,5,204,0,53,0, +74,0,95,0,229,64,13,141,93,157,93,173,93,3,78,24,14,17,72,72,184,255,232, +179,14,17,72,57,184,255,232,182,14,17,72,109,82,1,51,184,255,224,64,75,7, +10,72,15,26,31,26,47,26,3,24,32,7,10,72,0,3,16,3,32,3,3,7,4,54,71,64,25,14, +13,0,14,14,75,71,36,0,68,0,148,0,164,0,4,0,85,39,13,72,65,38,4,14,1,4,14, +36,14,68,14,100,14,132,14,180,14,228,14,7,7,14,52,97,1,97,184,255,192,64, +52,30,35,72,219,97,1,84,97,100,97,132,97,148,97,4,64,97,1,2,32,97,48,97,2, +31,97,1,0,97,1,38,0,31,45,80,3,70,80,49,28,16,8,18,91,3,59,80,5,22,22,13, +27,0,63,63,51,237,23,50,63,51,237,23,50,63,1,93,93,93,95,93,93,93,43,113, +47,94,93,113,51,51,237,50,50,220,93,237,43,1,24,16,77,244,26,237,49,48,95, +94,93,43,93,0,43,93,1,43,43,43,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35, +17,52,54,55,35,14,1,35,34,2,17,16,18,51,50,22,23,51,52,46,2,53,17,51,17,20, +14,2,21,51,62,1,51,50,30,2,5,20,30,2,51,50,62,2,55,53,52,46,2,35,34,14,2, +5,52,46,2,35,34,14,2,29,1,30,3,51,50,62,2,6,62,38,86,140,101,105,158,42,6, +2,3,170,2,3,5,46,149,111,186,179,185,180,112,149,45,5,2,2,1,170,1,1,1,5,46, +144,114,101,140,86,38,250,213,26,56,85,60,60,94,65,34,2,34,64,94,61,57,86, +57,29,4,110,23,52,88,64,53,92,70,40,1,35,65,92,60,65,88,53,23,2,34,123,208, +150,85,88,100,35,77,58,254,89,1,167,54,82,40,104,90,1,19,1,25,1,28,1,26,90, +98,10,41,46,42,12,1,163,254,92,11,43,47,43,12,104,89,80,145,205,129,112,160, +103,48,43,98,157,113,24,115,159,98,43,46,102,163,116,100,156,108,56,34,96, +169,135,23,108,150,93,41,58,110,159,0,0,0,255,255,0,23,0,0,3,234,4,58,18, +6,0,91,0,0,0,1,0,142,254,104,4,102,4,58,0,11,0,91,178,7,73,8,184,255,192, +64,54,18,21,72,8,8,5,70,64,223,2,1,207,2,223,2,2,2,64,25,28,72,0,2,48,2,2, +2,13,128,111,13,1,1,70,0,10,16,10,48,10,240,10,4,8,10,5,1,80,10,21,8,3,0, +15,0,63,50,47,63,237,50,1,47,94,93,237,93,26,16,220,93,43,93,113,26,237,50, +47,43,237,49,48,1,17,33,17,51,17,51,17,35,17,33,17,1,66,1,221,180,147,163, +252,203,4,58,252,73,3,183,252,73,253,229,1,152,4,58,0,1,0,122,0,0,3,156,4, +58,0,25,0,92,64,37,108,15,124,15,140,15,3,22,32,7,10,72,21,24,7,12,72,12, +70,64,9,175,13,1,127,13,143,13,239,13,3,13,27,128,1,70,24,184,255,192,64, +20,9,12,72,24,14,19,80,9,15,6,31,6,2,6,6,12,21,10,0,15,0,63,50,63,57,47,93, +51,237,50,1,47,43,237,26,16,220,93,113,50,26,237,49,48,43,43,0,93,1,17,20, +30,2,51,50,54,55,17,51,17,35,17,14,3,35,34,46,2,53,17,1,46,16,39,64,47,70, +132,74,180,180,38,81,87,93,51,66,101,69,36,4,58,254,110,34,59,44,25,26,21, +2,5,251,198,1,205,15,31,24,16,41,76,110,69,1,155,0,0,0,1,0,142,0,0,5,221, +4,58,0,11,0,116,64,52,7,70,4,4,0,11,70,64,4,8,52,8,2,36,8,132,8,212,8,228, +8,4,11,8,1,139,8,251,8,2,8,13,128,251,13,1,180,13,212,13,2,128,13,1,2,112, +13,1,95,13,1,13,184,255,192,64,23,9,12,72,3,70,0,0,16,0,48,0,3,8,0,9,5,1, +15,7,3,80,0,21,0,63,237,50,63,51,51,1,47,94,93,237,43,93,93,95,93,93,93,26, +16,220,93,113,113,114,26,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33, +17,51,17,142,180,1,154,180,1,153,180,4,58,252,73,3,183,252,73,3,183,251,198, +0,0,0,1,0,142,254,104,6,102,4,58,0,15,0,141,64,96,13,73,244,14,1,14,14,11, +70,8,7,70,64,4,4,0,107,8,1,4,8,1,84,8,228,8,2,59,8,1,107,8,123,8,139,8,251, +8,4,84,8,1,8,17,128,251,17,1,212,17,1,128,17,176,17,2,2,96,17,112,17,2,95, +17,1,32,17,48,17,64,17,3,3,70,0,0,16,0,48,0,240,0,4,8,0,14,9,5,1,15,11,7, +3,80,0,21,0,63,237,50,50,63,51,51,47,1,47,94,93,237,93,93,93,95,93,93,93, +26,16,204,93,93,113,113,114,114,17,57,47,26,237,16,237,50,47,93,237,49,48, +51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,142,180,1,149,180,1,148,180, +147,163,4,58,252,73,3,183,252,73,3,183,252,73,253,229,1,152,0,0,0,0,2,0,45, +0,0,4,172,4,58,0,14,0,25,0,113,185,0,5,255,224,179,7,10,72,2,184,255,224, +64,16,7,11,72,3,71,64,176,21,1,21,27,128,80,27,1,27,184,255,192,64,45,30, +35,72,255,27,1,14,11,15,70,32,9,1,32,9,1,9,25,81,175,14,191,14,207,14,3,15, +14,31,14,79,14,3,7,14,14,9,11,80,12,15,15,81,9,21,0,63,237,63,237,18,57,47, +94,93,113,237,1,47,93,113,253,204,51,93,43,113,26,16,220,93,26,237,49,48, +43,43,1,50,22,21,20,14,2,35,33,17,33,53,33,25,1,51,50,62,2,53,52,38,43,1, +3,13,205,210,52,104,155,103,254,103,254,184,1,252,202,69,96,59,26,116,133, +203,2,112,147,159,74,118,82,44,3,183,131,254,54,254,15,25,49,71,46,94,87, +0,3,0,142,0,0,5,50,4,58,0,12,0,23,0,27,0,105,185,0,5,255,224,179,7,10,72, +2,184,255,224,64,58,7,10,72,3,71,19,19,9,27,70,64,159,24,175,24,2,24,29,128, +12,13,70,16,9,32,9,64,9,3,9,23,81,175,12,191,12,207,12,3,15,12,31,12,79,12, +3,7,12,12,9,25,10,15,24,13,81,9,21,0,63,237,51,63,51,18,57,47,94,93,113,237, +1,47,93,237,50,26,16,220,93,26,237,18,57,47,237,49,48,43,43,1,50,22,21,20, +14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,1,17,51,17,2,38,205,210,52, +104,155,103,254,103,180,202,69,96,59,26,116,133,203,3,60,180,2,112,147,159, +74,118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,254,13,4,58,251,198,0,0, +0,0,2,0,142,0,0,3,215,4,58,0,12,0,23,0,132,185,0,5,255,224,179,7,10,72,2, +184,255,224,64,86,7,10,72,3,71,64,176,19,1,19,25,128,47,25,1,47,25,175,25, +2,63,25,95,25,127,25,159,25,191,25,207,25,223,25,255,25,8,25,64,35,39,72, +12,13,70,0,9,208,9,2,16,9,32,9,64,9,240,9,4,9,23,81,175,12,191,12,207,12, +3,15,12,31,12,79,12,3,7,12,12,9,10,15,13,81,9,21,0,63,237,63,18,57,47,94, +93,113,237,1,47,93,113,237,50,43,93,113,114,26,16,220,93,26,237,49,48,43, +43,1,50,22,21,20,14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,2,56,205, +210,52,104,155,103,254,85,180,220,69,96,59,26,116,133,221,2,112,147,159,74, +118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,0,0,0,0,1,0,55,255,236,3,190, +4,78,0,40,0,170,64,87,118,34,1,22,29,1,118,28,1,107,15,1,107,6,1,16,10,32, +10,2,10,10,0,31,71,64,12,31,9,1,144,9,1,9,42,128,20,70,21,21,1,70,31,0,1, +223,0,1,0,64,12,18,72,0,10,80,143,11,159,11,175,11,3,11,11,26,4,80,36,0,1, +16,1,32,1,96,1,112,1,128,1,192,1,208,1,8,1,184,255,192,64,29,27,34,72,1,1, +36,22,31,20,47,20,127,20,143,20,223,20,5,20,64,29,32,72,20,20,17,80,26,16, +0,63,237,51,47,43,93,63,51,47,43,93,16,237,17,57,47,113,237,1,47,43,113,114, +237,51,47,237,26,16,220,93,113,50,26,237,18,57,47,93,49,48,93,93,93,93,93, +19,55,30,1,51,50,62,2,55,33,53,33,46,3,35,34,6,7,39,62,3,51,50,30,2,21,20, +14,2,35,34,46,2,55,182,16,133,100,73,103,68,34,5,254,99,1,157,4,34,67,103, +73,109,118,15,185,13,66,105,145,93,90,170,134,81,51,114,182,130,99,151,106, +61,1,59,12,108,104,53,97,135,82,131,90,133,88,44,105,91,14,68,116,84,48,53, +128,216,163,120,205,151,86,54,92,122,0,0,0,0,2,0,142,255,236,5,170,4,78,0, +19,0,39,0,128,64,85,121,37,137,37,2,116,33,132,33,2,118,27,134,27,2,121,23, +137,23,2,150,18,166,18,2,30,71,15,15,8,31,8,2,7,8,8,11,0,71,64,160,20,1,20, +41,128,14,10,70,192,11,1,0,11,16,11,48,11,224,11,240,11,5,8,11,25,80,17,16, +9,80,47,14,1,14,14,11,12,15,11,21,35,80,3,22,0,63,237,63,63,18,57,47,93,237, +63,237,1,47,94,93,113,237,50,26,16,220,93,26,237,18,57,47,94,93,51,237,49, +48,0,93,1,93,93,93,93,1,16,2,35,34,46,2,39,35,17,35,17,51,17,51,18,33,50, +18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,170,235,223,102,161,115,65, +5,222,180,180,223,33,1,164,237,215,189,35,67,97,61,63,99,70,37,39,70,94,56, +62,100,70,38,2,30,254,228,254,234,62,128,192,131,254,19,4,58,254,54,1,222, +254,232,254,232,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0,0,2, +0,17,0,0,3,199,4,58,0,13,0,22,0,143,64,68,117,1,133,1,2,3,32,11,17,72,0,32, +40,43,72,223,0,239,0,2,0,32,29,37,72,52,0,1,43,0,1,41,4,1,4,48,7,10,72,7, +32,7,11,72,18,71,0,3,3,12,6,6,2,22,11,70,64,175,12,1,239,12,1,12,24,128,1, +2,184,255,240,64,22,91,2,107,2,2,2,3,0,81,47,21,1,21,21,1,15,81,9,15,12,1, +21,0,63,51,63,237,18,57,47,93,237,50,1,47,93,56,51,26,16,220,93,113,26,237, +51,18,57,47,18,57,17,51,237,49,48,43,0,43,93,1,93,113,43,113,43,43,93,9,1, +35,1,46,1,53,52,54,51,33,17,35,25,1,35,34,6,21,20,22,59,1,2,23,254,197,203, +1,88,131,118,216,207,1,176,180,234,130,120,107,124,253,1,202,254,54,1,215, +27,163,122,149,150,251,198,1,202,1,241,92,93,94,93,0,255,255,0,87,255,236, +4,24,5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3, +2,4,42,40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,0,1,0,10,254,87,3,238,5,204, +0,57,0,162,64,9,170,49,1,31,32,9,15,72,24,184,255,232,64,86,9,13,72,0,24, +16,24,2,7,36,36,57,28,70,64,80,45,1,159,45,1,45,59,128,10,7,57,70,4,3,192, +0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176,59,192,59,208,59,3,176,59,240,59, +2,255,59,1,112,59,160,59,176,59,3,57,21,40,80,33,27,15,51,80,22,10,2,81,7, +3,3,5,22,184,255,192,182,7,13,72,22,15,5,0,0,63,63,43,18,57,47,51,237,50, +16,237,50,63,237,63,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220, +93,113,26,237,17,57,47,49,48,0,94,93,43,43,1,93,51,17,35,53,51,53,51,21,33, +21,33,21,20,14,2,7,51,62,3,51,50,30,2,21,17,20,14,2,35,34,38,39,53,30,1,51, +50,62,2,53,17,52,46,2,35,34,14,2,21,17,142,132,132,180,1,44,254,212,2,3,2, +1,3,30,70,84,100,62,104,133,77,29,21,54,93,72,34,65,28,13,36,13,38,49,27, +10,17,48,88,70,64,103,73,40,4,182,131,147,147,131,148,33,66,56,39,7,55,77, +50,23,56,101,140,84,252,209,62,106,78,45,4,5,139,2,4,20,43,67,46,2,241,69, +104,69,35,46,84,120,75,253,170,0,0,0,255,255,0,142,0,0,2,200,5,228,18,38, +1,201,0,0,17,7,0,116,0,216,0,0,0,19,64,11,1,6,17,38,1,85,6,9,4,0,37,1,43, +53,0,43,53,0,0,0,0,1,0,87,255,236,3,222,4,78,0,40,0,171,64,113,116,30,1,116, +21,1,137,8,1,137,2,1,47,42,1,63,26,1,26,26,27,36,16,70,15,15,35,70,0,36,32, +36,2,0,36,64,36,96,36,128,36,160,36,192,36,224,36,7,8,36,24,27,71,31,5,1, +5,27,80,143,24,159,24,175,24,3,24,24,32,19,80,10,31,16,47,16,127,16,143,16, +223,16,5,16,64,29,32,72,16,16,10,16,32,80,0,0,35,16,35,32,35,96,35,112,35, +128,35,192,35,208,35,8,35,184,255,192,182,27,34,72,35,35,0,22,0,63,50,47, +43,93,16,237,63,51,47,43,93,16,237,18,57,47,113,237,1,47,93,237,50,47,94, +93,113,237,51,47,237,17,18,57,47,93,93,49,48,93,93,93,93,5,34,46,2,53,52, +62,2,51,50,30,2,23,7,46,1,35,34,14,2,7,33,21,33,30,3,51,50,54,55,23,14,3, +2,52,130,182,114,51,81,134,170,90,93,145,105,66,13,185,15,118,109,73,103, +67,34,4,1,156,254,99,4,35,68,103,74,100,133,16,182,9,61,106,151,20,86,151, +205,120,163,216,128,53,48,84,116,68,14,91,105,44,88,133,90,131,82,135,97, +53,103,109,12,67,122,92,54,0,255,255,0,57,255,236,3,182,4,75,18,6,0,86,0, +0,255,255,0,137,0,0,1,61,5,204,16,38,0,241,199,0,17,6,1,75,237,0,0,212,181, +9,64,56,56,72,9,184,255,192,64,9,55,55,72,9,64,54,54,72,9,184,255,192,179, +53,53,72,9,184,255,192,64,9,52,52,72,9,64,50,50,72,9,184,255,192,179,49,49, +72,9,184,255,192,64,9,48,48,72,9,64,42,42,72,9,184,255,192,179,41,41,72,9, +184,255,192,64,9,40,40,72,9,64,38,38,72,9,184,255,192,179,37,37,72,9,184, +255,192,179,36,36,72,9,184,255,192,179,35,35,72,9,184,255,192,64,16,34,34, +72,9,64,29,29,72,9,64,10,10,72,1,0,0,184,255,192,179,49,49,72,0,184,255,192, +64,9,40,41,72,0,64,25,27,72,0,184,255,192,182,18,18,72,128,0,1,0,184,255, +192,64,11,8,8,72,0,1,0,4,7,1,2,37,1,43,53,17,43,93,43,43,43,43,53,53,1,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,248,0,0,2, +37,5,123,18,38,0,241,0,0,17,6,0,105,203,0,0,25,182,2,1,4,17,38,2,1,184,255, +243,180,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,0,255,255,255,206,254,87,1,61, +5,204,18,6,0,77,0,0,0,2,0,11,255,236,6,236,4,58,0,34,0,45,1,42,64,82,163, +16,1,148,16,1,117,16,133,16,2,106,14,1,57,14,1,14,16,18,22,72,131,14,147, +14,163,14,3,117,14,1,106,13,1,57,13,1,13,16,18,22,72,163,13,1,87,13,103,13, +119,13,3,16,24,12,17,72,109,15,1,15,32,18,22,72,162,15,1,117,15,133,15,149, +15,3,54,15,70,15,2,5,184,255,224,179,7,10,72,2,184,255,224,64,18,7,11,72, +34,35,70,64,9,1,9,9,22,3,71,176,41,1,41,184,255,192,64,9,8,11,72,41,47,80, +47,1,47,184,255,192,64,93,30,35,72,255,47,1,48,47,1,109,11,1,31,11,63,11, +2,255,11,1,233,11,1,187,11,203,11,219,11,3,163,11,1,149,11,1,31,32,63,32, +2,255,32,1,106,32,1,41,32,1,163,32,1,53,32,1,11,15,32,3,22,45,81,175,34,191, +34,207,34,3,15,34,31,34,79,34,3,7,34,34,9,11,80,32,15,25,80,18,22,35,81,9, +21,0,63,237,63,237,63,237,18,57,47,94,93,113,237,1,47,23,51,93,93,113,113, +93,113,93,93,93,93,93,113,113,93,93,43,113,16,220,43,93,237,18,57,47,93,237, +50,49,48,43,43,93,93,93,43,113,0,43,1,93,93,43,113,113,93,93,43,113,113,93, +93,93,1,50,22,21,20,14,2,35,33,17,33,6,2,14,3,35,34,38,39,53,30,1,51,50,62, +3,18,55,33,25,1,51,50,62,2,53,52,38,43,1,5,77,205,210,52,104,155,103,254, +62,254,101,25,42,44,51,71,94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2, +242,242,69,96,59,26,116,133,243,2,112,147,159,74,118,82,44,3,183,184,254, +225,216,149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,254,54,254,15,25,49, +71,46,94,87,0,0,2,0,142,0,0,6,44,4,58,0,20,0,31,0,133,185,0,7,255,224,179, +7,10,72,4,184,255,224,64,23,7,11,72,1,21,70,19,11,11,15,5,71,64,176,27,1, +27,33,128,80,33,1,33,184,255,192,64,50,30,35,72,255,33,1,18,14,70,16,15,32, +15,64,15,3,15,31,81,1,1,13,80,175,18,191,18,207,18,3,15,18,31,18,79,18,3, +7,18,18,0,15,21,21,81,11,21,16,0,15,0,63,50,63,237,63,18,57,47,94,93,113, +237,51,47,237,1,47,93,237,50,93,43,113,26,16,220,93,26,237,18,57,47,51,237, +50,49,48,43,43,1,17,51,50,22,21,20,14,2,35,33,17,33,17,35,17,51,17,33,17, +19,51,50,62,2,53,52,38,43,1,3,169,228,205,210,52,104,155,103,254,102,254, +78,180,180,1,178,181,202,69,96,59,26,116,133,203,4,58,254,54,147,159,74,118, +82,44,1,237,254,19,4,58,254,54,1,202,252,69,25,49,71,46,94,87,0,0,0,0,1,0, +10,0,0,3,238,5,204,0,41,0,144,185,0,7,255,232,64,85,9,13,72,0,7,16,7,2,7, +33,24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,35,32,24,70,29,28,192,25, +1,0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240, +43,2,255,43,1,112,43,160,43,176,43,3,35,27,81,32,28,28,5,30,0,25,11,21,0, +18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63,18,57,47,51, +237,50,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220,93,113,26,237, +17,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21, +17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61,30,70,84,100,62,104, +133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180,1,44,254,212,2,3,2, +1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69,35,46,84,120,75,253, +170,4,182,131,147,147,131,148,33,66,56,39,7,0,0,255,255,0,138,0,0,3,138,5, +228,18,38,1,208,0,0,17,7,0,116,1,63,0,0,0,19,64,11,1,22,17,38,1,81,22,25, +0,14,37,1,43,53,0,43,53,0,0,0,255,255,0,5,254,87,3,252,5,240,18,38,0,92,0, +0,17,7,2,145,0,183,0,0,0,19,64,11,1,32,17,38,1,10,37,45,17,31,37,1,43,53, +0,43,53,0,0,0,0,1,0,142,254,104,3,221,4,58,0,11,0,125,64,89,9,73,15,10,79, +10,2,38,10,10,0,7,70,64,15,4,79,4,2,57,47,4,111,4,143,4,255,4,4,191,4,1,143, +4,159,4,255,4,3,4,13,128,3,70,192,0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176, +13,192,13,208,13,3,176,13,240,13,2,112,13,160,13,176,13,192,13,4,9,5,1,15, +8,3,80,0,0,47,237,51,63,51,47,1,93,113,114,47,94,93,113,237,26,16,220,93, +113,114,94,93,26,237,18,57,47,94,93,237,49,48,51,17,51,17,33,17,51,17,33, +17,35,17,142,180,1,231,180,254,170,163,4,58,252,73,3,183,251,198,254,104, +1,152,0,0,1,0,168,0,1,3,186,7,28,0,7,0,55,64,37,5,90,0,6,16,6,64,6,3,6,3, +70,255,0,1,0,0,16,0,64,0,128,0,176,0,208,0,6,7,0,4,95,1,7,3,5,18,0,63,63, +51,237,1,47,94,93,93,237,47,93,237,49,48,1,17,51,17,33,17,35,17,3,6,180,253, +173,191,5,129,1,155,253,201,251,28,5,128,0,0,0,0,1,0,142,0,0,3,10,5,204,0, +7,0,56,64,36,6,73,16,3,48,3,2,3,3,9,0,70,192,1,1,0,1,16,1,48,1,224,1,240, +1,5,8,1,4,0,7,80,2,15,0,21,0,63,63,237,63,1,47,94,93,113,237,17,51,47,93, +237,49,48,33,35,17,33,17,51,17,33,1,66,180,1,217,163,254,56,4,58,1,146,253, +235,255,255,0,9,0,0,7,134,6,240,18,38,0,58,0,0,17,7,2,148,2,65,0,0,0,21,180, +1,47,5,38,1,184,255,184,180,48,51,15,46,37,1,43,53,0,43,53,0,255,255,255, +253,0,0,5,204,5,228,18,38,0,90,0,0,17,7,0,67,1,72,0,0,0,21,180,1,43,17,38, +1,184,255,162,180,44,47,15,42,37,1,43,53,0,43,53,0,255,255,0,9,0,0,7,134, +6,240,18,38,0,58,0,0,17,7,2,149,2,247,0,0,0,19,64,11,1,47,5,38,1,75,47,50, +15,46,37,1,43,53,0,43,53,0,0,0,255,255,255,253,0,0,5,204,5,228,18,38,0,90, +0,0,17,7,0,116,2,38,0,0,0,19,64,11,1,43,17,38,1,93,43,46,15,42,37,1,43,53, +0,43,53,0,0,0,255,255,0,9,0,0,7,134,6,178,18,38,0,58,0,0,17,7,2,152,2,134, +0,0,0,23,64,13,2,1,47,5,38,2,1,2,51,49,15,46,37,1,43,53,53,0,43,53,53,0,0, +0,255,255,255,253,0,0,5,204,5,123,18,38,0,90,0,0,17,7,0,105,1,161,0,0,0,23, +64,13,2,1,43,17,38,2,1,0,47,45,15,42,37,1,43,53,53,0,43,53,53,0,0,0,255,255, +0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,148,1,34,0,0,0,21,180,1,9,5,38, +1,184,255,181,180,10,13,4,8,37,1,43,53,0,43,53,0,255,255,0,5,254,87,3,252, +5,228,18,38,0,92,0,0,17,6,0,67,105,0,0,21,180,1,32,17,38,1,184,255,167,180, +33,36,17,31,37,1,43,53,0,43,53,0,0,0,0,1,0,0,1,195,4,114,2,76,0,3,0,43,64, +30,2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38, +43,72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,4,114,1,195,137,137, +0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30,2,0,0,186,15,1,31,1,63,1,79,1,4,47, +1,63,1,111,1,175,1,223,1,5,1,64,38,43,72,1,0,47,43,93,113,237,1,47,47,49, +48,17,53,33,21,8,0,1,195,137,137,0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30, +2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38,43, +72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,8,0,1,195,137,137,0,255, +255,255,225,254,78,4,138,255,169,16,38,0,66,0,229,16,7,0,66,0,0,0,190,0,1, +0,127,3,184,1,72,5,129,0,12,0,47,64,16,4,32,11,17,72,7,64,11,17,72,7,12,150, +10,151,0,184,255,192,64,10,8,11,72,0,10,156,0,169,7,3,0,63,244,237,1,47,43, +237,237,50,43,49,48,43,19,53,52,62,2,55,51,14,1,21,51,21,127,10,20,30,20, +121,45,50,89,3,184,146,52,86,75,66,32,65,132,65,195,0,0,0,1,0,127,3,184,1, +72,5,129,0,12,0,52,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255,192, +180,11,17,72,6,11,184,255,192,64,10,8,11,72,11,10,156,5,169,11,3,0,63,228, +237,1,47,43,51,43,253,237,49,48,43,1,20,14,2,7,35,62,1,53,35,53,51,1,72,9, +20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,63,197,0,1,0,127,254, +250,1,72,0,195,0,12,0,51,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255, +192,180,11,17,72,6,11,184,255,192,64,9,8,11,72,11,5,169,11,156,10,0,47,253, +228,1,47,43,51,43,253,237,49,48,43,37,20,14,2,7,35,62,1,53,35,53,51,1,72, +9,20,29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,0,0,0,1,0,126, +3,184,1,71,5,129,0,12,0,47,64,16,8,32,11,17,72,5,64,11,17,72,5,1,150,2,151, +11,184,255,192,64,10,8,11,72,11,5,169,2,156,12,3,0,63,237,228,1,47,43,237, +237,50,43,49,48,43,1,21,35,20,22,23,35,46,3,61,1,1,65,88,49,45,123,20,29, +20,9,5,129,197,63,132,65,32,66,75,86,53,145,0,0,0,2,0,75,3,184,2,95,5,129, +0,12,0,25,0,89,64,58,17,32,11,17,72,4,32,11,17,72,20,64,11,17,72,20,25,150, +13,7,64,11,17,72,7,12,150,10,151,128,0,1,15,0,31,0,2,8,0,23,151,13,159,27, +175,27,2,10,23,156,13,0,0,13,169,6,20,3,0,63,51,228,50,47,16,237,50,1,93, +47,237,220,94,93,93,237,237,50,43,16,237,50,43,49,48,43,43,1,53,52,62,2,55, +51,14,1,21,51,21,33,53,52,62,2,55,51,14,1,21,51,21,1,151,10,19,29,20,122, +45,49,88,253,242,10,20,30,20,121,45,50,89,3,184,146,52,86,75,66,32,65,132, +65,195,146,52,86,75,66,32,65,132,65,195,0,0,2,0,75,3,184,2,95,5,129,0,12, +0,25,0,107,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22, +151,13,150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31, +11,2,8,11,19,184,255,192,64,24,11,17,72,19,63,24,1,24,159,27,175,27,2,10, +23,156,24,5,5,18,169,11,24,3,0,63,51,228,50,47,16,237,50,1,93,47,93,51,43, +220,94,93,93,50,43,253,237,16,253,237,49,48,43,43,1,20,14,2,7,35,62,1,53, +35,53,51,5,20,14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194, +254,181,9,20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,65,195,145, +53,86,75,66,32,65,132,65,195,0,0,0,2,0,75,254,250,2,95,0,195,0,12,0,25,0, +104,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22,151,13, +150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31,11,2, +8,11,19,184,255,192,64,21,11,17,72,19,24,159,27,175,27,2,5,5,18,169,24,11, +11,24,156,10,23,0,47,51,237,50,47,16,228,50,47,1,93,47,51,43,220,94,93,93, +50,43,253,237,16,253,237,49,48,43,43,37,20,14,2,7,35,62,1,53,35,53,51,5,20, +14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194,254,181,9,20, +29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,144,53,87,75,66,32, +65,132,65,195,0,0,0,1,0,138,255,118,3,234,5,204,0,11,0,64,64,37,11,192,0, +8,9,8,0,188,3,7,7,6,4,192,47,3,111,3,175,3,3,32,3,1,3,11,193,10,194,7,4,193, +5,194,7,0,1,0,47,63,246,237,16,244,237,1,47,93,113,237,51,51,47,16,237,50, +50,47,16,237,49,48,1,3,35,3,5,53,5,3,51,3,37,21,2,137,22,115,22,254,160,1, +96,28,215,28,1,97,3,232,251,142,4,114,27,164,29,1,120,254,136,29,164,0,0, +1,0,136,255,115,3,233,5,204,0,21,0,86,64,50,12,8,189,9,15,5,6,11,14,15,5, +9,190,19,1,189,0,20,17,0,16,3,4,16,3,32,0,1,0,19,193,18,194,15,12,193,13, +194,15,8,193,7,194,4,1,193,2,194,4,0,0,63,246,237,16,244,237,47,246,237,16, +244,237,1,47,93,23,51,47,17,51,51,16,237,50,237,23,50,47,16,237,50,49,48, +1,5,53,5,3,51,3,37,21,37,3,19,37,21,37,19,35,19,5,53,5,19,1,241,254,152,1, +104,16,175,16,1,105,254,151,26,26,1,104,254,152,16,175,16,254,151,1,105,26, +3,232,27,164,29,1,120,254,136,29,164,27,254,182,254,185,27,164,29,254,136, +1,120,29,164,27,1,71,0,0,0,0,1,0,81,1,145,2,124,3,188,0,19,0,73,185,0,17, +255,232,179,9,12,72,13,184,255,232,64,39,9,12,72,7,24,9,12,72,3,24,9,12,72, +128,0,1,15,0,63,0,2,0,191,10,1,10,143,5,1,0,5,48,5,2,5,15,15,1,15,0,47,93, +205,93,93,1,47,93,205,93,93,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52, +62,2,51,50,30,2,2,124,45,76,102,58,57,99,75,43,43,75,99,57,58,102,76,45,2, +170,58,102,77,44,44,77,102,58,57,100,74,43,43,74,100,0,0,0,3,1,22,0,0,6,234, +0,219,0,3,0,7,0,11,0,86,64,61,7,150,4,4,0,11,150,0,8,48,8,96,8,128,8,144, +8,160,8,208,8,240,8,8,0,8,48,8,64,8,96,8,144,8,192,8,208,8,240,8,8,8,8,3, +150,47,0,191,0,2,16,0,1,0,5,1,9,155,4,0,8,0,47,51,51,237,50,50,1,47,93,93, +237,47,94,93,113,237,18,57,47,237,49,48,33,53,51,21,33,53,51,21,33,53,51, +21,6,40,194,252,183,192,252,181,195,219,219,219,219,219,219,0,0,7,0,55,255, +245,7,200,5,141,0,3,0,23,0,43,0,63,0,83,0,103,0,123,3,217,64,12,118,0,134, +0,2,121,2,137,2,2,3,102,184,255,224,64,14,8,12,72,96,24,8,12,72,92,24,8,12, +72,86,184,255,224,179,8,12,72,62,184,255,232,64,14,8,12,72,56,24,8,12,72, +52,24,8,12,72,46,184,255,224,179,8,12,72,22,184,255,224,64,14,8,12,72,16, +24,8,12,72,12,24,8,12,72,6,184,255,224,64,13,8,12,72,74,180,59,181,49,0,1, +2,3,1,184,255,240,64,131,3,16,118,3,1,9,1,25,1,121,1,3,9,1,3,1,3,19,49,180, +102,64,1,38,64,182,64,198,64,214,64,4,64,64,19,114,180,99,181,89,180,105, +104,1,22,104,38,104,2,201,104,249,104,2,139,104,1,118,104,1,89,104,1,70,104, +1,41,104,1,27,104,1,233,104,1,150,104,198,104,2,121,104,1,107,104,1,86,104, +1,57,104,1,6,104,22,104,38,104,3,10,104,24,180,9,181,34,180,9,19,25,19,41, +19,73,19,89,19,121,19,137,19,153,19,8,34,19,64,45,49,72,19,184,255,192,64, +255,19,23,72,19,217,125,1,198,125,1,169,125,1,155,125,1,121,125,1,107,125, +1,93,125,1,73,125,1,59,125,1,45,125,1,9,125,25,125,2,251,125,1,237,125,1, +217,125,1,203,125,1,189,125,1,155,125,1,125,125,141,125,2,105,125,1,91,125, +1,77,125,1,54,125,1,41,125,1,11,125,27,125,2,204,233,125,249,125,2,214,125, +1,187,125,1,173,125,1,137,125,153,125,2,123,125,1,102,125,1,75,125,1,61,125, +1,9,125,1,219,125,251,125,2,205,125,1,153,125,169,125,2,107,125,139,125,2, +93,125,1,57,125,1,43,125,1,29,125,1,9,125,1,237,125,253,125,2,185,125,201, +125,217,125,3,123,125,171,125,2,89,125,1,11,125,59,125,75,125,3,155,249,125, +1,235,125,1,214,125,1,187,125,1,153,125,1,123,125,139,125,2,102,125,1,59, +125,75,125,2,9,125,25,125,2,246,125,1,217,125,1,205,125,1,169,125,185,125, +2,155,125,1,105,125,121,125,2,93,125,1,57,125,73,125,2,43,125,1,22,125,1, +249,125,1,237,125,1,201,125,64,249,1,187,125,1,153,125,1,123,125,1,102,125, +1,73,125,1,54,125,1,9,125,25,125,2,105,249,125,1,235,125,1,221,125,1,169, +125,1,150,125,1,121,125,1,107,125,1,73,125,1,59,125,1,25,125,1,11,125,1,253, +125,1,217,125,1,203,125,1,169,125,1,155,125,1,141,125,1,121,125,1,91,125, +107,125,2,57,125,1,27,125,43,125,2,249,125,1,235,125,1,169,125,201,125,2, +150,125,1,121,125,1,107,125,1,57,125,1,38,125,1,9,125,1,56,249,125,1,230, +125,1,201,125,1,182,125,1,153,125,1,139,125,1,89,125,1,70,125,1,41,125,1, +27,125,1,249,125,1,235,125,1,201,125,1,187,125,1,173,125,1,1,148,125,1,123, +125,1,100,125,1,75,125,1,63,125,1,27,125,1,15,125,1,228,125,1,203,125,1,176, +125,1,2,160,125,1,143,125,1,112,125,1,95,125,1,64,125,1,31,125,1,0,125,1, +8,109,182,84,183,119,182,94,19,69,182,44,183,79,182,54,19,39,182,14,183,29, +182,4,4,2,3,0,18,0,63,63,63,237,244,237,63,237,244,237,63,237,244,237,1,94, +93,93,93,93,93,93,93,95,93,93,93,113,113,113,113,113,113,113,95,113,113,113, +113,113,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93, +93,113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114, +114,114,114,94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113, +113,113,113,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,113,113, +113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,114,94,93, +93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113, +113,47,43,43,94,93,237,244,237,47,94,93,93,93,93,93,93,93,113,113,113,113, +113,113,113,114,114,253,244,237,18,57,47,93,113,237,17,57,57,47,47,94,93, +93,56,56,17,51,17,51,16,244,237,49,48,0,43,43,43,43,43,43,43,43,43,43,43, +43,1,95,93,93,33,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,19,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2,35,34,46,2,53, +52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2, +35,34,46,2,53,52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,48,155, +3,154,157,252,152,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19, +37,55,35,38,58,39,19,20,39,56,37,34,54,39,21,2,30,60,107,80,46,46,81,108, +62,63,108,80,46,46,81,110,210,19,37,55,35,38,58,39,19,20,39,56,37,34,54,39, +21,1,253,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19,37,55,35, +38,58,39,19,20,39,56,37,34,54,39,21,5,129,12,33,83,139,106,102,140,86,38, +37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71,97,59,26,26, +59,97,254,239,33,83,139,106,102,140,86,38,37,86,140,103,106,139,83,33,254, +151,73,98,58,24,24,59,97,73,71,97,59,26,26,59,97,1,176,33,83,139,106,102, +140,86,38,37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71, +97,59,26,26,59,97,0,0,0,0,1,0,85,3,122,1,89,5,129,0,3,0,40,64,25,3,16,10, +13,72,1,16,10,13,72,1,150,31,2,47,2,2,2,48,0,1,0,0,1,3,0,63,205,1,47,93,221, +93,237,49,48,43,43,27,1,51,3,85,64,196,158,3,122,2,7,253,249,255,255,0,85, +3,122,2,175,5,129,16,38,2,14,0,0,17,7,2,14,1,86,0,0,0,9,180,1,96,4,1,4,17, +93,53,0,0,1,0,88,0,141,2,81,3,172,0,8,0,72,64,55,106,3,122,3,138,3,3,106, +0,122,0,138,0,3,7,236,6,235,5,236,31,1,79,1,95,1,127,1,143,1,5,48,1,64,1, +96,1,112,1,160,1,5,1,0,239,15,3,47,3,111,3,127,3,4,3,0,47,93,228,1,47,93, +113,237,237,237,49,48,93,93,37,1,53,1,51,21,9,1,21,1,168,254,176,1,80,167, +254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,0,0,0,1,0,89,0,141, +2,82,3,172,0,8,0,66,64,48,101,6,117,6,133,6,3,101,0,117,0,133,0,3,4,236,1, +236,8,235,112,3,128,3,176,3,3,208,3,1,111,3,127,3,2,3,0,239,15,6,47,6,111, +6,127,6,4,6,0,47,93,228,1,47,93,93,113,253,237,237,49,48,93,93,37,35,53,9, +1,53,51,1,21,1,1,168,1,82,254,176,166,1,81,141,29,1,111,1,116,31,254,141, +63,0,0,0,255,255,0,185,0,0,3,71,5,129,16,38,0,4,0,0,17,7,0,4,1,200,0,0,0, +22,64,12,3,2,47,8,1,8,1,0,47,0,1,0,17,93,53,53,17,93,53,53,0,1,255,192,5, +223,2,235,6,84,0,3,0,13,179,1,0,2,1,0,47,205,1,47,47,49,48,1,33,53,33,2,235, +252,213,3,43,5,223,117,0,1,254,96,0,0,2,98,5,129,0,3,0,45,182,3,16,111,3, +1,3,1,184,255,240,64,18,239,1,1,1,64,13,18,72,1,64,8,11,72,1,2,3,0,18,0,63, +63,1,47,43,43,93,56,47,93,56,49,48,33,35,1,51,254,244,148,3,113,145,5,129, +0,0,1,0,101,2,7,2,131,4,157,0,33,0,111,185,0,30,255,216,64,30,9,17,72,23, +10,224,36,11,1,11,33,224,36,0,212,0,228,0,3,0,23,6,228,11,139,0,251,0,2,0, +184,255,192,64,38,10,13,72,4,0,1,0,29,17,17,75,29,91,29,2,29,64,21,25,72, +29,64,16,19,72,47,29,63,29,2,27,29,1,15,29,1,2,29,0,47,95,93,93,93,43,43, +93,51,47,16,204,93,43,93,50,237,50,1,47,93,237,47,93,237,50,49,48,0,43,1, +17,52,46,2,35,34,6,21,17,35,17,52,46,2,53,51,20,30,2,21,51,62,3,51,50,22, +21,17,2,2,13,29,47,35,72,85,128,1,1,2,119,2,2,2,2,15,38,49,64,42,110,97,2, +7,1,142,46,61,37,16,100,94,254,148,1,255,20,46,40,29,4,3,27,34,35,12,28,46, +32,17,108,121,254,79,0,0,0,1,0,4,0,0,4,46,5,129,0,17,0,106,64,69,7,3,7,3, +10,0,16,32,16,2,16,16,48,16,80,16,112,16,144,16,224,16,6,16,5,1,9,92,14,12, +10,8,12,81,5,31,13,1,0,13,1,13,4,95,15,1,31,1,63,1,79,1,4,63,1,1,15,1,1,8, +1,1,9,0,95,15,3,9,18,0,63,63,237,18,57,47,94,93,93,113,237,220,93,113,50, +237,50,1,47,51,51,237,50,50,47,93,113,18,57,57,47,47,49,48,1,17,33,21,33, +21,33,21,33,17,35,17,35,53,51,17,33,21,1,103,2,175,253,81,1,146,254,110,180, +175,175,3,123,4,230,254,36,157,213,129,254,233,1,23,129,3,233,155,0,1,0,58, +0,0,4,80,5,150,0,58,0,221,64,81,133,58,149,58,2,21,22,37,22,53,22,3,40,44, +0,48,17,13,6,30,111,29,29,0,52,110,6,43,39,48,110,18,14,10,10,0,79,6,95,6, +111,6,3,6,58,111,0,0,32,0,2,0,0,32,0,48,0,80,0,112,0,144,0,176,0,208,0,8, +0,0,16,0,48,0,192,0,224,0,5,8,0,184,255,192,64,70,14,18,72,0,42,16,81,17, +46,12,81,43,175,13,1,13,64,42,45,72,0,13,16,13,32,13,3,13,39,111,17,1,47, +17,95,17,111,17,143,17,159,17,223,17,239,17,7,17,17,52,35,115,41,30,1,30, +24,7,7,52,116,37,58,1,23,58,1,58,6,24,0,63,51,93,93,237,50,63,51,93,237,18, +57,47,93,113,51,222,93,43,93,50,237,50,16,237,50,1,47,43,94,93,113,114,237, +47,93,18,57,47,51,51,237,50,50,16,237,17,57,47,237,17,51,51,17,18,57,57,49, +48,0,93,93,1,14,3,35,33,53,62,1,61,1,35,53,51,53,35,53,51,53,52,62,2,51,50, +30,2,23,7,46,3,35,34,6,29,1,33,21,33,21,33,21,33,21,20,14,2,7,33,50,62,2, +55,4,80,9,57,89,115,67,253,70,89,86,186,186,186,186,48,99,152,103,70,123, +99,71,18,174,10,39,53,65,36,114,112,1,152,254,104,1,152,254,104,22,44,63, +40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160,121,25,129,140,129,130, +92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,138,129,140,129,7,56,106, +92,71,21,19,42,67,48,0,0,0,0,4,0,158,255,236,8,103,5,129,0,14,0,23,0,47,0, +98,1,193,64,71,134,2,1,117,91,133,91,2,91,73,107,73,139,73,3,143,68,1,109, +68,1,91,68,1,105,82,1,105,80,1,125,22,1,91,22,107,22,2,125,17,141,17,2,91, +17,107,17,2,84,57,100,57,2,54,57,70,57,2,37,97,53,97,69,97,3,76,32,9,14,72, +49,184,255,224,64,94,9,14,72,29,32,12,17,72,13,29,29,29,45,29,3,82,73,81, +81,48,72,65,0,70,15,24,39,75,37,41,72,30,34,32,30,57,73,15,56,1,102,56,1, +56,56,89,72,75,95,15,1,63,75,95,75,239,75,3,75,64,27,39,72,239,30,1,31,30, +95,30,127,30,3,15,30,75,75,30,15,3,8,64,65,80,65,96,65,3,127,65,143,65,2, +65,184,255,192,64,16,7,12,72,65,20,7,70,0,8,16,8,32,8,3,8,100,184,255,192, +179,91,95,72,100,184,255,192,179,80,88,72,100,184,255,192,179,70,74,72,100, +184,255,192,179,59,62,72,100,184,255,192,179,48,53,72,100,184,255,192,64, +11,27,31,72,79,100,95,100,111,100,3,100,184,255,192,179,7,10,72,89,184,255, +248,64,71,19,22,72,65,8,19,22,72,89,65,78,60,80,57,51,22,44,80,27,22,6,95, +20,87,80,121,82,1,72,82,88,82,104,82,3,82,78,40,32,80,33,78,37,33,35,35,33, +127,33,143,33,2,175,20,1,20,64,9,17,72,20,33,20,33,8,19,95,9,3,8,18,0,63, +63,237,18,57,57,47,47,43,93,93,17,51,47,17,51,51,16,237,50,47,51,93,93,237, +16,237,63,237,63,51,237,18,57,57,43,43,1,43,93,43,43,43,43,43,43,47,93,237, +50,47,43,93,113,18,23,57,47,47,47,93,113,43,93,93,16,237,51,47,93,113,237, +17,51,51,16,237,50,17,57,57,16,237,16,237,50,47,237,49,48,93,43,43,43,93, +0,93,93,1,93,93,93,93,0,93,93,93,93,93,1,93,0,93,1,93,1,20,14,2,43,1,17,35, +17,33,50,30,2,7,52,38,43,1,17,51,50,54,1,14,1,35,34,38,53,17,35,53,51,55, +51,21,51,21,35,17,20,22,51,50,54,55,37,20,6,35,34,46,2,39,55,30,1,51,50,62, +2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,21,20,30,2,23,30,3, +3,186,61,121,182,121,130,181,1,43,125,186,124,62,182,164,164,105,113,165, +155,2,123,35,74,48,105,93,104,111,53,110,157,157,41,55,23,40,26,2,232,183, +170,75,121,92,61,15,159,17,99,88,40,68,49,27,34,62,87,52,49,96,77,47,168, +161,141,165,22,161,6,31,45,54,30,155,32,57,80,48,48,100,82,52,3,217,92,159, +117,68,253,219,5,129,61,111,157,97,134,139,253,212,146,252,186,11,13,123, +122,1,197,131,242,242,131,254,98,78,73,8,6,98,120,129,24,54,88,64,26,61,58, +10,25,40,30,30,41,29,23,13,12,32,53,79,59,112,119,105,116,17,28,38,24,10, +85,25,36,28,22,11,11,31,54,87,0,1,0,16,255,236,4,86,5,150,0,61,0,232,185, +0,2,255,235,64,68,15,73,106,38,1,58,43,74,43,122,43,138,43,4,36,59,52,59, +68,59,116,59,132,59,5,46,55,55,4,57,45,51,110,20,24,15,14,26,15,3,20,37,110, +36,36,3,110,64,4,96,4,128,4,160,4,176,4,5,0,4,144,4,176,4,208,4,4,4,184,255, +192,64,94,24,27,72,4,48,24,81,25,57,15,81,54,15,16,31,16,127,16,143,16,159, +16,5,16,64,39,47,72,0,16,16,16,128,16,3,16,45,47,25,63,25,127,25,3,47,25, +63,25,175,25,207,25,4,47,25,175,25,2,25,25,0,40,115,216,37,1,124,37,140,37, +2,26,37,42,37,2,37,31,7,0,115,115,3,131,3,2,21,3,37,3,2,3,9,25,0,63,51,93, +93,237,63,51,93,93,93,237,18,57,47,93,113,114,51,220,93,43,113,50,237,50, +16,237,50,1,47,43,93,113,237,51,47,237,47,23,51,47,196,16,237,50,50,17,57, +47,196,49,48,0,93,93,93,43,37,50,54,55,23,14,3,35,34,46,2,39,35,55,51,46, +1,53,52,54,55,35,55,51,62,3,51,50,30,2,23,7,46,1,35,34,14,2,7,33,7,33,14, +1,21,20,22,23,33,7,33,30,3,2,179,100,120,14,185,13,63,103,147,97,120,177, +121,69,13,171,40,120,1,2,2,1,160,40,129,15,73,123,173,115,97,147,103,63,13, +185,14,121,106,68,106,79,50,11,1,190,40,254,99,2,1,2,2,1,196,40,254,108,9, +42,77,114,126,100,91,14,68,118,87,50,77,139,192,114,129,8,46,24,27,53,6,127, +122,189,130,67,50,87,118,68,14,91,100,39,87,137,99,127,16,47,23,22,37,19, +129,81,138,100,57,0,0,0,0,4,0,69,255,244,6,208,5,140,0,19,0,23,0,43,0,79, +0,192,64,14,118,20,134,20,2,121,22,137,22,2,133,47,1,66,184,255,232,64,9, +8,11,72,60,24,8,11,72,17,184,255,232,179,8,11,72,13,184,255,232,64,29,8,11, +72,7,24,8,11,72,3,24,8,11,72,22,23,20,21,74,180,73,73,52,180,53,178,63,23, +16,21,184,255,240,64,62,21,23,21,23,0,44,180,63,64,10,14,72,63,34,180,10, +178,0,180,0,24,16,24,32,24,80,24,96,24,208,24,224,24,240,24,8,24,38,52,1, +52,49,182,58,184,77,182,74,68,4,23,3,20,18,29,182,15,184,39,182,5,19,0,63, +237,244,237,63,63,63,51,237,244,237,51,93,1,47,93,253,244,237,47,43,237,18, +57,57,47,47,56,56,16,244,237,51,47,237,17,51,17,51,49,48,0,43,43,43,43,43, +43,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,19,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,20,30,2,51,50,54,55,23,14,3,35,34, +46,2,53,52,62,2,51,50,30,2,23,7,46,1,35,34,6,6,208,51,87,116,66,66,115,85, +49,48,86,117,68,66,115,85,50,251,59,155,3,154,157,149,22,43,63,40,42,64,44, +22,23,43,63,41,39,63,44,24,250,155,20,47,75,54,69,94,11,141,6,45,77,111,72, +94,132,82,38,59,97,124,65,68,106,76,48,9,143,10,83,75,108,87,1,178,125,171, +105,45,45,104,171,126,133,174,103,41,41,103,174,253,201,5,129,252,49,99,131, +78,32,33,78,131,98,95,128,79,34,34,79,128,2,124,75,124,90,50,82,87,9,54,99, +76,45,69,121,164,96,130,173,103,42,40,70,94,55,11,72,85,164,0,2,0,19,255, +236,2,126,5,149,0,39,0,55,0,185,64,9,138,32,1,53,40,14,17,72,26,184,255,232, +179,8,16,72,22,184,255,232,64,67,8,16,72,8,32,8,16,72,6,32,11,16,72,5,27, +21,27,2,5,21,21,21,2,3,4,4,29,16,40,32,40,2,96,40,112,40,128,40,192,40,4, +15,40,1,40,40,4,51,20,51,2,8,51,159,35,1,35,18,14,192,10,208,10,224,10,3, +10,184,255,192,179,34,38,72,10,184,255,192,64,26,7,11,72,10,79,57,1,18,51, +45,15,11,34,24,14,14,7,45,24,3,3,7,24,7,0,7,0,47,205,63,18,57,47,16,205,17, +57,47,18,57,57,205,17,57,57,1,93,47,43,43,93,198,51,205,93,50,0,94,93,1,51, +47,93,93,113,205,50,47,51,49,48,0,93,93,43,43,43,43,1,43,93,37,50,54,55,51, +14,1,35,34,38,61,1,14,1,7,53,62,1,55,17,52,62,2,51,50,30,2,21,20,14,2,7,21, +20,30,2,19,52,46,2,35,34,14,2,21,17,62,3,1,177,51,68,17,69,20,120,109,111, +127,32,66,34,35,66,31,25,59,98,72,52,79,53,27,44,79,110,66,19,32,42,115,14, +27,40,26,32,39,22,8,49,77,54,28,78,104,109,154,157,159,155,175,17,28,13,73, +14,29,16,2,75,59,108,83,49,42,78,111,69,99,180,152,118,38,244,57,83,54,26, +4,20,52,85,61,33,36,61,81,46,254,5,33,104,131,151,0,0,0,0,4,0,188,0,0,8,46, +5,129,0,19,0,35,0,55,0,59,0,244,64,124,141,0,1,0,24,13,16,72,61,0,1,25,0, +1,132,10,1,114,10,1,69,10,85,10,101,10,3,22,10,38,10,2,5,33,21,33,37,33,3, +4,29,20,29,2,11,24,27,24,2,11,22,27,22,2,47,61,1,58,20,73,36,19,73,16,0,16, +57,46,73,26,144,16,160,16,192,16,3,31,26,1,16,26,16,26,8,144,36,160,36,176, +36,3,47,36,1,0,36,1,36,10,1,7,73,48,8,64,8,80,8,3,0,8,16,8,32,8,144,8,4,8, +41,31,15,1,184,255,192,179,29,36,72,1,184,255,192,64,15,18,21,72,1,17,9,3, +51,23,192,57,208,57,2,57,184,255,192,64,21,35,44,72,57,56,11,64,29,36,72, +11,64,18,21,72,0,11,56,3,8,18,0,63,23,51,43,43,47,221,43,93,222,205,63,51, +51,43,43,63,205,1,47,93,113,237,50,50,47,93,93,93,18,57,57,47,47,93,93,16, +237,51,17,51,16,237,16,237,50,93,49,48,0,93,93,93,93,1,93,93,93,93,93,93, +43,93,33,1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,1,20,6,35,34, +38,53,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,53, +33,21,4,38,253,48,1,2,1,2,160,202,2,216,2,2,2,2,162,3,54,176,175,168,177, +43,87,131,88,93,131,84,39,159,24,47,69,45,46,71,48,25,26,48,67,41,46,72,50, +25,254,16,2,123,4,166,44,44,38,89,39,252,88,5,129,251,82,40,46,39,98,51,3, +156,250,127,2,178,188,203,201,190,91,145,101,53,53,100,145,92,81,107,64,26, +27,64,107,80,82,108,63,26,26,63,108,253,160,146,146,0,0,0,0,2,0,188,2,122, +7,25,5,129,0,39,0,47,0,148,64,9,9,24,19,23,72,136,9,1,8,184,255,232,64,16, +19,23,72,89,8,105,8,121,8,3,37,24,13,17,72,24,184,255,240,64,73,12,17,72, +44,41,196,42,24,21,196,64,22,224,22,2,22,22,0,64,47,1,47,0,42,16,42,64,42, +80,42,4,42,39,196,37,111,0,175,0,207,0,223,0,239,0,5,0,40,44,202,0,9,22,29, +4,0,42,32,42,80,42,128,42,4,42,2,15,23,37,15,3,45,3,0,63,23,51,17,51,204, +93,23,50,237,50,1,47,93,51,237,47,93,204,93,18,57,47,93,237,50,16,253,204, +49,48,43,43,93,43,93,43,1,17,53,6,7,14,1,7,3,35,3,46,1,39,38,39,6,21,6,20, +21,17,35,17,51,19,30,1,31,1,54,55,62,3,53,19,51,17,1,17,35,17,35,53,33,21, +6,155,5,4,4,5,2,230,108,163,2,24,14,17,20,1,1,128,190,223,2,5,2,6,20,16,7, +13,11,7,168,184,251,40,134,255,2,138,2,122,1,169,194,11,11,9,18,5,253,203, +1,157,5,64,38,44,55,10,10,8,18,6,253,201,3,7,253,205,4,13,7,18,51,41,18,34, +28,18,2,1,157,252,249,2,152,253,104,2,152,111,111,0,0,0,0,1,0,108,0,0,5,184, +5,150,0,57,0,221,64,95,101,36,1,101,22,1,157,49,1,143,49,1,49,16,11,15,72, +157,9,1,143,9,1,9,16,11,15,72,116,3,132,3,2,54,3,1,54,2,118,2,2,54,56,118, +56,2,116,55,132,55,2,54,55,1,42,26,1,42,32,1,41,53,48,40,10,18,32,40,96,40, +112,40,144,40,4,47,18,111,18,127,18,159,18,4,40,18,40,18,24,34,91,16,53,1, +53,184,255,192,64,65,23,29,72,191,53,207,53,2,0,53,48,53,2,53,17,5,91,31, +24,63,24,79,24,143,24,191,24,207,24,223,24,7,111,24,127,24,159,24,239,24, +255,24,5,0,24,48,24,2,8,24,10,15,19,39,48,5,42,95,18,41,18,29,95,0,4,0,63, +237,63,51,237,23,50,1,47,94,93,93,113,253,196,47,93,93,43,114,237,17,57,57, +47,47,93,93,17,51,17,51,16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43, +93,93,93,93,1,50,30,2,21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46, +2,35,34,14,2,21,20,30,2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,3,18, +151,241,168,90,59,109,157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116, +169,108,109,170,116,61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109, +59,90,168,241,5,150,86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51, +126,143,159,85,116,181,124,65,65,124,181,116,85,159,143,126,51,224,156,4, +2,3,2,54,138,167,191,106,147,234,162,86,0,0,0,2,0,88,255,222,4,124,4,72,0, +32,0,45,0,82,64,50,90,13,1,28,15,64,160,33,176,33,2,95,33,1,80,33,96,33,112, +33,3,33,47,128,32,47,1,45,208,17,1,17,5,16,45,45,22,39,10,16,22,21,27,1,6, +27,1,27,0,22,0,63,50,93,93,205,63,205,18,57,47,205,1,47,205,93,50,93,26,16, +220,93,113,113,26,205,50,49,48,93,5,34,46,2,53,52,62,2,51,50,30,2,21,33,17, +30,3,51,50,62,2,55,23,14,3,19,17,46,3,35,34,14,2,7,17,2,107,130,198,134,69, +95,152,189,95,112,194,142,81,252,197,22,64,78,88,46,75,116,93,76,35,72,36, +84,109,143,203,19,59,77,92,53,51,87,74,60,24,34,93,157,204,111,147,213,139, +66,79,146,210,130,254,156,24,45,35,20,31,60,87,56,42,57,100,76,44,2,138,1, +21,20,42,34,22,19,32,42,24,254,234,0,0,0,255,255,0,80,255,246,6,78,5,129, +16,38,0,121,0,0,16,39,2,20,2,249,0,0,17,7,2,144,3,204,253,206,0,63,64,40, +4,3,2,111,15,1,47,15,1,15,1,191,12,1,128,12,1,112,12,1,96,12,1,64,12,1,16, +12,1,12,98,64,11,11,72,4,3,2,60,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93, +53,17,93,93,53,53,53,0,0,0,255,255,0,61,255,246,6,78,5,141,16,39,2,20,2,249, +0,0,16,39,2,144,3,204,253,206,17,6,0,115,34,0,0,63,64,40,1,3,2,111,49,1,47, +49,1,49,0,191,1,1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,141,64,11,11,72, +1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53, +0,0,0,255,255,0,93,255,246,6,78,5,129,16,39,2,20,2,249,0,0,16,39,2,144,3, +204,253,206,17,6,2,142,40,0,0,63,64,40,1,3,2,111,49,1,47,49,1,49,0,191,1, +1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,126,64,11,11,72,1,3,2,49,24,0,63, +53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53,0,0,0,255,255,0,145, +255,246,6,78,5,129,16,39,2,20,2,189,0,0,16,39,2,144,3,204,253,206,17,6,2, +143,102,0,0,47,64,28,1,3,2,111,49,1,47,49,1,49,0,191,1,1,128,1,1,1,102,64, +11,11,72,1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,53,17,93,93,53,53,53,0,0, +0,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3,128,16,7,17,16,0,47, +205,1,47,205,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51,14, +1,7,33,21,2,129,29,59,31,72,58,130,82,82,130,58,72,31,59,29,3,221,1,41,34, +98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1,16,255,195,2,240,4,127, +0,17,0,26,64,10,15,64,0,0,15,12,3,17,128,7,0,47,26,205,204,50,57,57,1,47, +26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,35,1,213,34,98, +65,68,112,42,36,42,112,68,65,98,34,86,3,160,29,59,31,72,58,130,82,82,130, +58,72,31,59,29,252,35,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3, +128,7,17,16,17,0,47,205,1,47,221,26,204,50,57,57,49,48,1,46,1,39,51,30,1, +23,21,14,1,7,35,62,1,55,33,53,5,127,29,59,31,72,58,130,82,82,130,58,72,31, +59,29,252,35,1,127,34,98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1, +16,255,195,2,240,4,127,0,17,0,26,64,10,17,64,16,15,0,3,12,128,8,16,0,47,221, +26,204,50,57,57,1,47,26,205,49,48,37,62,1,55,21,14,1,7,35,46,1,39,53,30,1, +23,17,51,2,43,34,98,65,68,112,42,36,42,112,68,65,98,34,86,162,29,59,31,72, +58,130,82,82,130,58,72,31,59,29,3,221,0,0,1,1,162,0,100,6,94,2,68,0,31,0, +36,64,15,16,31,28,19,128,23,64,15,0,3,12,128,8,0,15,0,47,205,1,47,26,204, +50,57,57,26,221,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51, +14,1,7,33,46,1,39,51,30,1,23,21,14,1,7,35,62,1,55,2,129,29,59,31,72,58,130, +82,82,130,58,72,31,59,29,2,254,29,59,31,72,58,130,82,82,130,58,72,31,59,29, +1,41,34,98,65,68,112,42,36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112, +68,65,98,34,0,0,0,1,1,16,255,195,2,240,4,127,0,31,0,38,64,16,15,64,0,31,16, +19,28,128,24,64,0,15,12,3,128,7,0,47,26,204,50,57,57,26,221,26,204,50,57, +57,1,47,26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55, +21,14,1,7,35,46,1,39,53,30,1,23,1,213,34,98,65,68,112,42,36,42,112,68,65, +98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,3,160,29,59,31,72,58,130,82, +82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82,130,58,72,31,59,29,0, +2,1,16,255,72,2,240,4,127,0,3,0,35,0,40,64,17,1,19,0,4,35,20,23,32,28,3,0, +28,4,19,16,7,11,0,47,204,50,57,57,221,222,205,16,204,50,57,57,1,47,51,205, +50,49,48,5,33,21,33,19,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55, +21,14,1,7,35,46,1,39,53,30,1,23,1,16,1,224,254,32,197,34,98,65,68,112,42, +36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,104,80,4,88, +29,59,31,72,58,130,82,82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82, +130,58,72,31,59,29,0,0,2,0,56,255,229,3,186,5,197,0,47,0,69,0,222,64,93,156, +19,172,19,2,154,6,170,6,2,122,33,138,33,2,68,24,14,17,72,85,20,101,20,149, +20,165,20,4,140,7,1,74,7,90,7,122,7,3,74,56,90,56,2,67,56,11,15,72,58,67, +1,42,12,58,12,74,12,3,37,45,53,45,149,45,165,45,4,32,39,48,39,2,39,39,15, +169,48,249,48,2,40,48,1,48,28,0,70,64,96,31,1,31,184,255,192,64,64,18,21, +72,15,31,1,31,64,12,17,72,31,71,128,60,71,63,15,1,15,64,12,17,72,15,79,71, +1,39,34,80,43,53,81,27,0,22,64,22,128,22,192,22,4,7,22,22,47,43,111,43,223, +43,3,15,43,191,43,2,43,65,80,10,22,0,63,237,47,93,113,57,47,94,93,51,237, +16,237,50,1,93,47,43,93,237,26,16,220,43,93,43,113,26,237,51,51,113,113,18, +57,47,93,49,48,0,93,1,93,93,43,0,93,1,93,93,0,93,1,43,93,93,93,1,20,14,2, +7,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,51,62,1,53,52,38,35,34,14,2,7, +55,62,1,51,50,30,2,3,46,3,35,34,14,4,21,20,30,2,51,50,62,2,3,186,7,13,18, +11,31,96,130,162,97,93,127,78,35,22,47,73,102,132,83,42,77,64,50,16,4,1,3, +130,129,28,59,58,55,22,36,42,116,67,113,154,94,41,211,8,36,51,64,36,53,86, +67,49,32,15,21,42,65,44,66,108,83,56,3,170,46,104,106,106,48,128,206,144, +77,63,107,138,75,60,143,144,134,104,63,26,48,67,42,25,58,34,196,209,11,19, +28,17,147,23,39,88,149,195,254,147,42,74,55,32,51,84,110,116,116,48,53,91, +67,38,99,161,205,0,0,0,2,0,4,0,0,4,225,5,129,0,5,0,18,0,244,64,27,74,7,90, +7,106,7,3,69,17,85,17,101,17,3,3,56,8,1,55,16,1,6,24,14,17,72,18,184,255, +232,64,157,14,17,72,102,2,1,39,2,71,2,87,2,3,105,1,1,40,1,72,1,88,1,3,2,1, +12,12,0,6,59,3,1,20,3,1,244,3,1,107,3,155,3,187,3,235,3,4,52,3,84,3,2,0,3, +1,11,2,3,18,15,0,31,0,47,0,3,18,0,15,20,47,20,127,20,3,175,20,191,20,223, +20,255,20,4,32,20,112,20,144,20,3,15,20,63,20,143,20,3,58,175,20,207,20,223, +20,255,20,4,64,20,96,20,144,20,3,15,20,95,20,2,143,20,159,20,191,20,223,20, +4,0,20,32,20,80,20,112,20,4,0,3,6,3,18,95,5,18,12,32,19,22,72,153,12,1,12, +1,3,0,63,51,93,43,63,237,23,50,1,93,93,113,114,114,94,93,113,113,114,47,94, +93,51,47,95,94,93,93,93,93,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93, +43,43,93,93,95,93,93,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,5,2,5,217,1,254, +251,35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12, +141,156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,0,1,0,235,254,78,5,172,5, +129,0,7,0,54,64,36,3,90,79,4,175,4,191,4,207,4,4,4,7,90,32,0,1,15,0,1,0,0, +32,0,192,0,208,0,4,0,2,95,5,3,4,0,0,47,50,63,237,1,47,93,113,113,237,47,93, +237,49,48,1,17,33,17,35,17,33,17,4,244,252,182,191,4,193,254,78,6,145,249, +111,7,51,248,205,0,0,0,0,1,0,154,254,78,5,48,5,129,0,11,0,170,64,9,134,8, +150,8,2,163,9,1,9,184,255,192,64,26,13,16,72,163,7,1,2,144,7,1,114,7,130, +7,2,100,7,1,53,7,69,7,85,7,3,3,184,255,240,64,74,9,17,72,41,1,57,1,2,1,16, +12,17,72,8,143,6,159,6,175,6,3,2,72,17,73,15,2,127,2,2,2,6,2,6,0,207,10,1, +0,10,64,10,2,10,7,3,9,3,9,207,0,1,0,0,64,0,2,7,0,32,13,1,3,7,95,2,8,0,4,3, +1,9,95,0,0,47,237,57,63,18,57,57,237,57,1,93,47,94,93,93,51,51,47,47,51,47, +93,93,18,57,57,47,47,93,43,93,51,49,48,0,43,93,43,1,93,93,93,93,95,93,43, +93,93,19,53,9,1,53,33,21,33,9,1,33,21,154,2,123,253,149,4,66,252,178,2,72, +253,168,3,162,254,78,109,3,48,3,44,106,152,253,4,252,249,152,0,0,0,0,1,0, +101,2,96,4,72,2,242,0,3,0,32,64,20,0,2,32,2,80,2,112,2,4,2,16,0,32,0,2,0, +0,173,1,179,0,63,237,1,47,93,47,93,49,48,19,53,33,21,101,3,227,2,96,146,146, +0,0,0,0,1,0,51,255,242,4,98,6,84,0,8,0,185,185,0,0,255,232,64,135,14,17,72, +9,1,57,1,73,1,3,9,1,0,4,6,1,6,6,8,16,111,8,143,8,175,8,207,8,239,8,5,15,8, +47,8,79,8,111,8,143,8,5,8,95,2,1,2,2,15,3,47,3,79,3,111,3,4,11,3,175,10,1, +48,10,80,10,112,10,144,10,4,111,10,143,10,2,16,10,48,10,2,240,10,1,15,10, +47,10,79,10,3,57,239,10,1,176,10,208,10,2,143,10,175,10,207,10,239,10,4,112, +10,1,47,10,79,10,111,10,143,10,175,10,5,2,175,31,5,1,5,5,1,7,179,6,1,0,47, +51,63,18,57,47,93,237,1,93,113,113,114,114,94,93,93,113,113,114,114,47,94, +93,51,47,93,47,93,113,56,57,61,47,93,51,51,49,48,94,93,43,5,35,1,35,53,33, +19,1,51,2,110,106,254,229,182,1,14,242,1,174,129,14,3,24,117,253,78,5,135, +0,3,0,87,0,203,5,93,3,215,0,35,0,51,0,67,0,114,64,75,137,50,1,53,67,69,67, +2,10,15,1,10,3,1,5,33,1,5,21,1,39,26,8,52,4,18,0,0,47,32,47,64,47,112,47, +4,47,60,18,36,224,55,1,55,23,42,239,65,1,65,8,39,52,26,4,5,63,13,1,13,64, +18,21,72,0,13,80,13,2,13,31,15,23,1,23,0,47,93,51,220,93,43,113,50,23,57, +205,93,50,16,205,93,50,1,47,205,47,93,205,17,23,57,49,48,0,93,93,93,93,93, +1,93,1,20,14,2,35,34,38,39,14,3,35,34,46,2,53,52,62,2,51,50,22,23,62,3,51, +50,30,2,37,34,6,7,30,1,51,50,62,2,53,52,46,2,5,46,1,35,34,14,2,21,20,30,2, +51,50,54,5,93,44,82,115,70,97,168,70,32,75,84,90,46,69,115,83,46,44,82,116, +71,94,168,67,31,75,84,94,51,69,114,81,45,254,179,70,119,56,51,119,77,43,71, +51,27,29,51,71,254,93,51,119,78,43,70,49,27,25,48,71,47,70,120,2,78,78,141, +106,62,133,149,63,102,72,39,55,100,143,89,81,142,104,60,135,148,62,102,73, +40,55,101,143,168,126,130,128,128,40,70,94,54,54,92,69,39,250,128,128,40, +70,94,54,51,93,69,41,126,0,0,0,1,1,152,0,0,6,96,4,199,0,5,0,13,179,2,5,2, +5,0,47,205,1,47,205,49,48,1,51,17,33,21,33,1,152,94,4,106,251,56,4,199,251, +151,94,0,0,0,0,1,1,22,255,254,4,170,4,8,0,25,0,35,64,18,75,22,91,22,2,75, +16,91,16,2,25,0,12,13,13,0,19,6,0,47,205,47,51,1,47,205,47,205,49,48,0,93, +93,5,17,52,62,2,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,17,1,22,68,122, +167,98,99,169,123,70,103,53,95,130,78,78,130,94,52,2,2,0,116,192,138,76,76, +138,192,116,254,0,2,2,98,155,108,57,56,108,156,100,254,0,0,0,1,255,158,254, +78,2,148,5,227,0,35,2,3,64,30,10,34,26,34,42,34,3,5,16,21,16,37,16,3,9,3, +218,37,1,201,37,1,154,37,170,37,186,37,3,37,184,1,0,64,162,225,228,72,76, +37,1,0,47,37,63,37,2,9,37,1,220,37,64,211,217,72,37,64,205,209,72,134,37, +1,25,37,41,37,57,37,3,11,37,1,251,37,1,233,37,1,37,64,188,191,72,107,37,123, +37,139,37,3,93,37,1,75,37,1,41,37,57,37,2,27,37,1,9,37,1,249,37,1,37,128, +170,177,72,109,37,1,37,128,164,168,72,9,37,1,163,37,128,156,162,72,189,37, +1,121,37,153,37,169,37,3,75,37,91,37,107,37,3,37,192,140,147,72,155,37,171, +37,187,37,3,125,37,141,37,2,107,37,1,93,37,1,38,37,54,37,70,37,3,228,37,1, +214,37,1,180,37,196,37,2,6,37,1,112,37,184,255,192,64,110,119,122,72,37,64, +101,107,72,219,37,1,118,37,166,37,2,9,37,25,37,41,37,3,233,37,1,37,64,79, +82,72,37,128,74,78,72,25,37,41,37,2,11,37,1,251,37,1,217,37,233,37,2,171, +37,187,37,203,37,3,153,37,1,37,128,60,63,72,41,37,57,37,73,37,3,11,37,27, +37,2,55,233,37,249,37,2,187,37,203,37,219,37,3,141,37,157,37,173,37,3,123, +37,1,109,37,1,1,95,37,1,37,184,255,128,179,39,43,72,37,184,255,192,64,13, +34,38,72,144,37,160,37,2,2,16,37,1,37,184,255,192,64,46,28,31,72,223,37,1, +96,37,112,37,160,37,176,37,192,37,5,15,37,31,37,47,37,3,7,32,22,144,22,2, +22,22,31,70,12,47,4,159,4,2,4,4,32,12,1,12,184,255,192,64,15,16,19,72,12, +25,80,64,18,128,18,2,18,7,80,0,0,47,237,47,93,237,1,47,43,93,51,47,93,16, +237,50,47,93,94,93,93,93,43,113,95,113,43,43,114,95,114,114,114,114,114,94, +93,93,43,93,93,93,93,113,113,43,43,113,114,114,114,43,43,94,93,93,93,93,113, +113,113,113,113,43,114,114,114,43,94,93,43,93,43,93,113,113,113,113,113,113, +43,113,113,114,114,114,43,43,94,93,93,95,93,43,93,93,93,49,48,0,95,94,93, +93,19,34,38,39,53,30,1,51,50,62,2,53,3,52,62,2,51,50,22,23,21,46,1,35,34, +14,2,21,17,20,14,2,36,36,75,23,20,62,35,51,66,39,16,2,50,90,125,75,34,75, +22,18,61,36,51,66,39,16,50,89,124,254,78,11,8,147,8,16,37,64,84,48,4,188, +94,134,86,40,9,9,148,10,17,40,65,84,44,251,66,94,134,86,41,0,0,0,2,0,56,1, +80,4,44,3,244,0,33,0,67,1,31,64,26,36,16,12,16,72,2,16,12,16,72,65,24,11, +17,72,66,48,9,17,72,61,48,9,17,72,42,184,255,208,179,9,17,72,48,184,255,208, +64,19,9,17,72,31,24,9,17,72,32,48,9,17,72,26,48,9,17,72,13,184,255,232,179, +13,17,72,14,184,255,208,179,9,13,72,8,184,255,208,179,14,17,72,8,184,255, +208,64,41,9,12,72,63,16,28,48,28,80,28,3,0,28,16,28,64,28,96,28,128,28,160, +28,240,28,7,28,45,11,64,12,17,72,11,47,69,1,59,173,64,45,184,255,192,180, +35,60,72,45,34,184,255,192,179,23,28,72,34,184,255,192,64,27,16,20,72,34, +128,62,64,41,60,72,62,40,173,143,49,1,32,49,48,49,2,49,15,25,173,64,11,184, +255,192,180,39,60,72,11,0,184,255,192,179,23,28,72,0,184,255,192,64,29,16, +20,72,0,128,28,64,41,60,72,28,6,173,15,15,207,15,2,15,64,23,28,72,15,64,11, +19,72,15,0,47,43,43,93,237,196,43,26,221,43,43,196,43,26,237,16,220,93,93, +237,196,43,26,221,43,43,196,43,26,237,1,93,47,43,51,47,93,113,51,49,48,0, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,1,34,38,39,46,1,35,34,14,2,7,53, +62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,34,38,39,46,1,35,34,14,2,7, +53,62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,40,69,145,73,65,107,45,38, +65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68, +40,69,145,73,65,107,45,38,65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51, +23,69,123,52,32,59,61,68,2,246,43,26,22,23,12,22,33,21,144,37,47,13,21,27, +13,8,15,14,8,51,43,149,23,30,19,8,254,90,44,26,23,24,12,23,32,21,141,38,46, +13,20,26,13,8,15,14,8,50,42,147,23,32,19,8,0,1,0,65,0,55,4,36,5,16,0,19,0, +162,64,108,53,2,1,58,11,1,60,12,1,42,12,1,3,3,6,7,10,11,2,11,0,17,16,13,12, +1,12,12,11,1,2,4,9,19,100,14,116,14,2,80,14,1,2,48,14,1,0,14,16,14,32,14, +96,14,4,14,4,111,9,127,9,2,95,9,111,9,2,9,16,7,8,173,9,0,1,2,3,4,4,173,17, +6,31,5,47,5,95,5,111,5,223,5,5,5,10,11,12,13,4,80,9,208,9,2,15,9,1,9,0,47, +93,93,23,51,222,93,50,50,237,23,50,16,237,50,50,1,47,93,113,51,47,93,113, +95,113,113,51,18,23,57,16,135,192,192,192,192,16,135,192,192,192,192,49,48, +1,95,93,93,93,93,1,3,35,19,35,53,33,19,33,53,33,19,51,3,33,21,33,3,33,21, +1,192,152,145,151,237,1,55,190,254,11,2,61,154,143,152,1,21,254,162,191,2, +29,1,88,254,223,1,33,148,1,108,148,1,36,254,220,148,254,148,148,0,0,0,0,3, +0,100,0,244,4,71,4,80,0,3,0,7,0,11,0,49,64,27,11,7,2,8,4,0,8,173,9,9,1,5, +173,63,4,1,4,0,173,15,1,31,1,63,1,3,1,0,47,93,237,47,93,237,17,57,47,237, +1,47,51,51,47,51,51,49,48,19,53,33,21,1,53,33,21,1,53,33,21,100,3,227,252, +29,3,227,252,29,3,227,3,188,148,148,253,56,148,148,1,100,148,148,0,0,0,2, +0,63,0,0,4,36,4,207,0,6,0,10,0,123,185,0,5,255,216,64,17,18,22,72,3,40,18, +22,72,0,40,18,22,72,137,0,1,1,184,255,216,64,63,18,22,72,134,1,1,10,48,2, +80,2,2,0,2,16,2,32,2,64,2,96,2,128,2,160,2,7,2,7,7,0,64,12,15,72,0,8,173, +7,79,6,95,6,143,6,3,6,64,2,80,2,128,2,3,2,1,0,80,4,128,4,2,4,0,25,47,93,51, +51,205,93,205,93,24,47,237,1,47,43,51,47,47,93,113,51,49,48,0,93,43,93,43, +43,43,19,53,1,21,9,1,21,5,53,33,21,65,3,227,252,166,3,90,252,27,3,227,2,119, +205,1,139,154,254,168,254,168,153,236,145,145,0,0,2,0,65,0,0,4,36,4,207,0, +6,0,10,0,121,185,0,1,255,216,64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137, +6,1,5,184,255,216,64,62,18,22,72,134,5,1,9,48,6,80,6,2,0,6,16,6,32,6,64,6, +96,6,128,6,160,6,7,6,7,0,64,12,15,72,0,8,173,7,6,5,64,4,80,4,128,4,3,4,79, +0,95,0,143,0,3,0,80,2,128,2,2,2,0,25,47,93,205,93,205,93,51,51,24,47,237, +1,47,43,51,47,93,113,51,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21,1,53, +33,21,65,3,90,252,166,3,227,252,29,3,227,236,153,1,88,1,88,154,254,117,205, +253,137,145,145,0,0,0,0,2,0,157,0,0,4,55,4,129,0,4,0,9,0,35,64,18,105,9,121, +9,2,105,7,121,7,2,6,4,5,0,2,8,5,0,0,47,205,47,205,1,47,205,221,205,49,48, +0,93,93,51,17,9,1,17,37,33,17,9,1,157,1,205,1,205,252,182,2,250,254,131,254, +131,2,123,2,6,253,250,253,133,82,2,6,1,170,254,86,0,0,0,0,1,0,100,0,180,4, +71,2,242,0,5,0,19,183,5,170,0,2,0,4,173,1,0,47,237,47,1,47,47,237,49,48,55, +17,33,21,33,17,100,3,227,252,174,180,2,62,146,254,84,0,0,0,1,2,34,253,154, +3,210,6,170,0,23,0,29,182,4,32,8,11,72,9,0,184,1,0,180,1,19,12,6,1,0,47,47, +205,205,1,47,237,204,49,48,43,1,35,17,52,55,54,51,50,22,21,20,6,35,34,39, +46,1,39,38,35,34,7,6,21,2,181,147,84,82,128,63,75,51,37,30,13,8,26,20,33, +16,36,9,6,253,154,7,86,196,123,123,63,48,40,52,10,4,24,22,39,39,35,105,0, +0,0,1,1,5,253,154,2,181,6,170,0,28,0,32,185,0,4,255,224,180,8,11,72,12,2, +184,1,0,180,28,24,17,7,0,0,47,47,205,205,1,47,253,204,49,48,43,1,51,17,20, +7,14,1,35,34,46,2,53,52,62,2,51,50,23,30,1,23,22,51,50,55,54,53,2,34,147, +90,40,103,62,30,50,37,20,14,23,31,18,33,26,5,21,15,31,16,37,8,7,6,170,248, +168,205,125,56,54,16,29,39,24,20,34,24,14,16,2,23,20,37,41,31,106,0,0,0,1, +255,246,2,37,5,181,2,182,0,3,0,22,180,3,5,0,4,0,184,1,2,177,1,252,0,63,237, +17,1,51,17,51,49,48,3,53,33,21,10,5,191,2,37,145,145,0,0,1,1,216,253,147, +2,105,7,72,0,3,0,24,187,0,2,1,0,0,3,1,6,180,4,3,254,0,250,0,63,63,1,16,246, +237,49,48,1,51,17,35,1,216,145,145,7,72,246,75,0,0,0,1,2,141,253,147,5,181, +2,182,0,5,0,34,178,2,7,3,186,1,0,0,0,1,6,179,6,5,254,3,184,1,2,177,0,252, +0,63,237,63,1,16,246,237,17,51,49,48,1,33,21,33,17,35,2,141,3,40,253,105, +145,2,182,145,251,110,0,0,0,1,255,246,253,147,3,30,2,182,0,5,0,34,187,0,2, +1,0,0,5,1,6,181,6,0,6,4,254,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16,246, +237,49,48,3,53,33,17,35,17,10,3,40,145,2,37,145,250,221,4,146,0,0,0,0,1,2, +141,2,37,5,181,7,72,0,5,0,34,178,4,7,2,189,1,0,0,5,1,6,0,6,0,5,1,2,179,2, +252,0,250,0,63,63,237,1,16,246,237,17,51,49,48,1,51,17,33,21,33,2,141,145, +2,151,252,216,7,72,251,110,145,0,0,0,1,255,246,2,37,3,30,7,72,0,5,0,34,187, +0,5,1,0,0,2,1,6,181,6,0,6,3,250,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16, +244,237,49,48,3,53,33,17,51,17,10,2,151,145,2,37,145,4,146,250,221,0,0,0, +0,1,2,141,253,147,5,181,7,72,0,7,0,39,179,4,9,5,1,186,1,0,0,0,1,6,179,8,7, +254,5,184,1,2,179,2,252,0,250,0,63,63,237,63,1,16,246,237,50,17,51,49,48, +1,51,17,33,21,33,17,35,2,141,145,2,151,253,105,145,7,72,251,110,145,251,110, +0,1,255,246,253,147,3,30,7,72,0,7,0,39,177,7,4,186,1,0,0,2,1,6,183,8,0,8, +6,254,3,250,7,184,1,2,177,2,252,0,63,237,63,63,17,1,51,16,244,237,51,49,48, +3,53,33,17,51,17,35,17,10,2,151,145,145,2,37,145,4,146,246,75,4,146,0,0,1, +255,246,253,147,5,181,2,182,0,7,0,40,178,3,9,4,186,1,0,0,7,1,6,182,8,0,8, +6,254,4,0,184,1,2,177,1,252,0,63,237,50,63,17,1,51,16,246,237,17,51,49,48, +3,53,33,21,33,17,35,17,10,5,191,253,105,145,2,37,145,145,251,110,4,146,0, +1,255,246,2,37,5,181,7,72,0,7,0,40,178,7,9,5,186,1,0,0,2,1,6,182,8,0,8,3, +250,5,0,184,1,2,177,1,252,0,63,237,51,63,17,1,51,16,244,237,17,51,49,48,3, +53,33,17,51,17,33,21,10,2,151,145,2,151,2,37,145,4,146,251,110,145,0,1,255, +246,253,147,5,181,7,72,0,11,0,51,179,7,13,5,8,187,1,0,0,2,0,11,1,6,64,9,12, +0,12,10,254,3,250,8,11,184,1,2,178,5,2,252,0,63,51,237,50,63,63,17,1,51,16, +246,50,237,50,17,51,49,48,3,53,33,17,51,17,33,21,33,17,35,17,10,2,151,145, +2,151,253,105,145,2,37,145,4,146,251,110,145,251,110,4,146,0,0,0,2,255,246, +1,113,5,181,3,106,0,3,0,7,0,37,183,3,7,7,9,0,4,8,4,184,1,2,178,5,253,0,184, +1,2,177,1,251,0,63,237,63,237,17,1,51,50,17,51,17,51,49,48,3,53,33,21,1,53, +33,21,10,5,191,250,65,5,191,2,217,145,145,254,152,145,145,0,2,1,217,253,147, +3,210,7,72,0,3,0,7,0,42,65,9,0,5,1,0,0,4,1,7,0,8,0,1,1,0,0,0,1,4,182,8,7, +3,254,4,0,250,0,63,50,63,51,1,16,246,237,16,244,237,49,48,1,51,17,35,1,51, +17,35,1,217,145,145,1,104,145,145,7,72,246,75,9,181,246,75,0,0,0,1,2,141, +253,147,5,181,3,106,0,9,0,49,181,2,6,6,11,7,3,186,1,0,0,0,1,6,179,10,9,254, +7,184,1,2,178,4,253,3,184,1,2,177,0,251,0,63,237,63,237,63,1,16,246,237,50, +17,51,17,51,49,48,1,33,21,33,21,33,21,33,17,35,2,141,3,40,253,105,2,151,253, +105,145,3,106,145,215,145,252,34,0,0,1,1,217,253,147,5,181,2,182,0,9,0,51, +178,1,11,6,191,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,178,10,2,6,184,1,2,180,9, +252,4,8,254,0,63,51,63,237,50,1,16,244,237,16,246,237,17,51,49,48,1,21,33, +17,35,17,35,17,35,17,5,181,254,29,145,215,145,2,182,145,251,110,4,146,251, +110,5,35,0,0,0,0,2,1,217,253,147,5,181,3,106,0,5,0,11,0,63,180,2,8,8,13,9, +65,11,1,0,0,6,1,7,0,12,0,3,1,0,0,0,1,4,0,12,0,9,1,2,181,6,253,11,5,254,3, +184,1,2,177,0,251,0,63,237,63,51,63,237,1,16,246,237,16,244,237,17,51,17, +51,49,48,1,33,21,33,17,35,1,33,21,33,17,35,1,217,3,220,252,181,145,1,104, +2,116,254,29,145,3,106,145,250,186,4,111,145,252,34,0,0,1,255,246,253,147, +3,30,3,106,0,9,0,49,177,9,6,186,1,0,0,3,1,6,183,10,4,0,0,10,8,254,3,184,1, +2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63,17,1,51,17,51,16,244,237, +51,49,48,3,53,33,53,33,53,33,17,35,17,10,2,151,253,105,3,40,145,1,113,145, +215,145,250,41,3,222,0,0,0,1,255,246,253,147,3,210,2,182,0,9,0,52,65,9,0, +6,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,183,10,0,10,4,8,254,6,0,184,1,2,177,1, +252,0,63,237,50,63,51,17,1,51,16,244,237,16,246,237,49,48,3,53,33,17,35,17, +35,17,35,17,10,3,220,145,215,145,2,37,145,250,221,4,146,251,110,4,146,0,0, +0,0,2,255,246,253,147,3,210,3,106,0,5,0,11,0,63,180,4,9,9,12,11,65,11,1,0, +0,8,1,4,0,12,0,0,1,0,0,3,1,7,0,12,0,9,1,2,181,10,253,2,7,254,4,184,1,2,177, +5,251,0,63,237,63,51,63,237,1,16,244,237,16,246,237,17,51,17,51,49,48,1,17, +35,17,33,53,1,35,17,33,53,33,3,210,145,252,181,2,116,145,254,29,2,116,3,106, +250,41,5,70,145,250,41,3,222,145,0,0,1,2,141,1,113,5,181,7,72,0,9,0,49,181, +4,8,8,11,2,6,189,1,0,0,9,1,6,0,10,0,9,1,2,178,6,253,5,184,1,2,179,2,251,0, +250,0,63,63,237,63,237,1,16,246,237,50,17,51,17,51,49,48,1,51,17,33,21,33, +21,33,21,33,2,141,145,2,151,253,105,2,151,252,216,7,72,252,34,145,215,145, +0,0,1,1,217,2,37,5,181,7,72,0,9,0,52,178,4,11,2,65,11,1,0,0,9,1,7,0,10,0, +8,1,0,0,5,1,4,0,10,0,5,1,2,181,2,8,252,0,6,250,0,63,51,63,51,237,1,16,246, +237,16,244,237,17,51,49,48,1,51,17,33,21,33,17,51,17,51,3,65,145,1,227,252, +36,145,215,7,72,251,110,145,5,35,251,110,0,0,0,2,1,217,1,113,5,181,7,72,0, +5,0,11,0,63,180,10,4,4,13,8,65,11,1,0,0,11,1,7,0,12,0,2,1,0,0,5,1,4,0,12, +0,11,1,2,178,8,251,5,184,1,2,180,2,253,6,0,250,0,63,50,63,237,63,237,1,16, +246,237,16,244,237,17,51,17,51,49,48,1,51,17,33,21,33,1,51,17,33,21,33,1, +217,145,3,75,252,36,1,104,145,1,227,253,140,7,72,250,186,145,5,215,252,34, +145,0,0,1,255,246,1,113,3,30,7,72,0,9,0,50,188,0,9,1,0,0,6,0,2,1,6,183,10, +4,0,0,10,7,250,3,184,1,2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63, +17,1,51,17,51,16,244,50,237,49,48,3,53,33,53,33,53,33,17,51,17,10,2,151,253, +105,2,151,145,1,113,145,215,145,3,222,250,41,0,0,1,255,246,2,37,3,210,7,72, +0,9,0,52,65,9,0,0,1,0,0,7,1,7,0,10,0,6,1,0,0,3,1,4,183,10,1,10,8,4,250,6, +1,184,1,2,177,2,252,0,63,237,51,63,51,17,1,51,16,244,237,16,244,237,49,48, +1,33,53,33,17,51,17,51,17,51,3,210,252,36,1,227,145,215,145,2,37,145,4,146, +251,110,4,146,0,0,0,2,255,246,1,113,3,210,7,72,0,5,0,11,0,63,65,9,0,8,1,0, +0,11,1,4,0,12,0,0,1,0,0,3,1,7,181,12,9,1,1,12,9,184,1,2,181,10,251,4,6,250, +1,184,1,2,177,2,253,0,63,237,63,51,63,237,17,1,51,17,51,16,244,237,16,244, +237,49,48,1,33,53,33,17,51,33,51,17,33,53,33,3,210,252,36,3,75,145,254,7, +145,253,140,1,227,1,113,145,5,70,251,145,145,0,0,0,0,1,2,141,253,147,5,181, +7,72,0,11,0,54,182,4,8,8,13,6,2,10,186,1,0,0,11,1,6,179,12,11,254,9,184,1, +2,178,6,253,5,184,1,2,179,2,251,0,250,0,63,63,237,63,237,63,1,16,246,237, +50,50,17,51,17,51,49,48,1,51,17,33,21,33,21,33,21,33,17,35,2,141,145,2,151, +253,105,2,151,253,105,145,7,72,252,34,145,215,145,252,34,0,0,0,0,2,1,217, +253,147,5,181,7,72,0,7,0,11,0,56,178,4,13,10,186,1,0,0,11,1,4,178,12,2,6, +186,1,0,0,7,1,7,183,12,7,11,254,0,8,250,5,184,1,2,177,2,252,0,63,237,63,51, +63,51,1,16,244,237,50,16,246,237,17,51,49,48,1,51,17,33,21,33,17,35,1,51, +17,35,3,65,145,1,227,254,29,145,254,152,145,145,7,72,251,110,145,251,110, +9,181,246,75,0,0,3,1,217,253,147,5,181,7,72,0,3,0,9,0,15,0,73,181,14,6,6, +17,12,8,65,12,1,0,0,15,0,9,1,7,0,16,0,0,1,0,0,1,1,4,0,16,0,15,1,2,178,12, +251,7,184,1,2,183,4,253,10,2,250,9,1,254,0,63,51,63,51,63,237,63,237,1,16, +246,237,16,244,50,237,50,17,51,17,51,49,48,1,35,17,51,19,33,21,33,17,35,17, +51,17,33,21,33,2,106,145,145,215,2,116,254,29,145,145,1,227,253,140,253,147, +9,181,250,186,145,252,34,9,181,252,34,145,0,1,255,246,253,147,3,30,7,72,0, +11,0,56,185,0,9,1,0,178,6,2,10,184,1,6,64,10,12,4,0,0,12,10,254,7,250,3,184, +1,2,178,6,251,11,184,1,2,177,2,253,0,63,237,63,237,63,63,17,1,51,17,51,16, +246,50,50,237,49,48,3,53,33,53,33,53,33,17,51,17,35,17,10,2,151,253,105,2, +151,145,145,1,113,145,215,145,3,222,246,75,3,222,0,0,0,2,255,246,253,147, +3,210,7,72,0,7,0,11,0,59,65,10,0,10,1,0,0,11,1,7,0,12,0,5,1,0,0,2,0,6,1,4, +64,10,12,0,12,11,6,254,8,3,250,7,184,1,2,177,2,252,0,63,237,63,51,63,51,17, +1,51,16,246,50,237,16,244,237,49,48,3,53,33,17,51,17,35,17,1,51,17,35,10, +1,227,145,145,1,104,145,145,2,37,145,4,146,246,75,4,146,5,35,246,75,0,0,0, +0,3,255,246,253,147,3,210,7,72,0,3,0,9,0,15,0,73,181,7,13,13,16,6,10,65,12, +1,0,0,9,0,11,1,4,0,16,0,2,1,0,0,3,1,7,0,16,0,12,1,2,181,15,253,3,11,254,6, +184,1,2,180,9,251,0,4,250,0,63,51,63,237,63,51,63,237,1,16,244,237,16,246, +50,237,50,17,51,17,51,49,48,1,51,17,35,1,51,17,33,53,33,19,35,17,33,53,33, +3,65,145,145,254,152,145,253,140,1,227,145,145,254,29,2,116,7,72,246,75,9, +181,251,145,145,250,41,3,222,145,0,0,0,2,255,246,253,147,5,181,3,106,0,7, +0,11,0,57,180,11,3,3,13,4,186,1,0,0,7,1,6,181,12,8,0,0,12,8,184,1,2,181,9, +251,6,254,4,0,184,1,2,177,1,253,0,63,237,50,63,63,237,17,1,51,17,51,16,246, +237,17,51,17,51,49,48,3,53,33,21,33,17,35,17,1,53,33,21,10,5,191,253,105, +145,253,105,5,191,1,113,145,145,252,34,3,222,1,104,145,145,0,0,1,255,246, +253,147,5,181,2,182,0,11,0,58,178,3,13,8,191,1,0,0,11,1,4,0,12,0,4,1,0,0, +7,1,7,64,9,12,0,12,6,10,254,8,4,0,184,1,2,177,1,252,0,63,237,50,50,63,51, +17,1,51,16,244,237,16,246,237,17,51,49,48,3,53,33,21,33,17,35,17,35,17,35, +17,10,5,191,254,29,145,215,145,2,37,145,145,251,110,4,146,251,110,4,146,0, +3,255,246,253,147,5,181,3,106,0,5,0,11,0,15,0,74,180,13,8,8,17,9,186,1,0, +0,6,1,7,181,16,14,3,3,16,5,189,1,0,0,2,1,4,0,16,0,14,1,2,179,15,251,9,3,184, +1,2,181,6,4,253,11,1,254,0,63,51,63,51,237,50,63,237,1,16,246,237,17,51,17, +51,16,244,237,17,51,17,51,49,48,1,35,17,33,53,33,51,33,21,33,17,35,1,21,33, +53,2,106,145,254,29,2,116,215,2,116,254,29,145,2,116,250,65,253,147,3,222, +145,145,252,34,5,215,145,145,0,0,0,0,2,255,246,1,113,5,181,7,72,0,7,0,11, +0,58,64,9,7,11,11,13,0,8,8,12,5,189,1,0,0,2,1,6,0,12,0,8,1,2,181,9,253,3, +250,5,0,184,1,2,177,1,251,0,63,237,51,63,63,237,1,16,244,237,17,51,17,51, +17,51,17,51,49,48,3,53,33,17,51,17,33,21,1,53,33,21,10,2,151,145,2,151,250, +65,5,191,2,217,145,3,222,252,34,145,254,152,145,145,0,1,255,246,2,37,5,181, +7,72,0,11,0,58,178,11,13,9,191,1,0,0,6,1,7,0,12,0,5,1,0,0,2,1,4,64,9,12,0, +12,7,3,250,9,5,0,184,1,2,177,1,252,0,63,237,51,51,63,51,17,1,51,16,244,237, +16,244,237,17,51,49,48,3,53,33,17,51,17,51,17,51,17,33,21,10,1,227,145,215, +145,1,227,2,37,145,4,146,251,110,4,146,251,110,145,0,3,255,246,1,113,5,181, +7,72,0,5,0,11,0,15,0,76,64,9,4,15,15,17,9,12,12,16,8,65,11,1,0,0,11,1,4,0, +16,0,2,1,0,0,5,1,7,0,16,0,12,1,2,179,13,253,5,9,184,1,2,181,2,10,251,0,6, +250,0,63,51,63,51,237,50,63,237,1,16,244,237,16,244,237,17,51,17,51,17,51, +17,51,49,48,1,51,17,33,21,33,1,51,17,33,53,33,1,53,33,21,3,65,145,1,227,253, +140,254,152,145,253,140,1,227,254,29,5,191,7,72,252,34,145,4,111,251,145, +145,254,7,145,145,0,0,0,1,255,246,253,147,5,181,7,72,0,19,0,76,182,11,15, +15,21,13,9,16,184,1,0,178,6,2,19,184,1,6,64,11,20,4,0,0,20,18,254,7,250,12, +4,184,1,2,180,9,5,251,16,0,184,1,2,178,13,1,253,0,63,51,237,50,63,51,237, +50,63,63,17,1,51,17,51,16,246,50,50,237,50,50,17,51,17,51,49,48,3,53,33,53, +33,53,33,17,51,17,33,21,33,21,33,21,33,17,35,17,10,2,151,253,105,2,151,145, +2,151,253,105,2,151,253,105,145,1,113,145,215,145,3,222,252,34,145,215,145, +252,34,3,222,0,0,1,255,246,253,147,5,181,7,72,0,19,0,77,179,4,21,18,9,187, +1,0,0,15,0,12,1,4,178,20,2,5,187,1,0,0,19,0,8,1,7,64,9,20,13,20,0,16,250, +9,5,13,184,1,2,182,18,2,14,252,7,11,254,0,63,51,63,51,51,237,50,50,63,51, +17,1,51,16,244,50,237,50,16,246,50,237,50,17,51,49,48,1,51,17,33,21,33,17, +35,17,35,17,35,17,33,53,33,17,51,17,51,3,65,145,1,227,254,29,145,215,145, +254,29,1,227,145,215,7,72,251,110,145,251,110,4,146,251,110,4,146,145,4,146, +251,110,0,0,0,0,4,255,246,253,147,5,181,7,72,0,5,0,11,0,17,0,23,0,93,181, +4,14,14,25,2,15,187,1,0,0,5,0,12,1,7,182,24,21,9,9,24,20,11,187,1,0,0,23, +0,8,1,4,178,24,5,21,184,1,2,183,2,22,251,0,18,250,15,9,184,1,2,181,12,10, +253,17,7,254,0,63,51,63,51,237,50,63,51,63,51,237,50,1,16,246,50,237,50,17, +51,17,51,16,244,50,237,50,17,51,17,51,49,48,1,51,17,33,21,33,3,35,17,33,53, +33,51,33,21,33,17,35,1,51,17,33,53,33,3,65,145,1,227,253,140,215,145,254, +29,2,116,215,2,116,254,29,145,254,152,145,253,140,1,227,7,72,252,34,145,250, +186,3,222,145,145,252,34,9,181,251,145,145,0,0,0,0,1,0,0,2,109,5,171,7,72, +0,3,0,18,182,0,5,1,4,2,250,1,0,47,63,17,1,51,17,51,49,48,1,33,17,33,5,171, +250,85,5,171,2,109,4,219,0,0,0,1,0,0,253,147,5,171,2,109,0,3,0,18,182,0,5, +1,4,2,1,254,0,63,47,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253, +147,4,218,0,0,0,1,0,0,253,147,5,171,7,72,0,3,0,19,183,0,5,1,4,2,250,1,254, +0,63,63,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253,147,9,181,0, +0,1,0,0,253,147,2,214,7,72,0,3,0,17,182,1,4,0,2,250,1,254,0,63,63,1,47,17, +51,49,48,1,33,17,33,2,214,253,42,2,214,253,147,9,181,0,0,0,0,1,2,213,253, +147,5,171,7,72,0,3,0,17,182,0,5,1,2,250,1,254,0,63,63,1,47,17,51,49,48,1, +33,17,33,5,171,253,42,2,214,253,147,9,181,0,0,0,0,42,0,103,253,245,5,171, +6,163,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55, +0,59,0,63,0,67,0,71,0,75,0,79,0,83,0,87,0,91,0,95,0,99,0,103,0,107,0,111, +0,115,0,119,0,123,0,127,0,131,0,135,0,139,0,143,0,147,0,151,0,155,0,159,0, +163,0,167,2,49,181,161,157,153,149,145,165,184,1,1,182,164,109,85,69,45,13, +121,184,1,1,64,13,120,108,84,68,44,12,120,101,77,53,29,5,137,184,1,1,64,13, +136,100,76,52,28,4,136,113,89,65,41,17,125,184,1,1,64,13,124,112,88,64,40, +16,124,97,81,57,25,9,141,184,1,1,64,13,140,96,80,56,24,8,140,117,93,61,37, +21,129,184,1,1,64,33,128,116,92,60,36,20,128,120,136,124,140,128,128,140, +124,136,120,5,132,160,156,152,148,144,164,164,169,105,73,49,33,1,133,184, +1,1,64,15,104,72,48,32,0,10,132,1,8,3,132,167,143,139,135,184,1,3,180,132, +163,103,99,107,184,1,3,183,104,160,100,96,104,95,91,87,184,1,3,183,84,92, +88,84,159,83,79,75,184,1,3,183,72,156,80,76,72,67,63,71,184,1,3,183,68,64, +60,68,155,59,55,51,184,1,3,183,48,152,56,52,48,43,39,47,184,1,3,183,44,40, +36,44,151,31,27,35,184,1,3,183,32,148,28,24,32,23,19,15,184,1,3,183,12,20, +16,12,147,11,7,3,184,1,3,183,0,144,8,4,0,131,127,123,184,1,3,64,60,120,128, +124,120,22,84,1,27,72,1,25,68,1,27,48,1,27,44,1,20,32,1,104,84,72,68,48,44, +32,12,0,120,120,0,12,32,44,48,68,72,84,104,10,108,164,140,136,27,132,59,132, +2,15,132,1,2,132,119,115,111,184,1,3,178,116,112,108,0,47,51,51,237,50,50, +47,95,93,93,51,51,51,18,23,57,47,47,47,47,47,47,47,47,47,47,93,93,93,93,93, +93,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50, +17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50, +50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50, +17,51,51,51,16,237,50,50,50,16,237,50,50,50,1,47,95,94,93,51,51,51,51,51, +237,50,50,50,50,50,17,51,47,51,51,51,51,51,18,23,57,47,47,47,47,47,17,51, +51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50,50,50, +17,51,51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50, +50,50,17,51,51,51,51,51,16,237,50,50,50,50,50,16,237,50,50,50,50,50,49,48, +19,51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7, +51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51, +21,35,37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,7,51,21, +35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51,21,35, +37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,37, +51,21,35,37,51,21,35,1,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,17,51, +21,35,17,51,21,35,17,51,21,35,17,51,21,35,17,51,21,35,103,104,104,1,158,104, +104,1,160,103,103,253,145,104,104,1,159,104,104,1,159,104,104,207,103,103, +254,96,104,104,254,98,104,104,4,13,104,104,254,97,104,104,254,97,104,104, +207,104,104,1,158,104,104,1,160,103,103,207,104,104,254,97,104,104,254,97, +104,104,207,104,104,1,158,104,104,1,160,103,103,253,145,104,104,1,159,104, +104,1,159,104,104,207,103,103,254,96,104,104,254,98,104,104,207,104,104,1, +159,104,104,1,159,104,104,252,194,104,104,1,159,104,104,1,159,104,104,251, +243,104,104,1,158,104,104,1,160,103,103,1,158,104,104,104,104,104,104,104, +104,104,104,104,104,5,34,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96, +96,99,96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,97,97,97,97,97, +98,94,94,94,94,94,98,97,97,97,97,97,96,96,96,96,96,96,7,237,98,98,98,98,98, +1,35,96,96,96,96,96,254,223,98,254,223,96,254,221,96,254,221,97,254,222,97, +7,238,96,0,0,0,0,84,0,0,253,245,5,171,6,163,0,3,0,7,0,11,0,15,0,19,0,23,0, +27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,75,0,79,0,83, +0,87,0,91,0,95,0,99,0,103,0,107,0,111,0,115,0,119,0,123,0,127,0,131,0,135, +0,139,0,143,0,147,0,151,0,155,0,159,0,163,0,167,0,171,0,175,0,179,0,183,0, +187,0,191,0,195,0,199,0,203,0,207,0,211,0,215,0,219,0,223,0,227,0,231,0,235, +0,239,0,243,0,247,0,251,0,255,1,3,1,7,1,11,1,15,1,19,1,23,1,27,1,31,1,35, +1,39,1,43,1,47,1,51,1,55,1,59,1,63,1,67,1,71,1,75,1,79,0,0,19,51,21,35,55, +51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51, +21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21, +35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35, +55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35,55, +51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,37,51,21,35,55,51, +21,35,55,51,21,35,55,51,21,35,37,51,21,35,5,51,21,35,39,51,21,35,39,51,21, +35,39,51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35, +55,51,21,35,55,51,21,35,55,51,21,35,23,51,21,35,39,51,21,35,39,51,21,35,39, +51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35,55,51, +21,35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21, +35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35, +55,51,21,35,55,51,21,35,19,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23, +51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,17,51,21, +35,19,51,21,35,103,104,104,207,104,104,207,104,104,208,104,104,208,104,104, +207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104, +208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104, +207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104, +208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104, +207,104,104,251,140,103,103,1,158,103,103,207,104,104,208,104,104,208,103, +103,252,194,103,103,3,165,104,104,207,104,104,208,104,104,208,104,104,207, +104,104,207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104, +104,208,103,103,103,104,104,207,104,104,208,104,104,208,104,104,207,104,104, +207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208, +103,103,251,243,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208, +103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,207, +104,104,207,104,104,103,103,103,103,104,104,103,103,103,103,104,104,103,103, +103,103,104,104,103,103,103,103,104,104,103,103,103,103,103,103,104,104,5, +34,98,98,98,98,98,98,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96,96,96, +96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,96, +96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,97,97, +97,97,97,97,97,97,97,97,97,98,94,94,94,94,94,94,94,94,94,94,94,98,97,97,97, +97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96,7,237,98,98,98, +98,98,98,98,98,98,98,98,1,35,96,96,96,96,96,96,96,96,96,96,96,254,223,98, +97,96,96,96,99,96,96,96,99,96,96,97,98,94,98,97,96,96,7,237,98,1,35,96,0, +0,67,0,0,253,147,5,213,6,163,0,73,0,77,0,81,0,85,0,89,0,93,0,97,0,101,0,105, +0,109,0,113,0,117,0,121,0,125,0,129,0,133,0,137,0,141,0,145,0,149,0,153,0, +157,0,161,0,165,0,169,0,173,0,177,0,181,0,185,0,189,0,193,0,197,0,201,0,205, +0,209,0,213,0,217,0,221,0,225,0,229,0,233,0,237,0,241,0,245,0,249,0,253,1, +1,1,5,1,9,1,13,1,17,1,21,1,25,1,29,1,33,1,37,1,41,1,45,1,49,1,53,1,57,1,61, +1,65,1,69,1,73,1,77,1,81,0,0,1,33,17,51,53,35,17,51,53,35,17,51,53,35,17, +51,53,35,17,51,53,35,17,51,53,51,21,51,53,51,21,51,53,51,21,51,53,51,21,51, +53,51,21,51,53,51,21,51,53,51,21,35,21,51,17,35,21,51,17,35,21,51,17,35,21, +51,17,35,21,51,17,35,21,51,1,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53, +23,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,7,21,51,53,51,21,51,53,51, +21,51,53,51,21,51,53,5,35,21,51,55,21,51,53,51,21,51,53,51,21,51,53,5,21, +51,53,33,21,51,53,7,53,35,21,37,21,51,53,19,53,35,21,35,53,35,21,35,53,35, +21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53,19,53,35,21, +35,53,35,21,35,53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51, +21,51,53,19,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,1,35,21,51,39,35, +21,51,39,35,21,51,39,35,21,51,1,21,51,53,51,21,51,53,23,35,21,51,39,35,21, +51,7,21,51,53,51,21,51,53,7,35,21,51,55,21,51,53,5,21,51,53,23,53,35,21,23, +53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,19,53,35,21,35,53,35,21,7,21, +51,53,51,21,51,53,19,35,21,51,39,35,21,51,19,35,21,51,39,35,21,51,5,213,250, +43,106,106,106,106,106,106,106,106,106,106,106,107,106,107,106,107,107,107, +107,107,106,107,106,107,107,107,107,107,107,107,107,107,107,107,107,107,250, +149,107,106,107,106,107,107,107,107,107,107,214,107,107,214,106,106,213,106, +106,213,107,106,107,106,107,107,107,253,234,106,106,107,106,107,107,107,107, +252,170,107,1,63,107,213,107,1,171,107,107,107,107,107,107,106,107,106,107, +107,106,107,106,107,107,107,107,107,107,107,107,106,107,106,107,107,106,107, +106,107,107,107,107,107,107,214,107,107,214,106,106,213,106,106,2,22,107, +107,214,107,107,213,107,107,213,107,107,2,235,107,106,107,106,106,106,213, +106,106,213,107,106,107,107,106,106,107,106,254,86,107,213,107,213,106,107, +106,107,107,106,107,106,106,107,106,107,107,106,107,106,106,106,213,106,106, +107,107,107,213,107,107,253,147,1,34,97,1,34,97,1,35,96,1,33,98,1,33,98,1, +33,96,96,96,96,96,96,96,96,96,96,96,96,96,193,98,254,223,96,254,221,96,254, +221,96,254,221,94,254,221,96,6,106,96,96,96,96,96,96,96,96,192,98,98,98,98, +98,98,98,97,96,96,96,96,96,96,96,96,192,96,96,96,96,96,96,96,96,195,96,96, +96,96,96,96,96,96,96,96,254,223,97,97,97,97,97,97,97,97,98,94,94,94,94,94, +94,94,94,254,223,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,6,205, +98,98,98,98,98,98,98,1,34,98,98,98,98,98,98,98,254,223,96,96,96,96,192,98, +98,98,97,96,96,96,96,192,96,96,96,96,195,96,96,96,96,96,193,97,97,97,97,98, +94,94,94,94,254,223,97,97,97,97,96,96,96,96,96,6,205,98,98,98,1,34,98,98, +98,0,0,0,0,1,0,123,0,117,4,90,4,84,0,3,0,0,19,33,17,33,123,3,223,252,33,4, +84,252,33,0,0,2,0,6,0,0,4,207,4,201,0,3,0,7,0,21,183,7,1,4,0,4,0,5,3,0,47, +205,221,205,1,47,205,221,205,49,48,19,33,17,33,19,17,33,17,6,4,201,251,55, +76,4,49,4,201,251,55,4,125,251,207,4,49,0,0,1,0,109,1,127,2,105,3,123,0,3, +0,26,64,13,3,48,2,1,15,2,31,2,2,8,2,1,2,0,47,205,1,47,94,93,93,205,49,48, +1,33,17,33,2,105,254,4,1,252,1,127,1,252,0,0,0,2,0,109,1,127,2,105,3,123, +0,3,0,7,0,34,64,17,5,3,6,48,2,1,15,2,31,2,2,8,2,7,1,6,2,0,47,205,221,205, +1,47,94,93,93,205,221,205,49,48,1,33,17,33,3,17,33,17,2,105,254,4,1,252,76, +254,156,1,127,1,252,254,80,1,98,254,158,0,0,0,0,1,0,0,0,0,8,0,2,104,0,3,0, +0,17,33,17,33,8,0,248,0,2,104,253,152,0,0,0,1,1,158,0,0,6,76,4,174,0,2,0, +0,33,9,1,1,158,2,88,2,86,4,174,251,82,0,0,1,1,145,255,229,6,90,4,172,0,2, +0,0,9,2,1,145,4,201,251,55,4,172,253,158,253,155,0,1,1,158,255,229,6,76,4, +147,0,2,0,0,9,2,6,76,253,170,253,168,4,147,251,82,4,174,0,1,1,145,255,229, +6,90,4,172,0,2,0,0,1,17,1,6,90,251,55,4,172,251,57,2,101,0,0,2,0,8,0,0,3, +238,5,160,0,5,0,9,0,37,64,20,134,7,1,9,0,5,16,5,2,5,7,31,2,1,2,6,3,4,8,1, +0,47,51,63,51,1,47,93,51,47,93,51,49,48,93,33,35,9,1,51,9,4,2,35,82,254,55, +1,201,82,1,203,254,14,254,158,1,98,1,96,2,207,2,209,253,49,2,53,253,203,253, +194,2,62,0,2,0,167,0,162,4,46,4,41,0,19,0,39,0,46,64,28,68,37,84,37,2,75, +33,91,33,2,75,27,91,27,2,68,23,84,23,2,30,10,20,0,25,15,35,5,0,47,205,220, +205,1,47,205,220,205,49,48,93,93,93,93,19,52,62,2,51,50,30,2,21,20,14,2,35, +34,46,2,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,167,70,122,164,94,94, +165,123,71,71,123,165,94,94,164,122,70,86,57,98,133,76,76,134,99,58,58,99, +134,76,76,133,98,57,2,100,94,165,123,71,71,123,165,94,94,164,122,70,70,122, +164,94,76,132,99,57,57,99,132,76,76,134,99,58,58,99,134,0,0,0,0,1,0,178,0, +137,4,35,3,250,0,23,0,17,182,8,16,12,15,0,1,0,0,47,93,205,1,47,205,49,48, +1,50,23,30,1,23,30,1,21,20,7,6,35,34,39,38,53,52,54,55,62,1,55,54,2,106,110, +107,53,82,29,29,31,129,129,183,182,129,129,30,29,29,83,52,108,3,250,57,28, +82,52,54,110,57,183,129,129,129,129,183,58,109,54,52,82,28,57,0,0,0,2,0,41, +0,0,4,172,4,131,0,3,0,23,0,21,183,14,2,4,1,19,1,9,0,0,47,205,221,205,1,47, +205,221,205,49,48,51,17,33,17,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2, +41,4,131,252,4,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69,4, +131,251,125,2,65,91,160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0, +3,0,41,0,0,4,172,4,131,0,3,0,23,0,43,0,34,64,14,4,24,1,14,34,2,1,19,29,0, +9,39,1,0,0,47,221,221,206,16,221,206,1,47,221,221,206,16,221,206,49,48,51, +17,33,17,1,52,62,2,51,50,30,2,21,20,14,2,35,34,46,2,39,20,30,2,51,50,62,2, +53,52,46,2,35,34,14,2,41,4,131,252,81,58,99,133,75,75,133,99,58,58,99,133, +75,75,133,99,58,77,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69, +4,131,251,125,2,65,75,133,99,58,58,99,133,75,75,133,99,58,58,99,133,75,91, +160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0,2,0,115,1,133,2,99, +3,117,0,18,0,34,0,21,183,19,0,27,11,31,6,23,15,0,47,205,220,205,1,47,205, +220,205,49,48,1,20,6,7,14,1,35,34,39,46,1,53,52,55,54,51,50,23,22,7,52,39, +38,35,34,7,6,21,20,23,22,51,50,55,54,2,99,37,37,37,86,51,101,75,35,37,72, +74,102,103,71,74,76,51,51,70,70,51,51,51,49,72,72,49,51,2,125,53,86,37,35, +37,72,37,86,53,102,72,74,74,71,103,70,51,51,51,51,70,69,54,49,49,54,0,0,0, +5,1,177,255,229,6,121,4,172,0,17,0,33,0,45,0,57,0,68,0,147,64,93,20,32,36, +32,116,32,3,20,28,36,28,116,28,3,27,24,43,24,123,24,3,27,20,43,20,123,20, +3,68,34,40,63,52,46,40,46,40,46,8,18,31,0,1,0,26,8,49,37,43,55,43,62,58,104, +58,1,89,58,1,71,58,1,25,58,1,58,60,65,15,43,95,43,111,43,3,8,65,64,9,14,72, +43,65,43,65,4,22,15,13,1,13,30,4,0,47,205,220,93,205,18,57,57,47,47,43,94, +93,16,205,51,93,93,93,93,17,51,17,51,16,205,50,1,47,205,220,93,205,18,57, +57,47,47,16,205,51,16,205,51,49,48,0,93,93,93,93,1,20,7,6,35,34,39,38,53, +52,54,55,54,51,50,23,30,1,7,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54,1, +20,6,35,34,38,53,52,54,51,50,22,5,20,6,35,34,38,53,52,54,51,50,22,1,22,51, +50,55,23,6,35,34,38,39,6,121,180,179,253,253,179,180,90,90,178,254,254,178, +90,90,90,153,151,218,218,151,153,153,152,217,217,152,153,253,90,46,32,32, +45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,234,76,147,145,76,62,98, +185,94,141,48,2,72,254,178,179,179,178,254,128,215,91,178,178,91,215,128, +217,153,154,154,153,217,216,153,154,154,153,1,87,32,46,46,32,32,45,45,32, +32,46,46,32,32,45,45,254,191,137,137,35,186,95,91,0,0,4,1,209,255,229,6,153, +4,172,0,17,0,29,0,41,0,52,0,96,64,55,42,18,24,47,36,30,24,30,24,30,0,8,39, +27,21,33,21,48,52,104,52,1,89,52,1,75,52,1,61,52,1,52,50,45,15,21,31,21,95, +21,111,21,4,8,79,45,95,45,2,21,45,21,45,13,4,0,47,204,57,57,47,47,93,94,93, +16,206,51,93,93,93,93,17,51,17,51,16,206,50,1,47,205,57,57,47,47,16,206,51, +16,206,51,49,48,1,20,7,6,35,34,39,38,53,52,54,55,54,51,50,23,30,1,5,52,38, +35,34,6,21,20,22,51,50,54,37,52,38,35,34,6,21,20,22,51,50,54,1,30,1,51,50, +55,39,6,35,34,39,6,153,180,179,253,253,179,180,90,90,178,254,254,178,90,90, +253,0,46,32,32,45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,174,48,141, +94,185,98,62,76,145,147,76,2,72,254,178,179,179,178,254,128,215,91,178,178, +91,215,1,32,45,45,32,32,46,46,32,32,45,45,32,32,46,46,254,220,91,95,186,35, +137,137,0,2,1,70,255,115,6,14,4,59,0,51,0,70,0,139,185,0,47,255,240,64,13, +11,14,72,52,46,1,52,36,1,119,35,1,35,184,255,240,64,77,11,14,72,21,16,11, +14,72,59,20,1,59,9,1,8,16,11,14,72,59,47,1,52,35,1,52,21,1,59,8,1,66,143, +13,223,13,2,112,13,1,63,13,1,32,13,1,13,57,43,62,128,31,208,31,224,31,3,127, +31,1,48,31,1,47,31,1,31,52,15,51,63,51,79,51,3,8,51,0,47,94,93,205,220,93, +93,93,93,205,1,47,205,220,93,93,93,93,205,49,48,0,93,93,93,93,1,43,93,93, +43,43,93,93,93,43,1,51,21,30,3,23,55,23,7,30,1,23,51,21,35,14,1,7,23,7,39, +14,1,7,14,1,7,21,35,53,46,1,39,7,39,55,46,1,39,35,53,51,54,55,39,55,23,62, +1,55,23,34,6,7,6,21,20,23,30,1,51,50,55,54,53,52,39,46,1,3,137,66,32,57,54, +53,29,186,45,184,45,44,3,215,215,8,44,40,184,49,182,31,55,23,24,58,34,66, +63,110,48,188,43,182,40,46,8,215,215,12,80,180,40,189,57,112,54,31,69,117, +48,98,98,48,117,69,139,96,99,99,49,117,4,59,217,3,12,21,32,22,182,45,184, +59,113,57,62,60,110,51,188,43,182,23,32,11,9,12,5,217,217,9,46,35,180,45, +184,51,111,63,62,128,95,184,49,182,40,44,6,61,50,48,100,136,137,98,50,47, +97,97,138,137,99,48,50,0,0,0,2,1,218,0,80,4,38,4,129,0,28,0,47,0,98,64,62, +22,18,25,0,0,5,15,43,1,239,43,255,43,2,43,15,14,1,14,0,34,1,224,34,240,34, +2,34,5,22,25,19,0,28,16,28,80,28,3,28,0,39,1,240,39,1,39,18,0,0,128,0,2,8, +0,29,64,37,40,72,29,10,0,47,205,43,220,94,93,50,205,113,114,47,93,51,205, +50,1,47,205,113,114,220,93,205,113,114,17,57,47,51,205,50,49,48,1,46,1,39, +38,53,52,55,62,1,51,50,23,22,21,20,7,6,7,21,33,21,33,17,35,17,33,53,33,19, +34,7,14,1,21,20,22,23,22,51,50,55,54,53,52,38,39,38,2,220,55,90,35,71,83, +44,101,60,118,83,86,72,72,106,1,0,255,0,74,254,254,1,2,35,83,62,29,31,31, +29,62,83,87,59,61,30,29,62,2,66,8,46,42,80,108,122,83,43,43,86,83,122,109, +81,82,12,166,70,254,250,1,6,70,2,145,59,31,71,44,43,71,31,62,62,61,84,44, +71,31,59,0,2,1,81,0,250,4,175,4,129,0,65,0,81,0,70,64,40,49,65,59,15,78,1, +78,63,32,1,32,15,51,1,51,0,70,1,70,59,65,49,63,74,0,55,128,55,2,55,66,144, +20,1,20,15,63,1,8,63,0,47,94,93,204,93,205,220,93,205,18,57,57,1,47,205,114, +220,93,204,93,205,114,18,57,57,49,48,1,46,1,39,46,1,39,46,1,53,52,55,62,1, +51,50,22,23,30,1,51,50,54,55,54,51,50,21,20,7,14,1,21,20,22,23,30,1,21,20, +6,7,6,35,34,39,46,1,39,7,22,21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,7, +34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,3,255,17,54,37,28,40,14,5,3,6, +3,6,5,5,15,13,32,63,32,46,64,19,36,13,16,6,9,7,4,8,2,2,2,2,9,5,21,20,22,31, +11,237,84,86,87,118,118,87,84,84,85,122,71,83,154,90,62,61,61,64,88,89,60, +62,62,60,4,0,5,18,14,11,24,14,3,10,5,8,9,2,2,2,2,8,9,7,6,12,14,9,18,34,79, +45,31,64,34,11,16,5,5,7,3,6,39,42,82,42,238,81,109,125,86,88,84,84,117,117, +87,86,43,32,62,61,88,91,61,61,61,62,90,87,62,62,0,0,1,0,59,0,0,4,5,4,207, +0,47,0,40,64,25,38,32,10,48,10,96,10,112,10,4,10,14,34,64,8,11,72,34,23,79, +0,95,0,2,0,0,47,93,47,47,43,51,1,47,93,47,49,48,1,30,1,23,30,1,23,22,23,22, +21,20,7,6,35,34,39,22,23,30,1,31,1,33,55,50,55,62,3,39,14,1,35,34,39,38,53, +52,55,62,1,55,62,1,55,54,2,32,14,40,26,28,95,69,141,35,37,63,66,88,157,99, +3,36,38,163,137,8,252,232,6,125,86,43,66,44,20,1,45,132,83,90,66,63,30,23, +78,57,69,110,38,56,4,207,54,95,44,43,105,63,126,66,67,70,95,63,66,191,147, +87,86,99,9,37,37,49,25,69,91,119,75,96,95,66,63,91,74,59,42,85,47,59,113, +57,83,0,0,0,0,1,0,60,0,0,5,4,4,199,0,75,0,47,64,24,57,77,63,23,1,23,52,61, +67,13,47,30,4,18,31,18,1,27,18,27,18,1,41,1,0,47,47,18,57,57,47,47,93,18, +23,57,50,51,1,47,93,16,206,49,48,41,1,55,62,1,55,62,1,55,54,53,52,38,53,6, +7,14,1,35,34,38,39,38,53,52,55,54,51,50,22,23,46,1,39,46,1,53,52,55,62,1, +51,50,23,22,21,20,7,54,55,62,1,51,50,22,23,22,21,20,7,6,35,34,38,39,46,1, +39,30,1,23,30,1,23,22,23,4,70,252,182,8,84,108,27,41,64,26,52,2,58,90,43, +88,45,59,97,41,79,73,73,93,31,80,51,20,27,8,5,6,78,40,97,60,116,80,80,69, +84,16,14,30,17,51,86,36,73,80,80,112,62,132,50,17,43,26,3,23,23,22,67,46, +61,159,35,17,33,17,25,75,50,100,109,8,22,17,121,59,28,30,42,38,83,116,115, +79,80,25,26,34,52,19,17,38,20,115,78,38,40,80,78,109,86,98,40,3,5,3,37,41, +76,116,118,83,80,60,51,19,61,45,81,125,46,45,76,31,39,30,0,1,0,102,255,233, +4,90,4,121,0,39,0,38,64,23,18,2,1,4,2,1,8,29,41,16,12,64,12,80,12,112,12, +128,12,5,12,16,0,0,47,47,1,47,93,16,206,49,48,94,93,93,5,46,1,39,46,1,39, +46,1,39,46,1,53,52,55,54,51,50,23,30,1,23,62,1,51,50,22,23,22,21,20,7,14, +1,7,14,1,7,14,1,2,98,14,42,26,28,103,76,56,69,14,43,37,68,70,102,98,78,28, +47,17,34,142,88,50,85,35,70,41,20,78,60,75,108,32,31,44,23,56,101,48,50,147, +102,76,93,22,65,106,56,103,71,70,72,28,80,54,119,117,36,34,70,94,86,88,45, +119,75,96,152,55,54,110,0,0,0,0,1,0,66,255,231,3,210,4,199,0,26,0,18,183, +48,12,1,12,75,21,1,21,0,25,47,93,1,47,93,49,48,1,30,1,23,30,1,23,14,1,7,14, +1,7,46,1,39,46,1,39,46,1,39,62,1,55,62,1,2,7,45,113,69,69,116,47,39,120,83, +69,106,40,13,35,22,38,98,60,14,94,81,50,128,80,59,96,4,199,78,165,93,93,141, +53,40,150,111,93,159,72,25,58,32,57,135,80,20,119,99,59,160,107,77,148,0, +0,1,0,196,0,29,3,59,4,129,0,33,0,48,64,25,2,19,33,13,64,79,6,95,6,111,6,3, +6,128,27,33,18,10,10,47,0,1,0,31,24,0,47,205,204,93,57,47,57,1,47,205,26, +220,93,26,205,16,205,50,49,48,1,51,21,23,30,1,21,20,6,7,35,62,1,53,52,38, +39,38,39,17,20,6,7,6,35,34,38,53,52,55,54,51,50,23,1,233,76,153,51,58,48, +46,47,29,28,28,29,57,64,37,37,72,108,57,58,60,63,80,44,46,4,129,100,193,69, +163,85,78,134,59,65,124,59,60,99,40,81,9,254,6,63,98,38,75,54,46,73,60,60, +19,0,2,1,16,255,213,4,239,4,135,0,34,0,38,0,108,64,61,35,32,64,18,26,128, +36,15,64,111,0,1,0,128,15,9,1,9,9,0,26,1,26,17,35,86,35,1,67,35,1,35,16,36, +54,36,1,37,36,1,20,36,1,3,36,1,8,36,34,38,33,88,33,1,33,37,34,30,23,13,6, +0,47,205,47,205,47,51,51,93,17,51,17,51,94,93,93,93,93,17,51,51,93,93,17, +51,1,47,93,51,47,93,26,221,93,26,205,50,26,16,221,26,205,51,49,48,1,20,6, +7,14,1,35,34,38,53,52,55,54,51,50,23,17,5,17,20,6,7,6,35,34,38,53,52,55,54, +51,50,23,17,37,1,37,53,5,4,239,36,38,37,88,51,57,57,57,62,81,48,42,253,218, +37,35,74,106,57,58,59,60,84,45,45,2,186,253,144,2,38,253,218,1,68,63,101, +35,37,39,54,47,76,57,59,18,1,192,149,254,118,62,98,38,74,53,45,76,57,60,19, +2,240,178,254,103,149,117,152,0,0,0,3,0,29,0,0,3,118,5,204,0,27,0,31,0,35, +0,100,179,67,10,1,10,184,255,224,64,59,8,12,72,31,35,70,28,47,32,143,32,207, +32,3,31,32,79,32,111,32,143,32,4,32,79,16,95,16,2,16,16,1,70,144,2,1,111, +2,1,2,34,15,31,83,30,0,19,80,12,0,0,4,80,25,5,15,32,1,21,0,63,51,63,51,237, +50,63,237,63,237,63,1,47,93,93,237,50,47,93,47,93,113,51,237,50,49,48,0,43, +93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51, +21,19,53,51,21,3,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18, +40,51,29,11,211,134,180,180,180,3,183,252,73,3,183,131,122,59,101,75,43,6, +6,137,3,5,22,41,60,39,97,131,1,105,172,172,250,224,4,58,251,198,0,0,0,0,2, +0,29,0,0,3,119,5,204,0,27,0,31,0,90,179,67,10,1,10,184,255,224,64,53,8,12, +72,31,70,47,28,143,28,207,28,3,31,28,79,28,111,28,143,28,4,28,79,16,95,16, +2,16,16,1,70,144,2,1,111,2,1,2,30,0,19,80,12,0,0,4,80,25,5,15,28,1,21,0,63, +51,63,51,237,50,63,237,63,1,47,93,93,237,50,47,93,47,93,113,237,49,48,0,43, +93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51, +21,19,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51,29, +11,211,135,180,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41, +60,39,97,131,252,73,5,204,250,52,0,0,1,0,119,254,78,1,227,255,170,0,28,0, +75,185,0,2,255,232,179,9,17,72,27,184,255,224,64,40,9,17,72,22,22,8,16,131, +15,0,1,95,0,1,0,8,19,140,63,23,79,23,2,23,11,140,0,5,16,5,32,5,80,5,96,5, +112,5,6,5,0,47,93,237,47,93,237,1,47,221,93,113,237,18,57,47,49,48,43,43, +5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35,42,1,7,55,51,50,30,2,1, +227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14,29,14,31,62,52,84,60, +32,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,96,18,41,63,0,0,0,255,255, +0,243,1,190,1,182,2,154,17,6,0,119,56,0,0,18,64,11,0,127,0,1,111,0,1,95,0, +1,0,17,93,93,93,53,0,1,0,127,254,78,1,72,255,158,0,10,0,75,185,0,5,255,192, +179,9,17,72,2,184,255,192,64,28,9,17,72,7,151,0,150,4,9,8,146,16,3,32,3,2, +0,3,96,3,160,3,176,3,192,3,5,3,184,255,192,64,10,30,33,72,3,0,9,16,9,2,9, +0,47,93,204,43,93,113,237,1,47,51,253,237,49,48,43,43,5,20,6,7,35,62,1,53, +35,53,51,1,72,44,40,117,45,49,88,195,193,87,107,47,48,86,46,156,0,0,0,0,2, +0,14,2,51,2,150,5,129,0,10,0,23,0,108,64,74,86,10,1,86,9,1,121,6,137,6,2, +17,175,5,191,5,2,5,64,29,60,72,5,64,24,27,72,5,8,1,224,18,6,16,2,1,48,2,1, +64,2,144,2,2,2,0,4,229,8,5,95,17,111,17,127,17,3,15,17,31,17,127,17,143,17, +4,17,17,1,11,6,220,1,223,0,63,63,51,18,57,47,93,113,51,51,237,50,1,47,93, +113,114,51,51,237,50,47,43,43,93,51,49,48,93,114,114,1,21,35,53,33,53,1,51, +17,51,21,3,14,3,7,3,33,17,60,2,54,2,39,131,254,106,1,130,151,111,240,7,22, +24,22,7,199,1,23,1,2,229,178,178,111,2,45,253,213,113,2,23,13,37,39,35,11, +254,225,1,33,14,38,38,34,0,0,0,0,1,0,53,2,40,2,124,5,129,0,38,0,134,64,37, +37,36,53,36,69,36,3,3,24,9,13,72,19,34,1,4,34,1,3,31,30,25,224,139,27,1,6, +27,10,192,26,208,26,224,26,3,26,184,255,192,64,53,16,19,72,26,29,0,225,32, +19,96,19,2,32,19,96,19,160,19,224,19,4,19,22,228,34,34,16,30,229,27,220,68, +11,84,11,100,11,3,53,11,1,6,11,22,11,38,11,3,11,16,228,5,221,0,63,237,50, +93,93,93,63,237,18,57,47,237,1,47,93,113,237,50,47,43,93,51,51,95,113,237, +50,50,0,95,93,93,49,48,43,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53, +52,38,35,34,6,7,35,19,33,21,33,7,62,1,51,50,30,2,2,124,38,73,108,70,66,101, +74,44,9,133,5,24,39,54,36,71,86,81,75,51,77,23,129,33,1,250,254,114,19,29, +91,54,67,103,69,36,3,67,65,104,74,40,33,59,81,48,15,27,47,36,21,85,93,81, +85,37,23,1,212,113,245,26,33,39,71,102,0,0,0,1,0,43,2,52,2,120,5,129,0,14, +0,54,64,33,5,224,6,6,0,175,12,191,12,2,12,11,96,0,1,191,0,207,0,255,0,3,96, +0,1,0,0,12,229,13,220,5,223,0,63,63,237,50,1,47,93,93,113,51,47,93,17,57, +47,237,49,48,1,14,3,21,35,52,62,2,55,33,53,33,2,120,64,106,77,43,133,47,80, +107,60,254,52,2,77,5,28,97,176,176,187,108,102,188,179,175,88,113,0,3,0,45, +2,40,2,130,5,142,0,19,0,39,0,81,0,138,185,0,68,255,232,179,11,15,72,64,184, +255,232,64,82,11,15,72,47,24,9,13,72,43,24,9,13,72,5,15,21,15,2,76,55,71, +10,226,72,61,1,61,61,30,226,224,50,1,191,50,1,50,0,226,70,71,1,71,71,40,226, +32,20,96,20,2,32,20,96,20,160,20,224,20,4,20,76,56,25,228,15,15,35,26,5,1, +11,5,1,5,228,66,222,35,228,45,221,0,63,237,63,237,93,93,18,57,47,237,57,57, +1,47,93,113,237,50,47,113,237,47,93,93,237,51,47,113,237,18,57,57,0,93,49, +48,43,43,43,43,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,19,52,46,2,35,34, +14,2,21,20,30,2,51,50,62,2,55,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3,53, +52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,1,223,12,31,53,41,39,53,31,13,9,29, +54,45,48,54,27,7,21,13,35,61,49,45,59,36,15,15,36,61,46,46,61,34,14,142,35, +73,113,77,77,113,74,35,29,47,61,32,36,55,38,20,35,70,104,68,72,105,69,33, +20,38,56,36,36,63,46,26,4,169,28,48,34,19,19,34,48,28,23,47,39,25,25,39,48, +254,155,28,52,40,24,24,41,53,28,35,59,42,23,23,42,60,22,54,91,66,37,37,66, +90,54,46,72,52,32,5,3,8,37,52,64,35,45,79,59,34,35,60,79,44,35,63,52,37,7, +3,6,31,52,72,0,1,255,229,4,176,2,195,5,240,0,17,0,62,64,41,117,11,133,11, +2,117,7,133,7,2,12,73,15,13,191,13,239,13,3,13,6,73,64,5,12,5,128,9,142,15, +0,47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,205,50,1,47,26,237,220,93,237, +49,48,0,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,84,111,141,81,32, +2,164,6,104,93,93,104,6,164,2,32,81,141,4,176,57,91,115,57,103,96,96,103, +57,115,91,57,0,1,0,124,4,28,1,69,5,129,0,10,0,36,64,21,7,151,0,150,4,9,8, +146,80,3,96,3,2,160,3,176,3,2,3,9,3,0,63,204,93,113,237,1,47,51,253,237,49, +48,1,20,6,7,35,62,1,53,35,53,51,1,69,44,40,117,45,49,88,195,5,23,87,117,47, +48,96,46,167,0,0,1,0,130,4,187,1,75,6,32,0,10,0,47,64,30,4,9,150,7,151,10, +7,146,95,3,111,3,2,175,3,191,3,2,3,80,10,1,15,10,63,10,127,10,3,10,0,47,93, +113,205,93,113,237,1,47,237,237,50,49,48,19,52,54,55,51,14,1,21,51,21,35, +130,44,40,117,45,49,88,195,5,37,87,117,47,48,96,46,167,0,0,0,0,1,0,106,5, +250,2,18,6,240,0,5,0,48,64,30,117,3,133,3,2,128,4,1,64,4,1,4,64,1,2,64,16, +20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43,1,47,26,205,93,93, +49,48,93,1,37,53,51,23,21,1,160,254,202,207,217,5,250,217,29,226,20,0,1,0, +72,5,250,1,240,6,240,0,5,0,52,64,34,122,2,138,2,2,64,3,128,3,2,3,64,79,0, +143,0,2,0,2,64,16,20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43, +1,47,93,26,205,93,49,48,93,19,53,55,51,21,5,72,217,207,254,202,5,250,20,226, +29,217,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,9,134,9,2,120,8,136, +8,2,128,0,1,0,184,255,192,64,25,11,15,72,0,6,4,142,64,8,64,16,19,72,8,128, +6,95,1,1,1,64,9,12,72,1,0,47,43,93,51,26,221,43,26,237,1,47,204,43,93,49, +48,93,93,1,21,35,39,35,7,35,53,55,51,2,150,105,219,2,232,104,234,204,6,14, +20,139,139,20,240,0,0,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,0,134, +0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,25,11,15,72,8,64,2,7,3,64,16,19, +72,3,128,6,142,95,1,1,1,64,9,12,72,1,0,47,43,93,237,26,205,43,50,1,47,26, +204,43,93,49,48,93,93,1,35,39,53,51,23,51,55,51,21,1,182,204,234,104,232, +2,219,105,5,250,239,21,139,139,21,0,0,0,0,2,0,45,5,250,2,90,6,178,0,3,0,7, +0,35,64,19,3,133,0,7,133,4,1,5,145,0,95,4,1,4,64,9,12,72,4,0,47,43,93,51, +237,50,1,47,237,220,237,49,48,1,53,51,21,33,53,51,21,1,183,163,253,211,165, +5,250,184,184,184,184,0,0,1,255,233,5,250,2,182,7,6,0,27,0,68,181,89,2,105, +2,2,26,184,255,232,64,34,9,15,72,12,24,9,15,72,64,23,1,15,23,1,23,9,22,5, +143,64,14,128,19,143,8,95,0,1,0,64,9,12,72,0,0,47,43,93,50,237,26,221,26, +237,51,1,47,204,93,93,49,48,43,43,0,93,1,34,46,2,35,34,6,7,35,62,3,51,50, +30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45,74,59,44, +84,78,69,30,54,55,8,92,5,20,43,74,5,250,37,45,37,62,57,45,95,78,50,37,45, +37,63,56,44,95,78,51,0,0,0,0,2,0,32,5,250,3,15,6,241,0,5,0,11,0,88,64,60, +154,8,170,8,2,154,2,170,2,2,102,10,1,98,4,1,98,3,1,10,159,7,1,15,7,31,7,127, +7,223,7,4,7,7,4,64,0,64,9,31,72,0,8,2,64,16,20,72,2,128,6,95,0,1,0,64,9,12, +72,0,0,47,43,93,50,26,205,43,50,1,47,43,26,205,220,94,93,113,205,49,48,93, +93,93,93,93,19,53,55,51,21,5,51,53,55,51,21,5,32,197,207,254,202,253,197, +207,254,202,5,250,20,227,29,218,20,227,29,218,0,1,255,232,5,250,2,130,6,243, +0,17,0,55,64,32,4,11,1,4,7,1,17,15,19,1,100,13,64,5,12,5,64,16,20,72,5,128, +9,95,0,1,0,64,9,12,72,0,0,47,43,93,205,26,205,43,50,1,47,26,204,94,93,49, +48,0,94,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,52,74,116,84,50, +8,117,17,109,91,91,107,17,117,9,50,83,116,5,250,41,69,90,49,53,60,61,52,49, +90,69,41,0,0,0,0,0,0,1,0,0,21,86,0,1,3,140,12,0,0,9,9,72,0,3,0,36,255,143, +0,3,0,55,255,219,0,3,0,60,255,219,0,3,1,82,255,143,0,3,1,91,255,143,0,3,1, +94,255,143,0,3,1,101,255,143,0,3,1,109,255,219,0,3,1,110,255,219,0,3,1,116, +255,219,0,20,0,20,255,104,0,36,0,3,255,143,0,36,0,55,255,104,0,36,0,57,255, +104,0,36,0,58,255,180,0,36,0,60,255,104,0,36,0,89,255,219,0,36,0,90,255,219, +0,36,0,92,255,219,0,36,2,3,255,104,0,41,0,15,255,29,0,41,0,17,255,29,0,41, +0,36,255,143,0,47,0,3,255,180,0,47,0,55,255,104,0,47,0,57,255,104,0,47,0, +58,255,104,0,47,0,60,255,104,0,47,0,92,255,180,0,47,2,3,255,143,0,51,0,3, +255,219,0,51,0,15,254,248,0,51,0,17,254,248,0,51,0,36,255,104,0,53,0,55,255, +219,0,53,0,57,255,219,0,53,0,58,255,219,0,53,0,60,255,219,0,55,0,3,255,219, +0,55,0,15,255,29,0,55,0,16,255,143,0,55,0,17,255,29,0,55,0,29,255,29,0,55, +0,30,255,29,0,55,0,36,255,104,0,55,0,50,255,219,0,55,0,68,255,29,0,55,0,70, +255,29,0,55,0,72,255,29,0,55,0,76,255,180,0,55,0,82,255,29,0,55,0,85,255, +180,0,55,0,86,255,29,0,55,0,88,255,180,0,55,0,90,255,143,0,55,0,92,255,143, +0,57,0,15,255,68,0,57,0,16,255,143,0,57,0,17,255,68,0,57,0,29,255,180,0,57, +0,30,255,180,0,57,0,36,255,104,0,57,0,68,255,104,0,57,0,72,255,143,0,57,0, +76,255,219,0,57,0,82,255,143,0,57,0,85,255,180,0,57,0,88,255,180,0,57,0,92, +255,180,0,58,0,15,255,143,0,58,0,16,255,219,0,58,0,17,255,143,0,58,0,29,255, +219,0,58,0,30,255,219,0,58,0,36,255,180,0,58,0,68,255,180,0,58,0,72,255,219, +0,58,0,82,255,219,0,58,0,85,255,219,0,58,0,88,255,219,0,58,0,92,255,238,0, +60,0,3,255,219,0,60,0,15,254,248,0,60,0,16,255,68,0,60,0,17,254,248,0,60, +0,29,255,143,0,60,0,30,255,123,0,60,0,36,255,104,0,60,0,68,255,104,0,60,0, +72,255,68,0,60,0,76,255,180,0,60,0,82,255,68,0,60,0,83,255,104,0,60,0,84, +255,68,0,60,0,88,255,143,0,60,0,89,255,143,0,73,0,73,255,219,0,73,2,3,0,37, +0,85,0,15,255,143,0,85,0,17,255,143,0,85,2,3,0,76,0,89,0,15,255,104,0,89, +0,17,255,104,0,90,0,15,255,143,0,90,0,17,255,143,0,92,0,15,255,104,0,92,0, +17,255,104,1,82,1,98,255,213,1,82,1,105,255,213,1,82,1,109,255,104,1,82,1, +110,255,104,1,82,1,111,255,197,1,82,1,116,255,104,1,82,1,124,255,219,1,82, +1,134,255,219,1,82,1,144,255,219,1,87,1,110,255,190,1,88,1,90,0,170,1,88, +1,91,255,104,1,88,1,94,255,104,1,88,1,98,255,141,1,88,1,101,255,104,1,88, +1,105,255,141,1,88,1,111,255,141,1,88,1,114,255,158,1,88,1,119,255,104,1, +88,1,120,255,180,1,88,1,122,255,70,1,88,1,128,255,104,1,88,1,130,255,180, +1,88,1,131,255,104,1,88,1,133,255,104,1,88,1,136,255,70,1,88,1,140,255,70, +1,88,1,143,255,70,1,88,1,147,0,98,1,88,1,149,255,70,1,89,1,110,255,209,1, +89,1,116,255,209,1,91,0,3,255,143,1,91,1,98,255,213,1,91,1,105,255,213,1, +91,1,109,255,104,1,91,1,110,255,104,1,91,1,111,255,197,1,91,1,116,255,104, +1,91,1,124,255,219,1,91,1,134,255,219,1,91,1,144,255,219,1,91,2,3,255,104, +1,93,0,15,255,31,1,93,0,17,255,31,1,93,1,90,0,164,1,93,1,91,255,68,1,93,1, +94,255,68,1,93,1,101,255,68,1,93,1,130,255,168,1,93,1,147,0,88,1,94,0,3,255, +143,1,94,1,98,255,213,1,94,1,105,255,213,1,94,1,109,255,137,1,94,1,110,255, +104,1,94,1,116,255,104,1,98,1,91,255,219,1,98,1,94,255,219,1,98,1,101,255, +219,1,98,1,110,255,190,1,98,1,116,255,190,1,100,1,98,255,193,1,100,1,105, +255,193,1,100,1,111,255,143,1,100,1,117,255,231,1,100,1,122,255,231,1,100, +1,125,255,231,1,100,1,127,255,231,1,100,1,129,255,231,1,100,1,135,255,231, +1,100,1,136,255,231,1,100,1,140,255,231,1,100,1,143,255,231,1,100,1,146,255, +231,1,100,1,149,255,231,1,100,1,151,255,231,1,101,0,3,255,143,1,101,1,98, +255,213,1,101,1,105,255,213,1,101,1,109,255,104,1,101,1,110,255,104,1,101, +1,116,255,104,1,105,1,91,255,219,1,105,1,94,255,213,1,105,1,101,255,219,1, +105,1,110,255,190,1,105,1,116,255,190,1,107,0,3,255,219,1,107,0,15,254,250, +1,107,0,17,254,250,1,107,1,91,255,104,1,107,1,94,255,104,1,107,1,101,255, +104,1,108,1,137,255,158,1,108,1,141,255,158,1,109,0,3,255,219,1,109,0,15, +255,31,1,109,0,17,255,31,1,109,0,29,255,31,1,109,0,30,255,31,1,109,1,90,0, +188,1,109,1,91,255,104,1,109,1,94,255,104,1,109,1,98,255,219,1,109,1,101, +255,104,1,109,1,105,255,219,1,109,1,111,255,219,1,109,1,114,255,219,1,109, +1,117,255,31,1,109,1,118,255,31,1,109,1,121,255,78,1,109,1,122,255,31,1,109, +1,124,255,78,1,109,1,126,255,31,1,109,1,128,255,106,1,109,1,130,255,180,1, +109,1,133,255,106,1,109,1,134,255,143,1,109,1,136,255,31,1,109,1,140,255, +31,1,109,1,142,255,80,1,109,1,143,255,31,1,109,1,144,255,143,1,109,1,145, +255,106,1,109,1,147,0,188,1,109,1,148,255,78,1,109,1,149,255,31,1,109,1,150, +255,78,1,110,0,3,255,219,1,110,0,15,254,250,1,110,0,16,255,70,1,110,0,17, +254,250,1,110,0,29,255,143,1,110,0,30,255,143,1,110,1,90,0,188,1,110,1,91, +255,104,1,110,1,94,255,104,1,110,1,98,255,141,1,110,1,101,255,104,1,110,1, +105,255,141,1,110,1,111,255,141,1,110,1,114,255,158,1,110,1,119,255,104,1, +110,1,120,255,180,1,110,1,122,255,70,1,110,1,124,255,158,1,110,1,128,255, +104,1,110,1,130,255,180,1,110,1,131,255,104,1,110,1,133,255,104,1,110,1,136, +255,70,1,110,1,140,255,70,1,110,1,143,255,70,1,110,1,147,0,121,1,110,1,149, +255,70,1,111,1,91,255,197,1,111,1,110,255,190,1,111,1,116,255,190,1,113,1, +117,255,178,1,113,1,122,255,178,1,113,1,125,255,178,1,113,1,129,255,217,1, +113,1,136,255,178,1,113,1,140,255,178,1,113,1,143,255,178,1,113,1,146,255, +178,1,113,1,149,255,178,1,113,1,151,255,178,1,114,1,110,255,209,1,114,1,116, +255,209,1,116,0,3,255,219,1,116,1,90,0,170,1,116,1,91,255,104,1,116,1,94, +255,104,1,116,1,98,255,141,1,116,1,101,255,104,1,116,1,105,255,141,1,116, +1,111,255,141,1,116,1,114,255,158,1,116,1,119,255,104,1,116,1,120,255,180, +1,116,1,122,255,70,1,116,1,128,255,104,1,116,1,130,255,180,1,116,1,131,255, +104,1,116,1,133,255,104,1,116,1,136,255,70,1,116,1,140,255,70,1,116,1,143, +255,70,1,116,1,147,0,98,1,116,1,149,255,70,1,125,1,132,255,217,1,125,1,137, +255,227,1,125,1,141,255,227,1,125,1,144,255,201,1,127,1,117,255,119,1,127, +1,119,255,219,1,127,1,122,255,119,1,127,1,124,255,170,1,127,1,125,255,180, +1,127,1,128,255,219,1,127,1,129,255,158,1,127,1,130,255,219,1,127,1,131,255, +219,1,127,1,134,255,170,1,127,1,136,255,119,1,127,1,137,255,170,1,127,1,140, +255,119,1,127,1,141,255,170,1,127,1,143,255,119,1,127,1,146,255,119,1,127, +1,149,255,119,1,127,1,151,255,119,1,129,1,132,255,217,1,131,1,117,255,231, +1,131,1,122,255,231,1,131,1,125,255,231,1,131,1,127,255,231,1,131,1,129,255, +231,1,131,1,135,255,231,1,131,1,136,255,231,1,131,1,139,255,231,1,131,1,140, +255,231,1,131,1,143,255,231,1,131,1,146,255,231,1,131,1,149,255,231,1,131, +1,151,255,231,1,132,1,117,255,225,1,132,1,122,255,225,1,132,1,125,255,225, +1,132,1,135,255,225,1,132,1,136,255,225,1,132,1,139,255,209,1,132,1,140,255, +225,1,132,1,142,255,207,1,132,1,143,255,219,1,132,1,146,255,225,1,132,1,149, +255,225,1,132,1,150,255,207,1,132,1,151,255,225,1,135,1,117,255,201,1,135, +1,122,255,201,1,135,1,125,255,201,1,135,1,127,255,201,1,135,1,135,255,201, +1,135,1,136,255,201,1,135,1,139,255,201,1,135,1,140,255,201,1,135,1,143,255, +201,1,135,1,149,255,201,1,136,1,132,255,217,1,136,1,137,255,227,1,136,1,141, +255,227,1,136,1,144,255,201,1,137,1,117,255,227,1,137,1,122,255,227,1,137, +1,127,255,227,1,137,1,136,255,227,1,137,1,139,255,227,1,137,1,140,255,227, +1,137,1,143,255,227,1,137,1,146,255,227,1,137,1,151,255,227,1,138,1,132,255, +217,1,138,1,137,255,227,1,138,1,141,255,227,1,141,1,117,255,227,1,141,1,122, +255,227,1,141,1,125,255,227,1,141,1,127,255,227,1,141,1,136,255,227,1,141, +1,139,255,227,1,141,1,140,255,227,1,141,1,143,255,227,1,141,1,146,255,227, +1,141,1,151,255,227,1,143,1,132,255,217,1,143,1,137,255,227,1,143,1,141,255, +227,1,143,1,144,255,201,1,144,1,117,255,201,1,144,1,122,255,201,1,144,1,125, +255,201,1,144,1,127,255,201,1,144,1,136,255,201,1,144,1,139,255,201,1,144, +1,140,255,201,1,144,1,143,255,201,1,144,1,146,255,201,1,144,1,149,255,201, +1,144,1,151,255,201,1,146,1,132,255,217,1,146,1,137,255,227,1,146,1,141,255, +227,1,146,1,144,255,201,1,149,1,132,255,217,1,149,1,137,255,227,1,149,1,141, +255,227,1,149,1,144,255,201,1,151,1,132,255,217,1,151,1,137,255,227,1,151, +1,141,255,227,1,151,1,144,255,201,1,154,0,15,255,6,1,154,0,17,255,6,1,154, +0,108,255,119,1,154,0,123,255,119,1,154,1,255,255,211,1,160,2,3,255,96,1, +161,2,3,255,119,1,166,1,170,0,68,1,166,1,173,255,233,1,166,1,177,0,45,1,166, +1,180,255,211,1,166,1,181,255,233,1,166,1,183,255,211,1,166,1,184,255,96, +1,166,1,185,255,166,1,166,1,186,255,188,1,166,1,189,255,96,1,166,1,195,255, +211,1,166,1,198,0,23,1,166,1,216,255,211,1,166,1,217,255,233,1,166,1,218, +0,23,1,166,1,227,0,45,1,166,2,3,255,141,1,167,1,166,255,211,1,167,1,173,255, +233,1,167,1,180,255,233,1,167,1,183,255,233,1,167,1,184,255,164,1,167,1,185, +255,209,1,167,1,186,255,233,1,167,1,187,255,211,1,167,1,189,255,164,1,167, +1,192,255,188,1,167,1,195,255,233,1,167,1,197,255,233,1,167,1,209,255,233, +1,167,1,217,255,211,1,168,1,166,255,188,1,168,1,170,255,211,1,168,1,172,255, +211,1,168,1,173,255,188,1,168,1,177,255,233,1,168,1,180,255,188,1,168,1,183, +255,188,1,168,1,184,255,119,1,168,1,185,255,188,1,168,1,186,255,188,1,168, +1,187,255,166,1,168,1,189,255,164,1,168,1,192,255,141,1,168,1,197,255,188, +1,168,1,202,255,233,1,168,1,210,255,233,1,168,1,216,255,188,1,168,1,217,255, +233,1,168,1,219,255,233,1,168,1,221,255,188,1,168,1,229,255,233,1,169,0,15, +255,6,1,169,0,17,255,6,1,169,0,108,255,119,1,169,0,123,255,119,1,169,1,166, +255,119,1,169,1,170,255,119,1,169,1,173,255,211,1,169,1,177,255,141,1,169, +1,178,255,209,1,169,1,180,255,141,1,169,1,183,255,164,1,169,1,197,255,188, +1,169,1,198,255,141,1,169,1,200,255,141,1,169,1,202,255,119,1,169,1,203,255, +119,1,169,1,206,255,141,1,169,1,209,255,141,1,169,1,210,255,141,1,169,1,211, +255,141,1,169,1,212,255,119,1,169,1,214,255,141,1,169,1,217,255,119,1,169, +1,225,255,141,1,169,1,226,255,141,1,169,1,228,255,141,1,169,1,229,255,119, +1,169,1,255,255,211,1,170,1,185,0,23,1,170,1,186,255,211,1,170,1,189,255, +186,1,170,1,205,0,68,1,170,1,212,0,23,1,170,1,217,0,45,1,171,1,173,255,211, +1,171,1,215,255,233,1,172,1,173,255,233,1,172,1,180,255,211,1,172,1,183,255, +233,1,172,1,184,0,23,1,172,1,185,0,45,1,172,1,192,0,45,1,172,1,198,0,23,1, +172,1,203,255,231,1,172,1,212,255,233,1,172,1,217,255,233,1,173,1,177,255, +233,1,173,1,180,255,233,1,173,1,183,255,233,1,173,1,184,255,211,1,173,1,185, +255,233,1,173,1,186,255,233,1,173,1,189,255,211,1,173,1,197,255,233,1,176, +1,173,255,233,1,176,1,180,255,233,1,176,1,183,255,233,1,176,1,185,0,23,1, +176,1,186,255,186,1,177,1,186,255,233,1,177,1,199,0,23,1,177,1,217,0,23,1, +178,1,186,255,233,1,178,1,189,255,233,1,178,1,198,0,23,1,178,1,203,0,23,1, +178,1,212,0,23,1,178,1,215,0,23,1,178,1,217,0,23,1,178,1,221,255,233,1,178, +1,227,0,23,1,180,1,166,255,211,1,180,1,170,255,211,1,180,1,172,255,211,1, +180,1,177,255,233,1,180,1,185,255,211,1,180,1,187,255,164,1,180,1,189,255, +211,1,180,1,197,255,211,1,180,1,202,255,211,1,180,1,209,255,233,1,180,1,219, +255,233,1,182,0,15,254,125,1,182,0,17,254,125,1,182,0,29,255,211,1,182,0, +30,255,211,1,182,0,123,255,141,1,182,1,166,255,119,1,182,1,170,255,119,1, +182,1,172,255,233,1,182,1,173,255,211,1,182,1,177,255,141,1,182,1,178,255, +233,1,182,1,180,255,211,1,182,1,183,255,233,1,182,1,184,255,164,1,182,1,185, +255,211,1,182,1,186,255,233,1,182,1,187,255,164,1,182,1,197,255,211,1,182, +1,198,255,188,1,182,1,202,255,96,1,182,1,203,255,166,1,182,1,212,255,166, +1,182,1,227,255,211,1,182,1,229,255,188,1,183,1,166,255,211,1,183,1,170,255, +211,1,183,1,173,255,233,1,183,1,177,255,188,1,183,1,178,255,233,1,183,1,180, +255,211,1,183,1,184,255,188,1,183,1,185,255,188,1,183,1,187,255,141,1,183, +1,189,255,188,1,183,1,192,255,186,1,183,1,195,255,233,1,183,1,198,0,23,1, +183,1,204,0,45,1,183,1,221,255,233,1,184,0,15,255,29,1,184,0,17,255,29,1, +184,0,108,255,166,1,184,0,123,255,166,1,184,1,166,255,188,1,184,1,170,255, +188,1,184,1,172,0,23,1,184,1,173,255,233,1,184,1,177,255,211,1,184,1,180, +255,164,1,184,1,186,255,188,1,184,1,197,255,211,1,184,1,198,255,164,1,184, +1,200,255,166,1,184,1,203,255,141,1,184,1,206,255,166,1,184,1,208,255,166, +1,184,1,209,255,164,1,184,1,210,255,166,1,184,1,212,255,96,1,184,1,213,255, +166,1,184,1,214,255,141,1,184,1,215,255,141,1,184,1,217,255,141,1,184,1,219, +255,166,1,184,1,223,255,166,1,184,1,225,255,166,1,184,1,226,255,166,1,184, +1,228,255,166,1,184,1,229,255,141,1,184,1,255,255,211,1,185,0,15,254,240, +1,185,0,17,254,240,1,185,0,29,255,211,1,185,0,30,255,211,1,185,0,108,255, +166,1,185,0,123,255,164,1,185,1,166,255,119,1,185,1,170,255,164,1,185,1,173, +255,211,1,185,1,177,255,188,1,185,1,180,255,188,1,185,1,186,255,188,1,185, +1,195,255,211,1,185,1,197,255,211,1,185,1,199,255,211,1,185,1,200,255,141, +1,185,1,201,255,164,1,185,1,202,255,96,1,185,1,203,255,119,1,185,1,204,255, +188,1,185,1,205,255,141,1,185,1,206,255,164,1,185,1,207,255,188,1,185,1,208, +255,164,1,185,1,209,255,119,1,185,1,210,255,164,1,185,1,211,255,164,1,185, +1,212,255,119,1,185,1,213,255,164,1,185,1,214,255,164,1,185,1,215,255,119, +1,185,1,219,255,164,1,185,1,220,255,164,1,185,1,222,255,164,1,185,1,223,255, +164,1,185,1,228,255,164,1,185,1,229,255,119,1,185,1,255,255,233,1,186,1,166, +255,211,1,186,1,170,255,188,1,186,1,177,255,188,1,186,1,184,255,141,1,186, +1,185,255,164,1,186,1,189,255,211,1,186,1,197,255,186,1,186,1,209,255,188, +1,187,1,173,255,211,1,187,1,180,255,188,1,187,1,183,255,188,1,187,1,186,255, +188,1,187,1,195,255,186,1,187,1,212,255,233,1,187,1,217,255,211,1,188,1,180, +255,211,1,188,1,198,0,45,1,191,1,198,0,23,1,191,1,217,0,45,1,192,1,197,255, +188,1,192,2,3,255,119,1,194,1,166,255,211,1,194,1,170,255,211,1,194,1,172, +255,188,1,194,1,173,255,233,1,194,1,177,255,186,1,194,1,178,255,211,1,194, +1,180,255,211,1,194,1,183,255,211,1,194,1,184,255,51,1,194,1,187,255,164, +1,194,1,189,255,96,1,194,1,195,255,233,1,194,1,197,255,164,1,194,2,3,255, +96,1,195,1,170,255,188,1,195,1,172,255,231,1,195,1,173,255,233,1,195,1,177, +255,188,1,195,1,187,255,186,1,195,1,197,255,211,1,195,1,202,255,188,1,195, +1,204,0,23,1,195,1,209,255,188,1,195,1,210,255,233,1,195,1,229,255,233,1, +196,1,166,255,188,1,196,1,170,255,166,1,196,1,172,255,211,1,196,1,177,255, +164,1,196,1,180,255,233,1,196,1,183,255,233,1,196,1,184,255,141,1,196,1,187, +255,164,1,196,1,189,255,188,1,196,1,202,255,164,1,196,1,209,255,164,1,196, +1,210,255,233,1,198,1,205,255,233,1,198,1,216,255,211,1,198,1,217,255,233, +1,198,1,221,255,211,1,199,1,198,255,209,1,199,1,202,255,164,1,199,1,203,255, +233,1,199,1,204,255,233,1,199,1,205,255,211,1,199,1,209,255,164,1,199,1,210, +255,211,1,199,1,215,255,233,1,199,1,217,255,211,1,199,1,218,255,233,1,199, +1,219,255,188,1,199,1,221,255,188,1,199,1,224,255,188,1,199,1,227,255,233, +1,199,1,229,255,211,1,200,1,198,255,233,1,200,1,199,255,233,1,200,1,202,255, +233,1,200,1,203,255,233,1,200,1,204,255,233,1,200,1,205,255,233,1,200,1,209, +255,209,1,200,1,210,255,233,1,200,1,212,255,233,1,200,1,215,255,233,1,200, +1,216,255,211,1,200,1,217,255,211,1,200,1,218,255,233,1,200,1,221,255,164, +1,200,1,224,255,188,1,200,1,229,255,233,1,201,0,15,255,6,1,201,0,17,255,6, +1,201,1,198,255,211,1,201,1,202,255,164,1,201,1,203,255,211,1,201,1,205,255, +233,1,201,1,209,255,211,1,201,1,212,255,211,1,201,1,215,255,211,1,201,1,229, +255,233,1,202,1,224,255,211,1,202,1,227,0,23,1,203,1,199,255,233,1,203,1, +202,255,211,1,203,1,204,255,233,1,203,1,205,255,211,1,203,1,209,255,188,1, +203,1,216,255,188,1,203,1,217,255,233,1,203,1,219,255,211,1,203,1,221,255, +188,1,204,1,199,0,23,1,204,1,217,0,23,1,204,1,221,255,233,1,204,1,224,0,45, +1,205,1,199,255,233,1,205,1,202,255,211,1,205,1,203,255,233,1,205,1,205,255, +233,1,205,1,209,255,233,1,205,1,212,255,233,1,205,1,215,255,233,1,205,1,217, +255,233,1,205,1,218,255,233,1,205,1,221,255,188,1,205,1,224,255,211,1,208, +1,198,0,45,1,208,1,199,0,45,1,208,1,203,0,23,1,208,1,205,0,23,1,208,1,209, +0,23,1,208,1,212,0,23,1,208,1,215,0,23,1,208,1,216,0,23,1,208,1,217,0,23, +1,208,1,227,0,23,1,209,1,212,0,23,1,209,1,221,255,211,1,210,1,199,255,233, +1,210,1,205,255,233,1,210,1,217,0,23,1,212,1,202,255,211,1,212,1,204,255, +233,1,212,1,205,255,233,1,212,1,209,255,211,1,212,1,216,255,211,1,212,1,217, +255,233,1,212,1,219,255,233,1,212,1,221,255,211,1,214,1,202,255,209,1,214, +1,205,255,233,1,214,1,209,255,186,1,214,1,216,255,211,1,214,1,217,255,233, +1,214,1,219,255,233,1,214,1,221,255,211,1,214,1,229,255,233,1,215,1,204,0, +23,1,215,1,212,0,23,1,215,1,221,255,233,1,215,1,227,0,23,1,216,0,15,255,29, +1,216,0,17,255,29,1,216,1,198,255,233,1,216,1,202,255,188,1,216,1,203,255, +233,1,216,1,204,0,68,1,216,1,209,255,211,1,216,1,212,255,233,1,216,1,215, +255,233,1,216,1,217,0,23,1,217,0,15,255,51,1,217,0,17,255,51,1,217,0,123, +0,23,1,217,1,198,255,233,1,217,1,199,0,23,1,217,1,202,255,188,1,217,1,203, +255,233,1,217,1,204,0,23,1,217,1,209,255,211,1,217,1,210,255,233,1,217,1, +212,255,231,1,217,1,214,255,233,1,217,1,215,255,233,1,217,1,218,255,233,1, +217,1,227,255,233,1,217,1,229,255,233,1,218,1,199,255,233,1,218,1,202,255, +211,1,218,1,209,255,211,1,218,1,216,255,211,1,218,1,217,255,233,1,218,1,221, +255,211,1,218,1,229,255,233,1,219,1,198,255,233,1,219,1,199,255,233,1,219, +1,203,255,233,1,219,1,205,255,233,1,219,1,212,255,233,1,219,1,215,255,233, +1,219,1,216,255,233,1,219,1,218,255,233,1,219,1,221,255,211,1,220,1,203,255, +233,1,220,1,205,255,233,1,220,1,212,255,233,1,220,1,215,255,233,1,223,1,203, +255,233,1,223,1,212,255,233,1,223,1,217,0,23,1,226,1,216,255,96,1,226,1,221, +255,119,1,227,1,202,255,211,1,227,1,203,0,23,1,227,1,205,255,233,1,227,1, +209,255,211,1,227,1,212,0,23,1,227,1,216,255,211,1,227,1,219,255,233,1,227, +1,229,255,233,1,228,1,202,255,211,1,228,1,204,255,233,1,228,1,209,255,211, +1,228,1,210,255,233,1,228,1,216,255,211,1,228,1,219,255,233,1,228,1,221,255, +211,1,242,0,15,255,51,1,242,0,17,255,51,1,244,0,15,255,6,1,244,0,17,255,6, +1,244,0,29,255,211,1,244,0,30,255,211,1,244,0,108,255,96,1,244,0,123,255, +96,1,244,1,255,255,211,2,2,2,2,255,219,2,3,0,3,255,180,2,3,0,86,255,219,2, +3,2,3,255,219,2,8,1,153,255,96,2,8,1,162,255,96,2,8,1,184,255,96,2,8,1,189, +255,188,2,8,1,192,255,188,0,0,0,0,0,28,1,86,0,1,0,0,0,0,0,0,0,64,0,130,0, +1,0,0,0,0,0,1,0,15,0,227,0,1,0,0,0,0,0,2,0,7,1,3,0,1,0,0,0,0,0,3,0,26,1,65, +0,1,0,0,0,0,0,4,0,15,1,124,0,1,0,0,0,0,0,5,0,12,1,166,0,1,0,0,0,0,0,6,0,14, +1,209,0,1,0,0,0,0,0,7,0,122,2,214,0,1,0,0,0,0,0,8,0,20,3,123,0,1,0,0,0,0, +0,9,0,14,3,174,0,1,0,0,0,0,0,11,0,28,3,247,0,1,0,0,0,0,0,12,0,46,4,114,0, +1,0,0,0,0,0,13,0,127,5,161,0,1,0,0,0,0,0,14,0,43,6,121,0,3,0,1,4,9,0,0,0, +128,0,0,0,3,0,1,4,9,0,1,0,30,0,195,0,3,0,1,4,9,0,2,0,14,0,243,0,3,0,1,4,9, +0,3,0,52,1,11,0,3,0,1,4,9,0,4,0,30,1,92,0,3,0,1,4,9,0,5,0,24,1,140,0,3,0, +1,4,9,0,6,0,28,1,179,0,3,0,1,4,9,0,7,0,244,1,224,0,3,0,1,4,9,0,8,0,40,3,81, +0,3,0,1,4,9,0,9,0,28,3,144,0,3,0,1,4,9,0,11,0,56,3,189,0,3,0,1,4,9,0,12,0, +92,4,20,0,3,0,1,4,9,0,13,0,254,4,161,0,3,0,1,4,9,0,14,0,86,6,33,0,68,0,105, +0,103,0,105,0,116,0,105,0,122,0,101,0,100,0,32,0,100,0,97,0,116,0,97,0,32, +0,169,0,32,0,50,0,48,0,48,0,55,0,32,0,65,0,115,0,99,0,101,0,110,0,100,0,101, +0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110, +0,46,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32, +0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,0,68,105,103,105,116, +105,122,101,100,32,100,97,116,97,32,169,32,50,48,48,55,32,65,115,99,101,110, +100,101,114,32,67,111,114,112,111,114,97,116,105,111,110,46,32,65,108,108, +32,114,105,103,104,116,115,32,114,101,115,101,114,118,101,100,46,0,0,76,0, +105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0, +115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115,0,0,82,0,101, +0,103,0,117,0,108,0,97,0,114,0,0,82,101,103,117,108,97,114,0,0,65,0,115,0, +99,0,101,0,110,0,100,0,101,0,114,0,32,0,45,0,32,0,76,0,105,0,98,0,101,0,114, +0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0,115,0,0,65,115,99,101, +110,100,101,114,32,45,32,76,105,98,101,114,97,116,105,111,110,32,83,97,110, +115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83, +0,97,0,110,0,115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115, +0,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,48,0,50,0,0,86, +101,114,115,105,111,110,32,49,46,48,50,0,0,76,0,105,0,98,0,101,0,114,0,97, +0,116,0,105,0,111,0,110,0,83,0,97,0,110,0,115,0,0,76,105,98,101,114,97,116, +105,111,110,83,97,110,115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105, +0,111,0,110,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101, +0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,32,0,82,0,101,0,100,0,32,0,72,0, +97,0,116,0,44,0,32,0,73,0,110,0,99,0,46,0,32,0,114,0,101,0,103,0,105,0,115, +0,116,0,101,0,114,0,101,0,100,0,32,0,105,0,110,0,32,0,85,0,46,0,83,0,46,0, +32,0,80,0,97,0,116,0,101,0,110,0,116,0,32,0,97,0,110,0,100,0,32,0,84,0,114, +0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,79,0,102,0,102,0,105,0,99, +0,101,0,32,0,97,0,110,0,100,0,32,0,99,0,101,0,114,0,116,0,97,0,105,0,110, +0,32,0,111,0,116,0,104,0,101,0,114,0,32,0,106,0,117,0,114,0,105,0,115,0,100, +0,105,0,99,0,116,0,105,0,111,0,110,0,115,0,46,0,0,76,105,98,101,114,97,116, +105,111,110,32,105,115,32,97,32,116,114,97,100,101,109,97,114,107,32,111, +102,32,82,101,100,32,72,97,116,44,32,73,110,99,46,32,114,101,103,105,115, +116,101,114,101,100,32,105,110,32,85,46,83,46,32,80,97,116,101,110,116,32, +97,110,100,32,84,114,97,100,101,109,97,114,107,32,79,102,102,105,99,101,32, +97,110,100,32,99,101,114,116,97,105,110,32,111,116,104,101,114,32,106,117, +114,105,115,100,105,99,116,105,111,110,115,46,0,0,65,0,115,0,99,0,101,0,110, +0,100,0,101,0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105, +0,111,0,110,0,0,65,115,99,101,110,100,101,114,32,67,111,114,112,111,114,97, +116,105,111,110,0,0,83,0,116,0,101,0,118,0,101,0,32,0,77,0,97,0,116,0,116, +0,101,0,115,0,111,0,110,0,0,83,116,101,118,101,32,77,97,116,116,101,115,111, +110,0,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97, +0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99, +0,111,0,109,0,47,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101, +110,100,101,114,99,111,114,112,46,99,111,109,47,0,0,104,0,116,0,116,0,112, +0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,110,0,100,0, +101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,116,0,121,0, +112,0,101,0,100,0,101,0,115,0,105,0,103,0,110,0,101,0,114,0,115,0,46,0,104, +0,116,0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101, +110,100,101,114,99,111,114,112,46,99,111,109,47,116,121,112,101,100,101,115, +105,103,110,101,114,115,46,104,116,109,108,0,0,85,0,115,0,101,0,32,0,111, +0,102,0,32,0,116,0,104,0,105,0,115,0,32,0,76,0,105,0,98,0,101,0,114,0,97, +0,116,0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102, +0,116,0,119,0,97,0,114,0,101,0,32,0,105,0,115,0,32,0,115,0,117,0,98,0,106, +0,101,0,99,0,116,0,32,0,116,0,111,0,32,0,116,0,104,0,101,0,32,0,108,0,105, +0,99,0,101,0,110,0,115,0,101,0,32,0,97,0,103,0,114,0,101,0,101,0,109,0,101, +0,110,0,116,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,119,0,104,0,105,0,99, +0,104,0,32,0,121,0,111,0,117,0,32,0,97,0,99,0,99,0,101,0,112,0,116,0,101, +0,100,0,32,0,116,0,104,0,101,0,32,0,76,0,105,0,98,0,101,0,114,0,97,0,116, +0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102,0,116, +0,119,0,97,0,114,0,101,0,46,0,0,85,115,101,32,111,102,32,116,104,105,115, +32,76,105,98,101,114,97,116,105,111,110,32,102,111,110,116,32,115,111,102, +116,119,97,114,101,32,105,115,32,115,117,98,106,101,99,116,32,116,111,32, +116,104,101,32,108,105,99,101,110,115,101,32,97,103,114,101,101,109,101,110, +116,32,117,110,100,101,114,32,119,104,105,99,104,32,121,111,117,32,97,99, +99,101,112,116,101,100,32,116,104,101,32,76,105,98,101,114,97,116,105,111, +110,32,102,111,110,116,32,115,111,102,116,119,97,114,101,46,0,0,104,0,116, +0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0, +110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0, +108,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,46,0,104,0,116, +0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,110, +100,101,114,99,111,114,112,46,99,111,109,47,108,105,98,101,114,97,116,105, +111,110,46,104,116,109,108,0,0,0,2,0,0,0,0,0,0,255,39,0,150,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,2,156,0,0,0,1,0,2,1,2,0,4,0,5,0,6,0,7,0,8,0,9,0, +10,0,11,0,12,0,13,0,14,0,15,1,3,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0, +25,0,26,0,27,0,28,0,29,1,4,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0, +40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54, +0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69, +0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84, +0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,163,0, +132,0,133,0,189,0,150,0,232,0,134,0,142,0,139,0,157,0,169,0,164,0,138,0,218, +0,131,0,147,1,5,1,6,0,141,1,7,0,136,1,8,0,222,1,9,0,158,0,170,0,245,0,244, +0,246,0,162,0,173,0,201,0,199,0,174,0,98,0,99,0,144,0,100,0,203,0,101,0,200, +0,202,0,207,0,204,0,205,0,206,0,233,0,102,0,211,0,208,0,209,0,175,0,103,0, +240,0,145,0,214,0,212,0,213,0,104,0,235,0,237,0,137,0,106,0,105,0,107,0,109, +0,108,0,110,0,160,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0, +234,0,120,0,122,0,121,0,123,0,125,0,124,0,184,0,161,0,127,0,126,0,128,0,129, +0,236,0,238,0,186,1,10,1,11,1,12,1,13,1,14,1,15,0,253,0,254,1,16,1,17,1,18, +1,19,0,255,1,0,1,20,1,21,1,22,1,1,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30, +1,31,1,32,1,33,1,34,0,248,0,249,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1, +43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,0,250,0,215,1,51,1,52,1,53,1,54,1,55, +1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,0,226,0,227,1,66,1,67,1, +68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,0,176,0,177, +1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,0,251,0,252,0,228,0,229, +1,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104, +1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,0,187,1,113,1,114,1,115,1, +116,0,230,0,231,1,117,0,166,1,118,1,119,1,120,1,121,1,122,1,123,0,216,0,225, +1,124,0,219,0,220,0,221,0,224,0,217,0,223,1,125,1,126,1,127,1,128,1,129,1, +130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,1,138,0,168,1,139,1,140,1,141, +1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151,1,152,1,153,1, +154,1,155,1,156,1,157,0,159,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165, +1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,0,151,1,176,1, +177,1,178,0,155,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188, +1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1, +201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213, +1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1, +226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238, +1,239,1,240,1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1, +251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10, +2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25, +2,26,2,27,2,28,2,29,2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,0,178,0, +179,2,39,2,40,0,182,0,183,0,196,2,41,0,180,0,181,0,197,0,130,0,194,0,135, +0,171,0,198,2,42,2,43,0,190,0,191,2,44,2,45,2,46,2,47,0,247,2,48,2,49,2,50, +2,51,2,52,2,53,0,140,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2, +64,2,65,2,66,0,152,2,67,0,154,0,153,0,239,0,165,0,146,2,68,2,69,0,156,0,167, +0,143,2,70,0,148,0,149,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80, +2,81,2,82,2,83,2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95, +2,96,2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108, +2,109,2,110,2,111,2,112,2,113,2,114,2,115,2,116,2,117,2,118,2,119,2,120,2, +121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,0,185,2,132, +2,133,2,134,2,135,2,136,2,137,2,138,2,139,2,140,2,141,2,142,2,143,2,144,2, +145,2,146,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,2,155,2,156,2,157, +2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,7,117,110,105, +48,48,65,48,7,117,110,105,48,48,65,68,7,117,110,105,48,51,55,69,7,117,110, +105,48,48,66,50,7,117,110,105,48,48,66,51,7,117,110,105,48,48,66,53,7,117, +110,105,50,50,49,57,7,117,110,105,48,48,66,57,7,65,109,97,99,114,111,110, +7,97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97,98,114,101,118,101, +7,65,111,103,111,110,101,107,7,97,111,103,111,110,101,107,11,67,99,105,114, +99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,10, +67,100,111,116,97,99,99,101,110,116,10,99,100,111,116,97,99,99,101,110,116, +6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,68,99,114,111,97,116,7,69, +109,97,99,114,111,110,7,101,109,97,99,114,111,110,6,69,98,114,101,118,101, +6,101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110,116,10,101,100, +111,116,97,99,99,101,110,116,7,69,111,103,111,110,101,107,7,101,111,103,111, +110,101,107,6,69,99,97,114,111,110,6,101,99,97,114,111,110,11,71,99,105,114, +99,117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108,101,120,10, +71,100,111,116,97,99,99,101,110,116,10,103,100,111,116,97,99,99,101,110,116, +12,71,99,111,109,109,97,97,99,99,101,110,116,12,103,99,111,109,109,97,97, +99,99,101,110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104,99,105, +114,99,117,109,102,108,101,120,4,72,98,97,114,4,104,98,97,114,6,73,116,105, +108,100,101,6,105,116,105,108,100,101,7,73,109,97,99,114,111,110,7,105,109, +97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101,118,101,7,73,111, +103,111,110,101,107,7,105,111,103,111,110,101,107,2,73,74,2,105,106,11,74, +99,105,114,99,117,109,102,108,101,120,11,106,99,105,114,99,117,109,102,108, +101,120,12,75,99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109,109, +97,97,99,99,101,110,116,12,107,103,114,101,101,110,108,97,110,100,105,99, +6,76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97, +99,99,101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97, +114,111,110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,6, +78,97,99,117,116,101,6,110,97,99,117,116,101,12,78,99,111,109,109,97,97,99, +99,101,110,116,12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99,97,114, +111,110,6,110,99,97,114,111,110,11,110,97,112,111,115,116,114,111,112,104, +101,3,69,110,103,3,101,110,103,7,79,109,97,99,114,111,110,7,111,109,97,99, +114,111,110,6,79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104,117, +110,103,97,114,117,109,108,97,117,116,13,111,104,117,110,103,97,114,117,109, +108,97,117,116,6,82,97,99,117,116,101,6,114,97,99,117,116,101,12,82,99,111, +109,109,97,97,99,99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110, +116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,83,97,99,117,116,101, +6,115,97,99,117,116,101,11,83,99,105,114,99,117,109,102,108,101,120,11,115, +99,105,114,99,117,109,102,108,101,120,12,84,99,111,109,109,97,97,99,99,101, +110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,6,84,99,97,114,111, +110,6,116,99,97,114,111,110,4,84,98,97,114,4,116,98,97,114,6,85,116,105,108, +100,101,6,117,116,105,108,100,101,7,85,109,97,99,114,111,110,7,117,109,97, +99,114,111,110,6,85,98,114,101,118,101,6,117,98,114,101,118,101,5,85,114, +105,110,103,5,117,114,105,110,103,13,85,104,117,110,103,97,114,117,109,108, +97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,85,111, +103,111,110,101,107,7,117,111,103,111,110,101,107,11,87,99,105,114,99,117, +109,102,108,101,120,11,119,99,105,114,99,117,109,102,108,101,120,11,89,99, +105,114,99,117,109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101, +120,6,90,97,99,117,116,101,6,122,97,99,117,116,101,10,90,100,111,116,97,99, +99,101,110,116,10,122,100,111,116,97,99,99,101,110,116,5,108,111,110,103, +115,10,65,114,105,110,103,97,99,117,116,101,10,97,114,105,110,103,97,99,117, +116,101,7,65,69,97,99,117,116,101,7,97,101,97,99,117,116,101,11,79,115,108, +97,115,104,97,99,117,116,101,11,111,115,108,97,115,104,97,99,117,116,101, +7,117,110,105,48,50,67,57,5,116,111,110,111,115,13,100,105,101,114,101,115, +105,115,116,111,110,111,115,10,65,108,112,104,97,116,111,110,111,115,9,97, +110,111,116,101,108,101,105,97,12,69,112,115,105,108,111,110,116,111,110, +111,115,8,69,116,97,116,111,110,111,115,9,73,111,116,97,116,111,110,111,115, +12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111, +110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,17,105,111, +116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,5,65,108,112,104, +97,4,66,101,116,97,5,71,97,109,109,97,7,69,112,115,105,108,111,110,4,90,101, +116,97,3,69,116,97,5,84,104,101,116,97,4,73,111,116,97,5,75,97,112,112,97, +6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111, +110,2,80,105,3,82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112,115,105, +108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,12,73,111,116,97,100,105, +101,114,101,115,105,115,15,85,112,115,105,108,111,110,100,105,101,114,101, +115,105,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108, +111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,9,105,111,116, +97,116,111,110,111,115,20,117,112,115,105,108,111,110,100,105,101,114,101, +115,105,115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116,97,5,103, +97,109,109,97,5,100,101,108,116,97,7,101,112,115,105,108,111,110,4,122,101, +116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112, +97,6,108,97,109,98,100,97,2,110,117,2,120,105,7,111,109,105,99,114,111,110, +3,114,104,111,6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97,117,7, +117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111, +109,101,103,97,12,105,111,116,97,100,105,101,114,101,115,105,115,15,117,112, +115,105,108,111,110,100,105,101,114,101,115,105,115,12,111,109,105,99,114, +111,110,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111, +115,10,111,109,101,103,97,116,111,110,111,115,9,97,102,105,105,49,48,48,50, +51,9,97,102,105,105,49,48,48,53,49,9,97,102,105,105,49,48,48,53,50,9,97,102, +105,105,49,48,48,53,51,9,97,102,105,105,49,48,48,53,52,9,97,102,105,105,49, +48,48,53,53,9,97,102,105,105,49,48,48,53,54,9,97,102,105,105,49,48,48,53, +55,9,97,102,105,105,49,48,48,53,56,9,97,102,105,105,49,48,48,53,57,9,97,102, +105,105,49,48,48,54,48,9,97,102,105,105,49,48,48,54,49,9,97,102,105,105,49, +48,48,54,50,9,97,102,105,105,49,48,49,52,53,9,97,102,105,105,49,48,48,49, +55,9,97,102,105,105,49,48,48,49,56,9,97,102,105,105,49,48,48,49,57,9,97,102, +105,105,49,48,48,50,48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105,49, +48,48,50,50,9,97,102,105,105,49,48,48,50,52,9,97,102,105,105,49,48,48,50, +53,9,97,102,105,105,49,48,48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102, +105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50,57,9,97,102,105,105,49, +48,48,51,48,9,97,102,105,105,49,48,48,51,49,9,97,102,105,105,49,48,48,51, +50,9,97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48,48,51,52,9,97,102, +105,105,49,48,48,51,53,9,97,102,105,105,49,48,48,51,54,9,97,102,105,105,49, +48,48,51,55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105,49,48,48,51, +57,9,97,102,105,105,49,48,48,52,48,9,97,102,105,105,49,48,48,52,49,9,97,102, +105,105,49,48,48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102,105,105,49, +48,48,52,52,9,97,102,105,105,49,48,48,52,53,9,97,102,105,105,49,48,48,52, +54,9,97,102,105,105,49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9,97,102, +105,105,49,48,48,52,57,9,97,102,105,105,49,48,48,54,53,9,97,102,105,105,49, +48,48,54,54,9,97,102,105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54, +56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105,49,48,48,55,48,9,97,102, +105,105,49,48,48,55,50,9,97,102,105,105,49,48,48,55,51,9,97,102,105,105,49, +48,48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102,105,105,49,48,48,55, +54,9,97,102,105,105,49,48,48,55,55,9,97,102,105,105,49,48,48,55,56,9,97,102, +105,105,49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9,97,102,105,105,49, +48,48,56,49,9,97,102,105,105,49,48,48,56,50,9,97,102,105,105,49,48,48,56, +51,9,97,102,105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56,53,9,97,102, +105,105,49,48,48,56,54,9,97,102,105,105,49,48,48,56,55,9,97,102,105,105,49, +48,48,56,56,9,97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48,48,57, +48,9,97,102,105,105,49,48,48,57,49,9,97,102,105,105,49,48,48,57,50,9,97,102, +105,105,49,48,48,57,51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105,49, +48,48,57,53,9,97,102,105,105,49,48,48,57,54,9,97,102,105,105,49,48,48,57, +55,9,97,102,105,105,49,48,48,55,49,9,97,102,105,105,49,48,48,57,57,9,97,102, +105,105,49,48,49,48,48,9,97,102,105,105,49,48,49,48,49,9,97,102,105,105,49, +48,49,48,50,9,97,102,105,105,49,48,49,48,51,9,97,102,105,105,49,48,49,48, +52,9,97,102,105,105,49,48,49,48,53,9,97,102,105,105,49,48,49,48,54,9,97,102, +105,105,49,48,49,48,55,9,97,102,105,105,49,48,49,48,56,9,97,102,105,105,49, +48,49,48,57,9,97,102,105,105,49,48,49,49,48,9,97,102,105,105,49,48,49,57, +51,9,97,102,105,105,49,48,48,53,48,9,97,102,105,105,49,48,48,57,56,6,87,103, +114,97,118,101,6,119,103,114,97,118,101,6,87,97,99,117,116,101,6,119,97,99, +117,116,101,9,87,100,105,101,114,101,115,105,115,9,119,100,105,101,114,101, +115,105,115,6,89,103,114,97,118,101,6,121,103,114,97,118,101,9,97,102,105, +105,48,48,50,48,56,13,117,110,100,101,114,115,99,111,114,101,100,98,108,13, +113,117,111,116,101,114,101,118,101,114,115,101,100,6,109,105,110,117,116, +101,6,115,101,99,111,110,100,9,101,120,99,108,97,109,100,98,108,7,117,110, +105,50,48,51,69,7,117,110,105,50,50,49,53,7,117,110,105,50,48,55,70,4,108, +105,114,97,6,112,101,115,101,116,97,4,69,117,114,111,9,97,102,105,105,54, +49,50,52,56,9,97,102,105,105,54,49,50,56,57,9,97,102,105,105,54,49,51,53, +50,7,117,110,105,50,49,50,54,9,101,115,116,105,109,97,116,101,100,9,111,110, +101,101,105,103,104,116,104,12,116,104,114,101,101,101,105,103,104,116,104, +115,11,102,105,118,101,101,105,103,104,116,104,115,12,115,101,118,101,110, +101,105,103,104,116,104,115,9,97,114,114,111,119,108,101,102,116,7,97,114, +114,111,119,117,112,10,97,114,114,111,119,114,105,103,104,116,9,97,114,114, +111,119,100,111,119,110,9,97,114,114,111,119,98,111,116,104,9,97,114,114, +111,119,117,112,100,110,12,97,114,114,111,119,117,112,100,110,98,115,101, +7,117,110,105,50,50,48,54,10,111,114,116,104,111,103,111,110,97,108,12,105, +110,116,101,114,115,101,99,116,105,111,110,11,101,113,117,105,118,97,108, +101,110,99,101,5,104,111,117,115,101,13,114,101,118,108,111,103,105,99,97, +108,110,111,116,10,105,110,116,101,103,114,97,108,116,112,10,105,110,116, +101,103,114,97,108,98,116,8,83,70,49,48,48,48,48,48,8,83,70,49,49,48,48,48, +48,8,83,70,48,49,48,48,48,48,8,83,70,48,51,48,48,48,48,8,83,70,48,50,48,48, +48,48,8,83,70,48,52,48,48,48,48,8,83,70,48,56,48,48,48,48,8,83,70,48,57,48, +48,48,48,8,83,70,48,54,48,48,48,48,8,83,70,48,55,48,48,48,48,8,83,70,48,53, +48,48,48,48,8,83,70,52,51,48,48,48,48,8,83,70,50,52,48,48,48,48,8,83,70,53, +49,48,48,48,48,8,83,70,53,50,48,48,48,48,8,83,70,51,57,48,48,48,48,8,83,70, +50,50,48,48,48,48,8,83,70,50,49,48,48,48,48,8,83,70,50,53,48,48,48,48,8,83, +70,53,48,48,48,48,48,8,83,70,52,57,48,48,48,48,8,83,70,51,56,48,48,48,48, +8,83,70,50,56,48,48,48,48,8,83,70,50,55,48,48,48,48,8,83,70,50,54,48,48,48, +48,8,83,70,51,54,48,48,48,48,8,83,70,51,55,48,48,48,48,8,83,70,52,50,48,48, +48,48,8,83,70,49,57,48,48,48,48,8,83,70,50,48,48,48,48,48,8,83,70,50,51,48, +48,48,48,8,83,70,52,55,48,48,48,48,8,83,70,52,56,48,48,48,48,8,83,70,52,49, +48,48,48,48,8,83,70,52,53,48,48,48,48,8,83,70,52,54,48,48,48,48,8,83,70,52, +48,48,48,48,48,8,83,70,53,52,48,48,48,48,8,83,70,53,51,48,48,48,48,8,83,70, +52,52,48,48,48,48,7,117,112,98,108,111,99,107,7,100,110,98,108,111,99,107, +5,98,108,111,99,107,7,108,102,98,108,111,99,107,7,114,116,98,108,111,99,107, +7,108,116,115,104,97,100,101,5,115,104,97,100,101,7,100,107,115,104,97,100, +101,9,102,105,108,108,101,100,98,111,120,6,72,50,50,48,55,51,6,72,49,56,53, +52,51,6,72,49,56,53,53,49,10,102,105,108,108,101,100,114,101,99,116,7,116, +114,105,97,103,117,112,7,116,114,105,97,103,114,116,7,116,114,105,97,103, +100,110,7,116,114,105,97,103,108,102,6,99,105,114,99,108,101,6,72,49,56,53, +51,51,9,105,110,118,98,117,108,108,101,116,9,105,110,118,99,105,114,99,108, +101,10,111,112,101,110,98,117,108,108,101,116,9,115,109,105,108,101,102,97, +99,101,12,105,110,118,115,109,105,108,101,102,97,99,101,3,115,117,110,6,102, +101,109,97,108,101,4,109,97,108,101,5,115,112,97,100,101,4,99,108,117,98, +5,104,101,97,114,116,7,100,105,97,109,111,110,100,11,109,117,115,105,99,97, +108,110,111,116,101,14,109,117,115,105,99,97,108,110,111,116,101,100,98,108, +7,117,110,105,70,66,48,49,7,117,110,105,70,66,48,50,7,117,110,105,70,48,48, +53,6,109,105,100,100,111,116,7,117,110,105,70,48,48,52,7,117,110,105,50,48, +55,52,7,117,110,105,50,48,55,53,7,117,110,105,50,48,55,55,7,117,110,105,50, +48,55,56,8,103,108,121,112,104,53,55,49,8,103,108,121,112,104,53,55,50,8, +103,108,121,112,104,53,55,51,8,103,108,121,112,104,53,55,52,8,103,108,121, +112,104,53,55,53,8,103,108,121,112,104,53,55,54,8,103,108,121,112,104,53, +55,55,8,103,108,121,112,104,53,55,56,8,103,108,121,112,104,53,55,57,8,103, +108,121,112,104,53,56,48,8,103,108,121,112,104,53,56,49,0,0,0,0,0,0,3,0,8, +0,2,0,17,0,1,255,255,0,3,0,1,0,0,0,14,0,0,0,24,0,0,0,0,0,2,0,1,0,1,2,155, +0,1,0,4,0,0,0,2,0,0,0,1,0,0,0,10,0,76,0,78,0,4,68,70,76,84,0,26,99,121,114, +108,0,36,103,114,101,107,0,46,108,97,116,110,0,56,0,4,0,0,0,0,255,255,0,0, +0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0, +0,0,0,0,1,0,0,0,10,0,84,0,98,0,4,68,70,76,84,0,26,99,121,114,108,0,38,103, +114,101,107,0,50,108,97,116,110,0,62,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0, +0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0, +0,0,1,107,101,114,110,0,8,0,0,0,1,0,0,0,1,0,4,0,2,0,0,0,1,0,8,0,1,15,112, +0,4,0,0,0,105,0,220,1,6,1,12,1,50,1,64,1,94,1,112,1,130,1,204,2,2,2,52,2, +114,2,124,2,138,2,148,2,138,2,158,2,196,2,202,3,28,3,38,3,84,3,118,3,144, +3,166,3,228,3,254,4,20,4,46,4,56,4,190,5,44,5,58,3,28,5,100,5,186,5,204,6, +22,6,28,6,82,6,136,5,186,6,178,6,216,6,230,5,186,7,16,5,186,5,186,5,186,7, +62,7,84,7,90,7,96,7,166,7,224,8,54,8,168,8,194,8,204,8,246,9,24,9,46,9,60, +9,98,9,144,9,242,10,48,10,174,11,72,11,106,11,136,11,146,11,156,11,166,11, +224,12,14,12,64,12,82,12,144,12,210,12,252,13,6,13,44,13,62,13,108,13,150, +13,160,13,174,13,208,13,242,14,4,14,46,14,112,14,142,14,180,14,198,14,212, +14,222,15,0,15,30,15,40,15,70,15,76,15,90,0,10,0,36,255,143,0,55,255,219, +0,60,255,219,1,82,255,143,1,91,255,143,1,94,255,143,1,101,255,143,1,109,255, +219,1,110,255,219,1,116,255,219,0,1,0,20,255,104,0,9,0,3,255,143,0,55,255, +104,0,57,255,104,0,58,255,180,0,60,255,104,0,89,255,219,0,90,255,219,0,92, +255,219,2,3,255,104,0,3,0,15,255,29,0,17,255,29,0,36,255,143,0,7,0,3,255, +180,0,55,255,104,0,57,255,104,0,58,255,104,0,60,255,104,0,92,255,180,2,3, +255,143,0,4,0,3,255,219,0,15,254,248,0,17,254,248,0,36,255,104,0,4,0,55,255, +219,0,57,255,219,0,58,255,219,0,60,255,219,0,18,0,3,255,219,0,15,255,29,0, +16,255,143,0,17,255,29,0,29,255,29,0,30,255,29,0,36,255,104,0,50,255,219, +0,68,255,29,0,70,255,29,0,72,255,29,0,76,255,180,0,82,255,29,0,85,255,180, +0,86,255,29,0,88,255,180,0,90,255,143,0,92,255,143,0,13,0,15,255,68,0,16, +255,143,0,17,255,68,0,29,255,180,0,30,255,180,0,36,255,104,0,68,255,104,0, +72,255,143,0,76,255,219,0,82,255,143,0,85,255,180,0,88,255,180,0,92,255,180, +0,12,0,15,255,143,0,16,255,219,0,17,255,143,0,29,255,219,0,30,255,219,0,36, +255,180,0,68,255,180,0,72,255,219,0,82,255,219,0,85,255,219,0,88,255,219, +0,92,255,238,0,15,0,3,255,219,0,15,254,248,0,16,255,68,0,17,254,248,0,29, +255,143,0,30,255,123,0,36,255,104,0,68,255,104,0,72,255,68,0,76,255,180,0, +82,255,68,0,83,255,104,0,84,255,68,0,88,255,143,0,89,255,143,0,2,0,73,255, +219,2,3,0,37,0,3,0,15,255,143,0,17,255,143,2,3,0,76,0,2,0,15,255,104,0,17, +255,104,0,2,0,15,255,143,0,17,255,143,0,9,1,98,255,213,1,105,255,213,1,109, +255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124,255,219,1,134,255, +219,1,144,255,219,0,1,1,110,255,190,0,20,1,90,0,170,1,91,255,104,1,94,255, +104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255,158, +1,119,255,104,1,120,255,180,1,122,255,70,1,128,255,104,1,130,255,180,1,131, +255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1, +149,255,70,0,2,1,110,255,209,1,116,255,209,0,11,0,3,255,143,1,98,255,213, +1,105,255,213,1,109,255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124, +255,219,1,134,255,219,1,144,255,219,2,3,255,104,0,8,0,15,255,31,0,17,255, +31,1,90,0,164,1,91,255,68,1,94,255,68,1,101,255,68,1,130,255,168,1,147,0, +88,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,137,1,110,255,104, +1,116,255,104,0,5,1,91,255,219,1,94,255,219,1,101,255,219,1,110,255,190,1, +116,255,190,0,15,1,98,255,193,1,105,255,193,1,111,255,143,1,117,255,231,1, +122,255,231,1,125,255,231,1,127,255,231,1,129,255,231,1,135,255,231,1,136, +255,231,1,140,255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255, +231,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,104,1,110,255,104, +1,116,255,104,0,5,1,91,255,219,1,94,255,213,1,101,255,219,1,110,255,190,1, +116,255,190,0,6,0,3,255,219,0,15,254,250,0,17,254,250,1,91,255,104,1,94,255, +104,1,101,255,104,0,2,1,137,255,158,1,141,255,158,0,33,0,3,255,219,0,15,255, +31,0,17,255,31,0,29,255,31,0,30,255,31,1,90,0,188,1,91,255,104,1,94,255,104, +1,98,255,219,1,101,255,104,1,105,255,219,1,111,255,219,1,114,255,219,1,117, +255,31,1,118,255,31,1,121,255,78,1,122,255,31,1,124,255,78,1,126,255,31,1, +128,255,106,1,130,255,180,1,133,255,106,1,134,255,143,1,136,255,31,1,140, +255,31,1,142,255,80,1,143,255,31,1,144,255,143,1,145,255,106,1,147,0,188, +1,148,255,78,1,149,255,31,1,150,255,78,0,27,0,3,255,219,0,15,254,250,0,16, +255,70,0,17,254,250,0,29,255,143,0,30,255,143,1,90,0,188,1,91,255,104,1,94, +255,104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255, +158,1,119,255,104,1,120,255,180,1,122,255,70,1,124,255,158,1,128,255,104, +1,130,255,180,1,131,255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143, +255,70,1,147,0,121,1,149,255,70,0,3,1,91,255,197,1,110,255,190,1,116,255, +190,0,10,1,117,255,178,1,122,255,178,1,125,255,178,1,129,255,217,1,136,255, +178,1,140,255,178,1,143,255,178,1,146,255,178,1,149,255,178,1,151,255,178, +0,21,0,3,255,219,1,90,0,170,1,91,255,104,1,94,255,104,1,98,255,141,1,101, +255,104,1,105,255,141,1,111,255,141,1,114,255,158,1,119,255,104,1,120,255, +180,1,122,255,70,1,128,255,104,1,130,255,180,1,131,255,104,1,133,255,104, +1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1,149,255,70,0,4,1,132, +255,217,1,137,255,227,1,141,255,227,1,144,255,201,0,18,1,117,255,119,1,119, +255,219,1,122,255,119,1,124,255,170,1,125,255,180,1,128,255,219,1,129,255, +158,1,130,255,219,1,131,255,219,1,134,255,170,1,136,255,119,1,137,255,170, +1,140,255,119,1,141,255,170,1,143,255,119,1,146,255,119,1,149,255,119,1,151, +255,119,0,1,1,132,255,217,0,13,1,117,255,231,1,122,255,231,1,125,255,231, +1,127,255,231,1,129,255,231,1,135,255,231,1,136,255,231,1,139,255,231,1,140, +255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255,231,0,13,1,117, +255,225,1,122,255,225,1,125,255,225,1,135,255,225,1,136,255,225,1,139,255, +209,1,140,255,225,1,142,255,207,1,143,255,219,1,146,255,225,1,149,255,225, +1,150,255,207,1,151,255,225,0,10,1,117,255,201,1,122,255,201,1,125,255,201, +1,127,255,201,1,135,255,201,1,136,255,201,1,139,255,201,1,140,255,201,1,143, +255,201,1,149,255,201,0,9,1,117,255,227,1,122,255,227,1,127,255,227,1,136, +255,227,1,139,255,227,1,140,255,227,1,143,255,227,1,146,255,227,1,151,255, +227,0,3,1,132,255,217,1,137,255,227,1,141,255,227,0,10,1,117,255,227,1,122, +255,227,1,125,255,227,1,127,255,227,1,136,255,227,1,139,255,227,1,140,255, +227,1,143,255,227,1,146,255,227,1,151,255,227,0,11,1,117,255,201,1,122,255, +201,1,125,255,201,1,127,255,201,1,136,255,201,1,139,255,201,1,140,255,201, +1,143,255,201,1,146,255,201,1,149,255,201,1,151,255,201,0,5,0,15,255,6,0, +17,255,6,0,108,255,119,0,123,255,119,1,255,255,211,0,1,2,3,255,96,0,1,2,3, +255,119,0,17,1,170,0,68,1,173,255,233,1,177,0,45,1,180,255,211,1,181,255, +233,1,183,255,211,1,184,255,96,1,185,255,166,1,186,255,188,1,189,255,96,1, +195,255,211,1,198,0,23,1,216,255,211,1,217,255,233,1,218,0,23,1,227,0,45, +2,3,255,141,0,14,1,166,255,211,1,173,255,233,1,180,255,233,1,183,255,233, +1,184,255,164,1,185,255,209,1,186,255,233,1,187,255,211,1,189,255,164,1,192, +255,188,1,195,255,233,1,197,255,233,1,209,255,233,1,217,255,211,0,21,1,166, +255,188,1,170,255,211,1,172,255,211,1,173,255,188,1,177,255,233,1,180,255, +188,1,183,255,188,1,184,255,119,1,185,255,188,1,186,255,188,1,187,255,166, +1,189,255,164,1,192,255,141,1,197,255,188,1,202,255,233,1,210,255,233,1,216, +255,188,1,217,255,233,1,219,255,233,1,221,255,188,1,229,255,233,0,28,0,15, +255,6,0,17,255,6,0,108,255,119,0,123,255,119,1,166,255,119,1,170,255,119, +1,173,255,211,1,177,255,141,1,178,255,209,1,180,255,141,1,183,255,164,1,197, +255,188,1,198,255,141,1,200,255,141,1,202,255,119,1,203,255,119,1,206,255, +141,1,209,255,141,1,210,255,141,1,211,255,141,1,212,255,119,1,214,255,141, +1,217,255,119,1,225,255,141,1,226,255,141,1,228,255,141,1,229,255,119,1,255, +255,211,0,6,1,185,0,23,1,186,255,211,1,189,255,186,1,205,0,68,1,212,0,23, +1,217,0,45,0,2,1,173,255,211,1,215,255,233,0,10,1,173,255,233,1,180,255,211, +1,183,255,233,1,184,0,23,1,185,0,45,1,192,0,45,1,198,0,23,1,203,255,231,1, +212,255,233,1,217,255,233,0,8,1,177,255,233,1,180,255,233,1,183,255,233,1, +184,255,211,1,185,255,233,1,186,255,233,1,189,255,211,1,197,255,233,0,5,1, +173,255,233,1,180,255,233,1,183,255,233,1,185,0,23,1,186,255,186,0,3,1,186, +255,233,1,199,0,23,1,217,0,23,0,9,1,186,255,233,1,189,255,233,1,198,0,23, +1,203,0,23,1,212,0,23,1,215,0,23,1,217,0,23,1,221,255,233,1,227,0,23,0,11, +1,166,255,211,1,170,255,211,1,172,255,211,1,177,255,233,1,185,255,211,1,187, +255,164,1,189,255,211,1,197,255,211,1,202,255,211,1,209,255,233,1,219,255, +233,0,24,0,15,254,125,0,17,254,125,0,29,255,211,0,30,255,211,0,123,255,141, +1,166,255,119,1,170,255,119,1,172,255,233,1,173,255,211,1,177,255,141,1,178, +255,233,1,180,255,211,1,183,255,233,1,184,255,164,1,185,255,211,1,186,255, +233,1,187,255,164,1,197,255,211,1,198,255,188,1,202,255,96,1,203,255,166, +1,212,255,166,1,227,255,211,1,229,255,188,0,15,1,166,255,211,1,170,255,211, +1,173,255,233,1,177,255,188,1,178,255,233,1,180,255,211,1,184,255,188,1,185, +255,188,1,187,255,141,1,189,255,188,1,192,255,186,1,195,255,233,1,198,0,23, +1,204,0,45,1,221,255,233,0,31,0,15,255,29,0,17,255,29,0,108,255,166,0,123, +255,166,1,166,255,188,1,170,255,188,1,172,0,23,1,173,255,233,1,177,255,211, +1,180,255,164,1,186,255,188,1,197,255,211,1,198,255,164,1,200,255,166,1,203, +255,141,1,206,255,166,1,208,255,166,1,209,255,164,1,210,255,166,1,212,255, +96,1,213,255,166,1,214,255,141,1,215,255,141,1,217,255,141,1,219,255,166, +1,223,255,166,1,225,255,166,1,226,255,166,1,228,255,166,1,229,255,141,1,255, +255,211,0,38,0,15,254,240,0,17,254,240,0,29,255,211,0,30,255,211,0,108,255, +166,0,123,255,164,1,166,255,119,1,170,255,164,1,173,255,211,1,177,255,188, +1,180,255,188,1,186,255,188,1,195,255,211,1,197,255,211,1,199,255,211,1,200, +255,141,1,201,255,164,1,202,255,96,1,203,255,119,1,204,255,188,1,205,255, +141,1,206,255,164,1,207,255,188,1,208,255,164,1,209,255,119,1,210,255,164, +1,211,255,164,1,212,255,119,1,213,255,164,1,214,255,164,1,215,255,119,1,219, +255,164,1,220,255,164,1,222,255,164,1,223,255,164,1,228,255,164,1,229,255, +119,1,255,255,233,0,8,1,166,255,211,1,170,255,188,1,177,255,188,1,184,255, +141,1,185,255,164,1,189,255,211,1,197,255,186,1,209,255,188,0,7,1,173,255, +211,1,180,255,188,1,183,255,188,1,186,255,188,1,195,255,186,1,212,255,233, +1,217,255,211,0,2,1,180,255,211,1,198,0,45,0,2,1,198,0,23,1,217,0,45,0,2, +1,197,255,188,2,3,255,119,0,14,1,166,255,211,1,170,255,211,1,172,255,188, +1,173,255,233,1,177,255,186,1,178,255,211,1,180,255,211,1,183,255,211,1,184, +255,51,1,187,255,164,1,189,255,96,1,195,255,233,1,197,255,164,2,3,255,96, +0,11,1,170,255,188,1,172,255,231,1,173,255,233,1,177,255,188,1,187,255,186, +1,197,255,211,1,202,255,188,1,204,0,23,1,209,255,188,1,210,255,233,1,229, +255,233,0,12,1,166,255,188,1,170,255,166,1,172,255,211,1,177,255,164,1,180, +255,233,1,183,255,233,1,184,255,141,1,187,255,164,1,189,255,188,1,202,255, +164,1,209,255,164,1,210,255,233,0,4,1,205,255,233,1,216,255,211,1,217,255, +233,1,221,255,211,0,15,1,198,255,209,1,202,255,164,1,203,255,233,1,204,255, +233,1,205,255,211,1,209,255,164,1,210,255,211,1,215,255,233,1,217,255,211, +1,218,255,233,1,219,255,188,1,221,255,188,1,224,255,188,1,227,255,233,1,229, +255,211,0,16,1,198,255,233,1,199,255,233,1,202,255,233,1,203,255,233,1,204, +255,233,1,205,255,233,1,209,255,209,1,210,255,233,1,212,255,233,1,215,255, +233,1,216,255,211,1,217,255,211,1,218,255,233,1,221,255,164,1,224,255,188, +1,229,255,233,0,10,0,15,255,6,0,17,255,6,1,198,255,211,1,202,255,164,1,203, +255,211,1,205,255,233,1,209,255,211,1,212,255,211,1,215,255,211,1,229,255, +233,0,2,1,224,255,211,1,227,0,23,0,9,1,199,255,233,1,202,255,211,1,204,255, +233,1,205,255,211,1,209,255,188,1,216,255,188,1,217,255,233,1,219,255,211, +1,221,255,188,0,4,1,199,0,23,1,217,0,23,1,221,255,233,1,224,0,45,0,11,1,199, +255,233,1,202,255,211,1,203,255,233,1,205,255,233,1,209,255,233,1,212,255, +233,1,215,255,233,1,217,255,233,1,218,255,233,1,221,255,188,1,224,255,211, +0,10,1,198,0,45,1,199,0,45,1,203,0,23,1,205,0,23,1,209,0,23,1,212,0,23,1, +215,0,23,1,216,0,23,1,217,0,23,1,227,0,23,0,2,1,212,0,23,1,221,255,211,0, +3,1,199,255,233,1,205,255,233,1,217,0,23,0,8,1,202,255,211,1,204,255,233, +1,205,255,233,1,209,255,211,1,216,255,211,1,217,255,233,1,219,255,233,1,221, +255,211,0,8,1,202,255,209,1,205,255,233,1,209,255,186,1,216,255,211,1,217, +255,233,1,219,255,233,1,221,255,211,1,229,255,233,0,4,1,204,0,23,1,212,0, +23,1,221,255,233,1,227,0,23,0,10,0,15,255,29,0,17,255,29,1,198,255,233,1, +202,255,188,1,203,255,233,1,204,0,68,1,209,255,211,1,212,255,233,1,215,255, +233,1,217,0,23,0,16,0,15,255,51,0,17,255,51,0,123,0,23,1,198,255,233,1,199, +0,23,1,202,255,188,1,203,255,233,1,204,0,23,1,209,255,211,1,210,255,233,1, +212,255,231,1,214,255,233,1,215,255,233,1,218,255,233,1,227,255,233,1,229, +255,233,0,7,1,199,255,233,1,202,255,211,1,209,255,211,1,216,255,211,1,217, +255,233,1,221,255,211,1,229,255,233,0,9,1,198,255,233,1,199,255,233,1,203, +255,233,1,205,255,233,1,212,255,233,1,215,255,233,1,216,255,233,1,218,255, +233,1,221,255,211,0,4,1,203,255,233,1,205,255,233,1,212,255,233,1,215,255, +233,0,3,1,203,255,233,1,212,255,233,1,217,0,23,0,2,1,216,255,96,1,221,255, +119,0,8,1,202,255,211,1,203,0,23,1,205,255,233,1,209,255,211,1,212,0,23,1, +216,255,211,1,219,255,233,1,229,255,233,0,7,1,202,255,211,1,204,255,233,1, +209,255,211,1,210,255,233,1,216,255,211,1,219,255,233,1,221,255,211,0,2,0, +15,255,51,0,17,255,51,0,7,0,15,255,6,0,17,255,6,0,29,255,211,0,30,255,211, +0,108,255,96,0,123,255,96,1,255,255,211,0,1,2,2,255,219,0,3,0,3,255,180,0, +86,255,219,2,3,255,219,0,5,1,153,255,96,1,162,255,96,1,184,255,96,1,189,255, +188,1,192,255,188,0,1,0,105,0,3,0,20,0,36,0,41,0,47,0,51,0,53,0,55,0,57,0, +58,0,60,0,73,0,85,0,89,0,90,0,92,1,82,1,87,1,88,1,89,1,91,1,93,1,94,1,98, +1,100,1,101,1,105,1,107,1,108,1,109,1,110,1,111,1,113,1,114,1,116,1,125,1, +127,1,129,1,131,1,132,1,135,1,136,1,137,1,138,1,141,1,143,1,144,1,146,1,149, +1,151,1,154,1,160,1,161,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1, +176,1,177,1,178,1,180,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,191,1,192, +1,194,1,195,1,196,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,208,1, +209,1,210,1,212,1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,223,1,226,1,227, +1,228,1,242,1,244,2,2,2,3,2,8,0,0,0,1,0,0,0,0,199,254,176,223,0,0,0,0,191, +26,255,128,0,0,0,0,196,4,48,20,}; +#endif + +#ifdef HAVE_INCBIN +extern const unsigned char pdf_font_DroidSansMono[139280]; +asm(".globl pdf_font_DroidSansMono"); +asm(".balign 8"); +asm("pdf_font_DroidSansMono:"); +asm(".incbin \"fonts/droid/DroidSansMono.ttf\""); +#else +static const unsigned char pdf_font_DroidSansMono[139280] = { +0,1,0,0,0,19,1,0,0,4,0,48,70,70,84,77,75,29,224,116,0,2,31,244,0,0,0,28,71, +68,69,70,2,201,0,4,0,2,14,208,0,0,0,32,71,80,79,83,236,144,228,222,0,2,15, +64,0,0,16,180,71,83,85,66,147,60,130,75,0,2,14,240,0,0,0,80,79,83,47,50,247, +26,134,136,0,0,1,184,0,0,0,96,99,109,97,112,29,150,101,90,0,0,12,136,0,0, +6,242,99,118,116,32,65,244,67,234,0,0,29,92,0,0,2,20,102,112,103,109,115, +211,35,176,0,0,19,124,0,0,7,5,103,97,115,112,0,24,0,9,0,2,14,192,0,0,0,16, +103,108,121,102,155,28,79,66,0,0,36,172,0,1,184,160,104,101,97,100,248,253, +254,54,0,0,1,60,0,0,0,54,104,104,101,97,14,75,8,159,0,0,1,116,0,0,0,36,104, +109,116,120,38,164,8,117,0,0,2,24,0,0,10,112,107,101,114,110,174,170,185, +111,0,1,221,76,0,0,21,90,108,111,99,97,120,114,13,144,0,0,31,112,0,0,5,58, +109,97,120,112,7,1,7,208,0,0,1,152,0,0,0,32,110,97,109,101,35,87,171,194, +0,1,242,168,0,0,7,251,112,111,115,116,26,213,54,16,0,1,250,164,0,0,20,25, +112,114,101,112,122,200,94,246,0,0,26,132,0,0,2,213,0,1,0,0,0,1,5,30,235, +107,75,224,95,15,60,245,0,31,8,0,0,0,0,0,201,129,215,160,0,0,0,0,201,129, +215,160,254,96,253,147,8,103,7,72,0,0,0,8,0,2,0,0,0,0,0,0,0,1,0,0,7,62,254, +78,0,67,8,192,254,96,254,244,8,103,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,156, +0,1,0,0,2,156,1,82,0,84,0,140,0,5,0,2,0,16,0,47,0,90,0,0,3,158,5,192,0,3, +0,1,0,3,4,185,1,144,0,5,0,8,5,154,5,51,0,0,1,27,5,154,5,51,0,0,3,209,0,102, +2,18,8,5,2,11,6,4,2,2,2,2,2,4,160,0,2,175,80,0,120,251,0,0,0,0,0,0,0,0,49, +65,83,67,0,64,0,33,251,2,5,211,254,81,1,51,7,62,1,178,96,0,0,159,223,215, +0,0,4,58,5,129,0,0,0,32,0,2,2,236,0,68,0,0,0,0,2,170,0,0,2,57,0,0,2,57,0, +185,2,215,0,87,4,115,0,9,4,115,0,22,7,29,0,73,5,86,0,72,1,135,0,104,2,170, +0,127,2,170,0,12,3,29,0,33,4,172,0,100,2,57,0,184,2,170,0,91,2,57,0,187,2, +57,0,0,4,115,0,80,4,115,0,156,4,115,0,103,4,115,0,78,4,115,0,47,4,115,0,82, +4,115,0,104,4,115,0,105,4,115,0,89,4,115,0,96,2,57,0,187,2,57,0,184,4,172, +0,101,4,172,0,100,4,172,0,101,4,115,0,84,8,31,0,161,5,86,0,4,5,86,0,168,5, +199,0,104,5,199,0,168,5,86,0,168,4,227,0,168,6,57,0,103,5,199,0,168,2,57, +0,189,4,0,0,32,5,86,0,168,4,115,0,168,6,170,0,168,5,199,0,168,6,57,0,97,5, +86,0,168,6,57,0,97,5,199,0,168,5,86,0,93,4,227,0,46,5,199,0,158,5,86,0,9, +7,141,0,9,5,86,0,46,5,86,0,45,4,227,0,65,2,57,0,146,2,57,0,0,2,57,0,16,3, +193,0,10,4,115,255,225,2,170,0,106,4,115,0,87,4,115,0,132,4,0,0,87,4,115, +0,86,4,115,0,87,2,57,0,29,4,115,0,86,4,115,0,142,1,199,0,137,1,199,255,206, +4,0,0,138,1,199,0,138,6,170,0,136,4,115,0,136,4,115,0,86,4,115,0,132,4,115, +0,86,2,170,0,136,4,0,0,57,2,57,0,31,4,115,0,133,4,0,0,7,5,199,255,253,4,0, +0,23,4,0,0,5,4,0,0,49,2,172,0,34,2,20,0,183,2,172,0,34,4,172,0,92,2,170,0, +242,4,115,0,135,4,115,0,58,4,115,0,113,4,115,255,254,2,20,0,183,4,115,0,115, +2,170,0,45,5,229,0,31,2,246,0,26,4,115,0,83,4,172,0,100,5,229,0,31,4,107, +255,239,3,51,0,122,4,100,0,65,2,170,0,41,2,170,0,27,2,170,0,72,4,156,0,140, +4,76,0,80,2,57,0,187,2,170,0,119,2,170,0,80,2,236,0,27,4,115,0,83,6,172,0, +56,6,172,0,56,6,172,0,73,4,227,0,131,5,86,0,4,5,86,0,4,5,86,0,4,5,86,0,4, +5,86,0,4,5,86,0,4,8,0,0,24,5,199,0,104,5,86,0,168,5,86,0,168,5,86,0,168,5, +86,0,168,2,57,0,9,2,57,0,142,2,57,255,210,2,57,0,7,5,199,0,14,5,199,0,168, +6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,6,57,0,97,4,172,0,142,6,57,0,71,5, +199,0,158,5,199,0,158,5,199,0,158,5,199,0,158,5,86,0,45,5,86,0,168,4,227, +0,142,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,7, +29,0,66,4,0,0,87,4,115,0,87,4,115,0,87,4,115,0,87,4,115,0,87,2,57,0,10,2, +57,0,135,2,57,255,211,2,57,0,8,4,115,0,86,4,115,0,140,4,115,0,86,4,115,0, +86,4,115,0,86,4,115,0,86,4,115,0,86,4,100,0,65,4,227,0,44,4,115,0,139,4,115, +0,139,4,115,0,139,4,115,0,139,4,0,0,5,4,115,0,138,4,0,0,5,5,86,0,4,4,115, +0,87,5,86,0,4,4,115,0,87,5,86,0,4,4,115,0,87,5,199,0,104,4,0,0,87,5,199,0, +104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,104,4,0,0,87,5,199,0,168,4,235, +0,86,5,199,0,14,4,115,0,86,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5, +86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,5,86,0,168,4,115,0,87,6,57,0,103, +4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0,86,6,57,0,103,4,115,0, +86,5,199,0,168,4,115,0,142,5,199,0,14,4,115,0,10,2,57,255,184,2,57,255,184, +2,57,0,12,2,57,0,12,2,57,255,210,2,57,255,210,2,57,0,92,1,199,0,31,2,57,0, +189,2,57,0,194,5,225,0,170,3,141,0,137,4,0,0,32,1,199,255,153,5,86,0,168, +4,0,0,138,4,0,0,138,4,115,0,168,1,199,0,91,4,115,0,168,1,199,0,126,4,115, +0,168,2,85,0,138,4,115,0,168,2,172,0,138,4,115,0,20,1,199,0,16,5,199,0,168, +4,115,0,140,5,199,0,168,4,115,0,140,5,199,0,168,4,115,0,140,4,213,255,254, +5,201,0,165,4,115,0,140,6,57,0,97,4,115,0,86,6,57,0,97,4,115,0,86,6,57,0, +97,4,115,0,86,8,0,0,97,7,141,0,86,5,199,0,168,2,170,0,136,5,199,0,168,2,170, +0,129,5,199,0,168,2,170,0,56,5,86,0,93,4,0,0,57,5,86,0,93,4,0,0,57,5,86,0, +93,4,0,0,57,5,86,0,93,4,0,0,57,4,227,0,46,2,57,0,31,4,227,0,46,3,0,0,31,4, +227,0,46,2,57,0,31,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199, +0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0,158,4,115,0,133,5,199,0, +158,4,115,0,133,7,141,0,9,5,199,255,253,5,86,0,45,4,0,0,5,5,86,0,45,4,227, +0,65,4,0,0,49,4,227,0,65,4,0,0,49,4,227,0,65,4,0,0,49,1,199,0,138,4,115,0, +192,5,86,0,4,4,115,0,87,8,0,0,24,7,29,0,66,6,57,0,71,4,227,0,44,2,170,0,0, +2,170,0,0,2,170,0,51,2,170,255,221,2,170,0,156,2,170,0,51,2,170,0,80,2,170, +255,233,2,170,0,22,2,170,0,205,2,170,0,29,5,87,0,4,2,57,0,187,6,70,255,245, +6,180,255,242,3,18,255,232,6,50,255,187,6,216,0,65,6,5,255,187,1,199,255, +176,5,86,0,4,5,86,0,168,4,104,0,168,5,88,0,61,5,86,0,168,4,227,0,65,5,199, +0,168,6,57,0,97,2,57,0,189,5,86,0,168,5,88,0,10,6,170,0,168,5,199,0,168,5, +51,0,90,6,57,0,97,5,199,0,168,5,86,0,168,4,242,0,108,4,227,0,46,5,86,0,45, +6,98,0,117,5,86,0,46,6,175,0,145,5,251,0,87,2,57,0,7,5,86,0,45,4,160,0,86, +3,145,0,70,4,115,0,106,1,199,0,137,4,96,0,133,4,160,0,86,4,154,0,142,4,0, +0,7,4,116,0,86,3,145,0,70,3,135,0,86,4,115,0,106,4,115,0,106,1,199,0,137, +4,0,0,138,4,0,0,14,4,156,0,138,4,0,0,0,3,149,0,86,4,115,0,86,5,133,0,79,4, +141,0,132,3,219,0,86,4,240,0,86,3,41,0,29,4,96,0,133,5,48,0,85,4,51,0,21, +5,180,0,135,6,63,0,83,1,199,255,205,4,96,0,133,4,115,0,86,4,96,0,133,6,63, +0,83,5,87,0,168,6,235,0,46,4,85,0,168,5,192,0,104,5,86,0,93,2,57,0,189,2, +57,0,7,4,0,0,32,8,117,0,18,8,21,0,168,6,213,0,46,4,169,0,168,5,21,0,55,5, +192,0,168,5,86,0,4,5,64,0,168,5,86,0,168,4,85,0,168,5,107,0,15,5,86,0,168, +7,99,0,28,4,213,0,67,5,192,0,168,5,192,0,168,4,169,0,168,5,64,0,18,6,170, +0,168,5,199,0,168,6,57,0,97,5,192,0,166,5,86,0,168,5,199,0,104,4,227,0,46, +5,21,0,55,6,21,0,118,5,86,0,46,5,235,0,168,5,85,0,160,7,85,0,168,7,128,0, +168,6,85,0,46,7,21,0,168,5,64,0,168,5,192,0,105,8,21,0,168,5,199,0,96,4,115, +0,87,4,149,0,120,4,64,0,142,2,235,0,142,4,171,0,20,4,115,0,87,5,90,0,7,3, +171,0,49,4,120,0,142,4,120,0,142,3,128,0,138,4,171,0,11,5,128,0,142,4,107, +0,142,4,115,0,86,4,85,0,142,4,115,0,132,4,0,0,87,3,170,0,35,4,0,0,5,6,149, +0,86,4,0,0,23,4,149,0,142,4,43,0,122,6,107,0,142,6,149,0,142,5,0,0,45,5,192, +0,142,4,43,0,142,4,21,0,55,6,0,0,142,4,85,0,17,4,115,0,87,4,115,0,10,2,235, +0,142,4,21,0,87,4,0,0,57,1,199,0,137,2,57,255,248,1,199,255,206,7,64,0,11, +6,128,0,142,4,115,0,10,3,128,0,138,4,0,0,5,4,107,0,142,3,233,0,168,3,74,0, +142,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253,7,141,0,9,5,199,255,253, +5,86,0,45,4,0,0,5,4,115,0,0,8,0,0,0,8,0,0,0,4,107,255,225,1,199,0,127,1,199, +0,127,1,199,0,127,1,199,0,126,2,170,0,75,2,170,0,75,2,170,0,75,4,115,0,138, +4,115,0,136,2,205,0,81,8,0,1,22,8,0,0,55,1,128,0,85,2,213,0,85,2,170,0,88, +2,170,0,89,4,0,0,185,2,170,255,192,1,86,254,96,2,235,0,101,4,115,0,4,4,115, +0,58,8,192,0,158,4,115,0,16,7,21,0,69,2,150,0,19,8,149,0,188,8,0,0,188,6, +37,0,108,4,205,0,88,6,172,0,80,6,172,0,61,6,172,0,93,6,172,0,145,8,0,1,162, +4,0,1,16,8,0,1,162,4,0,1,16,8,0,1,162,4,0,1,16,4,0,1,16,3,244,0,56,4,229, +0,4,6,150,0,235,5,180,0,154,4,172,0,101,4,100,0,51,5,180,0,87,7,213,1,152, +5,192,1,22,2,49,255,158,4,100,0,56,4,100,0,65,4,171,0,100,4,100,0,63,4,100, +0,65,4,213,0,157,4,172,0,100,4,213,2,34,4,213,1,5,5,171,255,246,5,0,1,216, +5,171,2,141,5,171,255,246,5,171,2,141,5,171,255,246,5,171,2,141,5,171,255, +246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,1,217,5, +171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255,246, +5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171,255, +246,5,171,2,141,5,171,1,217,5,171,1,217,5,171,255,246,5,171,255,246,5,171, +255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255, +246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,255,246,5,171,0,0,5,171, +0,0,5,171,0,0,5,171,0,0,5,171,2,213,5,171,0,103,5,171,0,0,5,213,0,0,4,213, +0,123,4,213,0,6,2,214,0,109,2,214,0,109,8,0,0,0,7,235,1,158,7,235,1,145,7, +235,1,158,7,235,1,145,3,244,0,8,4,213,0,167,4,213,0,178,4,213,0,41,4,213, +0,41,2,214,0,115,8,43,1,177,8,107,1,209,7,85,1,70,6,0,1,218,6,0,1,81,4,64, +0,59,5,64,0,60,4,192,0,102,4,21,0,66,4,0,0,196,6,0,1,16,4,0,0,29,4,0,0,29, +2,170,0,119,2,170,0,243,2,170,0,127,2,170,0,14,2,170,0,53,2,170,0,43,2,170, +0,45,2,170,255,229,1,199,0,124,1,199,0,130,2,90,0,106,2,90,0,72,2,152,0,0, +2,152,0,0,2,135,0,45,2,160,255,233,3,47,0,32,2,72,255,232,0,0,0,3,0,0,0,3, +0,0,0,28,0,1,0,0,0,0,4,232,0,3,0,1,0,0,0,28,0,4,4,204,0,0,0,190,0,128,0,6, +0,62,0,126,1,127,1,146,1,255,2,199,2,201,2,221,3,126,3,138,3,140,3,161,3, +206,4,12,4,79,4,92,4,95,4,145,30,133,30,243,32,21,32,30,32,34,32,38,32,48, +32,51,32,58,32,60,32,62,32,68,32,127,32,164,32,167,32,172,33,5,33,19,33,22, +33,34,33,38,33,46,33,94,33,149,33,168,34,2,34,6,34,15,34,18,34,21,34,26,34, +31,34,41,34,43,34,72,34,97,34,101,35,2,35,16,35,33,37,0,37,2,37,12,37,16, +37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,108,37,128,37,132,37,136,37, +140,37,147,37,161,37,172,37,178,37,186,37,188,37,196,37,203,37,207,37,217, +37,230,38,60,38,64,38,66,38,96,38,99,38,102,38,107,240,2,240,5,251,2,255, +255,0,0,0,32,0,160,1,146,1,250,2,198,2,201,2,216,3,126,3,132,3,140,3,142, +3,163,4,1,4,14,4,81,4,94,4,144,30,128,30,242,32,19,32,23,32,32,32,38,32,48, +32,50,32,57,32,60,32,62,32,68,32,127,32,163,32,167,32,172,33,5,33,19,33,22, +33,34,33,38,33,46,33,91,33,144,33,168,34,2,34,6,34,15,34,17,34,21,34,25,34, +30,34,41,34,43,34,72,34,96,34,100,35,2,35,16,35,32,37,0,37,2,37,12,37,16, +37,20,37,24,37,28,37,36,37,44,37,52,37,60,37,80,37,128,37,132,37,136,37,140, +37,144,37,160,37,170,37,178,37,186,37,188,37,196,37,202,37,207,37,216,37, +230,38,58,38,64,38,66,38,96,38,99,38,101,38,106,240,1,240,5,251,1,255,255, +255,227,0,0,255,174,255,71,254,129,254,128,254,114,252,160,253,204,253,203, +253,202,253,201,253,151,253,150,253,149,253,148,253,100,227,118,227,10,225, +235,225,234,225,233,225,230,225,221,225,220,225,215,225,214,225,213,225,208, +225,150,225,115,225,113,225,109,225,21,225,8,225,6,224,251,224,248,224,241, +224,197,224,148,224,130,224,41,224,38,224,30,224,29,223,255,0,0,224,19,224, +10,224,9,223,237,223,214,223,212,223,56,223,43,223,28,221,62,221,61,221,52, +221,49,221,46,221,43,221,40,221,33,221,26,221,19,221,12,220,249,220,230,220, +227,220,224,220,221,220,218,220,206,220,198,220,193,220,186,220,185,220,178, +220,173,220,170,220,162,220,150,220,67,220,64,220,63,220,34,220,32,220,31, +220,28,18,135,18,133,7,135,0,1,0,0,0,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,98,0,99,0,100,0,101,0, +102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,16,0,110,0,111,0,112,0,113, +0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0, +126,0,127,0,128,0,129,0,130,0,131,0,132,0,133,0,134,0,135,0,136,0,137,0,138, +0,139,0,140,0,141,0,142,0,143,0,144,0,145,0,146,0,147,0,148,0,149,0,150,0, +151,0,152,0,153,0,154,0,155,0,156,0,157,0,158,0,159,0,160,0,161,0,162,0,163, +0,164,0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0, +176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188, +0,189,0,190,0,191,0,192,0,193,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0, +201,0,202,0,203,0,204,0,205,0,206,0,207,0,208,0,209,0,210,0,211,0,212,0,213, +0,214,0,215,0,216,0,217,0,218,0,219,0,220,0,221,0,222,0,223,0,224,0,225,0, +226,0,227,0,228,0,229,0,230,0,231,0,232,0,233,0,234,0,235,0,236,0,237,0,238, +0,239,0,240,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,0, +251,0,252,0,253,0,254,0,255,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10, +1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25, +1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40, +1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55, +1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,0,119,2,48,0,6,2,10,0,0,0,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,0,4,0,5,0,6,0,7,0, +8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0, +23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37, +0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52, +0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67, +0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82, +0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97, +0,0,0,132,0,133,0,135,0,137,0,145,0,150,0,156,0,161,0,160,0,162,0,164,0,163, +0,165,0,167,0,169,0,168,0,170,0,171,0,173,0,172,0,174,0,175,0,177,0,179,0, +178,0,180,0,182,0,181,0,186,0,185,0,187,0,188,2,9,0,112,0,99,0,100,0,104, +2,11,0,118,0,159,0,110,0,106,2,29,0,116,0,105,2,54,0,134,0,152,2,49,0,113, +2,56,2,57,0,102,0,117,2,43,2,46,2,45,1,137,2,52,0,107,0,122,1,114,0,166,0, +184,0,127,0,98,0,109,2,48,1,64,2,53,2,44,0,108,0,123,2,12,0,3,0,128,0,131, +0,149,1,18,1,19,1,254,1,255,2,6,2,7,2,2,2,3,0,183,2,119,0,191,1,56,2,20,2, +25,2,16,2,17,2,136,2,137,2,10,0,119,2,4,2,8,2,13,0,130,0,138,0,129,0,139, +0,136,0,141,0,142,0,143,0,140,0,147,0,148,0,0,0,146,0,154,0,155,0,153,0,241, +1,71,1,78,0,111,1,74,1,75,1,76,0,120,1,79,1,77,1,72,0,0,64,69,89,88,85,84, +83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59, +58,57,56,55,54,53,49,48,47,46,45,44,40,39,38,37,36,35,34,33,31,24,20,17,16, +15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,44,69,35,70,96,32,176,38,96,176,4,38,35, +72,72,45,44,69,35,70,35,97,32,176,38,97,176,4,38,35,72,72,45,44,69,35,70, +96,176,32,97,32,176,70,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,32,96, +32,176,38,97,176,32,97,176,4,38,35,72,72,45,44,69,35,70,96,176,64,97,32,176, +102,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,64,96,32,176,38,97,176, +64,97,176,4,38,35,72,72,45,44,1,16,32,60,0,60,45,44,32,69,35,32,176,205,68, +35,32,184,1,90,81,88,35,32,176,141,68,35,89,32,176,237,81,88,35,32,176,77, +68,35,89,32,176,4,38,81,88,35,32,176,13,68,35,89,33,33,45,44,32,32,69,24, +104,68,32,176,1,96,32,69,176,70,118,104,138,69,96,68,45,44,1,177,11,10,67, +35,67,101,10,45,44,0,177,10,11,67,35,67,11,45,44,0,176,40,35,112,177,1,40, +62,1,176,40,35,112,177,2,40,69,58,177,2,0,8,13,45,44,32,69,176,3,37,69,97, +100,176,80,81,88,69,68,27,33,33,89,45,44,73,176,14,35,68,45,44,32,69,176, +0,67,96,68,45,44,1,176,6,67,176,7,67,101,10,45,44,32,105,176,64,97,176,0, +139,32,177,44,192,138,140,184,16,0,98,96,43,12,100,35,100,97,92,88,176,3, +97,89,45,44,138,3,69,138,138,135,176,17,43,176,41,35,68,176,41,122,228,24, +45,44,69,101,176,44,35,68,69,176,43,35,68,45,44,75,82,88,69,68,27,33,33,89, +45,44,75,81,88,69,68,27,33,33,89,45,44,1,176,5,37,16,35,32,138,245,0,176, +1,96,35,237,236,45,44,1,176,5,37,16,35,32,138,245,0,176,1,97,35,237,236,45, +44,1,176,6,37,16,245,0,237,236,45,44,70,35,70,96,138,138,70,35,32,70,138, +96,138,97,184,255,128,98,35,32,16,35,138,177,12,12,138,112,69,96,32,176,0, +80,88,176,1,97,184,255,186,139,27,176,70,140,89,176,16,96,104,1,58,45,44, +32,69,176,3,37,70,82,75,176,19,81,91,88,176,2,37,70,32,104,97,176,3,37,176, +3,37,63,35,33,56,27,33,17,89,45,44,32,69,176,3,37,70,80,88,176,2,37,70,32, +104,97,176,3,37,176,3,37,63,35,33,56,27,33,17,89,45,44,0,176,7,67,176,6,67, +11,45,44,33,33,12,100,35,100,139,184,64,0,98,45,44,33,176,128,81,88,12,100, +35,100,139,184,32,0,98,27,178,0,64,47,43,89,176,2,96,45,44,33,176,192,81, +88,12,100,35,100,139,184,21,85,98,27,178,0,128,47,43,89,176,2,96,45,44,12, +100,35,100,139,184,64,0,98,96,35,33,45,44,75,83,88,138,176,4,37,73,100,35, +69,105,176,64,139,97,176,128,98,176,32,97,106,176,14,35,68,35,16,176,14,246, +27,33,35,138,18,17,32,57,47,89,45,44,75,83,88,32,176,3,37,73,100,105,32,176, +5,38,176,6,37,73,100,35,97,176,128,98,176,32,97,106,176,14,35,68,176,4,38, +16,176,14,246,138,16,176,14,35,68,176,14,246,176,14,35,68,176,14,237,27,138, +176,4,38,17,18,32,57,35,32,57,47,47,89,45,44,69,35,69,96,35,69,96,35,69,96, +35,118,104,24,176,128,98,32,45,44,176,72,43,45,44,32,69,176,0,84,88,176,64, +68,32,69,176,64,97,68,27,33,33,89,45,44,69,177,48,47,69,35,69,97,96,176,1, +96,105,68,45,44,75,81,88,176,47,35,112,176,20,35,66,27,33,33,89,45,44,75, +81,88,32,176,3,37,69,105,83,88,68,27,33,33,89,27,33,33,89,45,44,69,176,20, +67,176,0,96,99,176,1,96,105,68,45,44,176,47,69,68,45,44,69,35,32,69,138,96, +68,45,44,69,35,69,96,68,45,44,75,35,81,88,185,0,51,255,224,177,52,32,27,179, +51,0,52,0,89,68,68,45,44,176,22,67,88,176,3,38,69,138,88,100,102,176,31,96, +27,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,89,35,88,101,89,176,41, +35,68,35,16,176,41,224,27,33,33,33,33,33,89,45,44,176,2,67,84,88,75,83,35, +75,81,90,88,56,27,33,33,89,27,33,33,33,33,89,45,44,176,22,67,88,176,4,37, +69,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,35,88,27,101,89,176,41, +35,68,176,5,37,176,8,37,8,32,88,2,27,3,89,176,4,37,16,176,5,37,32,70,176, +4,37,35,66,60,176,4,37,176,7,37,8,176,7,37,16,176,6,37,32,70,176,4,37,176, +1,96,35,66,60,32,88,1,27,0,89,176,4,37,16,176,5,37,176,41,224,176,41,32,69, +101,68,176,7,37,16,176,6,37,176,41,224,176,5,37,176,8,37,8,32,88,2,27,3,89, +176,5,37,176,3,37,67,72,176,4,37,176,7,37,8,176,6,37,176,3,37,176,1,96,67, +72,27,33,89,33,33,33,33,33,33,33,45,44,2,176,4,37,32,32,70,176,4,37,35,66, +176,5,37,8,176,3,37,69,72,33,33,33,33,45,44,2,176,3,37,32,176,4,37,8,176, +2,37,67,72,33,33,33,45,44,69,35,32,69,24,32,176,0,80,32,88,35,101,35,89,35, +104,32,176,64,80,88,33,176,64,89,35,88,101,89,138,96,68,45,44,75,83,35,75, +81,90,88,32,69,138,96,68,27,33,33,89,45,44,75,84,88,32,69,138,96,68,27,33, +33,89,45,44,75,83,35,75,81,90,88,56,27,33,33,89,45,44,176,0,33,75,84,88,56, +27,33,33,89,45,44,176,2,67,84,88,176,70,43,27,33,33,33,33,89,45,44,176,2, +67,84,88,176,71,43,27,33,33,33,89,45,44,176,2,67,84,88,176,72,43,27,33,33, +33,33,89,45,44,176,2,67,84,88,176,73,43,27,33,33,33,89,45,44,32,138,8,35, +75,83,138,75,81,90,88,35,56,27,33,33,89,45,44,0,176,2,37,73,176,0,83,88,32, +176,64,56,17,27,33,89,45,44,1,70,35,70,96,35,70,97,35,32,16,32,70,138,97, +184,255,128,98,138,177,64,64,138,112,69,96,104,58,45,44,32,138,35,73,100, +138,35,83,88,60,27,33,89,45,44,75,82,88,125,27,122,89,45,44,176,18,0,75,1, +75,84,66,45,44,177,2,0,66,177,35,1,136,81,177,64,1,136,83,90,88,185,16,0, +0,32,136,84,88,178,2,1,2,67,96,66,89,177,36,1,136,81,88,185,32,0,0,64,136, +84,88,178,2,2,2,67,96,66,177,36,1,136,84,88,178,2,32,2,67,96,66,0,75,1,75, +82,88,178,2,8,2,67,96,66,89,27,185,64,0,0,128,136,84,88,178,2,4,2,67,96,66, +89,185,64,0,0,128,99,184,1,0,136,84,88,178,2,8,2,67,96,66,89,185,64,0,1,0, +99,184,2,0,136,84,88,178,2,16,2,67,96,66,89,185,64,0,2,0,99,184,4,0,136,84, +88,178,2,64,2,67,96,66,89,89,89,89,89,45,44,69,24,104,35,75,81,88,35,32,69, +32,100,176,64,80,88,124,89,104,138,96,89,68,45,44,176,0,22,176,2,37,176,2, +37,1,176,1,35,62,0,176,2,35,62,177,1,2,6,12,176,10,35,101,66,176,11,35,66, +1,176,1,35,63,0,176,2,35,63,177,1,2,6,12,176,6,35,101,66,176,7,35,66,176, +1,22,1,45,44,122,138,16,69,35,245,24,45,0,0,0,177,9,64,190,1,7,0,1,0,31,1, +7,0,1,0,159,1,4,64,142,1,192,253,1,175,253,1,0,253,1,10,79,251,1,32,251,1, +245,80,40,31,242,70,40,31,241,70,42,31,240,70,43,31,95,239,127,239,2,15,239, +79,239,95,239,143,239,175,239,5,11,229,228,30,31,227,226,70,31,15,226,1,64, +226,70,22,31,225,224,70,31,207,224,223,224,239,224,3,64,224,51,54,70,224, +70,24,31,221,61,223,85,222,61,3,85,223,1,3,85,220,3,255,31,15,213,31,213, +2,15,213,31,213,2,64,202,24,27,70,207,194,1,189,192,60,31,193,80,38,31,188, +190,40,31,255,185,1,80,184,112,184,128,184,3,184,255,192,64,255,184,18,50, +70,31,183,63,183,79,183,111,183,127,183,159,183,175,183,7,112,178,160,178, +176,178,3,15,178,1,144,181,1,176,181,1,15,181,1,8,15,179,63,179,239,179,3, +128,176,144,176,2,176,176,192,176,208,176,3,47,175,63,175,2,160,173,176,173, +2,192,173,208,173,2,47,172,63,172,2,159,171,1,192,170,208,170,2,79,169,143, +169,2,47,169,111,169,191,169,255,169,4,156,155,36,31,80,155,1,111,150,1,191, +150,1,150,70,29,31,149,148,23,31,127,148,143,148,255,148,3,48,145,64,145, +2,128,145,1,112,143,128,143,2,144,143,1,192,143,208,143,2,79,140,95,140,111, +140,3,134,70,255,31,159,133,1,132,131,49,31,116,115,63,31,115,80,38,31,111, +110,60,31,110,70,53,31,26,1,24,85,25,51,24,85,7,51,3,85,6,3,255,31,96,80, +38,31,95,80,38,31,92,70,49,31,91,90,72,31,90,70,49,31,19,50,18,85,5,1,3,85, +4,50,3,85,111,3,1,15,3,63,3,2,239,81,255,81,2,64,81,53,56,70,64,81,37,40, +70,207,64,84,80,1,73,70,32,31,72,70,53,31,71,70,53,31,175,70,1,223,70,239, +70,2,128,70,1,22,50,21,85,17,1,15,85,16,50,15,85,2,1,0,85,1,0,1,31,31,15, +63,15,95,15,127,15,4,15,15,47,15,79,15,111,15,143,15,223,15,255,15,7,63,15, +127,15,239,15,3,111,0,1,128,22,1,5,1,184,1,144,177,84,83,43,43,75,184,7,255, +82,75,176,7,80,91,176,1,136,176,37,83,176,1,136,176,64,81,90,176,6,136,176, +0,85,90,91,88,177,1,1,142,89,133,141,141,0,66,29,75,176,50,83,88,176,96,29, +89,75,176,100,83,88,176,64,29,89,75,176,128,83,88,176,16,29,177,22,0,66,89, +116,115,116,117,43,43,43,43,43,1,115,116,117,43,43,43,0,116,43,43,115,115, +117,43,43,43,1,43,43,43,0,43,43,43,43,43,43,1,43,43,0,43,43,1,43,115,43,0, +116,115,116,117,115,116,115,43,1,43,116,117,0,115,43,115,116,1,115,115,116, +0,115,116,116,115,116,115,1,94,115,115,116,115,115,0,115,43,115,115,1,43, +0,43,1,43,0,115,43,116,117,43,43,43,43,1,43,43,116,43,43,94,115,43,0,43,94, +115,116,1,43,43,43,0,43,115,115,94,115,115,115,1,115,115,115,24,94,0,0,0, +5,204,5,204,0,125,5,129,0,21,0,121,5,129,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,58,0,20,0,119,0,0,255,236,0,0,0,0,255,236,0,0,0,0,255,236,0,0,254,87,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,8,0,0,0,0,0,0,180,0,189,0,175,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0, +126,0,0,0,172,0,0,0,0,0,0,0,0,0,0,0,0,0,191,0,195,0,171,0,0,0,0,0,155,0,141, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,0,170,0,0,0,0,0, +0,0,148,0,153,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106, +0,131,0,141,0,164,0,180,0,0,0,0,0,0,0,0,0,0,0,96,0,106,0,121,0,152,0,172, +0,184,0,167,0,0,1,34,1,51,0,195,0,107,0,0,0,0,0,0,0,219,0,201,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,225,1,201,0,146,0,168,0,107,0,146,0,183, +0,107,0,155,0,0,2,123,2,242,0,146,2,82,0,110,2,215,3,129,0,130,0,137,0,160, +0,159,1,105,0,143,0,0,1,96,0,164,1,91,0,94,0,130,0,0,0,0,0,0,0,94,0,101,0, +111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,144,0,165,0,122,0,128,0,0,0,0,0,0, +0,0,0,0,5,129,255,243,0,13,252,167,0,131,0,137,0,143,0,150,0,105,0,113,0, +0,0,0,0,0,0,0,0,0,0,168,1,249,0,0,0,0,3,31,0,167,0,174,0,181,0,0,0,0,0,129, +0,0,0,0,0,0,0,0,7,72,3,106,2,182,2,2,253,147,0,0,0,145,0,103,0,145,0,97,1, +217,0,0,2,141,3,65,0,68,5,17,0,0,0,44,0,44,0,44,0,44,1,22,1,96,2,4,3,4,3, +230,4,240,5,14,5,84,5,158,5,246,6,50,6,114,6,144,6,178,6,218,7,80,7,150,8, +32,8,222,9,68,9,226,10,140,10,206,11,158,12,80,12,126,12,200,13,18,13,74, +13,146,14,20,15,100,16,22,16,172,17,64,17,160,17,222,18,40,18,202,19,22,19, +96,19,194,20,44,20,88,21,184,22,64,22,182,23,26,23,192,24,94,25,40,26,38, +26,146,27,42,29,162,30,254,32,64,32,148,32,190,32,242,33,28,34,172,34,202, +34,244,35,160,36,54,36,172,37,54,37,166,38,32,38,238,39,88,39,166,40,102, +41,0,41,68,42,246,43,100,43,212,44,112,45,20,45,98,46,16,46,114,46,230,48, +52,50,86,51,226,53,124,54,24,54,136,55,126,55,240,56,112,57,142,58,18,58, +196,59,100,59,234,60,238,62,28,62,144,63,134,64,72,64,168,64,210,65,178,65, +200,66,36,66,110,66,232,67,126,67,170,68,42,68,106,68,138,68,244,69,48,69, +166,70,14,70,48,70,90,70,124,71,8,71,32,71,56,71,80,71,104,71,130,71,154, +72,14,72,34,72,58,72,82,72,106,72,132,72,156,72,178,72,200,72,224,73,80,73, +104,73,128,73,152,73,176,73,200,73,226,74,68,74,252,75,20,75,44,75,68,75, +94,75,118,75,212,76,154,76,178,76,202,76,226,76,250,77,20,77,46,78,38,78, +58,78,82,78,106,78,130,78,156,78,180,78,202,78,224,78,248,79,172,79,196,79, +220,79,244,80,12,80,36,80,62,80,126,81,26,81,50,81,74,81,98,81,124,81,148, +82,24,82,50,82,74,82,98,82,122,82,146,82,166,82,186,82,210,82,234,83,2,83, +26,83,50,83,70,83,94,83,118,83,142,83,164,83,172,84,74,84,98,84,122,84,146, +84,170,84,194,84,214,84,234,84,254,85,22,85,46,85,70,85,94,85,118,85,142, +85,166,85,186,85,206,85,230,85,254,86,22,86,142,87,20,87,42,87,64,87,88,87, +110,87,132,87,154,87,172,87,192,87,216,88,170,88,182,88,210,88,234,89,228, +89,248,90,12,90,124,90,148,90,170,90,190,90,210,90,232,91,22,91,42,91,62, +91,150,91,224,91,248,92,16,92,36,92,56,92,80,92,104,92,116,93,20,93,164,93, +188,93,212,93,236,94,4,94,30,94,56,94,216,95,154,95,178,95,202,95,222,95, +242,96,10,96,34,96,58,96,82,96,106,96,130,96,150,96,170,96,194,96,218,96, +238,98,112,98,136,98,158,98,238,99,96,99,120,99,144,99,168,99,192,99,216, +99,240,100,10,100,36,100,62,100,88,100,122,100,142,100,166,100,190,100,214, +100,238,101,8,101,32,101,56,101,80,101,100,101,124,101,148,101,244,102,108, +103,104,103,140,103,164,103,188,103,212,103,236,104,34,104,88,104,142,104, +214,104,238,105,86,105,162,106,244,107,70,107,118,107,188,107,248,109,10, +109,50,109,112,109,172,109,206,112,188,112,236,114,22,114,30,114,38,114,82, +114,208,114,216,114,224,114,232,115,138,115,146,115,154,116,34,116,42,116, +50,116,116,116,124,116,182,116,190,117,56,117,64,117,72,117,234,117,242,118, +140,119,78,119,102,120,194,120,218,120,242,121,10,121,36,121,64,122,30,122, +212,123,118,124,16,124,186,125,114,125,218,126,124,127,28,127,136,128,94, +128,208,130,6,130,234,130,242,131,112,131,246,132,174,133,52,133,156,134, +4,134,138,135,74,135,188,136,108,136,134,136,160,136,184,136,208,136,232, +137,66,137,198,137,222,138,142,138,150,138,158,138,182,138,190,139,116,139, +224,140,78,140,102,140,126,140,198,140,206,141,66,141,74,141,82,141,224,141, +232,142,210,143,168,144,10,144,34,144,152,145,30,145,38,145,46,145,54,145, +108,145,116,145,124,145,132,146,12,146,156,146,164,146,226,147,78,147,158, +147,250,148,88,148,206,149,44,149,214,150,112,151,26,151,34,151,198,152,86, +152,130,152,254,153,6,153,250,154,160,155,34,155,58,155,200,156,80,157,2, +157,96,157,104,157,178,157,186,157,194,157,250,158,2,158,250,159,2,159,72, +159,160,159,242,160,86,160,184,161,28,161,134,162,24,162,150,163,6,163,32, +163,192,163,216,164,106,164,114,164,232,165,2,165,10,165,228,166,90,166,222, +166,246,167,14,167,100,167,148,167,194,167,218,167,242,168,10,168,34,168, +60,168,86,168,110,168,134,168,168,168,202,168,236,168,248,169,40,169,90,169, +140,169,188,170,18,170,114,170,208,171,12,171,102,171,172,171,238,174,134, +174,168,174,186,174,246,175,46,175,70,175,90,175,126,175,232,176,60,176,252, +178,100,179,50,180,4,180,178,181,136,182,32,182,224,183,78,183,128,183,178, +183,228,184,14,184,60,184,106,184,152,184,198,185,14,185,86,185,166,186,118, +187,22,187,70,187,184,187,214,188,72,188,226,188,250,189,52,190,108,191,92, +191,212,192,8,192,96,192,184,192,230,193,0,193,54,193,116,193,140,193,166, +193,200,193,234,194,12,194,46,194,84,194,122,194,160,194,198,194,248,195, +30,195,72,195,118,195,166,195,224,196,14,196,62,196,120,196,166,196,214,197, +16,197,62,197,110,197,168,197,220,198,18,198,86,198,138,198,194,199,8,199, +62,199,114,199,184,199,238,200,34,200,106,200,178,200,252,201,88,201,112, +201,136,201,160,201,184,201,208,203,232,205,196,207,132,207,146,207,178,207, +206,207,246,208,4,208,18,208,32,208,46,208,60,208,106,208,188,208,238,209, +32,209,114,209,180,210,100,210,228,211,148,212,14,212,166,213,6,213,140,213, +224,214,26,214,102,214,220,215,70,215,164,215,246,216,8,216,68,216,164,217, +34,217,88,218,12,218,74,218,114,218,160,218,200,218,242,219,40,219,94,219, +130,219,208,220,20,220,80,0,0,0,2,0,68,0,0,2,100,5,85,0,3,0,7,0,46,177,1, +0,47,60,178,7,4,8,237,50,177,6,5,220,60,178,3,2,8,237,50,0,177,3,0,47,60, +178,5,4,8,237,50,178,7,6,9,252,60,178,1,2,8,237,50,51,17,33,17,37,33,17,33, +68,2,32,254,36,1,152,254,104,5,85,250,171,68,4,205,0,0,0,2,0,185,0,0,1,127, +5,129,0,3,0,7,1,172,64,158,3,91,2,2,150,7,166,7,2,7,150,57,4,73,4,89,4,3, +4,64,23,27,72,6,4,1,11,4,38,9,1,201,9,217,9,2,118,9,166,9,2,25,9,41,9,2,6, +9,1,215,73,9,1,38,9,1,217,9,1,118,9,1,41,9,1,6,9,1,121,9,1,86,9,1,9,9,1,163, +169,9,1,130,9,1,84,9,100,9,116,9,3,137,9,1,98,9,114,9,2,68,9,84,9,2,34,9, +50,9,2,20,9,1,2,9,1,242,9,1,212,9,228,9,2,178,9,194,9,2,148,9,164,9,2,114, +9,130,9,2,84,9,100,9,2,66,9,1,20,9,36,9,52,9,3,2,9,1,110,9,184,255,128,64, +17,102,109,72,73,9,1,9,64,94,98,72,45,9,61,9,2,9,184,1,0,64,153,85,88,72, +9,128,81,84,72,125,9,141,9,157,9,3,95,9,111,9,2,9,128,71,75,72,9,192,67,70, +72,9,128,63,66,72,125,9,1,91,9,107,9,2,61,9,77,9,2,25,9,41,9,2,11,9,1,55, +235,9,251,9,2,205,9,221,9,2,171,9,187,9,2,9,64,45,48,72,59,9,75,9,91,9,3, +29,9,45,9,2,1,203,9,219,9,235,9,3,159,9,175,9,191,9,3,27,9,43,9,59,9,107, +9,123,9,5,15,9,1,2,127,9,143,9,159,9,191,9,207,9,5,64,9,96,9,2,15,9,31,9, +2,7,112,1,1,95,1,1,1,5,156,4,2,3,0,63,47,253,206,93,93,1,94,93,93,93,95,113, +113,113,113,95,114,114,43,114,114,114,94,93,93,93,93,93,43,43,43,113,113, +43,43,114,43,114,43,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113, +114,114,114,94,93,93,93,113,113,113,113,114,114,94,93,93,93,93,113,47,94, +93,43,93,237,113,51,47,237,49,48,1,35,3,51,3,53,51,21,1,103,148,24,196,198, +194,1,141,3,244,250,127,201,201,0,0,2,0,87,3,198,2,128,5,129,0,3,0,7,0,104, +64,33,48,3,1,128,3,1,3,16,2,32,2,96,2,112,2,128,2,5,96,2,112,2,2,80,2,96, +2,176,2,192,2,4,2,184,255,192,179,37,40,72,2,184,255,192,64,32,25,28,72,2, +48,7,1,128,7,1,7,111,6,127,6,143,6,3,47,6,63,6,2,6,5,32,0,1,0,6,2,3,0,63, +51,205,93,50,1,47,113,114,205,93,113,220,43,43,93,113,114,205,93,113,49,48, +1,35,3,51,1,35,3,51,2,106,142,20,184,254,121,141,21,184,3,198,1,187,254,69, +1,187,0,0,0,2,0,9,0,0,4,105,5,121,0,27,0,31,0,214,64,134,90,25,1,90,21,1, +68,14,1,68,19,1,54,19,1,68,30,1,38,30,54,30,2,68,23,1,38,23,54,23,2,3,16, +1,8,29,28,21,20,9,20,20,11,14,15,18,19,10,9,19,12,16,4,10,4,1,0,25,24,5,24, +24,27,3,3,7,30,31,22,23,6,23,5,6,4,7,8,11,4,12,13,1,14,29,30,4,13,0,15,28, +31,4,16,17,18,21,22,25,4,17,16,13,1,208,13,1,79,17,143,17,159,17,3,63,17, +79,17,2,13,17,13,17,5,20,23,24,3,19,3,6,9,10,3,5,0,47,23,51,63,23,51,18,57, +57,47,47,93,113,93,113,17,23,51,16,205,23,50,17,23,51,16,205,23,50,1,47,51, +51,135,192,192,192,192,1,23,51,16,135,192,192,192,192,1,47,23,51,135,192, +192,192,192,1,51,16,135,192,192,192,192,49,48,1,93,93,93,93,93,93,93,93,93, +93,1,3,33,21,33,3,35,19,33,3,35,19,35,53,51,19,35,53,33,19,51,3,33,19,51, +3,51,21,33,3,33,19,3,128,78,1,4,254,229,88,110,86,254,149,84,110,84,201,225, +78,252,1,18,89,110,88,1,107,88,110,88,211,253,64,80,1,106,78,3,117,254,143, +108,254,104,1,152,254,104,1,152,108,1,113,108,1,152,254,104,1,152,254,104, +108,254,143,1,113,0,3,0,22,255,114,4,82,5,236,0,48,0,59,0,70,1,46,64,92,154, +14,1,154,13,1,150,68,1,133,39,1,138,57,154,57,2,137,53,153,53,2,132,37,1, +118,6,134,6,150,6,3,70,63,86,63,134,63,3,52,38,100,38,116,38,3,37,2,1,25, +27,1,24,34,55,3,47,9,21,65,3,32,48,1,48,48,16,49,30,111,29,41,111,0,49,32, +49,2,0,49,32,49,48,49,80,49,112,49,5,8,3,49,184,255,192,179,29,35,72,49,184, +255,192,64,117,17,22,72,49,4,111,3,64,16,24,72,3,60,111,16,33,66,115,207, +54,1,157,54,1,5,136,54,1,120,10,216,10,2,199,34,215,34,2,182,34,1,135,34, +167,34,2,215,65,1,166,65,1,119,65,1,60,16,65,34,10,54,41,49,8,0,125,30,141, +30,2,26,30,1,30,24,22,64,19,23,72,22,15,21,47,21,63,21,95,21,4,21,55,9,115, +47,148,4,164,4,2,112,4,128,4,2,5,4,21,4,85,4,101,4,4,46,4,0,0,47,50,50,93, +93,93,205,237,50,47,93,205,43,51,51,93,93,18,23,57,93,93,93,93,93,93,93,93, +95,93,93,237,50,1,47,237,214,43,237,47,43,43,95,94,93,113,253,212,237,17, +18,57,47,114,23,51,205,23,50,49,48,93,0,93,93,93,93,93,93,1,93,93,93,0,93, +1,93,37,46,1,39,55,30,3,23,17,39,46,3,53,52,62,2,55,53,51,21,30,3,23,7,46, +1,39,17,30,5,21,20,14,2,7,21,35,1,52,46,2,39,17,62,3,1,20,30,2,23,17,14,3, +2,6,217,245,34,170,11,46,78,113,78,20,77,148,116,71,64,115,158,95,124,100, +145,102,66,20,174,20,122,117,59,114,103,88,64,36,56,114,175,119,124,1,160, +47,81,106,58,65,108,77,42,253,92,40,70,95,55,72,100,61,27,20,9,185,165,37, +53,87,64,39,5,1,240,5,18,50,83,128,98,84,124,83,44,4,131,131,5,45,80,115, +75,33,94,105,11,254,67,14,30,41,56,79,109,72,77,131,100,62,6,162,2,24,63, +80,51,32,15,254,44,4,31,56,81,2,197,54,74,50,33,14,1,165,4,33,52,68,0,0,0, +0,5,0,73,255,244,6,212,5,141,0,19,0,23,0,43,0,63,0,83,0,212,64,11,118,20, +134,20,2,121,22,137,22,2,42,184,255,232,64,14,8,12,72,37,24,8,12,72,32,24, +8,12,72,26,184,255,232,179,8,12,72,17,184,255,232,179,8,12,72,13,184,255, +232,64,18,8,12,72,7,24,8,12,72,3,24,8,12,72,22,23,20,21,21,184,255,240,64, +84,23,16,23,21,23,21,0,39,54,180,10,178,0,180,0,44,16,44,32,44,3,0,44,64, +44,2,0,44,16,44,32,44,80,44,96,44,112,44,224,44,240,44,8,44,64,180,29,178, +74,180,15,39,1,239,39,255,39,2,39,64,10,13,72,39,79,182,34,184,69,182,24, +4,22,3,21,18,49,182,15,184,59,182,5,19,0,63,237,244,237,63,63,63,237,244, +237,1,47,43,113,114,237,244,237,47,93,113,114,253,244,237,17,18,57,57,47, +47,56,56,17,51,17,51,49,48,0,43,43,43,43,43,43,43,43,1,93,93,1,20,14,2,35, +34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2, +53,52,62,2,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,52,46,2,35,34,14, +2,21,20,30,2,51,50,62,2,6,212,51,87,116,66,66,115,85,49,48,86,117,68,66,115, +85,50,251,59,155,3,154,157,251,223,64,114,86,49,50,85,116,66,67,116,85,49, +49,86,118,4,250,22,43,63,40,42,64,44,22,23,43,63,41,39,63,44,24,251,240,22, +42,62,40,43,65,44,22,23,43,64,42,38,62,44,24,1,178,125,171,105,45,45,104, +171,126,133,174,103,41,41,103,174,253,201,5,129,12,41,102,172,131,126,172, +107,46,46,106,172,127,131,172,102,41,252,37,99,131,78,32,33,78,131,98,95, +128,79,34,34,79,128,2,124,98,130,78,32,33,78,130,97,95,130,79,34,34,79,130, +0,0,3,0,72,255,236,5,54,5,137,0,57,0,73,0,89,1,20,64,73,137,1,1,140,36,1, +123,42,139,42,2,98,82,114,82,130,82,3,102,71,1,127,78,1,91,78,1,73,43,89, +43,105,43,3,54,48,134,48,2,37,40,1,44,35,124,35,140,35,3,28,5,44,5,60,5,92, +5,4,10,10,26,10,42,10,3,10,2,26,2,42,2,3,31,184,255,232,64,56,9,13,72,10, +25,26,25,42,25,3,48,41,38,69,4,54,66,73,23,33,73,58,45,44,140,74,1,74,77, +18,3,23,3,58,44,80,23,1,3,44,1,23,58,44,44,58,23,3,13,15,54,1,175,54,1,54, +184,255,192,64,61,9,12,72,54,80,72,63,13,79,13,2,13,143,3,1,141,77,1,98,69, +114,69,2,54,69,70,69,2,3,74,48,41,77,44,38,18,69,9,8,63,81,144,28,1,192,28, +1,15,28,63,28,2,28,85,81,8,22,51,80,0,22,0,63,237,63,237,47,93,93,113,237, +18,23,57,93,93,93,93,1,47,93,237,47,43,93,113,18,23,57,47,47,47,0,93,1,93, +17,18,57,17,23,57,93,16,205,16,237,16,237,17,23,57,49,48,93,43,0,93,93,93, +93,1,93,93,93,0,93,93,93,93,1,93,0,93,93,5,34,38,39,14,3,35,34,46,2,53,52, +62,2,55,46,3,53,52,62,2,51,50,30,2,21,20,14,2,7,30,1,23,62,1,55,23,14,1,7, +30,1,51,50,54,55,21,14,1,1,52,46,2,35,34,6,21,20,22,23,62,3,3,46,1,39,14, +1,21,20,30,2,51,50,62,2,4,169,96,144,58,30,76,93,109,64,117,171,110,53,51, +91,126,75,18,29,22,12,40,85,133,93,73,123,90,50,66,112,148,83,62,146,85,61, +81,29,145,35,107,70,53,106,49,32,59,26,28,75,254,150,27,48,69,42,96,100,37, +28,65,116,86,50,74,89,164,66,113,123,35,72,109,73,44,79,68,55,12,66,61,26, +48,38,23,60,105,143,83,79,129,105,83,33,34,77,78,78,35,66,115,85,49,38,72, +106,68,75,117,92,75,33,114,201,97,90,199,121,43,139,227,103,54,44,7,9,135, +11,11,4,121,37,60,43,23,103,91,59,129,56,26,55,65,79,252,158,105,230,122, +48,148,105,55,95,71,41,19,30,38,0,0,1,0,104,3,198,1,32,5,129,0,3,0,33,64, +19,48,3,1,128,3,1,3,16,2,32,2,2,2,32,0,1,0,2,3,0,63,205,93,1,47,93,205,93, +113,49,48,1,35,3,51,1,10,141,21,184,3,198,1,187,0,1,0,127,254,88,2,158,5, +204,0,22,0,66,64,45,135,13,1,135,9,1,88,20,1,88,2,1,17,24,14,17,72,5,24,14, +17,72,16,6,16,16,6,128,6,2,6,11,242,0,0,16,0,32,0,3,0,16,27,5,0,0,63,63,1, +47,93,237,204,93,56,50,49,48,43,43,93,93,93,93,19,52,62,2,55,51,14,3,21,20, +30,2,23,35,46,3,53,127,42,90,140,97,174,94,137,88,43,43,88,137,94,174,97, +140,90,42,2,20,139,254,234,220,105,105,221,235,254,139,139,254,236,220,105, +105,220,234,253,140,0,0,0,1,0,12,254,88,2,43,5,204,0,22,0,72,64,13,136,13, +1,136,9,1,87,20,1,87,2,1,17,184,255,232,179,14,17,72,5,184,255,232,180,14, +17,72,16,6,184,255,240,64,16,31,6,143,6,2,6,0,242,143,11,1,11,16,0,5,27,0, +63,63,1,47,93,253,204,93,56,50,49,48,43,43,93,93,93,93,1,20,14,2,7,35,62, +3,53,52,46,2,39,51,30,3,21,2,43,42,90,140,97,174,94,137,88,43,43,88,137,94, +174,97,140,90,42,2,16,140,253,234,220,105,105,220,236,254,139,139,254,235, +221,105,105,220,234,254,139,0,0,0,0,1,0,33,2,178,2,253,5,129,0,14,0,107,64, +75,77,5,93,5,109,5,3,75,4,91,4,107,4,3,66,8,82,8,2,67,7,83,7,2,0,6,12,3,13, +95,4,1,15,4,1,4,3,32,2,48,2,2,2,14,47,10,63,10,2,10,9,8,191,13,207,13,2,16, +13,32,13,2,13,240,5,1,223,5,1,0,5,1,5,14,3,0,63,204,93,93,93,1,47,93,93,204, +51,204,93,221,204,93,51,204,113,114,18,23,57,49,48,93,93,93,93,1,37,23,5, +23,7,11,1,39,55,37,55,5,3,51,1,200,1,8,45,254,230,185,119,150,156,119,189, +254,232,45,1,11,12,136,4,90,103,132,73,250,72,1,2,255,0,72,248,73,134,107, +1,41,0,0,0,1,0,100,0,180,4,71,4,158,0,11,0,71,64,46,211,11,1,133,11,1,220, +4,1,138,4,1,9,1,170,6,16,2,32,2,2,2,217,2,1,56,2,136,2,2,2,0,4,173,9,214, +7,1,55,7,135,7,2,7,5,179,0,63,51,93,93,51,237,50,50,93,93,1,47,93,51,237, +50,49,48,93,93,93,93,1,17,35,17,33,53,33,17,51,17,33,21,2,159,147,254,88, +1,168,147,1,168,2,96,254,84,1,172,146,1,172,254,84,146,0,0,1,0,184,254,250, +1,129,0,219,0,12,0,78,185,0,4,255,224,183,11,17,72,10,151,0,150,7,184,255, +192,64,22,9,17,72,7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2, +12,184,255,192,64,14,38,41,72,12,64,13,16,72,12,7,168,0,155,11,0,47,253,228, +1,47,43,43,93,113,114,51,43,253,237,49,48,43,37,21,20,14,2,7,35,62,1,53,35, +53,1,129,9,20,29,20,123,45,49,88,219,168,53,87,75,66,32,65,132,65,219,0,0, +0,0,1,0,91,1,208,2,79,2,112,0,3,0,33,64,20,0,2,64,2,112,2,3,2,0,0,187,159, +1,207,1,2,47,1,1,1,0,47,93,113,237,1,47,47,93,49,48,19,53,33,21,91,1,244, +1,208,160,160,0,0,0,1,0,187,0,0,1,126,0,219,0,3,0,46,64,32,3,150,0,0,144, +0,2,64,0,80,0,176,0,224,0,240,0,5,144,0,160,0,2,0,64,13,16,72,0,1,155,0,0, +47,237,1,47,43,93,113,114,237,49,48,51,53,51,21,187,195,219,219,0,1,0,0,255, +236,2,57,5,204,0,3,0,51,64,26,121,0,137,0,2,1,24,13,17,72,41,2,1,2,16,0,2, +16,2,32,2,128,2,4,2,0,184,255,240,180,0,1,0,0,19,0,63,63,1,47,56,205,93,56, +49,48,93,43,93,21,1,51,1,1,155,158,254,105,20,5,224,250,32,0,0,2,0,80,255, +236,4,35,5,150,0,19,0,39,0,112,64,80,89,37,105,37,2,70,33,86,33,102,33,3, +86,27,102,27,2,89,23,105,23,2,4,18,1,118,17,134,17,2,121,13,137,13,2,11,12, +1,11,8,1,121,7,137,7,2,118,3,134,3,2,4,2,1,7,0,110,64,144,20,160,20,2,20, +41,128,30,110,63,10,1,10,25,115,15,7,35,115,5,25,0,63,237,63,237,1,47,93, +237,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93,93,93,93,93,1,20, +2,14,1,35,34,46,1,2,53,52,18,62,1,51,50,30,1,18,7,52,46,2,35,34,14,2,21,20, +30,2,51,50,62,2,4,35,77,133,180,102,103,178,131,75,75,132,180,106,101,177, +132,76,183,40,78,113,72,76,116,79,40,41,79,114,73,71,114,79,43,2,193,203, +254,235,171,74,74,170,1,21,204,213,1,23,166,67,67,166,254,233,213,168,223, +133,55,56,133,223,167,162,222,135,59,59,135,222,0,1,0,156,0,0,4,15,5,129, +0,10,0,94,64,32,32,9,128,9,2,9,9,8,110,2,144,4,1,4,47,1,143,1,2,1,1,4,6,3, +0,2,16,2,2,7,2,5,184,255,240,64,26,16,22,72,68,5,84,5,100,5,3,5,4,3,16,16, +22,72,4,3,6,6,8,1,116,0,24,0,63,237,50,63,51,51,43,47,51,93,43,1,47,94,93, +23,51,47,93,47,93,16,237,50,47,93,49,48,51,53,33,17,5,53,37,51,17,33,21,156, +1,103,254,194,1,77,166,1,87,153,4,60,227,170,229,251,24,153,0,0,0,1,0,103, +0,0,4,12,5,150,0,40,0,161,64,77,117,4,1,117,26,133,26,2,122,16,138,16,2,101, +37,1,86,37,1,41,33,89,33,105,33,3,105,35,1,28,35,1,25,21,1,117,27,133,27, +2,6,27,1,39,29,110,64,8,64,38,42,72,64,8,1,143,8,1,8,42,128,18,110,19,116, +38,132,38,2,19,38,16,0,32,0,2,0,184,255,192,64,31,30,38,72,0,8,38,142,18, +1,92,18,108,18,124,18,3,10,18,26,18,2,18,13,115,24,7,1,38,116,0,24,0,63,237, +57,63,237,51,93,93,93,18,57,1,47,43,93,51,51,93,47,237,26,16,220,93,113,43, +26,237,50,49,48,93,93,0,93,93,93,93,1,93,93,0,93,93,93,51,53,62,5,53,52,46, +2,35,34,14,2,7,39,62,3,51,50,30,2,21,20,14,6,7,33,21,103,51,147,162,159,128, +79,36,68,95,58,54,95,74,47,7,184,9,66,116,163,107,105,164,113,60,51,85,112, +122,124,109,86,24,2,223,127,117,179,145,124,124,136,86,60,91,62,31,30,60, +89,59,17,76,134,101,58,50,98,144,94,71,128,116,108,103,101,102,105,57,153, +0,0,0,0,1,0,78,255,236,4,25,5,150,0,59,0,216,64,149,122,3,138,3,2,117,2,133, +2,2,117,58,133,58,2,117,51,133,51,2,117,47,133,47,2,117,13,133,13,2,122,37, +138,37,2,91,17,107,17,2,26,41,1,21,8,1,118,46,134,46,2,7,46,1,73,39,1,38, +110,54,25,49,95,25,111,25,2,39,25,39,25,10,19,32,110,49,49,0,110,64,31,19, +47,19,159,19,3,144,19,1,19,61,128,11,110,239,10,1,63,10,1,10,54,25,116,26, +26,16,141,38,1,92,38,108,38,124,38,3,10,38,26,38,2,38,35,115,44,7,16,115, +129,11,1,83,11,99,11,115,11,3,20,11,1,5,11,1,11,5,25,0,63,51,93,93,93,93, +237,63,237,51,93,93,93,18,57,47,237,57,1,47,93,113,237,26,16,220,93,113,26, +237,50,47,237,17,18,57,57,47,47,93,17,18,57,237,113,49,48,0,93,93,93,93,1, +93,0,93,93,1,93,93,93,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53, +52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,14, +2,7,21,30,3,4,25,63,121,179,115,131,179,116,58,9,186,8,43,74,108,74,136,155, +69,103,121,51,102,98,51,110,91,59,133,131,119,147,12,181,11,80,123,158,89, +118,170,108,51,34,72,111,78,85,126,82,41,1,133,97,152,105,55,65,107,137,73, +17,56,92,66,36,134,132,78,95,53,18,156,21,55,94,73,113,131,122,111,14,93, +138,91,45,59,101,136,77,62,108,86,62,16,4,9,59,88,112,0,0,2,0,47,0,0,4,55, +5,129,0,10,0,23,0,117,64,80,154,15,1,153,6,1,136,6,1,133,16,149,16,2,118, +16,1,24,22,1,118,22,134,22,150,22,3,22,5,64,12,21,72,5,91,10,107,10,123,10, +3,10,8,1,111,23,6,31,2,1,112,2,224,2,2,0,2,16,2,48,2,80,2,224,2,5,8,2,0,4, +115,8,22,22,1,11,6,6,1,24,0,63,63,51,18,57,47,51,237,50,1,47,94,93,113,114, +51,51,237,50,50,93,47,43,51,93,113,49,48,93,93,93,93,0,93,1,17,35,17,33,53, +1,51,17,51,21,1,14,3,7,1,14,3,7,33,3,113,170,253,104,2,133,189,198,254,144, +2,16,20,21,8,254,151,5,19,20,20,6,1,242,1,63,254,193,1,63,140,3,182,252,76, +142,3,119,5,29,36,37,12,253,236,8,26,27,26,7,0,1,0,82,255,236,4,29,5,129, +0,44,0,181,64,28,86,13,102,13,134,13,3,85,2,101,2,2,90,3,106,3,2,85,43,101, +43,2,85,42,101,42,2,38,184,255,216,64,89,14,17,72,21,8,1,6,10,1,25,36,153, +36,2,137,36,217,36,2,3,68,33,1,6,35,32,14,17,72,35,11,0,110,64,31,21,1,47, +21,159,21,2,144,21,1,21,46,128,36,31,37,110,33,32,32,11,110,208,10,1,63,10, +1,10,26,115,40,40,16,36,116,33,6,16,115,115,11,131,11,2,103,11,1,22,11,1, +11,5,25,0,63,51,93,93,93,237,63,237,18,57,47,237,1,47,93,113,237,51,47,51, +237,50,50,26,16,220,93,113,114,26,237,17,57,43,49,48,95,113,95,113,114,0, +93,1,93,0,43,93,1,93,0,93,1,93,0,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50, +62,2,53,52,46,2,35,34,14,2,7,35,19,33,21,33,3,62,1,51,50,30,2,4,29,64,126, +187,123,111,165,114,67,14,182,11,40,69,101,72,70,114,81,44,42,78,113,72,45, +76,65,53,23,176,47,3,33,253,131,27,48,144,99,105,168,118,64,1,203,106,176, +127,70,52,91,122,70,21,40,75,59,35,43,84,122,79,65,109,79,44,16,28,37,20, +2,246,153,254,65,37,53,64,117,162,0,0,0,0,2,0,104,255,236,4,25,5,150,0,36, +0,56,0,175,64,48,140,21,1,122,22,138,22,2,89,7,105,7,2,90,3,106,3,122,3,3, +84,2,100,2,2,84,35,100,35,116,35,3,84,34,100,34,116,34,3,53,30,69,30,2,133, +50,1,50,184,255,240,64,45,10,13,72,132,26,1,37,26,53,26,69,26,117,26,4,22, +26,1,21,111,20,20,0,110,64,47,37,159,37,2,144,37,1,37,58,128,47,29,110,16, +10,32,10,2,10,184,255,192,64,24,30,38,72,10,29,42,117,32,32,52,24,115,25, +21,153,21,2,21,15,7,52,115,5,25,0,63,237,63,51,93,237,18,57,47,237,50,1,47, +43,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,93,93,43,93,0,93, +93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,46,1,2,53,52,18,62,1,51,50,30,2, +23,7,46,1,35,34,14,2,21,62,1,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51, +50,62,2,4,25,59,115,170,111,123,184,122,61,69,130,187,118,72,126,103,78,23, +172,28,123,81,74,120,84,45,49,178,115,96,156,111,61,183,36,72,106,70,49,100, +81,51,40,75,106,66,65,103,72,38,1,205,106,177,127,71,94,177,1,1,164,188,1, +28,190,96,30,67,110,80,31,91,81,70,139,210,140,91,95,62,117,167,112,73,118, +83,45,29,65,106,76,78,135,100,58,45,85,122,0,0,1,0,105,0,0,4,12,5,129,0,14, +0,68,64,45,122,11,138,11,2,105,11,1,5,110,6,6,0,80,12,1,16,12,32,12,2,12, +11,95,0,1,0,0,32,0,64,0,96,0,128,0,5,0,0,12,116,13,6,5,24,0,63,63,237,50, +1,47,93,113,51,47,93,113,18,57,47,237,49,48,93,93,1,6,10,2,21,35,52,26,2, +55,33,53,33,4,12,106,178,128,71,188,80,136,180,101,253,11,3,163,4,239,162, +254,213,254,209,254,193,180,169,1,69,1,57,1,46,147,153,0,0,0,0,3,0,89,255, +236,4,26,5,150,0,41,0,61,0,81,0,191,64,132,117,40,133,40,2,117,33,133,33, +2,117,29,133,29,2,117,28,133,28,2,117,24,133,24,2,122,23,138,23,2,122,19, +138,19,2,122,12,1,122,8,138,8,2,122,7,138,7,2,122,3,138,3,2,117,2,133,2,2, +85,69,101,69,2,85,75,101,75,2,90,65,106,65,2,52,110,21,42,110,31,15,36,31, +79,21,1,21,31,21,31,10,0,110,64,15,62,31,62,2,31,62,47,62,159,62,3,144,62, +1,62,83,128,72,110,208,10,1,10,36,15,67,117,57,57,77,47,117,26,7,77,117,5, +25,0,63,237,63,237,18,57,47,237,57,57,1,47,113,237,26,16,220,93,113,114,26, +237,17,57,57,47,47,113,18,57,57,16,237,16,237,49,48,93,93,93,93,0,93,93,1, +93,93,93,93,0,93,93,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3, +53,52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,3,52,46,2,35,34,14,2,21,20,30, +2,51,50,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,26,57,117,182, +124,124,181,119,57,47,79,101,54,59,93,63,33,57,112,166,109,115,169,111,54, +33,63,93,61,61,104,76,44,222,27,62,100,73,71,98,63,28,22,58,102,80,85,103, +55,17,35,28,68,115,86,79,111,69,32,32,70,114,81,82,112,68,29,1,137,90,151, +110,62,62,109,151,89,77,120,87,53,9,4,14,62,87,106,59,74,131,99,57,58,99, +132,74,58,106,87,61,12,4,10,53,87,120,2,76,53,88,63,35,35,63,88,53,42,88, +72,46,46,72,88,253,163,51,95,73,45,45,74,97,52,65,107,77,42,42,77,109,0,0, +0,2,0,96,255,236,4,18,5,150,0,36,0,56,0,190,64,105,169,39,1,163,11,1,149, +12,165,12,2,170,17,1,153,17,1,116,35,132,35,2,116,32,132,32,148,32,3,122, +31,138,31,154,31,3,122,27,138,27,154,27,3,123,26,139,26,155,26,3,90,40,106, +40,2,89,2,105,2,2,16,24,10,13,72,54,8,1,37,0,110,47,19,63,19,2,79,19,191, +19,2,0,19,32,19,48,19,64,19,176,19,5,7,19,58,11,111,10,10,47,110,32,29,1, +29,184,255,192,64,27,32,38,72,29,19,52,115,95,24,111,24,2,24,24,5,42,115, +34,7,14,115,23,11,1,11,5,25,0,63,51,93,237,63,237,17,57,47,93,237,50,1,47, +43,93,237,51,47,237,16,220,94,93,113,114,237,51,49,48,93,43,93,93,0,93,1, +93,93,0,93,93,1,93,93,0,93,93,1,93,1,20,2,14,1,35,34,46,2,39,55,30,1,51,50, +62,2,55,14,3,35,34,46,2,53,52,62,2,51,50,18,7,52,46,2,35,34,14,2,21,20,30, +2,51,50,62,2,4,18,71,132,189,118,81,130,102,72,22,172,28,119,91,73,121,85, +48,2,21,73,93,108,55,96,155,108,59,63,120,175,111,235,242,196,37,73,107,70, +65,104,72,39,35,70,104,69,50,103,83,53,2,221,188,254,229,188,94,33,70,112, +79,27,91,85,69,138,208,140,47,74,51,27,69,124,175,107,109,176,123,66,254, +164,175,78,138,102,59,46,85,122,75,71,122,89,51,34,70,107,0,0,0,0,2,0,187, +0,0,1,126,4,58,0,3,0,7,0,54,64,36,3,7,150,0,0,4,144,4,2,64,4,80,4,224,4,240, +4,4,144,4,160,4,2,4,64,13,16,72,4,5,156,4,0,156,1,15,0,63,237,47,237,1,47, +43,93,113,114,51,237,50,49,48,19,53,51,21,3,53,51,21,187,195,195,195,3,107, +207,207,252,149,207,207,0,0,0,2,0,184,254,250,1,129,4,58,0,12,0,16,0,89,185, +0,4,255,224,64,10,11,17,72,16,10,151,0,150,13,7,184,255,192,64,22,9,17,72, +7,128,12,144,12,2,64,12,80,12,176,12,3,144,12,160,12,2,12,184,255,192,64, +18,38,41,72,12,64,13,16,72,12,13,156,14,15,7,168,0,156,11,0,47,253,228,63, +237,1,47,43,43,93,113,114,51,43,51,253,237,51,49,48,43,37,21,20,14,2,7,35, +62,1,53,35,53,17,53,51,21,1,129,9,20,29,20,123,45,49,88,195,207,156,53,87, +75,66,32,65,132,65,207,2,156,207,207,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106, +185,0,5,255,216,64,17,18,22,72,3,40,18,22,72,0,40,18,22,72,137,0,1,1,184, +255,216,64,51,18,22,72,134,1,1,6,0,2,32,2,80,2,112,2,4,2,32,0,1,0,63,6,127, +6,143,6,3,6,48,2,112,2,128,2,3,2,1,0,15,4,63,4,111,4,159,4,207,4,5,4,0,25, +47,93,51,51,205,93,205,93,1,24,47,93,47,93,51,49,48,0,93,43,93,43,43,43,19, +53,1,21,9,1,21,101,3,227,252,166,3,90,2,59,205,1,162,154,254,146,254,145, +153,0,0,0,0,2,0,100,1,88,4,71,3,236,0,3,0,7,0,70,64,49,7,64,2,96,2,2,0,2, +32,2,112,2,208,2,4,2,4,223,0,1,32,0,1,0,4,173,31,5,47,5,95,5,111,5,223,5, +5,5,0,173,80,1,208,1,2,15,1,1,1,0,47,93,93,237,222,93,237,1,47,93,93,51,47, +93,113,51,49,48,19,53,33,21,1,53,33,21,100,3,227,252,29,3,227,3,88,148,148, +254,0,148,148,0,0,0,0,1,0,101,0,154,4,72,4,170,0,6,0,106,185,0,1,255,216, +64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137,6,1,5,184,255,216,64,51,18, +22,72,134,5,1,0,6,32,6,80,6,112,6,4,6,3,32,0,1,0,6,5,48,4,112,4,128,4,3,4, +63,0,127,0,143,0,3,0,15,2,63,2,111,2,159,2,207,2,5,2,0,25,47,93,205,93,205, +93,51,51,1,24,47,93,51,47,93,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21, +101,3,90,252,166,3,227,154,153,1,111,1,110,154,254,94,205,0,2,0,84,0,0,4, +39,5,150,0,37,0,41,0,137,64,68,117,36,133,36,2,117,35,133,35,2,90,26,106, +26,2,90,21,1,90,14,122,14,138,14,3,90,13,122,13,138,13,3,58,6,74,6,2,9,72, +10,10,176,41,192,41,2,41,150,38,38,19,27,70,28,0,70,0,19,32,19,64,19,144, +19,176,19,5,19,184,255,192,64,23,38,44,72,19,19,33,95,10,143,10,2,10,39,156, +38,76,27,1,27,24,95,33,4,0,63,237,51,93,47,253,198,93,17,57,1,47,43,93,237, +47,237,18,57,47,237,113,51,47,237,49,48,0,93,1,93,93,0,93,93,93,1,93,1,20, +14,6,7,35,62,7,53,52,46,2,35,34,6,7,39,62,3,51,50,30,2,1,53,51,21,4,39,37, +62,79,82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184, +11,67,121,179,122,114,178,123,64,253,143,195,4,8,71,108,85,67,60,58,68,83, +55,69,104,80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103, +148,251,157,201,201,0,0,0,0,2,0,161,254,229,7,110,5,204,0,93,0,114,1,101, +64,255,122,17,138,17,2,117,15,133,15,2,117,27,133,27,2,121,47,137,47,2,116, +38,132,38,2,102,38,1,99,70,1,86,69,102,69,2,123,26,139,26,2,73,26,1,74,56, +90,56,106,56,3,59,102,1,82,63,1,54,63,70,63,2,82,64,1,38,64,54,64,70,64,3, +131,3,1,37,3,53,3,69,3,3,37,2,53,2,69,2,133,2,4,25,8,57,8,2,11,8,1,11,8,27, +8,2,8,32,12,17,72,22,92,102,92,134,92,3,80,58,96,58,2,5,58,21,58,53,58,69, +58,4,137,57,1,93,57,1,10,57,26,57,2,9,7,1,125,52,141,52,2,11,52,75,52,2,10, +22,26,22,42,22,3,104,212,24,37,41,211,10,112,34,132,72,1,72,10,49,80,24,1, +80,24,1,24,10,24,10,82,0,210,64,95,49,111,49,2,143,49,159,49,2,49,116,128, +61,210,0,82,16,82,32,82,3,82,44,213,5,5,107,214,19,99,214,29,36,29,47,19, +63,19,79,19,3,32,29,48,29,64,29,3,19,29,19,29,77,54,214,89,0,149,71,1,71, +66,214,77,0,47,237,51,93,63,237,18,57,57,47,47,93,93,17,51,16,237,16,237, +51,47,237,1,47,93,237,26,16,220,93,113,26,237,18,57,57,47,47,93,114,17,18, +57,93,50,50,16,237,50,16,237,49,48,93,93,93,93,0,93,93,93,1,93,93,93,43,93, +0,93,93,1,93,93,93,0,93,93,1,93,93,0,93,93,1,93,93,0,93,93,1,93,93,93,0,93, +1,93,0,93,1,20,14,2,35,34,46,2,53,52,54,55,35,14,3,35,34,46,2,53,52,62,2, +51,50,30,2,23,51,55,51,3,14,1,21,20,22,51,50,62,2,53,52,46,2,35,34,14,4,21, +20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,62,2,36,51,50,4,22,18, +5,52,46,2,35,34,14,2,21,20,22,51,50,62,2,55,62,1,7,110,67,118,165,97,56,79, +50,22,2,1,6,24,69,93,117,71,84,125,81,40,71,132,185,114,60,96,73,54,18,6, +39,156,116,19,18,43,38,62,107,79,45,83,161,238,156,134,227,184,139,94,48, +86,165,243,158,105,182,152,120,44,55,50,135,166,196,111,190,254,217,203,105, +63,118,170,215,0,255,144,201,1,36,191,92,253,162,34,63,89,56,86,130,87,45, +95,99,69,120,96,70,18,9,14,2,243,144,239,172,96,27,47,64,38,15,43,12,45,89, +69,43,58,103,141,83,120,221,169,102,27,48,67,40,160,254,6,84,120,49,48,46, +81,142,192,112,129,222,162,92,64,116,161,192,219,115,141,238,171,96,33,48, +57,24,112,30,63,52,33,115,206,1,28,169,139,1,0,220,180,128,70,118,200,254, +248,155,50,84,60,33,85,138,173,87,120,136,62,102,132,71,36,80,0,0,0,0,2,0, +4,0,0,5,82,5,129,0,7,0,20,1,18,64,206,102,2,118,2,134,2,3,102,19,118,19,134, +19,3,105,1,121,1,137,1,3,105,20,121,20,137,20,3,115,6,131,6,2,101,6,1,124, +5,140,5,2,106,5,1,122,0,138,0,2,57,0,89,0,105,0,3,117,3,133,3,2,54,3,86,3, +102,3,3,90,4,1,72,4,1,85,7,1,71,7,1,19,2,3,1,20,0,21,6,37,6,53,6,3,6,6,1, +230,6,246,6,2,26,5,42,5,58,5,3,9,5,1,233,5,249,5,2,6,5,13,13,4,26,0,42,0, +58,0,3,9,0,1,233,0,249,0,2,0,16,7,32,7,48,7,3,32,7,1,7,7,22,21,3,37,3,53, +3,3,6,3,1,230,3,246,3,2,3,175,4,191,4,2,4,80,22,176,22,2,48,22,96,22,144, +22,192,22,240,22,5,47,22,1,1,2,95,20,19,19,118,13,1,13,5,3,4,0,18,0,63,50, +63,51,93,57,47,51,237,50,1,93,93,113,47,93,51,93,113,113,17,51,47,93,113, +51,93,113,113,18,57,61,47,51,51,93,113,113,93,113,113,18,57,57,18,57,57,49, +48,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,3,33,3,35,1,51,9,1, +46,3,39,14,3,7,3,33,4,143,161,253,126,162,198,2,63,217,2,54,253,174,16,29, +22,15,1,2,14,23,29,15,180,2,15,1,156,254,100,5,129,250,127,4,2,40,82,67,45, +5,5,46,68,82,40,254,49,0,3,0,168,0,0,4,234,5,129,0,22,0,33,0,46,0,155,64, +108,155,24,171,24,2,147,32,1,133,32,1,147,45,1,117,45,133,45,2,122,36,138, +36,154,36,3,5,11,21,11,37,11,3,6,2,22,2,38,2,3,171,18,1,159,18,1,107,18,123, +18,139,18,3,18,28,13,90,23,64,13,17,72,23,23,41,0,90,64,31,34,47,34,2,175, +34,1,34,48,128,28,41,90,0,6,16,6,64,6,3,7,6,18,40,95,127,28,1,28,28,41,27, +95,7,3,41,95,6,18,0,63,237,63,237,18,57,47,113,237,57,1,47,94,93,237,50,26, +16,220,93,113,26,237,18,57,47,43,237,17,57,93,93,93,49,48,93,93,0,93,93,93, +93,93,93,1,20,14,2,35,33,17,33,50,30,2,21,20,14,2,7,30,3,1,52,38,35,33,17, +33,50,62,2,19,52,46,2,35,33,17,33,50,62,2,4,234,84,142,188,104,253,196,2, +0,117,184,128,67,33,67,101,67,85,131,88,46,254,238,156,148,254,191,1,65,84, +116,72,32,81,49,92,129,80,254,156,1,115,73,123,89,50,1,141,107,151,95,44, +5,129,39,84,129,90,59,104,85,61,15,10,58,90,119,2,66,114,98,254,66,33,61, +86,253,190,67,94,60,28,254,4,24,60,100,0,1,0,104,255,236,5,121,5,150,0,39, +0,173,64,79,121,14,137,14,2,117,13,133,13,2,123,37,139,37,2,106,38,1,124, +36,140,36,2,106,36,1,106,28,1,85,7,1,90,3,1,42,29,106,29,2,134,23,1,42,23, +106,23,2,5,8,21,8,2,5,2,21,2,2,5,91,80,26,96,26,2,175,26,191,26,2,32,26,1, +15,26,1,26,34,16,184,255,192,64,42,7,13,72,16,16,41,32,41,1,79,35,1,35,35, +0,95,31,4,0,15,16,15,2,48,15,64,15,112,15,128,15,192,15,208,15,6,15,15,10, +95,21,19,0,63,237,51,47,93,113,63,237,51,47,93,1,93,17,51,47,43,51,47,93, +93,93,113,237,49,48,93,93,93,93,93,0,93,93,1,93,93,93,93,0,93,93,1,93,1,34, +14,2,21,20,30,2,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50, +4,23,7,46,3,3,24,120,185,125,64,69,129,187,117,82,135,109,86,33,156,38,112, +151,191,118,171,254,255,173,86,91,175,1,0,164,225,1,46,71,181,20,68,102,137, +4,250,80,148,208,127,127,211,152,84,43,78,107,65,78,79,136,100,57,109,195, +1,12,159,165,1,10,187,101,176,173,60,50,91,70,42,0,2,0,168,0,0,5,101,5,129, +0,12,0,25,0,100,64,70,169,24,1,123,24,1,172,23,1,27,23,43,23,59,23,123,23, +4,169,16,1,27,16,43,16,59,16,123,16,4,123,15,1,153,3,1,121,2,1,0,90,64,47, +13,1,13,27,128,64,27,1,20,90,0,6,16,6,64,6,3,7,6,19,95,7,3,20,95,6,18,0,63, +237,63,237,1,47,94,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93, +93,93,93,1,20,2,14,1,35,33,17,33,50,4,22,18,7,52,46,2,35,33,17,33,50,62,2, +5,101,106,184,251,145,253,241,1,210,163,1,19,198,111,192,82,148,206,123,254, +241,1,58,111,189,138,78,2,207,176,254,243,181,93,5,129,81,169,254,252,180, +143,203,130,61,251,177,72,142,212,0,0,1,0,168,0,0,4,254,5,129,0,11,0,77,181, +7,3,7,3,0,10,184,255,192,64,37,7,11,72,10,10,13,5,9,90,0,0,16,0,64,0,3,7, +0,32,13,1,8,95,127,5,1,5,5,9,4,95,1,3,9,95,0,18,0,63,237,63,237,18,57,47, +113,237,1,93,47,94,93,237,50,17,51,47,43,18,57,57,47,47,49,48,51,17,33,21, +33,17,33,21,33,17,33,21,168,4,45,252,146,3,50,252,206,3,151,5,129,156,254, +60,154,254,21,156,0,0,1,0,168,0,0,4,145,5,129,0,9,0,105,185,0,2,255,192,182, +13,24,72,2,2,6,8,184,255,192,64,58,7,12,72,8,8,11,1,5,90,0,6,16,6,64,6,3, +7,6,48,11,1,4,95,239,1,1,15,1,63,1,111,1,127,1,159,1,175,1,207,1,223,1,8, +8,1,64,23,30,72,1,1,5,0,95,7,3,5,18,0,63,63,237,18,57,47,43,94,93,113,237, +1,93,47,94,93,237,50,17,51,47,43,18,57,47,43,49,48,1,17,33,21,33,17,35,17, +33,21,1,103,3,18,252,238,191,3,233,4,229,253,244,158,253,197,5,129,156,0, +1,0,103,255,236,5,160,5,150,0,45,0,185,64,130,134,43,1,106,43,1,66,37,82, +37,2,5,24,21,24,85,24,3,86,23,1,86,19,1,5,18,21,18,85,18,3,122,12,138,12, +2,89,12,105,12,2,106,3,1,106,2,1,73,37,89,37,2,53,29,1,123,13,139,13,2,64, +10,1,10,10,36,92,31,64,33,33,0,127,31,143,31,2,31,47,128,32,47,96,47,128, +47,3,21,91,175,0,191,0,2,32,0,1,15,0,1,0,33,95,240,34,1,34,34,5,26,95,41, +19,16,95,5,48,11,64,11,2,144,11,224,11,2,11,11,5,4,0,63,51,47,93,113,16,237, +63,237,17,57,47,93,237,1,47,93,93,93,237,93,26,16,204,93,17,57,47,26,16,237, +50,47,93,49,48,0,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,19,52,18,54, +36,51,50,30,2,23,7,46,3,35,34,14,2,21,20,30,2,51,50,62,2,55,53,33,53,33,17, +14,3,35,34,36,38,2,103,89,177,1,6,173,130,196,144,100,35,182,26,73,104,137, +88,128,189,124,61,66,130,193,127,83,140,113,86,29,254,91,2,85,47,127,158, +188,107,178,254,246,177,89,2,199,165,1,10,187,101,46,86,123,77,54,52,85,60, +33,80,148,208,127,127,211,153,85,28,45,55,28,254,160,254,26,48,87,66,38,109, +195,1,12,0,0,0,0,1,0,168,0,0,5,32,5,129,0,11,0,103,64,29,11,90,64,8,143,0, +159,0,175,0,223,0,4,0,13,128,64,13,1,64,13,192,13,208,13,224,13,4,13,184, +255,192,64,37,14,17,72,7,3,90,0,4,16,4,64,4,3,7,4,2,95,80,7,1,176,7,224,7, +2,15,7,1,8,7,7,9,5,3,4,0,18,0,63,50,63,51,57,47,94,93,93,113,237,1,47,94, +93,237,50,43,93,113,26,16,220,93,50,26,237,49,48,33,17,33,17,35,17,51,17, +33,17,51,17,4,97,253,6,191,191,2,250,191,2,141,253,115,5,129,253,172,2,84, +250,127,0,0,0,1,0,189,0,0,1,124,5,129,0,3,0,122,64,70,3,90,15,0,1,12,0,0, +1,61,16,0,32,0,208,0,3,96,0,112,0,2,0,0,16,0,64,0,80,0,176,0,5,7,0,175,5, +1,0,5,160,5,176,5,3,0,5,16,5,64,5,80,5,160,5,176,5,192,5,240,5,8,32,5,144, +5,240,5,3,5,184,255,192,179,56,61,72,5,184,255,192,179,45,48,72,5,184,255, +192,182,13,16,72,1,3,0,18,0,63,63,1,43,43,43,93,113,114,93,47,94,93,113,114, +94,93,94,93,237,49,48,51,17,51,17,189,191,5,129,250,127,0,0,0,1,0,32,255, +236,3,104,5,129,0,21,0,124,64,15,137,2,1,130,5,1,123,10,1,100,6,116,6,2,6, +184,255,224,64,66,14,17,72,0,14,32,14,2,128,14,144,14,224,14,240,14,4,14, +14,3,17,90,64,64,12,80,12,96,12,3,111,12,1,12,23,128,15,3,1,3,32,23,1,32, +23,64,23,80,23,96,23,4,14,95,15,3,9,95,0,64,4,1,4,4,0,19,0,63,50,47,93,16, +237,63,237,1,93,113,47,113,26,16,220,93,113,26,237,18,57,47,93,113,49,48, +0,43,1,93,93,93,0,93,5,34,38,39,55,30,3,51,50,54,53,17,33,53,33,17,20,14, +2,1,201,171,219,35,187,10,46,64,78,41,104,120,254,241,1,205,56,107,154,20, +178,192,31,65,93,60,28,143,138,3,69,156,252,35,101,162,115,62,0,1,0,168,0, +0,5,63,5,129,0,11,0,154,64,103,171,1,1,157,1,1,138,8,154,8,2,138,1,154,1, +170,1,3,102,2,1,131,7,147,7,2,100,7,1,157,0,173,0,2,107,0,123,0,139,0,3,89, +0,1,86,10,1,155,10,1,36,10,1,1,10,106,8,250,8,2,8,10,144,9,160,9,2,9,9,0, +11,16,0,11,1,11,11,13,7,2,3,90,0,4,16,4,64,4,3,7,4,7,10,1,2,4,4,8,5,3,0,4, +18,0,63,51,63,51,18,23,57,1,47,94,93,237,50,50,17,51,47,93,56,51,57,47,93, +57,51,113,17,51,49,48,0,93,93,1,93,93,93,93,0,93,93,93,1,93,93,0,93,93,33, +1,7,17,35,17,51,17,1,51,9,1,4,82,253,205,184,191,191,2,167,225,253,168,2, +168,2,168,140,253,228,5,129,253,62,2,194,253,156,252,227,0,0,0,0,1,0,168, +0,0,4,47,5,129,0,5,0,56,64,40,16,4,48,4,2,0,4,16,4,32,4,64,4,96,4,128,4,160, +4,240,4,8,4,3,90,0,0,16,0,64,0,3,7,0,1,3,3,95,0,18,0,63,237,63,1,47,94,93, +237,47,93,113,49,48,51,17,51,17,33,21,168,191,2,200,5,129,251,27,156,0,0, +0,0,1,0,168,0,0,6,2,5,129,0,44,2,44,64,12,152,41,1,151,31,1,12,16,18,24,72, +12,184,255,240,179,13,17,72,13,184,255,240,64,27,18,24,72,40,13,1,13,16,13, +17,72,42,32,33,37,72,42,32,18,28,72,42,32,9,17,72,30,184,255,224,179,33,37, +72,30,184,255,224,179,18,28,72,30,184,255,224,64,255,9,17,72,13,12,36,36, +27,44,92,42,36,0,52,0,2,212,0,1,139,0,155,0,2,4,0,1,8,0,46,139,46,1,116,46, +1,59,46,1,203,46,1,180,46,1,11,46,1,207,171,46,1,52,46,1,32,46,1,20,46,1, +0,46,1,244,46,1,208,46,1,196,46,1,176,46,1,116,46,132,46,164,46,3,96,46,1, +84,46,1,64,46,1,52,46,1,16,46,1,4,46,1,151,240,46,1,180,46,196,46,228,46, +3,160,46,1,116,46,148,46,2,80,46,1,68,46,1,48,46,1,4,46,36,46,2,244,46,1, +224,46,1,180,46,212,46,2,144,46,1,132,46,1,112,46,1,52,46,68,46,100,46,3, +32,46,1,20,46,1,244,46,1,208,46,1,116,46,132,46,164,46,196,46,4,96,46,1,52, +46,84,46,2,16,46,1,4,46,1,103,116,46,148,46,180,46,196,46,228,46,5,80,46, +1,4,46,36,46,68,46,3,20,46,52,46,68,46,100,46,132,46,180,46,212,46,244,46, +8,164,46,196,46,244,46,3,139,46,1,4,46,52,46,84,46,116,46,4,55,64,83,228, +46,1,203,46,1,36,46,68,46,116,46,148,46,180,46,5,11,46,1,212,46,244,46,2, +187,46,1,100,46,132,46,2,75,46,1,20,46,52,46,2,251,46,1,164,46,196,46,228, +46,3,128,46,1,2,64,46,80,46,112,46,3,63,46,1,0,46,32,46,2,30,27,92,0,28,64, +28,2,7,28,6,21,21,184,255,192,64,16,18,37,72,42,21,29,3,75,36,1,0,13,36,3, +28,18,0,63,23,51,93,63,51,51,43,17,51,1,47,94,93,237,50,93,93,93,95,93,93, +93,113,113,113,113,113,114,114,114,114,94,93,93,93,113,114,114,114,94,93, +93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114, +114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,94,93, +93,93,113,113,113,16,220,94,93,93,93,113,50,237,18,57,61,47,51,51,49,48,43, +43,43,43,43,43,43,93,43,43,43,93,93,33,17,52,54,55,54,55,6,7,14,1,7,1,35, +1,46,3,39,38,39,22,23,30,1,21,17,35,17,51,1,30,3,23,62,3,55,1,51,17,5,86, +2,2,2,3,14,15,13,31,15,254,148,134,254,143,6,13,15,15,7,17,16,1,2,2,2,170, +251,1,119,7,20,18,15,3,3,16,21,20,8,1,112,245,3,172,51,106,44,51,48,51,50, +43,97,39,252,64,3,192,15,40,45,47,23,53,57,56,55,47,103,39,252,84,5,129,252, +47,20,63,66,59,16,16,60,66,62,20,3,209,250,127,0,0,0,0,1,0,168,0,0,5,32,5, +129,0,19,0,196,185,0,10,255,224,64,39,12,43,72,54,10,70,10,2,0,32,12,43,72, +41,0,57,0,73,0,3,11,16,29,33,72,11,32,18,28,72,150,11,166,11,2,41,11,1,1, +184,255,240,179,29,33,72,1,184,255,224,64,53,18,28,72,154,1,170,1,2,3,38, +1,1,19,92,0,68,16,84,16,148,16,3,224,16,1,2,0,16,48,16,64,16,112,16,192,16, +208,16,6,16,64,21,1,64,21,192,21,208,21,224,21,4,21,184,255,192,64,16,14, +17,72,10,7,92,0,8,16,8,64,8,3,7,8,1,184,255,192,64,16,29,43,72,17,1,9,3,11, +64,29,43,72,11,0,8,18,0,63,51,51,43,63,51,51,43,1,47,94,93,237,50,43,93,113, +47,93,95,93,113,51,237,49,48,0,93,95,93,43,43,93,93,43,43,1,93,43,93,43,33, +1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,4,58,253,14,2,3,2,3, +170,222,2,250,3,3,2,4,172,4,176,49,48,41,91,35,252,88,5,129,251,72,49,49, +42,99,45,3,156,250,127,0,0,0,0,2,0,97,255,236,5,215,5,150,0,19,0,39,0,108, +64,74,91,37,1,26,37,1,9,37,1,82,33,1,21,33,1,7,33,1,84,27,1,21,27,1,91,23, +1,25,23,1,102,17,1,104,12,1,0,91,64,15,20,1,20,41,128,32,41,128,41,2,30,91, +175,10,191,10,2,32,10,1,15,10,31,10,2,10,25,95,15,4,35,95,5,19,0,63,237,63, +237,1,47,93,93,93,237,93,26,16,220,113,26,237,49,48,93,93,93,93,93,93,93, +93,93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,215,95,180,254,252,165,174,254,250, +174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63,65, +127,189,123,132,191,123,59,2,199,165,254,242,192,104,109,195,1,12,159,165, +1,10,187,101,102,188,254,246,163,127,208,148,80,80,148,208,127,127,211,153, +85,86,153,212,0,2,0,168,0,0,4,234,5,129,0,14,0,23,0,117,64,83,169,2,1,147, +23,1,155,16,171,16,2,10,3,26,3,42,3,3,5,12,21,12,37,12,3,0,90,64,15,25,128, +64,25,1,64,25,1,20,7,90,0,8,16,8,64,8,3,8,6,95,31,20,47,20,79,20,95,20,127, +20,5,15,20,207,20,255,20,3,7,20,64,9,17,72,20,20,7,19,95,9,3,7,18,0,63,63, +237,18,57,47,43,94,93,113,237,1,47,93,237,50,93,113,26,16,220,26,237,49,48, +0,93,93,93,93,93,1,20,14,2,35,33,17,35,17,33,50,30,2,7,52,38,35,33,17,33, +50,54,4,234,61,121,182,121,254,98,191,2,81,125,186,124,62,192,164,164,254, +133,1,131,165,155,3,217,92,159,117,68,253,219,5,129,61,111,157,97,134,139, +253,212,146,0,0,0,2,0,97,254,125,5,215,5,150,0,36,0,56,0,162,64,113,108,20, +124,20,140,20,3,104,24,1,104,29,1,101,34,1,87,6,1,85,49,1,90,39,1,90,45,1, +108,19,124,19,140,19,3,26,19,90,19,2,26,40,90,40,2,21,44,85,44,2,26,54,90, +54,2,8,54,1,21,50,85,50,2,7,50,1,13,13,22,5,27,0,91,64,15,37,1,37,58,128, +47,91,175,27,191,27,2,32,27,1,15,27,31,27,2,27,32,58,128,58,2,42,95,32,4, +52,95,5,22,19,10,95,17,0,47,237,63,51,237,63,237,1,93,47,93,93,93,237,26, +16,220,113,26,237,17,57,57,50,47,49,48,93,93,93,93,93,93,0,93,93,93,93,93, +1,93,93,93,0,93,93,1,20,14,2,7,30,3,51,50,54,55,21,14,1,35,34,46,2,39,46, +2,2,53,52,18,54,36,51,50,4,22,18,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62, +2,5,215,77,145,211,134,21,53,68,83,51,28,64,23,38,91,49,86,128,97,70,27,158, +239,159,80,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127,63, +65,127,189,123,132,191,123,59,2,199,149,247,186,117,18,64,90,57,27,8,5,134, +9,13,51,95,138,87,8,115,193,1,3,152,165,1,10,187,101,102,188,254,246,163, +127,208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,0,0,2,0,168,0,0, +5,104,5,129,0,17,0,30,0,210,64,62,169,13,1,138,20,154,20,170,20,3,148,29, +1,117,29,133,29,2,174,0,1,157,0,1,124,0,140,0,2,74,0,90,0,106,0,3,3,160,1, +1,114,1,130,1,146,1,3,2,99,1,1,64,1,1,51,1,1,37,1,1,3,16,184,255,112,64,87, +17,73,112,16,128,16,144,16,3,84,16,100,16,2,66,16,1,2,35,16,51,16,2,1,16, +16,25,18,90,11,11,0,0,17,48,17,64,17,96,17,144,17,160,17,6,17,64,32,144,32, +160,32,3,25,3,90,0,4,16,4,64,4,3,7,4,16,2,95,47,25,95,25,111,25,143,25,4, +25,25,0,24,95,5,3,4,0,18,0,63,50,63,237,18,57,47,93,237,50,1,47,94,93,237, +50,93,47,93,51,57,47,237,18,57,17,51,49,48,93,95,93,93,93,43,95,93,93,93, +93,95,93,93,95,93,93,93,93,0,93,93,93,93,33,1,33,17,35,17,33,50,30,2,21,20, +14,2,7,1,3,52,46,2,35,33,17,33,50,62,2,4,140,254,146,254,73,191,2,151,120, +185,126,66,39,84,130,91,1,144,248,44,84,120,76,254,59,1,205,82,120,77,37, +2,73,253,183,5,129,55,104,150,94,67,130,108,78,16,253,161,3,236,64,94,63, +31,253,248,41,72,98,0,0,0,0,1,0,93,255,236,4,248,5,150,0,63,0,226,64,110, +150,62,1,68,62,1,166,59,1,134,54,1,132,49,1,151,40,1,169,33,1,11,33,27,33, +43,33,155,33,4,89,29,169,29,2,139,17,1,139,7,1,150,2,1,4,2,20,2,2,132,58, +1,96,54,1,105,21,1,118,17,1,42,90,41,41,0,90,64,176,19,1,19,65,128,9,90,8, +64,16,19,72,8,8,52,90,0,31,16,31,64,31,3,7,31,19,16,19,22,72,120,19,136,19, +152,19,3,59,19,1,52,184,255,240,64,47,19,22,72,119,52,135,52,151,52,3,58, +52,1,19,52,5,47,95,111,42,1,89,42,1,75,42,1,6,42,1,42,36,4,14,95,96,9,1,82, +9,1,68,9,1,9,5,19,0,63,51,93,93,93,237,63,51,93,93,93,93,237,18,57,57,93, +93,43,93,93,43,1,47,94,93,237,51,47,43,237,26,16,220,93,26,237,50,47,237, +49,48,0,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,20,14,2,35, +32,36,39,55,30,3,51,50,62,2,53,52,46,2,39,46,5,53,52,62,2,51,50,30,2,23,7, +46,3,35,34,14,2,21,20,30,2,23,30,5,4,248,69,144,219,150,254,249,254,218,40, +185,14,58,99,146,102,85,142,102,57,63,114,158,96,59,119,109,96,70,40,81,144, +196,114,131,186,128,77,23,188,14,53,86,123,83,98,133,81,35,63,108,142,80, +65,129,118,103,76,43,1,133,89,150,109,61,184,174,37,55,90,65,36,29,60,95, +66,69,86,56,38,22,13,31,43,58,81,107,70,100,143,92,42,41,82,121,80,33,51, +80,54,28,35,60,81,47,63,81,54,36,18,15,31,43,58,84,114,0,0,0,1,0,46,0,0,4, +180,5,129,0,7,1,212,64,255,9,9,1,201,9,217,9,249,9,3,187,9,1,73,9,89,9,121, +9,137,9,4,59,9,1,9,9,25,9,2,246,9,1,153,9,201,9,2,139,9,1,9,9,25,9,73,9,105, +9,4,199,217,9,233,9,2,203,9,1,182,9,1,41,9,89,9,105,9,137,9,153,9,5,27,9, +1,6,9,1,25,9,41,9,89,9,121,9,153,9,169,9,217,9,7,233,9,249,9,2,219,9,1,169, +9,1,150,9,1,57,9,105,9,2,45,9,1,1,11,9,1,151,107,9,123,9,139,9,171,9,187, +9,235,9,251,9,7,84,9,1,11,9,43,9,59,9,3,187,9,251,9,2,164,9,1,59,9,75,9,123, +9,3,36,9,1,139,9,155,9,187,9,203,9,251,9,5,127,9,1,2,79,9,95,9,2,48,9,1,15, +9,1,103,207,9,223,9,2,176,9,1,15,9,79,9,95,9,143,9,4,240,9,1,159,9,175,9, +207,9,223,9,4,112,9,1,95,9,1,64,9,1,31,9,1,31,9,63,9,95,9,111,9,159,9,223, +9,239,9,7,0,9,1,55,239,9,1,128,64,93,9,144,9,208,9,3,111,9,1,80,9,1,47,9, +1,0,9,1,208,9,1,175,9,1,144,9,1,111,9,127,9,2,16,9,32,9,64,9,80,9,4,255,9, +1,224,9,1,191,9,1,64,9,96,9,144,9,160,9,4,63,9,1,32,9,1,15,9,1,7,3,5,4,14, +1,90,2,64,2,7,14,112,7,160,7,176,7,3,32,7,128,7,2,7,184,255,192,64,15,23, +28,72,7,32,2,1,2,0,4,95,5,3,1,18,0,63,63,237,50,1,47,93,204,43,93,113,43, +1,26,24,16,77,253,228,50,95,94,93,93,93,93,93,93,93,113,113,113,113,113,114, +114,114,114,114,114,94,93,93,113,113,113,113,113,113,114,114,114,94,93,93, +93,95,93,93,113,113,113,113,114,114,114,94,93,95,93,93,93,93,93,93,113,114, +114,114,114,114,114,94,93,93,93,93,113,113,113,113,113,114,49,48,1,17,35, +17,33,53,33,21,2,208,190,254,28,4,134,4,229,251,27,4,229,156,156,0,0,0,0, +1,0,158,255,236,5,41,5,129,0,25,0,136,64,61,89,23,105,23,2,89,3,105,3,2,89, +2,105,2,2,69,16,1,69,10,1,21,90,64,64,18,80,18,160,18,3,48,18,144,18,240, +18,3,143,18,159,18,175,18,3,18,27,128,64,27,1,64,27,192,27,208,27,224,27, +4,27,184,255,192,64,36,14,17,72,8,90,79,5,95,5,111,5,3,143,5,159,5,2,207, +5,1,0,5,16,5,64,5,3,7,5,19,6,3,13,95,0,19,0,63,237,63,51,1,47,94,93,93,113, +114,237,43,93,113,26,16,220,93,113,114,26,237,49,48,0,93,93,93,93,93,5,34, +46,2,53,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,14,2,2,219,116,208,157, +92,191,57,102,139,83,82,146,110,63,190,93,160,215,20,62,131,201,138,3,129, +252,143,107,149,94,43,44,96,155,111,3,100,252,145,141,207,136,66,0,1,0,9, +0,0,5,77,5,129,0,16,0,235,64,181,74,14,90,14,106,14,3,69,4,85,4,101,4,3,140, +15,1,58,15,90,15,106,15,122,15,4,131,3,1,53,3,85,3,101,3,117,3,4,116,0,132, +0,2,9,0,1,140,1,1,123,1,1,6,1,1,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0, +37,0,53,0,3,6,0,1,230,0,246,0,2,1,0,9,9,2,26,15,42,15,58,15,3,3,8,15,1,232, +15,248,15,2,15,52,16,84,16,2,32,16,1,2,16,16,1,48,16,96,16,144,16,192,16, +240,16,5,16,21,3,37,3,53,3,3,6,3,1,230,3,246,3,2,3,175,2,191,2,2,2,32,18, +80,18,2,48,18,96,18,144,18,192,18,240,18,5,47,18,1,15,2,3,121,9,1,9,1,18, +0,63,51,93,63,51,1,93,93,113,47,93,51,93,113,113,47,93,113,95,113,113,51, +93,113,95,113,18,57,61,47,51,51,93,113,113,93,113,113,49,48,93,93,93,93,93, +93,93,93,93,93,93,33,35,1,51,1,30,1,23,22,23,54,55,62,1,55,1,51,3,14,198, +253,193,201,1,134,15,30,12,14,13,12,14,12,29,17,1,132,201,5,129,252,32,45, +89,35,41,39,37,41,35,88,48,3,224,0,0,1,0,9,0,0,7,134,5,129,0,46,4,87,64,73, +121,44,1,117,17,1,123,2,139,2,2,73,2,1,116,12,132,12,2,70,12,1,122,30,138, +30,2,73,30,89,30,105,30,3,117,31,133,31,2,71,31,87,31,103,31,3,142,45,1,91, +45,107,45,123,45,3,129,16,1,100,16,116,16,2,85,16,1,1,32,13,17,72,13,184, +255,224,64,255,13,17,72,131,0,1,117,0,1,68,0,84,0,100,0,3,54,0,1,140,14,1, +122,14,1,75,14,91,14,107,14,3,14,16,9,12,72,26,14,42,14,58,14,3,9,14,1,233, +14,249,14,2,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,14,13,22,26,30,42, +30,58,30,3,9,30,1,233,30,249,30,2,21,31,37,31,53,31,3,6,31,1,230,31,246,31, +2,31,30,7,26,1,42,1,58,1,3,9,1,1,233,1,249,1,2,21,0,37,0,53,0,3,6,0,1,230, +0,246,0,2,1,0,39,123,39,1,116,22,132,22,2,22,7,39,39,7,22,3,15,26,45,42,45, +58,45,3,3,8,45,1,232,45,248,45,2,45,219,46,1,207,46,1,187,46,1,175,46,1,155, +46,1,143,46,1,123,46,1,111,46,1,91,46,1,79,46,1,2,79,46,143,46,175,46,3,46, +64,25,28,72,32,46,48,46,2,15,46,1,9,46,5,16,1,229,16,245,16,2,182,16,198, +16,214,16,3,3,16,8,15,56,15,120,15,136,15,152,15,184,15,6,12,15,64,64,255, +25,38,72,15,119,48,151,48,215,48,3,54,48,70,48,86,48,3,23,48,39,48,2,6,48, +1,55,48,103,48,119,48,167,48,183,48,199,48,231,48,247,48,8,38,48,1,7,48,23, +48,2,201,199,48,215,48,231,48,3,120,48,152,48,168,48,184,48,4,105,48,1,40, +48,56,48,88,48,3,25,48,1,7,48,1,232,48,1,217,48,1,168,48,200,48,2,153,48, +1,138,48,1,88,48,104,48,2,73,48,1,55,48,1,8,48,24,48,2,231,48,1,200,48,1, +167,48,1,8,48,24,48,40,48,72,48,136,48,5,153,199,48,1,88,48,104,48,136,48, +152,48,168,48,5,73,48,1,40,48,1,9,48,25,48,2,216,48,232,48,2,203,48,1,154, +48,170,48,186,48,3,139,48,1,48,192,124,127,72,57,48,1,42,48,1,25,48,1,10, +48,1,249,48,1,234,48,1,217,48,1,202,48,1,184,48,1,137,48,153,48,169,48,3, +120,48,1,105,48,1,58,48,74,48,90,48,3,41,48,1,26,48,1,12,48,1,104,253,48, +1,236,48,1,221,48,1,204,48,1,64,255,189,48,1,171,48,1,156,48,1,139,48,1,124, +48,1,107,48,1,92,48,1,75,48,1,60,48,1,43,48,1,28,48,1,11,48,1,252,48,1,235, +48,1,220,48,1,203,48,1,188,48,1,171,48,1,156,48,1,0,141,48,1,127,48,1,109, +48,1,95,48,1,77,48,1,47,48,63,48,2,29,48,1,15,48,1,253,48,1,239,48,1,221, +48,1,207,48,1,189,48,1,175,48,1,157,48,1,143,48,1,109,48,125,48,2,91,48,1, +77,48,1,59,48,1,45,48,1,27,48,1,13,48,1,56,251,48,1,237,48,1,219,48,1,205, +48,1,187,48,1,173,48,1,155,48,1,141,48,1,123,48,1,109,48,1,75,48,91,48,2, +57,48,1,43,48,1,25,48,1,11,48,1,249,48,1,235,48,1,221,48,1,203,48,1,189,48, +1,171,48,1,157,48,1,139,48,1,125,48,1,107,48,1,93,48,1,75,48,1,61,48,1,1, +43,48,1,31,48,1,2,95,48,127,48,159,48,191,48,223,48,255,48,6,0,48,1,8,68, +7,84,7,2,7,30,45,3,15,3,39,64,15,22,123,22,139,22,2,22,32,9,14,72,22,1,14, +18,0,63,51,51,43,93,17,51,63,23,51,93,1,94,93,93,95,113,113,95,113,113,113, +113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114, +114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,113, +113,113,113,113,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114, +114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93, +93,93,93,93,113,113,113,113,43,113,113,113,113,114,114,114,114,114,94,93, +93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93, +93,93,113,113,113,113,47,43,94,93,51,95,93,93,113,47,94,93,93,43,93,95,113, +113,113,113,113,113,113,113,113,113,51,93,113,95,113,18,23,57,61,47,47,47, +93,93,17,51,51,93,113,113,93,113,113,17,51,51,93,113,113,93,113,113,17,51, +51,93,113,113,93,113,113,49,48,43,93,93,93,93,93,93,93,43,43,93,93,93,93, +93,93,93,93,93,93,93,93,93,93,93,33,35,3,46,1,39,38,39,6,7,14,1,7,3,35,1, +51,19,30,1,23,22,23,54,55,62,3,55,19,51,19,30,3,23,22,23,50,62,2,55,19,51, +5,231,228,244,11,25,10,12,12,13,12,11,24,11,246,228,254,97,199,253,17,31, +11,13,11,15,16,7,14,15,15,6,245,183,245,6,15,15,14,7,16,15,1,16,24,29,15, +249,199,3,127,38,104,47,55,57,58,55,48,102,38,252,129,5,129,252,129,63,124, +49,58,52,69,67,28,62,60,55,23,3,109,252,147,23,55,59,62,28,67,70,69,104,121, +52,3,127,0,0,1,0,46,0,0,5,43,5,129,0,11,2,119,64,255,92,4,1,73,4,1,59,4,1, +38,11,1,75,0,91,0,2,41,0,57,0,2,68,2,84,2,2,38,2,54,2,2,9,3,25,3,41,3,3,81, +10,1,69,10,1,51,10,1,6,10,22,10,2,93,8,1,76,8,1,43,8,59,8,2,9,8,25,8,2,82, +6,1,67,6,1,3,38,6,54,6,2,7,6,23,6,2,12,219,13,1,196,13,1,171,13,1,144,13, +1,132,13,1,96,13,1,84,13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13, +1,160,13,1,148,13,1,112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,204, +224,13,1,212,13,1,176,13,1,164,13,1,128,13,1,116,13,1,80,13,1,68,13,1,32, +13,1,20,13,1,36,13,84,13,132,13,180,13,228,13,5,4,13,52,13,100,13,148,13, +196,13,244,13,6,156,52,13,100,13,148,13,196,13,244,13,5,11,13,1,27,13,75, +13,123,13,171,13,219,13,5,139,13,187,13,235,13,3,4,13,20,13,52,13,68,13,4, +106,84,13,100,13,132,13,148,64,156,13,180,13,196,13,228,13,244,13,8,59,13, +1,36,13,1,11,13,1,244,13,1,219,13,1,196,13,1,171,13,1,148,13,1,123,13,1,100, +13,1,48,13,1,36,13,1,0,13,1,244,13,1,208,13,1,196,13,1,160,13,1,148,13,1, +112,13,1,100,13,1,64,13,1,52,13,1,16,13,1,4,13,1,57,224,13,1,212,13,1,176, +13,1,164,13,1,128,13,1,20,13,68,13,116,13,3,36,13,84,13,132,13,180,13,228, +13,5,84,13,100,13,148,13,244,13,4,64,13,1,2,0,13,48,13,2,6,8,10,7,1,4,4,9, +5,9,5,9,3,0,11,16,192,11,240,11,2,11,184,255,192,64,16,26,30,72,175,11,1, +144,11,1,127,11,1,0,11,1,11,184,255,192,181,11,15,72,11,2,3,184,255,240,64, +41,16,3,32,3,2,224,3,240,3,2,31,3,175,3,191,3,207,3,4,3,114,7,1,52,7,68,7, +84,7,3,4,7,10,1,4,8,5,3,3,0,18,0,63,50,63,51,23,57,93,93,1,47,93,93,113,56, +51,47,43,93,93,93,93,43,93,56,51,18,57,57,47,47,18,23,57,50,51,93,95,93,93, +113,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93,93,113,113,113, +113,113,113,113,113,113,113,114,114,114,114,94,93,93,113,114,114,94,93,113, +114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,93, +93,113,113,113,113,113,113,113,113,113,113,49,48,94,93,93,95,93,93,93,93, +93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,33,9,1,35,9,1,51,9,1,51,9,1, +4,88,254,89,254,80,211,2,24,254,17,211,1,136,1,125,211,254,30,2,11,2,104, +253,152,2,220,2,165,253,215,2,41,253,98,253,29,0,0,0,1,0,45,0,0,5,41,5,129, +0,8,2,83,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5,1,3,5,1,16,3,5,184,255,232, +64,255,12,15,72,5,4,14,2,1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8, +6,1,90,38,2,86,2,150,2,3,118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,10,169, +10,201,10,3,86,10,1,9,10,57,10,2,25,10,89,10,137,10,249,10,4,6,10,1,202,249, +10,1,230,10,1,9,10,25,10,185,10,201,10,4,198,10,1,89,10,121,10,169,10,3,54, +10,1,41,10,57,10,185,10,233,10,4,11,10,1,153,249,10,1,198,10,214,10,2,178, +10,1,164,10,1,150,10,1,130,10,1,116,10,1,86,10,102,10,2,66,10,1,36,10,52, +10,2,18,10,1,4,10,1,244,10,1,230,10,1,196,10,212,10,2,166,10,182,10,2,146, +10,1,132,10,1,118,10,1,98,10,1,84,10,1,54,10,70,10,2,36,10,1,22,10,1,4,10, +1,242,10,1,1,208,10,224,10,2,196,10,1,160,10,176,10,2,148,10,1,112,10,1,100, +10,1,64,10,1,20,10,36,10,52,10,3,0,10,1,105,228,10,244,10,2,208,10,64,182, +1,164,10,180,10,196,10,3,128,10,144,10,2,116,10,1,80,10,96,10,2,68,10,1,32, +10,1,4,10,20,10,2,244,10,1,224,10,1,196,10,212,10,2,176,10,1,84,10,100,10, +116,10,148,10,164,10,5,48,10,64,10,2,36,10,1,0,10,1,196,10,244,10,2,144,10, +1,4,10,20,10,36,10,68,10,84,10,116,10,132,10,7,57,224,10,1,132,10,164,10, +212,10,3,112,10,1,4,10,36,10,52,10,84,10,100,10,5,228,10,244,10,2,192,10, +1,180,10,1,144,10,1,4,10,20,10,52,10,84,10,132,10,5,212,10,228,10,2,187,10, +1,164,10,1,112,10,1,2,48,10,96,10,2,15,10,47,10,2,0,3,59,3,75,3,123,3,3,3, +1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,1,93,93,95,93,93,93,93,113,113,113, +113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113,113,114,114, +114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93,93,95,93,113,113,113, +113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114, +114,114,114,94,93,93,113,113,113,114,114,114,94,93,93,113,113,113,47,94,93, +93,93,113,253,57,206,94,93,93,50,43,1,24,16,77,230,50,49,48,43,95,94,93,93, +43,93,93,1,17,35,17,1,51,9,1,51,3,9,190,253,226,210,1,173,1,171,210,2,72, +253,184,2,72,3,57,253,97,2,159,0,0,0,0,1,0,65,0,0,4,163,5,129,0,9,0,122,64, +35,100,4,116,4,132,4,3,109,3,125,3,141,3,3,91,3,1,41,3,57,3,73,3,3,114,8, +130,8,2,84,8,100,8,2,8,184,255,240,64,9,10,13,72,9,3,16,7,1,7,184,255,192, +64,18,12,17,72,7,8,4,15,2,31,2,2,2,64,12,15,72,2,11,184,255,192,64,14,13, +17,72,7,3,4,95,5,3,2,8,95,1,18,0,63,237,50,63,237,50,50,1,43,47,43,93,51, +51,47,43,93,51,51,49,48,43,93,93,93,93,93,93,41,1,53,1,33,53,33,21,1,33,4, +163,251,158,3,90,252,239,3,234,252,166,3,137,143,4,86,156,139,251,166,0,0, +1,0,146,254,87,2,41,5,204,0,7,0,49,64,30,7,48,2,1,224,2,1,2,4,241,63,1,1, +143,1,191,1,2,32,1,1,1,4,245,1,0,5,245,0,27,0,63,237,63,237,1,47,93,93,113, +237,205,93,113,50,49,48,19,17,33,21,35,17,51,21,146,1,151,233,233,254,87, +7,117,129,249,141,129,0,1,0,0,255,236,2,57,5,204,0,3,0,71,64,40,120,1,136, +1,2,0,24,13,17,72,9,3,25,3,73,3,3,70,2,1,10,2,26,2,42,2,3,3,16,0,3,16,3,32, +3,128,3,4,3,1,184,255,240,183,143,1,1,1,1,0,0,19,0,63,63,1,47,93,56,205,93, +56,49,48,93,93,93,43,93,5,1,51,1,1,151,254,105,158,1,155,20,5,224,250,32, +0,0,0,0,1,0,16,254,87,1,167,5,204,0,7,0,49,64,31,4,63,0,1,239,0,1,0,7,241, +64,2,80,2,2,192,2,208,2,224,2,3,2,4,245,5,0,1,245,0,27,0,63,237,63,237,1, +47,93,113,253,205,93,113,50,49,48,19,53,51,17,35,53,33,17,16,233,233,1,151, +254,87,129,6,115,129,248,139,0,1,0,10,2,161,3,183,5,129,0,6,2,243,181,0,24, +18,22,72,2,184,255,232,179,18,22,72,5,184,255,232,64,47,18,22,72,118,5,134, +5,2,4,24,18,22,72,121,4,137,4,2,3,54,6,70,6,2,102,6,118,6,134,6,230,6,4,6, +6,22,6,38,6,70,6,86,6,102,6,6,6,184,255,192,179,48,65,72,6,184,255,192,64, +57,18,22,72,6,5,4,57,3,73,3,2,105,3,121,3,137,3,3,9,3,25,3,41,3,89,3,105, +3,5,9,3,64,18,22,72,3,6,1,22,1,134,1,3,57,38,1,54,1,70,1,246,1,4,230,1,1, +1,184,255,192,182,60,63,72,153,1,1,1,184,255,224,64,255,30,33,72,56,1,72, +1,2,39,1,1,22,1,1,183,1,199,1,2,6,1,70,1,86,1,102,1,150,1,166,1,6,9,1,6,8, +1,246,8,1,164,8,1,121,8,1,6,8,1,246,8,1,201,8,217,8,2,187,8,1,9,8,25,8,41, +8,169,8,4,201,201,8,217,8,2,54,8,118,8,134,8,150,8,4,153,8,233,8,2,102,8, +118,8,2,9,8,25,8,57,8,3,198,8,1,139,8,1,57,8,73,8,121,8,3,43,8,1,4,8,1,152, +228,8,244,8,2,208,8,1,162,8,178,8,194,8,3,132,8,148,8,2,82,8,98,8,114,8,3, +64,8,1,50,8,1,36,8,1,2,8,18,8,2,228,8,244,8,2,214,8,1,196,8,1,146,8,162,8, +178,8,3,116,8,132,8,2,102,8,1,50,8,66,8,82,8,3,20,8,36,8,2,6,8,1,242,8,1, +212,8,228,8,2,166,8,182,8,2,130,8,146,8,2,100,8,116,8,2,86,8,1,52,8,68,8, +2,32,8,1,4,8,20,8,2,104,230,8,246,8,2,192,8,1,146,8,162,8,64,24,178,8,3,116, +8,132,8,2,82,8,98,8,2,52,8,68,8,2,22,8,38,8,2,8,184,255,128,64,24,85,88,72, +182,8,198,8,2,132,8,148,8,164,8,3,102,8,118,8,2,68,8,1,8,184,255,192,182, +72,75,72,228,8,1,8,184,255,192,64,12,66,69,72,148,8,1,114,8,130,8,2,8,184, +255,128,64,120,59,62,72,18,8,34,8,2,1,0,8,1,56,240,8,1,212,8,228,8,2,176, +8,1,100,8,132,8,148,8,164,8,4,64,8,80,8,2,36,8,52,8,2,228,8,244,8,2,171,8, +187,8,2,116,8,132,8,148,8,3,75,8,1,52,8,1,11,8,1,235,8,251,8,2,208,8,1,196, +8,1,176,8,1,132,8,148,8,164,8,3,96,8,112,8,2,2,0,8,16,8,64,8,80,8,4,8,34, +1,1,3,1,19,1,2,1,4,3,3,3,0,0,47,50,47,63,51,93,93,1,94,93,95,93,93,93,93, +93,93,113,113,113,113,113,113,114,114,114,114,114,114,94,93,95,93,43,93,93, +43,93,43,113,113,113,113,43,114,114,114,114,114,114,114,94,93,93,93,93,93, +93,93,93,93,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114, +114,114,94,93,93,93,93,93,113,113,113,114,114,94,93,93,93,93,113,113,113, +113,114,25,47,94,93,93,113,113,113,43,113,43,113,114,94,93,205,43,94,93,113, +114,51,51,205,43,43,93,113,114,49,48,95,93,43,93,43,43,43,9,2,35,1,51,1,3, +19,254,203,254,206,162,1,112,203,1,114,2,161,2,121,253,135,2,224,253,32,0, +0,0,0,1,255,225,254,105,4,138,254,235,0,3,0,35,64,23,16,2,96,2,128,2,160, +2,208,2,5,96,2,128,2,240,2,3,2,0,0,186,1,0,47,237,1,47,47,93,113,49,48,3, +53,33,21,31,4,169,254,105,130,130,0,1,0,106,4,177,2,18,5,228,0,5,0,47,64, +31,117,3,133,3,2,64,4,128,4,2,4,64,16,1,1,1,2,149,128,15,0,47,0,63,0,127, +0,239,0,5,0,0,47,93,26,237,1,47,93,26,205,93,49,48,93,9,1,53,51,19,21,1,180, +254,182,207,217,4,177,1,22,29,254,225,20,0,0,0,0,2,0,87,255,236,4,115,4,78, +0,50,0,65,0,161,64,50,121,61,137,61,2,121,12,137,12,2,2,40,9,13,72,10,5,26, +5,2,43,24,9,17,72,5,28,21,28,2,37,37,30,70,64,46,9,111,56,127,56,143,56,3, +56,67,128,20,71,21,184,255,192,64,20,21,28,72,21,21,63,71,31,3,1,3,48,67, +192,67,2,160,67,1,67,184,255,192,64,32,30,35,72,33,81,40,22,57,81,9,9,26, +51,95,20,1,47,20,143,20,2,20,20,15,80,26,16,46,51,80,0,22,0,63,237,50,63, +237,51,47,93,113,17,18,57,47,237,63,237,1,43,93,113,47,93,237,51,47,43,237, +26,16,220,93,50,50,26,237,50,47,49,48,93,43,93,43,0,93,93,5,34,38,53,52,62, +2,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,21,17,20,22,51,50,54,55,21, +14,1,35,34,46,2,39,35,14,3,39,50,62,2,61,1,7,14,3,21,20,22,1,158,163,164, +81,131,168,87,243,28,58,87,59,52,84,62,38,6,188,10,56,103,155,110,204,206, +42,59,15,30,14,34,67,38,51,73,46,24,3,6,29,69,92,117,35,86,129,85,42,197, +66,119,90,53,95,20,172,150,107,137,78,30,2,4,59,67,94,58,27,15,39,67,51,17, +64,107,78,43,187,177,254,46,80,81,4,3,112,8,8,27,55,81,54,52,84,59,32,135, +63,98,116,53,89,4,1,17,50,90,73,88,96,0,0,2,0,132,255,236,4,29,5,204,0,31, +0,51,0,146,64,9,105,49,121,49,2,121,35,1,31,184,255,224,64,24,7,10,72,134, +30,150,30,2,73,27,89,27,2,73,4,89,4,2,134,1,150,1,2,1,184,255,224,64,63,7, +10,72,0,71,64,160,32,1,32,53,128,42,5,19,70,0,18,16,18,48,18,240,18,4,8,18, +176,53,1,63,53,1,112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,37,80, +29,16,18,0,12,21,5,47,80,2,22,0,63,237,50,63,63,63,237,50,1,93,93,113,113, +114,114,47,94,93,237,50,50,26,16,220,93,26,237,49,48,43,93,93,93,93,43,93, +93,1,16,33,34,38,39,35,20,14,2,7,35,62,3,53,17,51,17,20,6,7,6,7,51,62,1,51, +50,18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,4,29,254,114,123,163,51, +2,3,3,3,1,174,1,2,2,1,180,1,1,1,1,4,50,165,122,205,193,189,28,62,96,69,71, +109,73,38,38,73,108,70,66,96,64,31,2,34,253,202,89,99,26,56,48,34,4,9,43, +60,72,39,4,237,254,89,30,55,21,25,22,104,90,254,236,254,226,112,160,103,48, +46,102,166,120,116,158,99,43,46,102,163,0,0,0,1,0,87,255,236,3,202,4,78,0, +39,0,117,64,81,121,16,1,121,23,1,99,37,1,99,3,1,32,70,31,31,8,70,160,9,1, +9,9,41,0,71,31,19,1,19,35,80,26,31,32,127,32,143,32,223,32,4,32,32,26,16, +32,8,112,8,128,8,208,8,224,8,5,0,8,16,8,96,8,112,8,128,8,192,8,208,8,7,8, +8,5,80,14,22,31,41,1,93,0,63,237,51,47,93,113,63,51,47,93,16,237,1,47,93, +237,17,51,125,47,113,24,237,51,47,237,49,48,93,93,93,93,1,20,30,2,51,50,54, +55,23,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,7,46,1,35,34,14,2,1,19,27, +64,105,77,96,129,15,182,9,60,103,148,97,127,178,111,50,36,65,88,103,114,58, +91,142,103,64,13,185,14,114,105,77,103,64,27,2,34,93,156,113,62,104,108,12, +67,124,94,57,86,151,205,120,109,167,125,85,51,23,50,87,118,68,14,90,106,51, +103,156,0,0,0,0,2,0,86,255,236,3,239,5,204,0,31,0,51,0,123,64,87,85,34,101, +34,2,90,50,106,50,2,57,1,73,1,2,54,10,70,10,2,9,4,25,4,121,4,137,4,4,6,7, +22,7,118,7,134,7,4,19,70,64,42,0,143,18,239,18,2,18,53,128,32,71,31,6,1,6, +112,53,144,53,2,31,53,1,255,53,1,192,53,224,53,2,25,21,18,0,11,47,80,8,16, +0,37,80,3,22,0,63,237,50,63,237,50,63,63,1,93,93,113,113,47,93,237,26,16, +220,93,50,50,26,237,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17,16,33,50, +22,23,51,52,46,1,52,53,17,51,17,20,30,2,23,35,46,3,53,1,20,30,2,51,50,62, +2,53,52,46,2,35,34,14,2,3,53,50,165,122,205,193,1,142,123,164,50,2,1,1,180, +1,2,2,1,172,2,3,3,2,253,218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64, +31,174,104,90,1,20,1,24,2,54,90,98,10,43,47,42,9,1,163,251,19,39,72,60,43, +9,10,37,48,53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102, +163,0,0,0,2,0,87,255,236,4,24,4,78,0,28,0,37,0,107,64,46,90,35,106,35,2,90, +30,106,30,2,85,3,101,3,2,8,73,9,9,27,71,64,31,29,1,144,29,1,29,39,128,37, +0,71,31,17,1,17,48,39,192,39,208,39,3,39,184,255,192,64,19,30,35,72,8,8,5, +0,80,37,37,5,32,80,22,16,5,80,14,22,0,63,237,63,237,18,57,47,237,17,57,47, +1,43,113,47,93,237,50,26,16,220,93,113,26,237,50,47,237,49,48,93,0,93,93, +1,20,30,2,51,50,54,55,23,14,3,35,34,2,17,52,62,2,51,50,30,2,29,1,39,46,1, +35,34,14,2,7,1,20,35,73,114,80,117,141,25,158,17,61,102,153,108,240,251,76, +132,176,100,136,183,111,47,186,15,144,135,45,99,84,58,4,1,247,85,143,103, +57,94,72,45,45,91,73,47,1,30,1,26,152,211,132,59,88,155,210,122,24,138,171, +157,29,74,127,98,0,0,0,1,0,29,0,0,2,60,5,202,0,27,0,161,64,11,3,10,19,10, +51,10,67,10,4,13,10,184,255,224,64,106,8,12,72,26,15,16,1,14,16,25,16,1,70, +5,0,2,1,18,2,31,29,47,29,79,29,95,29,127,29,143,29,159,29,7,15,29,63,29,127, +29,175,29,191,29,223,29,239,29,7,59,95,29,191,29,2,127,29,143,29,159,29,3, +29,64,86,100,72,29,64,39,44,72,32,29,48,29,96,29,3,175,29,223,29,239,29,3, +64,29,1,15,29,47,29,2,19,80,12,0,0,3,80,25,6,15,1,21,0,63,63,51,237,50,63, +237,1,93,93,93,113,43,43,113,114,94,93,113,47,94,93,51,237,50,50,47,94,93, +51,49,48,0,43,94,93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35, +34,14,2,29,1,51,21,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51, +29,11,211,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41,60,39, +97,131,0,2,0,86,254,87,3,239,4,75,0,49,0,69,0,217,64,72,122,49,138,49,2,118, +7,134,7,2,101,62,1,85,12,101,12,2,90,58,106,58,2,38,3,54,3,2,38,18,1,41,33, +1,9,23,25,23,121,23,137,23,4,6,29,22,29,118,29,134,29,4,9,47,70,64,50,34, +48,14,1,127,14,223,14,2,14,71,128,6,70,5,184,255,192,64,81,23,28,72,5,5,60, +71,15,26,1,10,26,32,71,64,71,2,207,71,1,0,71,32,71,144,71,176,71,4,80,223, +71,1,192,71,1,79,71,1,128,71,160,71,2,15,71,47,71,2,208,71,240,71,2,15,71, +1,8,41,15,34,55,80,31,16,15,65,80,21,22,9,80,53,6,1,38,6,1,6,0,27,0,63,50, +93,93,237,63,237,50,63,237,50,63,1,94,93,93,113,113,114,114,114,94,93,93, +113,47,94,93,237,51,47,43,237,26,16,220,93,113,50,50,26,237,49,48,0,94,93, +93,93,93,93,93,93,93,93,93,1,34,46,2,39,55,30,1,51,50,62,2,61,1,35,14,3,35, +34,46,2,53,52,62,2,51,50,22,23,51,52,62,2,55,51,14,3,21,17,20,6,19,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,2,36,93,144,102,64,14,181,18,123,100,61, +100,70,38,2,20,59,85,112,72,103,147,93,43,43,97,155,111,115,169,46,2,3,3, +4,2,171,1,2,2,1,223,44,49,80,103,54,69,99,65,31,31,64,98,68,54,103,82,50, +254,87,38,71,98,60,26,75,81,34,75,120,86,174,41,75,58,35,69,138,205,135,130, +208,145,77,105,97,25,62,55,40,3,9,43,60,73,39,252,197,227,229,3,198,113,161, +102,48,48,103,161,112,117,159,98,42,46,100,158,0,0,0,0,1,0,142,0,0,3,238, +5,204,0,33,0,109,185,0,8,255,192,64,36,7,11,72,11,70,64,80,12,1,159,12,255, +12,2,12,35,128,0,35,192,35,208,35,224,35,4,192,35,1,15,35,1,128,35,1,35,184, +255,192,64,32,19,23,72,28,24,70,192,25,1,0,25,16,25,48,25,224,25,240,25,5, +8,25,26,0,25,11,21,0,18,80,5,16,0,63,237,50,63,51,63,1,47,94,93,113,237,50, +43,93,113,113,114,26,16,220,93,113,26,237,49,48,43,1,62,3,51,50,30,2,21,17, +35,17,52,46,2,35,34,14,2,21,17,35,17,51,17,20,14,2,7,1,61,30,70,84,100,62, +104,133,77,29,181,17,48,88,70,64,103,73,40,180,180,2,3,2,1,3,129,55,77,50, +23,56,101,140,84,253,47,2,174,69,104,69,35,46,84,120,75,253,130,5,204,254, +126,33,66,56,39,7,0,0,0,2,0,137,0,0,1,61,5,204,0,3,0,7,0,115,64,13,3,7,70, +0,0,4,16,4,48,4,3,8,4,184,255,192,64,42,21,24,72,4,4,8,9,255,9,1,224,9,1, +223,9,1,176,9,192,9,2,159,9,1,112,9,128,9,2,31,9,1,0,9,1,240,9,1,223,9,1, +9,184,255,192,64,17,34,37,72,79,9,1,31,9,1,5,15,4,21,0,83,1,0,0,63,237,63, +63,1,93,113,43,113,113,114,114,114,114,114,114,114,114,17,18,57,47,43,94, +93,51,237,50,49,48,19,53,51,21,3,17,51,17,137,180,180,180,5,32,172,172,250, +224,4,58,251,198,0,0,0,0,2,255,206,254,87,1,61,5,204,0,3,0,23,1,51,64,151, +7,24,12,16,72,7,40,8,11,72,3,4,70,21,12,12,0,0,21,16,21,32,21,64,21,4,7,21, +21,24,25,144,25,1,63,25,1,0,25,16,25,2,219,25,64,210,213,72,208,25,224,25, +2,143,25,1,64,25,80,25,2,15,25,31,25,95,25,111,25,255,25,5,144,25,160,25, +224,25,240,25,4,79,25,1,0,25,1,160,63,25,175,25,191,25,207,25,4,239,25,1, +176,25,192,25,208,25,3,63,25,79,25,95,25,3,32,25,1,143,25,191,25,207,25,3, +0,25,1,111,239,25,1,208,25,1,63,25,143,25,2,111,25,143,25,159,25,175,25,255, +25,5,25,184,255,192,64,84,79,82,72,223,25,1,144,25,160,25,176,25,3,47,25, +63,25,79,25,3,0,25,1,61,25,64,53,56,72,112,25,128,25,144,25,176,25,4,15,25, +31,25,2,255,25,1,25,64,35,38,72,144,25,1,79,25,1,255,25,1,112,25,128,25,192, +25,208,25,224,25,5,31,25,1,22,15,16,80,9,27,0,83,1,0,0,63,237,63,237,63,1, +93,93,93,113,113,43,113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93, +93,113,113,113,113,114,94,93,93,93,113,114,114,114,43,94,93,93,93,17,18,57, +47,94,93,51,51,47,16,237,50,49,48,0,43,43,19,53,51,21,17,20,14,2,35,34,38, +39,53,30,1,51,50,62,2,53,17,51,137,180,21,54,93,72,34,65,28,13,36,13,38,49, +28,10,180,5,32,172,172,250,90,62,106,78,45,4,5,139,2,4,20,43,67,46,4,165, +0,0,1,0,138,0,0,4,3,5,204,0,11,0,251,64,84,124,2,1,122,8,1,118,7,1,86,9,102, +9,134,9,150,9,4,139,0,155,0,2,89,0,105,0,121,0,3,116,10,132,10,148,10,3,68, +10,1,1,10,10,11,42,8,1,3,8,9,16,116,9,1,9,9,0,11,16,84,11,116,11,148,11,3, +116,11,148,11,180,11,212,11,228,11,244,11,6,48,11,1,2,11,184,255,192,64,105, +7,10,72,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,31,13,63,13,2,31,13,63,13,95, +13,255,13,4,15,13,31,13,63,13,95,13,127,13,5,57,13,64,83,86,72,96,13,128, +13,160,13,192,13,208,13,5,223,13,1,0,13,96,13,128,13,160,13,4,0,13,16,13, +48,13,64,13,128,13,160,13,192,13,224,13,240,13,9,7,2,1,7,10,4,8,15,5,0,4, +21,0,21,0,63,63,63,63,23,57,1,94,93,113,113,114,43,94,93,113,114,47,94,93, +237,50,47,43,95,93,93,113,56,51,51,47,93,56,51,95,114,17,57,17,51,49,48,93, +93,93,93,93,0,93,1,93,0,93,33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132, +180,180,1,219,211,254,73,1,206,1,238,109,254,127,5,204,252,97,2,13,254,47, +253,151,0,0,0,1,0,138,0,0,1,62,5,204,0,3,0,111,64,52,3,70,192,0,1,208,0,1, +0,0,16,0,48,0,240,0,4,8,0,224,5,240,5,2,223,5,1,176,5,192,5,2,159,5,1,112, +5,128,5,2,15,5,31,5,2,240,5,1,223,5,1,5,184,255,192,64,27,34,37,72,79,5,1, +255,5,1,112,5,128,5,192,5,208,5,224,5,5,31,5,1,1,0,0,21,0,63,63,1,93,93,93, +113,43,113,113,114,114,114,114,114,114,47,94,93,113,114,237,49,48,51,17,51, +17,138,180,5,204,250,52,0,0,1,0,136,0,0,6,35,4,78,0,59,2,194,185,0,42,255, +224,179,8,11,72,32,184,255,224,64,255,8,11,72,34,59,70,0,0,13,46,70,217,47, +249,47,2,182,47,1,41,47,89,47,137,47,3,6,47,1,166,47,182,47,214,47,230,47, +4,137,47,1,118,47,1,89,47,1,6,47,22,47,70,47,3,7,47,25,12,70,198,13,1,6,13, +22,13,54,13,230,13,246,13,5,8,13,251,61,1,201,61,217,61,233,61,3,187,61,1, +153,61,1,139,61,1,105,61,121,61,2,91,61,1,73,61,1,43,61,59,61,2,249,61,1, +235,61,1,217,61,1,203,61,1,189,61,1,153,61,1,139,61,1,105,61,1,91,61,1,41, +61,57,61,2,27,61,1,9,61,1,202,235,61,251,61,2,105,61,137,61,153,61,185,61, +201,61,5,91,61,1,77,61,1,41,61,57,61,2,27,61,1,249,61,1,235,61,1,201,61,217, +61,2,187,61,1,153,61,1,139,61,1,125,61,1,1,43,61,75,61,91,61,107,61,4,31, +61,1,4,61,1,203,61,235,61,2,175,61,191,61,2,139,61,1,127,61,1,43,61,75,61, +91,61,107,61,4,31,61,1,11,61,1,154,255,61,1,235,61,64,255,1,223,61,1,187, +61,1,175,61,1,139,61,155,61,2,127,61,1,91,61,107,61,2,79,61,1,59,61,1,36, +61,1,11,61,1,235,61,1,223,61,1,187,61,1,175,61,1,155,61,1,127,61,143,61,2, +100,61,1,75,61,1,63,61,1,43,61,1,15,61,31,61,2,235,61,1,223,61,1,123,61,139, +61,171,61,187,61,4,111,61,1,59,61,1,31,61,1,11,61,1,106,187,61,203,61,235, +61,3,175,61,1,139,61,1,127,61,1,91,61,1,79,61,1,27,61,1,251,61,1,223,61,239, +61,2,187,61,203,61,2,175,61,1,100,61,148,61,2,27,61,43,61,75,61,3,4,61,1, +244,61,1,139,61,171,61,219,61,3,127,61,1,107,61,1,52,61,1,27,61,1,15,61,1, +57,187,61,219,61,251,61,3,160,61,1,116,61,148,61,2,43,61,75,61,91,61,3,31, +61,1,11,61,1,203,61,235,61,251,61,3,164,61,1,27,61,75,61,91,61,123,61,4,244, +61,1,208,61,1,2,96,61,144,61,160,61,192,61,4,79,61,1,48,61,1,47,61,1,0,64, +19,61,1,8,34,53,80,40,16,25,6,80,31,16,19,15,47,13,0,21,0,63,50,50,63,63, +237,50,63,237,50,1,94,93,93,93,93,93,95,93,93,113,113,113,114,114,114,114, +114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114, +114,114,114,94,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113, +113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93, +93,113,113,113,95,113,113,113,113,113,113,113,114,114,114,114,114,114,94, +93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,47, +94,93,113,237,50,47,94,93,93,93,93,93,113,113,113,113,237,18,57,47,237,57, +49,48,0,43,43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21, +51,62,3,51,50,22,23,51,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21, +17,3,0,20,47,76,55,57,92,65,35,179,1,2,2,1,170,1,2,3,2,3,24,56,75,97,64,123, +143,28,3,24,60,80,100,64,82,119,76,36,178,20,47,76,55,57,92,65,35,2,174,79, +106,65,27,45,85,125,81,253,141,3,83,34,75,67,48,7,5,44,57,59,20,47,76,53, +29,98,107,47,76,53,29,44,92,145,100,253,47,2,174,79,106,65,27,43,84,126,83, +253,141,0,1,0,136,0,0,3,238,4,78,0,37,0,109,185,0,34,255,224,64,36,7,11,72, +37,70,64,80,0,1,159,0,255,0,2,0,39,128,0,39,192,39,208,39,224,39,4,192,39, +1,15,39,1,128,39,1,39,184,255,192,64,32,19,23,72,25,12,70,192,13,1,0,13,16, +13,48,13,224,13,240,13,5,8,13,25,6,80,31,16,19,15,13,0,21,0,63,50,63,63,237, +50,1,47,94,93,113,237,50,43,93,113,113,114,26,16,220,93,113,26,237,49,48, +43,33,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51, +50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26, +62,82,106,70,90,130,84,39,2,174,79,106,65,27,45,85,125,81,253,141,3,83,34, +75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,253,47,0,0,0,0,2,0,86, +255,236,4,29,4,78,0,14,0,34,0,116,64,59,121,32,137,32,2,116,28,132,28,2,118, +22,134,22,2,121,18,137,18,2,150,12,166,12,2,4,12,20,12,2,11,9,27,9,2,11,5, +27,5,2,4,2,20,2,2,7,0,71,64,144,15,1,15,36,128,48,36,1,36,184,255,192,64, +20,30,35,72,223,36,1,25,71,31,8,1,8,20,80,10,16,30,80,3,22,0,63,237,63,237, +1,47,93,237,93,43,113,26,16,220,93,26,237,49,48,94,93,93,93,93,93,93,93,93, +93,1,16,2,35,34,46,2,53,16,33,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51, +50,62,2,4,29,250,238,113,178,123,65,1,229,126,183,117,56,189,39,75,108,68, +69,111,78,41,44,77,105,62,69,112,78,42,2,30,254,228,254,234,68,140,211,143, +2,48,70,140,210,140,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0, +0,2,0,132,254,87,4,29,4,77,0,38,0,58,0,148,64,16,105,56,121,56,2,105,42,121, +42,2,134,36,150,36,2,36,184,255,224,64,19,7,10,72,73,31,89,31,2,73,7,89,7, +2,134,3,150,3,2,3,184,255,224,64,63,7,10,72,0,71,64,160,39,1,39,60,128,49, +28,15,70,0,16,16,16,48,16,240,16,4,8,16,176,60,1,63,60,1,112,60,144,60,2, +31,60,1,255,60,1,192,60,224,60,2,28,44,80,34,16,22,15,15,27,8,54,80,5,22, +0,63,237,50,63,63,63,237,50,1,93,93,113,113,114,114,47,94,93,237,50,50,26, +16,220,93,26,237,49,48,43,93,93,93,43,93,93,93,1,20,14,2,35,34,38,39,35,30, +3,21,17,35,17,52,46,2,39,51,30,3,21,51,62,3,51,50,30,2,7,52,46,2,35,34,14, +2,21,20,30,2,51,50,62,2,4,29,40,93,153,112,116,174,46,5,1,1,1,1,180,1,2,2, +1,174,1,3,3,3,4,25,64,82,101,63,112,153,93,40,189,24,59,98,74,60,106,79,46, +38,73,108,70,75,99,59,24,2,34,123,208,150,85,88,100,2,32,48,59,29,254,89, +5,6,39,72,59,42,9,3,36,51,58,26,52,73,47,21,80,145,205,129,100,156,108,56, +34,96,169,135,115,159,98,43,58,110,159,0,0,2,0,86,254,87,3,240,4,78,0,34, +0,54,0,165,64,119,85,47,101,47,2,90,43,106,43,2,57,32,73,32,2,54,9,70,9,2, +9,1,25,1,121,1,137,1,4,6,5,22,5,118,5,134,5,4,9,22,70,64,35,11,127,23,223, +23,2,23,56,128,45,71,15,3,1,10,3,32,56,64,56,2,207,56,1,0,56,32,56,144,56, +176,56,4,80,223,56,1,192,56,1,79,56,1,128,56,160,56,2,15,56,47,56,2,208,56, +240,56,2,15,56,1,8,22,27,17,16,11,40,80,6,16,29,50,80,0,22,0,63,237,50,63, +237,50,63,63,1,94,93,93,113,113,114,114,114,94,93,93,113,47,94,93,237,26, +16,220,93,50,50,26,237,49,48,0,94,93,93,93,93,93,93,5,34,2,17,16,18,51,50, +30,2,23,51,52,62,2,55,51,14,1,21,17,35,17,52,54,55,54,55,35,14,3,1,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,1,228,206,192,197,201,67,103,81,61,25, +2,3,3,4,2,173,2,5,180,1,1,1,1,2,26,63,82,103,1,16,41,75,107,66,69,98,61,29, +27,61,97,70,60,106,79,46,20,1,22,1,22,1,26,1,28,24,47,70,47,25,61,54,39,3, +17,144,134,251,54,1,183,26,56,25,28,29,51,75,49,23,2,62,118,160,96,41,51, +105,161,110,108,160,104,51,37,97,169,0,0,0,1,0,136,0,0,2,136,4,78,0,31,0, +62,64,40,16,21,48,21,2,21,21,33,12,31,70,192,0,1,0,0,16,0,48,0,224,0,240, +0,5,8,0,25,40,19,22,72,25,12,18,16,7,15,0,21,0,63,63,63,51,205,43,1,47,94, +93,113,237,50,17,51,47,93,49,48,51,17,52,46,2,39,51,30,3,21,51,62,3,51,50, +22,23,21,46,1,35,34,14,2,21,17,142,1,2,2,1,170,1,3,3,1,4,19,43,58,80,57,22, +40,11,18,48,30,62,87,55,26,3,62,34,71,66,58,23,23,59,62,57,20,62,91,59,29, +7,3,165,5,5,56,99,137,81,253,204,0,0,1,0,57,255,236,3,182,4,75,0,55,0,189, +64,85,116,46,132,46,2,111,21,127,21,143,21,3,107,22,1,37,54,1,42,27,1,21, +52,1,5,2,21,2,2,11,30,27,30,2,36,73,35,35,0,72,64,32,19,48,19,2,144,19,160, +19,176,19,3,19,57,128,11,73,10,64,25,30,72,10,10,44,72,79,29,95,29,2,32,29, +1,29,96,57,192,57,2,128,57,1,57,184,255,192,64,42,39,42,72,63,57,1,16,57, +1,19,44,5,41,80,32,0,36,1,144,36,240,36,2,36,36,32,16,14,80,5,96,11,112,11, +2,128,11,1,11,11,5,22,0,63,51,47,93,113,16,237,63,51,47,93,113,16,237,18, +57,57,1,93,93,43,93,113,47,93,113,237,51,47,43,237,26,16,220,93,113,26,237, +50,47,237,49,48,93,93,0,93,1,93,93,0,93,93,93,1,20,14,2,35,34,46,2,39,55, +30,1,51,50,62,2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,6,21, +20,30,2,23,30,5,3,182,59,112,163,105,94,151,114,77,18,159,23,144,128,58,97, +70,39,46,82,117,70,65,128,103,64,211,202,179,211,28,162,9,48,68,85,46,122, +116,43,77,108,65,43,90,85,75,56,33,1,43,76,119,81,43,29,64,105,76,31,87,81, +16,39,65,48,49,63,42,31,19,17,42,69,102,77,148,155,126,139,20,42,57,35,15, +74,75,44,57,39,29,16,11,25,35,47,66,88,0,0,0,0,1,0,31,255,240,2,42,5,44,0, +22,0,123,64,87,40,14,1,105,14,121,14,137,14,3,40,13,1,105,13,121,13,137,13, +3,139,4,1,4,32,9,13,72,108,4,124,4,156,4,172,4,4,4,32,9,12,72,111,22,127, +22,2,22,12,13,22,3,16,70,9,8,143,5,1,0,5,16,5,32,5,64,5,4,7,5,128,24,1,15, +6,80,12,63,10,1,10,9,15,19,80,3,22,0,63,237,63,205,93,51,237,50,1,93,47,94, +93,113,51,51,237,23,50,47,93,49,48,0,43,93,1,43,93,93,113,93,113,37,14,1, +35,34,53,17,35,53,51,55,51,21,51,21,35,17,20,22,51,50,54,55,2,42,41,85,56, +216,125,132,53,120,200,200,51,63,26,49,29,8,11,13,245,2,210,131,242,242,131, +253,85,78,63,8,6,0,0,0,0,1,0,133,255,236,3,235,4,58,0,37,0,121,64,69,150, +3,1,26,33,42,33,58,33,3,25,14,70,64,47,11,143,11,2,191,11,1,143,11,159,11, +255,11,3,11,39,128,1,70,223,36,239,36,2,0,36,16,36,48,36,240,36,4,8,36,176, +39,192,39,208,39,3,176,39,240,39,2,255,39,1,112,39,1,39,184,255,192,64,13, +19,23,72,25,6,80,31,22,19,21,12,0,15,0,63,50,63,63,237,50,1,43,93,93,113, +114,47,94,93,113,237,26,16,220,93,113,114,26,237,51,49,48,0,93,93,1,17,20, +30,2,51,50,62,2,53,17,51,17,20,30,2,23,35,46,3,53,35,14,3,35,34,46,2,53,17, +1,58,23,52,85,63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90, +130,84,39,4,58,253,82,79,106,65,27,45,85,125,81,2,115,252,173,34,75,67,48, +7,5,44,57,59,20,47,76,53,29,44,92,144,101,2,209,0,0,1,0,7,0,0,3,249,4,58, +0,16,2,91,64,55,57,1,73,1,2,153,1,1,54,0,70,0,2,134,0,150,0,2,58,15,74,15, +2,154,15,1,105,15,121,15,137,15,3,53,3,69,3,2,149,3,1,3,103,3,119,3,135,3, +3,14,16,13,17,72,4,184,255,240,64,62,13,17,72,1,0,9,9,2,15,16,16,43,16,123, +16,2,4,16,20,16,2,4,16,20,16,68,16,84,16,132,16,148,16,196,16,212,16,8,219, +16,1,68,16,84,16,132,16,148,16,196,16,5,27,16,1,4,16,1,8,16,3,2,184,255,240, +64,255,11,2,91,2,2,42,2,11,18,27,18,2,11,18,27,18,75,18,91,18,139,18,155, +18,203,18,219,18,8,255,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18, +1,68,18,84,18,2,32,18,1,4,18,20,18,2,199,224,18,1,196,18,212,18,2,160,18, +1,4,18,20,18,68,18,84,18,132,18,148,18,6,68,18,84,18,132,18,148,18,196,18, +212,18,6,27,18,1,4,18,1,219,18,1,196,18,1,155,18,1,132,18,1,91,18,1,68,18, +1,27,18,1,4,18,1,151,11,18,27,18,75,18,91,18,139,18,155,18,203,18,219,18, +8,155,18,203,18,219,18,3,132,18,1,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18, +2,224,18,1,196,18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,4,18,20,18,68, +18,84,18,4,103,4,18,20,18,68,18,84,18,132,18,148,18,196,18,212,18,8,219,18, +1,196,18,1,155,18,1,132,18,1,91,18,1,68,18,1,27,18,1,4,18,1,219,18,1,196, +18,1,11,18,27,18,75,18,64,99,91,18,139,18,155,18,6,55,75,18,91,18,139,18, +155,18,203,18,219,18,6,63,18,1,32,18,1,4,18,20,18,2,224,18,1,196,18,212,18, +2,160,18,1,132,18,148,18,2,96,18,1,68,18,84,18,2,32,18,1,4,18,20,18,2,196, +18,212,18,2,160,18,1,132,18,148,18,2,96,18,1,2,80,18,1,47,18,1,0,18,16,18, +2,7,15,2,15,9,1,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93,93,113,113,113, +113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113,113,113,113,113, +113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114,94,93,93,93,93,93, +93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93,93,93,93,113,114,47, +94,93,56,51,47,94,93,93,93,93,113,114,114,56,51,18,57,61,47,51,51,49,48,43, +43,93,95,93,113,93,93,113,93,113,93,113,33,35,1,51,19,30,3,23,62,3,55,19, +51,2,101,213,254,119,192,238,7,19,20,17,6,6,19,20,21,8,246,191,4,58,253,64, +22,63,68,63,21,21,63,66,63,22,2,194,0,0,0,0,1,255,253,0,0,5,204,4,58,0,42, +3,177,64,36,229,23,1,58,41,74,41,2,122,41,138,41,154,41,3,53,16,69,16,2,117, +16,133,16,149,16,3,54,29,70,29,2,54,29,1,29,184,255,240,64,22,13,17,72,57, +28,73,28,2,57,28,1,28,16,13,17,72,54,0,70,0,2,0,184,255,240,64,9,11,17,72, +54,13,70,13,2,13,184,255,240,64,51,11,17,72,57,1,73,1,2,1,16,11,17,72,57, +14,73,14,2,3,14,16,9,17,72,14,13,22,29,28,7,1,0,35,40,35,1,88,35,1,22,7,35, +35,7,22,3,15,41,42,16,42,184,255,192,64,73,47,50,72,73,42,1,52,42,1,38,42, +1,249,42,1,198,42,230,42,2,164,42,1,150,42,1,121,42,1,54,42,70,42,102,42, +3,25,42,1,244,42,1,182,42,230,42,2,132,42,148,42,2,102,42,118,42,2,57,42, +1,38,42,1,20,42,1,6,42,1,8,42,16,15,184,255,240,64,255,9,15,89,15,105,15, +121,15,4,10,15,198,44,230,44,246,44,3,164,44,1,150,44,1,121,44,1,102,44,1, +84,44,1,54,44,70,44,2,25,44,1,244,44,1,230,44,1,196,44,1,182,44,1,153,44, +1,134,44,1,116,44,1,102,44,1,57,44,1,20,44,36,44,2,6,44,1,202,249,44,1,150, +44,182,44,198,44,230,44,4,105,44,1,54,44,70,44,2,9,44,25,44,2,230,44,1,185, +44,1,86,44,102,44,134,44,3,57,44,1,43,44,1,20,44,1,6,44,1,228,44,1,214,44, +1,196,44,1,182,44,1,162,44,1,148,44,1,134,44,1,114,44,1,100,44,1,86,44,1, +52,44,68,44,2,34,44,1,20,44,1,6,44,1,153,246,44,1,194,44,210,44,2,180,44, +1,166,44,1,132,44,1,118,44,1,84,44,100,44,2,66,44,1,52,44,1,22,44,38,44,2, +4,44,1,226,44,242,44,2,212,44,1,198,44,1,164,44,1,146,44,1,132,44,1,102,44, +118,44,2,84,44,1,54,44,70,44,2,36,44,1,22,44,1,4,44,1,244,44,64,213,1,230, +44,1,196,44,1,178,44,1,164,44,1,102,44,134,44,150,44,3,68,44,84,44,2,54,44, +1,20,44,1,6,44,1,105,246,44,1,226,44,1,212,44,1,150,44,182,44,198,44,3,116, +44,132,44,2,54,44,70,44,102,44,3,36,44,1,6,44,22,44,2,244,44,1,182,44,230, +44,2,148,44,164,44,2,134,44,1,105,44,1,86,44,1,68,44,1,6,44,54,44,2,228,44, +1,214,44,1,196,44,1,166,44,182,44,2,137,44,1,114,44,1,1,96,44,1,4,44,36,44, +84,44,3,56,164,44,196,44,212,44,244,44,4,128,44,1,116,44,1,75,44,1,48,44, +1,20,44,36,44,2,251,44,1,196,44,1,160,44,1,148,44,1,123,44,1,52,44,68,44, +100,44,3,27,44,1,240,44,1,228,44,1,203,44,1,100,44,132,44,148,44,180,44,4, +63,44,1,2,0,44,16,44,2,8,7,184,255,224,64,40,14,17,72,66,7,1,52,7,1,34,7, +1,7,28,41,3,15,15,35,40,12,17,72,45,35,1,22,40,12,17,72,45,22,1,1,22,35,3, +14,21,0,63,23,51,93,43,93,43,63,23,51,93,93,93,43,1,94,93,95,93,93,93,93, +93,113,113,113,113,113,113,113,114,114,114,114,114,114,94,93,93,95,93,93, +93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114, +94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113, +113,113,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93, +93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114,114,114,94, +93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,47,94,93, +56,51,47,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,114,114,114, +43,56,51,18,23,57,61,47,47,47,113,114,17,51,51,17,51,51,17,51,51,49,48,43, +95,113,43,113,43,113,43,113,43,93,113,43,93,113,93,113,93,113,113,33,35,3, +46,1,39,38,39,6,7,14,1,7,3,35,1,51,19,30,1,23,22,23,54,55,62,1,55,19,51,19, +30,1,23,22,23,54,55,62,1,55,19,51,4,150,209,173,8,17,8,10,9,9,10,8,19,8,178, +208,254,209,178,183,7,14,7,7,8,8,9,8,16,6,196,193,189,7,16,7,8,8,8,8,7,15, +7,191,176,2,186,27,80,38,44,47,45,44,38,82,31,253,74,4,58,253,33,23,67,32, +37,39,38,36,31,64,21,2,231,253,25,26,66,29,34,35,38,36,31,67,26,2,223,0,0, +1,0,23,0,0,3,234,4,58,0,11,2,214,64,72,148,2,1,134,2,1,141,8,157,8,2,121, +8,1,130,6,146,6,2,118,6,1,141,0,157,0,2,121,0,1,55,10,119,10,2,28,10,1,122, +4,1,19,4,1,3,24,1,120,1,136,1,152,1,4,23,7,135,7,151,7,3,6,8,10,1,7,4,4,9, +9,16,5,184,255,240,64,59,5,9,5,9,3,0,11,16,41,11,57,11,2,4,11,20,11,2,214, +11,230,11,246,11,3,196,11,1,150,11,166,11,182,11,3,132,11,1,6,11,38,11,70, +11,102,11,134,11,150,11,166,11,198,11,230,11,9,8,11,184,255,192,181,24,31, +72,11,2,3,184,255,240,64,11,9,3,1,9,3,57,3,2,10,3,13,184,255,128,64,116,223, +233,72,118,13,1,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,230, +13,246,13,2,210,13,1,192,13,1,178,13,1,132,13,148,13,164,13,3,118,13,1,100, +13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13,1,199,246,13,1,228,13,1, +214,13,1,196,13,1,182,13,1,164,13,1,6,13,70,13,86,13,134,13,150,13,166,13, +198,13,214,13,230,13,9,150,13,198,13,2,13,184,255,192,64,187,183,192,72,132, +13,1,86,13,102,13,118,13,3,68,13,1,38,13,54,13,2,4,13,1,151,38,13,54,13,102, +13,118,13,166,13,182,13,198,13,230,13,246,13,9,230,13,1,132,13,1,118,13,1, +68,13,84,13,100,13,3,54,13,1,36,13,1,22,13,1,4,13,1,246,13,1,228,13,1,214, +13,1,196,13,1,182,13,1,164,13,1,118,13,134,13,150,13,3,100,13,1,6,13,22,13, +38,13,70,13,86,13,5,103,6,13,70,13,86,13,134,13,150,13,198,13,214,13,230, +13,8,153,13,217,13,2,100,13,1,86,13,1,68,13,1,54,13,1,36,13,1,22,13,1,4,13, +1,214,13,230,13,246,13,3,196,13,1,6,13,38,13,54,13,70,13,4,55,102,13,166, +13,182,13,230,13,246,13,5,13,184,255,192,64,54,61,66,72,57,13,1,34,13,1,1, +0,13,16,13,2,244,13,1,192,13,208,13,224,13,3,180,13,1,128,13,144,13,160,13, +3,116,13,1,96,13,1,84,13,1,64,13,1,52,13,1,32,13,1,13,184,255,192,64,34,18, +24,72,160,13,1,2,0,13,16,13,80,13,112,13,128,13,144,13,6,7,10,4,4,7,1,3,2, +8,6,15,0,2,21,0,63,51,63,51,18,23,57,17,1,51,94,93,95,93,43,113,113,113,113, +113,113,113,113,113,113,114,95,114,114,43,114,94,93,93,93,113,113,113,113, +113,113,113,113,114,94,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113, +113,113,114,94,93,93,93,93,93,43,93,113,114,114,114,114,114,114,94,93,93, +93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,43,47,94, +93,114,56,51,47,43,94,93,113,113,113,113,114,114,56,51,18,57,57,47,47,56, +56,18,23,57,50,51,49,48,0,93,93,1,95,93,93,93,93,93,93,93,93,93,93,93,93, +33,9,1,35,9,1,51,9,1,51,9,1,3,33,254,221,254,219,194,1,129,254,145,199,1, +14,1,12,201,254,145,1,134,1,188,254,68,2,44,2,14,254,91,1,165,253,244,253, +210,0,0,0,0,1,0,5,254,87,3,252,4,58,0,31,2,207,64,59,147,3,1,147,2,1,153, +16,1,150,0,1,141,16,157,16,2,141,0,157,0,2,122,29,138,29,154,29,3,105,29, +1,157,30,1,30,16,13,16,72,146,19,1,134,19,1,114,19,1,86,19,102,19,2,146,18, +1,3,18,184,255,240,64,36,13,16,72,16,0,24,8,24,8,24,17,30,31,16,153,31,1, +134,31,1,89,31,1,70,31,1,25,31,1,6,31,1,8,31,18,17,184,255,240,64,36,17,6, +33,1,6,33,38,33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230, +33,246,33,12,199,230,33,246,33,2,33,184,255,192,64,255,217,233,72,196,33, +1,166,33,182,33,2,132,33,1,6,33,38,33,54,33,70,33,102,33,118,33,6,6,33,38, +33,54,33,70,33,102,33,118,33,134,33,166,33,182,33,198,33,230,33,246,33,12, +6,33,22,33,38,33,70,33,86,33,102,33,134,33,166,33,198,33,230,33,246,33,11, +151,244,33,1,224,33,1,194,33,210,33,2,180,33,1,160,33,1,130,33,146,33,2,116, +33,1,96,33,1,66,33,82,33,2,52,33,1,32,33,1,2,33,18,33,2,228,33,244,33,2,194, +33,210,33,2,164,33,180,33,2,130,33,146,33,2,100,33,116,33,2,66,33,82,33,2, +36,33,52,33,2,2,33,18,33,2,228,33,244,33,2,194,33,210,33,2,164,33,180,33, +2,130,33,146,33,2,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2, +33,1,103,228,33,244,33,2,214,33,1,194,33,1,164,33,180,33,2,150,33,1,130,33, +1,100,33,116,33,2,86,33,1,66,33,1,36,33,52,33,2,22,33,1,2,33,1,228,33,244, +33,2,214,33,1,64,166,194,33,1,1,160,33,176,33,2,132,33,148,33,2,96,33,112, +33,2,68,33,84,33,2,32,33,48,33,2,4,33,20,33,2,224,33,240,33,2,196,33,212, +33,2,160,33,176,33,2,132,33,148,33,2,96,33,112,33,2,68,33,84,33,2,32,33,48, +33,2,4,33,20,33,2,55,224,33,1,196,33,212,33,2,160,33,1,132,33,148,33,2,96, +33,1,68,33,84,33,2,32,33,1,4,33,20,33,2,224,33,1,196,33,212,33,2,160,33,1, +132,33,148,33,2,96,33,1,2,0,33,32,33,48,33,80,33,4,80,33,128,33,144,33,192, +33,4,47,33,1,0,33,16,33,2,7,16,0,24,0,32,30,17,15,12,80,5,27,0,63,237,63, +51,17,51,51,17,51,1,94,93,93,93,113,95,113,113,113,113,113,114,114,114,114, +114,114,114,114,94,93,93,93,93,93,93,93,93,113,113,113,113,113,113,95,113, +113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93, +93,93,93,93,93,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114, +114,114,114,114,114,94,93,113,114,114,114,114,43,114,94,93,113,47,56,51,47, +94,93,93,93,93,93,93,56,51,18,57,57,61,47,24,47,17,51,51,49,48,43,95,93,93, +93,93,93,43,93,93,93,0,93,93,1,93,93,93,93,33,14,3,35,34,38,39,53,30,1,51, +50,54,63,1,1,51,19,30,3,23,62,3,55,19,51,2,92,38,79,98,120,78,34,58,32,19, +48,17,79,136,51,17,254,83,192,228,10,31,31,24,2,3,23,29,30,10,212,190,98, +157,111,59,4,7,135,3,3,118,129,43,4,53,253,170,27,90,90,72,9,11,65,80,82, +30,2,106,0,1,0,49,0,0,3,182,4,58,0,9,1,11,64,78,157,2,173,2,2,139,2,1,89, +2,105,2,2,146,7,162,7,2,116,7,132,7,2,70,7,86,7,102,7,3,40,8,1,3,8,2,123, +6,1,4,6,20,6,36,6,164,6,180,6,212,6,228,6,7,7,6,7,3,11,1,59,1,91,1,3,10,1, +64,39,55,72,1,64,17,20,72,1,11,184,255,192,64,40,92,100,72,192,11,1,180,11, +1,160,11,1,148,11,1,128,11,1,116,11,1,96,11,1,84,11,1,64,11,1,52,11,68,11, +100,11,132,11,4,11,184,255,192,64,32,73,82,72,32,11,1,20,11,1,0,11,1,63,68, +11,100,11,132,11,164,11,4,4,11,36,11,68,11,100,11,4,11,184,255,192,179,51, +62,72,11,184,255,192,64,18,31,39,72,224,11,1,2,0,11,32,11,80,11,112,11,4, +7,11,184,255,192,64,13,16,20,72,6,3,80,4,15,1,7,80,0,21,0,63,237,50,63,237, +50,1,43,94,93,95,93,43,43,113,114,94,93,93,93,43,93,113,113,113,113,113,113, +113,113,113,43,47,43,43,94,93,51,51,47,94,93,113,51,51,95,113,49,48,93,93, +93,93,93,93,51,53,1,33,53,33,21,1,33,21,49,2,149,253,147,3,56,253,106,2,187, +137,3,38,139,137,252,218,139,0,0,0,1,0,34,254,87,2,136,5,204,0,45,0,96,64, +65,3,32,9,12,72,19,32,9,13,72,23,45,33,28,40,240,17,11,31,5,63,5,2,143,5, +1,64,5,1,5,33,11,245,47,12,111,12,2,15,12,79,12,223,12,239,12,4,47,12,79, +12,111,12,3,12,12,0,24,245,21,0,43,245,0,27,0,63,237,63,237,18,57,47,93,113, +114,237,57,1,47,93,93,113,51,51,237,50,50,205,50,49,48,43,43,1,34,46,2,53, +17,52,46,2,39,53,62,3,53,17,52,54,59,1,21,35,34,6,21,17,20,14,2,7,21,30,3, +21,17,20,22,59,1,21,2,1,65,99,66,34,29,55,80,51,51,80,55,29,133,131,135,63, +91,77,30,52,71,41,43,71,51,29,77,91,63,254,87,41,76,108,68,1,105,63,88,56, +28,2,127,2,28,56,88,62,1,106,141,152,129,107,108,254,156,50,84,64,44,10,2, +10,44,65,84,51,254,155,106,109,129,0,1,0,183,254,78,1,93,5,204,0,3,1,207, +64,21,3,171,6,0,1,11,0,0,4,5,214,5,230,5,246,5,3,194,5,1,5,184,255,128,179, +226,229,72,5,184,255,192,64,10,222,225,72,2,5,18,5,2,218,5,184,255,128,179, +214,217,72,5,184,255,192,64,20,210,213,72,180,5,196,5,2,162,5,1,1,112,5,128, +5,144,5,3,5,184,255,192,64,20,199,202,72,0,5,1,240,5,1,212,5,228,5,2,176, +5,192,5,2,5,184,255,192,64,43,187,190,72,48,5,64,5,80,5,3,4,5,20,5,36,5,3, +240,5,1,196,5,212,5,228,5,3,128,5,144,5,160,5,3,4,5,20,5,36,5,3,164,5,184, +255,192,179,168,171,72,5,184,255,128,179,160,163,72,5,184,255,192,64,14,156, +159,72,112,5,128,5,144,5,3,228,5,1,5,184,255,192,64,11,145,148,72,176,5,192, +5,208,5,3,5,184,255,192,64,15,133,136,72,48,5,1,20,5,36,5,2,0,5,1,5,184,255, +192,64,15,122,125,72,128,5,1,4,5,20,5,36,5,3,110,5,184,255,192,64,10,114, +117,72,192,5,1,84,5,1,5,184,255,192,182,102,105,72,16,5,1,5,184,255,192,64, +9,91,94,72,80,5,96,5,2,5,184,255,192,64,15,79,82,72,203,5,219,5,2,160,5,176, +5,2,2,5,184,255,192,64,10,68,71,72,15,5,31,5,2,62,5,184,255,192,64,29,56, +61,72,207,5,1,96,5,112,5,160,5,176,5,4,31,5,1,0,5,1,160,5,224,5,240,5,3,5, +184,255,192,64,28,25,28,72,5,64,17,21,72,64,5,112,5,128,5,144,5,4,15,5,31, +5,47,5,3,7,1,0,0,0,47,63,1,94,93,93,43,43,113,114,114,114,114,43,94,93,43, +95,93,93,43,113,43,114,43,114,114,43,94,93,93,43,113,113,113,43,113,43,113, +114,43,43,43,94,93,93,93,93,113,113,43,113,113,113,114,43,114,95,114,114, +43,43,94,93,43,43,93,93,17,18,57,47,94,93,237,49,48,19,17,51,17,183,166,254, +78,7,126,248,130,0,0,0,0,1,0,34,254,87,2,135,5,204,0,45,0,98,185,0,40,255, +224,179,9,12,72,24,184,255,224,64,55,9,13,72,20,44,32,26,38,240,15,9,48,3, +1,192,3,208,3,2,3,9,32,245,47,31,111,31,2,15,31,79,31,223,31,239,31,4,47, +31,79,31,111,31,3,31,31,21,45,245,44,27,20,245,21,0,0,63,237,63,237,18,57, +47,93,113,114,237,57,1,47,93,113,51,51,253,50,50,205,50,49,48,43,43,19,50, +54,53,17,52,62,2,55,53,46,3,53,17,52,38,43,1,53,51,50,22,21,17,20,30,2,23, +21,14,3,21,17,20,14,2,43,1,53,94,91,79,28,51,71,43,42,70,52,29,79,91,60,132, +131,133,29,55,81,52,52,81,55,29,34,66,99,65,132,254,216,109,106,1,101,51, +84,65,44,10,2,10,44,64,84,50,1,100,108,107,129,152,141,254,150,62,88,56,28, +2,127,2,28,56,88,63,254,151,68,108,76,41,129,0,0,0,0,1,0,92,2,41,4,80,3,39, +0,32,0,154,64,26,90,3,138,3,2,25,2,41,2,57,2,3,30,48,10,16,72,13,31,1,25, +48,9,12,72,13,184,255,208,179,9,13,72,7,184,255,208,64,19,9,13,72,0,27,32, +27,112,27,3,27,32,10,1,10,24,173,64,10,184,255,192,180,38,60,72,10,0,184, +255,192,179,23,28,72,0,184,255,192,64,41,14,20,72,0,128,27,64,41,60,72,27, +5,173,31,14,79,14,159,14,3,111,14,127,14,159,14,175,14,207,14,239,14,255, +14,7,14,64,9,13,72,14,0,47,43,93,113,237,196,43,26,221,43,43,196,43,26,237, +1,47,93,47,93,49,48,0,43,43,43,93,43,93,93,1,34,38,39,38,35,34,14,2,7,53, +62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,76,69,145,73,129,88,38,65,60, +56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68,2,41, +44,26,45,12,23,32,21,143,38,46,13,20,26,13,8,15,14,8,50,42,149,23,30,19,8, +0,0,0,2,0,242,254,185,1,184,4,58,0,3,0,7,2,19,64,133,2,91,3,3,166,5,182,5, +2,5,150,105,6,185,6,2,70,6,86,6,2,57,6,1,6,64,23,27,72,182,6,198,6,2,73,6, +89,6,105,6,3,22,6,54,6,2,9,6,1,10,6,121,9,137,9,153,9,201,9,4,70,9,1,9,9, +57,9,2,249,9,1,182,9,1,105,9,121,9,169,9,3,38,9,1,9,9,1,204,217,9,233,9,2, +150,9,1,73,9,89,9,121,9,3,6,9,1,185,9,201,9,2,134,9,1,116,9,1,86,9,102,9, +2,68,9,1,22,9,38,9,54,9,3,9,184,255,192,64,14,168,171,72,180,9,1,134,9,150, +9,166,9,3,9,184,255,192,64,22,159,162,72,36,9,1,6,9,22,9,2,156,182,9,198, +9,214,9,246,9,4,9,184,255,64,64,14,147,150,72,102,9,1,150,9,166,9,182,9,3, +9,184,255,192,64,24,137,144,72,98,9,114,9,130,9,3,64,9,80,9,2,34,9,50,9,2, +16,9,1,9,184,255,64,182,117,124,72,128,9,1,9,184,255,64,64,10,110,115,72, +4,9,20,9,2,108,9,184,255,64,64,62,101,107,72,180,9,196,9,212,9,3,150,9,166, +9,2,132,9,1,118,9,1,82,9,98,9,2,36,9,52,9,68,9,3,6,9,22,9,2,246,9,1,194,9, +210,9,2,1,144,9,160,9,176,9,3,100,9,116,9,132,9,3,9,184,255,128,64,16,71, +75,72,212,9,228,9,244,9,3,160,9,176,9,2,9,184,255,192,64,61,59,64,72,16,9, +32,9,2,4,9,1,55,180,9,228,9,244,9,3,128,9,144,9,2,84,9,100,9,116,9,3,27,9, +1,0,9,1,240,9,1,196,9,212,9,228,9,3,84,9,100,9,164,9,212,9,228,9,244,9,6, +9,184,255,192,64,20,26,31,72,64,9,1,2,15,9,1,7,0,6,156,7,15,0,3,1,3,0,47, +93,63,253,206,1,94,93,95,93,43,93,113,113,114,114,114,114,114,94,93,93,43, +93,93,43,113,113,95,113,113,114,114,114,114,114,114,114,43,94,93,43,93,43, +113,113,113,113,43,113,114,43,114,94,93,93,43,93,93,43,113,113,113,113,113, +113,114,114,114,114,94,93,93,93,93,93,113,113,113,47,94,93,93,93,93,43,113, +113,113,237,113,51,47,237,49,48,1,51,19,35,19,21,35,53,1,10,148,24,196,198, +194,2,173,252,12,5,129,201,201,0,0,0,1,0,135,255,225,3,250,5,129,0,43,0,137, +64,31,88,14,104,14,2,87,20,103,20,2,26,28,1,21,6,1,6,3,1,25,10,22,0,11,1, +11,11,3,39,71,17,184,255,192,64,56,8,11,72,17,31,70,30,30,3,70,4,34,80,217, +31,1,124,31,140,31,2,25,31,1,31,22,96,25,112,25,2,160,25,1,25,23,3,12,213, +3,1,112,3,128,3,2,21,3,101,3,2,3,0,80,9,10,0,47,221,237,51,93,93,93,51,63, +221,93,113,50,50,93,93,93,237,1,47,237,51,47,237,47,43,237,18,57,47,113,51, +205,50,49,48,0,93,93,93,93,93,1,50,54,55,23,14,3,7,21,35,53,46,3,53,52,62, +2,55,53,51,21,30,3,23,7,46,1,35,34,14,2,21,20,30,2,2,84,96,129,15,182,8,51, +88,126,83,124,111,154,95,43,66,111,146,80,124,78,120,86,54,12,185,14,114, +105,77,103,64,27,27,64,105,1,21,104,108,12,62,116,92,62,8,168,168,10,93,149, +195,113,150,206,131,63,7,155,155,8,55,85,109,63,14,90,106,51,103,156,105, +93,156,113,62,0,0,1,0,58,0,0,4,80,5,150,0,50,0,210,64,83,70,23,1,54,2,70, +2,2,21,18,37,18,53,18,3,36,0,39,13,6,26,111,25,25,39,0,44,110,6,35,39,110, +14,95,10,1,10,10,0,79,6,95,6,111,6,3,6,50,111,0,0,32,0,2,0,0,32,0,48,0,80, +0,112,0,144,0,176,0,208,0,8,0,0,16,0,48,0,192,0,224,0,5,0,184,255,192,64, +64,14,18,72,0,38,11,81,35,15,14,31,14,175,14,3,15,14,63,14,111,14,127,14, +159,14,175,14,207,14,223,14,8,8,14,64,37,42,72,14,64,27,32,72,14,14,44,31, +115,26,20,7,7,44,116,22,50,118,50,134,50,3,50,6,24,0,63,51,93,237,50,63,51, +237,18,57,47,43,43,94,93,113,51,237,50,1,47,43,93,113,114,237,47,93,18,57, +47,113,51,237,50,16,237,17,18,57,47,237,17,51,17,18,57,49,48,0,93,1,93,0, +93,1,14,3,35,33,53,62,1,61,1,35,53,51,17,52,62,2,51,50,30,2,23,7,46,3,35, +34,6,21,17,33,21,33,21,20,14,2,7,33,50,62,2,55,4,80,9,57,89,115,67,253,70, +89,86,186,186,48,99,152,103,70,123,99,71,18,174,10,39,53,65,36,114,112,1, +152,254,104,22,44,63,40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160, +121,144,129,1,24,92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,254,224, +129,126,56,106,92,71,21,19,42,67,48,0,0,0,2,0,113,0,225,4,2,4,115,0,35,0, +55,0,153,64,119,74,29,90,29,106,29,3,44,29,60,29,2,74,25,90,25,106,25,3,44, +25,60,25,2,69,11,85,11,101,11,3,35,11,51,11,2,69,7,85,7,101,7,3,35,7,51,7, +2,74,34,90,34,106,34,3,45,34,61,34,2,69,20,85,20,101,20,3,35,20,51,20,2,69, +16,85,16,101,16,3,35,16,51,16,2,74,2,90,2,106,2,3,45,2,61,2,2,46,176,18,36, +176,207,0,223,0,2,0,0,1,0,47,57,1,41,176,27,51,176,9,0,47,237,220,237,1,93, +47,93,93,237,220,237,49,48,93,93,93,93,93,93,93,93,0,93,93,93,93,93,93,93, +93,19,52,54,55,39,55,23,62,1,51,50,22,23,55,23,7,30,1,21,20,6,7,23,7,39,14, +1,35,34,38,39,7,39,55,46,1,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,137, +41,37,100,104,99,54,127,73,71,126,54,97,104,96,37,43,44,38,100,102,101,54, +126,71,72,128,52,105,102,102,37,41,154,44,77,102,58,57,102,77,44,44,77,102, +57,58,102,77,44,2,172,71,127,54,100,103,101,39,43,42,38,97,105,96,54,127, +71,71,128,53,100,105,101,37,41,42,38,105,105,102,54,127,73,58,102,76,44,44, +76,102,58,58,102,76,45,45,76,102,0,1,255,254,0,0,4,118,5,129,0,22,0,185,64, +134,151,0,167,0,2,152,17,168,17,2,73,22,1,70,18,1,155,21,171,21,2,74,21,106, +21,122,21,138,21,4,148,19,164,19,2,69,19,101,19,117,19,133,19,4,19,15,18, +31,18,79,18,143,18,4,18,9,21,0,22,16,22,64,22,128,22,4,22,20,4,0,8,92,17, +13,0,9,16,9,64,9,128,9,4,7,9,3,15,81,16,7,11,81,4,47,12,159,12,175,12,3,12, +64,41,45,72,0,12,16,12,32,12,160,12,4,12,20,0,0,16,1,15,16,175,16,2,8,16, +16,8,21,18,3,8,18,0,63,63,51,18,57,47,94,93,113,51,51,222,93,43,113,50,237, +50,16,237,50,1,47,94,93,51,51,253,50,50,57,204,93,50,16,204,93,50,49,48,93, +93,93,93,93,93,93,93,1,33,21,33,21,33,21,33,17,35,17,33,53,33,55,33,53,33, +1,51,9,1,51,2,208,1,65,254,129,1,127,254,129,178,254,131,1,125,2,254,129, +1,64,254,91,199,1,115,1,119,199,2,197,125,154,127,254,209,1,47,127,154,125, +2,188,253,121,2,135,0,2,0,183,254,78,1,93,5,204,0,3,0,7,1,221,64,23,3,7,171, +0,6,4,1,11,4,4,8,9,214,9,230,9,246,9,3,194,9,1,9,184,255,128,179,226,229, +72,9,184,255,192,64,10,222,225,72,2,9,18,9,2,218,9,184,255,128,179,214,217, +72,9,184,255,192,64,20,210,213,72,180,9,196,9,2,162,9,1,1,112,9,128,9,144, +9,3,9,184,255,192,64,20,199,202,72,0,9,1,240,9,1,212,9,228,9,2,176,9,192, +9,2,9,184,255,192,64,43,187,190,72,48,9,64,9,80,9,3,4,9,20,9,36,9,3,240,9, +1,196,9,212,9,228,9,3,128,9,144,9,160,9,3,4,9,20,9,36,9,3,164,9,184,255,192, +179,168,171,72,9,184,255,128,179,160,163,72,9,184,255,192,64,14,156,159,72, +112,9,128,9,144,9,3,228,9,1,9,184,255,192,64,11,145,148,72,176,9,192,9,208, +9,3,9,184,255,192,64,15,133,136,72,48,9,1,20,9,36,9,2,0,9,1,9,184,255,192, +64,15,122,125,72,128,9,1,4,9,20,9,36,9,3,110,9,184,255,192,64,10,114,117, +72,192,9,1,84,9,1,9,184,255,192,182,102,105,72,16,9,1,9,184,255,192,64,9, +91,94,72,80,9,96,9,2,9,184,255,192,64,15,79,82,72,203,9,219,9,2,160,9,176, +9,2,2,9,184,255,192,64,10,68,71,72,15,9,31,9,2,62,9,184,255,192,64,29,56, +61,72,207,9,1,96,9,112,9,160,9,176,9,4,31,9,1,0,9,1,160,9,224,9,240,9,3,9, +184,255,192,64,33,25,28,72,9,64,17,21,72,64,9,112,9,128,9,144,9,4,15,9,31, +9,47,9,3,7,5,0,5,0,1,4,1,0,0,63,47,18,57,57,47,47,1,94,93,93,43,43,113,114, +114,114,114,43,94,93,43,95,93,93,43,113,43,114,43,114,114,43,94,93,93,43, +113,113,113,43,113,43,113,114,43,43,43,94,93,93,93,93,113,113,43,113,113, +113,114,43,114,95,114,114,43,43,94,93,43,43,93,93,17,18,57,47,94,93,51,237, +50,49,48,19,17,51,17,3,17,51,17,183,166,166,166,2,194,3,10,252,246,251,140, +3,11,252,245,0,0,0,0,2,0,115,255,84,4,0,5,204,0,77,0,97,1,79,64,144,117,47, +133,47,2,122,8,138,8,2,100,85,1,43,85,107,85,2,45,81,109,81,2,45,57,109,57, +125,57,141,57,4,85,96,117,96,133,96,3,83,62,115,62,131,62,3,83,90,115,90, +131,90,3,121,80,137,80,2,111,80,1,90,80,1,45,80,1,116,16,132,16,2,54,16,70, +16,2,42,73,1,37,42,1,37,45,1,43,3,1,25,3,1,5,31,21,31,2,5,36,21,36,2,11,76, +27,76,2,14,73,75,34,73,55,144,75,1,75,55,75,55,78,70,29,65,24,6,73,5,5,24, +73,160,78,1,0,78,32,78,64,78,144,78,4,78,184,255,192,179,29,33,72,78,184, +255,192,64,18,21,26,72,78,45,73,44,44,88,73,0,65,32,65,176,65,3,65,184,255, +192,64,68,34,38,72,65,217,55,1,203,55,1,188,55,1,152,55,1,245,3,1,230,3,1, +149,3,1,121,83,1,106,83,1,218,83,1,155,83,1,228,14,244,14,2,166,14,1,119, +14,135,14,2,104,14,1,14,83,93,55,4,0,50,81,45,39,11,81,6,0,0,0,63,50,237, +47,51,237,18,23,57,93,93,93,93,93,93,113,113,93,93,93,93,93,93,93,1,47,43, +93,237,51,47,237,47,43,43,93,113,237,50,16,237,17,18,57,57,17,57,57,47,47, +114,16,237,16,237,49,48,93,93,93,93,93,0,93,93,1,93,0,93,93,93,93,93,93,93, +93,93,93,93,93,1,93,93,93,1,50,30,2,23,7,46,3,35,34,6,21,20,30,2,23,30,3, +21,20,14,2,7,30,3,21,20,14,2,35,34,46,2,39,55,30,3,51,50,62,2,53,52,46,2, +39,46,3,53,52,62,2,55,46,3,53,52,54,1,52,46,2,39,14,3,21,20,30,2,23,62,3, +2,76,79,138,108,73,15,161,8,46,68,84,46,125,129,50,83,109,59,68,139,112,70, +28,55,82,54,49,79,55,30,58,112,164,107,93,154,117,79,19,161,12,54,78,100, +57,58,102,76,45,57,95,123,65,65,131,104,65,32,59,84,53,42,75,57,33,211,1, +225,53,88,113,61,58,89,60,31,49,82,108,60,54,93,68,39,5,204,30,63,98,69,20, +45,58,34,13,79,71,45,64,46,32,14,16,46,73,106,76,45,87,73,55,13,21,51,64, +81,51,73,117,83,44,27,64,104,77,31,55,67,37,13,18,40,65,47,54,72,51,36,16, +15,46,73,105,74,45,83,71,53,15,14,46,64,80,48,139,155,252,203,48,69,51,35, +14,3,33,52,69,39,46,66,48,34,15,1,24,47,70,0,0,0,0,2,0,45,4,195,2,90,5,123, +0,3,0,7,0,193,178,3,133,0,184,255,192,179,19,22,72,0,184,255,192,64,131,13, +16,72,0,7,133,4,64,19,22,72,4,64,14,17,72,4,1,5,145,0,59,4,1,45,4,1,11,4, +27,4,2,57,253,4,1,235,4,1,219,4,1,201,4,1,171,4,187,4,2,153,4,1,141,4,1,1, +4,128,44,48,72,27,4,43,4,2,15,4,1,235,4,251,4,2,191,4,207,4,223,4,3,171,4, +1,159,4,1,123,4,139,4,2,111,4,1,91,4,1,79,4,1,59,4,1,31,4,47,4,2,2,15,4,63, +4,175,4,191,4,4,4,64,22,25,72,4,64,14,17,72,4,0,47,43,43,93,95,113,113,113, +113,113,113,113,113,113,113,114,114,43,95,114,114,114,114,114,114,114,94, +93,93,93,51,237,50,1,47,43,43,237,220,43,43,237,49,48,1,53,51,21,33,53,51, +21,1,183,163,253,211,165,4,195,184,184,184,184,0,0,0,0,3,0,31,255,240,5,197, +5,150,0,25,0,49,0,91,0,245,64,111,138,81,1,10,73,26,73,42,73,3,10,69,26,69, +42,69,3,76,60,1,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,138, +90,154,90,2,53,81,69,81,2,58,61,1,133,52,149,52,2,54,46,70,46,2,54,41,70, +41,2,57,35,73,35,2,57,30,73,30,2,50,196,81,61,95,71,111,71,2,71,61,71,61, +14,0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,68, +15,23,72,26,38,195,111,14,127,14,2,14,60,55,201,66,87,201,76,82,76,15,66, +127,66,2,15,66,31,66,127,66,143,66,159,66,255,66,6,0,76,1,0,76,16,76,112, +76,128,76,144,76,240,76,6,66,76,66,76,7,33,200,21,4,43,200,7,19,0,63,237, +63,237,18,57,57,47,47,93,113,93,113,17,51,16,237,16,237,51,1,47,113,237,47, +43,93,113,237,17,57,57,47,47,93,17,51,237,49,48,0,93,93,93,93,93,93,93,93, +1,93,93,93,93,113,93,93,113,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18, +7,52,46,4,35,34,14,2,21,20,30,2,51,50,62,4,37,20,30,2,51,50,62,2,55,23,14, +3,35,34,46,2,53,52,62,2,51,50,30,2,23,7,46,3,35,34,14,2,5,197,52,94,131,161, +185,100,99,185,160,133,94,52,52,94,132,161,184,100,150,1,7,197,113,92,45, +82,116,140,161,87,130,228,171,99,99,171,228,130,87,161,140,116,82,45,252, +137,33,67,100,67,49,75,56,39,14,115,22,58,82,111,75,101,149,98,48,48,97,146, +98,75,112,80,55,18,114,12,38,55,72,47,69,99,64,30,2,195,100,185,161,131,94, +52,52,94,131,161,185,100,100,184,161,132,94,52,114,196,254,249,150,86,161, +139,115,82,45,99,171,228,130,131,229,171,98,45,81,115,140,161,89,72,120,86, +48,27,45,55,29,35,43,81,63,38,64,114,158,94,97,157,111,59,36,59,75,39,33, +26,50,38,23,46,83,118,0,2,0,26,2,139,2,253,5,152,0,50,0,65,0,203,64,21,45, +40,10,17,72,46,40,10,17,72,3,40,11,17,72,7,24,11,14,72,29,184,255,216,64, +16,9,17,72,23,51,1,39,39,32,226,47,11,212,56,1,56,184,255,192,64,18,19,22, +72,144,56,1,100,56,116,56,132,56,3,80,56,1,2,56,184,255,192,64,20,10,13,72, +56,20,227,21,21,63,227,5,64,22,38,72,5,192,67,1,67,184,255,192,64,51,13,18, +72,26,57,1,11,57,1,57,228,152,20,1,20,8,10,13,72,20,16,11,1,2,11,1,11,11, +26,35,7,51,1,51,228,0,42,42,0,0,32,0,80,0,3,0,0,17,228,26,222,0,63,237,51, +47,93,51,47,16,237,93,50,17,57,47,93,93,51,43,93,237,93,93,1,43,93,47,43, +237,51,47,237,47,43,95,93,93,93,43,113,51,51,237,50,47,0,93,49,48,1,43,43, +43,43,43,1,34,46,2,53,52,62,2,63,1,53,52,46,2,35,34,6,7,39,62,3,51,50,30, +2,21,17,20,22,51,50,54,55,21,14,1,35,34,46,2,39,35,14,1,39,50,62,2,61,1,7, +14,3,21,20,22,1,4,53,86,62,33,51,86,113,62,178,21,39,56,35,67,81,9,149,7, +43,75,108,71,68,109,77,42,28,35,12,22,9,19,42,22,41,57,38,20,2,4,38,132,51, +48,80,57,32,138,41,74,55,32,58,2,139,29,56,82,52,69,92,56,24,1,4,60,46,60, +35,14,59,76,10,47,82,62,35,29,60,95,66,254,204,58,50,5,3,104,5,8,22,39,51, +29,77,70,111,34,55,71,37,65,4,2,11,29,52,43,56,65,0,0,2,0,83,0,141,4,32,3, +172,0,8,0,17,0,113,64,84,106,12,122,12,138,12,3,106,9,122,9,138,9,3,106,3, +122,3,138,3,3,106,0,122,0,138,0,3,17,236,15,235,14,236,95,10,127,10,143,10, +3,64,10,96,10,2,31,10,1,10,7,236,6,235,5,236,176,1,1,95,1,1,32,1,96,1,128, +1,3,1,9,0,239,12,15,3,47,3,111,3,127,3,4,3,0,47,93,51,228,50,1,47,93,113, +113,237,237,237,47,93,93,113,237,237,237,49,48,93,93,93,93,37,1,53,1,51,21, +9,1,21,33,1,53,1,51,21,9,1,21,3,118,254,174,1,82,168,254,174,1,84,253,131, +254,176,1,80,167,254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,1, +109,63,1,115,31,254,140,254,145,29,0,1,0,100,0,180,4,71,2,242,0,5,0,51,64, +19,223,2,1,32,2,1,2,5,170,224,0,1,159,0,1,80,0,1,0,184,255,192,64,9,9,12, +72,0,2,173,0,3,179,0,63,204,237,1,47,43,93,93,93,237,47,93,93,49,48,37,17, +33,53,33,17,3,182,252,174,3,227,180,1,172,146,253,194,0,0,4,0,31,255,240, +5,197,5,150,0,25,0,49,0,63,0,72,0,240,183,4,61,20,61,36,61,3,58,184,255,224, +64,94,11,16,72,57,47,73,47,2,54,40,70,40,2,54,36,70,36,2,57,29,73,29,2,61, +32,9,13,72,54,46,70,46,2,54,41,70,41,2,57,35,73,35,2,57,30,73,30,2,6,69,22, +69,2,51,62,62,69,63,69,53,196,54,64,196,59,59,50,63,63,16,54,63,54,63,14, +0,195,0,26,16,26,48,26,64,26,4,16,26,32,26,64,26,3,26,184,255,192,64,60,15, +23,72,26,38,195,111,14,127,14,2,14,50,50,54,62,52,201,69,9,68,25,68,2,68, +201,55,15,54,31,54,127,54,3,223,55,1,0,55,16,55,112,55,3,54,69,55,55,69,54, +3,7,33,200,21,4,43,200,7,19,0,63,237,63,237,18,23,57,47,47,47,93,113,93,16, +237,93,16,237,50,17,51,47,1,47,113,237,47,43,93,113,237,17,57,57,47,47,56, +17,51,51,47,237,16,237,50,17,18,57,17,51,0,93,49,48,93,93,93,93,43,1,93,93, +93,93,43,93,1,20,14,4,35,34,46,4,53,52,62,4,51,50,4,22,18,7,52,46,4,35,34, +14,2,21,20,30,2,51,50,62,4,1,3,35,17,35,17,33,50,22,21,20,6,7,19,3,52,38, +43,1,17,51,50,54,5,197,52,94,131,161,185,100,99,185,160,133,94,52,52,94,132, +161,184,100,150,1,7,197,113,92,45,82,116,140,161,87,130,228,171,99,99,171, +228,130,87,161,140,116,82,45,254,82,199,161,127,1,51,142,151,104,85,221,159, +95,81,170,182,80,84,2,195,100,185,161,131,94,52,52,94,131,161,185,100,100, +184,161,132,94,52,114,196,254,249,150,86,161,139,115,82,45,99,171,228,130, +131,229,171,98,45,81,115,140,161,254,181,1,80,254,176,3,63,126,111,102,123, +19,254,162,2,80,69,72,254,211,85,0,0,1,255,239,5,172,4,124,6,10,0,3,0,14, +180,1,0,2,140,1,0,47,237,1,47,47,49,48,1,33,53,33,4,124,251,115,4,141,5,172, +94,0,0,0,0,2,0,122,3,92,2,184,5,150,0,19,0,39,0,66,185,0,17,255,232,179,9, +12,72,13,184,255,232,64,33,9,12,72,7,24,9,12,72,3,24,9,12,72,20,172,0,30, +172,0,10,16,10,32,10,3,10,35,175,5,25,175,15,4,0,63,237,220,237,1,47,93,237, +220,237,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7, +52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,184,45,78,105,59,59,104,78,46, +46,78,104,59,59,105,78,45,109,27,48,65,38,37,65,48,28,28,48,65,37,38,65,48, +27,4,121,59,104,77,45,45,77,104,59,60,104,77,44,44,77,104,60,37,66,49,28, +28,49,66,37,37,65,49,29,29,49,65,0,0,0,2,0,65,0,0,4,36,4,195,0,11,0,15,0, +85,64,53,13,222,4,1,140,4,1,4,2,14,209,11,1,131,11,1,11,9,1,170,6,32,2,1, +2,13,173,12,151,2,1,2,0,4,173,9,152,7,1,7,239,5,1,80,5,128,5,160,5,208,5, +4,5,0,47,93,93,51,93,51,237,50,50,93,47,237,1,47,93,51,253,50,222,93,93,196, +16,222,93,93,196,49,48,1,17,35,17,33,53,33,17,51,17,33,21,1,53,33,21,2,124, +147,254,88,1,168,147,1,168,252,29,3,227,2,168,254,117,1,139,145,1,138,254, +118,145,253,88,145,145,0,0,1,0,41,2,51,2,131,5,141,0,34,0,142,64,56,6,18, +1,6,17,1,6,12,1,106,31,122,31,138,31,3,89,15,105,15,2,106,14,1,73,14,89,14, +2,10,3,26,3,2,10,2,26,2,58,2,74,2,4,58,17,90,17,106,17,3,6,23,22,23,2,23, +184,255,224,64,40,9,15,72,33,25,225,32,8,1,32,8,96,8,160,8,224,8,4,8,14,224, +15,15,32,191,0,1,0,8,32,14,11,228,20,222,1,32,229,0,223,0,63,237,50,63,237, +51,18,57,1,47,93,51,51,47,237,47,93,113,237,50,49,48,43,0,93,93,1,93,93,0, +93,93,93,93,1,113,113,113,19,39,62,5,53,52,38,35,34,6,7,39,62,3,51,50,30, +2,21,20,14,4,7,33,21,43,2,27,88,100,103,82,52,71,74,68,88,8,133,6,46,76,107, +68,65,103,71,37,54,83,102,95,78,18,1,187,2,51,103,61,96,81,72,73,80,49,62, +75,73,68,8,51,87,64,37,33,60,86,54,62,100,86,75,73,74,42,113,0,0,1,0,27,2, +39,2,130,5,141,0,53,0,150,64,17,102,6,1,102,8,1,86,9,102,9,2,89,34,105,34, +2,42,184,255,232,64,80,11,15,72,2,32,9,13,72,48,45,21,21,15,8,28,225,45,45, +0,225,32,15,96,15,2,32,15,96,15,160,15,224,15,4,15,34,225,8,35,1,35,35,9, +225,191,8,1,8,64,24,37,72,8,49,21,228,22,22,12,105,34,1,72,34,88,34,2,34, +31,228,40,222,12,228,71,9,1,9,3,221,0,63,51,93,237,63,237,51,93,93,18,57, +47,237,57,1,47,43,93,237,51,47,113,237,47,93,113,237,50,47,237,17,18,57,47, +18,57,49,48,0,43,43,93,93,93,93,1,20,6,35,34,46,2,39,55,30,1,51,50,54,53, +52,46,2,43,1,53,51,50,62,2,53,52,38,35,34,6,7,39,62,3,51,50,30,2,21,20,6, +7,21,30,3,2,130,155,142,87,116,73,36,6,136,9,88,85,77,83,37,56,67,29,61,57, +29,61,50,32,74,71,68,84,6,135,7,50,79,102,59,69,104,70,35,86,90,52,75,48, +22,3,27,116,128,39,64,81,43,13,67,69,72,76,45,54,29,9,109,13,31,53,40,60, +69,70,65,12,58,86,57,28,33,59,79,46,75,110,20,2,5,37,54,69,0,0,1,0,72,4,177, +1,240,5,228,0,5,0,55,64,37,70,4,1,122,2,138,2,2,128,3,1,3,64,143,0,1,0,64, +9,13,72,0,2,149,128,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,26,237,1,47,43, +93,26,205,93,49,48,93,93,19,53,19,51,21,1,72,217,207,254,182,4,177,20,1,31, +29,254,234,0,1,0,140,254,87,4,109,4,58,0,39,0,136,64,74,29,32,9,17,72,138, +37,154,37,2,108,37,124,37,2,37,24,14,17,72,22,22,13,70,64,31,79,12,1,127, +12,143,12,159,12,3,12,64,32,35,72,12,64,20,23,72,0,12,1,12,41,128,39,2,70, +0,1,16,1,48,1,224,1,240,1,5,8,1,96,41,128,41,2,41,184,255,192,64,17,20,23, +72,31,8,80,35,22,19,80,26,22,12,1,15,0,27,0,63,63,51,63,237,63,237,50,1,43, +93,47,94,93,237,50,26,16,220,93,43,43,93,113,50,26,237,50,47,49,48,43,0,93, +93,1,43,19,17,51,17,20,30,2,51,50,54,53,17,51,17,20,30,2,51,50,54,55,21,14, +1,35,34,46,2,39,35,14,1,35,34,38,39,17,140,181,32,58,84,52,128,146,180,11, +20,29,18,11,32,11,26,51,36,54,71,44,20,2,3,52,147,100,67,109,31,254,87,5, +227,253,82,78,106,65,28,174,162,2,115,252,208,44,56,32,13,5,3,129,8,12,30, +52,71,41,95,99,41,38,254,28,0,0,0,0,1,0,80,254,248,3,245,5,129,0,19,0,61, +64,39,12,1,15,2,191,2,207,2,3,2,5,95,6,111,6,127,6,175,6,191,6,5,0,6,16,6, +48,6,3,6,7,7,1,0,4,17,3,6,1,0,47,51,63,205,50,18,57,47,1,47,93,93,205,220, +93,205,47,49,48,1,17,35,17,35,17,35,17,34,46,2,53,52,62,2,51,33,21,3,116, +112,217,113,80,133,96,53,50,95,138,87,2,51,5,27,249,221,6,35,249,221,3,190, +45,88,133,89,84,133,93,50,102,0,0,1,0,187,1,190,1,126,2,154,0,3,0,38,64,24, +3,150,0,0,16,0,176,0,3,7,0,0,155,15,1,31,1,2,1,64,15,38,72,1,0,47,43,93,237, +1,47,94,93,237,49,48,19,53,51,21,187,195,1,190,220,220,0,0,0,1,0,119,254, +78,1,227,0,0,0,27,0,126,64,16,24,32,20,23,72,25,32,20,23,72,70,26,86,26,2, +2,184,255,232,179,9,17,72,27,184,255,224,64,62,9,17,72,24,16,25,32,25,48, +25,3,25,131,23,22,22,8,16,131,47,0,1,31,0,1,15,0,111,0,2,8,0,239,8,1,8,19, +25,64,9,13,72,25,25,5,23,11,140,32,5,80,5,96,5,112,5,176,5,192,5,6,5,0,47, +93,237,47,18,57,47,43,205,1,47,93,221,94,93,113,114,237,18,57,47,51,237,93, +50,49,48,43,43,93,43,43,5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35, +42,1,7,55,51,7,30,1,1,227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14, +29,14,65,107,39,94,94,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,182,100, +3,81,0,0,1,0,80,2,51,2,125,5,129,0,10,0,75,64,44,32,5,48,5,2,96,9,1,9,9,8, +224,2,32,4,48,4,2,4,111,0,1,0,0,4,6,3,32,2,144,2,2,2,5,4,4,3,6,220,8,1,228, +0,223,0,63,237,50,63,51,51,47,51,1,47,93,23,51,47,93,47,0,93,1,16,237,50, +47,93,49,48,0,93,19,53,51,17,7,53,55,51,17,51,21,80,211,202,210,123,215,2, +51,107,2,108,138,120,137,253,29,107,0,0,0,0,2,0,27,2,139,2,211,5,152,0,15, +0,35,0,130,185,0,13,255,232,179,7,12,72,9,184,255,224,64,43,7,12,72,4,32, +7,12,72,2,32,7,12,72,0,227,4,16,36,16,52,16,100,16,4,148,16,180,16,196,16, +212,16,244,16,5,128,16,1,2,0,16,1,16,184,255,192,64,38,12,16,72,16,26,227, +6,64,22,33,72,6,239,37,1,112,37,128,37,2,47,37,1,31,228,0,3,32,3,80,3,3,3, +3,21,228,11,222,0,63,237,51,47,93,237,1,93,93,93,47,43,237,47,43,93,95,93, +93,113,237,49,48,0,43,43,43,43,1,20,6,35,34,38,53,52,62,2,51,50,30,2,7,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,211,176,175,168,177,43,87,131,88, +93,131,84,39,149,25,50,72,48,48,75,51,26,28,51,70,43,49,75,52,27,4,18,188, +203,201,190,91,145,101,53,53,100,145,92,83,110,65,27,27,66,110,82,84,110, +66,26,26,66,110,0,2,0,83,0,141,4,32,3,172,0,8,0,17,0,133,64,100,101,15,117, +15,133,15,3,101,9,117,9,133,9,3,101,6,117,6,133,6,3,101,0,117,0,133,0,3,13, +236,10,236,17,235,15,12,1,239,12,1,112,12,128,12,2,208,12,1,63,12,111,12, +127,12,3,0,12,1,12,4,236,1,236,8,235,112,3,128,3,176,3,3,176,3,208,3,2,63, +3,1,0,3,32,3,2,3,10,0,239,14,15,5,47,5,111,5,127,5,4,5,0,47,93,51,228,50, +1,47,93,93,93,113,253,237,237,47,93,93,93,113,113,114,253,237,237,49,48,93, +93,93,93,37,35,53,9,1,53,51,1,21,1,35,53,9,1,53,51,1,21,2,206,168,1,82,254, +176,166,1,82,252,221,170,1,82,254,176,168,1,79,141,29,1,111,1,116,31,254, +141,63,254,147,29,1,111,1,116,31,254,141,63,255,255,0,56,0,0,6,78,5,129,16, +38,0,121,232,0,16,39,2,20,2,249,0,0,17,7,2,141,3,184,253,207,0,31,64,18,1, +191,12,1,112,12,1,96,12,1,16,12,1,12,3,2,17,24,0,63,53,53,1,17,93,93,93,93, +53,0,0,0,255,255,0,56,0,0,6,117,5,129,16,38,0,121,232,0,16,39,2,20,2,249, +0,0,17,7,0,114,3,242,253,207,0,47,64,30,2,111,15,1,47,15,1,15,1,191,12,1, +112,12,1,96,12,1,16,12,1,12,51,64,11,11,72,2,15,24,0,63,53,1,43,17,93,93, +93,93,53,17,93,93,53,0,0,0,255,255,0,73,0,0,6,78,5,141,16,39,2,20,3,13,0, +0,16,39,2,141,3,184,253,207,17,6,0,115,46,0,0,33,64,20,0,112,0,1,96,0,1,16, +0,1,0,83,64,11,11,72,1,2,6,24,0,63,53,53,1,43,17,93,93,93,53,0,0,2,0,131, +254,164,4,86,4,58,0,37,0,41,0,159,64,112,121,4,137,4,2,122,35,138,35,2,122, +36,138,36,2,84,26,100,26,2,58,6,74,6,122,6,138,6,4,10,72,9,9,176,39,192,39, +2,39,150,40,40,0,28,70,95,27,127,27,2,27,64,29,60,72,27,64,23,27,72,32,27, +1,27,19,70,0,64,29,60,72,0,64,23,27,72,0,64,13,17,72,32,0,1,0,32,43,1,19, +33,9,40,156,41,15,67,27,1,27,24,95,47,33,63,33,2,111,33,207,33,2,33,0,47, +93,113,237,51,93,63,253,206,17,57,1,93,47,93,43,43,43,237,47,93,43,43,93, +237,18,57,47,237,113,51,47,237,49,48,93,0,93,1,93,0,93,1,93,55,52,62,6,55, +51,14,7,21,20,30,2,51,50,54,55,23,14,3,35,34,46,2,1,21,35,53,131,37,62,79, +82,79,63,39,1,175,2,39,62,78,80,77,60,37,42,77,109,67,140,164,14,184,11,67, +121,179,122,114,178,123,64,2,113,195,50,71,108,85,67,60,58,68,83,55,69,104, +80,63,57,57,70,88,59,59,92,63,32,140,122,12,84,149,112,65,56,103,147,4,100, +201,201,0,0,0,255,255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,148,1,78,0, +0,0,21,180,2,21,5,38,2,184,255,225,180,22,25,4,7,37,1,43,53,0,43,53,0,255, +255,0,4,0,0,5,82,6,240,18,38,0,36,0,0,17,7,2,149,1,219,0,0,0,19,64,11,2,21, +5,38,2,76,21,24,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,6,254,18, +38,0,36,0,0,17,7,2,150,1,96,0,0,0,19,64,11,2,22,5,38,2,0,27,21,4,7,37,1,43, +53,0,43,53,0,0,0,255,255,0,4,0,0,5,82,7,6,18,38,0,36,0,0,17,7,2,153,1,94, +0,0,0,19,64,11,2,21,5,38,2,2,30,44,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0, +4,0,0,5,82,6,178,18,38,0,36,0,0,17,7,2,152,1,108,0,0,0,23,64,13,3,2,21,5, +38,3,2,4,25,23,4,7,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,4,0,0,5,82,6, +251,18,38,0,36,0,0,17,7,1,76,1,137,0,136,0,22,64,12,3,2,56,3,3,2,3,31,21, +4,7,37,1,43,53,53,0,63,53,53,0,2,0,24,0,0,7,168,5,129,0,15,0,26,0,136,64, +86,116,25,1,114,2,1,86,2,102,2,2,115,3,131,3,2,85,3,101,3,2,127,5,143,5,2, +109,5,1,92,5,1,25,5,41,5,2,0,7,1,11,7,11,7,0,16,14,32,14,2,14,2,25,3,17,3, +4,17,9,13,90,26,5,0,2,95,25,25,5,4,12,95,9,9,13,16,8,95,5,3,4,18,13,95,0, +18,0,63,237,63,63,237,50,18,57,47,237,17,18,57,47,237,1,47,51,51,237,50,51, +47,51,17,18,57,57,47,93,18,57,57,47,47,113,49,48,93,93,93,93,93,93,93,93, +93,33,17,33,3,35,1,33,21,33,17,33,21,33,17,33,21,1,35,14,5,7,3,33,3,201,253, +220,198,199,2,174,4,185,253,9,2,187,253,69,3,32,252,33,151,1,16,22,27,24, +18,2,217,1,222,1,156,254,100,5,129,156,254,60,154,254,21,156,4,238,3,35,50, +58,51,38,5,254,51,0,0,255,255,0,104,254,78,5,121,5,150,18,38,0,38,0,0,17, +7,0,120,1,254,0,0,0,11,182,1,58,48,40,26,16,37,1,43,53,0,0,0,255,255,0,168, +0,0,4,254,6,240,18,38,0,40,0,0,17,7,2,148,1,63,0,0,0,21,180,1,12,5,38,1,184, +255,170,180,13,16,0,10,37,1,43,53,0,43,53,0,255,255,0,168,0,0,4,254,6,240, +18,38,0,40,0,0,17,7,2,149,1,223,0,0,0,19,64,11,1,12,5,38,1,40,12,15,0,10, +37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40,0,0,17, +7,2,150,1,119,0,0,0,21,180,1,13,5,38,1,184,255,239,180,18,12,0,10,37,1,43, +53,0,43,53,0,255,255,0,168,0,0,4,254,6,178,18,38,0,40,0,0,17,7,2,152,1,121, +0,0,0,25,182,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10,37,1,43,53,53,0,43, +53,53,0,255,255,0,9,0,0,1,177,6,240,18,38,0,44,0,0,17,6,2,148,159,0,0,21, +180,1,4,5,38,1,184,255,193,180,5,8,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0, +142,0,0,2,54,6,240,18,38,0,44,0,0,17,6,2,149,70,0,0,19,64,11,1,4,5,38,1,69, +4,7,0,2,37,1,43,53,0,43,53,0,255,255,255,210,0,0,2,104,6,254,18,38,0,44,0, +0,17,6,2,150,210,0,0,19,64,11,1,5,5,38,1,0,10,4,0,2,37,1,43,53,0,43,53,0, +255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218,0,0,23,64,13,2,1, +4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,2,0,14,0,0,5,101,5,129, +0,16,0,33,0,112,64,69,117,10,1,91,32,139,32,2,91,31,139,31,2,90,20,138,20, +2,91,19,1,10,31,26,31,2,10,20,26,20,2,26,26,28,8,90,64,15,17,1,17,35,128, +24,28,90,14,16,16,1,14,27,16,95,24,127,0,1,0,0,2,28,95,14,18,23,95,2,3,0, +63,237,63,237,17,57,47,113,51,237,50,1,47,51,51,47,16,237,50,26,16,220,113, +26,237,18,57,47,49,48,93,93,93,0,93,1,93,93,0,93,19,51,17,33,50,4,22,18,21, +20,2,14,1,35,33,17,35,37,52,46,2,35,33,17,33,21,33,17,33,50,62,2,14,154,1, +210,163,1,19,198,111,106,184,251,145,253,241,154,4,151,82,148,206,123,254, +241,1,150,254,106,1,58,111,189,138,78,3,33,2,96,81,169,254,252,180,176,254, +243,181,93,2,135,72,143,203,130,61,254,57,154,254,18,72,142,212,0,255,255, +0,168,0,0,5,32,7,6,18,38,0,49,0,0,17,7,2,153,1,161,0,0,0,19,64,11,1,20,5, +38,1,12,29,43,8,18,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6, +240,18,38,0,50,0,0,17,7,2,148,1,182,0,0,0,21,180,2,40,5,38,2,184,255,216, +180,41,44,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255,236,5,215,6,240,18,38, +0,50,0,0,17,7,2,149,2,37,0,0,0,19,64,11,2,40,5,38,2,37,40,43,10,0,37,1,43, +53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6,254,18,38,0,50,0,0,17,7,2,150, +1,213,0,0,0,19,64,11,2,41,5,38,2,4,46,40,10,0,37,1,43,53,0,43,53,0,0,0,255, +255,0,97,255,236,5,215,7,6,18,38,0,50,0,0,17,7,2,153,1,193,0,0,0,21,180,2, +40,5,38,2,184,255,245,180,49,63,10,0,37,1,43,53,0,43,53,0,255,255,0,97,255, +236,5,215,6,178,18,38,0,50,0,0,17,7,2,152,1,215,0,0,0,25,182,3,2,40,5,38, +3,2,184,255,255,180,44,42,10,0,37,1,43,53,53,0,43,53,53,0,0,1,0,142,0,225, +4,31,4,115,0,11,0,129,185,0,5,255,232,179,18,22,72,3,184,255,232,64,14,18, +22,72,11,24,18,22,72,9,24,18,22,72,8,184,255,232,179,18,22,72,6,184,255,232, +64,14,18,22,72,2,24,18,22,72,0,24,18,22,72,7,184,255,232,64,14,18,22,72,1, +24,18,22,72,10,24,18,22,72,4,184,255,232,64,23,18,22,72,212,4,228,4,2,180, +4,196,4,212,4,3,32,4,1,4,0,7,1,7,0,25,47,113,1,47,93,93,113,49,48,0,43,43, +1,43,43,43,43,43,43,0,43,43,43,43,19,9,1,55,9,1,23,9,1,7,9,1,142,1,98,254, +160,104,1,94,1,94,105,254,162,1,96,102,254,159,254,156,1,74,1,98,1,96,103, +254,159,1,95,105,254,164,254,160,105,1,97,254,157,0,3,0,71,255,203,5,244, +5,186,0,27,0,39,0,51,0,196,64,141,89,44,1,8,37,1,84,33,1,5,26,21,26,101,26, +3,139,23,1,123,22,139,22,2,108,22,1,90,22,1,105,16,1,10,12,26,12,2,132,9, +1,116,8,132,8,2,99,8,1,85,8,1,27,50,91,50,2,114,43,130,43,2,84,43,1,20,38, +84,38,2,85,37,1,140,31,1,74,31,90,31,122,31,3,4,21,20,21,100,21,3,11,7,27, +7,107,7,3,32,44,40,0,91,64,15,28,1,28,53,128,32,53,1,40,91,175,14,191,14, +2,32,14,1,15,14,31,14,2,14,43,31,35,47,95,23,19,4,35,95,9,5,19,0,63,51,237, +63,51,237,17,57,57,1,47,93,93,93,237,93,26,16,220,113,26,237,18,57,57,49, +48,0,93,93,93,93,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93, +93,1,20,2,6,4,35,34,38,39,7,35,55,38,2,53,52,18,54,36,51,50,22,23,55,51,7, +22,18,7,52,38,39,1,30,1,51,50,62,2,37,20,22,23,1,46,1,35,34,14,2,5,215,95, +180,254,252,165,127,206,81,120,190,200,88,86,92,178,1,5,169,125,207,82,121, +192,201,85,87,195,49,49,253,59,59,150,93,132,191,123,59,252,15,50,51,2,195, +59,151,92,126,190,127,63,2,199,165,254,242,192,104,58,54,145,241,97,1,10, +160,165,1,10,187,101,56,54,146,242,94,254,253,160,112,184,72,252,171,44,47, +86,153,212,125,113,190,75,3,85,42,46,80,148,208,0,0,255,255,0,158,255,236, +5,41,6,240,18,38,0,56,0,0,17,7,2,148,1,141,0,0,0,21,180,1,26,5,38,1,184,255, +232,180,27,30,5,20,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,6,240, +18,38,0,56,0,0,17,7,2,149,1,237,0,0,0,19,64,11,1,26,5,38,1,37,26,29,5,20, +37,1,43,53,0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,254,18,38,0,56,0,0, +17,7,2,150,1,152,0,0,0,19,64,11,1,27,5,38,1,0,32,26,5,20,37,1,43,53,0,43, +53,0,0,0,255,255,0,158,255,236,5,41,6,178,18,38,0,56,0,0,17,7,2,152,1,158, +0,0,0,25,182,2,1,26,5,38,2,1,184,255,254,180,30,28,5,20,37,1,43,53,53,0,43, +53,53,0,255,255,0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,149,1,208,0,0,0, +19,64,11,1,9,5,38,1,65,9,12,4,8,37,1,43,53,0,43,53,0,0,0,0,2,0,168,0,0,4, +234,5,129,0,16,0,27,0,95,64,63,150,15,1,116,26,132,26,2,123,18,139,18,2,0, +90,16,17,48,17,144,17,3,255,17,1,0,17,16,17,32,17,64,17,4,17,22,11,7,90,0, +8,16,8,64,8,3,7,8,22,95,6,21,95,11,6,11,6,11,7,9,3,7,18,0,63,63,18,57,57, +47,47,16,237,16,237,1,47,94,93,237,50,50,47,93,93,113,237,49,48,0,93,93,93, +1,20,14,2,35,33,17,35,17,51,21,33,50,30,2,7,52,38,35,33,17,33,50,62,2,4,234, +59,121,182,123,254,98,191,191,1,146,125,186,124,62,192,164,164,254,133,1, +131,82,121,79,38,2,223,88,159,120,71,254,215,5,129,252,60,111,156,99,134, +149,253,192,44,79,107,0,0,0,0,1,0,142,255,236,4,143,5,204,0,67,0,214,64,150, +149,51,1,133,63,149,63,2,133,47,149,47,2,133,46,149,46,2,118,65,1,118,56, +1,83,26,131,26,147,26,3,92,39,108,39,124,39,3,107,22,1,58,22,1,145,52,1,21, +52,37,52,2,22,66,38,66,118,66,3,26,3,42,3,2,61,72,24,54,72,31,32,24,1,31, +31,1,9,24,31,31,24,9,3,43,0,72,64,48,17,160,17,2,160,17,176,17,2,17,69,128, +42,70,0,43,16,43,48,43,3,8,43,112,69,1,63,69,79,69,2,212,31,1,197,31,1,182, +31,1,219,17,1,202,17,1,185,17,1,31,17,5,36,80,49,0,43,21,14,80,5,22,0,63, +237,63,63,237,18,57,57,93,93,93,93,93,93,1,93,93,47,94,93,237,26,16,220,93, +113,26,237,18,23,57,47,47,47,93,93,16,237,16,237,49,48,0,93,1,93,93,93,93, +93,0,93,93,1,93,93,0,93,93,93,93,1,20,14,2,35,34,38,47,1,30,3,51,50,54,53, +52,46,4,53,52,62,4,53,52,46,2,35,34,14,2,21,17,35,17,52,62,2,51,50,30,2,21, +20,14,4,21,20,30,4,4,143,41,87,136,94,80,148,55,2,25,67,74,78,37,92,98,54, +81,95,81,54,33,49,58,49,33,33,63,90,57,68,107,73,39,180,63,120,174,110,102, +155,105,53,33,51,58,51,33,55,82,95,82,55,1,39,66,115,85,49,25,24,164,14,25, +19,11,86,79,56,77,62,57,73,98,73,51,73,58,48,52,63,43,37,62,45,26,35,77,122, +88,252,3,4,3,118,173,112,54,46,80,109,62,61,90,69,53,47,48,28,38,59,57,64, +85,114,0,0,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,67,0, +188,0,0,0,21,180,2,66,17,38,2,184,255,149,180,67,70,3,36,37,1,43,53,0,43, +53,0,255,255,0,87,255,236,4,115,5,228,18,38,0,68,0,0,17,7,0,116,1,84,0,0, +0,19,64,11,2,66,17,38,2,11,66,69,3,36,37,1,43,53,0,43,53,0,0,0,255,255,0, +87,255,236,4,115,5,211,18,38,0,68,0,0,17,7,1,71,0,218,0,0,0,21,180,2,67,17, +38,2,184,255,192,180,72,66,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236, +4,115,5,189,18,38,0,68,0,0,17,7,1,78,0,245,0,0,0,21,180,2,66,17,38,2,184, +255,224,180,75,89,3,36,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,115,5, +123,18,38,0,68,0,0,17,7,0,105,0,235,0,0,0,25,182,3,2,66,17,38,3,2,184,255, +202,180,70,68,3,36,37,1,43,53,53,0,43,53,53,0,255,255,0,87,255,236,4,115, +6,115,18,38,0,68,0,0,17,7,1,76,1,8,0,0,0,25,182,3,2,71,17,38,3,2,184,255, +200,180,76,66,3,36,37,1,43,53,53,0,43,53,53,0,0,3,0,66,255,236,6,194,4,78, +0,62,0,79,0,88,0,251,64,96,134,54,1,122,36,1,123,58,1,117,8,133,8,2,101,68, +117,68,133,68,3,124,86,1,106,86,1,126,81,1,106,81,1,101,4,117,4,2,41,47,1, +41,44,1,24,40,9,13,72,10,28,26,28,2,17,53,88,1,70,33,31,79,79,79,95,79,127, +79,4,79,79,80,25,9,73,10,10,61,71,64,31,80,47,80,63,80,3,144,80,1,80,90,128, +44,71,45,184,255,192,64,19,21,28,72,45,45,71,71,25,64,12,15,72,25,62,80,80, +80,6,53,184,255,184,64,43,17,73,53,83,80,56,16,63,81,33,33,74,50,143,44,1, +43,44,1,44,44,39,80,50,16,17,74,80,22,22,6,80,15,239,9,1,128,9,1,9,9,15,22, +0,63,51,47,93,93,16,237,63,237,50,63,237,51,47,93,93,17,18,57,47,237,63,237, +50,43,18,57,47,237,1,47,43,237,51,47,43,237,26,16,220,93,113,26,237,50,47, +237,17,18,57,47,93,51,237,50,57,57,49,48,93,43,0,93,93,1,93,0,93,93,93,93, +1,93,0,93,1,93,0,93,93,1,21,30,3,51,50,54,55,23,14,3,35,32,3,14,3,35,34,38, +53,52,62,4,63,1,53,52,46,2,35,34,14,2,7,39,62,3,51,50,22,23,62,1,51,50,30, +2,29,1,37,7,14,5,21,20,22,51,50,62,2,53,37,46,1,35,34,14,2,7,3,200,1,34,70, +109,78,117,141,25,158,17,61,102,153,108,254,191,102,29,74,102,137,93,167, +169,38,67,91,107,117,60,240,26,57,88,61,54,88,64,39,7,188,10,58,105,159,112, +128,172,49,63,177,106,136,183,111,47,252,80,195,40,81,76,66,49,28,100,93, +90,129,83,40,2,246,15,144,135,45,96,81,54,4,1,247,17,82,136,98,55,94,72,45, +45,91,73,47,1,1,51,93,71,42,172,150,71,108,78,51,32,13,1,4,59,67,94,58,27, +15,39,67,51,17,64,107,78,43,70,69,74,65,88,155,210,122,24,31,4,1,6,18,31, +51,73,51,87,97,63,98,116,53,196,171,157,29,74,127,98,255,255,0,87,254,78, +3,202,4,78,18,38,0,70,0,0,17,7,0,120,1,12,0,0,0,11,182,1,40,48,40,19,9,37, +1,43,53,0,0,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,67,0, +221,0,0,0,21,180,2,38,17,38,2,184,255,228,180,39,42,17,27,37,1,43,53,0,43, +53,0,255,255,0,87,255,236,4,24,5,228,18,38,0,72,0,0,17,7,0,116,1,112,0,0, +0,19,64,11,2,38,17,38,2,84,38,41,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0, +87,255,236,4,24,5,211,18,38,0,72,0,0,17,7,1,71,0,245,0,0,0,19,64,11,2,39, +17,38,2,8,44,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,24, +5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3,2,4,42, +40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,10,0,0,1,178,5,228,18,38, +0,241,0,0,17,6,0,67,160,0,0,21,180,1,4,17,38,1,184,255,194,180,5,8,0,2,37, +1,43,53,0,43,53,0,0,0,255,255,0,135,0,0,2,47,5,228,18,38,0,241,0,0,17,6,0, +116,63,0,0,19,64,11,1,4,17,38,1,63,4,7,0,2,37,1,43,53,0,43,53,0,255,255,255, +211,0,0,2,105,5,211,18,38,0,241,0,0,17,6,1,71,211,0,0,19,64,11,1,5,17,38, +1,2,10,4,0,2,37,1,43,53,0,43,53,0,255,255,0,8,0,0,2,53,5,123,18,38,0,241, +0,0,17,6,0,105,219,0,0,23,64,13,2,1,4,17,38,2,1,2,8,6,0,2,37,1,43,53,53,0, +43,53,53,0,0,2,0,86,255,236,4,39,5,234,0,39,0,57,0,190,64,94,100,51,1,100, +56,1,107,42,1,107,48,1,10,14,26,14,2,37,17,53,17,69,17,3,6,8,22,8,2,23,26, +29,3,50,15,28,31,28,2,28,28,50,35,71,40,64,19,16,13,3,40,17,64,14,19,72,22, +5,17,17,5,144,40,1,144,40,160,40,2,40,59,128,50,71,31,5,1,5,26,19,29,16,4, +17,27,27,22,45,80,13,80,10,1,10,184,255,192,64,28,7,10,72,82,17,1,36,17,52, +17,68,17,3,2,17,18,17,2,10,17,10,17,22,0,53,80,0,22,0,63,237,63,57,57,47, +47,93,93,93,43,93,51,237,17,51,47,18,23,57,1,47,93,237,26,16,204,93,113,17, +57,47,18,57,43,18,23,57,26,16,237,17,57,47,93,18,23,57,49,48,0,93,93,1,93, +0,93,93,93,93,5,34,46,2,53,52,62,2,51,50,22,23,46,1,39,5,53,55,46,1,39,51, +30,1,23,37,15,1,30,3,29,1,20,14,2,19,52,46,2,35,34,14,2,21,20,22,51,50,62, +2,2,54,125,181,118,56,52,116,186,133,71,117,43,43,115,76,254,211,218,56,120, +66,209,45,83,42,1,50,1,211,81,129,88,47,57,120,188,176,33,71,113,80,81,115, +73,33,144,145,81,118,75,36,20,73,132,185,111,107,182,134,75,32,27,86,176, +69,133,114,94,45,78,35,20,51,31,132,112,92,74,176,200,223,121,6,122,196,138, +74,1,245,94,137,90,44,45,92,137,91,190,178,44,90,139,0,255,255,0,140,0,0, +3,242,5,189,18,38,0,81,4,0,17,7,1,78,0,245,0,0,0,19,64,11,1,38,17,38,1,5, +47,61,19,36,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,228,18,38, +0,82,0,0,17,7,0,67,0,223,0,0,0,21,180,2,35,17,38,2,184,255,228,180,36,39, +8,0,37,1,43,53,0,43,53,0,255,255,0,86,255,236,4,29,5,228,18,38,0,82,0,0,17, +7,0,116,1,103,0,0,0,19,64,11,2,35,17,38,2,73,35,38,8,0,37,1,43,53,0,43,53, +0,0,0,255,255,0,86,255,236,4,29,5,211,18,38,0,82,0,0,17,7,1,71,0,240,0,0, +0,19,64,11,2,36,17,38,2,1,41,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86, +255,236,4,29,5,189,18,38,0,82,0,0,17,7,1,78,0,247,0,0,0,19,64,11,2,35,17, +38,2,13,44,58,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,123, +18,38,0,82,0,0,17,7,0,105,0,250,0,0,0,23,64,13,3,2,35,17,38,3,2,4,39,37,8, +0,37,1,43,53,53,0,43,53,53,0,0,0,0,3,0,65,0,223,4,36,4,117,0,3,0,7,0,11,0, +75,64,48,3,11,171,0,8,8,4,128,6,160,6,2,95,6,1,32,6,1,6,63,4,95,4,111,4,3, +4,9,174,64,8,144,8,2,8,4,173,5,0,174,79,1,159,1,2,1,5,179,0,63,222,93,237, +16,253,222,93,237,1,47,93,47,93,93,93,18,57,47,51,237,50,49,48,1,53,51,21, +1,53,33,21,1,53,51,21,1,222,168,253,187,3,227,253,186,168,3,190,183,183,254, +162,146,146,254,127,183,183,0,0,3,0,44,255,218,4,180,4,92,0,22,0,34,0,45, +0,161,64,93,117,33,133,33,2,117,27,133,27,2,122,38,138,38,2,122,44,138,44, +2,150,16,1,66,16,1,77,5,1,68,21,1,75,10,1,27,38,35,0,71,64,15,23,207,23,2, +159,23,175,23,255,23,3,23,47,128,35,71,0,12,1,0,12,16,12,32,12,64,12,240, +12,5,7,12,144,47,160,47,240,47,3,224,47,1,223,47,1,0,47,32,47,2,47,184,255, +192,64,16,13,21,72,37,26,30,41,80,18,14,16,30,80,7,3,22,0,63,51,237,63,51, +237,17,57,57,1,43,93,93,93,113,47,94,93,113,237,26,16,220,93,113,26,237,18, +57,57,49,48,93,93,0,93,93,93,93,1,93,93,0,93,1,16,2,35,34,38,39,7,35,55,46, +1,53,16,33,50,22,23,55,51,7,30,1,7,52,38,39,1,30,1,51,50,62,2,37,20,23,1, +46,1,35,34,14,2,4,88,250,238,97,156,60,100,167,184,41,42,1,229,103,156,57, +91,167,173,42,39,189,12,11,254,29,38,105,62,69,112,78,42,253,179,24,1,226, +37,104,66,69,111,78,41,2,30,254,228,254,234,48,50,116,214,68,182,116,2,48, +46,45,105,201,69,185,119,68,109,44,253,206,49,39,39,98,166,126,130,85,2,49, +45,36,41,99,164,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0, +67,0,236,0,0,0,21,180,1,38,17,38,1,184,255,236,180,39,42,36,19,37,1,43,53, +0,43,53,0,255,255,0,139,255,236,3,241,5,228,18,38,0,88,6,0,17,7,0,116,1,87, +0,0,0,19,64,11,1,38,17,38,1,53,38,41,36,19,37,1,43,53,0,43,53,0,0,0,255,255, +0,139,255,236,3,241,5,211,18,38,0,88,6,0,17,7,1,71,0,239,0,0,0,21,180,1,39, +17,38,1,184,255,252,180,44,38,36,19,37,1,43,53,0,43,53,0,255,255,0,139,255, +236,3,241,5,123,18,38,0,88,6,0,17,7,0,105,0,237,0,0,0,25,182,2,1,38,17,38, +2,1,184,255,243,180,42,40,36,19,37,1,43,53,53,0,43,53,53,0,255,255,0,5,254, +87,3,252,5,228,18,38,0,92,0,0,17,7,0,116,1,27,0,0,0,19,64,11,1,32,17,38,1, +54,32,35,17,31,37,1,43,53,0,43,53,0,0,0,0,2,0,138,254,87,4,29,5,204,0,34, +0,54,0,109,64,76,102,52,118,52,2,105,38,121,38,2,73,25,89,25,2,70,10,86,10, +2,25,21,41,21,137,21,153,21,4,22,15,38,15,134,15,150,15,4,18,71,64,160,35, +1,35,56,128,45,7,33,70,0,34,16,34,48,34,240,34,4,8,34,33,27,26,50,80,23,22, +7,40,80,13,16,0,0,0,63,63,237,50,63,237,50,63,1,47,94,93,237,50,50,26,16, +220,93,26,237,49,48,0,93,93,93,93,93,93,19,51,17,20,6,7,6,7,51,62,3,51,50, +30,2,21,20,14,2,35,34,38,39,35,30,3,21,17,35,1,52,46,2,35,34,14,2,21,20,30, +2,51,50,62,2,138,180,1,1,1,1,6,25,64,82,101,63,112,153,93,40,40,93,153,112, +116,174,46,5,1,1,1,1,180,2,214,24,59,98,74,60,106,79,46,38,73,108,70,75,99, +59,24,5,204,254,89,30,55,21,25,22,52,73,47,21,80,145,205,125,123,208,150, +85,88,100,2,32,48,59,29,254,89,3,199,100,156,108,56,34,96,169,135,115,159, +98,43,58,110,159,255,255,0,5,254,87,3,252,5,123,18,38,0,92,0,0,17,7,0,105, +0,187,0,0,0,25,182,2,1,32,17,38,2,1,184,255,254,180,36,34,17,31,37,1,43,53, +53,0,43,53,53,0,255,255,0,4,0,0,5,82,6,161,18,38,0,36,0,0,17,7,1,73,1,104, +1,78,0,19,64,11,2,21,5,38,2,2,22,21,4,7,37,1,43,53,0,43,53,0,0,0,255,255, +0,87,255,236,4,115,5,83,18,38,0,68,0,0,17,7,1,73,0,233,0,0,0,21,180,2,66, +17,38,2,184,255,202,180,67,66,3,36,37,1,43,53,0,43,53,0,255,255,0,4,0,0,5, +82,6,243,18,38,0,36,0,0,17,7,2,155,1,121,0,0,0,19,64,11,2,21,5,38,2,3,26, +34,4,7,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,4,115,5,230,18,38,0, +68,0,0,17,7,1,74,1,7,0,0,0,21,180,2,66,17,38,2,184,255,204,180,71,83,3,36, +37,1,43,53,0,43,53,0,255,255,0,4,254,96,5,99,5,129,18,38,0,36,0,0,17,7,1, +77,3,181,0,11,0,13,185,0,2,255,207,180,33,33,7,7,37,43,53,0,255,255,0,87, +254,85,4,115,4,78,18,38,0,68,0,0,17,7,1,77,2,197,0,0,0,13,185,0,2,255,194, +180,78,78,36,36,37,43,53,0,255,255,0,104,255,236,5,121,6,240,18,38,0,38,0, +0,17,7,2,149,2,83,0,0,0,19,64,11,1,40,5,38,1,126,40,43,26,16,37,1,43,53,0, +43,53,0,0,0,255,255,0,87,255,236,3,202,5,228,18,38,0,70,0,0,17,7,0,116,1, +103,0,0,0,19,64,11,1,40,17,38,1,114,40,43,19,9,37,1,43,53,0,43,53,0,0,0,255, +255,0,104,255,236,5,121,6,254,18,38,0,38,0,0,17,7,2,150,1,204,0,0,0,19,64, +11,1,41,5,38,1,38,46,40,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236, +3,202,5,211,18,38,0,70,0,0,17,7,1,71,0,208,0,0,0,19,64,11,1,41,17,38,1,10, +46,40,19,9,37,1,43,53,0,43,53,0,0,0,255,255,0,104,255,236,5,121,6,241,18, +38,0,38,0,0,17,7,1,75,2,34,1,37,0,19,64,11,1,40,5,38,1,39,40,42,26,16,37, +1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,204,18,38,0,70,0,0,17, +7,1,75,1,44,0,0,0,11,182,1,17,40,42,19,9,37,1,43,53,0,0,0,255,255,0,104,255, +236,5,121,6,254,18,38,0,38,0,0,17,7,2,151,1,204,0,0,0,19,64,11,1,40,5,38, +1,38,42,48,26,16,37,1,43,53,0,43,53,0,0,0,255,255,0,87,255,236,3,202,5,211, +18,38,0,70,0,0,17,7,1,72,0,214,0,0,0,19,64,11,1,40,17,38,1,16,42,48,19,9, +37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,5,101,6,254,18,38,0,39,0,0,17, +7,2,151,1,102,0,0,0,21,180,2,26,5,38,2,184,255,171,180,28,34,6,0,37,1,43, +53,0,43,53,0,255,255,0,86,255,236,4,255,5,204,16,38,0,71,0,0,17,7,2,146,3, +186,0,75,0,18,64,10,2,61,0,2,83,61,61,19,19,37,1,43,53,0,63,53,255,255,0, +14,0,0,5,101,5,129,18,6,0,144,0,0,0,2,0,86,255,236,4,109,5,204,0,39,0,59, +0,146,64,86,85,42,101,42,2,90,58,106,58,2,57,1,73,1,2,54,10,70,10,2,9,4,25, +4,121,4,137,4,4,6,7,22,7,118,7,134,7,4,25,27,70,64,20,6,0,21,50,3,18,61,128, +40,71,31,6,1,6,63,61,1,143,61,1,33,21,27,19,81,24,15,20,1,239,20,255,20,2, +20,20,8,22,0,11,55,80,8,184,255,192,64,10,9,13,72,8,16,0,45,80,3,22,0,63, +237,50,63,43,237,50,63,18,57,47,93,113,51,237,50,63,1,93,114,47,93,237,26, +16,220,23,50,17,57,26,237,50,49,48,0,93,93,93,93,93,93,37,14,1,35,34,2,17, +16,33,50,22,23,51,52,46,1,52,61,1,33,53,33,53,51,21,51,21,35,17,20,30,2,23, +35,46,3,53,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,3,53,50,165,122,205, +193,1,142,123,164,50,2,1,1,254,212,1,44,180,132,132,1,2,2,1,172,2,3,3,2,253, +218,28,62,96,69,71,109,73,38,38,74,107,70,66,96,64,31,174,104,90,1,20,1,24, +2,54,90,98,10,43,47,42,9,141,131,147,147,131,252,41,39,72,60,43,9,10,37,48, +53,26,1,112,112,160,103,48,46,103,166,120,115,159,98,43,46,102,163,0,0,255, +255,0,168,0,0,4,254,6,161,18,38,0,40,0,0,17,7,1,73,1,122,1,78,0,21,180,1, +12,5,38,1,184,255,237,180,13,12,0,10,37,1,43,53,0,43,53,0,255,255,0,87,255, +236,4,24,5,83,18,38,0,72,0,0,17,7,1,73,0,245,0,0,0,19,64,11,2,38,17,38,2, +3,39,38,17,27,37,1,43,53,0,43,53,0,0,0,255,255,0,168,0,0,4,254,6,243,18,38, +0,40,0,0,17,7,2,155,1,137,0,0,0,21,180,1,12,5,38,1,184,255,235,180,17,25, +0,10,37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,230,18,38,0,72,0,0, +17,7,1,74,1,16,0,0,0,19,64,11,2,38,17,38,2,2,43,55,17,27,37,1,43,53,0,43, +53,0,0,0,255,255,0,168,0,0,4,254,6,241,18,38,0,40,0,0,17,7,1,75,1,201,1,37, +0,21,180,1,12,5,38,1,184,255,236,180,12,14,0,10,37,1,43,53,0,43,53,0,255, +255,0,87,255,236,4,24,5,204,18,38,0,72,0,0,17,7,1,75,1,68,0,0,0,12,182,2, +2,38,40,17,27,37,1,43,53,0,0,0,255,255,0,168,254,85,4,254,5,129,18,38,0,40, +0,0,17,7,1,77,3,80,0,0,0,13,185,0,1,255,194,180,24,24,11,11,37,43,53,0,255, +255,0,87,254,85,4,24,4,78,18,38,0,72,0,0,17,7,1,77,1,125,0,0,0,13,185,0,2, +254,242,180,50,50,9,9,37,43,53,0,255,255,0,168,0,0,4,254,6,254,18,38,0,40, +0,0,17,7,2,151,1,111,0,0,0,21,180,1,12,5,38,1,184,255,231,180,14,20,0,10, +37,1,43,53,0,43,53,0,255,255,0,87,255,236,4,24,5,211,18,38,0,72,0,0,17,7, +1,72,0,234,0,0,0,21,180,2,38,17,38,2,184,255,254,180,40,46,17,27,37,1,43, +53,0,43,53,0,255,255,0,103,255,236,5,160,6,254,18,38,0,42,0,0,17,7,2,150, +1,219,0,0,0,19,64,11,1,47,5,38,1,34,52,46,0,35,37,1,43,53,0,43,53,0,0,0,255, +255,0,86,254,87,3,239,5,211,18,38,0,74,0,0,17,7,1,71,0,216,0,0,0,19,64,11, +2,71,17,38,2,0,76,70,26,41,37,1,43,53,0,43,53,0,0,0,255,255,0,103,255,236, +5,160,6,243,18,38,0,42,0,0,17,7,2,155,1,246,0,0,0,19,64,11,1,46,5,38,1,39, +51,59,0,35,37,1,43,53,0,43,53,0,0,0,255,255,0,86,254,87,3,239,5,230,18,38, +0,74,0,0,17,7,1,74,0,249,0,0,0,19,64,11,2,70,17,38,2,0,75,87,26,41,37,1,43, +53,0,43,53,0,0,0,255,255,0,103,255,236,5,160,6,241,18,38,0,42,0,0,17,7,1, +75,2,53,1,37,0,19,64,11,1,46,5,38,1,39,46,48,0,35,37,1,43,53,0,43,53,0,0, +0,255,255,0,86,254,87,3,239,5,204,18,38,0,74,0,0,17,7,1,75,1,45,0,0,0,11, +182,2,0,70,72,26,41,37,1,43,53,0,0,0,255,255,0,103,254,78,5,160,5,150,18, +38,0,42,0,0,17,7,2,140,2,78,0,0,0,11,182,1,46,50,46,0,35,37,1,43,53,0,0,0, +255,255,0,86,254,87,3,239,6,32,16,38,0,74,0,0,17,7,2,147,1,56,0,0,0,21,180, +2,79,17,38,2,184,255,252,180,70,74,26,41,37,1,43,53,0,43,53,0,255,255,0,168, +0,0,5,32,6,254,18,38,0,43,0,0,17,7,2,150,1,153,0,0,0,19,64,11,1,13,5,38,1, +0,18,12,4,10,37,1,43,53,0,43,53,0,0,0,255,255,0,142,0,0,3,238,7,62,18,38, +0,75,0,0,17,7,2,150,0,242,0,64,0,21,180,1,35,2,38,1,184,255,255,180,40,34, +25,10,37,1,43,53,0,43,53,0,0,2,0,14,0,0,5,185,5,129,0,19,0,23,0,166,64,72, +23,11,3,90,8,7,4,4,20,4,2,7,4,16,15,19,90,20,12,59,0,1,4,0,1,56,164,0,1,155, +0,1,68,0,1,244,0,1,235,0,1,68,0,148,0,2,224,0,1,2,0,0,48,0,112,0,208,0,4, +7,0,32,25,1,160,25,176,25,192,25,3,25,184,255,192,64,36,14,17,72,47,25,1, +22,18,6,95,15,11,80,7,96,7,2,7,2,95,64,23,1,160,23,208,23,2,23,23,13,9,3, +4,0,18,0,63,50,63,51,57,47,93,113,237,220,93,50,50,237,50,50,1,93,43,93,113, +47,94,93,95,93,113,113,113,114,114,114,94,93,93,51,51,237,50,50,47,94,93, +51,51,237,50,50,49,48,33,17,33,17,35,17,35,53,51,53,51,21,33,53,51,21,51, +21,35,17,3,53,33,21,4,102,253,1,191,154,154,191,2,255,186,153,153,186,253, +1,2,141,253,115,4,1,154,230,230,230,230,154,251,255,3,45,212,212,0,1,0,10, +0,0,3,238,5,204,0,41,0,150,185,0,7,255,232,64,66,9,13,72,0,7,16,7,2,7,33, +24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,32,36,24,70,29,28,192,25,1, +0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240,43, +2,255,43,1,112,43,1,43,184,255,192,64,19,19,23,72,35,27,81,32,28,28,5,30, +0,25,11,21,0,18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63, +18,57,47,51,237,50,1,43,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16, +220,93,113,26,237,18,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52, +46,2,35,34,14,2,21,17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61, +30,70,84,100,62,104,133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180, +1,44,254,212,2,3,2,1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69, +35,46,84,120,75,253,170,4,182,131,147,147,131,148,33,66,56,39,7,255,255,255, +184,0,0,2,133,7,6,18,38,0,44,0,0,17,6,2,153,207,0,0,19,64,11,1,4,5,38,1,2, +13,27,0,2,37,1,43,53,0,43,53,0,255,255,255,184,0,0,2,133,5,189,18,38,0,241, +0,0,17,6,1,78,207,0,0,19,64,11,1,4,17,38,1,2,13,27,0,2,37,1,43,53,0,43,53, +0,255,255,0,12,0,0,2,49,6,161,18,38,0,44,0,0,17,7,1,73,255,217,1,78,0,19, +64,11,1,4,5,38,1,2,5,4,0,2,37,1,43,53,0,43,53,0,0,0,255,255,0,12,0,0,2,49, +5,83,18,38,0,241,0,0,17,6,1,73,217,0,0,19,64,11,1,4,17,38,1,2,5,4,0,2,37, +1,43,53,0,43,53,0,255,255,255,210,0,0,2,108,6,243,18,38,0,44,0,0,17,6,2,155, +234,0,0,19,64,11,1,4,5,38,1,2,9,17,0,2,37,1,43,53,0,43,53,0,255,255,255,210, +0,0,2,108,5,230,18,38,0,241,0,0,17,6,1,74,245,0,0,19,64,11,1,4,17,38,1,3, +9,21,0,2,37,1,43,53,0,43,53,0,255,255,0,92,254,85,1,186,5,129,18,38,0,44, +0,0,17,6,1,77,12,0,0,10,182,1,0,16,16,3,3,37,43,53,0,0,255,255,0,31,254,85, +1,125,5,204,18,38,0,76,0,0,17,6,1,77,207,0,0,15,64,10,23,22,1,2,0,20,20,7, +7,37,43,53,93,0,255,255,0,189,0,0,1,124,6,241,18,38,0,44,0,0,17,7,1,75,0, +39,1,37,0,19,64,11,1,4,5,38,1,0,4,6,0,2,37,1,43,53,0,43,53,0,0,0,0,1,0,194, +0,0,1,118,4,58,0,3,1,137,64,24,3,70,4,0,36,0,2,9,0,0,4,5,52,5,1,0,5,16,5, +32,5,3,229,5,184,255,192,64,55,225,228,72,240,5,1,228,5,1,176,5,192,5,208, +5,3,132,5,148,5,164,5,3,64,5,1,52,5,1,0,5,16,5,32,5,3,212,5,228,5,244,5,3, +144,5,1,116,5,132,5,2,96,5,1,5,184,255,192,64,22,193,196,72,224,5,1,196,5, +212,5,2,176,5,1,20,5,36,5,52,5,3,5,184,255,192,183,182,185,72,0,5,1,175,5, +184,255,192,179,171,174,72,5,184,255,192,182,161,167,72,128,5,1,5,184,255, +192,64,38,150,156,72,208,5,1,100,5,116,5,164,5,180,5,196,5,5,32,5,1,4,5,20, +5,2,4,5,20,5,180,5,196,5,244,5,5,117,5,184,255,192,179,121,124,72,5,184,255, +192,179,110,113,72,5,184,255,192,64,24,99,102,72,224,5,1,180,5,196,5,212, +5,3,48,5,1,4,5,20,5,36,5,3,5,184,255,192,183,67,70,72,11,5,1,62,5,184,255, +192,64,9,56,59,72,203,5,219,5,2,5,184,255,192,64,42,45,48,72,27,5,43,5,2, +196,5,212,5,228,5,3,107,5,123,5,2,64,5,1,2,16,5,32,5,48,5,3,191,5,207,5,2, +32,5,64,5,2,5,184,255,192,64,13,13,16,72,15,5,31,5,2,7,1,15,0,21,0,63,63, +1,94,93,43,93,93,113,95,113,113,113,114,43,114,43,94,93,43,113,113,113,113, +43,43,43,94,93,113,113,113,113,43,114,43,43,94,93,43,93,93,93,93,43,113,113, +113,113,114,114,114,114,114,114,114,43,94,93,93,17,18,57,47,94,93,237,49, +48,51,17,51,17,194,180,4,58,251,198,0,0,0,255,255,0,170,255,236,5,73,5,129, +16,38,0,44,237,0,16,7,0,45,1,225,0,0,255,255,0,137,254,87,3,3,5,204,16,38, +0,76,0,0,17,7,0,77,1,198,0,0,0,30,64,18,3,2,111,8,1,48,8,1,16,8,1,8,1,0,16, +0,1,0,17,93,53,53,17,93,93,93,53,53,255,255,0,32,255,236,3,205,6,254,18,38, +0,45,0,0,17,7,2,150,1,55,0,0,0,19,64,11,1,23,5,38,1,190,28,22,3,16,37,1,43, +53,0,43,53,0,0,0,0,2,255,153,254,87,2,47,5,211,0,19,0,29,1,148,64,25,150, +29,166,29,2,152,28,168,28,2,3,18,24,12,16,72,18,40,8,11,72,164,21,1,21,184, +255,192,64,49,11,15,72,21,251,26,1,59,26,1,26,64,12,15,72,36,26,1,26,15,70, +12,3,3,4,12,20,12,36,12,68,12,4,7,12,12,31,30,144,31,1,2,0,31,16,31,2,219, +31,184,255,192,64,9,223,227,72,31,64,210,213,72,31,184,255,192,64,51,205, +209,72,143,31,1,64,31,80,31,2,95,31,111,31,239,31,255,31,4,32,31,48,31,64, +31,3,144,31,160,31,224,31,240,31,4,79,31,1,0,31,1,160,175,31,191,31,207,31, +3,31,184,255,192,64,57,147,150,72,239,31,1,176,31,192,31,208,31,3,95,31,1, +32,31,1,31,31,47,31,63,31,143,31,191,31,207,31,6,0,31,1,111,239,31,1,208, +31,1,63,31,1,111,31,143,31,159,31,175,31,255,31,5,31,184,255,192,64,101,79, +82,72,223,31,1,144,31,160,31,176,31,3,47,31,63,31,79,31,3,0,31,1,61,31,64, +53,56,72,112,31,128,31,144,31,176,31,4,15,31,31,31,2,255,31,1,31,64,35,38, +72,144,31,1,79,31,1,255,31,1,112,31,128,31,192,31,208,31,224,31,5,31,31,1, +24,142,64,28,148,26,128,22,22,15,26,47,26,63,26,127,26,239,26,5,26,13,15, +7,80,0,27,0,63,237,63,47,93,51,47,26,16,253,26,237,1,93,93,93,113,113,43, +113,114,114,43,94,93,93,93,93,43,113,114,114,114,94,93,93,113,113,113,113, +43,114,94,93,93,93,113,113,114,114,43,43,43,94,93,95,93,17,18,57,47,94,93, +51,47,16,237,47,93,43,93,113,204,43,93,49,48,0,43,43,1,95,93,93,19,34,38, +39,53,30,1,51,50,62,2,53,17,51,17,20,14,2,1,21,35,39,35,7,35,53,19,51,77, +34,65,28,13,36,13,38,49,28,10,180,21,54,93,1,154,105,219,2,232,104,234,204, +254,87,4,5,139,2,4,20,43,67,46,4,165,251,64,62,106,78,45,6,110,20,169,169, +20,1,14,0,255,255,0,168,254,78,5,63,5,129,18,38,0,46,0,0,17,7,2,140,1,221, +0,0,0,14,185,0,1,255,205,180,16,12,4,11,37,1,43,53,255,255,0,138,254,78,4, +3,5,204,18,38,0,78,0,0,17,7,2,140,1,78,0,0,0,14,185,0,1,255,235,180,16,12, +4,11,37,1,43,53,0,1,0,138,0,0,4,3,4,58,0,11,0,166,64,72,123,1,1,116,7,1,86, +9,102,9,2,123,0,139,0,155,0,3,89,0,105,0,2,67,10,1,58,2,1,42,9,1,155,8,1, +122,8,138,8,2,44,8,1,1,10,8,10,9,16,112,9,128,9,144,9,3,9,9,0,11,16,80,11, +1,144,11,208,11,240,11,3,11,184,255,192,64,40,7,11,72,11,7,3,70,0,4,16,4, +48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2,1,7,10,4,8,8,5,15,4,0,21, +0,63,50,63,51,17,23,57,1,93,93,47,94,93,237,50,47,43,93,113,56,51,57,47,93, +56,57,51,17,51,49,48,93,93,93,93,0,93,1,93,93,93,93,0,93,1,93,33,1,7,17,35, +17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73,1,206,1,238,108, +254,126,4,58,253,243,2,13,254,47,253,151,0,0,0,255,255,0,168,0,0,4,47,6,240, +18,38,0,47,0,0,17,7,2,149,0,173,0,0,0,21,180,1,6,5,38,1,184,255,94,180,6, +9,0,4,37,1,43,53,0,43,53,0,255,255,0,91,0,0,2,3,7,62,18,38,0,79,0,0,17,6, +2,149,19,78,0,19,64,11,1,4,2,38,1,75,4,7,0,2,37,1,43,53,0,43,53,0,255,255, +0,168,254,78,4,47,5,129,18,38,0,47,0,0,17,7,2,140,1,133,0,0,0,14,185,0,1, +255,253,180,10,6,0,4,37,1,43,53,255,255,0,126,254,78,1,71,5,204,18,38,0,79, +0,0,17,6,2,140,255,0,0,14,185,0,1,255,255,180,8,4,0,2,37,1,43,53,0,0,255, +255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,2,146,2,21,0,0,0,18,64,10,1, +15,3,1,138,10,6,0,4,37,1,43,53,0,63,53,255,255,0,138,0,0,2,105,5,204,16,38, +0,79,0,0,17,7,2,146,1,36,0,75,0,65,64,16,16,64,29,29,72,16,64,22,22,72,16, +64,18,18,72,16,184,255,192,179,17,17,72,16,184,255,192,64,12,16,16,72,16, +64,11,11,72,1,13,0,1,184,1,32,180,8,4,0,2,37,1,43,53,0,63,53,1,43,43,43,43, +43,43,0,255,255,0,168,0,0,4,47,5,129,18,38,0,47,0,0,17,7,1,75,1,213,253,143, +0,11,182,1,95,6,8,0,4,37,1,43,53,0,0,0,255,255,0,138,0,0,2,146,5,204,16,38, +0,79,0,0,17,7,1,75,1,66,253,143,0,14,185,0,1,1,84,180,4,6,0,2,37,1,43,53, +0,1,0,20,0,0,4,47,5,129,0,13,0,119,64,49,121,0,137,0,2,100,8,116,8,132,8, +3,86,8,1,134,8,1,86,7,1,134,7,1,12,2,90,9,5,16,3,1,0,3,32,3,64,3,96,3,128, +3,208,3,240,3,7,3,12,184,255,224,179,19,22,72,9,184,255,224,64,24,19,22,72, +6,1,9,12,4,16,7,1,7,0,13,1,13,13,5,10,3,2,95,5,18,0,63,237,63,18,57,47,93, +205,93,23,57,43,43,1,47,93,113,47,51,237,50,49,48,113,114,113,114,0,93,93, +1,5,17,33,21,33,17,7,53,55,17,51,17,37,2,104,254,255,2,200,252,121,148,148, +191,1,1,3,29,149,254,20,156,2,26,85,158,85,2,201,253,165,148,0,1,0,16,0,0, +1,186,5,204,0,11,0,102,64,42,39,3,1,39,2,1,8,7,11,70,4,2,0,0,16,0,32,0,64, +0,4,7,0,0,12,13,255,13,1,112,13,128,13,192,13,208,13,4,31,13,1,4,184,255, +224,64,23,18,22,72,10,32,18,22,72,1,10,4,7,4,2,79,8,1,8,8,5,0,0,21,0,63,63, +57,47,93,205,23,57,43,43,1,93,93,93,17,18,57,47,94,93,51,51,237,50,50,49, +48,113,113,51,17,7,53,55,17,51,17,55,21,7,17,138,122,122,180,124,124,2,30, +68,158,68,3,16,253,88,72,159,71,253,122,255,255,0,168,0,0,5,32,6,240,18,38, +0,49,0,0,17,7,2,149,2,17,0,0,0,19,64,11,1,20,5,38,1,73,20,23,8,18,37,1,43, +53,0,43,53,0,0,0,255,255,0,140,0,0,3,242,5,228,18,38,0,81,4,0,17,7,0,116, +1,132,0,0,0,19,64,11,1,38,17,38,1,97,38,41,19,36,37,1,43,53,0,43,53,0,0,0, +255,255,0,168,254,78,5,32,5,129,18,38,0,49,0,0,17,7,2,140,1,252,0,0,0,14, +185,0,1,255,252,180,24,20,8,18,37,1,43,53,255,255,0,140,254,78,3,242,4,78, +18,38,0,81,4,0,17,7,2,140,1,91,0,0,0,11,182,1,0,42,38,19,36,37,1,43,53,0, +0,0,255,255,0,168,0,0,5,32,6,254,18,38,0,49,0,0,17,7,2,151,1,147,0,0,0,21, +180,1,20,5,38,1,184,255,250,180,22,28,8,18,37,1,43,53,0,43,53,0,255,255,0, +140,0,0,3,242,5,211,18,38,0,81,4,0,17,7,1,72,0,242,0,0,0,21,180,1,38,17,38, +1,184,255,254,180,40,46,19,36,37,1,43,53,0,43,53,0,255,255,255,254,0,0,4, +80,5,129,16,38,0,81,98,0,16,7,2,3,255,127,0,0,0,1,0,165,255,236,5,52,5,149, +0,55,0,162,64,16,154,53,1,149,7,165,7,2,131,41,147,41,163,41,3,48,184,255, +232,179,12,15,72,47,184,255,216,64,91,12,15,72,42,54,58,54,154,54,170,54, +4,6,143,5,159,5,175,5,3,5,5,51,39,26,90,0,27,16,27,64,27,3,27,51,90,0,14, +64,14,80,14,112,14,160,14,176,14,6,48,14,80,14,144,14,240,14,4,224,14,1,143, +14,159,14,175,14,3,0,14,48,14,2,7,14,39,20,95,45,4,33,3,26,18,9,95,0,6,6, +0,19,0,63,50,47,16,237,63,63,63,237,50,1,47,94,93,93,93,113,114,237,47,93, +237,50,17,57,47,93,51,49,48,0,93,43,1,43,0,93,93,93,5,34,46,2,39,55,30,1, +51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51, +62,3,51,50,30,2,21,17,20,14,2,3,173,56,96,79,63,24,127,37,100,59,64,78,41, +13,39,81,127,87,94,163,121,70,191,1,1,1,1,184,1,3,2,1,4,34,103,130,153,86, +124,177,112,53,30,86,152,20,24,40,54,30,115,45,65,58,107,153,95,1,66,108, +154,98,46,62,105,139,77,252,133,4,68,37,92,90,76,22,22,63,69,69,28,61,101, +70,39,64,133,204,139,254,165,130,208,146,78,0,0,0,0,1,0,140,254,87,3,242, +4,78,0,53,0,135,64,18,121,52,137,52,2,90,52,106,52,2,43,52,59,52,75,52,3, +46,184,255,232,64,74,9,12,72,3,46,19,46,2,3,3,24,49,70,64,160,12,1,96,12, +208,12,2,31,12,1,175,12,1,12,55,128,37,24,70,160,25,176,25,2,0,25,192,25, +208,25,3,0,25,16,25,32,25,64,25,224,25,240,25,6,7,25,37,18,80,43,16,31,15, +24,21,7,80,0,27,0,63,237,63,63,63,237,50,1,47,94,93,113,114,237,50,26,16, +220,93,113,113,114,26,237,17,57,47,49,48,93,43,0,93,93,93,1,34,38,39,53,30, +1,51,50,62,2,53,17,52,46,2,35,34,14,2,21,17,35,17,52,46,2,39,51,30,3,21,51, +62,3,51,50,30,2,21,17,20,14,2,3,1,34,65,28,13,36,13,38,49,28,10,23,52,85, +63,64,103,73,40,180,1,2,2,1,170,1,2,3,2,3,26,62,82,106,70,90,130,84,39,22, +54,93,254,87,4,5,139,2,4,20,43,67,46,3,25,79,106,65,27,45,85,125,81,253,141, +3,83,34,75,67,48,7,5,44,57,59,20,47,76,53,29,44,92,145,100,252,169,62,106, +78,45,0,0,0,255,255,0,97,255,236,5,215,6,161,18,38,0,50,0,0,17,7,1,73,1,214, +1,78,0,19,64,11,2,40,5,38,2,0,41,40,10,0,37,1,43,53,0,43,53,0,0,0,255,255, +0,86,255,236,4,29,5,83,18,38,0,82,0,0,17,7,1,73,0,244,0,0,0,19,64,11,2,35, +17,38,2,0,36,35,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,97,255,236,5,215,6, +243,18,38,0,50,0,0,17,7,2,155,1,231,0,0,0,19,64,11,2,40,5,38,2,0,45,53,10, +0,37,1,43,53,0,43,53,0,0,0,255,255,0,86,255,236,4,29,5,230,18,38,0,82,0,0, +17,7,1,74,1,16,0,0,0,19,64,11,2,35,17,38,2,0,40,52,8,0,37,1,43,53,0,43,53, +0,0,0,255,255,0,97,255,236,5,215,6,241,18,38,0,50,0,0,17,7,2,154,1,226,0, +0,0,23,64,13,3,2,40,5,38,3,2,93,40,49,10,0,37,1,43,53,53,0,43,53,53,0,0,0, +255,255,0,86,255,236,4,34,5,228,18,38,0,82,0,0,17,7,1,79,1,9,0,0,0,23,64, +13,3,2,35,17,38,3,2,103,35,44,8,0,37,1,43,53,53,0,43,53,53,0,0,0,0,2,0,97, +255,246,7,166,5,140,0,30,0,49,0,170,64,119,137,13,1,102,13,1,105,12,1,86, +48,1,89,42,1,84,8,132,8,2,4,47,20,47,84,47,3,11,43,27,43,91,43,3,0,20,24, +28,90,34,0,26,32,26,48,26,3,26,22,26,22,29,15,34,47,34,79,34,3,63,34,95,34, +127,34,159,34,207,34,239,34,6,34,64,31,38,72,34,16,29,32,29,2,29,45,91,32, +10,1,15,10,31,10,2,10,127,51,1,27,95,24,24,21,29,95,30,18,22,95,21,3,40,95, +15,4,31,95,5,19,0,63,237,63,237,63,237,63,237,17,57,47,237,1,93,47,93,93, +237,47,93,47,43,93,113,18,57,57,47,47,93,16,237,50,57,57,49,48,0,93,93,93, +93,93,1,93,0,93,93,33,14,3,35,34,36,38,2,53,52,18,54,36,51,50,30,2,23,33, +21,33,17,33,21,33,17,33,21,37,50,54,55,17,46,2,34,35,34,14,2,21,20,30,2,3, +231,20,51,57,57,25,169,254,253,175,89,94,178,1,2,164,26,58,57,52,19,3,146, +252,221,2,231,253,25,3,76,251,111,32,76,26,11,32,37,37,15,125,187,125,63, +64,126,186,3,3,3,1,106,191,1,9,159,165,1,7,183,98,2,3,4,2,156,254,60,154, +254,21,156,145,2,2,4,87,1,2,1,74,142,206,131,129,209,148,80,0,3,0,86,255, +236,7,50,4,78,0,39,0,59,0,68,0,190,64,131,132,7,1,102,7,118,7,2,97,2,1,85, +2,1,90,66,106,66,2,108,61,1,90,61,1,69,58,85,58,101,58,3,69,52,85,52,101, +52,3,74,48,90,48,106,48,3,74,42,90,42,106,42,3,8,73,9,9,38,71,64,31,60,47, +60,63,60,3,144,60,1,60,70,128,17,30,68,0,71,144,40,1,32,40,1,40,50,71,25, +0,80,68,68,5,63,80,33,16,116,30,132,30,2,123,17,139,17,2,30,17,20,45,80,28, +16,55,80,20,22,5,80,14,239,8,1,128,8,1,8,8,14,22,0,63,51,47,93,93,16,237, +63,237,63,237,18,57,57,93,93,63,237,18,57,47,237,1,47,237,47,93,114,237,50, +57,57,26,16,220,93,113,26,237,50,47,237,49,48,0,93,93,93,93,93,93,93,93,93, +93,93,1,20,30,2,51,50,54,55,23,14,3,35,34,38,39,14,1,35,34,46,2,53,16,18, +51,32,23,62,1,51,50,30,2,29,1,37,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2, +37,46,1,35,34,14,2,7,4,46,35,73,114,80,117,141,25,158,17,61,102,153,108,137, +198,61,63,201,137,113,181,127,68,253,242,1,25,117,67,200,119,136,183,111, +47,252,63,42,77,110,68,69,114,81,45,47,81,108,62,69,114,81,44,3,7,15,144, +135,45,99,84,58,4,1,247,85,143,103,57,94,72,45,45,91,73,47,91,92,93,90,68, +140,211,143,1,23,1,25,177,94,83,88,155,210,122,24,39,126,164,98,39,41,99, +164,123,126,165,98,40,39,98,166,225,171,157,29,74,127,98,255,255,0,168,0, +0,5,104,6,240,18,38,0,53,0,0,17,7,2,149,1,225,0,0,0,21,180,2,31,5,38,2,184, +255,245,180,31,34,4,17,37,1,43,53,0,43,53,0,255,255,0,136,0,0,2,166,5,228, +18,38,0,85,0,0,17,7,0,116,0,182,0,0,0,19,64,11,1,32,17,38,1,74,32,35,6,21, +37,1,43,53,0,43,53,0,0,0,255,255,0,168,254,78,5,104,5,129,18,38,0,53,0,0, +17,7,2,140,2,5,0,0,0,14,185,0,2,255,225,180,35,31,4,17,37,1,43,53,255,255, +0,129,254,78,2,136,4,78,18,38,0,85,0,0,17,6,2,140,2,0,0,14,185,0,1,255,94, +180,36,32,6,21,37,1,43,53,0,0,255,255,0,168,0,0,5,104,6,254,18,38,0,53,0, +0,17,7,2,151,1,102,0,0,0,21,180,2,31,5,38,2,184,255,169,180,33,39,4,17,37, +1,43,53,0,43,53,0,255,255,0,56,0,0,2,206,5,211,18,38,0,85,0,0,17,6,1,72,56, +0,0,21,180,1,32,17,38,1,184,255,251,180,34,40,6,21,37,1,43,53,0,43,53,0,0, +0,255,255,0,93,255,236,4,248,7,45,18,38,0,54,0,0,17,7,0,116,1,234,1,73,0, +19,64,11,1,64,5,38,1,91,64,67,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255, +236,3,182,5,228,18,38,0,86,0,0,17,7,0,116,1,57,0,0,0,19,64,11,1,56,17,38, +1,93,56,59,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,93,255,236,4,248,7,26, +18,38,0,54,0,0,17,7,1,71,1,114,1,71,0,19,64,11,1,65,5,38,1,18,70,64,8,0,37, +1,43,53,0,43,53,0,0,0,255,255,0,57,255,236,3,182,5,211,18,38,0,86,0,0,17, +7,1,71,0,172,0,0,0,19,64,11,1,57,17,38,1,0,62,56,10,0,37,1,43,53,0,43,53, +0,0,0,255,255,0,93,254,78,4,248,5,150,18,38,0,54,0,0,17,7,0,120,1,166,0,0, +0,11,182,1,40,72,64,8,0,37,1,43,53,0,0,0,255,255,0,57,254,78,3,182,4,75,18, +38,0,86,0,0,17,7,0,120,0,218,0,0,0,11,182,1,15,64,56,10,0,37,1,43,53,0,0, +0,255,255,0,93,255,236,4,248,6,254,18,38,0,54,0,0,17,7,2,151,1,115,0,0,0, +19,64,11,1,64,5,38,1,19,66,72,8,0,37,1,43,53,0,43,53,0,0,0,255,255,0,57,255, +236,3,182,5,211,18,38,0,86,0,0,17,7,1,72,0,173,0,0,0,19,64,11,1,56,17,38, +1,0,58,64,10,0,37,1,43,53,0,43,53,0,0,0,255,255,0,46,254,78,4,180,5,129,18, +38,0,55,0,0,17,7,2,140,1,139,0,0,0,14,185,0,1,255,254,180,12,8,4,6,37,1,43, +53,255,255,0,31,254,78,2,42,5,44,16,38,0,87,0,0,17,6,2,140,115,0,2,233,64, +255,35,64,232,232,72,35,64,231,231,72,35,64,228,228,72,35,64,227,227,72,35, +64,226,226,72,35,64,221,221,72,35,64,217,217,72,35,64,216,216,72,35,64,215, +215,72,35,64,214,214,72,35,64,213,213,72,35,64,210,210,72,35,64,206,206,72, +35,64,205,205,72,35,64,203,203,72,35,64,202,202,72,35,64,199,199,72,35,64, +196,196,72,35,64,195,195,72,35,64,194,194,72,35,64,192,192,72,35,64,191,191, +72,35,64,190,190,72,35,64,185,185,72,35,64,184,184,72,35,64,181,181,72,35, +64,180,180,72,35,64,179,179,72,35,64,178,178,72,35,64,174,174,72,35,64,173, +173,72,35,64,170,170,72,35,64,169,169,72,35,64,168,168,72,35,64,167,167,72, +35,64,163,163,72,35,64,162,162,72,35,64,160,160,72,35,64,159,159,72,35,64, +158,158,72,35,64,157,157,72,35,64,156,156,72,35,64,152,152,72,35,64,149,149, +72,35,64,148,148,72,35,64,147,147,72,35,64,146,146,72,35,64,145,145,72,35, +64,144,144,72,35,64,142,142,72,35,64,141,141,72,64,221,35,64,138,138,72,35, +64,137,137,72,35,64,136,136,72,35,64,134,134,72,35,64,133,133,72,35,64,131, +131,72,35,64,130,130,72,35,64,127,127,72,35,64,126,126,72,35,64,125,125,72, +35,64,124,124,72,35,64,123,123,72,35,64,122,122,72,35,64,121,121,72,35,64, +120,120,72,35,64,116,116,72,35,64,115,115,72,35,64,113,113,72,35,64,112,112, +72,35,64,111,111,72,35,64,110,110,72,35,64,109,109,72,35,64,106,106,72,35, +64,105,105,72,35,64,104,104,72,35,64,102,102,72,35,64,101,101,72,35,64,100, +100,72,35,64,99,99,72,35,64,98,98,72,35,64,95,95,72,35,64,94,94,72,35,64, +93,93,72,35,64,91,91,72,35,64,90,90,72,35,64,89,89,72,35,128,88,88,72,35, +64,87,87,72,35,64,84,84,72,35,64,83,83,72,35,64,80,80,72,35,64,79,79,72,35, +64,78,78,72,35,64,77,77,72,35,184,255,192,179,74,74,72,35,184,255,192,179, +71,71,72,35,184,255,192,179,63,63,72,35,184,255,192,64,9,60,60,72,35,64,52, +52,72,35,184,255,192,179,50,50,72,35,184,255,192,179,49,49,72,35,184,255, +192,64,9,45,45,72,35,64,41,41,72,35,184,255,192,179,39,39,72,35,184,255,192, +64,9,38,38,72,35,64,30,30,72,35,184,255,192,179,28,28,72,35,184,255,192,64, +9,27,27,72,35,64,19,19,72,35,184,255,192,179,17,17,72,35,184,255,192,179, +13,13,72,35,184,255,192,64,15,9,9,72,35,64,8,8,72,1,50,27,23,7,0,37,1,43, +53,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0,0,255,255,0,46,0,0,4,180, +6,254,18,38,0,55,0,0,17,7,2,151,1,33,0,0,0,21,180,1,8,5,38,1,184,255,251, +180,10,16,4,6,37,1,43,53,0,43,53,0,255,255,0,31,255,240,3,17,5,204,16,38, +0,87,0,0,17,7,2,146,1,204,0,75,0,17,177,1,1,184,1,136,180,27,23,7,0,37,1, +43,53,0,53,0,0,1,0,46,0,0,4,180,5,129,0,15,0,101,64,62,0,17,16,17,32,17,3, +9,3,2,5,15,14,6,12,5,14,9,6,127,12,175,12,191,12,3,47,12,143,12,2,12,64,23, +28,72,12,1,5,90,10,16,6,32,6,2,6,0,12,95,13,4,8,95,1,9,9,5,13,3,5,18,0,63, +63,18,57,47,51,237,50,16,237,50,1,47,93,51,253,50,204,43,93,113,17,57,43, +1,24,16,77,228,17,57,95,94,93,49,48,1,17,33,21,33,17,35,17,33,53,33,17,33, +53,33,21,2,208,1,25,254,231,190,254,233,1,23,254,28,4,134,4,229,254,60,154, +253,121,2,135,154,1,196,156,156,0,1,0,31,255,240,2,42,5,44,0,30,0,140,64, +91,40,30,1,40,29,1,40,26,1,40,25,1,12,32,9,15,72,156,12,172,12,2,12,40,9, +14,72,20,15,15,13,29,25,111,7,127,7,2,7,24,28,7,3,1,70,21,17,143,13,1,0,13, +16,13,32,13,3,7,13,128,32,1,47,32,1,27,19,80,20,0,15,80,28,127,16,191,16, +207,16,3,16,16,4,24,22,20,15,4,80,11,22,0,63,237,63,206,51,18,57,47,93,51, +237,50,16,237,50,1,93,93,47,94,93,113,51,51,237,23,50,47,93,51,51,17,51,17, +51,49,48,0,43,93,1,43,113,113,113,113,1,21,20,22,51,50,54,55,21,14,1,35,34, +53,17,35,53,51,17,35,53,51,55,51,21,51,21,35,17,51,21,1,80,51,63,26,49,29, +41,85,56,216,125,125,125,132,53,120,200,200,200,2,4,248,78,63,8,6,133,11, +13,245,1,31,131,1,48,131,242,242,131,254,208,131,255,255,0,158,255,236,5, +41,7,6,18,38,0,56,0,0,17,7,2,153,1,148,0,0,0,19,64,11,1,26,5,38,1,0,35,49, +5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5,189,18,38,0,88, +0,0,17,7,1,78,0,246,0,0,0,19,64,11,1,38,17,38,1,13,47,61,36,19,37,1,43,53, +0,43,53,0,0,0,255,255,0,158,255,236,5,41,6,156,18,38,0,56,0,0,17,7,1,73,1, +159,1,73,0,19,64,11,1,26,5,38,1,1,27,26,5,20,37,1,43,53,0,43,53,0,0,0,255, +255,0,133,255,236,3,235,5,83,18,38,0,88,0,0,17,7,1,73,0,240,0,0,0,21,180, +1,38,17,38,1,184,255,254,180,39,38,36,19,37,1,43,53,0,43,53,0,255,255,0,158, +255,236,5,41,6,243,18,38,0,56,0,0,17,7,2,155,1,174,0,0,0,19,64,11,1,26,5, +38,1,0,31,39,5,20,37,1,43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,235,5, +230,18,38,0,88,0,0,17,7,1,74,1,11,0,0,0,21,180,1,38,17,38,1,184,255,253,180, +43,55,36,19,37,1,43,53,0,43,53,0,255,255,0,158,255,236,5,41,7,62,18,38,0, +56,0,0,17,7,1,76,1,191,0,203,0,23,64,13,2,1,31,5,38,2,1,0,36,26,5,20,37,1, +43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,235,6,115,18,38,0,88,0, +0,17,7,1,76,1,20,0,0,0,23,64,13,2,1,43,17,38,2,1,1,48,38,36,19,37,1,43,53, +53,0,43,53,53,0,0,0,255,255,0,158,255,236,5,41,6,241,18,38,0,56,0,0,17,7, +2,154,1,157,0,0,0,23,64,13,2,1,26,5,38,2,1,81,26,35,5,20,37,1,43,53,53,0, +43,53,53,0,0,0,255,255,0,133,255,236,4,30,5,228,18,38,0,88,0,0,17,7,1,79, +1,5,0,0,0,23,64,13,2,1,38,17,38,2,1,100,38,47,36,19,37,1,43,53,53,0,43,53, +53,0,0,0,255,255,0,158,254,85,5,41,5,129,16,38,0,56,0,0,17,7,1,77,2,32,0, +0,0,40,185,0,1,254,103,181,39,39,21,21,37,51,184,255,192,179,21,21,72,51, +184,255,192,179,20,20,72,51,184,255,192,178,19,19,72,43,43,43,43,53,0,0,255, +255,0,133,254,85,4,5,4,58,18,38,0,88,0,0,17,7,1,77,2,87,0,0,0,13,185,0,1, +255,226,180,50,50,14,14,37,43,53,0,255,255,0,9,0,0,7,134,6,254,18,38,0,58, +0,0,17,7,2,150,2,121,0,0,0,21,180,1,48,5,38,1,184,255,253,180,53,47,15,46, +37,1,43,53,0,43,53,0,255,255,255,253,0,0,5,204,5,211,18,38,0,90,0,0,17,7, +1,71,1,148,0,0,0,21,180,1,44,17,38,1,184,255,251,180,49,43,15,42,37,1,43, +53,0,43,53,0,255,255,0,45,0,0,5,41,6,254,18,38,0,60,0,0,17,7,2,150,1,91,0, +0,0,21,180,1,10,5,38,1,184,255,251,180,15,9,4,8,37,1,43,53,0,43,53,0,255, +255,0,5,254,87,3,252,5,211,18,38,0,92,0,0,17,7,1,71,0,182,0,0,0,19,64,11, +1,33,17,38,1,0,38,32,17,31,37,1,43,53,0,43,53,0,0,0,255,255,0,45,0,0,5,41, +6,178,18,38,0,60,0,0,17,7,2,152,1,104,0,0,0,23,64,13,2,1,9,5,38,2,1,0,13, +11,4,8,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,65,0,0,4,163,6,240,18,38, +0,61,0,0,17,7,2,149,1,160,0,0,0,19,64,11,1,10,5,38,1,74,10,13,1,0,37,1,43, +53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,228,18,38,0,93,0,0,17,7,0,116,1, +53,0,0,0,19,64,11,1,10,17,38,1,93,10,13,0,8,37,1,43,53,0,43,53,0,0,0,255, +255,0,65,0,0,4,163,6,241,18,38,0,61,0,0,17,7,1,75,1,124,1,37,0,19,64,11,1, +10,5,38,1,0,10,12,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182,5,204, +18,38,0,93,0,0,17,7,1,75,0,253,0,0,0,12,182,1,0,10,12,0,8,37,1,43,53,0,0, +0,255,255,0,65,0,0,4,163,6,254,18,38,0,61,0,0,17,7,2,151,1,56,0,0,0,19,64, +11,1,10,5,38,1,17,12,18,1,0,37,1,43,53,0,43,53,0,0,0,255,255,0,49,0,0,3,182, +5,211,18,38,0,93,0,0,17,7,1,72,0,156,0,0,0,21,180,1,10,17,38,1,184,255,244, +180,12,18,0,8,37,1,43,53,0,43,53,0,0,1,0,138,0,0,2,17,5,202,0,19,0,125,185, +0,5,255,216,179,13,17,72,5,184,255,224,64,56,8,12,72,111,10,1,10,10,0,70, +0,1,16,1,48,1,240,1,4,8,1,255,21,1,224,21,1,223,21,1,176,21,192,21,2,159, +21,1,112,21,128,21,2,31,21,1,0,21,1,240,21,1,223,21,1,21,184,255,192,64,18, +34,37,72,79,21,1,112,21,1,31,21,1,14,80,7,0,0,21,0,63,63,237,1,93,93,113, +43,113,113,114,114,114,114,114,114,114,114,47,94,93,237,50,47,93,49,48,0, +43,43,33,35,17,52,62,2,51,50,22,23,21,46,1,35,34,14,2,21,1,62,180,22,59,102, +81,32,69,26,17,45,18,40,51,29,11,4,180,59,101,75,43,6,6,137,3,5,22,41,60, +39,0,0,0,0,1,0,192,254,78,3,195,5,174,0,27,0,148,64,107,133,6,1,122,18,138, +18,2,139,15,1,89,15,105,15,121,15,3,131,13,1,85,13,101,13,117,13,3,54,13, +1,38,7,1,38,8,1,34,22,50,22,114,22,130,22,4,21,17,37,17,53,17,3,27,212,8, +228,8,244,8,3,80,8,144,8,2,38,8,54,8,70,8,3,8,10,27,3,13,13,17,19,3,8,95, +14,159,14,2,14,12,16,80,9,17,17,13,3,81,15,24,127,24,175,24,3,24,13,0,47, +47,93,237,18,57,47,51,237,50,1,47,113,51,23,51,17,23,51,113,113,113,47,49, +48,93,0,93,1,93,93,93,93,93,93,93,93,93,1,46,1,35,34,14,2,15,1,51,7,35,3, +35,19,35,55,51,55,62,3,51,50,22,23,3,164,17,62,31,31,46,33,24,9,26,211,25, +213,254,180,254,152,27,151,29,12,40,71,109,81,32,82,35,5,32,5,10,19,40,64, +45,137,131,250,211,5,45,131,152,59,102,76,43,10,10,0,0,0,4,0,4,0,0,5,82,7, +62,0,26,0,39,0,61,0,67,1,36,64,18,122,64,138,64,2,102,5,118,5,134,5,3,86, +6,102,6,2,25,184,255,232,64,183,9,17,72,19,24,9,17,72,12,16,14,17,72,10,12, +1,12,38,9,10,32,8,39,32,7,32,40,130,0,68,66,132,66,2,66,62,50,130,17,175, +62,191,62,207,62,3,15,17,47,17,2,144,17,1,0,0,32,0,2,15,0,159,0,2,0,62,17, +17,62,0,3,6,11,5,32,32,10,7,139,7,1,90,7,106,7,122,7,3,7,16,6,32,6,48,6,3, +32,6,1,6,6,69,80,69,176,69,2,48,69,96,69,144,69,192,69,240,69,5,47,69,1,132, +10,1,85,10,101,10,117,10,3,10,11,62,62,45,141,112,22,128,22,2,22,22,57,127, +64,159,64,175,64,191,64,4,64,64,9,13,72,64,8,9,39,38,38,10,5,12,32,3,128, +57,1,63,57,1,0,57,1,57,7,7,10,0,47,51,47,47,93,93,93,23,51,18,57,47,51,205, +50,47,43,93,18,57,47,93,237,51,47,1,47,51,93,93,93,93,113,17,51,47,93,113, +51,93,93,17,18,57,17,51,17,18,23,57,47,47,47,93,113,93,113,93,16,237,16,205, +93,16,237,16,135,192,192,135,192,192,1,51,49,48,93,43,43,43,93,93,93,1,20, +6,7,6,7,1,35,3,33,3,35,1,38,39,46,1,53,52,62,2,51,50,30,2,3,46,3,39,14,3, +7,3,33,3,52,46,2,35,34,14,2,21,20,30,1,23,22,23,51,50,62,2,3,53,55,51,21, +5,3,158,38,33,16,18,2,29,195,161,253,126,162,198,2,36,21,18,33,38,38,66,88, +50,50,88,66,38,158,16,29,22,15,1,2,14,23,29,15,180,2,15,131,21,36,49,28,29, +49,36,21,21,36,24,21,24,9,28,49,36,21,247,217,207,254,202,5,112,45,79,30, +15,11,251,68,1,115,254,141,4,185,12,17,30,79,45,45,79,59,34,34,59,79,253, +254,36,74,60,41,4,4,41,62,73,36,254,95,3,119,25,44,33,19,19,33,44,25,26,44, +35,10,8,1,19,35,44,1,35,16,181,23,174,0,255,255,0,87,255,236,4,115,7,62,18, +38,0,68,0,0,16,39,1,76,1,20,255,85,17,7,0,116,1,99,1,90,0,35,64,14,3,2,101, +16,38,4,26,106,109,3,36,37,3,2,184,255,212,180,76,66,3,36,37,1,43,53,53,43, +53,0,43,53,53,0,0,0,255,255,0,24,0,0,7,168,6,240,18,38,0,134,0,0,17,7,2,149, +3,228,0,0,0,21,180,2,27,5,38,2,184,1,32,180,27,30,4,14,37,1,43,53,0,43,53, +0,255,255,0,66,255,236,6,194,5,228,18,38,0,166,0,0,17,7,0,116,2,175,0,0,0, +19,64,11,3,89,17,38,3,73,89,92,25,61,37,1,43,53,0,43,53,0,0,0,255,255,0,71, +255,203,5,244,6,240,18,38,0,152,0,0,17,7,2,149,2,75,0,0,0,19,64,11,3,52,5, +38,3,73,52,55,10,24,37,1,43,53,0,43,53,0,0,0,255,255,0,44,255,218,4,180,5, +228,18,38,0,184,0,0,17,7,0,116,1,178,0,0,0,19,64,11,3,46,17,38,3,94,46,49, +8,19,37,1,43,53,0,43,53,0,0,0,0,1,0,0,4,177,2,150,5,211,0,9,0,66,64,14,118, +9,134,9,2,120,8,136,8,2,128,0,1,0,184,255,192,64,27,11,15,72,0,191,6,1,6, +4,142,64,8,148,128,6,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93,51,26,253,26, +237,1,47,93,204,43,93,49,48,93,93,1,21,35,39,35,7,35,53,19,51,2,150,105,219, +2,232,104,234,204,4,197,20,169,169,20,1,14,0,0,1,0,0,4,177,2,150,5,211,0, +9,0,66,64,14,118,0,134,0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,27,11,15, +72,8,64,191,2,1,2,7,3,148,128,6,142,15,1,47,1,63,1,127,1,239,1,5,1,0,47,93, +237,26,237,50,1,47,93,26,204,43,93,49,48,93,93,1,35,3,53,51,23,51,55,51,21, +1,182,204,234,104,232,2,219,105,4,177,1,14,20,169,169,20,0,0,1,0,51,4,212, +2,88,5,83,0,3,0,81,64,59,4,1,1,228,1,244,1,2,1,164,0,1,91,0,107,0,2,52,0, +68,0,2,0,2,32,18,25,72,2,142,1,64,28,33,72,47,1,1,2,15,1,63,1,175,1,191,1, +4,1,64,22,26,72,1,64,14,17,72,1,0,47,43,43,93,95,113,43,237,43,1,47,93,93, +93,47,93,113,49,48,1,33,53,33,2,88,253,219,2,37,4,212,127,0,1,255,221,4,177, +2,119,5,230,0,21,0,73,64,51,133,14,1,133,8,1,31,17,79,17,127,17,175,17,223, +17,5,239,17,1,17,64,5,64,29,60,72,5,16,80,5,96,5,2,5,149,128,11,143,15,0, +47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,237,113,50,1,47,43,26,204,93,113, +49,48,0,93,93,1,34,46,2,39,51,30,3,51,50,62,2,55,51,14,3,1,41,74,116,84,50, +8,117,8,39,56,72,42,42,71,56,38,8,117,9,50,83,116,4,177,51,85,112,61,43,59, +36,15,16,36,59,42,61,112,85,51,0,1,0,156,5,32,1,80,5,204,0,3,0,23,64,12,3, +134,0,64,14,17,72,0,0,83,1,0,0,63,237,1,47,43,237,49,48,19,53,51,21,156,180, +5,32,172,172,0,0,2,0,51,4,144,2,23,6,115,0,19,0,39,0,89,185,0,18,255,232, +64,14,9,14,72,12,24,9,14,72,8,24,9,14,72,2,184,255,232,64,42,9,14,72,20,130, +64,0,192,30,130,95,10,1,10,25,141,15,15,31,15,2,15,35,141,15,5,47,5,63,5, +79,5,127,5,159,5,191,5,239,5,8,5,0,47,93,237,220,93,237,1,47,93,237,26,220, +26,237,49,48,43,43,43,43,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,7,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,2,23,38,66,88,50,50,88,66,38,38,66, +88,50,50,88,66,38,108,21,36,49,28,29,49,36,21,21,36,49,29,28,49,36,21,5,130, +50,88,66,38,38,66,88,50,50,88,65,38,38,65,88,50,28,49,36,21,21,36,49,28,29, +49,38,21,21,38,49,0,0,0,0,1,0,80,254,85,1,174,0,0,0,23,0,76,64,55,14,24,9, +13,72,9,24,9,13,72,5,32,9,17,72,12,17,132,15,0,31,0,2,95,0,191,0,2,0,6,11, +64,7,10,72,11,20,141,16,3,1,32,3,80,3,96,3,112,3,176,3,192,3,6,3,0,47,93, +113,237,47,43,1,47,205,93,113,237,50,49,48,43,43,43,1,14,1,35,34,38,53,52, +62,2,55,51,14,3,21,20,22,51,50,54,55,1,174,28,71,40,105,106,34,48,53,20,133, +25,52,43,27,49,45,29,58,28,254,112,12,15,102,85,47,79,61,42,11,14,45,59,70, +39,42,48,13,11,0,1,255,233,4,177,2,182,5,189,0,27,2,77,185,0,26,255,232,64, +182,9,17,72,12,24,9,17,72,41,29,1,25,29,41,29,57,29,89,29,105,29,5,29,64, +229,232,72,29,64,217,220,72,11,29,1,208,169,29,185,29,201,29,3,155,29,1,9, +29,57,29,2,185,29,201,29,217,29,3,29,64,195,198,72,155,29,171,29,2,137,29, +1,123,29,1,73,29,1,137,29,185,29,2,29,64,171,175,72,6,29,54,29,2,158,153, +29,1,125,29,141,29,2,111,29,1,45,29,61,29,77,29,3,27,29,1,13,29,1,237,29, +253,29,2,29,128,136,139,72,137,29,153,29,2,91,29,107,29,123,29,3,29,192,127, +130,72,9,29,1,249,29,1,235,29,1,201,29,217,29,2,171,29,187,29,2,153,29,1, +22,29,38,29,102,29,118,29,134,29,5,4,29,1,110,29,184,255,64,64,96,101,109, +72,148,29,1,112,29,128,29,2,82,29,98,29,2,64,29,1,18,29,34,29,50,29,3,4,29, +1,228,29,244,29,2,214,29,1,196,29,1,176,29,1,162,29,1,128,29,144,29,2,82, +29,98,29,114,29,3,36,29,52,29,68,29,3,6,29,22,29,2,246,29,1,210,29,226,29, +2,192,29,1,146,29,162,29,178,29,3,100,29,116,29,132,29,3,29,184,255,192,64, +9,60,64,72,2,29,1,59,1,29,184,255,128,64,57,53,58,72,164,29,180,29,2,144, +29,1,100,29,116,29,132,29,3,48,29,64,29,80,29,3,4,29,20,29,36,29,3,208,29, +224,29,2,164,29,180,29,196,29,3,112,29,128,29,2,148,29,164,29,228,29,3,29, +184,255,192,64,19,26,31,72,128,29,1,84,29,100,29,116,29,3,29,64,7,10,72,23, +184,255,128,64,9,36,39,72,148,23,164,23,2,23,184,255,128,64,23,30,33,72,68, +23,1,48,23,1,2,0,23,16,23,32,23,3,208,23,224,23,2,23,184,255,192,64,43,13, +19,72,15,23,1,23,9,22,22,5,143,64,15,14,31,14,2,255,14,1,14,64,16,19,72,14, +128,19,143,8,15,0,47,0,63,0,127,0,239,0,5,0,0,47,93,50,237,26,221,43,93,113, +26,237,51,47,1,47,204,93,43,93,113,95,113,113,43,113,43,43,93,93,43,93,113, +113,113,114,114,114,114,114,43,95,94,93,43,93,93,93,93,93,113,113,113,113, +113,113,113,113,113,114,114,114,114,114,114,43,94,93,93,93,93,93,93,93,113, +43,113,113,43,113,114,114,114,114,114,114,94,93,43,93,113,113,113,113,43, +113,114,114,114,94,93,43,43,93,113,49,48,43,43,1,34,46,2,35,34,6,7,35,62, +3,51,50,30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45, +74,59,44,84,78,69,30,54,55,8,92,5,20,43,74,4,177,37,45,37,62,57,45,95,78, +50,37,45,37,63,56,44,95,78,51,0,0,0,2,0,22,4,177,3,25,5,228,0,5,0,11,0,111, +64,82,164,10,1,102,10,1,154,8,170,8,2,98,4,162,4,2,98,3,1,154,2,170,2,2,10, +159,6,1,15,6,31,6,127,6,223,6,4,7,6,4,64,63,0,79,0,143,0,175,0,191,0,207, +0,6,0,64,30,41,72,0,64,23,26,72,0,8,2,149,128,6,15,0,47,0,63,0,127,0,239, +0,5,0,0,47,93,50,26,237,50,1,47,43,43,93,26,205,220,94,93,113,205,49,48,93, +93,93,93,93,93,19,53,19,51,21,1,51,53,19,51,21,1,22,217,207,254,182,253,217, +207,254,182,4,177,20,1,31,29,254,234,20,1,31,29,254,234,0,0,1,0,205,4,194, +1,225,6,7,0,5,0,64,64,43,2,16,12,17,72,41,2,1,10,5,26,5,42,5,3,3,43,3,1,3, +64,0,2,128,132,0,148,0,2,112,0,1,2,16,0,32,0,64,0,96,0,4,0,0,47,93,95,93, +93,26,205,1,47,26,205,93,49,48,95,93,93,43,19,53,19,51,21,3,205,69,207,201, +4,194,33,1,36,37,254,224,0,3,0,29,4,176,2,139,6,65,0,5,0,9,0,13,0,83,64,53, +2,16,11,17,72,10,5,26,5,42,5,3,47,4,1,4,47,1,1,1,1,6,192,13,208,13,2,13,10, +192,9,208,9,2,9,6,11,7,144,6,2,0,0,10,192,6,1,15,6,63,6,2,6,0,47,93,93,51, +51,47,205,16,237,50,1,47,205,93,47,205,93,18,57,47,113,205,93,49,48,93,43, +19,53,19,51,21,3,37,53,51,21,33,53,51,21,250,69,187,181,254,216,150,1,66, +150,4,176,33,1,112,37,254,148,31,172,172,172,172,0,0,255,255,0,4,0,0,5,82, +5,131,16,38,0,36,0,0,17,7,1,80,255,108,255,124,0,94,179,2,0,24,1,184,255, +10,181,24,24,5,5,37,28,184,255,192,179,36,36,72,28,184,255,192,179,30,30, +72,28,184,255,192,179,24,24,72,28,184,255,192,179,21,21,72,28,184,255,192, +179,18,18,72,28,184,255,192,179,15,15,72,28,184,255,192,64,11,12,12,72,28, +64,11,11,72,2,23,3,0,63,53,1,43,43,43,43,43,43,43,43,43,93,53,0,1,0,187,1, +190,1,126,2,154,0,3,2,10,179,3,134,0,5,184,255,128,64,12,229,233,72,6,5,22, +5,2,246,5,1,5,184,255,128,64,33,222,225,72,150,5,166,5,2,116,5,132,5,2,86, +5,102,5,2,68,5,1,38,5,54,5,2,2,5,18,5,2,211,5,184,255,128,64,22,207,210,72, +198,5,214,5,2,180,5,1,150,5,166,5,2,116,5,132,5,2,5,184,255,192,64,36,195, +199,72,4,5,20,5,2,214,5,230,5,246,5,3,194,5,1,148,5,164,5,180,5,3,118,5,134, +5,2,84,5,100,5,2,5,184,255,192,64,34,174,181,72,164,5,180,5,196,5,3,70,5, +86,5,118,5,134,5,150,5,5,52,5,1,38,5,1,4,5,20,5,2,161,5,184,255,192,179,157, +160,72,5,184,255,192,64,37,152,155,72,100,5,116,5,2,54,5,70,5,86,5,3,36,5, +1,6,5,22,5,2,244,5,1,214,5,230,5,2,178,5,194,5,2,5,184,255,128,64,28,135, +138,72,86,5,102,5,2,36,5,52,5,68,5,3,2,5,18,5,2,212,5,228,5,244,5,3,5,184, +255,192,64,23,119,124,72,82,5,98,5,2,1,32,5,48,5,64,5,3,4,5,20,5,2,112,5, +184,255,128,64,9,103,111,72,68,5,84,5,2,5,184,255,192,179,99,102,72,5,184, +255,128,179,92,95,72,5,184,255,192,179,87,91,72,5,184,255,128,64,21,81,86, +72,36,5,52,5,68,5,3,228,5,1,176,5,192,5,208,5,3,5,184,255,192,64,16,67,70, +72,48,5,1,36,5,1,0,5,16,5,2,60,5,184,255,192,64,12,56,59,72,187,5,1,128,5, +144,5,2,5,184,255,192,64,41,45,48,72,11,5,1,208,5,224,5,2,164,5,180,5,196, +5,3,32,5,48,5,2,2,0,5,16,5,2,240,5,1,159,5,175,5,2,0,5,1,5,184,255,192,181, +13,17,72,0,155,1,0,47,237,1,43,93,93,93,113,95,113,113,113,114,43,114,114, +43,94,93,93,93,43,93,93,113,43,43,43,43,114,43,94,93,93,95,93,43,93,113,113, +113,43,113,113,113,114,114,114,114,43,43,94,93,93,93,93,93,43,113,113,113, +113,113,114,43,114,114,114,114,43,94,93,93,93,93,93,93,43,93,113,43,47,237, +49,48,19,53,51,21,187,195,1,190,220,220,0,0,255,255,255,245,0,0,5,238,5,131, +16,39,0,40,0,240,0,0,17,7,1,80,255,40,255,124,0,49,64,10,1,14,3,1,16,15,1, +0,15,1,184,255,113,64,19,15,15,1,1,37,0,208,0,1,191,0,1,47,0,1,47,0,1,0,16, +93,93,93,93,53,43,93,93,53,0,63,53,0,0,0,255,255,255,242,0,0,6,13,5,131,16, +39,0,43,0,237,0,0,17,7,1,80,255,37,255,124,0,95,185,0,19,255,192,179,21,21, +72,19,184,255,192,179,20,20,72,19,184,255,192,179,19,19,72,19,184,255,192, +179,17,17,72,19,184,255,192,64,13,14,14,72,1,14,3,1,16,15,1,0,15,1,184,255, +113,64,19,15,15,5,5,37,0,207,0,1,191,0,1,111,0,1,47,0,1,0,16,93,93,93,93, +53,43,93,93,53,0,63,53,1,43,43,43,43,43,0,255,255,255,232,0,0,2,85,5,131, +16,39,0,44,0,217,0,0,17,7,1,80,255,27,255,124,0,92,185,0,11,255,192,179,17, +17,72,11,184,255,192,64,23,12,12,72,11,64,11,11,72,11,64,9,9,72,1,6,3,1,16, +7,1,0,7,1,184,255,102,64,28,7,7,1,1,37,0,128,0,1,127,0,1,111,0,1,95,0,1,79, +0,1,47,0,1,47,0,1,0,16,93,93,93,93,93,93,93,53,43,93,93,53,0,63,53,1,43,43, +43,43,255,255,255,187,255,236,5,211,5,150,16,38,0,50,252,0,17,7,1,80,254, +238,255,124,0,39,64,10,2,42,3,2,192,40,1,0,40,1,184,255,94,64,11,40,40,10, +10,37,1,0,47,0,1,0,16,93,53,53,43,93,93,53,0,63,53,0,0,0,255,255,0,65,0,0, +6,171,5,131,16,39,0,60,1,130,0,0,17,7,1,80,255,116,255,124,5,192,64,21,16, +64,233,233,72,16,64,229,229,72,16,64,227,227,72,16,64,226,226,72,16,184,255, +192,179,224,224,72,16,184,255,192,64,19,222,222,72,16,64,220,220,72,16,64, +219,219,72,16,64,216,216,72,16,184,255,192,179,215,215,72,16,184,255,192, +64,19,211,211,72,16,64,207,207,72,16,64,206,206,72,16,64,205,205,72,16,184, +255,192,179,204,204,72,16,184,255,192,64,19,202,202,72,16,64,199,199,72,16, +64,186,186,72,16,64,184,184,72,16,184,255,192,179,183,183,72,16,184,255,192, +64,14,182,182,72,16,64,179,179,72,16,64,177,177,72,16,184,255,192,64,19,172, +172,72,16,64,166,166,72,16,64,164,164,72,16,64,163,163,72,16,184,255,192, +64,24,161,161,72,16,64,156,156,72,16,128,153,153,72,16,64,152,152,72,16,64, +151,151,72,16,184,255,192,179,149,149,72,16,184,255,128,179,148,148,72,16, +184,255,128,179,147,147,72,16,184,255,192,179,146,146,72,16,184,255,128,179, +145,145,72,16,184,255,192,179,144,144,72,16,184,255,128,179,141,141,72,16, +184,255,128,179,140,140,72,16,184,255,192,179,139,139,72,16,184,255,128,179, +138,138,72,16,184,255,192,179,137,137,72,16,184,255,192,179,136,136,72,16, +184,255,192,179,135,135,72,16,184,255,128,179,134,134,72,16,184,255,192,179, +133,133,72,16,184,255,128,179,131,131,72,16,184,255,192,179,130,130,72,16, +184,255,0,179,129,129,72,16,184,255,0,179,128,128,72,16,184,254,192,179,127, +127,72,16,184,255,0,179,126,126,72,16,184,255,0,179,125,125,72,16,184,255, +64,179,124,124,72,16,184,255,64,179,123,123,72,16,184,255,64,179,122,122, +72,16,184,255,0,179,121,121,72,16,184,254,192,179,120,120,72,16,184,255,0, +179,119,119,72,16,184,255,0,179,118,118,72,16,184,255,64,179,117,117,72,16, +184,255,0,179,116,116,72,16,184,255,64,179,115,115,72,16,184,255,0,179,114, +114,72,16,184,255,64,179,113,113,72,16,184,255,64,179,112,112,72,16,184,255, +64,179,111,111,72,16,184,255,128,179,110,110,72,16,184,255,64,179,109,109, +72,16,184,255,128,179,108,108,72,16,184,255,0,179,107,107,72,16,184,255,64, +179,106,106,72,16,184,255,0,179,105,105,72,16,184,255,64,179,104,104,72,16, +184,255,64,179,103,103,72,16,184,255,64,179,102,102,72,16,184,255,128,179, +101,101,72,16,184,255,64,179,100,100,72,16,184,255,64,179,99,99,72,16,184, +255,0,179,98,98,72,16,184,255,64,179,97,97,72,16,184,255,64,179,96,96,72, +16,184,255,64,179,95,95,72,16,184,255,64,179,94,94,72,16,184,255,64,179,93, +93,72,16,184,255,128,179,92,92,72,16,184,255,64,179,91,91,72,16,184,255,128, +179,90,90,72,16,184,255,64,179,89,89,72,16,184,255,128,179,88,88,72,16,184, +255,64,179,87,87,72,16,184,255,64,179,86,86,72,16,184,255,64,179,85,85,72, +16,184,255,64,179,84,84,72,16,184,255,64,179,83,83,72,16,184,255,128,179, +82,82,72,16,184,255,192,179,81,81,72,16,184,255,128,179,80,80,72,16,184,255, +128,179,79,79,72,16,184,255,64,179,78,78,72,16,184,255,64,179,77,77,72,16, +184,255,64,179,76,76,72,16,184,255,128,179,75,75,72,16,184,255,128,179,74, +74,72,16,184,255,128,179,73,73,72,16,184,255,64,179,72,72,72,16,184,255,128, +179,71,71,72,16,184,255,192,179,70,70,72,16,184,255,128,179,69,69,72,16,184, +255,192,179,68,68,72,16,184,255,192,179,67,67,72,16,184,255,128,179,66,66, +72,16,184,255,64,179,65,65,72,16,184,255,128,179,64,64,72,16,184,255,128, +179,63,63,72,16,184,255,128,179,62,62,72,16,184,255,192,179,61,61,72,16,184, +255,192,179,60,60,72,16,184,255,192,179,59,59,72,16,184,255,128,179,58,58, +72,16,184,255,128,179,57,57,72,16,184,255,128,179,56,56,72,16,184,255,128, +179,55,55,72,16,184,255,128,179,54,54,72,16,184,255,192,179,53,53,72,16,184, +255,192,179,52,52,72,16,184,255,128,179,51,51,72,16,184,255,192,179,50,50, +72,16,184,255,128,179,49,49,72,16,184,255,128,179,48,48,72,16,184,255,128, +179,47,47,72,16,184,255,192,179,46,46,72,16,184,255,128,179,45,45,72,16,184, +255,128,179,44,44,72,16,184,255,128,179,43,43,72,16,184,255,192,179,42,42, +72,16,184,255,192,179,41,41,72,16,184,255,192,179,40,40,72,16,184,255,192, +179,39,39,72,16,184,255,128,179,38,38,72,16,184,255,128,179,37,37,72,16,184, +255,128,179,36,36,72,16,184,255,192,179,35,35,72,16,184,255,128,179,34,34, +72,16,184,255,192,179,33,33,72,16,184,255,192,179,32,32,72,16,184,255,192, +179,31,31,72,16,184,255,192,179,30,30,72,16,184,255,192,179,29,29,72,16,184, +255,192,179,28,28,72,16,184,255,192,179,27,27,72,16,184,255,192,179,26,26, +72,16,184,255,192,179,25,25,72,16,184,255,192,179,24,24,72,16,184,255,128, +179,23,23,72,16,184,255,192,179,22,22,72,16,184,255,192,179,21,21,72,16,184, +255,192,179,17,17,72,16,184,255,128,179,16,16,72,16,184,255,192,179,15,15, +72,16,184,255,192,179,14,14,72,16,184,255,192,64,30,12,12,72,16,64,11,11, +72,1,11,3,1,128,12,1,112,12,1,96,12,1,64,12,1,16,12,1,0,12,1,184,255,166, +64,13,12,12,4,4,37,0,176,0,1,0,0,1,0,16,93,93,53,43,93,93,93,93,93,93,53, +0,63,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,187,0,0, +5,173,5,150,16,38,1,114,10,0,17,7,1,80,254,238,255,124,0,68,64,15,65,64,19, +19,72,1,60,3,1,144,58,1,16,58,1,184,255,62,64,28,58,58,53,53,37,0,159,0,1, +95,0,1,31,0,1,223,0,1,175,0,1,159,0,1,31,0,1,0,16,93,93,93,93,113,113,113, +53,43,93,93,53,0,63,53,1,43,0,0,255,255,255,176,0,0,2,30,6,65,16,38,1,130, +0,0,17,6,1,81,147,0,2,60,64,11,29,64,227,227,72,29,64,226,226,72,29,184,255, +192,179,223,223,72,29,184,255,192,179,220,220,72,29,184,255,192,64,19,219, +219,72,29,64,213,213,72,29,64,212,212,72,29,64,211,211,72,29,184,255,192, +179,207,207,72,29,184,255,192,179,206,206,72,29,184,255,192,64,19,205,205, +72,29,64,200,200,72,29,64,199,199,72,29,64,198,198,72,29,184,255,192,64,14, +192,192,72,29,64,182,182,72,29,64,177,177,72,29,184,255,192,179,175,175,72, +29,184,255,192,64,19,174,174,72,29,64,168,168,72,29,64,167,167,72,29,64,164, +164,72,29,184,255,192,179,161,161,72,29,184,255,192,64,19,160,160,72,29,64, +155,155,72,29,64,154,154,72,29,64,153,153,72,29,184,255,192,179,152,152,72, +29,184,255,192,64,19,151,151,72,29,64,141,141,72,29,64,132,132,72,29,64,131, +131,72,29,184,255,192,64,9,129,129,72,29,64,119,119,72,29,184,255,192,64, +14,115,115,72,29,64,110,110,72,29,64,109,109,72,29,184,255,192,64,19,106, +106,72,29,64,101,101,72,29,64,100,100,72,29,64,96,96,72,29,184,255,192,179, +94,94,72,29,184,255,192,64,19,93,93,72,29,64,87,87,72,29,64,86,86,72,29,64, +85,85,72,29,184,255,192,179,84,84,72,29,184,255,192,64,9,79,79,72,29,64,74, +74,72,29,184,255,192,64,24,61,61,72,29,64,56,56,72,29,64,55,55,72,29,64,54, +54,72,29,64,51,51,72,29,184,255,192,179,50,50,72,29,184,255,192,179,49,49, +72,29,184,255,192,64,19,48,48,72,29,64,42,42,72,29,64,41,41,72,29,64,40,40, +72,29,184,255,192,179,36,36,72,29,184,255,192,179,35,35,72,29,184,255,192, +64,19,34,34,72,29,64,29,29,72,29,64,24,24,72,29,64,23,23,72,29,184,255,192, +179,21,21,72,29,184,255,192,179,17,17,72,29,184,255,192,64,14,16,16,72,29, +64,9,9,72,29,64,8,8,72,29,184,255,192,64,12,7,7,72,3,2,1,14,17,38,3,2,1,184, +255,220,180,20,26,5,13,37,1,43,53,53,53,0,43,53,53,53,1,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,0,4,0,0,5,82,5,129, +18,6,0,36,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,0,1,0,168,0,1,4, +47,5,130,0,5,0,56,64,40,3,90,0,4,16,4,64,4,3,4,16,0,48,0,80,0,3,0,0,16,0, +32,0,64,0,96,0,128,0,160,0,7,7,0,2,95,5,3,3,18,0,63,63,237,1,47,94,93,113, +47,93,237,49,48,1,21,33,17,35,17,4,47,253,56,191,5,130,156,251,27,5,129,0, +2,0,61,0,0,5,26,5,129,0,5,0,18,0,176,64,26,106,7,122,7,138,7,3,101,17,117, +17,133,17,3,89,8,1,86,16,1,6,24,13,17,72,18,184,255,232,64,64,13,17,72,132, +2,1,70,2,102,2,118,2,3,139,1,1,73,1,105,1,121,1,3,2,1,12,12,0,6,95,3,1,16, +3,1,15,3,1,175,3,207,3,223,3,255,3,4,79,3,127,3,2,48,3,1,31,3,1,3,18,128, +0,1,0,184,255,192,64,29,21,30,72,0,48,20,1,47,20,1,0,3,6,3,18,95,5,18,12, +32,19,22,72,153,12,1,12,1,3,0,63,51,93,43,63,237,23,50,1,93,93,47,43,93,51, +47,93,93,93,93,113,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93,43,43,93, +93,93,93,49,48,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,62,2,5,217,1,254,251, +35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12,141, +156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,255,255,0,168,0,0,4,254,5,129, +18,6,0,40,0,0,255,255,0,65,0,0,4,163,5,129,18,6,0,61,0,0,255,255,0,168,0, +0,5,32,5,129,18,6,0,43,0,0,0,3,0,97,255,236,5,215,5,150,0,19,0,39,0,43,0, +179,64,130,105,12,1,102,17,1,89,22,1,86,32,1,86,28,1,26,23,90,23,2,21,27, +85,27,2,9,42,1,6,43,1,10,37,26,37,90,37,3,5,33,21,33,85,33,3,9,43,42,30,0, +91,15,20,1,59,207,20,239,20,2,0,20,1,239,20,255,20,2,176,20,1,111,20,1,48, +20,1,31,20,1,0,20,16,20,32,20,64,20,80,20,160,20,6,7,20,30,91,175,10,191, +10,2,32,10,1,15,10,31,10,2,10,43,95,40,40,35,25,95,15,4,35,95,5,19,128,45, +1,32,45,1,93,93,0,63,237,63,237,18,57,47,237,1,47,93,93,93,237,47,94,93,113, +113,113,113,113,114,114,94,93,237,18,57,57,49,48,94,93,93,93,93,93,93,93, +93,93,93,93,1,20,2,6,4,35,34,36,38,2,53,52,18,54,36,51,50,4,22,18,7,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,37,33,21,33,5,215,95,180,254,252,165,174, +254,250,174,88,92,178,1,5,169,168,1,5,177,92,195,65,127,188,123,126,190,127, +63,65,127,189,123,132,191,123,59,252,226,2,75,253,181,2,199,165,254,242,192, +104,109,195,1,12,159,165,1,10,187,101,102,188,254,246,163,127,208,148,80, +80,148,208,127,127,211,153,85,86,153,212,208,160,0,0,0,255,255,0,189,0,0, +1,124,5,129,18,6,0,44,0,0,255,255,0,168,0,0,5,63,5,129,18,6,0,46,0,0,0,1, +0,10,0,1,5,78,5,130,0,16,0,202,64,11,116,16,132,16,2,123,15,139,15,2,13,184, +255,232,182,14,17,72,54,13,1,12,184,255,240,64,127,13,17,72,2,16,13,17,72, +1,24,14,17,72,57,1,1,111,18,1,48,18,1,47,18,1,0,18,1,21,16,37,16,53,16,3, +6,16,1,230,16,246,16,2,16,26,15,42,15,58,15,3,9,15,1,233,15,249,15,2,15,7, +7,21,13,37,13,53,13,3,6,13,1,230,13,246,13,2,13,175,14,191,14,2,14,26,1,42, +1,58,1,3,9,1,1,233,1,249,1,2,1,16,0,32,0,48,0,3,111,0,1,0,0,48,0,2,0,118, +7,134,7,2,7,15,3,14,0,18,0,63,50,63,51,93,1,47,93,93,113,50,93,113,113,47, +93,51,93,113,113,57,61,47,51,93,113,113,51,93,113,113,93,93,93,93,49,48,93, +43,43,43,93,43,93,93,37,35,1,46,1,39,38,39,6,7,14,1,7,1,35,1,51,5,78,201, +254,124,17,29,12,14,12,13,14,12,30,15,254,122,201,2,63,198,1,3,224,47,89, +35,41,37,39,41,35,89,45,252,32,5,129,0,255,255,0,168,0,0,6,2,5,129,18,6,0, +48,0,0,255,255,0,168,0,0,5,32,5,129,18,6,0,49,0,0,0,3,0,90,0,0,4,217,5,129, +0,3,0,7,0,11,0,75,64,49,82,3,1,10,9,5,3,95,6,1,15,6,31,6,175,6,191,6,4,6, +2,16,5,48,5,2,32,5,64,5,112,5,160,5,4,5,10,95,11,11,0,7,95,6,18,3,95,0,3, +0,63,237,63,237,17,57,47,237,1,47,93,113,51,47,93,113,51,18,57,57,49,48,113, +19,33,21,33,1,21,33,53,1,21,33,53,125,4,57,251,199,4,92,251,129,3,228,252, +183,5,129,156,251,183,156,156,2,133,154,154,0,0,0,255,255,0,97,255,236,5, +215,5,150,18,6,0,50,0,0,0,1,0,168,0,0,5,32,5,129,0,7,0,79,64,40,3,90,0,4, +16,4,64,4,3,7,4,7,90,64,111,0,127,0,143,0,191,0,4,0,0,9,128,32,9,1,32,9,160, +9,176,9,192,9,4,9,184,255,192,64,10,14,17,72,2,95,5,3,4,0,18,0,63,50,63,237, +1,43,93,113,26,16,204,47,93,26,237,47,94,93,237,49,48,33,17,33,17,35,17,33, +17,4,97,253,6,191,4,120,4,224,251,32,5,129,250,127,255,255,0,168,0,0,4,234, +5,129,18,6,0,51,0,0,0,1,0,108,0,0,4,161,5,129,0,12,0,188,64,135,169,3,1,105, +9,1,116,9,132,9,164,9,3,148,8,164,8,2,87,8,103,8,2,145,7,1,84,7,100,7,2,146, +10,162,10,2,116,10,132,10,2,70,10,86,10,102,10,3,57,3,185,3,2,249,3,1,103, +3,1,168,8,1,103,8,1,8,100,2,1,39,2,1,175,6,1,2,6,2,6,1,208,11,1,0,11,16,11, +48,11,80,11,96,11,128,11,6,7,11,70,7,1,11,7,1,7,3,3,10,175,1,191,1,2,32,1, +1,15,1,1,1,3,7,95,9,2,8,3,0,4,3,1,10,95,0,18,0,63,237,50,63,18,23,57,237, +50,1,47,93,93,93,51,51,47,51,113,113,47,94,93,93,18,57,57,47,47,93,113,113, +51,113,113,113,113,114,49,48,93,93,93,93,93,93,93,93,113,93,51,53,9,1,53, +33,21,33,1,21,1,33,21,108,2,26,253,247,3,231,252,240,1,202,254,22,3,109,162, +2,67,1,251,161,156,254,67,124,253,240,156,0,255,255,0,46,0,0,4,180,5,129, +18,6,0,55,0,0,255,255,0,45,0,0,5,41,5,129,18,6,0,60,0,0,0,3,0,117,255,245, +5,238,5,139,0,29,0,40,0,51,0,180,185,0,28,255,240,179,12,15,72,17,184,255, +240,179,12,15,72,27,184,255,240,179,12,15,72,18,184,255,240,64,72,12,15,72, +41,90,11,15,123,15,171,15,3,15,8,30,90,4,0,116,0,164,0,3,0,35,24,7,90,47, +21,4,8,1,20,8,36,8,68,8,116,8,164,8,244,8,6,8,20,53,68,53,2,0,53,1,132,53, +164,53,196,53,244,53,4,112,53,1,2,96,53,1,53,184,255,192,64,24,10,13,72,35, +46,96,10,6,10,34,49,96,20,24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57, +47,47,17,51,16,237,50,17,51,16,237,50,1,43,93,95,93,93,113,113,47,93,113, +51,51,253,50,50,220,93,237,16,220,93,237,49,48,0,43,43,43,43,1,20,14,2,43, +1,21,35,53,35,34,46,2,53,52,62,2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17, +51,50,62,2,37,20,30,2,59,1,17,35,34,6,5,238,64,131,197,133,83,185,83,133, +197,131,64,67,133,201,135,72,185,71,135,202,133,67,192,185,183,48,56,92,136, +89,43,252,7,43,89,136,92,56,52,182,182,2,224,105,188,143,84,227,227,84,143, +188,105,113,185,131,72,182,182,72,131,185,117,187,180,253,22,53,98,140,88, +88,140,98,53,2,234,180,255,255,0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,145, +0,0,6,30,5,129,0,35,0,203,64,127,90,31,106,31,2,85,30,101,30,2,90,4,106,4, +2,90,5,106,5,2,74,22,1,69,13,1,3,25,90,100,28,1,132,28,148,28,2,28,19,35, +90,0,10,90,107,7,1,139,7,155,7,2,7,16,219,0,1,4,0,100,0,132,0,3,219,0,1,4, +0,52,0,68,0,100,0,132,0,148,0,180,0,196,0,8,7,0,4,37,36,37,52,37,68,37,132, +37,196,37,212,37,7,228,37,244,37,2,160,37,1,132,37,148,37,2,96,37,112,37, +2,84,37,1,64,37,1,2,37,184,255,192,64,18,9,12,72,34,2,96,19,239,15,1,15,15, +26,17,8,3,0,18,0,63,63,51,51,57,47,93,51,237,50,1,43,95,93,93,93,93,93,93, +113,47,94,93,93,113,113,51,220,93,113,237,16,253,50,220,93,113,237,49,48, +95,93,93,93,0,93,1,93,0,93,33,17,35,34,46,2,53,17,51,17,20,30,2,59,1,17,51, +17,51,50,62,2,53,17,51,17,20,14,2,43,1,17,2,251,83,133,201,134,67,191,47, +93,139,92,56,185,56,95,140,91,45,191,68,134,201,132,83,1,171,84,142,189,104, +1,207,254,45,80,137,100,57,3,73,252,183,57,100,137,80,1,211,254,49,104,189, +142,84,254,85,0,0,0,1,0,87,0,0,5,163,5,150,0,57,0,225,64,91,101,36,1,101, +22,1,157,49,1,143,49,1,49,16,11,15,72,157,9,1,143,9,1,9,16,11,15,72,116,3, +132,3,2,54,3,1,54,2,118,2,2,54,56,118,56,2,116,55,132,55,2,54,55,1,42,26, +1,42,32,1,41,53,48,40,10,18,96,40,112,40,144,40,3,111,18,127,18,159,18,3, +40,18,40,18,24,34,91,80,53,1,53,184,255,192,64,69,27,30,72,191,53,207,53, +2,48,53,1,53,17,5,91,31,24,79,24,2,224,24,1,15,24,31,24,95,24,207,24,223, +24,5,160,24,1,111,24,159,24,2,0,24,32,24,48,24,3,8,24,95,59,1,10,15,19,39, +48,5,42,95,18,41,18,29,95,0,4,0,63,237,63,51,237,23,50,1,93,47,94,93,93,93, +113,113,114,253,196,47,93,93,43,114,237,17,57,57,47,47,93,93,17,51,17,51, +16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,1,50,30,2, +21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46,2,35,34,14,2,21,20,30, +2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,2,253,151,241,168,90,59,109, +157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116,169,108,109,170,116, +61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109,59,90,168,241,5,150, +86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51,126,143,159,85,116,181, +124,65,65,124,181,116,85,159,143,126,51,224,156,4,2,3,2,54,138,167,191,106, +147,234,162,86,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2,152,218, +0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,3,0,45, +0,0,5,41,6,178,0,8,0,12,0,16,2,114,64,20,30,7,1,12,7,1,7,24,12,15,72,17,5, +1,3,5,1,16,3,5,184,255,232,64,255,12,15,72,12,133,9,16,133,64,13,5,4,14,2, +1,8,14,7,105,8,169,8,2,6,8,22,8,54,8,70,8,4,14,8,6,1,90,38,2,86,2,150,2,3, +118,2,230,2,2,57,2,73,2,2,6,2,1,16,2,153,18,169,18,201,18,3,86,18,1,9,18, +57,18,2,25,18,89,18,137,18,249,18,4,6,18,1,202,249,18,1,230,18,1,9,18,25, +18,185,18,201,18,4,198,18,1,89,18,121,18,169,18,3,54,18,1,41,18,57,18,185, +18,233,18,4,11,18,1,153,249,18,1,198,18,214,18,2,178,18,1,164,18,1,150,18, +1,130,18,1,116,18,1,86,18,102,18,2,66,18,1,36,18,52,18,2,18,18,1,4,18,1,244, +18,1,230,18,1,196,18,212,18,2,166,18,182,18,2,146,18,1,132,18,1,118,18,1, +98,18,1,84,18,1,54,18,70,18,2,36,18,1,22,18,1,4,18,1,242,18,1,1,208,18,224, +18,2,196,18,1,160,18,176,18,2,148,18,1,112,18,1,100,18,1,64,18,1,20,18,36, +18,52,18,3,0,18,1,105,64,202,228,18,244,18,2,208,18,1,164,18,180,18,196,18, +3,128,18,144,18,2,116,18,1,80,18,96,18,2,68,18,1,32,18,1,4,18,20,18,2,244, +18,1,224,18,1,196,18,212,18,2,176,18,1,84,18,100,18,116,18,148,18,164,18, +5,48,18,64,18,2,36,18,1,0,18,1,196,18,244,18,2,144,18,1,4,18,20,18,36,18, +68,18,84,18,116,18,132,18,7,57,224,18,1,132,18,164,18,212,18,3,112,18,1,4, +18,36,18,52,18,84,18,100,18,5,228,18,244,18,2,192,18,1,180,18,1,144,18,1, +4,18,20,18,52,18,84,18,132,18,5,212,18,228,18,2,187,18,1,164,18,1,112,18, +1,2,48,18,96,18,2,15,18,47,18,2,10,14,145,9,95,13,1,13,64,9,12,72,13,0,3, +59,3,75,3,123,3,3,3,1,8,4,3,1,18,0,63,63,51,18,57,93,17,51,47,43,93,51,237, +50,1,93,93,95,93,93,93,93,113,113,113,113,113,114,114,114,114,94,93,93,93, +113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,94,93, +93,93,93,93,93,93,93,93,95,93,113,113,113,113,113,113,113,113,113,113,113, +113,113,114,114,114,114,114,114,114,114,114,114,114,114,94,93,93,113,113, +113,114,114,114,94,93,93,113,113,113,47,94,93,93,93,113,253,57,206,94,93, +93,50,43,1,24,16,77,230,50,47,26,237,220,237,49,48,43,95,94,93,93,43,93,93, +1,17,35,19,1,51,9,1,51,37,53,51,21,33,53,51,21,3,9,190,2,253,224,205,1,178, +1,176,205,253,249,163,253,211,165,2,72,253,184,2,72,3,57,253,97,2,159,121, +184,184,184,184,255,255,0,86,255,236,4,101,6,7,18,38,1,122,0,0,17,7,1,80, +1,33,0,0,0,19,64,11,2,60,17,38,2,26,60,63,8,23,37,1,43,53,0,43,53,0,0,0,255, +255,0,70,255,236,3,106,6,7,18,38,1,126,0,0,17,7,1,80,0,202,0,0,0,19,64,11, +1,58,17,38,1,73,58,61,16,6,37,1,43,53,0,43,53,0,0,0,255,255,0,106,254,88, +3,238,6,7,18,38,1,128,0,0,17,7,1,80,1,57,0,0,0,19,64,11,1,36,17,38,1,100, +36,39,17,34,37,1,43,53,0,43,53,0,0,0,255,255,0,137,0,0,1,178,6,7,18,38,1, +130,0,0,17,6,1,80,209,0,0,27,64,17,1,14,17,38,1,16,14,1,0,14,1,29,14,17,5, +13,37,1,43,93,93,53,0,43,53,0,255,255,0,133,255,236,3,254,6,65,18,38,1,142, +0,0,17,7,1,81,0,222,0,0,0,30,64,9,3,2,1,32,17,38,3,2,1,184,255,241,180,38, +44,10,0,37,1,43,53,53,53,0,43,53,53,53,0,2,0,86,255,236,4,101,4,78,0,39,0, +59,1,15,64,196,122,48,138,48,2,121,52,137,52,2,101,43,1,90,58,106,58,2,54, +14,70,14,2,29,31,45,31,2,29,38,45,38,2,47,37,1,29,37,1,75,36,107,36,2,47, +36,63,36,2,29,36,1,139,35,1,47,35,1,29,35,1,47,34,1,29,34,1,47,22,1,27,22, +1,47,21,1,27,21,1,75,20,107,20,2,47,20,1,27,20,1,45,19,1,27,19,1,121,6,137, +6,2,11,6,27,6,2,34,48,18,22,72,34,33,22,48,18,22,72,22,23,26,33,42,33,2,73, +23,1,26,23,42,23,2,33,23,159,28,175,28,191,28,3,28,64,29,33,72,28,64,0,16, +22,34,4,144,50,160,50,176,50,3,127,50,1,32,50,64,50,2,50,61,128,40,71,8,16, +61,1,0,50,28,16,4,23,33,21,23,15,55,80,11,16,45,80,5,22,0,63,237,63,237,63, +63,18,23,57,1,93,47,237,26,16,220,93,93,93,23,50,26,205,43,93,50,50,93,93, +93,17,51,43,17,51,43,49,48,0,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93, +93,93,93,93,93,93,93,93,93,93,0,93,1,93,0,93,1,93,37,14,3,35,34,2,17,16,18, +51,50,30,2,23,51,62,3,55,51,14,3,7,30,3,23,35,46,3,39,1,20,30,2,51,50,62, +2,55,46,3,35,34,14,2,3,75,26,65,87,111,70,205,193,217,209,69,112,86,63,20, +2,4,14,19,23,13,188,22,46,39,30,5,3,23,31,36,18,183,11,21,16,13,3,253,196, +28,59,93,66,54,100,82,61,14,12,45,71,102,70,66,96,64,31,237,56,94,69,38,1, +20,1,24,1,28,1,26,39,69,93,54,21,56,63,65,30,47,128,139,139,58,103,175,144, +110,39,28,66,65,58,20,1,49,112,160,103,48,52,107,160,108,86,154,115,68,46, +102,163,0,2,0,142,254,87,4,73,5,204,0,32,0,62,0,185,64,68,149,20,1,154,16, +1,123,7,139,7,2,122,60,138,60,2,106,3,122,3,138,3,3,102,31,118,31,2,74,50, +90,50,106,50,3,21,2,37,2,101,2,117,2,133,2,5,147,21,1,21,21,37,21,2,28,48, +23,72,52,48,48,64,48,2,96,48,1,48,184,255,192,64,58,20,23,72,48,52,48,52, +14,0,72,64,48,43,64,43,160,43,3,160,43,176,43,192,43,3,43,64,128,33,13,70, +0,14,16,14,48,14,3,8,14,28,48,80,49,49,38,57,80,18,0,13,27,33,38,80,9,5,22, +0,63,51,237,50,63,63,237,18,57,47,237,57,1,47,94,93,237,50,26,16,220,93,113, +26,237,18,57,57,47,47,43,93,113,16,237,17,57,49,48,93,93,93,93,93,0,93,93, +93,1,93,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35,17,52,54,51,50,30,2,21, +20,14,2,7,30,3,1,30,3,51,50,62,2,53,52,46,2,35,53,62,1,53,52,46,2,35,34,14, +2,21,4,73,53,111,173,120,102,160,56,6,3,3,180,228,226,99,152,102,53,35,61, +81,46,57,114,91,56,252,249,28,71,81,87,43,72,110,73,38,38,81,128,89,127,113, +27,57,87,60,70,104,68,34,1,149,89,154,116,66,55,39,57,92,53,254,215,5,172, +237,220,47,90,130,82,73,111,82,56,18,11,55,93,137,254,218,19,34,25,14,41, +76,106,66,65,110,81,45,142,27,139,122,44,77,57,32,35,77,122,88,0,0,0,0,1, +0,7,254,88,3,249,4,58,0,24,0,237,64,59,59,22,75,22,2,41,22,1,59,21,75,21, +2,26,21,42,21,2,9,21,1,42,12,58,12,74,12,3,25,12,1,77,13,1,13,16,13,16,72, +66,2,1,54,2,1,34,2,1,6,2,22,2,2,13,2,1,1,17,1,184,255,240,64,76,13,16,72, +24,15,7,7,13,14,16,15,14,47,14,2,57,31,14,63,14,95,14,127,14,159,14,191,14, +223,14,255,14,8,63,14,127,14,159,14,191,14,223,14,255,14,6,0,14,32,14,2,224, +14,1,191,14,1,160,14,1,95,14,159,14,2,0,14,16,14,64,14,3,8,14,1,0,184,255, +240,64,17,127,0,1,0,64,26,1,0,26,48,26,96,26,144,26,4,26,184,255,192,64,14, +21,26,72,7,15,24,3,25,20,27,13,13,0,15,0,63,50,47,63,17,23,51,1,43,93,113, +47,93,56,50,47,94,93,93,93,93,93,113,113,114,94,93,56,51,57,61,47,51,51,49, +48,43,94,93,94,93,93,93,93,43,93,93,93,93,93,93,93,93,19,51,19,30,3,23,62, +3,55,19,51,1,14,3,7,35,62,1,55,7,192,245,7,21,20,17,4,5,18,21,22,8,239,191, +254,122,17,31,27,23,7,191,17,48,24,4,58,253,93,22,63,67,63,22,21,62,67,63, +22,2,165,251,251,45,111,124,132,65,131,213,91,0,0,0,2,0,86,255,236,4,29,5, +204,0,19,0,50,0,156,64,81,115,28,131,28,2,106,28,1,118,46,134,46,2,106,46, +1,90,2,106,2,2,90,17,106,17,2,85,13,101,13,2,114,26,130,26,2,38,26,1,128, +25,1,114,25,1,51,25,67,25,2,50,50,31,71,0,64,25,46,5,47,47,41,31,0,1,144, +0,1,0,52,128,10,71,31,41,1,41,47,20,80,5,184,255,224,64,22,23,28,72,5,24, +18,22,72,111,5,1,90,5,1,5,46,48,0,15,80,36,22,0,63,237,63,57,57,93,93,43, +43,237,50,1,47,93,237,26,16,204,93,113,17,57,47,57,57,51,26,16,237,50,47, +49,48,93,93,93,93,93,93,93,93,93,93,93,93,1,52,46,2,39,14,3,21,20,30,2,51, +50,62,2,1,34,46,2,39,1,30,3,21,20,14,2,35,34,46,2,53,52,62,2,55,1,53,33,21, +3,96,49,69,76,26,73,134,102,60,35,73,111,77,81,112,69,31,254,255,13,42,45, +41,13,1,60,54,102,79,49,64,123,180,115,114,180,125,66,73,127,169,96,254,193, +2,221,1,215,85,145,115,86,27,26,81,114,146,91,76,131,96,55,54,95,131,3,191, +2,3,2,1,254,188,55,116,134,159,97,110,182,131,72,68,127,183,115,112,176,135, +97,33,1,83,119,132,0,1,0,70,255,236,3,106,4,78,0,57,0,179,64,49,140,37,1, +133,3,1,53,36,69,36,2,55,34,1,42,8,1,37,5,1,14,24,9,12,72,10,29,26,29,42, +29,3,42,70,21,48,27,48,27,48,16,35,35,6,64,37,48,72,6,184,255,192,179,14, +17,72,6,184,255,192,64,66,8,11,72,6,59,53,71,31,16,63,16,79,16,95,16,4,16, +64,37,43,72,16,128,59,1,31,59,95,59,2,21,48,80,15,47,31,47,79,47,95,47,175, +47,223,47,239,47,7,191,47,207,47,2,47,47,0,39,80,36,32,16,0,80,5,11,22,0, +63,51,237,63,51,237,18,57,47,93,113,237,57,1,93,113,47,43,93,237,16,198,43, +43,43,50,47,17,57,57,47,47,18,57,237,49,48,93,43,0,93,1,93,0,93,93,93,93, +37,50,62,2,55,23,14,3,35,34,46,2,53,52,62,2,55,53,46,3,53,52,62,2,51,50,22, +23,7,46,1,35,34,6,21,20,30,2,51,21,34,14,2,21,20,30,2,1,200,54,96,79,63,21, +105,32,84,106,130,78,96,141,92,45,42,72,96,54,51,85,61,34,50,95,136,87,118, +191,67,128,47,125,75,91,96,55,97,131,75,72,139,109,66,29,52,74,114,31,48, +56,26,100,39,71,53,32,46,84,116,69,58,95,69,42,5,2,6,40,64,86,51,62,106,77, +44,86,99,88,71,68,85,74,57,70,37,12,135,11,40,80,69,45,69,46,24,0,0,0,1,0, +86,254,159,3,96,5,204,0,56,0,209,64,117,169,38,1,156,29,172,29,2,149,55,165, +55,2,173,39,1,124,39,140,39,156,39,3,117,8,1,115,2,1,100,36,132,36,148,36, +164,36,4,139,24,155,24,171,24,3,57,24,1,44,31,156,31,172,31,3,44,30,60,30, +76,30,3,100,54,132,54,164,54,3,38,54,86,54,2,240,47,1,47,47,21,0,71,33,40, +50,50,10,31,21,79,21,2,191,21,1,21,64,29,33,72,0,21,16,21,32,21,64,21,4,7, +21,50,47,80,5,26,0,184,255,240,64,31,19,22,72,135,0,151,0,2,218,33,1,169, +33,185,33,201,33,3,136,33,152,33,2,26,33,0,3,15,48,0,15,0,47,63,18,23,57, +93,93,93,93,43,17,51,237,50,1,47,94,93,43,93,113,205,50,47,51,47,237,18,57, +47,113,49,48,93,93,93,93,0,93,93,1,93,0,93,93,1,93,93,93,0,93,1,93,1,20,30, +2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,55,53,14,3,35, +33,53,33,21,14,5,1,21,43,74,100,57,54,111,90,58,18,26,29,10,126,9,19,16,11, +36,66,94,57,42,89,82,73,54,31,49,85,113,127,135,64,12,34,36,34,11,254,167, +2,130,62,131,123,108,81,47,1,123,64,79,49,31,15,15,34,57,88,68,34,68,62,51, +17,56,12,33,38,39,19,34,45,33,25,13,10,23,36,50,74,100,67,83,176,176,175, +166,155,68,4,1,1,1,1,131,127,70,157,166,172,171,166,0,0,0,0,1,0,106,254,88, +3,238,4,78,0,35,0,100,185,0,32,255,232,64,46,9,12,72,35,70,64,80,0,1,159, +0,255,0,2,0,37,128,23,12,70,192,13,1,0,13,16,13,48,13,224,13,240,13,5,8,13, +240,37,1,255,37,1,112,37,1,37,184,255,192,64,14,19,23,72,35,27,23,6,80,29, +16,17,15,12,21,0,63,63,63,237,50,63,1,43,93,93,113,47,94,93,113,237,50,26, +16,220,93,113,26,237,49,48,43,1,17,52,46,2,35,34,14,2,21,17,35,17,52,38,39, +51,30,3,21,51,62,3,51,50,30,2,21,17,3,57,23,52,85,63,64,103,73,40,180,22, +14,170,9,14,10,5,3,26,62,82,106,70,90,130,84,39,254,88,4,86,79,106,65,27, +45,85,125,81,253,141,3,83,68,121,42,21,48,49,47,20,47,76,53,29,44,92,145, +100,251,135,0,0,0,0,3,0,106,255,236,4,9,5,203,0,15,0,26,0,37,0,194,64,108, +153,19,169,19,2,150,24,166,24,2,138,2,1,133,5,1,138,14,1,133,10,1,124,36, +140,36,2,115,29,131,29,2,85,29,101,29,2,124,18,140,18,2,74,18,90,18,106,18, +3,115,25,131,25,2,69,25,85,25,101,25,3,6,13,22,13,2,6,10,1,9,5,1,9,2,1,7, +33,0,71,64,15,21,31,21,127,21,143,21,239,21,255,21,6,21,64,45,48,72,21,39, +128,32,22,71,32,8,1,8,184,255,192,183,29,35,72,8,48,39,1,39,184,255,192,64, +19,30,35,72,223,39,1,22,80,32,32,16,27,80,11,0,16,80,3,22,0,63,237,63,237, +18,57,47,237,1,93,43,113,47,43,93,237,50,26,16,220,43,113,26,237,51,49,48, +0,94,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,1,16,2,35,34,46, +1,2,53,16,18,51,50,30,1,18,1,50,62,2,55,33,30,3,19,34,14,2,7,33,46,3,4,9, +240,228,108,171,118,62,233,232,121,175,112,54,254,42,62,100,73,42,3,253,221, +3,44,71,94,66,62,99,72,42,3,2,35,3,40,69,97,2,221,254,131,254,140,92,186, +1,27,192,1,117,1,121,93,188,254,231,252,216,52,128,216,164,164,215,129,52, +4,217,51,126,212,161,161,212,126,51,0,0,0,1,0,137,0,0,1,141,4,58,0,13,1,13, +64,210,13,8,70,207,5,223,5,2,0,5,32,5,208,5,3,9,5,5,14,15,95,15,111,15,2, +32,15,1,224,15,240,15,2,111,15,127,15,143,15,3,0,15,16,15,32,15,3,205,207, +15,223,15,239,15,3,96,15,1,127,15,207,15,2,64,15,80,15,2,175,15,223,15,239, +15,3,96,15,112,15,2,15,15,31,15,2,154,255,15,1,208,15,224,15,2,63,15,1,159, +15,175,15,2,112,15,1,223,15,1,144,15,1,63,15,79,15,2,0,15,1,106,159,15,223, +15,239,15,3,96,15,112,15,2,15,15,1,239,15,255,15,2,128,15,208,15,2,63,15, +1,96,15,1,15,15,31,15,2,55,207,15,255,15,2,144,15,160,15,176,15,3,31,15,47, +15,63,15,3,176,15,192,15,208,15,3,15,15,31,15,111,15,3,144,15,160,15,224, +15,3,31,15,63,15,2,0,15,1,7,6,15,0,21,0,63,63,1,94,93,93,93,113,113,114,114, +114,94,93,93,113,113,113,114,114,114,94,93,93,93,93,113,113,114,114,114,94, +93,93,93,113,113,114,114,94,93,93,93,113,113,17,18,57,47,94,93,113,237,50, +49,48,51,46,3,53,17,51,17,20,30,2,23,199,15,24,15,8,180,11,21,30,18,16,53, +64,70,33,3,78,252,169,32,64,60,52,19,0,0,0,1,0,138,0,0,4,3,4,58,0,11,0,158, +64,114,148,9,164,9,2,102,9,118,9,134,9,3,172,0,1,139,0,155,0,2,105,0,121, +0,2,86,10,150,10,166,10,3,151,10,167,10,2,84,10,1,70,7,134,7,2,1,10,247,8, +1,8,10,9,16,9,9,0,11,16,0,11,160,11,2,0,11,16,11,32,11,64,11,160,11,224,11, +6,7,11,7,3,70,0,4,16,4,48,4,240,4,4,8,4,128,13,192,13,224,13,3,63,13,1,2, +1,7,10,4,8,5,15,4,0,21,0,63,50,63,51,23,57,1,93,93,47,94,93,237,50,47,94, +93,113,56,51,57,47,56,57,51,113,17,51,49,48,0,93,93,93,1,93,93,93,93,93,93, +33,1,7,17,35,17,51,17,1,51,9,1,3,48,254,146,132,180,180,1,219,211,254,73, +1,206,1,238,109,254,127,4,58,253,243,2,13,254,47,253,151,0,0,0,0,1,0,14,0, +0,3,238,5,204,0,33,1,60,64,101,149,15,1,157,23,1,138,2,1,137,1,1,137,25,153, +25,2,140,21,156,21,2,115,0,131,0,147,0,3,140,20,156,20,2,106,20,122,20,2, +146,32,1,132,32,1,101,32,117,32,2,3,102,26,118,26,150,26,3,141,26,157,26, +2,2,126,26,1,108,26,1,3,84,18,1,148,31,1,101,31,117,31,133,31,3,86,31,1,146, +29,1,2,128,29,1,84,29,1,144,28,1,28,184,255,224,64,59,13,16,72,146,27,1,84, +27,100,27,116,27,3,93,0,109,0,2,149,17,1,73,17,1,150,18,1,138,18,1,101,18, +117,18,2,38,18,86,18,2,42,3,58,3,74,3,122,3,138,3,5,26,0,20,10,10,19,32,33, +184,255,240,64,69,33,20,19,16,31,19,63,19,2,31,19,63,19,95,19,127,19,159, +19,191,19,223,19,255,19,8,223,19,255,19,2,192,19,1,95,19,159,19,2,0,19,16, +19,64,19,3,8,19,0,35,48,35,96,35,160,35,176,35,5,26,0,13,33,19,21,6,80,13, +0,0,63,237,63,51,18,57,57,1,93,47,94,93,93,93,93,113,114,56,51,47,56,51,18, +57,47,18,57,57,49,48,93,93,93,93,93,93,93,0,93,1,93,93,43,93,93,93,95,93, +93,93,93,0,93,95,93,93,95,93,1,93,95,93,93,93,93,93,93,93,93,93,93,93,0,93, +1,39,46,3,35,34,6,7,39,62,1,51,50,30,2,23,1,35,3,46,3,39,14,3,7,1,35,1,207, +36,27,42,45,57,40,11,32,6,35,25,72,32,55,87,73,67,36,1,171,190,207,8,18,18, +16,5,7,22,25,24,8,254,255,187,3,197,99,73,105,67,31,7,3,130,9,15,36,81,131, +95,251,139,2,65,22,56,59,56,21,21,60,62,55,18,253,193,0,0,0,1,0,138,254,119, +4,6,4,58,0,41,0,108,64,55,13,40,14,17,72,90,8,106,8,2,35,70,5,15,34,95,34, +2,159,34,175,34,255,34,3,0,34,16,34,32,34,3,7,34,43,23,19,70,0,20,16,20,48, +20,240,20,4,8,20,96,43,128,43,2,43,184,255,192,64,15,20,23,72,41,21,34,21, +15,19,5,28,80,14,11,22,0,63,51,237,50,47,63,51,63,1,43,93,47,94,93,237,50, +16,220,94,93,93,113,50,237,49,48,0,93,1,43,33,46,3,53,35,14,3,35,34,38,39, +35,30,1,21,17,35,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,30,2,23,3,94, +1,3,3,3,4,26,56,69,86,57,82,120,32,4,3,1,182,182,25,59,98,74,67,100,67,33, +181,1,2,2,1,6,46,59,59,20,51,79,53,27,64,58,32,63,27,254,139,5,195,253,124, +69,116,85,47,52,91,126,75,2,105,252,175,34,76,67,49,7,0,0,1,0,0,0,0,3,178, +4,58,0,18,2,35,64,79,130,17,146,17,162,17,3,153,6,169,6,2,131,8,147,8,163, +8,3,3,87,8,103,8,119,8,3,6,5,9,32,14,17,72,9,9,7,15,16,16,0,70,64,91,12,107, +12,123,12,3,91,12,219,12,235,12,3,180,12,196,12,2,11,12,27,12,59,12,91,12, +107,12,5,7,12,20,128,8,7,184,255,240,64,255,7,11,20,27,20,2,11,20,27,20,75, +20,91,20,139,20,155,20,203,20,219,20,8,255,20,1,196,20,212,20,2,160,20,1, +132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4,20,20,20,2,199,224,20,1,196, +20,212,20,2,160,20,1,4,20,20,20,68,20,84,20,132,20,148,20,6,68,20,84,20,132, +20,148,20,196,20,212,20,6,27,20,1,4,20,1,219,20,1,196,20,1,155,20,1,132,20, +1,91,20,1,68,20,1,27,20,1,4,20,1,151,11,20,27,20,75,20,91,20,139,20,155,20, +203,20,219,20,8,155,20,203,20,219,20,3,132,20,1,96,20,1,68,20,84,20,2,32, +20,1,4,20,20,20,2,224,20,1,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20, +1,4,20,20,20,68,20,84,20,4,103,4,20,20,20,68,20,84,20,132,20,148,20,196,20, +212,20,8,219,20,1,196,20,1,155,20,1,132,20,1,91,20,1,68,20,1,27,20,1,4,20, +1,219,20,1,196,20,1,11,20,27,20,75,20,91,20,139,20,155,20,64,93,6,55,75,20, +91,20,139,20,155,20,203,20,219,20,6,63,20,1,32,20,1,4,20,20,20,2,224,20,1, +196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,68,20,84,20,2,32,20,1,4, +20,20,20,2,196,20,212,20,2,160,20,1,132,20,148,20,2,96,20,1,2,80,20,1,47, +20,1,0,20,16,20,2,7,15,7,15,9,6,21,0,63,51,63,51,1,94,93,93,93,95,93,93,93, +93,113,113,113,113,113,113,113,113,114,114,114,114,94,93,93,93,113,113,113, +113,113,113,113,113,114,94,93,93,93,93,93,93,113,113,113,113,113,113,114, +94,93,93,93,93,93,93,93,93,113,113,113,114,114,114,114,94,93,93,93,93,93, +93,93,93,113,114,47,56,51,26,16,220,94,93,93,113,114,26,237,50,17,51,17,57, +61,47,43,51,51,49,48,93,95,93,93,93,1,20,14,2,7,35,1,51,1,54,18,53,52,38, +39,51,30,1,3,178,63,106,140,77,170,254,122,189,1,55,142,124,29,20,177,24, +28,3,78,99,218,221,214,94,4,58,252,96,185,1,86,156,81,119,45,45,113,0,0,0, +1,0,86,254,159,3,106,5,204,0,74,1,0,64,125,122,71,138,71,2,101,33,117,33, +133,33,3,105,39,1,85,50,1,83,44,1,57,2,1,110,66,126,66,142,66,3,26,66,42, +66,2,12,29,28,29,44,29,3,13,40,9,12,72,12,73,28,73,44,73,108,73,124,73,140, +73,6,5,11,95,37,1,79,37,1,112,37,128,37,2,37,17,95,26,1,111,26,1,26,37,26, +52,63,31,70,11,32,11,1,23,11,23,11,0,31,63,63,63,79,63,111,63,127,63,143, +63,175,63,191,63,207,63,9,159,63,175,63,255,63,3,63,184,255,192,64,17,7,11, +72,63,42,71,31,0,1,0,5,37,80,31,11,24,42,184,255,240,64,32,19,22,72,151,42, +1,0,16,19,22,72,152,0,1,52,0,42,3,57,32,36,1,36,36,24,57,26,17,23,80,24,0, +0,63,237,50,50,47,18,57,47,93,18,23,57,93,43,93,43,18,57,57,237,57,1,47,93, +237,47,43,93,113,18,57,57,47,47,93,16,237,16,205,50,50,47,93,114,51,47,93, +113,114,18,57,49,48,93,43,93,0,93,93,1,93,0,93,93,93,1,93,0,93,19,52,62,2, +55,53,46,3,53,52,62,2,55,53,14,3,43,1,53,33,21,14,3,21,20,30,2,23,21,14,3, +21,20,30,2,23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,86,51,110,175, +125,68,118,87,51,50,79,97,47,12,68,80,76,18,74,2,122,77,144,112,68,60,99, +130,69,100,175,131,76,43,74,100,57,54,114,94,61,18,26,29,10,126,9,19,16,11, +39,70,97,57,42,89,82,73,54,31,1,98,76,147,124,90,19,2,5,39,68,96,62,64,93, +64,40,10,8,1,2,3,2,131,125,9,34,59,90,67,63,81,49,24,6,131,13,54,89,127,84, +64,79,49,31,15,15,34,57,88,68,34,68,62,51,17,56,12,33,38,39,19,34,45,33,25, +13,10,23,36,50,74,100,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0, +79,255,236,5,43,4,58,0,48,0,115,64,35,53,12,117,12,133,12,3,3,40,7,17,72, +3,40,7,17,72,46,80,32,96,32,2,46,32,35,70,64,111,5,1,80,5,1,5,184,255,192, +64,38,8,11,72,5,50,128,15,50,47,50,2,13,7,72,79,25,95,25,111,25,207,25,4, +25,14,20,34,7,20,80,31,15,14,21,40,80,0,22,0,63,237,63,63,237,50,50,1,47, +50,50,93,237,50,93,26,16,220,43,93,113,26,237,50,50,93,47,49,48,43,0,43,1, +93,5,34,46,2,53,17,33,21,20,14,2,7,35,62,3,61,1,34,14,2,7,53,62,3,51,33,21, +35,17,20,30,2,51,50,62,2,55,21,14,1,4,102,59,82,52,24,254,110,16,27,36,19, +188,19,39,32,20,39,79,69,53,12,12,43,51,54,23,4,37,234,13,24,35,22,7,23,25, +23,8,31,69,20,28,59,94,66,2,212,72,131,251,228,195,74,76,197,226,247,125, +80,7,10,13,7,139,6,11,8,4,131,253,83,44,56,32,13,2,2,3,1,129,8,12,0,2,0,132, +254,87,4,59,4,79,0,26,0,47,0,129,64,64,122,25,1,101,20,117,20,2,106,19,122, +19,2,106,45,122,45,2,75,8,91,8,107,8,3,125,30,1,107,30,1,74,30,90,30,2,0, +71,64,160,27,1,27,49,128,38,15,70,223,16,1,0,16,16,16,48,16,3,8,16,48,49, +1,49,184,255,192,64,21,30,35,72,223,49,1,96,49,128,49,2,32,80,22,16,15,27, +43,80,5,22,0,63,237,63,63,237,1,93,93,43,113,47,94,93,113,237,50,26,16,220, +93,26,237,49,48,93,93,93,0,93,1,93,93,0,93,1,93,1,20,14,2,35,34,46,2,39,35, +30,1,21,17,35,17,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,17,30,3,51,50, +62,2,4,59,63,115,161,98,62,98,80,66,28,4,2,2,180,60,116,169,110,103,181,134, +78,193,44,83,116,72,69,100,64,30,28,72,80,87,44,67,100,67,33,2,4,118,197, +142,79,20,37,53,33,30,61,32,254,87,3,238,119,193,136,74,79,150,219,131,104, +166,115,61,53,101,146,93,254,195,35,55,37,20,58,107,152,0,0,1,0,86,254,159, +3,156,4,78,0,57,0,209,64,38,137,55,1,139,54,1,143,53,1,123,53,1,106,50,1, +96,2,1,52,15,68,15,84,15,3,82,10,98,10,130,10,3,51,10,67,10,2,3,184,255,224, +64,52,12,17,72,3,24,11,14,72,26,31,106,31,122,31,138,31,4,139,30,1,10,37, +26,37,2,7,71,31,40,1,40,52,17,79,28,1,143,28,159,28,223,28,3,28,64,24,27, +72,96,28,1,28,184,255,192,183,7,12,72,28,48,59,1,59,184,255,192,64,19,30, +35,72,223,59,1,12,33,40,16,19,22,72,136,40,152,40,2,7,184,255,240,64,19,19, +22,72,135,7,151,7,2,33,7,40,3,22,53,0,80,47,16,22,0,47,63,237,51,18,23,57, +93,43,93,43,17,51,1,93,43,113,47,43,93,43,93,113,205,50,47,93,237,49,48,93, +93,0,93,43,1,43,0,93,93,93,1,93,0,93,1,93,93,0,93,93,1,34,14,4,21,20,30,2, +23,30,3,21,20,14,2,7,39,62,3,53,52,46,2,39,46,5,53,52,62,4,51,50,30,2,23, +7,46,3,2,70,54,88,67,49,32,15,32,76,124,92,53,114,95,61,18,26,29,10,126,9, +19,16,11,35,68,97,63,66,113,94,72,50,26,20,46,75,110,148,97,68,99,73,54,22, +116,18,42,49,57,3,193,49,80,104,108,106,42,68,96,72,57,30,17,37,59,89,68, +34,68,62,51,17,56,12,33,38,39,19,30,44,36,31,17,18,40,51,68,93,122,81,47, +130,140,136,108,66,21,34,44,23,119,19,36,28,17,0,2,0,86,255,236,4,209,4,58, +0,28,0,47,0,132,64,94,133,12,1,122,13,138,13,2,131,46,1,101,46,117,46,2,100, +42,116,42,132,42,3,124,33,140,33,2,90,33,106,33,2,143,38,1,108,38,124,38, +2,74,38,90,38,2,15,17,31,17,111,17,127,17,4,7,17,0,71,64,15,29,143,29,191, +29,3,0,29,32,29,64,29,3,29,49,128,40,71,31,10,143,10,2,10,23,35,80,15,15, +43,80,5,22,0,63,237,63,237,50,1,47,93,237,26,16,220,93,113,26,237,196,94, +93,49,48,0,93,93,93,1,93,93,93,0,93,93,93,1,93,1,20,14,2,35,34,46,2,53,52, +62,2,51,33,21,35,34,46,2,39,21,30,3,7,52,46,2,39,35,34,14,2,21,20,22,51,50, +62,2,4,48,61,123,183,123,123,186,124,63,86,153,213,126,2,57,165,9,35,43,44, +17,28,55,43,26,189,20,34,45,25,89,83,143,107,61,151,147,78,117,76,38,1,235, +112,188,135,76,74,139,202,129,144,210,138,66,131,1,2,2,1,4,42,99,115,131, +78,74,132,116,99,42,50,105,160,110,207,206,52,97,139,0,1,0,29,255,236,3,24, +4,58,0,35,0,99,64,50,35,13,131,13,2,31,32,12,17,72,13,31,29,31,45,31,3,26, +13,26,127,5,143,5,2,5,15,70,0,34,32,34,2,34,34,36,37,79,37,1,208,37,1,159, +37,1,16,37,1,37,184,255,192,64,12,14,17,72,20,80,29,22,14,35,80,11,15,0,63, +237,50,63,237,1,43,93,93,93,113,17,18,57,47,93,253,204,93,51,51,47,49,48, +0,93,43,1,93,1,34,14,2,7,53,62,3,51,33,21,33,17,20,30,2,51,50,62,2,55,21, +14,1,35,34,46,2,53,17,1,25,39,79,69,53,12,12,43,51,54,23,2,68,254,208,13, +24,35,22,7,23,25,23,8,31,69,43,59,82,52,24,3,183,7,10,13,7,139,6,11,8,4,131, +253,83,44,56,32,13,2,2,3,1,129,8,12,28,59,94,66,2,212,0,0,0,1,0,133,255,236, +3,254,4,58,0,31,0,113,64,62,134,3,1,133,15,149,15,2,106,18,122,18,2,86,28, +1,25,8,41,8,2,27,0,71,64,15,21,1,47,21,159,21,2,160,21,1,21,33,128,13,70, +0,10,16,10,48,10,240,10,4,8,10,240,33,1,255,33,1,112,33,1,33,184,255,192, +64,13,20,23,72,31,33,1,26,11,15,16,80,5,22,0,63,237,63,51,1,93,43,93,93,113, +47,94,93,237,26,16,220,93,113,114,26,237,50,49,48,93,93,93,93,93,1,20,14, +2,35,34,46,2,53,17,51,17,20,22,51,50,62,2,53,52,46,2,39,51,30,3,3,254,53, +113,176,123,109,160,104,51,181,117,134,73,104,65,30,20,33,40,21,188,18,40, +32,21,2,59,137,218,154,82,50,107,166,116,2,151,253,99,146,148,50,108,170, +120,68,147,139,120,41,40,113,134,149,0,2,0,85,254,87,4,218,4,82,0,35,0,45, +0,130,64,21,101,34,1,101,33,117,33,133,33,3,74,21,90,21,2,69,21,85,21,2,45, +184,255,192,179,11,14,72,25,184,255,224,64,54,11,14,72,11,29,27,29,2,64,19, +80,19,2,19,19,24,71,13,7,36,71,224,0,1,0,43,6,72,27,0,7,64,7,2,7,64,47,1, +19,80,18,18,39,80,31,16,43,27,80,5,8,22,6,27,0,63,63,51,237,50,63,237,51, +47,237,1,113,47,93,51,253,50,220,113,237,16,220,237,50,47,93,49,48,93,0,43, +43,1,93,0,93,1,93,93,1,20,14,2,7,17,35,17,46,3,53,52,62,2,55,23,14,3,21,20, +22,23,17,52,54,51,50,30,2,7,52,38,35,34,6,21,17,62,1,4,218,74,132,184,110, +170,114,181,125,67,49,103,159,109,21,69,96,60,27,147,151,154,158,84,133,92, +49,189,87,80,68,76,162,149,2,53,151,215,140,71,6,254,105,1,151,5,72,138,207, +141,102,188,150,103,18,136,15,77,114,143,80,213,201,8,2,68,193,212,76,141, +199,121,193,211,129,140,253,185,7,218,0,0,0,1,0,21,254,88,4,27,4,80,0,27, +1,26,64,51,169,25,1,153,3,1,138,6,154,6,2,174,23,1,123,23,139,23,155,23,3, +84,21,1,173,27,1,140,27,156,27,2,123,27,1,90,27,106,27,2,41,27,57,27,2,26, +16,9,17,72,2,184,255,240,64,99,9,17,72,162,1,1,131,1,147,1,2,116,1,1,69,1, +85,1,101,1,3,38,1,54,1,2,166,25,1,153,25,1,39,25,55,25,71,25,3,3,101,19,117, +19,2,86,19,1,39,19,55,19,2,25,22,0,3,4,2,26,23,24,24,27,26,16,27,26,59,26, +91,26,123,26,155,26,187,26,219,26,7,219,26,251,26,2,4,26,20,26,68,26,3,7, +26,13,13,1,2,184,255,240,183,2,36,29,1,11,29,1,22,184,255,208,64,41,14,17, +72,70,22,1,53,22,1,139,0,1,125,0,1,2,75,0,91,0,107,0,3,63,0,1,0,25,3,22,4, +1,23,15,9,80,16,16,27,1,27,0,63,51,63,237,63,18,23,57,93,93,95,93,93,93,93, +43,1,93,93,47,56,51,51,47,47,94,93,93,113,56,51,51,47,51,17,18,23,57,49,48, +93,93,93,95,93,93,93,93,93,93,93,93,43,43,93,93,93,93,93,93,93,93,93,93,0, +93,37,1,35,1,3,46,3,35,34,6,7,39,62,1,51,50,30,2,23,19,1,51,9,1,35,2,30,254, +179,188,1,184,170,27,44,40,42,25,11,32,7,34,24,62,32,48,70,60,59,36,142,1, +8,187,254,144,1,150,190,239,253,105,3,57,1,87,54,82,55,28,7,3,131,9,11,27, +62,102,75,254,217,2,27,253,71,252,215,0,0,1,0,135,254,87,5,44,5,60,0,31,0, +128,64,90,121,18,1,18,16,7,10,72,121,19,137,19,153,19,3,121,11,1,11,16,7, +10,72,121,10,137,10,153,10,3,24,70,21,15,5,70,8,0,14,72,29,0,15,16,15,160, +15,208,15,4,8,15,128,33,176,33,224,33,3,111,33,1,32,33,1,255,33,1,80,33,128, +33,144,33,192,33,4,30,30,6,22,15,0,29,80,13,16,22,14,27,0,63,63,51,237,50, +63,51,51,47,1,93,93,113,113,113,47,94,93,51,253,50,220,237,16,220,237,49, +48,0,93,43,93,93,43,93,37,62,3,53,17,51,17,20,14,2,7,17,35,17,46,3,53,17, +51,17,20,30,2,23,17,51,3,46,87,124,80,37,182,59,124,193,134,170,134,192,124, +59,181,38,79,124,87,170,119,1,31,73,121,91,2,134,253,124,122,172,110,53,1, +254,107,1,149,1,53,110,172,122,2,132,253,122,90,121,73,32,1,4,197,0,0,0,0, +1,0,83,255,236,5,235,4,79,0,63,0,176,64,83,153,33,169,33,2,153,26,169,26, +2,119,16,1,122,58,138,58,2,10,37,26,37,42,37,154,37,170,37,5,10,22,26,22, +42,22,154,22,170,22,5,29,0,73,61,61,40,8,46,13,46,13,51,19,71,64,128,8,176, +8,2,15,8,1,7,8,65,128,51,71,63,40,1,40,0,65,1,48,65,1,240,65,1,65,184,255, +192,64,32,30,35,72,175,65,223,65,2,0,65,32,65,64,65,3,30,35,62,62,14,3,56, +80,24,35,22,46,13,80,45,14,16,0,63,51,237,50,63,51,237,50,17,57,47,18,57, +1,93,93,43,93,113,114,47,93,237,26,16,220,94,93,93,26,237,18,57,57,47,47, +17,18,57,47,237,57,49,48,0,93,93,1,93,93,0,93,93,1,20,22,51,50,62,2,53,52, +46,2,39,55,30,3,21,20,14,2,35,34,46,2,39,35,14,3,35,34,46,2,53,52,62,2,55, +23,14,3,21,20,30,2,51,50,62,2,61,1,51,3,115,114,102,65,87,53,22,29,61,97, +67,23,109,159,103,49,53,101,148,95,68,104,77,52,16,4,16,52,77,105,67,95,148, +101,53,49,103,159,109,23,68,96,62,28,22,52,86,65,51,82,57,30,166,1,193,157, +173,56,102,145,90,82,150,121,84,15,139,18,112,161,194,101,128,200,137,72, +36,68,99,64,64,99,68,36,72,137,200,128,101,194,161,112,18,139,15,84,121,150, +82,90,145,102,56,45,84,123,78,252,0,0,0,255,255,255,205,0,0,1,250,5,123,18, +38,1,130,0,0,17,6,0,105,160,0,0,25,182,2,1,14,17,38,2,1,184,255,217,180,18, +16,5,13,37,1,43,53,53,0,43,53,53,0,0,0,255,255,0,133,255,236,3,254,5,123, +18,38,1,142,0,0,17,7,0,105,0,242,0,0,0,25,182,2,1,32,17,38,2,1,184,255,244, +180,36,34,10,0,37,1,43,53,53,0,43,53,53,0,255,255,0,86,255,236,4,29,6,7,18, +38,0,82,0,0,17,7,1,80,1,41,0,0,0,19,64,11,2,35,17,38,2,70,35,38,8,0,37,1, +43,53,0,43,53,0,0,0,255,255,0,133,255,236,3,254,6,7,18,38,1,142,0,0,17,7, +1,80,0,252,0,0,0,19,64,11,1,32,17,38,1,17,32,35,10,0,37,1,43,53,0,43,53,0, +0,0,255,255,0,83,255,236,5,235,6,7,18,38,1,146,0,0,17,7,1,80,1,255,0,0,0, +19,64,11,1,64,17,38,1,55,64,67,40,19,37,1,43,53,0,43,53,0,0,0,255,255,0,168, +0,0,4,254,6,178,16,38,0,40,0,0,17,7,2,152,1,121,0,0,0,153,185,0,21,255,192, +179,233,233,72,21,184,255,192,179,230,230,72,21,184,255,192,179,227,227,72, +21,184,255,192,179,224,224,72,21,184,255,192,179,221,221,72,21,184,255,192, +179,218,218,72,21,184,255,192,179,215,215,72,21,184,255,192,179,212,212,72, +21,184,255,192,179,209,209,72,21,184,255,192,179,206,206,72,21,184,255,192, +179,203,203,72,21,184,255,192,179,200,200,72,21,184,255,192,179,197,197,72, +21,184,255,192,64,10,11,11,72,2,1,12,5,38,2,1,184,255,234,180,16,14,0,10, +37,1,43,53,53,0,43,53,53,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0, +1,0,46,255,236,6,79,5,129,0,45,0,133,64,13,155,31,171,31,2,101,37,117,37, +133,37,3,2,184,255,224,64,71,13,17,72,18,16,12,15,72,42,13,58,13,2,36,7,52, +7,2,20,20,10,42,1,39,90,45,175,40,1,0,40,1,40,10,90,0,29,16,29,176,29,224, +29,4,7,29,0,42,95,43,38,33,95,1,6,6,40,43,3,40,18,26,95,15,63,21,1,21,21, +15,19,0,63,51,47,93,16,237,63,63,18,57,47,51,237,50,16,237,50,1,47,94,93, +237,47,93,93,204,253,50,204,18,57,47,49,48,0,93,93,43,43,93,93,1,17,62,3, +51,50,22,29,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,61,1,52,38,35,34,14, +2,7,17,35,17,33,53,33,21,2,208,33,109,127,130,53,226,217,41,86,133,92,53, +88,75,64,29,111,18,41,48,56,33,84,80,129,144,51,123,120,105,33,190,254,28, +4,134,4,229,254,160,7,20,19,13,187,188,214,93,145,100,53,17,32,46,28,123, +16,33,26,17,101,111,219,119,122,10,15,17,8,253,12,4,229,156,156,0,255,255, +0,168,0,1,4,47,6,240,16,38,1,93,0,0,17,7,2,149,1,113,0,0,0,19,64,11,1,6,5, +38,1,33,6,9,4,0,37,1,43,53,0,43,53,0,0,0,0,1,0,104,255,236,5,121,5,150,0, +42,0,218,64,156,156,17,172,17,2,156,15,172,15,2,156,39,172,39,2,138,39,1, +156,41,172,41,2,138,41,1,137,31,1,117,11,1,117,10,165,10,2,166,26,1,73,26, +137,26,2,70,32,134,32,2,37,10,53,10,2,42,3,58,3,2,3,68,44,1,7,7,19,5,8,91, +116,29,132,29,2,203,29,219,29,2,68,29,1,43,29,1,29,37,235,19,1,100,19,116, +19,164,19,212,19,4,64,19,1,2,0,19,48,19,2,7,19,8,95,127,5,175,5,2,5,5,13, +34,79,38,1,38,38,0,95,34,4,13,95,24,16,18,32,18,2,48,18,64,18,112,18,128, +18,192,18,208,18,6,18,18,24,19,0,63,51,47,93,113,16,237,63,237,51,47,93,17, +18,57,47,113,237,1,47,94,93,95,93,93,113,51,47,93,93,93,113,237,50,17,57, +47,93,49,48,0,95,93,93,93,93,93,1,93,0,93,1,93,93,93,93,93,93,93,1,34,14, +2,7,33,21,33,30,3,51,50,62,2,55,23,14,3,35,34,36,38,2,53,52,18,54,36,51,50, +4,23,7,46,3,3,24,111,173,124,73,10,2,142,253,114,9,77,128,176,109,90,141, +108,79,27,156,40,108,148,191,123,171,254,255,173,86,91,175,1,0,164,225,1, +46,71,181,20,68,102,137,4,250,68,126,178,110,154,112,185,132,72,50,82,105, +55,77,79,136,100,57,109,195,1,12,159,165,1,10,187,101,176,173,60,50,91,70, +42,0,0,255,255,0,93,255,236,4,248,5,150,18,6,0,54,0,0,255,255,0,189,0,0,1, +124,5,129,18,6,0,44,0,0,255,255,0,7,0,0,2,52,6,178,18,38,0,44,0,0,17,6,2, +152,218,0,0,23,64,13,2,1,4,5,38,2,1,1,8,6,0,2,37,1,43,53,53,0,43,53,53,0, +255,255,0,32,255,236,3,104,5,129,18,6,0,45,0,0,0,2,0,18,255,240,8,11,5,129, +0,38,0,47,0,215,64,98,57,29,1,166,8,1,167,11,1,162,10,1,133,10,149,10,2,58, +10,1,154,15,170,15,2,141,13,157,13,173,13,3,121,13,1,116,47,132,47,148,47, +3,123,40,139,40,155,40,3,101,11,1,141,14,157,14,173,14,3,14,32,10,14,72,43, +30,123,30,139,30,155,30,4,42,31,122,31,2,0,90,48,39,1,0,39,16,39,2,7,39,20, +13,36,13,52,13,3,13,184,255,248,64,14,22,25,72,73,8,1,20,8,36,8,52,8,3,8, +184,255,248,64,39,22,25,72,9,31,73,31,2,8,13,31,3,175,20,191,20,2,20,33,44, +90,6,43,95,33,33,6,8,95,31,3,23,95,16,19,44,95,6,18,0,63,237,63,237,63,237, +18,57,47,237,1,47,237,50,47,93,23,51,113,43,113,113,43,113,47,94,93,113,237, +49,48,93,93,0,43,93,1,93,0,93,93,93,93,93,1,93,93,93,93,93,93,1,20,14,2,35, +33,17,33,3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,33,50,30,2, +7,52,38,35,33,17,33,50,54,8,11,61,121,182,121,253,183,254,96,49,22,43,49, +60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,3,2,1,126,125,186, +124,62,192,164,164,254,153,1,111,164,156,1,157,87,150,112,64,4,225,254,144, +172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161,1,254,253,172, +58,105,147,92,121,129,254,2,136,0,0,0,2,0,168,0,0,7,171,5,129,0,22,0,31,0, +110,64,25,116,31,132,31,148,31,3,123,24,139,24,155,24,3,38,20,54,20,2,0,90, +176,23,1,23,184,255,192,64,43,7,11,72,23,13,9,90,0,10,16,10,64,10,3,7,10, +17,28,90,14,0,6,1,8,6,27,95,17,17,8,95,13,13,10,15,11,3,10,18,28,95,6,18, +0,63,237,63,63,51,18,57,47,237,51,47,237,1,47,94,93,51,237,50,47,94,93,237, +50,47,43,93,237,49,48,0,93,93,93,1,20,14,2,35,33,17,33,17,35,17,51,17,33, +17,51,17,33,50,30,2,7,52,38,35,33,17,33,50,54,7,171,61,121,182,121,253,223, +253,194,191,191,2,62,191,1,86,125,186,124,62,192,164,164,254,193,1,71,164, +156,1,157,87,150,112,64,2,141,253,115,5,129,253,172,2,84,253,172,58,105,147, +92,121,129,254,2,136,0,0,0,0,1,0,46,0,0,6,47,5,129,0,27,0,131,64,13,155,2, +171,2,2,101,8,117,8,133,8,3,19,184,255,224,64,76,13,17,72,37,24,53,24,69, +24,3,18,13,10,90,16,175,11,1,0,11,48,11,2,11,27,90,0,0,48,0,192,0,208,0,4, +7,0,176,29,192,29,208,29,3,176,29,240,29,2,255,29,1,16,29,112,29,160,29,176, +29,4,9,4,95,18,23,23,0,17,13,95,14,3,11,0,18,0,63,50,63,237,50,18,57,47,51, +237,50,1,93,93,113,114,47,94,93,237,47,93,93,204,253,204,51,49,48,0,93,43, +93,93,33,17,52,38,35,34,14,2,7,17,35,17,33,53,33,21,33,17,62,3,51,50,22,21, +17,5,113,128,133,53,116,110,98,35,190,254,28,4,179,253,239,36,98,112,118, +56,229,214,2,63,122,109,10,15,18,7,253,12,4,229,156,156,254,160,8,20,18,13, +187,178,253,173,0,0,0,255,255,0,168,0,0,4,157,6,240,18,38,1,176,0,0,17,7, +2,149,1,172,0,0,0,19,64,11,1,23,5,38,1,37,23,26,0,13,37,1,43,53,0,43,53,0, +0,0,255,255,0,55,255,236,5,31,7,58,18,38,1,185,0,0,17,7,2,145,1,94,1,74,0, +19,64,11,1,26,5,38,1,7,31,39,21,25,37,1,43,53,0,43,53,0,0,0,0,1,0,168,254, +104,5,24,5,129,0,11,0,94,64,64,11,92,0,0,2,9,90,127,6,1,0,6,48,6,64,6,3,143, +6,159,6,207,6,3,0,6,64,6,2,6,5,90,0,2,16,2,64,2,3,7,2,16,13,1,32,13,128,13, +224,13,3,15,13,1,7,7,3,3,10,5,95,2,18,0,0,47,63,237,51,63,51,47,1,93,93,113, +47,94,93,237,47,93,93,113,113,237,18,57,47,237,49,48,1,17,33,17,51,17,33, +17,51,17,33,17,2,134,254,34,191,2,247,186,254,34,254,104,1,152,5,129,251, +31,4,225,250,127,254,104,255,255,0,4,0,0,5,82,5,129,18,6,0,36,0,0,0,2,0,168, +0,0,4,214,5,129,0,16,0,25,0,142,64,70,116,25,132,25,148,25,3,123,18,139,18, +155,18,3,153,14,1,38,14,1,9,9,0,90,223,17,1,80,17,128,17,2,31,17,1,255,17, +1,192,17,1,159,17,1,0,17,16,17,32,17,64,17,4,17,11,22,90,0,6,16,6,64,6,3, +7,6,48,27,1,27,184,255,192,64,27,30,35,72,223,27,1,21,95,64,11,1,160,11,208, +11,2,11,11,6,10,95,7,3,22,95,6,18,0,63,237,63,237,18,57,47,93,113,237,1,93, +43,113,47,94,93,237,50,47,93,93,93,93,113,113,113,237,50,47,49,48,0,93,93, +93,93,1,20,14,2,35,33,17,33,21,33,17,33,50,30,2,7,52,38,35,33,17,33,50,54, +4,214,61,121,182,121,253,183,3,158,253,33,1,126,125,186,124,62,192,164,164, +254,153,1,111,164,156,1,157,87,150,112,64,5,129,156,254,72,58,105,147,92, +121,129,254,2,136,0,0,0,255,255,0,168,0,0,4,234,5,129,18,6,0,37,0,0,255,255, +0,168,0,1,4,47,5,130,16,6,1,93,0,0,0,2,0,15,254,104,5,69,5,129,0,16,0,25, +0,194,64,95,150,10,1,150,20,1,150,15,1,144,19,1,134,19,1,115,22,131,22,2, +3,147,24,1,2,128,24,1,114,24,1,102,24,1,85,11,101,11,2,90,14,106,14,2,97, +23,145,23,2,83,23,1,53,23,69,23,2,2,92,3,3,0,90,191,17,207,17,2,160,17,1, +31,17,95,17,127,17,143,17,159,17,5,0,17,1,8,17,20,25,36,25,52,25,3,25,184, +255,248,64,11,22,25,72,20,19,36,19,52,19,3,19,184,255,248,64,28,22,25,72, +9,15,19,25,4,6,92,7,15,27,47,27,2,19,95,15,3,8,0,25,95,5,18,7,2,0,47,51,63, +237,50,50,63,237,1,93,47,237,23,51,43,113,43,113,47,94,93,93,93,93,237,50, +47,237,49,48,93,93,93,93,93,93,93,93,95,93,95,93,93,93,93,93,93,37,51,17, +35,17,33,17,35,17,51,62,3,55,19,33,3,17,33,3,14,3,7,4,150,175,180,252,50, +180,144,41,66,55,44,18,67,2,212,186,254,137,49,18,40,46,54,32,160,253,200, +1,152,254,104,2,56,51,138,181,228,141,1,254,251,31,4,65,254,144,134,221,178, +137,51,255,255,0,168,0,0,4,254,5,129,18,6,0,40,0,0,0,1,0,28,0,0,7,71,5,129, +0,41,1,72,64,41,133,8,1,117,31,133,31,2,117,14,1,99,24,1,108,25,124,25,140, +25,3,108,26,124,26,140,26,3,101,13,117,13,133,13,3,33,40,14,17,72,6,184,255, +216,64,35,14,17,72,58,24,74,24,2,41,24,1,53,15,69,15,117,15,3,3,39,15,1,27, +48,14,17,72,40,27,56,27,72,27,3,12,184,255,208,64,11,14,17,72,39,12,55,12, +71,12,3,31,184,255,224,179,14,17,72,31,184,255,240,64,73,10,13,72,8,32,14, +17,72,8,16,10,13,72,34,31,27,31,28,28,32,21,40,90,41,5,8,12,8,41,11,11,7, +18,52,41,1,116,41,196,41,228,41,3,41,33,32,16,32,64,29,32,72,228,32,1,155, +32,171,32,2,68,32,116,32,2,11,32,43,32,2,32,6,7,184,255,240,64,51,171,7,187, +7,2,7,68,43,116,43,132,43,228,43,4,47,43,1,2,15,43,1,31,8,34,5,8,5,39,0,96, +21,127,18,175,18,2,47,18,1,18,18,6,27,19,11,3,41,33,6,18,0,63,51,51,63,51, +51,18,57,47,93,113,51,237,50,57,57,17,51,17,51,1,93,95,93,93,47,93,56,51, +47,93,93,93,93,43,56,51,47,93,113,51,18,57,47,18,57,51,17,51,16,237,50,17, +57,47,57,51,17,51,49,48,43,43,43,43,93,43,93,43,93,95,93,93,93,43,43,93,93, +93,0,93,1,93,0,93,93,1,34,46,2,39,1,35,1,38,39,1,51,19,30,3,51,17,51,17,50, +62,2,55,19,51,1,6,7,1,35,1,14,3,35,17,35,3,82,17,45,48,46,17,254,85,222,1, +253,48,131,254,229,200,205,66,90,76,81,57,191,57,81,76,90,66,205,200,254, +229,131,48,1,253,222,254,85,17,46,48,45,17,191,2,133,6,11,13,8,253,85,3,7, +35,189,1,154,254,207,99,123,68,24,2,107,253,149,24,68,123,99,1,49,254,102, +189,35,252,249,2,171,8,13,11,6,253,123,0,1,0,67,255,236,4,112,5,149,0,60, +1,7,64,51,138,33,1,134,7,1,124,28,140,28,2,3,112,21,1,112,20,1,2,96,20,1, +101,8,117,8,133,8,3,132,34,1,101,34,117,34,2,124,13,1,90,13,106,13,2,59,23, +75,23,2,33,184,255,232,64,122,11,16,72,5,43,1,3,51,20,25,90,46,64,25,37,72, +46,46,56,90,16,139,36,155,36,171,36,3,127,20,1,2,95,20,111,20,2,36,20,36, +20,5,112,16,1,79,16,111,16,2,255,16,1,160,16,1,127,16,1,0,16,16,16,48,16, +3,16,175,5,191,5,2,5,64,32,45,72,5,64,13,16,72,5,51,20,95,127,21,175,21,2, +21,21,11,41,35,64,13,16,72,35,35,30,95,41,4,11,95,0,32,6,48,6,112,6,128,6, +4,208,6,1,6,184,255,192,182,13,17,72,6,6,0,19,0,63,50,47,43,93,113,16,237, +63,237,51,47,43,17,18,57,47,113,237,57,1,47,43,43,93,47,93,93,93,93,113,113, +18,57,57,47,47,93,95,93,113,16,237,50,47,43,237,18,57,49,48,0,95,93,1,43, +93,93,93,93,93,93,93,95,93,93,95,93,93,0,93,5,34,46,2,39,55,30,3,51,50,62, +2,53,52,38,43,1,53,51,50,54,53,52,46,2,35,34,14,2,7,39,62,3,51,50,30,2,21, +20,14,2,7,30,3,21,20,14,2,2,109,118,176,130,94,36,165,24,66,91,121,80,77, +122,85,45,192,202,71,71,181,173,39,72,104,65,77,114,83,56,19,178,33,96,132, +168,105,108,172,120,64,40,73,104,63,67,117,87,51,69,132,192,20,50,91,128, +79,77,55,98,75,44,37,69,100,64,133,118,148,119,123,55,86,59,30,40,68,90,49, +61,82,127,87,45,53,96,136,83,68,107,80,55,15,10,50,82,115,73,95,156,113,62, +0,1,0,168,0,0,5,24,5,129,0,19,0,123,64,17,172,18,1,138,18,154,18,2,147,8, +163,8,2,133,8,1,19,184,255,232,64,65,9,17,72,9,24,9,17,72,11,92,41,9,1,9, +64,12,80,12,144,12,3,224,12,1,143,12,159,12,175,12,3,0,12,48,12,2,12,166, +19,1,19,2,92,0,1,16,1,2,7,1,15,21,47,21,2,9,18,9,1,3,12,12,8,0,18,0,63,50, +50,47,63,51,51,47,1,93,47,94,93,237,50,113,47,93,93,93,113,51,113,237,49, +48,43,43,0,93,93,93,93,51,17,51,17,20,6,7,6,7,1,51,17,35,17,52,54,55,54,55, +1,168,172,2,2,2,2,2,238,222,170,1,2,1,2,253,26,5,129,252,100,51,98,39,46, +40,4,174,250,127,3,168,39,89,38,44,44,251,90,0,255,255,0,168,0,0,5,24,7,58, +18,38,1,174,0,0,17,7,2,145,1,146,1,74,0,19,64,11,1,20,5,38,1,6,25,33,0,10, +37,1,43,53,0,43,53,0,0,0,0,1,0,168,0,0,4,157,5,129,0,22,0,151,64,104,84,12, +116,12,132,12,3,84,15,1,139,8,1,122,8,1,89,8,105,8,2,140,14,1,14,24,13,16, +72,58,5,1,100,12,116,12,132,12,3,80,12,1,53,12,69,12,2,15,12,8,12,9,16,32, +9,96,9,128,9,3,9,9,13,2,21,90,32,22,1,22,14,13,16,15,13,127,13,207,13,239, +13,4,47,13,1,13,47,24,1,15,12,20,96,47,2,1,2,2,22,13,18,8,0,3,0,63,50,63, +51,57,47,93,237,50,57,1,93,47,93,113,56,51,47,93,237,50,17,57,47,93,56,57, +51,17,51,49,48,93,93,93,93,43,93,93,93,93,93,0,93,19,51,17,50,62,2,55,19, +51,1,6,7,1,35,1,14,3,35,17,35,168,191,57,81,76,90,66,205,200,254,229,131, +48,1,253,222,254,85,17,46,48,45,17,191,5,129,253,149,24,68,123,99,1,49,254, +102,189,35,252,249,2,171,8,13,11,6,253,123,0,0,0,0,1,0,18,255,240,4,153,5, +129,0,27,0,176,64,35,150,1,1,147,3,1,117,3,133,3,2,85,4,149,4,2,145,7,1,115, +7,131,7,2,85,7,101,7,2,129,6,145,6,2,6,184,255,216,64,46,12,15,72,37,6,53, +6,2,26,2,1,26,23,106,23,122,23,138,23,4,26,90,32,27,64,27,2,224,27,1,95,27, +1,0,27,1,8,27,20,6,36,6,52,6,3,6,184,255,248,64,14,22,25,72,73,1,1,20,1,36, +1,52,1,3,1,184,255,248,64,26,22,25,72,9,24,73,24,2,1,6,24,3,12,128,29,1,27, +18,1,95,24,3,16,95,9,19,0,63,237,63,237,63,1,93,47,23,51,113,43,113,113,43, +113,47,94,93,93,93,113,237,49,48,93,93,93,43,93,93,93,93,93,93,93,93,1,33, +3,6,2,14,3,35,34,38,39,53,30,1,51,50,62,4,55,19,33,17,35,3,223,254,94,49, +22,43,49,60,78,102,66,25,47,14,11,35,10,30,52,45,42,39,40,21,67,2,255,186, +4,225,254,144,172,254,245,199,137,85,37,5,5,152,4,3,23,62,107,169,238,161, +1,254,250,127,255,255,0,168,0,0,6,2,5,129,18,6,0,48,0,0,255,255,0,168,0,0, +5,32,5,129,18,6,0,43,0,0,255,255,0,97,255,236,5,215,5,150,18,6,0,50,0,0,255, +255,0,166,0,0,5,30,5,129,17,6,1,106,254,0,0,88,185,0,9,255,192,179,27,27, +72,9,184,255,192,179,21,21,72,9,184,255,192,179,20,20,72,9,184,255,192,179, +19,19,72,9,184,255,192,179,17,17,72,9,184,255,192,179,16,16,72,9,184,255, +192,179,15,15,72,9,184,255,192,179,14,14,72,9,184,255,192,183,11,11,72,9, +64,9,9,72,43,43,43,43,43,43,43,43,43,43,0,0,255,255,0,168,0,0,4,234,5,129, +18,6,0,51,0,0,255,255,0,104,255,236,5,121,5,150,18,6,0,38,0,0,255,255,0,46, +0,0,4,180,5,129,18,6,0,55,0,0,0,1,0,55,255,236,5,31,5,129,0,25,0,181,64,111, +217,24,1,139,24,1,90,24,106,24,122,24,3,41,24,1,85,23,101,23,133,23,3,70, +23,1,214,22,1,131,22,1,100,22,116,22,2,86,22,1,121,18,1,128,2,1,5,2,21,2, +2,132,1,1,131,0,1,84,0,100,0,2,70,0,1,198,23,214,23,2,113,23,129,23,2,86, +23,102,23,2,143,3,1,58,3,74,3,2,20,23,24,32,25,144,25,2,25,16,25,22,10,63, +21,79,21,111,21,127,21,4,21,184,255,240,64,14,21,23,20,21,5,24,24,21,3,11, +14,95,5,19,0,63,237,50,63,51,47,17,18,57,57,1,47,56,93,50,50,47,56,93,51, +57,57,49,48,0,93,93,93,93,93,1,93,93,93,93,93,93,93,93,93,93,93,93,93,93, +93,93,93,1,14,3,35,34,46,2,39,55,30,1,51,50,62,2,63,1,1,51,9,1,51,2,222,47, +81,90,109,75,32,66,64,58,23,81,35,83,48,37,58,53,57,38,49,253,195,218,1,193, +1,128,205,1,62,88,128,82,40,10,18,26,16,144,22,37,21,52,90,68,89,3,186,252, +240,3,16,0,0,3,0,118,255,245,5,159,5,139,0,29,0,40,0,51,0,143,64,92,70,28, +86,28,102,28,3,73,17,89,17,105,17,3,59,51,1,59,31,1,53,43,1,38,43,1,53,39, +1,38,39,1,41,90,15,8,30,90,0,35,24,7,90,46,21,224,8,1,79,8,1,32,8,1,8,32, +53,1,112,53,208,53,224,53,3,79,53,1,16,53,1,36,47,96,10,6,10,34,49,96,20, +24,20,10,20,10,20,7,22,3,7,18,0,63,63,18,57,57,47,47,17,51,16,237,50,17,51, +16,237,50,1,93,93,93,113,47,93,93,93,51,51,253,50,50,220,237,16,220,237,49, +48,0,93,93,93,93,93,93,1,93,93,1,20,14,2,43,1,21,35,53,35,34,46,2,53,52,62, +2,59,1,53,51,21,51,50,30,2,7,52,38,43,1,17,51,50,62,2,37,20,30,2,59,1,17, +35,34,6,5,159,64,131,197,133,40,191,40,133,197,131,64,67,133,201,135,29,191, +28,135,202,133,67,192,185,183,5,13,92,136,89,43,252,87,43,89,136,92,13,9, +182,182,2,224,105,188,143,84,227,227,84,143,188,105,113,185,131,72,182,182, +72,131,185,117,187,180,253,22,53,98,140,88,88,140,98,53,2,234,180,0,255,255, +0,46,0,0,5,43,5,129,18,6,0,59,0,0,0,1,0,168,254,104,5,197,5,129,0,11,0,74, +64,47,1,92,2,2,11,90,0,8,1,175,8,1,0,8,64,8,112,8,3,8,7,90,0,4,16,4,64,4, +3,7,4,32,13,224,13,2,9,9,5,3,11,11,7,95,4,18,2,0,47,63,237,50,47,63,51,47, +1,93,47,94,93,237,47,93,93,113,237,50,47,237,49,48,37,17,35,17,33,17,51,17, +33,17,51,17,5,197,180,251,151,191,2,245,186,160,253,200,1,152,5,129,251,31, +4,225,251,31,0,0,0,1,0,160,0,0,4,174,5,129,0,25,0,134,64,70,164,14,1,20,40, +13,17,72,1,32,13,17,72,42,7,58,7,74,7,3,23,90,25,144,22,1,143,22,1,48,22, +64,22,2,207,22,1,112,22,1,111,22,1,16,22,64,22,2,22,12,90,207,11,1,0,11,16, +11,64,11,3,7,11,32,27,1,32,27,1,27,184,255,192,64,19,14,17,72,0,5,95,21,47, +16,1,16,16,11,24,18,22,22,11,3,0,63,51,47,63,18,57,47,93,51,237,50,1,43,93, +113,47,94,93,93,237,47,93,93,93,93,113,113,113,51,237,49,48,0,93,43,43,93, +1,14,3,35,34,46,2,53,17,51,17,20,22,51,50,62,2,55,17,51,17,35,3,240,36,94, +107,115,56,114,166,108,52,190,130,134,53,110,104,92,35,190,190,1,252,8,20, +18,12,47,92,137,89,2,82,253,194,123,108,10,15,17,7,2,244,250,127,0,0,1,0, +168,0,0,6,173,5,129,0,11,0,114,64,76,7,90,4,4,0,11,90,36,8,1,11,8,1,228,8, +1,219,8,1,148,8,1,123,8,1,4,8,20,8,100,8,3,8,3,90,4,0,68,0,228,0,3,7,0,235, +13,1,196,13,1,187,13,1,132,13,1,112,13,1,2,64,13,1,15,13,1,9,5,1,3,7,7,3, +95,0,18,0,63,237,50,47,63,51,51,1,93,93,95,93,93,93,93,93,47,94,93,237,47, +93,93,93,93,93,113,113,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33, +17,51,17,168,191,1,233,186,1,233,186,5,129,251,31,4,225,251,31,4,225,250, +127,0,1,0,168,254,104,7,47,5,129,0,15,0,125,64,84,132,17,148,17,180,17,3, +123,17,1,84,17,1,1,92,2,2,15,90,12,11,90,8,8,4,11,12,59,12,75,12,91,12,123, +12,139,12,155,12,203,12,8,219,12,251,12,2,207,12,1,2,159,12,1,128,12,1,111, +12,1,0,12,1,8,12,7,90,32,4,1,4,13,9,5,3,15,15,11,11,7,95,4,18,2,0,47,63,237, +50,47,50,47,63,51,51,1,47,93,237,47,94,93,93,93,93,95,93,93,113,18,57,47, +237,16,237,50,47,237,93,93,93,49,48,37,17,35,17,33,17,51,17,33,17,51,17,33, +17,51,17,7,47,180,250,45,191,1,211,186,1,210,186,160,253,200,1,152,5,129, +251,31,4,225,251,31,4,225,251,31,0,2,0,46,0,0,5,235,5,129,0,16,0,25,0,100, +64,68,116,25,132,25,148,25,3,123,18,139,18,155,18,3,153,3,1,38,3,1,64,27, +1,6,90,47,17,127,17,2,176,17,1,159,17,1,0,17,16,17,32,17,64,17,4,7,17,14, +0,22,90,32,12,1,12,21,95,0,0,12,14,95,15,3,22,95,12,18,0,63,237,63,237,18, +57,47,237,1,47,93,253,50,204,47,94,93,93,93,113,237,93,49,48,0,93,93,93,93, +1,33,50,30,2,21,20,14,2,35,33,17,33,53,33,1,52,38,35,33,17,33,50,54,2,184, +1,66,125,186,124,62,61,121,182,121,253,243,254,53,2,138,2,115,164,164,254, +213,1,51,164,156,3,45,58,105,147,90,87,150,112,64,4,229,156,252,26,121,129, +254,2,136,0,3,0,168,0,0,6,109,5,129,0,14,0,23,0,27,0,140,64,76,116,23,132, +23,148,23,3,123,16,139,16,155,16,3,153,12,1,38,12,1,27,90,159,24,207,24,223, +24,3,16,24,64,24,80,24,112,24,4,24,0,90,0,15,1,224,15,1,159,15,1,0,15,16, +15,32,15,64,15,4,15,9,20,90,0,6,16,6,64,6,3,7,6,128,29,1,29,184,255,192,64, +19,11,14,72,19,95,9,9,6,7,25,25,7,3,24,24,20,95,6,18,0,63,237,51,47,63,51, +47,17,18,57,47,237,1,43,93,47,94,93,237,50,47,93,93,93,113,237,47,93,93,237, +49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50,30,2,7,52,38,35,33,17, +33,50,54,1,17,51,17,4,214,61,121,182,121,253,183,191,1,126,125,186,124,62, +192,164,164,254,153,1,111,164,156,1,152,191,1,157,87,150,112,64,5,129,253, +172,58,105,147,92,121,129,254,2,136,254,225,5,129,250,127,0,2,0,168,0,0,4, +214,5,129,0,14,0,23,0,107,64,76,116,23,132,23,148,23,3,123,16,139,16,155, +16,3,153,12,1,38,12,1,0,90,31,15,1,160,15,176,15,2,159,15,1,0,15,16,15,32, +15,64,15,96,15,5,15,9,20,90,0,6,16,6,2,7,6,175,25,1,64,25,128,25,144,25,3, +19,95,9,9,6,7,3,20,95,6,18,0,63,237,63,18,57,47,237,1,93,93,47,94,93,237, +50,47,93,93,93,113,237,49,48,0,93,93,93,93,1,20,14,2,35,33,17,51,17,33,50, +30,2,7,52,38,35,33,17,33,50,54,4,214,61,121,182,121,253,183,191,1,126,125, +186,124,62,192,164,164,254,153,1,111,165,155,1,157,87,150,112,64,5,129,253, +172,58,105,147,96,121,131,254,4,131,0,1,0,105,255,236,5,121,5,150,0,42,0, +206,64,81,115,26,131,26,2,115,28,131,28,2,101,28,1,115,4,131,4,2,101,4,1, +115,2,131,2,2,101,2,1,101,12,1,101,11,1,135,17,1,106,17,1,90,33,138,33,2, +10,32,26,32,90,32,3,10,40,26,40,2,36,36,24,38,14,91,32,35,112,35,2,144,35, +176,35,2,127,35,1,64,35,1,35,184,255,192,64,63,7,10,72,35,6,80,24,96,24,2, +175,24,191,24,2,32,24,1,24,35,95,127,38,175,38,2,38,38,9,30,95,19,16,25,32, +25,2,48,25,64,25,112,25,128,25,192,25,208,25,6,25,25,19,19,79,5,1,5,5,0,95, +9,4,0,63,237,51,47,93,63,51,47,93,113,16,237,17,57,47,113,237,1,47,93,93, +113,51,47,43,93,93,93,113,237,51,18,57,47,49,48,0,93,1,93,93,0,93,93,93,1, +93,93,93,93,93,93,93,93,1,34,14,2,7,39,54,36,51,50,4,22,18,21,20,2,6,4,35, +34,46,2,39,55,30,3,51,50,62,2,55,33,53,33,46,3,2,201,88,137,102,69,19,181, +71,1,46,225,164,1,0,175,91,86,172,254,255,171,118,189,149,113,41,156,27,81, +109,140,87,109,176,128,77,9,253,114,2,142,10,73,124,173,4,250,42,70,91,50, +60,173,176,101,187,254,246,165,159,254,244,195,109,54,99,136,83,78,55,105, +83,50,72,132,185,112,154,110,178,126,68,0,0,2,0,168,255,236,7,179,5,150,0, +26,0,46,0,168,64,63,165,7,1,133,24,1,138,20,1,121,29,1,118,35,1,118,39,1, +74,19,138,19,2,58,30,122,30,2,53,34,117,34,2,42,44,58,44,122,44,3,37,40,53, +40,117,40,3,160,48,1,0,91,144,27,160,27,2,160,27,176,27,2,27,184,255,192, +64,54,7,11,72,27,16,12,90,0,13,16,13,64,13,3,7,13,37,91,17,48,10,112,10,2, +10,32,95,22,4,11,95,80,16,1,176,16,224,16,2,15,16,1,8,16,16,13,14,3,13,18, +42,95,5,19,0,63,237,63,63,18,57,47,94,93,93,113,237,63,237,1,47,93,51,237, +47,94,93,237,50,47,43,93,113,237,93,49,48,93,93,93,93,93,93,93,93,93,93,93, +1,20,2,14,1,35,34,46,2,39,33,17,35,17,51,17,33,62,3,51,50,30,1,18,7,52,46, +2,35,34,14,2,21,20,30,2,51,50,62,2,7,179,90,170,245,155,156,239,165,90,7, +254,217,191,191,1,42,13,99,166,232,146,159,245,167,87,195,60,117,173,113, +116,175,117,58,60,117,173,114,121,176,114,54,2,199,165,254,242,192,104,99, +179,247,148,253,115,5,129,253,172,142,229,160,86,102,188,254,246,163,127, +208,148,80,80,148,208,127,127,211,153,85,86,153,212,0,2,0,96,0,0,5,32,5,129, +0,17,0,30,0,239,64,22,156,29,172,29,2,138,29,1,147,20,1,117,20,133,20,2,67, +17,83,17,2,17,184,255,216,64,25,33,36,72,130,17,146,17,162,17,3,100,17,116, +17,2,86,17,1,67,16,83,16,2,3,16,184,255,216,64,117,33,36,72,172,16,1,155, +16,1,125,16,141,16,2,2,94,16,110,16,2,73,16,1,44,16,60,16,2,3,175,1,1,2,1, +104,14,16,72,94,1,110,1,2,73,1,1,44,1,60,1,2,16,1,1,6,24,24,14,18,90,6,6, +0,13,90,224,14,1,143,14,159,14,175,14,207,14,4,0,14,64,14,2,7,14,17,32,0, +1,15,0,31,0,2,0,1,15,95,47,24,95,24,111,24,143,24,4,24,24,0,26,95,11,3,14, +14,0,18,0,63,50,47,63,237,18,57,47,93,237,50,1,47,93,93,51,47,94,93,93,93, +237,18,57,47,237,17,51,17,18,57,17,51,49,48,93,93,93,43,95,93,95,93,93,93, +95,93,93,93,43,95,113,93,93,93,43,113,0,93,93,93,93,51,1,46,3,53,52,62,2, +51,33,17,35,17,33,1,19,20,30,2,51,33,17,33,34,14,2,96,1,144,91,130,84,39, +66,126,185,120,2,151,191,254,73,254,146,28,37,77,119,83,1,205,254,59,76,120, +84,44,2,95,16,78,108,130,67,94,150,104,55,250,127,2,73,253,183,3,236,57,98, +72,41,2,8,31,63,94,255,255,0,87,255,236,4,115,4,78,18,6,0,68,0,0,0,2,0,120, +255,236,4,63,5,222,0,19,0,56,0,158,64,69,137,44,1,122,45,138,45,2,102,21, +118,21,134,21,3,84,18,1,84,12,1,91,2,1,90,35,122,35,138,35,3,90,47,106,47, +138,47,3,123,46,139,46,2,73,46,105,46,2,42,42,23,71,64,208,0,1,144,0,1,0, +58,128,48,58,1,128,58,1,58,184,255,192,64,12,30,35,72,52,10,71,0,31,32,31, +2,31,184,255,192,64,23,26,35,72,31,52,5,80,20,20,42,48,41,1,64,41,240,41, +2,41,15,80,26,22,0,63,237,47,93,113,51,57,47,237,50,1,47,43,93,237,57,43, +93,113,26,16,220,93,113,26,237,50,47,49,48,0,93,93,93,93,93,93,93,93,93,93, +1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,3,50,18,17,16,2,35,34,46,2,53, +52,18,62,1,55,62,3,55,21,14,1,7,14,5,7,62,3,3,130,39,73,104,65,69,114,81, +44,44,77,105,62,69,112,78,42,243,222,210,250,238,113,178,123,65,58,128,206, +147,57,100,91,86,43,86,161,91,78,124,94,67,44,23,2,19,67,97,126,1,246,114, +151,91,37,39,92,150,112,114,150,89,36,36,88,151,2,127,254,251,254,250,254, +247,254,253,70,156,250,180,192,1,22,193,115,28,11,17,14,12,6,161,11,23,17, +14,33,50,73,108,149,101,55,97,72,41,0,0,0,0,3,0,142,0,0,3,231,4,58,0,23,0, +36,0,47,0,149,64,12,42,19,1,37,2,1,26,18,42,18,2,3,184,255,232,64,33,9,12, +72,139,10,155,10,2,10,38,44,71,5,5,24,16,71,64,47,30,159,30,2,160,30,1,30, +49,128,64,49,1,49,184,255,192,64,50,30,35,72,31,49,63,49,239,49,3,38,24,70, +192,22,1,0,22,16,22,48,22,224,22,240,22,5,8,22,10,36,81,143,38,159,38,175, +38,3,38,38,24,37,80,23,15,24,80,22,21,0,63,237,63,237,18,57,47,113,237,57, +1,47,94,93,113,237,50,93,43,113,26,16,220,93,113,26,237,17,57,47,237,18,57, +93,49,48,0,43,93,93,93,1,50,30,2,21,20,14,2,7,21,30,3,21,20,14,2,35,33,17, +19,51,50,62,2,53,52,46,2,43,1,25,1,51,50,62,2,53,52,38,35,2,52,76,144,112, +68,35,60,82,46,54,95,69,40,61,109,151,91,254,67,180,236,69,95,59,27,28,63, +100,71,224,216,68,91,55,23,102,121,4,58,24,62,104,81,53,81,58,37,9,7,7,35, +61,90,61,78,117,78,39,4,58,252,75,20,44,67,47,50,70,44,20,1,194,254,192,19, +39,61,43,82,76,0,1,0,142,0,0,2,175,4,58,0,5,0,54,64,35,0,64,18,39,72,48,0, +1,0,0,7,3,70,192,4,1,0,4,16,4,48,4,224,4,240,4,5,8,4,2,80,5,15,3,21,0,63, +63,237,1,47,94,93,113,237,17,51,47,93,43,49,48,1,21,33,17,35,17,2,175,254, +147,180,4,58,131,252,73,4,58,0,0,0,2,0,20,254,104,4,136,4,58,0,7,0,23,0,159, +64,65,134,3,1,32,3,1,102,1,1,34,5,114,5,130,5,3,34,20,1,34,17,1,137,18,1, +34,18,1,25,19,121,19,2,102,2,118,2,2,34,2,1,25,2,1,34,16,1,4,16,1,98,4,1, +4,4,36,4,68,4,84,4,4,8,73,9,184,255,192,64,42,18,25,72,9,9,22,70,64,111,7, +127,7,143,7,3,32,7,64,7,2,7,25,128,20,15,12,73,6,1,13,1,80,20,15,22,6,14, +80,11,21,13,8,0,47,51,63,237,50,50,63,237,1,47,51,51,237,51,51,26,16,220, +93,93,26,237,50,47,43,237,49,48,93,93,93,93,93,93,93,93,93,93,93,93,93,93, +93,93,1,33,6,2,14,1,7,33,1,35,17,33,17,35,17,51,62,2,18,55,33,17,51,3,66, +254,206,24,49,48,48,22,1,241,1,70,163,252,210,163,119,30,58,58,57,28,2,132, +146,3,183,177,254,249,194,136,50,253,229,1,152,254,104,2,27,50,143,220,1, +59,223,252,73,255,255,0,87,255,236,4,24,4,78,18,6,0,72,0,0,0,1,0,7,0,0,5, +83,4,58,0,39,1,97,64,88,165,23,1,165,14,1,171,34,1,164,3,1,172,24,1,154,24, +1,163,13,1,149,13,1,90,6,106,6,122,6,3,85,31,101,31,117,31,3,74,33,154,33, +170,33,3,69,4,149,4,165,4,3,42,28,58,28,2,37,9,53,9,2,34,31,170,26,1,26,31, +27,16,27,27,32,20,38,70,39,165,11,1,11,10,3,6,6,39,10,184,255,240,64,49,10, +10,17,39,39,5,33,32,16,15,32,1,255,32,1,160,32,1,159,32,1,80,32,1,63,32,1, +32,32,1,207,32,1,128,32,144,32,2,95,32,1,32,32,48,32,2,32,4,5,184,255,240, +64,64,31,5,47,5,2,127,5,159,5,2,63,5,159,5,223,5,255,5,4,5,15,41,1,255,41, +1,160,41,1,111,41,159,41,2,80,41,1,63,41,1,32,41,1,207,41,1,128,41,144,41, +2,79,41,95,41,2,48,41,1,31,6,34,3,6,184,255,240,64,37,11,17,72,6,3,37,0,80, +20,15,17,31,17,79,17,95,17,4,15,17,31,17,79,17,3,7,17,17,4,26,18,10,15,39, +33,4,21,0,63,51,51,63,51,51,18,57,47,94,93,113,51,237,50,57,57,43,17,51,17, +51,1,93,93,93,93,113,113,113,113,113,113,114,47,93,113,114,56,51,47,93,93, +93,93,113,113,113,113,113,113,114,56,51,18,57,47,51,57,47,56,18,57,17,51, +17,51,93,16,237,50,17,57,47,56,57,51,93,17,51,49,48,93,93,93,93,93,93,93, +93,93,93,93,93,0,93,93,1,34,38,39,1,35,1,46,1,39,3,51,23,30,3,51,17,51,17, +50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,2,83,26,65,19,254,234,200,1, +97,17,66,45,216,188,148,48,65,52,48,30,180,30,48,52,65,48,148,188,216,45, +66,17,1,97,200,254,234,19,65,26,180,1,221,12,8,254,15,2,80,14,85,66,1,69, +239,77,92,50,16,1,218,254,38,16,50,92,77,239,254,187,66,85,14,253,176,1,241, +8,12,254,35,0,0,0,1,0,49,255,236,3,94,4,78,0,55,0,175,64,28,5,53,21,53,2, +5,38,21,38,37,38,3,131,45,1,45,15,21,70,40,40,51,71,10,29,73,64,30,184,255, +192,64,86,30,36,72,143,15,1,30,15,30,15,3,144,10,1,144,10,160,10,2,31,10, +1,10,57,128,16,57,1,4,73,3,64,12,20,72,3,45,15,80,143,16,159,16,175,16,3, +16,16,35,7,0,29,1,144,29,224,29,240,29,3,29,29,24,80,35,16,7,80,0,96,4,112, +4,128,4,3,239,4,1,32,4,1,4,4,0,22,0,63,50,47,93,93,113,16,237,63,237,51,47, +93,113,17,18,57,47,113,237,57,1,47,43,237,93,26,16,204,93,93,113,17,57,57, +47,47,93,43,26,237,16,237,50,47,237,18,57,113,49,48,93,93,5,34,38,39,55,30, +1,51,50,54,53,52,46,2,35,53,50,62,2,53,52,38,35,34,14,2,7,39,62,3,51,50,30, +2,21,20,14,2,7,21,30,3,21,20,14,2,1,202,167,197,45,159,25,126,103,96,113, +55,92,120,64,64,114,86,49,99,93,35,70,60,42,7,162,12,62,97,128,78,85,138, +98,53,44,71,88,45,56,100,75,43,49,101,152,20,125,129,44,78,86,94,91,59,78, +45,18,137,15,38,67,52,74,86,14,33,55,42,20,68,98,63,29,42,76,104,63,57,88, +61,36,4,2,6,41,67,93,58,69,119,87,49,0,0,0,0,1,0,142,0,0,3,234,4,58,0,19, +0,186,64,25,9,17,1,233,17,249,17,2,4,15,1,228,15,244,15,2,11,5,1,235,5,251, +5,2,16,184,255,192,64,107,29,60,72,153,16,1,6,64,29,60,72,119,6,151,6,2,6, +7,1,230,7,246,7,2,156,7,1,105,7,137,7,2,31,17,47,17,79,17,3,9,72,64,7,64, +10,1,80,10,1,159,10,255,10,2,10,21,128,0,21,192,21,208,21,224,21,4,192,21, +1,128,21,144,21,176,21,192,21,208,21,5,17,1,72,192,18,1,0,18,16,18,48,18, +224,18,240,18,5,8,18,16,7,19,15,10,6,18,21,0,63,51,51,63,51,51,1,47,94,93, +113,237,50,93,113,114,26,16,220,93,113,114,50,26,237,49,48,0,93,1,93,93,113, +114,0,93,43,93,43,113,114,113,114,1,113,114,1,17,20,14,2,7,1,51,17,35,17, +52,62,2,55,1,35,17,1,60,3,3,3,1,1,243,197,172,2,3,3,2,254,6,192,4,58,253, +176,23,77,82,74,21,3,101,251,198,2,148,19,57,60,57,20,252,151,4,58,0,255, +255,0,142,0,0,3,234,5,240,18,38,1,206,0,0,17,7,2,145,0,234,0,0,0,19,64,11, +1,20,17,38,1,2,25,33,18,8,37,1,43,53,0,43,53,0,0,0,0,1,0,138,0,0,3,138,4, +58,0,21,0,202,64,17,117,16,133,16,149,16,3,57,15,121,15,137,15,153,15,4,13, +184,255,208,64,123,12,17,72,133,11,149,11,2,120,5,1,133,13,149,13,2,47,23, +79,23,2,73,16,1,56,16,1,16,13,121,8,137,8,153,8,3,8,71,13,1,54,13,1,13,9, +16,9,9,14,2,20,70,0,21,16,21,48,21,240,21,4,21,57,15,73,15,2,15,32,14,1,32, +14,144,14,2,144,14,1,79,14,1,48,14,1,47,14,1,16,14,1,14,16,14,13,19,80,15, +2,63,2,79,2,3,15,2,63,2,255,2,3,8,2,2,14,21,21,14,21,8,8,0,15,0,63,50,47, +63,51,47,17,57,47,94,93,113,237,50,1,47,56,93,93,93,93,93,113,114,51,113, +47,93,237,50,17,57,47,56,57,113,113,51,93,17,51,113,113,93,49,48,0,93,1,93, +93,43,93,93,19,51,17,50,62,2,63,1,51,3,14,1,7,1,35,1,14,1,35,17,35,138,180, +30,48,52,65,48,148,188,216,45,66,17,1,97,200,254,234,19,65,26,180,4,58,254, +38,16,50,92,77,239,254,187,66,85,14,253,176,1,241,8,12,254,35,0,0,0,0,1,0, +11,255,236,4,29,4,58,0,25,0,186,64,42,26,21,1,130,7,1,116,7,1,85,7,101,7, +2,130,6,1,117,6,1,22,6,38,6,102,6,3,114,5,130,5,2,100,5,1,86,5,1,134,4,1, +4,184,255,240,64,61,12,15,72,26,3,1,116,2,1,7,24,12,17,72,25,70,64,127,0, +143,0,239,0,3,0,27,128,176,27,192,27,208,27,3,176,27,240,27,2,64,27,96,27, +112,27,160,27,176,27,192,27,6,131,23,1,23,54,6,1,6,2,184,255,240,64,26,24, +28,72,215,2,231,2,2,128,2,1,2,143,12,1,12,2,80,23,15,16,80,9,22,0,21,0,63, +63,237,63,237,1,47,93,51,93,93,43,51,113,51,93,93,113,114,26,16,220,93,26, +237,49,48,0,43,1,93,93,43,93,93,93,93,93,93,93,93,93,93,93,33,17,33,6,2,14, +3,35,34,38,39,53,30,1,51,50,62,3,18,55,33,17,3,104,254,137,25,42,44,51,71, +94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2,206,3,183,184,254,225,216, +149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,251,198,0,0,1,0,142,0,0,4,243, +4,58,0,28,1,3,64,21,137,18,153,18,2,134,12,150,12,2,107,17,123,17,2,100,13, +116,13,2,1,184,255,224,64,122,29,60,72,138,1,154,1,2,57,1,1,0,32,29,60,72, +133,0,149,0,2,54,0,86,0,2,143,19,159,19,2,93,19,109,19,125,19,3,59,19,75, +19,2,25,19,41,19,2,128,11,144,11,2,82,11,98,11,114,11,3,52,11,68,11,2,22, +11,38,11,2,1,0,15,15,8,21,72,64,19,80,22,1,159,22,255,22,2,22,30,128,144, +30,192,30,208,30,3,79,30,1,11,8,72,192,9,1,0,9,16,9,48,9,224,9,240,9,5,8, +9,28,2,2,184,255,192,64,22,29,60,72,2,32,19,22,72,84,2,1,19,2,10,15,22,15, +64,29,60,72,15,184,255,224,64,18,19,22,72,47,15,63,15,79,15,127,15,143,15, +5,15,1,9,21,0,63,51,51,93,43,43,51,63,51,51,93,43,43,17,51,1,47,94,93,113, +237,50,93,93,26,16,220,93,113,50,26,237,18,57,61,47,51,51,49,48,93,93,93, +93,93,93,93,93,93,93,43,93,93,43,93,93,93,93,33,35,1,30,3,21,17,35,17,33, +19,30,1,23,62,1,55,19,33,17,35,17,52,62,2,55,3,19,153,254,188,1,3,1,1,174, +1,24,220,23,37,8,10,35,23,220,1,13,173,1,3,2,2,3,183,26,60,61,57,23,253,44, +4,58,253,107,63,151,72,72,151,63,2,149,251,198,2,212,22,60,64,60,23,0,1,0, +142,0,0,3,221,4,58,0,11,0,139,64,48,5,70,64,2,15,6,79,6,2,57,47,6,111,6,143, +6,255,6,4,191,6,1,143,6,159,6,255,6,3,6,13,128,0,13,192,13,208,13,224,13, +4,192,13,1,128,13,1,13,184,255,192,64,49,19,23,72,1,9,70,192,10,1,0,10,16, +10,48,10,224,10,240,10,5,10,8,80,176,1,192,1,2,159,1,175,1,191,1,3,15,1,63, +1,2,8,1,1,10,5,21,3,0,15,0,63,50,63,51,57,47,94,93,113,114,237,1,47,93,113, +237,50,43,93,113,114,26,16,220,93,113,114,94,93,50,26,237,49,48,1,17,33,17, +51,17,35,17,33,17,35,17,1,66,1,231,180,180,254,25,180,4,58,254,54,1,202,251, +198,1,237,254,19,4,58,255,255,0,86,255,236,4,29,4,78,18,6,0,82,0,0,0,1,0, +142,0,0,3,199,4,58,0,7,0,109,64,80,1,70,64,15,2,79,2,2,57,47,2,111,2,143, +2,255,2,4,191,2,1,143,2,159,2,255,2,3,2,9,128,0,9,192,9,208,9,224,9,4,192, +9,1,128,9,176,9,192,9,208,9,4,47,9,1,5,70,192,6,1,0,6,16,6,48,6,224,6,240, +6,5,8,6,4,80,7,15,6,1,21,0,63,51,63,237,1,47,94,93,113,237,93,93,113,114, +26,16,220,93,113,114,94,93,26,237,49,48,1,17,35,17,33,17,35,17,3,199,180, +254,47,180,4,58,251,198,3,183,252,73,4,58,0,255,255,0,132,254,87,4,29,4,77, +18,6,0,83,0,0,255,255,0,87,255,236,3,202,4,78,18,6,0,70,0,0,0,1,0,35,0,0, +3,135,4,58,0,7,0,72,64,43,7,14,4,2,5,14,223,2,1,2,4,70,0,5,16,5,2,8,5,5,8, +9,160,9,1,95,9,1,48,9,64,9,2,47,9,1,4,21,3,7,80,0,15,0,63,237,50,63,1,93, +93,93,93,17,18,57,47,94,93,237,204,93,43,1,24,16,77,228,49,48,19,33,21,33, +17,35,17,33,35,3,100,254,168,180,254,168,4,58,131,252,73,3,183,0,0,0,255, +255,0,5,254,87,3,252,4,58,18,6,0,92,0,0,0,3,0,86,254,87,6,62,5,204,0,53,0, +74,0,95,0,229,64,13,141,93,157,93,173,93,3,78,24,14,17,72,72,184,255,232, +179,14,17,72,57,184,255,232,182,14,17,72,109,82,1,51,184,255,224,64,75,7, +10,72,15,26,31,26,47,26,3,24,32,7,10,72,0,3,16,3,32,3,3,7,4,54,71,64,25,14, +13,0,14,14,75,71,36,0,68,0,148,0,164,0,4,0,85,39,13,72,65,38,4,14,1,4,14, +36,14,68,14,100,14,132,14,180,14,228,14,7,7,14,52,97,1,97,184,255,192,64, +52,30,35,72,219,97,1,84,97,100,97,132,97,148,97,4,64,97,1,2,32,97,48,97,2, +31,97,1,0,97,1,38,0,31,45,80,3,70,80,49,28,16,8,18,91,3,59,80,5,22,22,13, +27,0,63,63,51,237,23,50,63,51,237,23,50,63,1,93,93,93,95,93,93,93,43,113, +47,94,93,113,51,51,237,50,50,220,93,237,43,1,24,16,77,244,26,237,49,48,95, +94,93,43,93,0,43,93,1,43,43,43,93,1,20,14,2,35,34,38,39,35,30,1,21,17,35, +17,52,54,55,35,14,1,35,34,2,17,16,18,51,50,22,23,51,52,46,2,53,17,51,17,20, +14,2,21,51,62,1,51,50,30,2,5,20,30,2,51,50,62,2,55,53,52,46,2,35,34,14,2, +5,52,46,2,35,34,14,2,29,1,30,3,51,50,62,2,6,62,38,86,140,101,105,158,42,6, +2,3,170,2,3,5,46,149,111,186,179,185,180,112,149,45,5,2,2,1,170,1,1,1,5,46, +144,114,101,140,86,38,250,213,26,56,85,60,60,94,65,34,2,34,64,94,61,57,86, +57,29,4,110,23,52,88,64,53,92,70,40,1,35,65,92,60,65,88,53,23,2,34,123,208, +150,85,88,100,35,77,58,254,89,1,167,54,82,40,104,90,1,19,1,25,1,28,1,26,90, +98,10,41,46,42,12,1,163,254,92,11,43,47,43,12,104,89,80,145,205,129,112,160, +103,48,43,98,157,113,24,115,159,98,43,46,102,163,116,100,156,108,56,34,96, +169,135,23,108,150,93,41,58,110,159,0,0,0,255,255,0,23,0,0,3,234,4,58,18, +6,0,91,0,0,0,1,0,142,254,104,4,102,4,58,0,11,0,91,178,7,73,8,184,255,192, +64,54,18,21,72,8,8,5,70,64,223,2,1,207,2,223,2,2,2,64,25,28,72,0,2,48,2,2, +2,13,128,111,13,1,1,70,0,10,16,10,48,10,240,10,4,8,10,5,1,80,10,21,8,3,0, +15,0,63,50,47,63,237,50,1,47,94,93,237,93,26,16,220,93,43,93,113,26,237,50, +47,43,237,49,48,1,17,33,17,51,17,51,17,35,17,33,17,1,66,1,221,180,147,163, +252,203,4,58,252,73,3,183,252,73,253,229,1,152,4,58,0,1,0,122,0,0,3,156,4, +58,0,25,0,92,64,37,108,15,124,15,140,15,3,22,32,7,10,72,21,24,7,12,72,12, +70,64,9,175,13,1,127,13,143,13,239,13,3,13,27,128,1,70,24,184,255,192,64, +20,9,12,72,24,14,19,80,9,15,6,31,6,2,6,6,12,21,10,0,15,0,63,50,63,57,47,93, +51,237,50,1,47,43,237,26,16,220,93,113,50,26,237,49,48,43,43,0,93,1,17,20, +30,2,51,50,54,55,17,51,17,35,17,14,3,35,34,46,2,53,17,1,46,16,39,64,47,70, +132,74,180,180,38,81,87,93,51,66,101,69,36,4,58,254,110,34,59,44,25,26,21, +2,5,251,198,1,205,15,31,24,16,41,76,110,69,1,155,0,0,0,1,0,142,0,0,5,221, +4,58,0,11,0,116,64,52,7,70,4,4,0,11,70,64,4,8,52,8,2,36,8,132,8,212,8,228, +8,4,11,8,1,139,8,251,8,2,8,13,128,251,13,1,180,13,212,13,2,128,13,1,2,112, +13,1,95,13,1,13,184,255,192,64,23,9,12,72,3,70,0,0,16,0,48,0,3,8,0,9,5,1, +15,7,3,80,0,21,0,63,237,50,63,51,51,1,47,94,93,237,43,93,93,95,93,93,93,26, +16,220,93,113,113,114,26,237,18,57,47,237,49,48,51,17,51,17,33,17,51,17,33, +17,51,17,142,180,1,154,180,1,153,180,4,58,252,73,3,183,252,73,3,183,251,198, +0,0,0,1,0,142,254,104,6,102,4,58,0,15,0,141,64,96,13,73,244,14,1,14,14,11, +70,8,7,70,64,4,4,0,107,8,1,4,8,1,84,8,228,8,2,59,8,1,107,8,123,8,139,8,251, +8,4,84,8,1,8,17,128,251,17,1,212,17,1,128,17,176,17,2,2,96,17,112,17,2,95, +17,1,32,17,48,17,64,17,3,3,70,0,0,16,0,48,0,240,0,4,8,0,14,9,5,1,15,11,7, +3,80,0,21,0,63,237,50,50,63,51,51,47,1,47,94,93,237,93,93,93,95,93,93,93, +26,16,204,93,93,113,113,114,114,17,57,47,26,237,16,237,50,47,93,237,49,48, +51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,142,180,1,149,180,1,148,180, +147,163,4,58,252,73,3,183,252,73,3,183,252,73,253,229,1,152,0,0,0,0,2,0,45, +0,0,4,172,4,58,0,14,0,25,0,113,185,0,5,255,224,179,7,10,72,2,184,255,224, +64,16,7,11,72,3,71,64,176,21,1,21,27,128,80,27,1,27,184,255,192,64,45,30, +35,72,255,27,1,14,11,15,70,32,9,1,32,9,1,9,25,81,175,14,191,14,207,14,3,15, +14,31,14,79,14,3,7,14,14,9,11,80,12,15,15,81,9,21,0,63,237,63,237,18,57,47, +94,93,113,237,1,47,93,113,253,204,51,93,43,113,26,16,220,93,26,237,49,48, +43,43,1,50,22,21,20,14,2,35,33,17,33,53,33,25,1,51,50,62,2,53,52,38,43,1, +3,13,205,210,52,104,155,103,254,103,254,184,1,252,202,69,96,59,26,116,133, +203,2,112,147,159,74,118,82,44,3,183,131,254,54,254,15,25,49,71,46,94,87, +0,3,0,142,0,0,5,50,4,58,0,12,0,23,0,27,0,105,185,0,5,255,224,179,7,10,72, +2,184,255,224,64,58,7,10,72,3,71,19,19,9,27,70,64,159,24,175,24,2,24,29,128, +12,13,70,16,9,32,9,64,9,3,9,23,81,175,12,191,12,207,12,3,15,12,31,12,79,12, +3,7,12,12,9,25,10,15,24,13,81,9,21,0,63,237,51,63,51,18,57,47,94,93,113,237, +1,47,93,237,50,26,16,220,93,26,237,18,57,47,237,49,48,43,43,1,50,22,21,20, +14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,1,17,51,17,2,38,205,210,52, +104,155,103,254,103,180,202,69,96,59,26,116,133,203,3,60,180,2,112,147,159, +74,118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,254,13,4,58,251,198,0,0, +0,0,2,0,142,0,0,3,215,4,58,0,12,0,23,0,132,185,0,5,255,224,179,7,10,72,2, +184,255,224,64,86,7,10,72,3,71,64,176,19,1,19,25,128,47,25,1,47,25,175,25, +2,63,25,95,25,127,25,159,25,191,25,207,25,223,25,255,25,8,25,64,35,39,72, +12,13,70,0,9,208,9,2,16,9,32,9,64,9,240,9,4,9,23,81,175,12,191,12,207,12, +3,15,12,31,12,79,12,3,7,12,12,9,10,15,13,81,9,21,0,63,237,63,18,57,47,94, +93,113,237,1,47,93,113,237,50,43,93,113,114,26,16,220,93,26,237,49,48,43, +43,1,50,22,21,20,14,2,35,33,17,51,25,1,51,50,62,2,53,52,38,43,1,2,56,205, +210,52,104,155,103,254,85,180,220,69,96,59,26,116,133,221,2,112,147,159,74, +118,82,44,4,58,254,54,254,15,25,49,71,46,94,87,0,0,0,0,1,0,55,255,236,3,190, +4,78,0,40,0,170,64,87,118,34,1,22,29,1,118,28,1,107,15,1,107,6,1,16,10,32, +10,2,10,10,0,31,71,64,12,31,9,1,144,9,1,9,42,128,20,70,21,21,1,70,31,0,1, +223,0,1,0,64,12,18,72,0,10,80,143,11,159,11,175,11,3,11,11,26,4,80,36,0,1, +16,1,32,1,96,1,112,1,128,1,192,1,208,1,8,1,184,255,192,64,29,27,34,72,1,1, +36,22,31,20,47,20,127,20,143,20,223,20,5,20,64,29,32,72,20,20,17,80,26,16, +0,63,237,51,47,43,93,63,51,47,43,93,16,237,17,57,47,113,237,1,47,43,113,114, +237,51,47,237,26,16,220,93,113,50,26,237,18,57,47,93,49,48,93,93,93,93,93, +19,55,30,1,51,50,62,2,55,33,53,33,46,3,35,34,6,7,39,62,3,51,50,30,2,21,20, +14,2,35,34,46,2,55,182,16,133,100,73,103,68,34,5,254,99,1,157,4,34,67,103, +73,109,118,15,185,13,66,105,145,93,90,170,134,81,51,114,182,130,99,151,106, +61,1,59,12,108,104,53,97,135,82,131,90,133,88,44,105,91,14,68,116,84,48,53, +128,216,163,120,205,151,86,54,92,122,0,0,0,0,2,0,142,255,236,5,170,4,78,0, +19,0,39,0,128,64,85,121,37,137,37,2,116,33,132,33,2,118,27,134,27,2,121,23, +137,23,2,150,18,166,18,2,30,71,15,15,8,31,8,2,7,8,8,11,0,71,64,160,20,1,20, +41,128,14,10,70,192,11,1,0,11,16,11,48,11,224,11,240,11,5,8,11,25,80,17,16, +9,80,47,14,1,14,14,11,12,15,11,21,35,80,3,22,0,63,237,63,63,18,57,47,93,237, +63,237,1,47,94,93,113,237,50,26,16,220,93,26,237,18,57,47,94,93,51,237,49, +48,0,93,1,93,93,93,93,1,16,2,35,34,46,2,39,35,17,35,17,51,17,51,18,33,50, +18,3,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,5,170,235,223,102,161,115,65, +5,222,180,180,223,33,1,164,237,215,189,35,67,97,61,63,99,70,37,39,70,94,56, +62,100,70,38,2,30,254,228,254,234,62,128,192,131,254,19,4,58,254,54,1,222, +254,232,254,232,126,164,98,39,41,99,164,123,126,165,98,40,39,98,166,0,0,2, +0,17,0,0,3,199,4,58,0,13,0,22,0,143,64,68,117,1,133,1,2,3,32,11,17,72,0,32, +40,43,72,223,0,239,0,2,0,32,29,37,72,52,0,1,43,0,1,41,4,1,4,48,7,10,72,7, +32,7,11,72,18,71,0,3,3,12,6,6,2,22,11,70,64,175,12,1,239,12,1,12,24,128,1, +2,184,255,240,64,22,91,2,107,2,2,2,3,0,81,47,21,1,21,21,1,15,81,9,15,12,1, +21,0,63,51,63,237,18,57,47,93,237,50,1,47,93,56,51,26,16,220,93,113,26,237, +51,18,57,47,18,57,17,51,237,49,48,43,0,43,93,1,93,113,43,113,43,43,93,9,1, +35,1,46,1,53,52,54,51,33,17,35,25,1,35,34,6,21,20,22,59,1,2,23,254,197,203, +1,88,131,118,216,207,1,176,180,234,130,120,107,124,253,1,202,254,54,1,215, +27,163,122,149,150,251,198,1,202,1,241,92,93,94,93,0,255,255,0,87,255,236, +4,24,5,123,18,38,0,72,0,0,17,7,0,105,0,248,0,0,0,23,64,13,3,2,38,17,38,3, +2,4,42,40,17,27,37,1,43,53,53,0,43,53,53,0,0,0,0,1,0,10,254,87,3,238,5,204, +0,57,0,162,64,9,170,49,1,31,32,9,15,72,24,184,255,232,64,86,9,13,72,0,24, +16,24,2,7,36,36,57,28,70,64,80,45,1,159,45,1,45,59,128,10,7,57,70,4,3,192, +0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176,59,192,59,208,59,3,176,59,240,59, +2,255,59,1,112,59,160,59,176,59,3,57,21,40,80,33,27,15,51,80,22,10,2,81,7, +3,3,5,22,184,255,192,182,7,13,72,22,15,5,0,0,63,63,43,18,57,47,51,237,50, +16,237,50,63,237,63,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220, +93,113,26,237,17,57,47,49,48,0,94,93,43,43,1,93,51,17,35,53,51,53,51,21,33, +21,33,21,20,14,2,7,51,62,3,51,50,30,2,21,17,20,14,2,35,34,38,39,53,30,1,51, +50,62,2,53,17,52,46,2,35,34,14,2,21,17,142,132,132,180,1,44,254,212,2,3,2, +1,3,30,70,84,100,62,104,133,77,29,21,54,93,72,34,65,28,13,36,13,38,49,27, +10,17,48,88,70,64,103,73,40,4,182,131,147,147,131,148,33,66,56,39,7,55,77, +50,23,56,101,140,84,252,209,62,106,78,45,4,5,139,2,4,20,43,67,46,2,241,69, +104,69,35,46,84,120,75,253,170,0,0,0,255,255,0,142,0,0,2,200,5,228,18,38, +1,201,0,0,17,7,0,116,0,216,0,0,0,19,64,11,1,6,17,38,1,85,6,9,4,0,37,1,43, +53,0,43,53,0,0,0,0,1,0,87,255,236,3,222,4,78,0,40,0,171,64,113,116,30,1,116, +21,1,137,8,1,137,2,1,47,42,1,63,26,1,26,26,27,36,16,70,15,15,35,70,0,36,32, +36,2,0,36,64,36,96,36,128,36,160,36,192,36,224,36,7,8,36,24,27,71,31,5,1, +5,27,80,143,24,159,24,175,24,3,24,24,32,19,80,10,31,16,47,16,127,16,143,16, +223,16,5,16,64,29,32,72,16,16,10,16,32,80,0,0,35,16,35,32,35,96,35,112,35, +128,35,192,35,208,35,8,35,184,255,192,182,27,34,72,35,35,0,22,0,63,50,47, +43,93,16,237,63,51,47,43,93,16,237,18,57,47,113,237,1,47,93,237,50,47,94, +93,113,237,51,47,237,17,18,57,47,93,93,49,48,93,93,93,93,5,34,46,2,53,52, +62,2,51,50,30,2,23,7,46,1,35,34,14,2,7,33,21,33,30,3,51,50,54,55,23,14,3, +2,52,130,182,114,51,81,134,170,90,93,145,105,66,13,185,15,118,109,73,103, +67,34,4,1,156,254,99,4,35,68,103,74,100,133,16,182,9,61,106,151,20,86,151, +205,120,163,216,128,53,48,84,116,68,14,91,105,44,88,133,90,131,82,135,97, +53,103,109,12,67,122,92,54,0,255,255,0,57,255,236,3,182,4,75,18,6,0,86,0, +0,255,255,0,137,0,0,1,61,5,204,16,38,0,241,199,0,17,6,1,75,237,0,0,212,181, +9,64,56,56,72,9,184,255,192,64,9,55,55,72,9,64,54,54,72,9,184,255,192,179, +53,53,72,9,184,255,192,64,9,52,52,72,9,64,50,50,72,9,184,255,192,179,49,49, +72,9,184,255,192,64,9,48,48,72,9,64,42,42,72,9,184,255,192,179,41,41,72,9, +184,255,192,64,9,40,40,72,9,64,38,38,72,9,184,255,192,179,37,37,72,9,184, +255,192,179,36,36,72,9,184,255,192,179,35,35,72,9,184,255,192,64,16,34,34, +72,9,64,29,29,72,9,64,10,10,72,1,0,0,184,255,192,179,49,49,72,0,184,255,192, +64,9,40,41,72,0,64,25,27,72,0,184,255,192,182,18,18,72,128,0,1,0,184,255, +192,64,11,8,8,72,0,1,0,4,7,1,2,37,1,43,53,17,43,93,43,43,43,43,53,53,1,43, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,255,255,255,248,0,0,2, +37,5,123,18,38,0,241,0,0,17,6,0,105,203,0,0,25,182,2,1,4,17,38,2,1,184,255, +243,180,8,6,0,2,37,1,43,53,53,0,43,53,53,0,0,0,255,255,255,206,254,87,1,61, +5,204,18,6,0,77,0,0,0,2,0,11,255,236,6,236,4,58,0,34,0,45,1,42,64,82,163, +16,1,148,16,1,117,16,133,16,2,106,14,1,57,14,1,14,16,18,22,72,131,14,147, +14,163,14,3,117,14,1,106,13,1,57,13,1,13,16,18,22,72,163,13,1,87,13,103,13, +119,13,3,16,24,12,17,72,109,15,1,15,32,18,22,72,162,15,1,117,15,133,15,149, +15,3,54,15,70,15,2,5,184,255,224,179,7,10,72,2,184,255,224,64,18,7,11,72, +34,35,70,64,9,1,9,9,22,3,71,176,41,1,41,184,255,192,64,9,8,11,72,41,47,80, +47,1,47,184,255,192,64,93,30,35,72,255,47,1,48,47,1,109,11,1,31,11,63,11, +2,255,11,1,233,11,1,187,11,203,11,219,11,3,163,11,1,149,11,1,31,32,63,32, +2,255,32,1,106,32,1,41,32,1,163,32,1,53,32,1,11,15,32,3,22,45,81,175,34,191, +34,207,34,3,15,34,31,34,79,34,3,7,34,34,9,11,80,32,15,25,80,18,22,35,81,9, +21,0,63,237,63,237,63,237,18,57,47,94,93,113,237,1,47,23,51,93,93,113,113, +93,113,93,93,93,93,93,113,113,93,93,43,113,16,220,43,93,237,18,57,47,93,237, +50,49,48,43,43,93,93,93,43,113,0,43,1,93,93,43,113,113,93,93,43,113,113,93, +93,93,1,50,22,21,20,14,2,35,33,17,33,6,2,14,3,35,34,38,39,53,30,1,51,50,62, +3,18,55,33,25,1,51,50,62,2,53,52,38,43,1,5,77,205,210,52,104,155,103,254, +62,254,101,25,42,44,51,71,94,65,29,48,17,11,38,19,35,51,40,33,34,38,25,2, +242,242,69,96,59,26,116,133,243,2,112,147,159,74,118,82,44,3,183,184,254, +225,216,149,93,42,8,5,129,4,5,42,94,149,216,1,29,183,254,54,254,15,25,49, +71,46,94,87,0,0,2,0,142,0,0,6,44,4,58,0,20,0,31,0,133,185,0,7,255,224,179, +7,10,72,4,184,255,224,64,23,7,11,72,1,21,70,19,11,11,15,5,71,64,176,27,1, +27,33,128,80,33,1,33,184,255,192,64,50,30,35,72,255,33,1,18,14,70,16,15,32, +15,64,15,3,15,31,81,1,1,13,80,175,18,191,18,207,18,3,15,18,31,18,79,18,3, +7,18,18,0,15,21,21,81,11,21,16,0,15,0,63,50,63,237,63,18,57,47,94,93,113, +237,51,47,237,1,47,93,237,50,93,43,113,26,16,220,93,26,237,18,57,47,51,237, +50,49,48,43,43,1,17,51,50,22,21,20,14,2,35,33,17,33,17,35,17,51,17,33,17, +19,51,50,62,2,53,52,38,43,1,3,169,228,205,210,52,104,155,103,254,102,254, +78,180,180,1,178,181,202,69,96,59,26,116,133,203,4,58,254,54,147,159,74,118, +82,44,1,237,254,19,4,58,254,54,1,202,252,69,25,49,71,46,94,87,0,0,0,0,1,0, +10,0,0,3,238,5,204,0,41,0,144,185,0,7,255,232,64,85,9,13,72,0,7,16,7,2,7, +33,24,11,70,64,80,12,1,159,12,255,12,2,12,43,128,35,32,24,70,29,28,192,25, +1,0,25,16,25,48,25,224,25,240,25,5,8,25,176,43,192,43,208,43,3,176,43,240, +43,2,255,43,1,112,43,160,43,176,43,3,35,27,81,32,28,28,5,30,0,25,11,21,0, +18,80,5,184,255,192,180,9,13,72,5,15,0,63,43,237,50,63,51,63,18,57,47,51, +237,50,1,93,93,113,114,47,94,93,113,51,51,237,50,50,26,16,220,93,113,26,237, +17,57,49,48,0,94,93,43,1,62,3,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21, +17,35,17,35,53,51,53,51,21,33,21,33,21,20,14,2,7,1,61,30,70,84,100,62,104, +133,77,29,181,17,48,88,70,64,103,73,40,180,132,132,180,1,44,254,212,2,3,2, +1,3,89,55,77,50,23,56,101,140,84,253,87,2,134,69,104,69,35,46,84,120,75,253, +170,4,182,131,147,147,131,148,33,66,56,39,7,0,0,255,255,0,138,0,0,3,138,5, +228,18,38,1,208,0,0,17,7,0,116,1,63,0,0,0,19,64,11,1,22,17,38,1,81,22,25, +0,14,37,1,43,53,0,43,53,0,0,0,255,255,0,5,254,87,3,252,5,240,18,38,0,92,0, +0,17,7,2,145,0,183,0,0,0,19,64,11,1,32,17,38,1,10,37,45,17,31,37,1,43,53, +0,43,53,0,0,0,0,1,0,142,254,104,3,221,4,58,0,11,0,125,64,89,9,73,15,10,79, +10,2,38,10,10,0,7,70,64,15,4,79,4,2,57,47,4,111,4,143,4,255,4,4,191,4,1,143, +4,159,4,255,4,3,4,13,128,3,70,192,0,1,0,0,16,0,48,0,224,0,240,0,5,8,0,176, +13,192,13,208,13,3,176,13,240,13,2,112,13,160,13,176,13,192,13,4,9,5,1,15, +8,3,80,0,0,47,237,51,63,51,47,1,93,113,114,47,94,93,113,237,26,16,220,93, +113,114,94,93,26,237,18,57,47,94,93,237,49,48,51,17,51,17,33,17,51,17,33, +17,35,17,142,180,1,231,180,254,170,163,4,58,252,73,3,183,251,198,254,104, +1,152,0,0,1,0,168,0,1,3,186,7,28,0,7,0,55,64,37,5,90,0,6,16,6,64,6,3,6,3, +70,255,0,1,0,0,16,0,64,0,128,0,176,0,208,0,6,7,0,4,95,1,7,3,5,18,0,63,63, +51,237,1,47,94,93,93,237,47,93,237,49,48,1,17,51,17,33,17,35,17,3,6,180,253, +173,191,5,129,1,155,253,201,251,28,5,128,0,0,0,0,1,0,142,0,0,3,10,5,204,0, +7,0,56,64,36,6,73,16,3,48,3,2,3,3,9,0,70,192,1,1,0,1,16,1,48,1,224,1,240, +1,5,8,1,4,0,7,80,2,15,0,21,0,63,63,237,63,1,47,94,93,113,237,17,51,47,93, +237,49,48,33,35,17,33,17,51,17,33,1,66,180,1,217,163,254,56,4,58,1,146,253, +235,255,255,0,9,0,0,7,134,6,240,18,38,0,58,0,0,17,7,2,148,2,65,0,0,0,21,180, +1,47,5,38,1,184,255,184,180,48,51,15,46,37,1,43,53,0,43,53,0,255,255,255, +253,0,0,5,204,5,228,18,38,0,90,0,0,17,7,0,67,1,72,0,0,0,21,180,1,43,17,38, +1,184,255,162,180,44,47,15,42,37,1,43,53,0,43,53,0,255,255,0,9,0,0,7,134, +6,240,18,38,0,58,0,0,17,7,2,149,2,247,0,0,0,19,64,11,1,47,5,38,1,75,47,50, +15,46,37,1,43,53,0,43,53,0,0,0,255,255,255,253,0,0,5,204,5,228,18,38,0,90, +0,0,17,7,0,116,2,38,0,0,0,19,64,11,1,43,17,38,1,93,43,46,15,42,37,1,43,53, +0,43,53,0,0,0,255,255,0,9,0,0,7,134,6,178,18,38,0,58,0,0,17,7,2,152,2,134, +0,0,0,23,64,13,2,1,47,5,38,2,1,2,51,49,15,46,37,1,43,53,53,0,43,53,53,0,0, +0,255,255,255,253,0,0,5,204,5,123,18,38,0,90,0,0,17,7,0,105,1,161,0,0,0,23, +64,13,2,1,43,17,38,2,1,0,47,45,15,42,37,1,43,53,53,0,43,53,53,0,0,0,255,255, +0,45,0,0,5,41,6,240,18,38,0,60,0,0,17,7,2,148,1,34,0,0,0,21,180,1,9,5,38, +1,184,255,181,180,10,13,4,8,37,1,43,53,0,43,53,0,255,255,0,5,254,87,3,252, +5,228,18,38,0,92,0,0,17,6,0,67,105,0,0,21,180,1,32,17,38,1,184,255,167,180, +33,36,17,31,37,1,43,53,0,43,53,0,0,0,0,1,0,0,1,195,4,114,2,76,0,3,0,43,64, +30,2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38, +43,72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,4,114,1,195,137,137, +0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30,2,0,0,186,15,1,31,1,63,1,79,1,4,47, +1,63,1,111,1,175,1,223,1,5,1,64,38,43,72,1,0,47,43,93,113,237,1,47,47,49, +48,17,53,33,21,8,0,1,195,137,137,0,0,1,0,0,1,195,8,0,2,76,0,3,0,43,64,30, +2,0,0,186,15,1,31,1,63,1,79,1,4,47,1,63,1,111,1,175,1,223,1,5,1,64,38,43, +72,1,0,47,43,93,113,237,1,47,47,49,48,17,53,33,21,8,0,1,195,137,137,0,255, +255,255,225,254,78,4,138,255,169,16,38,0,66,0,229,16,7,0,66,0,0,0,190,0,1, +0,127,3,184,1,72,5,129,0,12,0,47,64,16,4,32,11,17,72,7,64,11,17,72,7,12,150, +10,151,0,184,255,192,64,10,8,11,72,0,10,156,0,169,7,3,0,63,244,237,1,47,43, +237,237,50,43,49,48,43,19,53,52,62,2,55,51,14,1,21,51,21,127,10,20,30,20, +121,45,50,89,3,184,146,52,86,75,66,32,65,132,65,195,0,0,0,1,0,127,3,184,1, +72,5,129,0,12,0,52,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255,192, +180,11,17,72,6,11,184,255,192,64,10,8,11,72,11,10,156,5,169,11,3,0,63,228, +237,1,47,43,51,43,253,237,49,48,43,1,20,14,2,7,35,62,1,53,35,53,51,1,72,9, +20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,63,197,0,1,0,127,254, +250,1,72,0,195,0,12,0,51,185,0,3,255,224,183,11,17,72,9,151,0,150,6,184,255, +192,180,11,17,72,6,11,184,255,192,64,9,8,11,72,11,5,169,11,156,10,0,47,253, +228,1,47,43,51,43,253,237,49,48,43,37,20,14,2,7,35,62,1,53,35,53,51,1,72, +9,20,29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,0,0,0,1,0,126, +3,184,1,71,5,129,0,12,0,47,64,16,8,32,11,17,72,5,64,11,17,72,5,1,150,2,151, +11,184,255,192,64,10,8,11,72,11,5,169,2,156,12,3,0,63,237,228,1,47,43,237, +237,50,43,49,48,43,1,21,35,20,22,23,35,46,3,61,1,1,65,88,49,45,123,20,29, +20,9,5,129,197,63,132,65,32,66,75,86,53,145,0,0,0,2,0,75,3,184,2,95,5,129, +0,12,0,25,0,89,64,58,17,32,11,17,72,4,32,11,17,72,20,64,11,17,72,20,25,150, +13,7,64,11,17,72,7,12,150,10,151,128,0,1,15,0,31,0,2,8,0,23,151,13,159,27, +175,27,2,10,23,156,13,0,0,13,169,6,20,3,0,63,51,228,50,47,16,237,50,1,93, +47,237,220,94,93,93,237,237,50,43,16,237,50,43,49,48,43,43,1,53,52,62,2,55, +51,14,1,21,51,21,33,53,52,62,2,55,51,14,1,21,51,21,1,151,10,19,29,20,122, +45,49,88,253,242,10,20,30,20,121,45,50,89,3,184,146,52,86,75,66,32,65,132, +65,195,146,52,86,75,66,32,65,132,65,195,0,0,2,0,75,3,184,2,95,5,129,0,12, +0,25,0,107,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22, +151,13,150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31, +11,2,8,11,19,184,255,192,64,24,11,17,72,19,63,24,1,24,159,27,175,27,2,10, +23,156,24,5,5,18,169,11,24,3,0,63,51,228,50,47,16,237,50,1,93,47,93,51,43, +220,94,93,93,50,43,253,237,16,253,237,49,48,43,43,1,20,14,2,7,35,62,1,53, +35,53,51,5,20,14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194, +254,181,9,20,29,20,123,45,49,88,195,4,240,53,86,75,66,32,65,132,65,195,145, +53,86,75,66,32,65,132,65,195,0,0,0,2,0,75,254,250,2,95,0,195,0,12,0,25,0, +104,185,0,16,255,224,179,11,17,72,3,184,255,224,64,13,11,17,72,22,151,13, +150,24,9,151,0,150,6,184,255,192,64,15,11,17,72,6,128,11,1,15,11,31,11,2, +8,11,19,184,255,192,64,21,11,17,72,19,24,159,27,175,27,2,5,5,18,169,24,11, +11,24,156,10,23,0,47,51,237,50,47,16,228,50,47,1,93,47,51,43,220,94,93,93, +50,43,253,237,16,253,237,49,48,43,43,37,20,14,2,7,35,62,1,53,35,53,51,5,20, +14,2,7,35,62,1,53,35,53,51,2,95,10,19,30,20,121,45,49,88,194,254,181,9,20, +29,20,123,45,49,88,195,51,53,87,75,66,32,65,132,65,195,144,53,87,75,66,32, +65,132,65,195,0,0,0,1,0,138,255,118,3,234,5,204,0,11,0,64,64,37,11,192,0, +8,9,8,0,188,3,7,7,6,4,192,47,3,111,3,175,3,3,32,3,1,3,11,193,10,194,7,4,193, +5,194,7,0,1,0,47,63,246,237,16,244,237,1,47,93,113,237,51,51,47,16,237,50, +50,47,16,237,49,48,1,3,35,3,5,53,5,3,51,3,37,21,2,137,22,115,22,254,160,1, +96,28,215,28,1,97,3,232,251,142,4,114,27,164,29,1,120,254,136,29,164,0,0, +1,0,136,255,115,3,233,5,204,0,21,0,86,64,50,12,8,189,9,15,5,6,11,14,15,5, +9,190,19,1,189,0,20,17,0,16,3,4,16,3,32,0,1,0,19,193,18,194,15,12,193,13, +194,15,8,193,7,194,4,1,193,2,194,4,0,0,63,246,237,16,244,237,47,246,237,16, +244,237,1,47,93,23,51,47,17,51,51,16,237,50,237,23,50,47,16,237,50,49,48, +1,5,53,5,3,51,3,37,21,37,3,19,37,21,37,19,35,19,5,53,5,19,1,241,254,152,1, +104,16,175,16,1,105,254,151,26,26,1,104,254,152,16,175,16,254,151,1,105,26, +3,232,27,164,29,1,120,254,136,29,164,27,254,182,254,185,27,164,29,254,136, +1,120,29,164,27,1,71,0,0,0,0,1,0,81,1,145,2,124,3,188,0,19,0,73,185,0,17, +255,232,179,9,12,72,13,184,255,232,64,39,9,12,72,7,24,9,12,72,3,24,9,12,72, +128,0,1,15,0,63,0,2,0,191,10,1,10,143,5,1,0,5,48,5,2,5,15,15,1,15,0,47,93, +205,93,93,1,47,93,205,93,93,49,48,0,43,43,43,43,1,20,14,2,35,34,46,2,53,52, +62,2,51,50,30,2,2,124,45,76,102,58,57,99,75,43,43,75,99,57,58,102,76,45,2, +170,58,102,77,44,44,77,102,58,57,100,74,43,43,74,100,0,0,0,3,1,22,0,0,6,234, +0,219,0,3,0,7,0,11,0,86,64,61,7,150,4,4,0,11,150,0,8,48,8,96,8,128,8,144, +8,160,8,208,8,240,8,8,0,8,48,8,64,8,96,8,144,8,192,8,208,8,240,8,8,8,8,3, +150,47,0,191,0,2,16,0,1,0,5,1,9,155,4,0,8,0,47,51,51,237,50,50,1,47,93,93, +237,47,94,93,113,237,18,57,47,237,49,48,33,53,51,21,33,53,51,21,33,53,51, +21,6,40,194,252,183,192,252,181,195,219,219,219,219,219,219,0,0,7,0,55,255, +245,7,200,5,141,0,3,0,23,0,43,0,63,0,83,0,103,0,123,3,217,64,12,118,0,134, +0,2,121,2,137,2,2,3,102,184,255,224,64,14,8,12,72,96,24,8,12,72,92,24,8,12, +72,86,184,255,224,179,8,12,72,62,184,255,232,64,14,8,12,72,56,24,8,12,72, +52,24,8,12,72,46,184,255,224,179,8,12,72,22,184,255,224,64,14,8,12,72,16, +24,8,12,72,12,24,8,12,72,6,184,255,224,64,13,8,12,72,74,180,59,181,49,0,1, +2,3,1,184,255,240,64,131,3,16,118,3,1,9,1,25,1,121,1,3,9,1,3,1,3,19,49,180, +102,64,1,38,64,182,64,198,64,214,64,4,64,64,19,114,180,99,181,89,180,105, +104,1,22,104,38,104,2,201,104,249,104,2,139,104,1,118,104,1,89,104,1,70,104, +1,41,104,1,27,104,1,233,104,1,150,104,198,104,2,121,104,1,107,104,1,86,104, +1,57,104,1,6,104,22,104,38,104,3,10,104,24,180,9,181,34,180,9,19,25,19,41, +19,73,19,89,19,121,19,137,19,153,19,8,34,19,64,45,49,72,19,184,255,192,64, +255,19,23,72,19,217,125,1,198,125,1,169,125,1,155,125,1,121,125,1,107,125, +1,93,125,1,73,125,1,59,125,1,45,125,1,9,125,25,125,2,251,125,1,237,125,1, +217,125,1,203,125,1,189,125,1,155,125,1,125,125,141,125,2,105,125,1,91,125, +1,77,125,1,54,125,1,41,125,1,11,125,27,125,2,204,233,125,249,125,2,214,125, +1,187,125,1,173,125,1,137,125,153,125,2,123,125,1,102,125,1,75,125,1,61,125, +1,9,125,1,219,125,251,125,2,205,125,1,153,125,169,125,2,107,125,139,125,2, +93,125,1,57,125,1,43,125,1,29,125,1,9,125,1,237,125,253,125,2,185,125,201, +125,217,125,3,123,125,171,125,2,89,125,1,11,125,59,125,75,125,3,155,249,125, +1,235,125,1,214,125,1,187,125,1,153,125,1,123,125,139,125,2,102,125,1,59, +125,75,125,2,9,125,25,125,2,246,125,1,217,125,1,205,125,1,169,125,185,125, +2,155,125,1,105,125,121,125,2,93,125,1,57,125,73,125,2,43,125,1,22,125,1, +249,125,1,237,125,1,201,125,64,249,1,187,125,1,153,125,1,123,125,1,102,125, +1,73,125,1,54,125,1,9,125,25,125,2,105,249,125,1,235,125,1,221,125,1,169, +125,1,150,125,1,121,125,1,107,125,1,73,125,1,59,125,1,25,125,1,11,125,1,253, +125,1,217,125,1,203,125,1,169,125,1,155,125,1,141,125,1,121,125,1,91,125, +107,125,2,57,125,1,27,125,43,125,2,249,125,1,235,125,1,169,125,201,125,2, +150,125,1,121,125,1,107,125,1,57,125,1,38,125,1,9,125,1,56,249,125,1,230, +125,1,201,125,1,182,125,1,153,125,1,139,125,1,89,125,1,70,125,1,41,125,1, +27,125,1,249,125,1,235,125,1,201,125,1,187,125,1,173,125,1,1,148,125,1,123, +125,1,100,125,1,75,125,1,63,125,1,27,125,1,15,125,1,228,125,1,203,125,1,176, +125,1,2,160,125,1,143,125,1,112,125,1,95,125,1,64,125,1,31,125,1,0,125,1, +8,109,182,84,183,119,182,94,19,69,182,44,183,79,182,54,19,39,182,14,183,29, +182,4,4,2,3,0,18,0,63,63,63,237,244,237,63,237,244,237,63,237,244,237,1,94, +93,93,93,93,93,93,93,95,93,93,93,113,113,113,113,113,113,113,95,113,113,113, +113,113,114,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,93,93,93, +93,113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114, +114,114,114,94,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113, +113,113,113,114,114,114,114,114,114,114,114,114,94,93,93,93,93,93,113,113, +113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,114,94,93, +93,93,93,93,93,93,93,93,93,93,93,93,113,113,113,113,113,113,113,113,113,113, +113,47,43,43,94,93,237,244,237,47,94,93,93,93,93,93,93,93,113,113,113,113, +113,113,113,114,114,253,244,237,18,57,47,93,113,237,17,57,57,47,47,94,93, +93,56,56,17,51,17,51,16,244,237,49,48,0,43,43,43,43,43,43,43,43,43,43,43, +43,1,95,93,93,33,35,1,51,37,50,30,2,21,20,14,2,35,34,46,2,53,52,62,2,19,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2,35,34,46,2,53, +52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,50,30,2,21,20,14,2, +35,34,46,2,53,52,62,2,19,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,48,155, +3,154,157,252,152,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19, +37,55,35,38,58,39,19,20,39,56,37,34,54,39,21,2,30,60,107,80,46,46,81,108, +62,63,108,80,46,46,81,110,210,19,37,55,35,38,58,39,19,20,39,56,37,34,54,39, +21,1,253,60,107,80,46,46,81,108,62,63,108,80,46,46,81,110,210,19,37,55,35, +38,58,39,19,20,39,56,37,34,54,39,21,5,129,12,33,83,139,106,102,140,86,38, +37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71,97,59,26,26, +59,97,254,239,33,83,139,106,102,140,86,38,37,86,140,103,106,139,83,33,254, +151,73,98,58,24,24,59,97,73,71,97,59,26,26,59,97,1,176,33,83,139,106,102, +140,86,38,37,86,140,103,106,139,83,33,254,151,73,98,58,24,24,59,97,73,71, +97,59,26,26,59,97,0,0,0,0,1,0,85,3,122,1,89,5,129,0,3,0,40,64,25,3,16,10, +13,72,1,16,10,13,72,1,150,31,2,47,2,2,2,48,0,1,0,0,1,3,0,63,205,1,47,93,221, +93,237,49,48,43,43,27,1,51,3,85,64,196,158,3,122,2,7,253,249,255,255,0,85, +3,122,2,175,5,129,16,38,2,14,0,0,17,7,2,14,1,86,0,0,0,9,180,1,96,4,1,4,17, +93,53,0,0,1,0,88,0,141,2,81,3,172,0,8,0,72,64,55,106,3,122,3,138,3,3,106, +0,122,0,138,0,3,7,236,6,235,5,236,31,1,79,1,95,1,127,1,143,1,5,48,1,64,1, +96,1,112,1,160,1,5,1,0,239,15,3,47,3,111,3,127,3,4,3,0,47,93,228,1,47,93, +113,237,237,237,49,48,93,93,37,1,53,1,51,21,9,1,21,1,168,254,176,1,80,167, +254,177,1,81,141,1,109,63,1,115,31,254,140,254,145,29,0,0,0,1,0,89,0,141, +2,82,3,172,0,8,0,66,64,48,101,6,117,6,133,6,3,101,0,117,0,133,0,3,4,236,1, +236,8,235,112,3,128,3,176,3,3,208,3,1,111,3,127,3,2,3,0,239,15,6,47,6,111, +6,127,6,4,6,0,47,93,228,1,47,93,93,113,253,237,237,49,48,93,93,37,35,53,9, +1,53,51,1,21,1,1,168,1,82,254,176,166,1,81,141,29,1,111,1,116,31,254,141, +63,0,0,0,255,255,0,185,0,0,3,71,5,129,16,38,0,4,0,0,17,7,0,4,1,200,0,0,0, +22,64,12,3,2,47,8,1,8,1,0,47,0,1,0,17,93,53,53,17,93,53,53,0,1,255,192,5, +223,2,235,6,84,0,3,0,13,179,1,0,2,1,0,47,205,1,47,47,49,48,1,33,53,33,2,235, +252,213,3,43,5,223,117,0,1,254,96,0,0,2,98,5,129,0,3,0,45,182,3,16,111,3, +1,3,1,184,255,240,64,18,239,1,1,1,64,13,18,72,1,64,8,11,72,1,2,3,0,18,0,63, +63,1,47,43,43,93,56,47,93,56,49,48,33,35,1,51,254,244,148,3,113,145,5,129, +0,0,1,0,101,2,7,2,131,4,157,0,33,0,111,185,0,30,255,216,64,30,9,17,72,23, +10,224,36,11,1,11,33,224,36,0,212,0,228,0,3,0,23,6,228,11,139,0,251,0,2,0, +184,255,192,64,38,10,13,72,4,0,1,0,29,17,17,75,29,91,29,2,29,64,21,25,72, +29,64,16,19,72,47,29,63,29,2,27,29,1,15,29,1,2,29,0,47,95,93,93,93,43,43, +93,51,47,16,204,93,43,93,50,237,50,1,47,93,237,47,93,237,50,49,48,0,43,1, +17,52,46,2,35,34,6,21,17,35,17,52,46,2,53,51,20,30,2,21,51,62,3,51,50,22, +21,17,2,2,13,29,47,35,72,85,128,1,1,2,119,2,2,2,2,15,38,49,64,42,110,97,2, +7,1,142,46,61,37,16,100,94,254,148,1,255,20,46,40,29,4,3,27,34,35,12,28,46, +32,17,108,121,254,79,0,0,0,1,0,4,0,0,4,46,5,129,0,17,0,106,64,69,7,3,7,3, +10,0,16,32,16,2,16,16,48,16,80,16,112,16,144,16,224,16,6,16,5,1,9,92,14,12, +10,8,12,81,5,31,13,1,0,13,1,13,4,95,15,1,31,1,63,1,79,1,4,63,1,1,15,1,1,8, +1,1,9,0,95,15,3,9,18,0,63,63,237,18,57,47,94,93,93,113,237,220,93,113,50, +237,50,1,47,51,51,237,50,50,47,93,113,18,57,57,47,47,49,48,1,17,33,21,33, +21,33,21,33,17,35,17,35,53,51,17,33,21,1,103,2,175,253,81,1,146,254,110,180, +175,175,3,123,4,230,254,36,157,213,129,254,233,1,23,129,3,233,155,0,1,0,58, +0,0,4,80,5,150,0,58,0,221,64,81,133,58,149,58,2,21,22,37,22,53,22,3,40,44, +0,48,17,13,6,30,111,29,29,0,52,110,6,43,39,48,110,18,14,10,10,0,79,6,95,6, +111,6,3,6,58,111,0,0,32,0,2,0,0,32,0,48,0,80,0,112,0,144,0,176,0,208,0,8, +0,0,16,0,48,0,192,0,224,0,5,8,0,184,255,192,64,70,14,18,72,0,42,16,81,17, +46,12,81,43,175,13,1,13,64,42,45,72,0,13,16,13,32,13,3,13,39,111,17,1,47, +17,95,17,111,17,143,17,159,17,223,17,239,17,7,17,17,52,35,115,41,30,1,30, +24,7,7,52,116,37,58,1,23,58,1,58,6,24,0,63,51,93,93,237,50,63,51,93,237,18, +57,47,93,113,51,222,93,43,93,50,237,50,16,237,50,1,47,43,94,93,113,114,237, +47,93,18,57,47,51,51,237,50,50,16,237,17,57,47,237,17,51,51,17,18,57,57,49, +48,0,93,93,1,14,3,35,33,53,62,1,61,1,35,53,51,53,35,53,51,53,52,62,2,51,50, +30,2,23,7,46,3,35,34,6,29,1,33,21,33,21,33,21,33,21,20,14,2,7,33,50,62,2, +55,4,80,9,57,89,115,67,253,70,89,86,186,186,186,186,48,99,152,103,70,123, +99,71,18,174,10,39,53,65,36,114,112,1,152,254,104,1,152,254,104,22,44,63, +40,1,227,38,67,53,37,8,1,55,80,117,77,37,154,46,160,121,25,129,140,129,130, +92,147,102,55,29,58,86,57,57,31,52,36,20,115,125,138,129,140,129,7,56,106, +92,71,21,19,42,67,48,0,0,0,0,4,0,158,255,236,8,103,5,129,0,14,0,23,0,47,0, +98,1,193,64,71,134,2,1,117,91,133,91,2,91,73,107,73,139,73,3,143,68,1,109, +68,1,91,68,1,105,82,1,105,80,1,125,22,1,91,22,107,22,2,125,17,141,17,2,91, +17,107,17,2,84,57,100,57,2,54,57,70,57,2,37,97,53,97,69,97,3,76,32,9,14,72, +49,184,255,224,64,94,9,14,72,29,32,12,17,72,13,29,29,29,45,29,3,82,73,81, +81,48,72,65,0,70,15,24,39,75,37,41,72,30,34,32,30,57,73,15,56,1,102,56,1, +56,56,89,72,75,95,15,1,63,75,95,75,239,75,3,75,64,27,39,72,239,30,1,31,30, +95,30,127,30,3,15,30,75,75,30,15,3,8,64,65,80,65,96,65,3,127,65,143,65,2, +65,184,255,192,64,16,7,12,72,65,20,7,70,0,8,16,8,32,8,3,8,100,184,255,192, +179,91,95,72,100,184,255,192,179,80,88,72,100,184,255,192,179,70,74,72,100, +184,255,192,179,59,62,72,100,184,255,192,179,48,53,72,100,184,255,192,64, +11,27,31,72,79,100,95,100,111,100,3,100,184,255,192,179,7,10,72,89,184,255, +248,64,71,19,22,72,65,8,19,22,72,89,65,78,60,80,57,51,22,44,80,27,22,6,95, +20,87,80,121,82,1,72,82,88,82,104,82,3,82,78,40,32,80,33,78,37,33,35,35,33, +127,33,143,33,2,175,20,1,20,64,9,17,72,20,33,20,33,8,19,95,9,3,8,18,0,63, +63,237,18,57,57,47,47,43,93,93,17,51,47,17,51,51,16,237,50,47,51,93,93,237, +16,237,63,237,63,51,237,18,57,57,43,43,1,43,93,43,43,43,43,43,43,47,93,237, +50,47,43,93,113,18,23,57,47,47,47,93,113,43,93,93,16,237,51,47,93,113,237, +17,51,51,16,237,50,17,57,57,16,237,16,237,50,47,237,49,48,93,43,43,43,93, +0,93,93,1,93,93,93,93,0,93,93,93,93,93,1,93,0,93,1,93,1,20,14,2,43,1,17,35, +17,33,50,30,2,7,52,38,43,1,17,51,50,54,1,14,1,35,34,38,53,17,35,53,51,55, +51,21,51,21,35,17,20,22,51,50,54,55,37,20,6,35,34,46,2,39,55,30,1,51,50,62, +2,53,52,46,2,39,46,3,53,52,54,51,50,22,23,7,46,3,35,34,21,20,30,2,23,30,3, +3,186,61,121,182,121,130,181,1,43,125,186,124,62,182,164,164,105,113,165, +155,2,123,35,74,48,105,93,104,111,53,110,157,157,41,55,23,40,26,2,232,183, +170,75,121,92,61,15,159,17,99,88,40,68,49,27,34,62,87,52,49,96,77,47,168, +161,141,165,22,161,6,31,45,54,30,155,32,57,80,48,48,100,82,52,3,217,92,159, +117,68,253,219,5,129,61,111,157,97,134,139,253,212,146,252,186,11,13,123, +122,1,197,131,242,242,131,254,98,78,73,8,6,98,120,129,24,54,88,64,26,61,58, +10,25,40,30,30,41,29,23,13,12,32,53,79,59,112,119,105,116,17,28,38,24,10, +85,25,36,28,22,11,11,31,54,87,0,1,0,16,255,236,4,86,5,150,0,61,0,232,185, +0,2,255,235,64,68,15,73,106,38,1,58,43,74,43,122,43,138,43,4,36,59,52,59, +68,59,116,59,132,59,5,46,55,55,4,57,45,51,110,20,24,15,14,26,15,3,20,37,110, +36,36,3,110,64,4,96,4,128,4,160,4,176,4,5,0,4,144,4,176,4,208,4,4,4,184,255, +192,64,94,24,27,72,4,48,24,81,25,57,15,81,54,15,16,31,16,127,16,143,16,159, +16,5,16,64,39,47,72,0,16,16,16,128,16,3,16,45,47,25,63,25,127,25,3,47,25, +63,25,175,25,207,25,4,47,25,175,25,2,25,25,0,40,115,216,37,1,124,37,140,37, +2,26,37,42,37,2,37,31,7,0,115,115,3,131,3,2,21,3,37,3,2,3,9,25,0,63,51,93, +93,237,63,51,93,93,93,237,18,57,47,93,113,114,51,220,93,43,113,50,237,50, +16,237,50,1,47,43,93,113,237,51,47,237,47,23,51,47,196,16,237,50,50,17,57, +47,196,49,48,0,93,93,93,43,37,50,54,55,23,14,3,35,34,46,2,39,35,55,51,46, +1,53,52,54,55,35,55,51,62,3,51,50,30,2,23,7,46,1,35,34,14,2,7,33,7,33,14, +1,21,20,22,23,33,7,33,30,3,2,179,100,120,14,185,13,63,103,147,97,120,177, +121,69,13,171,40,120,1,2,2,1,160,40,129,15,73,123,173,115,97,147,103,63,13, +185,14,121,106,68,106,79,50,11,1,190,40,254,99,2,1,2,2,1,196,40,254,108,9, +42,77,114,126,100,91,14,68,118,87,50,77,139,192,114,129,8,46,24,27,53,6,127, +122,189,130,67,50,87,118,68,14,91,100,39,87,137,99,127,16,47,23,22,37,19, +129,81,138,100,57,0,0,0,0,4,0,69,255,244,6,208,5,140,0,19,0,23,0,43,0,79, +0,192,64,14,118,20,134,20,2,121,22,137,22,2,133,47,1,66,184,255,232,64,9, +8,11,72,60,24,8,11,72,17,184,255,232,179,8,11,72,13,184,255,232,64,29,8,11, +72,7,24,8,11,72,3,24,8,11,72,22,23,20,21,74,180,73,73,52,180,53,178,63,23, +16,21,184,255,240,64,62,21,23,21,23,0,44,180,63,64,10,14,72,63,34,180,10, +178,0,180,0,24,16,24,32,24,80,24,96,24,208,24,224,24,240,24,8,24,38,52,1, +52,49,182,58,184,77,182,74,68,4,23,3,20,18,29,182,15,184,39,182,5,19,0,63, +237,244,237,63,63,63,51,237,244,237,51,93,1,47,93,253,244,237,47,43,237,18, +57,57,47,47,56,56,16,244,237,51,47,237,17,51,17,51,49,48,0,43,43,43,43,43, +43,1,93,93,93,1,20,14,2,35,34,46,2,53,52,62,2,51,50,30,2,1,35,1,51,19,52, +46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,20,30,2,51,50,54,55,23,14,3,35,34, +46,2,53,52,62,2,51,50,30,2,23,7,46,1,35,34,6,6,208,51,87,116,66,66,115,85, +49,48,86,117,68,66,115,85,50,251,59,155,3,154,157,149,22,43,63,40,42,64,44, +22,23,43,63,41,39,63,44,24,250,155,20,47,75,54,69,94,11,141,6,45,77,111,72, +94,132,82,38,59,97,124,65,68,106,76,48,9,143,10,83,75,108,87,1,178,125,171, +105,45,45,104,171,126,133,174,103,41,41,103,174,253,201,5,129,252,49,99,131, +78,32,33,78,131,98,95,128,79,34,34,79,128,2,124,75,124,90,50,82,87,9,54,99, +76,45,69,121,164,96,130,173,103,42,40,70,94,55,11,72,85,164,0,2,0,19,255, +236,2,126,5,149,0,39,0,55,0,185,64,9,138,32,1,53,40,14,17,72,26,184,255,232, +179,8,16,72,22,184,255,232,64,67,8,16,72,8,32,8,16,72,6,32,11,16,72,5,27, +21,27,2,5,21,21,21,2,3,4,4,29,16,40,32,40,2,96,40,112,40,128,40,192,40,4, +15,40,1,40,40,4,51,20,51,2,8,51,159,35,1,35,18,14,192,10,208,10,224,10,3, +10,184,255,192,179,34,38,72,10,184,255,192,64,26,7,11,72,10,79,57,1,18,51, +45,15,11,34,24,14,14,7,45,24,3,3,7,24,7,0,7,0,47,205,63,18,57,47,16,205,17, +57,47,18,57,57,205,17,57,57,1,93,47,43,43,93,198,51,205,93,50,0,94,93,1,51, +47,93,93,113,205,50,47,51,49,48,0,93,93,43,43,43,43,1,43,93,37,50,54,55,51, +14,1,35,34,38,61,1,14,1,7,53,62,1,55,17,52,62,2,51,50,30,2,21,20,14,2,7,21, +20,30,2,19,52,46,2,35,34,14,2,21,17,62,3,1,177,51,68,17,69,20,120,109,111, +127,32,66,34,35,66,31,25,59,98,72,52,79,53,27,44,79,110,66,19,32,42,115,14, +27,40,26,32,39,22,8,49,77,54,28,78,104,109,154,157,159,155,175,17,28,13,73, +14,29,16,2,75,59,108,83,49,42,78,111,69,99,180,152,118,38,244,57,83,54,26, +4,20,52,85,61,33,36,61,81,46,254,5,33,104,131,151,0,0,0,0,4,0,188,0,0,8,46, +5,129,0,19,0,35,0,55,0,59,0,244,64,124,141,0,1,0,24,13,16,72,61,0,1,25,0, +1,132,10,1,114,10,1,69,10,85,10,101,10,3,22,10,38,10,2,5,33,21,33,37,33,3, +4,29,20,29,2,11,24,27,24,2,11,22,27,22,2,47,61,1,58,20,73,36,19,73,16,0,16, +57,46,73,26,144,16,160,16,192,16,3,31,26,1,16,26,16,26,8,144,36,160,36,176, +36,3,47,36,1,0,36,1,36,10,1,7,73,48,8,64,8,80,8,3,0,8,16,8,32,8,144,8,4,8, +41,31,15,1,184,255,192,179,29,36,72,1,184,255,192,64,15,18,21,72,1,17,9,3, +51,23,192,57,208,57,2,57,184,255,192,64,21,35,44,72,57,56,11,64,29,36,72, +11,64,18,21,72,0,11,56,3,8,18,0,63,23,51,43,43,47,221,43,93,222,205,63,51, +51,43,43,63,205,1,47,93,113,237,50,50,47,93,93,93,18,57,57,47,47,93,93,16, +237,51,17,51,16,237,16,237,50,93,49,48,0,93,93,93,93,1,93,93,93,93,93,93, +43,93,33,1,22,23,30,1,21,17,35,17,51,1,38,39,46,1,53,17,51,17,1,20,6,35,34, +38,53,52,62,2,51,50,30,2,7,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,1,53, +33,21,4,38,253,48,1,2,1,2,160,202,2,216,2,2,2,2,162,3,54,176,175,168,177, +43,87,131,88,93,131,84,39,159,24,47,69,45,46,71,48,25,26,48,67,41,46,72,50, +25,254,16,2,123,4,166,44,44,38,89,39,252,88,5,129,251,82,40,46,39,98,51,3, +156,250,127,2,178,188,203,201,190,91,145,101,53,53,100,145,92,81,107,64,26, +27,64,107,80,82,108,63,26,26,63,108,253,160,146,146,0,0,0,0,2,0,188,2,122, +7,25,5,129,0,39,0,47,0,148,64,9,9,24,19,23,72,136,9,1,8,184,255,232,64,16, +19,23,72,89,8,105,8,121,8,3,37,24,13,17,72,24,184,255,240,64,73,12,17,72, +44,41,196,42,24,21,196,64,22,224,22,2,22,22,0,64,47,1,47,0,42,16,42,64,42, +80,42,4,42,39,196,37,111,0,175,0,207,0,223,0,239,0,5,0,40,44,202,0,9,22,29, +4,0,42,32,42,80,42,128,42,4,42,2,15,23,37,15,3,45,3,0,63,23,51,17,51,204, +93,23,50,237,50,1,47,93,51,237,47,93,204,93,18,57,47,93,237,50,16,253,204, +49,48,43,43,93,43,93,43,1,17,53,6,7,14,1,7,3,35,3,46,1,39,38,39,6,21,6,20, +21,17,35,17,51,19,30,1,31,1,54,55,62,3,53,19,51,17,1,17,35,17,35,53,33,21, +6,155,5,4,4,5,2,230,108,163,2,24,14,17,20,1,1,128,190,223,2,5,2,6,20,16,7, +13,11,7,168,184,251,40,134,255,2,138,2,122,1,169,194,11,11,9,18,5,253,203, +1,157,5,64,38,44,55,10,10,8,18,6,253,201,3,7,253,205,4,13,7,18,51,41,18,34, +28,18,2,1,157,252,249,2,152,253,104,2,152,111,111,0,0,0,0,1,0,108,0,0,5,184, +5,150,0,57,0,221,64,95,101,36,1,101,22,1,157,49,1,143,49,1,49,16,11,15,72, +157,9,1,143,9,1,9,16,11,15,72,116,3,132,3,2,54,3,1,54,2,118,2,2,54,56,118, +56,2,116,55,132,55,2,54,55,1,42,26,1,42,32,1,41,53,48,40,10,18,32,40,96,40, +112,40,144,40,4,47,18,111,18,127,18,159,18,4,40,18,40,18,24,34,91,16,53,1, +53,184,255,192,64,65,23,29,72,191,53,207,53,2,0,53,48,53,2,53,17,5,91,31, +24,63,24,79,24,143,24,191,24,207,24,223,24,7,111,24,127,24,159,24,239,24, +255,24,5,0,24,48,24,2,8,24,10,15,19,39,48,5,42,95,18,41,18,29,95,0,4,0,63, +237,63,51,237,23,50,1,47,94,93,93,113,253,196,47,93,93,43,114,237,17,57,57, +47,47,93,93,17,51,17,51,16,196,49,48,0,93,93,93,93,93,93,93,93,43,93,93,43, +93,93,93,93,1,50,30,2,21,20,14,2,7,54,55,62,1,59,1,21,33,53,62,3,53,52,46, +2,35,34,14,2,21,20,30,2,23,21,33,53,51,50,22,23,22,23,46,3,53,52,62,2,3,18, +151,241,168,90,59,109,157,99,42,39,33,71,23,244,253,179,96,139,89,42,61,116, +169,108,109,170,116,61,42,89,139,96,253,179,244,23,71,33,39,42,99,157,109, +59,90,168,241,5,150,86,162,234,147,106,191,167,138,54,2,3,2,4,156,224,51, +126,143,159,85,116,181,124,65,65,124,181,116,85,159,143,126,51,224,156,4, +2,3,2,54,138,167,191,106,147,234,162,86,0,0,0,2,0,88,255,222,4,124,4,72,0, +32,0,45,0,82,64,50,90,13,1,28,15,64,160,33,176,33,2,95,33,1,80,33,96,33,112, +33,3,33,47,128,32,47,1,45,208,17,1,17,5,16,45,45,22,39,10,16,22,21,27,1,6, +27,1,27,0,22,0,63,50,93,93,205,63,205,18,57,47,205,1,47,205,93,50,93,26,16, +220,93,113,113,26,205,50,49,48,93,5,34,46,2,53,52,62,2,51,50,30,2,21,33,17, +30,3,51,50,62,2,55,23,14,3,19,17,46,3,35,34,14,2,7,17,2,107,130,198,134,69, +95,152,189,95,112,194,142,81,252,197,22,64,78,88,46,75,116,93,76,35,72,36, +84,109,143,203,19,59,77,92,53,51,87,74,60,24,34,93,157,204,111,147,213,139, +66,79,146,210,130,254,156,24,45,35,20,31,60,87,56,42,57,100,76,44,2,138,1, +21,20,42,34,22,19,32,42,24,254,234,0,0,0,255,255,0,80,255,246,6,78,5,129, +16,38,0,121,0,0,16,39,2,20,2,249,0,0,17,7,2,144,3,204,253,206,0,63,64,40, +4,3,2,111,15,1,47,15,1,15,1,191,12,1,128,12,1,112,12,1,96,12,1,64,12,1,16, +12,1,12,98,64,11,11,72,4,3,2,60,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93, +53,17,93,93,53,53,53,0,0,0,255,255,0,61,255,246,6,78,5,141,16,39,2,20,2,249, +0,0,16,39,2,144,3,204,253,206,17,6,0,115,34,0,0,63,64,40,1,3,2,111,49,1,47, +49,1,49,0,191,1,1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,141,64,11,11,72, +1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53, +0,0,0,255,255,0,93,255,246,6,78,5,129,16,39,2,20,2,249,0,0,16,39,2,144,3, +204,253,206,17,6,2,142,40,0,0,63,64,40,1,3,2,111,49,1,47,49,1,49,0,191,1, +1,128,1,1,112,1,1,96,1,1,64,1,1,16,1,1,1,126,64,11,11,72,1,3,2,49,24,0,63, +53,53,53,1,43,17,93,93,93,93,93,93,53,17,93,93,53,53,53,0,0,0,255,255,0,145, +255,246,6,78,5,129,16,39,2,20,2,189,0,0,16,39,2,144,3,204,253,206,17,6,2, +143,102,0,0,47,64,28,1,3,2,111,49,1,47,49,1,49,0,191,1,1,128,1,1,1,102,64, +11,11,72,1,3,2,49,24,0,63,53,53,53,1,43,17,93,93,53,17,93,93,53,53,53,0,0, +0,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3,128,16,7,17,16,0,47, +205,1,47,205,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51,14, +1,7,33,21,2,129,29,59,31,72,58,130,82,82,130,58,72,31,59,29,3,221,1,41,34, +98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1,16,255,195,2,240,4,127, +0,17,0,26,64,10,15,64,0,0,15,12,3,17,128,7,0,47,26,205,204,50,57,57,1,47, +26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,35,1,213,34,98, +65,68,112,42,36,42,112,68,65,98,34,86,3,160,29,59,31,72,58,130,82,82,130, +58,72,31,59,29,252,35,0,1,1,162,0,100,6,94,2,68,0,17,0,24,64,9,0,15,12,3, +128,7,17,16,17,0,47,205,1,47,221,26,204,50,57,57,49,48,1,46,1,39,51,30,1, +23,21,14,1,7,35,62,1,55,33,53,5,127,29,59,31,72,58,130,82,82,130,58,72,31, +59,29,252,35,1,127,34,98,65,68,112,42,36,42,112,68,65,98,34,86,0,0,0,1,1, +16,255,195,2,240,4,127,0,17,0,26,64,10,17,64,16,15,0,3,12,128,8,16,0,47,221, +26,204,50,57,57,1,47,26,205,49,48,37,62,1,55,21,14,1,7,35,46,1,39,53,30,1, +23,17,51,2,43,34,98,65,68,112,42,36,42,112,68,65,98,34,86,162,29,59,31,72, +58,130,82,82,130,58,72,31,59,29,3,221,0,0,1,1,162,0,100,6,94,2,68,0,31,0, +36,64,15,16,31,28,19,128,23,64,15,0,3,12,128,8,0,15,0,47,205,1,47,26,204, +50,57,57,26,221,26,204,50,57,57,49,48,1,30,1,23,35,46,1,39,53,62,1,55,51, +14,1,7,33,46,1,39,51,30,1,23,21,14,1,7,35,62,1,55,2,129,29,59,31,72,58,130, +82,82,130,58,72,31,59,29,2,254,29,59,31,72,58,130,82,82,130,58,72,31,59,29, +1,41,34,98,65,68,112,42,36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112, +68,65,98,34,0,0,0,1,1,16,255,195,2,240,4,127,0,31,0,38,64,16,15,64,0,31,16, +19,28,128,24,64,0,15,12,3,128,7,0,47,26,204,50,57,57,26,221,26,204,50,57, +57,1,47,26,205,49,48,1,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55, +21,14,1,7,35,46,1,39,53,30,1,23,1,213,34,98,65,68,112,42,36,42,112,68,65, +98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,3,160,29,59,31,72,58,130,82, +82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82,130,58,72,31,59,29,0, +2,1,16,255,72,2,240,4,127,0,3,0,35,0,40,64,17,1,19,0,4,35,20,23,32,28,3,0, +28,4,19,16,7,11,0,47,204,50,57,57,221,222,205,16,204,50,57,57,1,47,51,205, +50,49,48,5,33,21,33,19,14,1,7,53,62,1,55,51,30,1,23,21,46,1,39,17,62,1,55, +21,14,1,7,35,46,1,39,53,30,1,23,1,16,1,224,254,32,197,34,98,65,68,112,42, +36,42,112,68,65,98,34,34,98,65,68,112,42,36,42,112,68,65,98,34,104,80,4,88, +29,59,31,72,58,130,82,82,130,58,72,31,59,29,253,2,29,59,31,72,58,130,82,82, +130,58,72,31,59,29,0,0,2,0,56,255,229,3,186,5,197,0,47,0,69,0,222,64,93,156, +19,172,19,2,154,6,170,6,2,122,33,138,33,2,68,24,14,17,72,85,20,101,20,149, +20,165,20,4,140,7,1,74,7,90,7,122,7,3,74,56,90,56,2,67,56,11,15,72,58,67, +1,42,12,58,12,74,12,3,37,45,53,45,149,45,165,45,4,32,39,48,39,2,39,39,15, +169,48,249,48,2,40,48,1,48,28,0,70,64,96,31,1,31,184,255,192,64,64,18,21, +72,15,31,1,31,64,12,17,72,31,71,128,60,71,63,15,1,15,64,12,17,72,15,79,71, +1,39,34,80,43,53,81,27,0,22,64,22,128,22,192,22,4,7,22,22,47,43,111,43,223, +43,3,15,43,191,43,2,43,65,80,10,22,0,63,237,47,93,113,57,47,94,93,51,237, +16,237,50,1,93,47,43,93,237,26,16,220,43,93,43,113,26,237,51,51,113,113,18, +57,47,93,49,48,0,93,1,93,93,43,0,93,1,93,93,0,93,1,43,93,93,93,1,20,14,2, +7,14,3,35,34,46,2,53,52,62,4,51,50,30,2,23,51,62,1,53,52,38,35,34,14,2,7, +55,62,1,51,50,30,2,3,46,3,35,34,14,4,21,20,30,2,51,50,62,2,3,186,7,13,18, +11,31,96,130,162,97,93,127,78,35,22,47,73,102,132,83,42,77,64,50,16,4,1,3, +130,129,28,59,58,55,22,36,42,116,67,113,154,94,41,211,8,36,51,64,36,53,86, +67,49,32,15,21,42,65,44,66,108,83,56,3,170,46,104,106,106,48,128,206,144, +77,63,107,138,75,60,143,144,134,104,63,26,48,67,42,25,58,34,196,209,11,19, +28,17,147,23,39,88,149,195,254,147,42,74,55,32,51,84,110,116,116,48,53,91, +67,38,99,161,205,0,0,0,2,0,4,0,0,4,225,5,129,0,5,0,18,0,244,64,27,74,7,90, +7,106,7,3,69,17,85,17,101,17,3,3,56,8,1,55,16,1,6,24,14,17,72,18,184,255, +232,64,157,14,17,72,102,2,1,39,2,71,2,87,2,3,105,1,1,40,1,72,1,88,1,3,2,1, +12,12,0,6,59,3,1,20,3,1,244,3,1,107,3,155,3,187,3,235,3,4,52,3,84,3,2,0,3, +1,11,2,3,18,15,0,31,0,47,0,3,18,0,15,20,47,20,127,20,3,175,20,191,20,223, +20,255,20,4,32,20,112,20,144,20,3,15,20,63,20,143,20,3,58,175,20,207,20,223, +20,255,20,4,64,20,96,20,144,20,3,15,20,95,20,2,143,20,159,20,191,20,223,20, +4,0,20,32,20,80,20,112,20,4,0,3,6,3,18,95,5,18,12,32,19,22,72,153,12,1,12, +1,3,0,63,51,93,43,63,237,23,50,1,93,93,113,114,114,94,93,113,113,114,47,94, +93,51,47,95,94,93,93,93,93,113,113,51,18,57,61,47,51,51,49,48,93,93,93,93, +43,43,93,93,95,93,93,55,1,51,1,21,33,37,1,46,3,39,14,3,7,1,5,2,5,217,1,254, +251,35,4,21,254,174,16,29,22,15,1,2,14,23,28,16,254,173,141,4,244,251,12, +141,156,3,94,40,82,69,48,8,8,49,70,82,40,252,164,0,1,0,235,254,78,5,172,5, +129,0,7,0,54,64,36,3,90,79,4,175,4,191,4,207,4,4,4,7,90,32,0,1,15,0,1,0,0, +32,0,192,0,208,0,4,0,2,95,5,3,4,0,0,47,50,63,237,1,47,93,113,113,237,47,93, +237,49,48,1,17,33,17,35,17,33,17,4,244,252,182,191,4,193,254,78,6,145,249, +111,7,51,248,205,0,0,0,0,1,0,154,254,78,5,48,5,129,0,11,0,170,64,9,134,8, +150,8,2,163,9,1,9,184,255,192,64,26,13,16,72,163,7,1,2,144,7,1,114,7,130, +7,2,100,7,1,53,7,69,7,85,7,3,3,184,255,240,64,74,9,17,72,41,1,57,1,2,1,16, +12,17,72,8,143,6,159,6,175,6,3,2,72,17,73,15,2,127,2,2,2,6,2,6,0,207,10,1, +0,10,64,10,2,10,7,3,9,3,9,207,0,1,0,0,64,0,2,7,0,32,13,1,3,7,95,2,8,0,4,3, +1,9,95,0,0,47,237,57,63,18,57,57,237,57,1,93,47,94,93,93,51,51,47,47,51,47, +93,93,18,57,57,47,47,93,43,93,51,49,48,0,43,93,43,1,93,93,93,93,95,93,43, +93,93,19,53,9,1,53,33,21,33,9,1,33,21,154,2,123,253,149,4,66,252,178,2,72, +253,168,3,162,254,78,109,3,48,3,44,106,152,253,4,252,249,152,0,0,0,0,1,0, +101,2,96,4,72,2,242,0,3,0,32,64,20,0,2,32,2,80,2,112,2,4,2,16,0,32,0,2,0, +0,173,1,179,0,63,237,1,47,93,47,93,49,48,19,53,33,21,101,3,227,2,96,146,146, +0,0,0,0,1,0,51,255,242,4,98,6,84,0,8,0,185,185,0,0,255,232,64,135,14,17,72, +9,1,57,1,73,1,3,9,1,0,4,6,1,6,6,8,16,111,8,143,8,175,8,207,8,239,8,5,15,8, +47,8,79,8,111,8,143,8,5,8,95,2,1,2,2,15,3,47,3,79,3,111,3,4,11,3,175,10,1, +48,10,80,10,112,10,144,10,4,111,10,143,10,2,16,10,48,10,2,240,10,1,15,10, +47,10,79,10,3,57,239,10,1,176,10,208,10,2,143,10,175,10,207,10,239,10,4,112, +10,1,47,10,79,10,111,10,143,10,175,10,5,2,175,31,5,1,5,5,1,7,179,6,1,0,47, +51,63,18,57,47,93,237,1,93,113,113,114,114,94,93,93,113,113,114,114,47,94, +93,51,47,93,47,93,113,56,57,61,47,93,51,51,49,48,94,93,43,5,35,1,35,53,33, +19,1,51,2,110,106,254,229,182,1,14,242,1,174,129,14,3,24,117,253,78,5,135, +0,3,0,87,0,203,5,93,3,215,0,35,0,51,0,67,0,114,64,75,137,50,1,53,67,69,67, +2,10,15,1,10,3,1,5,33,1,5,21,1,39,26,8,52,4,18,0,0,47,32,47,64,47,112,47, +4,47,60,18,36,224,55,1,55,23,42,239,65,1,65,8,39,52,26,4,5,63,13,1,13,64, +18,21,72,0,13,80,13,2,13,31,15,23,1,23,0,47,93,51,220,93,43,113,50,23,57, +205,93,50,16,205,93,50,1,47,205,47,93,205,17,23,57,49,48,0,93,93,93,93,93, +1,93,1,20,14,2,35,34,38,39,14,3,35,34,46,2,53,52,62,2,51,50,22,23,62,3,51, +50,30,2,37,34,6,7,30,1,51,50,62,2,53,52,46,2,5,46,1,35,34,14,2,21,20,30,2, +51,50,54,5,93,44,82,115,70,97,168,70,32,75,84,90,46,69,115,83,46,44,82,116, +71,94,168,67,31,75,84,94,51,69,114,81,45,254,179,70,119,56,51,119,77,43,71, +51,27,29,51,71,254,93,51,119,78,43,70,49,27,25,48,71,47,70,120,2,78,78,141, +106,62,133,149,63,102,72,39,55,100,143,89,81,142,104,60,135,148,62,102,73, +40,55,101,143,168,126,130,128,128,40,70,94,54,54,92,69,39,250,128,128,40, +70,94,54,51,93,69,41,126,0,0,0,1,1,152,0,0,6,96,4,199,0,5,0,13,179,2,5,2, +5,0,47,205,1,47,205,49,48,1,51,17,33,21,33,1,152,94,4,106,251,56,4,199,251, +151,94,0,0,0,0,1,1,22,255,254,4,170,4,8,0,25,0,35,64,18,75,22,91,22,2,75, +16,91,16,2,25,0,12,13,13,0,19,6,0,47,205,47,51,1,47,205,47,205,49,48,0,93, +93,5,17,52,62,2,51,50,30,2,21,17,35,17,52,46,2,35,34,14,2,21,17,1,22,68,122, +167,98,99,169,123,70,103,53,95,130,78,78,130,94,52,2,2,0,116,192,138,76,76, +138,192,116,254,0,2,2,98,155,108,57,56,108,156,100,254,0,0,0,1,255,158,254, +78,2,148,5,227,0,35,2,3,64,30,10,34,26,34,42,34,3,5,16,21,16,37,16,3,9,3, +218,37,1,201,37,1,154,37,170,37,186,37,3,37,184,1,0,64,162,225,228,72,76, +37,1,0,47,37,63,37,2,9,37,1,220,37,64,211,217,72,37,64,205,209,72,134,37, +1,25,37,41,37,57,37,3,11,37,1,251,37,1,233,37,1,37,64,188,191,72,107,37,123, +37,139,37,3,93,37,1,75,37,1,41,37,57,37,2,27,37,1,9,37,1,249,37,1,37,128, +170,177,72,109,37,1,37,128,164,168,72,9,37,1,163,37,128,156,162,72,189,37, +1,121,37,153,37,169,37,3,75,37,91,37,107,37,3,37,192,140,147,72,155,37,171, +37,187,37,3,125,37,141,37,2,107,37,1,93,37,1,38,37,54,37,70,37,3,228,37,1, +214,37,1,180,37,196,37,2,6,37,1,112,37,184,255,192,64,110,119,122,72,37,64, +101,107,72,219,37,1,118,37,166,37,2,9,37,25,37,41,37,3,233,37,1,37,64,79, +82,72,37,128,74,78,72,25,37,41,37,2,11,37,1,251,37,1,217,37,233,37,2,171, +37,187,37,203,37,3,153,37,1,37,128,60,63,72,41,37,57,37,73,37,3,11,37,27, +37,2,55,233,37,249,37,2,187,37,203,37,219,37,3,141,37,157,37,173,37,3,123, +37,1,109,37,1,1,95,37,1,37,184,255,128,179,39,43,72,37,184,255,192,64,13, +34,38,72,144,37,160,37,2,2,16,37,1,37,184,255,192,64,46,28,31,72,223,37,1, +96,37,112,37,160,37,176,37,192,37,5,15,37,31,37,47,37,3,7,32,22,144,22,2, +22,22,31,70,12,47,4,159,4,2,4,4,32,12,1,12,184,255,192,64,15,16,19,72,12, +25,80,64,18,128,18,2,18,7,80,0,0,47,237,47,93,237,1,47,43,93,51,47,93,16, +237,50,47,93,94,93,93,93,43,113,95,113,43,43,114,95,114,114,114,114,114,94, +93,93,43,93,93,93,93,113,113,43,43,113,114,114,114,43,43,94,93,93,93,93,113, +113,113,113,113,43,114,114,114,43,94,93,43,93,43,93,113,113,113,113,113,113, +43,113,113,114,114,114,43,43,94,93,93,95,93,43,93,93,93,49,48,0,95,94,93, +93,19,34,38,39,53,30,1,51,50,62,2,53,3,52,62,2,51,50,22,23,21,46,1,35,34, +14,2,21,17,20,14,2,36,36,75,23,20,62,35,51,66,39,16,2,50,90,125,75,34,75, +22,18,61,36,51,66,39,16,50,89,124,254,78,11,8,147,8,16,37,64,84,48,4,188, +94,134,86,40,9,9,148,10,17,40,65,84,44,251,66,94,134,86,41,0,0,0,2,0,56,1, +80,4,44,3,244,0,33,0,67,1,31,64,26,36,16,12,16,72,2,16,12,16,72,65,24,11, +17,72,66,48,9,17,72,61,48,9,17,72,42,184,255,208,179,9,17,72,48,184,255,208, +64,19,9,17,72,31,24,9,17,72,32,48,9,17,72,26,48,9,17,72,13,184,255,232,179, +13,17,72,14,184,255,208,179,9,13,72,8,184,255,208,179,14,17,72,8,184,255, +208,64,41,9,12,72,63,16,28,48,28,80,28,3,0,28,16,28,64,28,96,28,128,28,160, +28,240,28,7,28,45,11,64,12,17,72,11,47,69,1,59,173,64,45,184,255,192,180, +35,60,72,45,34,184,255,192,179,23,28,72,34,184,255,192,64,27,16,20,72,34, +128,62,64,41,60,72,62,40,173,143,49,1,32,49,48,49,2,49,15,25,173,64,11,184, +255,192,180,39,60,72,11,0,184,255,192,179,23,28,72,0,184,255,192,64,29,16, +20,72,0,128,28,64,41,60,72,28,6,173,15,15,207,15,2,15,64,23,28,72,15,64,11, +19,72,15,0,47,43,43,93,237,196,43,26,221,43,43,196,43,26,237,16,220,93,93, +237,196,43,26,221,43,43,196,43,26,237,1,93,47,43,51,47,93,113,51,49,48,0, +43,43,43,43,43,43,43,43,43,43,43,43,43,43,1,34,38,39,46,1,35,34,14,2,7,53, +62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,34,38,39,46,1,35,34,14,2,7, +53,62,1,51,50,30,2,23,30,3,51,50,54,55,21,14,3,3,40,69,145,73,65,107,45,38, +65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51,23,69,123,52,32,59,61,68, +40,69,145,73,65,107,45,38,65,60,56,29,50,132,81,40,80,77,75,37,21,50,51,51, +23,69,123,52,32,59,61,68,2,246,43,26,22,23,12,22,33,21,144,37,47,13,21,27, +13,8,15,14,8,51,43,149,23,30,19,8,254,90,44,26,23,24,12,23,32,21,141,38,46, +13,20,26,13,8,15,14,8,50,42,147,23,32,19,8,0,1,0,65,0,55,4,36,5,16,0,19,0, +162,64,108,53,2,1,58,11,1,60,12,1,42,12,1,3,3,6,7,10,11,2,11,0,17,16,13,12, +1,12,12,11,1,2,4,9,19,100,14,116,14,2,80,14,1,2,48,14,1,0,14,16,14,32,14, +96,14,4,14,4,111,9,127,9,2,95,9,111,9,2,9,16,7,8,173,9,0,1,2,3,4,4,173,17, +6,31,5,47,5,95,5,111,5,223,5,5,5,10,11,12,13,4,80,9,208,9,2,15,9,1,9,0,47, +93,93,23,51,222,93,50,50,237,23,50,16,237,50,50,1,47,93,113,51,47,93,113, +95,113,113,51,18,23,57,16,135,192,192,192,192,16,135,192,192,192,192,49,48, +1,95,93,93,93,93,1,3,35,19,35,53,33,19,33,53,33,19,51,3,33,21,33,3,33,21, +1,192,152,145,151,237,1,55,190,254,11,2,61,154,143,152,1,21,254,162,191,2, +29,1,88,254,223,1,33,148,1,108,148,1,36,254,220,148,254,148,148,0,0,0,0,3, +0,100,0,244,4,71,4,80,0,3,0,7,0,11,0,49,64,27,11,7,2,8,4,0,8,173,9,9,1,5, +173,63,4,1,4,0,173,15,1,31,1,63,1,3,1,0,47,93,237,47,93,237,17,57,47,237, +1,47,51,51,47,51,51,49,48,19,53,33,21,1,53,33,21,1,53,33,21,100,3,227,252, +29,3,227,252,29,3,227,3,188,148,148,253,56,148,148,1,100,148,148,0,0,0,2, +0,63,0,0,4,36,4,207,0,6,0,10,0,123,185,0,5,255,216,64,17,18,22,72,3,40,18, +22,72,0,40,18,22,72,137,0,1,1,184,255,216,64,63,18,22,72,134,1,1,10,48,2, +80,2,2,0,2,16,2,32,2,64,2,96,2,128,2,160,2,7,2,7,7,0,64,12,15,72,0,8,173, +7,79,6,95,6,143,6,3,6,64,2,80,2,128,2,3,2,1,0,80,4,128,4,2,4,0,25,47,93,51, +51,205,93,205,93,24,47,237,1,47,43,51,47,47,93,113,51,49,48,0,93,43,93,43, +43,43,19,53,1,21,9,1,21,5,53,33,21,65,3,227,252,166,3,90,252,27,3,227,2,119, +205,1,139,154,254,168,254,168,153,236,145,145,0,0,2,0,65,0,0,4,36,4,207,0, +6,0,10,0,121,185,0,1,255,216,64,17,18,22,72,3,40,18,22,72,6,40,18,22,72,137, +6,1,5,184,255,216,64,62,18,22,72,134,5,1,9,48,6,80,6,2,0,6,16,6,32,6,64,6, +96,6,128,6,160,6,7,6,7,0,64,12,15,72,0,8,173,7,6,5,64,4,80,4,128,4,3,4,79, +0,95,0,143,0,3,0,80,2,128,2,2,2,0,25,47,93,205,93,205,93,51,51,24,47,237, +1,47,43,51,47,93,113,51,49,48,0,93,43,93,43,43,43,55,53,9,1,53,1,21,1,53, +33,21,65,3,90,252,166,3,227,252,29,3,227,236,153,1,88,1,88,154,254,117,205, +253,137,145,145,0,0,0,0,2,0,157,0,0,4,55,4,129,0,4,0,9,0,35,64,18,105,9,121, +9,2,105,7,121,7,2,6,4,5,0,2,8,5,0,0,47,205,47,205,1,47,205,221,205,49,48, +0,93,93,51,17,9,1,17,37,33,17,9,1,157,1,205,1,205,252,182,2,250,254,131,254, +131,2,123,2,6,253,250,253,133,82,2,6,1,170,254,86,0,0,0,0,1,0,100,0,180,4, +71,2,242,0,5,0,19,183,5,170,0,2,0,4,173,1,0,47,237,47,1,47,47,237,49,48,55, +17,33,21,33,17,100,3,227,252,174,180,2,62,146,254,84,0,0,0,1,2,34,253,154, +3,210,6,170,0,23,0,29,182,4,32,8,11,72,9,0,184,1,0,180,1,19,12,6,1,0,47,47, +205,205,1,47,237,204,49,48,43,1,35,17,52,55,54,51,50,22,21,20,6,35,34,39, +46,1,39,38,35,34,7,6,21,2,181,147,84,82,128,63,75,51,37,30,13,8,26,20,33, +16,36,9,6,253,154,7,86,196,123,123,63,48,40,52,10,4,24,22,39,39,35,105,0, +0,0,1,1,5,253,154,2,181,6,170,0,28,0,32,185,0,4,255,224,180,8,11,72,12,2, +184,1,0,180,28,24,17,7,0,0,47,47,205,205,1,47,253,204,49,48,43,1,51,17,20, +7,14,1,35,34,46,2,53,52,62,2,51,50,23,30,1,23,22,51,50,55,54,53,2,34,147, +90,40,103,62,30,50,37,20,14,23,31,18,33,26,5,21,15,31,16,37,8,7,6,170,248, +168,205,125,56,54,16,29,39,24,20,34,24,14,16,2,23,20,37,41,31,106,0,0,0,1, +255,246,2,37,5,181,2,182,0,3,0,22,180,3,5,0,4,0,184,1,2,177,1,252,0,63,237, +17,1,51,17,51,49,48,3,53,33,21,10,5,191,2,37,145,145,0,0,1,1,216,253,147, +2,105,7,72,0,3,0,24,187,0,2,1,0,0,3,1,6,180,4,3,254,0,250,0,63,63,1,16,246, +237,49,48,1,51,17,35,1,216,145,145,7,72,246,75,0,0,0,1,2,141,253,147,5,181, +2,182,0,5,0,34,178,2,7,3,186,1,0,0,0,1,6,179,6,5,254,3,184,1,2,177,0,252, +0,63,237,63,1,16,246,237,17,51,49,48,1,33,21,33,17,35,2,141,3,40,253,105, +145,2,182,145,251,110,0,0,0,1,255,246,253,147,3,30,2,182,0,5,0,34,187,0,2, +1,0,0,5,1,6,181,6,0,6,4,254,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16,246, +237,49,48,3,53,33,17,35,17,10,3,40,145,2,37,145,250,221,4,146,0,0,0,0,1,2, +141,2,37,5,181,7,72,0,5,0,34,178,4,7,2,189,1,0,0,5,1,6,0,6,0,5,1,2,179,2, +252,0,250,0,63,63,237,1,16,246,237,17,51,49,48,1,51,17,33,21,33,2,141,145, +2,151,252,216,7,72,251,110,145,0,0,0,1,255,246,2,37,3,30,7,72,0,5,0,34,187, +0,5,1,0,0,2,1,6,181,6,0,6,3,250,5,184,1,2,177,2,252,0,63,237,63,17,1,51,16, +244,237,49,48,3,53,33,17,51,17,10,2,151,145,2,37,145,4,146,250,221,0,0,0, +0,1,2,141,253,147,5,181,7,72,0,7,0,39,179,4,9,5,1,186,1,0,0,0,1,6,179,8,7, +254,5,184,1,2,179,2,252,0,250,0,63,63,237,63,1,16,246,237,50,17,51,49,48, +1,51,17,33,21,33,17,35,2,141,145,2,151,253,105,145,7,72,251,110,145,251,110, +0,1,255,246,253,147,3,30,7,72,0,7,0,39,177,7,4,186,1,0,0,2,1,6,183,8,0,8, +6,254,3,250,7,184,1,2,177,2,252,0,63,237,63,63,17,1,51,16,244,237,51,49,48, +3,53,33,17,51,17,35,17,10,2,151,145,145,2,37,145,4,146,246,75,4,146,0,0,1, +255,246,253,147,5,181,2,182,0,7,0,40,178,3,9,4,186,1,0,0,7,1,6,182,8,0,8, +6,254,4,0,184,1,2,177,1,252,0,63,237,50,63,17,1,51,16,246,237,17,51,49,48, +3,53,33,21,33,17,35,17,10,5,191,253,105,145,2,37,145,145,251,110,4,146,0, +1,255,246,2,37,5,181,7,72,0,7,0,40,178,7,9,5,186,1,0,0,2,1,6,182,8,0,8,3, +250,5,0,184,1,2,177,1,252,0,63,237,51,63,17,1,51,16,244,237,17,51,49,48,3, +53,33,17,51,17,33,21,10,2,151,145,2,151,2,37,145,4,146,251,110,145,0,1,255, +246,253,147,5,181,7,72,0,11,0,51,179,7,13,5,8,187,1,0,0,2,0,11,1,6,64,9,12, +0,12,10,254,3,250,8,11,184,1,2,178,5,2,252,0,63,51,237,50,63,63,17,1,51,16, +246,50,237,50,17,51,49,48,3,53,33,17,51,17,33,21,33,17,35,17,10,2,151,145, +2,151,253,105,145,2,37,145,4,146,251,110,145,251,110,4,146,0,0,0,2,255,246, +1,113,5,181,3,106,0,3,0,7,0,37,183,3,7,7,9,0,4,8,4,184,1,2,178,5,253,0,184, +1,2,177,1,251,0,63,237,63,237,17,1,51,50,17,51,17,51,49,48,3,53,33,21,1,53, +33,21,10,5,191,250,65,5,191,2,217,145,145,254,152,145,145,0,2,1,217,253,147, +3,210,7,72,0,3,0,7,0,42,65,9,0,5,1,0,0,4,1,7,0,8,0,1,1,0,0,0,1,4,182,8,7, +3,254,4,0,250,0,63,50,63,51,1,16,246,237,16,244,237,49,48,1,51,17,35,1,51, +17,35,1,217,145,145,1,104,145,145,7,72,246,75,9,181,246,75,0,0,0,1,2,141, +253,147,5,181,3,106,0,9,0,49,181,2,6,6,11,7,3,186,1,0,0,0,1,6,179,10,9,254, +7,184,1,2,178,4,253,3,184,1,2,177,0,251,0,63,237,63,237,63,1,16,246,237,50, +17,51,17,51,49,48,1,33,21,33,21,33,21,33,17,35,2,141,3,40,253,105,2,151,253, +105,145,3,106,145,215,145,252,34,0,0,1,1,217,253,147,5,181,2,182,0,9,0,51, +178,1,11,6,191,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,178,10,2,6,184,1,2,180,9, +252,4,8,254,0,63,51,63,237,50,1,16,244,237,16,246,237,17,51,49,48,1,21,33, +17,35,17,35,17,35,17,5,181,254,29,145,215,145,2,182,145,251,110,4,146,251, +110,5,35,0,0,0,0,2,1,217,253,147,5,181,3,106,0,5,0,11,0,63,180,2,8,8,13,9, +65,11,1,0,0,6,1,7,0,12,0,3,1,0,0,0,1,4,0,12,0,9,1,2,181,6,253,11,5,254,3, +184,1,2,177,0,251,0,63,237,63,51,63,237,1,16,246,237,16,244,237,17,51,17, +51,49,48,1,33,21,33,17,35,1,33,21,33,17,35,1,217,3,220,252,181,145,1,104, +2,116,254,29,145,3,106,145,250,186,4,111,145,252,34,0,0,1,255,246,253,147, +3,30,3,106,0,9,0,49,177,9,6,186,1,0,0,3,1,6,183,10,4,0,0,10,8,254,3,184,1, +2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63,17,1,51,17,51,16,244,237, +51,49,48,3,53,33,53,33,53,33,17,35,17,10,2,151,253,105,3,40,145,1,113,145, +215,145,250,41,3,222,0,0,0,1,255,246,253,147,3,210,2,182,0,9,0,52,65,9,0, +6,1,0,0,9,1,4,0,10,0,2,1,0,0,5,1,7,183,10,0,10,4,8,254,6,0,184,1,2,177,1, +252,0,63,237,50,63,51,17,1,51,16,244,237,16,246,237,49,48,3,53,33,17,35,17, +35,17,35,17,10,3,220,145,215,145,2,37,145,250,221,4,146,251,110,4,146,0,0, +0,0,2,255,246,253,147,3,210,3,106,0,5,0,11,0,63,180,4,9,9,12,11,65,11,1,0, +0,8,1,4,0,12,0,0,1,0,0,3,1,7,0,12,0,9,1,2,181,10,253,2,7,254,4,184,1,2,177, +5,251,0,63,237,63,51,63,237,1,16,244,237,16,246,237,17,51,17,51,49,48,1,17, +35,17,33,53,1,35,17,33,53,33,3,210,145,252,181,2,116,145,254,29,2,116,3,106, +250,41,5,70,145,250,41,3,222,145,0,0,1,2,141,1,113,5,181,7,72,0,9,0,49,181, +4,8,8,11,2,6,189,1,0,0,9,1,6,0,10,0,9,1,2,178,6,253,5,184,1,2,179,2,251,0, +250,0,63,63,237,63,237,1,16,246,237,50,17,51,17,51,49,48,1,51,17,33,21,33, +21,33,21,33,2,141,145,2,151,253,105,2,151,252,216,7,72,252,34,145,215,145, +0,0,1,1,217,2,37,5,181,7,72,0,9,0,52,178,4,11,2,65,11,1,0,0,9,1,7,0,10,0, +8,1,0,0,5,1,4,0,10,0,5,1,2,181,2,8,252,0,6,250,0,63,51,63,51,237,1,16,246, +237,16,244,237,17,51,49,48,1,51,17,33,21,33,17,51,17,51,3,65,145,1,227,252, +36,145,215,7,72,251,110,145,5,35,251,110,0,0,0,2,1,217,1,113,5,181,7,72,0, +5,0,11,0,63,180,10,4,4,13,8,65,11,1,0,0,11,1,7,0,12,0,2,1,0,0,5,1,4,0,12, +0,11,1,2,178,8,251,5,184,1,2,180,2,253,6,0,250,0,63,50,63,237,63,237,1,16, +246,237,16,244,237,17,51,17,51,49,48,1,51,17,33,21,33,1,51,17,33,21,33,1, +217,145,3,75,252,36,1,104,145,1,227,253,140,7,72,250,186,145,5,215,252,34, +145,0,0,1,255,246,1,113,3,30,7,72,0,9,0,50,188,0,9,1,0,0,6,0,2,1,6,183,10, +4,0,0,10,7,250,3,184,1,2,178,6,251,9,184,1,2,177,2,253,0,63,237,63,237,63, +17,1,51,17,51,16,244,50,237,49,48,3,53,33,53,33,53,33,17,51,17,10,2,151,253, +105,2,151,145,1,113,145,215,145,3,222,250,41,0,0,1,255,246,2,37,3,210,7,72, +0,9,0,52,65,9,0,0,1,0,0,7,1,7,0,10,0,6,1,0,0,3,1,4,183,10,1,10,8,4,250,6, +1,184,1,2,177,2,252,0,63,237,51,63,51,17,1,51,16,244,237,16,244,237,49,48, +1,33,53,33,17,51,17,51,17,51,3,210,252,36,1,227,145,215,145,2,37,145,4,146, +251,110,4,146,0,0,0,2,255,246,1,113,3,210,7,72,0,5,0,11,0,63,65,9,0,8,1,0, +0,11,1,4,0,12,0,0,1,0,0,3,1,7,181,12,9,1,1,12,9,184,1,2,181,10,251,4,6,250, +1,184,1,2,177,2,253,0,63,237,63,51,63,237,17,1,51,17,51,16,244,237,16,244, +237,49,48,1,33,53,33,17,51,33,51,17,33,53,33,3,210,252,36,3,75,145,254,7, +145,253,140,1,227,1,113,145,5,70,251,145,145,0,0,0,0,1,2,141,253,147,5,181, +7,72,0,11,0,54,182,4,8,8,13,6,2,10,186,1,0,0,11,1,6,179,12,11,254,9,184,1, +2,178,6,253,5,184,1,2,179,2,251,0,250,0,63,63,237,63,237,63,1,16,246,237, +50,50,17,51,17,51,49,48,1,51,17,33,21,33,21,33,21,33,17,35,2,141,145,2,151, +253,105,2,151,253,105,145,7,72,252,34,145,215,145,252,34,0,0,0,0,2,1,217, +253,147,5,181,7,72,0,7,0,11,0,56,178,4,13,10,186,1,0,0,11,1,4,178,12,2,6, +186,1,0,0,7,1,7,183,12,7,11,254,0,8,250,5,184,1,2,177,2,252,0,63,237,63,51, +63,51,1,16,244,237,50,16,246,237,17,51,49,48,1,51,17,33,21,33,17,35,1,51, +17,35,3,65,145,1,227,254,29,145,254,152,145,145,7,72,251,110,145,251,110, +9,181,246,75,0,0,3,1,217,253,147,5,181,7,72,0,3,0,9,0,15,0,73,181,14,6,6, +17,12,8,65,12,1,0,0,15,0,9,1,7,0,16,0,0,1,0,0,1,1,4,0,16,0,15,1,2,178,12, +251,7,184,1,2,183,4,253,10,2,250,9,1,254,0,63,51,63,51,63,237,63,237,1,16, +246,237,16,244,50,237,50,17,51,17,51,49,48,1,35,17,51,19,33,21,33,17,35,17, +51,17,33,21,33,2,106,145,145,215,2,116,254,29,145,145,1,227,253,140,253,147, +9,181,250,186,145,252,34,9,181,252,34,145,0,1,255,246,253,147,3,30,7,72,0, +11,0,56,185,0,9,1,0,178,6,2,10,184,1,6,64,10,12,4,0,0,12,10,254,7,250,3,184, +1,2,178,6,251,11,184,1,2,177,2,253,0,63,237,63,237,63,63,17,1,51,17,51,16, +246,50,50,237,49,48,3,53,33,53,33,53,33,17,51,17,35,17,10,2,151,253,105,2, +151,145,145,1,113,145,215,145,3,222,246,75,3,222,0,0,0,2,255,246,253,147, +3,210,7,72,0,7,0,11,0,59,65,10,0,10,1,0,0,11,1,7,0,12,0,5,1,0,0,2,0,6,1,4, +64,10,12,0,12,11,6,254,8,3,250,7,184,1,2,177,2,252,0,63,237,63,51,63,51,17, +1,51,16,246,50,237,16,244,237,49,48,3,53,33,17,51,17,35,17,1,51,17,35,10, +1,227,145,145,1,104,145,145,2,37,145,4,146,246,75,4,146,5,35,246,75,0,0,0, +0,3,255,246,253,147,3,210,7,72,0,3,0,9,0,15,0,73,181,7,13,13,16,6,10,65,12, +1,0,0,9,0,11,1,4,0,16,0,2,1,0,0,3,1,7,0,16,0,12,1,2,181,15,253,3,11,254,6, +184,1,2,180,9,251,0,4,250,0,63,51,63,237,63,51,63,237,1,16,244,237,16,246, +50,237,50,17,51,17,51,49,48,1,51,17,35,1,51,17,33,53,33,19,35,17,33,53,33, +3,65,145,145,254,152,145,253,140,1,227,145,145,254,29,2,116,7,72,246,75,9, +181,251,145,145,250,41,3,222,145,0,0,0,2,255,246,253,147,5,181,3,106,0,7, +0,11,0,57,180,11,3,3,13,4,186,1,0,0,7,1,6,181,12,8,0,0,12,8,184,1,2,181,9, +251,6,254,4,0,184,1,2,177,1,253,0,63,237,50,63,63,237,17,1,51,17,51,16,246, +237,17,51,17,51,49,48,3,53,33,21,33,17,35,17,1,53,33,21,10,5,191,253,105, +145,253,105,5,191,1,113,145,145,252,34,3,222,1,104,145,145,0,0,1,255,246, +253,147,5,181,2,182,0,11,0,58,178,3,13,8,191,1,0,0,11,1,4,0,12,0,4,1,0,0, +7,1,7,64,9,12,0,12,6,10,254,8,4,0,184,1,2,177,1,252,0,63,237,50,50,63,51, +17,1,51,16,244,237,16,246,237,17,51,49,48,3,53,33,21,33,17,35,17,35,17,35, +17,10,5,191,254,29,145,215,145,2,37,145,145,251,110,4,146,251,110,4,146,0, +3,255,246,253,147,5,181,3,106,0,5,0,11,0,15,0,74,180,13,8,8,17,9,186,1,0, +0,6,1,7,181,16,14,3,3,16,5,189,1,0,0,2,1,4,0,16,0,14,1,2,179,15,251,9,3,184, +1,2,181,6,4,253,11,1,254,0,63,51,63,51,237,50,63,237,1,16,246,237,17,51,17, +51,16,244,237,17,51,17,51,49,48,1,35,17,33,53,33,51,33,21,33,17,35,1,21,33, +53,2,106,145,254,29,2,116,215,2,116,254,29,145,2,116,250,65,253,147,3,222, +145,145,252,34,5,215,145,145,0,0,0,0,2,255,246,1,113,5,181,7,72,0,7,0,11, +0,58,64,9,7,11,11,13,0,8,8,12,5,189,1,0,0,2,1,6,0,12,0,8,1,2,181,9,253,3, +250,5,0,184,1,2,177,1,251,0,63,237,51,63,63,237,1,16,244,237,17,51,17,51, +17,51,17,51,49,48,3,53,33,17,51,17,33,21,1,53,33,21,10,2,151,145,2,151,250, +65,5,191,2,217,145,3,222,252,34,145,254,152,145,145,0,1,255,246,2,37,5,181, +7,72,0,11,0,58,178,11,13,9,191,1,0,0,6,1,7,0,12,0,5,1,0,0,2,1,4,64,9,12,0, +12,7,3,250,9,5,0,184,1,2,177,1,252,0,63,237,51,51,63,51,17,1,51,16,244,237, +16,244,237,17,51,49,48,3,53,33,17,51,17,51,17,51,17,33,21,10,1,227,145,215, +145,1,227,2,37,145,4,146,251,110,4,146,251,110,145,0,3,255,246,1,113,5,181, +7,72,0,5,0,11,0,15,0,76,64,9,4,15,15,17,9,12,12,16,8,65,11,1,0,0,11,1,4,0, +16,0,2,1,0,0,5,1,7,0,16,0,12,1,2,179,13,253,5,9,184,1,2,181,2,10,251,0,6, +250,0,63,51,63,51,237,50,63,237,1,16,244,237,16,244,237,17,51,17,51,17,51, +17,51,49,48,1,51,17,33,21,33,1,51,17,33,53,33,1,53,33,21,3,65,145,1,227,253, +140,254,152,145,253,140,1,227,254,29,5,191,7,72,252,34,145,4,111,251,145, +145,254,7,145,145,0,0,0,1,255,246,253,147,5,181,7,72,0,19,0,76,182,11,15, +15,21,13,9,16,184,1,0,178,6,2,19,184,1,6,64,11,20,4,0,0,20,18,254,7,250,12, +4,184,1,2,180,9,5,251,16,0,184,1,2,178,13,1,253,0,63,51,237,50,63,51,237, +50,63,63,17,1,51,17,51,16,246,50,50,237,50,50,17,51,17,51,49,48,3,53,33,53, +33,53,33,17,51,17,33,21,33,21,33,21,33,17,35,17,10,2,151,253,105,2,151,145, +2,151,253,105,2,151,253,105,145,1,113,145,215,145,3,222,252,34,145,215,145, +252,34,3,222,0,0,1,255,246,253,147,5,181,7,72,0,19,0,77,179,4,21,18,9,187, +1,0,0,15,0,12,1,4,178,20,2,5,187,1,0,0,19,0,8,1,7,64,9,20,13,20,0,16,250, +9,5,13,184,1,2,182,18,2,14,252,7,11,254,0,63,51,63,51,51,237,50,50,63,51, +17,1,51,16,244,50,237,50,16,246,50,237,50,17,51,49,48,1,51,17,33,21,33,17, +35,17,35,17,35,17,33,53,33,17,51,17,51,3,65,145,1,227,254,29,145,215,145, +254,29,1,227,145,215,7,72,251,110,145,251,110,4,146,251,110,4,146,145,4,146, +251,110,0,0,0,0,4,255,246,253,147,5,181,7,72,0,5,0,11,0,17,0,23,0,93,181, +4,14,14,25,2,15,187,1,0,0,5,0,12,1,7,182,24,21,9,9,24,20,11,187,1,0,0,23, +0,8,1,4,178,24,5,21,184,1,2,183,2,22,251,0,18,250,15,9,184,1,2,181,12,10, +253,17,7,254,0,63,51,63,51,237,50,63,51,63,51,237,50,1,16,246,50,237,50,17, +51,17,51,16,244,50,237,50,17,51,17,51,49,48,1,51,17,33,21,33,3,35,17,33,53, +33,51,33,21,33,17,35,1,51,17,33,53,33,3,65,145,1,227,253,140,215,145,254, +29,2,116,215,2,116,254,29,145,254,152,145,253,140,1,227,7,72,252,34,145,250, +186,3,222,145,145,252,34,9,181,251,145,145,0,0,0,0,1,0,0,2,109,5,171,7,72, +0,3,0,18,182,0,5,1,4,2,250,1,0,47,63,17,1,51,17,51,49,48,1,33,17,33,5,171, +250,85,5,171,2,109,4,219,0,0,0,1,0,0,253,147,5,171,2,109,0,3,0,18,182,0,5, +1,4,2,1,254,0,63,47,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253, +147,4,218,0,0,0,1,0,0,253,147,5,171,7,72,0,3,0,19,183,0,5,1,4,2,250,1,254, +0,63,63,17,1,51,17,51,49,48,1,33,17,33,5,171,250,85,5,171,253,147,9,181,0, +0,1,0,0,253,147,2,214,7,72,0,3,0,17,182,1,4,0,2,250,1,254,0,63,63,1,47,17, +51,49,48,1,33,17,33,2,214,253,42,2,214,253,147,9,181,0,0,0,0,1,2,213,253, +147,5,171,7,72,0,3,0,17,182,0,5,1,2,250,1,254,0,63,63,1,47,17,51,49,48,1, +33,17,33,5,171,253,42,2,214,253,147,9,181,0,0,0,0,42,0,103,253,245,5,171, +6,163,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55, +0,59,0,63,0,67,0,71,0,75,0,79,0,83,0,87,0,91,0,95,0,99,0,103,0,107,0,111, +0,115,0,119,0,123,0,127,0,131,0,135,0,139,0,143,0,147,0,151,0,155,0,159,0, +163,0,167,2,49,181,161,157,153,149,145,165,184,1,1,182,164,109,85,69,45,13, +121,184,1,1,64,13,120,108,84,68,44,12,120,101,77,53,29,5,137,184,1,1,64,13, +136,100,76,52,28,4,136,113,89,65,41,17,125,184,1,1,64,13,124,112,88,64,40, +16,124,97,81,57,25,9,141,184,1,1,64,13,140,96,80,56,24,8,140,117,93,61,37, +21,129,184,1,1,64,33,128,116,92,60,36,20,128,120,136,124,140,128,128,140, +124,136,120,5,132,160,156,152,148,144,164,164,169,105,73,49,33,1,133,184, +1,1,64,15,104,72,48,32,0,10,132,1,8,3,132,167,143,139,135,184,1,3,180,132, +163,103,99,107,184,1,3,183,104,160,100,96,104,95,91,87,184,1,3,183,84,92, +88,84,159,83,79,75,184,1,3,183,72,156,80,76,72,67,63,71,184,1,3,183,68,64, +60,68,155,59,55,51,184,1,3,183,48,152,56,52,48,43,39,47,184,1,3,183,44,40, +36,44,151,31,27,35,184,1,3,183,32,148,28,24,32,23,19,15,184,1,3,183,12,20, +16,12,147,11,7,3,184,1,3,183,0,144,8,4,0,131,127,123,184,1,3,64,60,120,128, +124,120,22,84,1,27,72,1,25,68,1,27,48,1,27,44,1,20,32,1,104,84,72,68,48,44, +32,12,0,120,120,0,12,32,44,48,68,72,84,104,10,108,164,140,136,27,132,59,132, +2,15,132,1,2,132,119,115,111,184,1,3,178,116,112,108,0,47,51,51,237,50,50, +47,95,93,93,51,51,51,18,23,57,47,47,47,47,47,47,47,47,47,47,93,93,93,93,93, +93,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50, +17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50, +50,17,51,51,16,237,50,50,17,51,51,51,16,237,50,50,50,17,51,51,16,237,50,50, +17,51,51,51,16,237,50,50,50,16,237,50,50,50,1,47,95,94,93,51,51,51,51,51, +237,50,50,50,50,50,17,51,47,51,51,51,51,51,18,23,57,47,47,47,47,47,17,51, +51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50,50,50, +17,51,51,51,51,51,16,237,50,50,50,50,50,17,51,51,51,51,51,16,237,50,50,50, +50,50,17,51,51,51,51,51,16,237,50,50,50,50,50,16,237,50,50,50,50,50,49,48, +19,51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7, +51,21,35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51, +21,35,37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,7,51,21, +35,37,51,21,35,37,51,21,35,5,51,21,35,37,51,21,35,37,51,21,35,7,51,21,35, +37,51,21,35,37,51,21,35,23,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,37, +51,21,35,37,51,21,35,1,51,21,35,37,51,21,35,37,51,21,35,1,51,21,35,17,51, +21,35,17,51,21,35,17,51,21,35,17,51,21,35,17,51,21,35,103,104,104,1,158,104, +104,1,160,103,103,253,145,104,104,1,159,104,104,1,159,104,104,207,103,103, +254,96,104,104,254,98,104,104,4,13,104,104,254,97,104,104,254,97,104,104, +207,104,104,1,158,104,104,1,160,103,103,207,104,104,254,97,104,104,254,97, +104,104,207,104,104,1,158,104,104,1,160,103,103,253,145,104,104,1,159,104, +104,1,159,104,104,207,103,103,254,96,104,104,254,98,104,104,207,104,104,1, +159,104,104,1,159,104,104,252,194,104,104,1,159,104,104,1,159,104,104,251, +243,104,104,1,158,104,104,1,160,103,103,1,158,104,104,104,104,104,104,104, +104,104,104,104,104,5,34,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96, +96,99,96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,97,97,97,97,97, +98,94,94,94,94,94,98,97,97,97,97,97,96,96,96,96,96,96,7,237,98,98,98,98,98, +1,35,96,96,96,96,96,254,223,98,254,223,96,254,221,96,254,221,97,254,222,97, +7,238,96,0,0,0,0,84,0,0,253,245,5,171,6,163,0,3,0,7,0,11,0,15,0,19,0,23,0, +27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,75,0,79,0,83, +0,87,0,91,0,95,0,99,0,103,0,107,0,111,0,115,0,119,0,123,0,127,0,131,0,135, +0,139,0,143,0,147,0,151,0,155,0,159,0,163,0,167,0,171,0,175,0,179,0,183,0, +187,0,191,0,195,0,199,0,203,0,207,0,211,0,215,0,219,0,223,0,227,0,231,0,235, +0,239,0,243,0,247,0,251,0,255,1,3,1,7,1,11,1,15,1,19,1,23,1,27,1,31,1,35, +1,39,1,43,1,47,1,51,1,55,1,59,1,63,1,67,1,71,1,75,1,79,0,0,19,51,21,35,55, +51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51, +21,35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21, +35,55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35, +55,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,55,51,21,35,55, +51,21,35,55,51,21,35,55,51,21,35,55,51,21,35,5,51,21,35,37,51,21,35,55,51, +21,35,55,51,21,35,55,51,21,35,37,51,21,35,5,51,21,35,39,51,21,35,39,51,21, +35,39,51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35, +55,51,21,35,55,51,21,35,55,51,21,35,23,51,21,35,39,51,21,35,39,51,21,35,39, +51,21,35,39,51,21,35,39,51,21,35,7,51,21,35,55,51,21,35,55,51,21,35,55,51, +21,35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21, +35,55,51,21,35,55,51,21,35,1,51,21,35,55,51,21,35,55,51,21,35,55,51,21,35, +55,51,21,35,55,51,21,35,19,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23, +51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,23,51,21,35,7,51,21,35,17,51,21, +35,19,51,21,35,103,104,104,207,104,104,207,104,104,208,104,104,208,104,104, +207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104, +208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104, +207,104,104,251,140,103,103,207,103,103,207,103,103,207,104,104,208,104,104, +208,103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104, +207,104,104,251,140,103,103,1,158,103,103,207,104,104,208,104,104,208,103, +103,252,194,103,103,3,165,104,104,207,104,104,208,104,104,208,104,104,207, +104,104,207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104, +104,208,103,103,103,104,104,207,104,104,208,104,104,208,104,104,207,104,104, +207,104,104,103,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208, +103,103,251,243,103,103,207,103,103,207,103,103,207,104,104,208,104,104,208, +103,103,252,90,104,104,207,104,104,207,104,104,208,104,104,208,104,104,207, +104,104,207,104,104,103,103,103,103,104,104,103,103,103,103,104,104,103,103, +103,103,104,104,103,103,103,103,104,104,103,103,103,103,103,103,104,104,5, +34,98,98,98,98,98,98,98,98,98,98,98,97,96,96,96,96,96,96,96,96,96,96,96,96, +96,96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,96, +96,96,96,96,96,96,96,96,96,96,99,96,96,96,96,96,96,96,96,96,96,96,96,97,97, +97,97,97,97,97,97,97,97,97,98,94,94,94,94,94,94,94,94,94,94,94,98,97,97,97, +97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96,7,237,98,98,98, +98,98,98,98,98,98,98,98,1,35,96,96,96,96,96,96,96,96,96,96,96,254,223,98, +97,96,96,96,99,96,96,96,99,96,96,97,98,94,98,97,96,96,7,237,98,1,35,96,0, +0,67,0,0,253,147,5,213,6,163,0,73,0,77,0,81,0,85,0,89,0,93,0,97,0,101,0,105, +0,109,0,113,0,117,0,121,0,125,0,129,0,133,0,137,0,141,0,145,0,149,0,153,0, +157,0,161,0,165,0,169,0,173,0,177,0,181,0,185,0,189,0,193,0,197,0,201,0,205, +0,209,0,213,0,217,0,221,0,225,0,229,0,233,0,237,0,241,0,245,0,249,0,253,1, +1,1,5,1,9,1,13,1,17,1,21,1,25,1,29,1,33,1,37,1,41,1,45,1,49,1,53,1,57,1,61, +1,65,1,69,1,73,1,77,1,81,0,0,1,33,17,51,53,35,17,51,53,35,17,51,53,35,17, +51,53,35,17,51,53,35,17,51,53,51,21,51,53,51,21,51,53,51,21,51,53,51,21,51, +53,51,21,51,53,51,21,51,53,51,21,35,21,51,17,35,21,51,17,35,21,51,17,35,21, +51,17,35,21,51,17,35,21,51,1,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53, +23,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,7,21,51,53,51,21,51,53,51, +21,51,53,51,21,51,53,5,35,21,51,55,21,51,53,51,21,51,53,51,21,51,53,5,21, +51,53,33,21,51,53,7,53,35,21,37,21,51,53,19,53,35,21,35,53,35,21,35,53,35, +21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51,21,51,53,19,53,35,21, +35,53,35,21,35,53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,51,21,51,53,51, +21,51,53,19,35,21,51,39,35,21,51,39,35,21,51,39,35,21,51,1,35,21,51,39,35, +21,51,39,35,21,51,39,35,21,51,1,21,51,53,51,21,51,53,23,35,21,51,39,35,21, +51,7,21,51,53,51,21,51,53,7,35,21,51,55,21,51,53,5,21,51,53,23,53,35,21,23, +53,35,21,35,53,35,21,7,21,51,53,51,21,51,53,19,53,35,21,35,53,35,21,7,21, +51,53,51,21,51,53,19,35,21,51,39,35,21,51,19,35,21,51,39,35,21,51,5,213,250, +43,106,106,106,106,106,106,106,106,106,106,106,107,106,107,106,107,107,107, +107,107,106,107,106,107,107,107,107,107,107,107,107,107,107,107,107,107,250, +149,107,106,107,106,107,107,107,107,107,107,214,107,107,214,106,106,213,106, +106,213,107,106,107,106,107,107,107,253,234,106,106,107,106,107,107,107,107, +252,170,107,1,63,107,213,107,1,171,107,107,107,107,107,107,106,107,106,107, +107,106,107,106,107,107,107,107,107,107,107,107,106,107,106,107,107,106,107, +106,107,107,107,107,107,107,214,107,107,214,106,106,213,106,106,2,22,107, +107,214,107,107,213,107,107,213,107,107,2,235,107,106,107,106,106,106,213, +106,106,213,107,106,107,107,106,106,107,106,254,86,107,213,107,213,106,107, +106,107,107,106,107,106,106,107,106,107,107,106,107,106,106,106,213,106,106, +107,107,107,213,107,107,253,147,1,34,97,1,34,97,1,35,96,1,33,98,1,33,98,1, +33,96,96,96,96,96,96,96,96,96,96,96,96,96,193,98,254,223,96,254,221,96,254, +221,96,254,221,94,254,221,96,6,106,96,96,96,96,96,96,96,96,192,98,98,98,98, +98,98,98,97,96,96,96,96,96,96,96,96,192,96,96,96,96,96,96,96,96,195,96,96, +96,96,96,96,96,96,96,96,254,223,97,97,97,97,97,97,97,97,98,94,94,94,94,94, +94,94,94,254,223,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,6,205, +98,98,98,98,98,98,98,1,34,98,98,98,98,98,98,98,254,223,96,96,96,96,192,98, +98,98,97,96,96,96,96,192,96,96,96,96,195,96,96,96,96,96,193,97,97,97,97,98, +94,94,94,94,254,223,97,97,97,97,96,96,96,96,96,6,205,98,98,98,1,34,98,98, +98,0,0,0,0,1,0,123,0,117,4,90,4,84,0,3,0,0,19,33,17,33,123,3,223,252,33,4, +84,252,33,0,0,2,0,6,0,0,4,207,4,201,0,3,0,7,0,21,183,7,1,4,0,4,0,5,3,0,47, +205,221,205,1,47,205,221,205,49,48,19,33,17,33,19,17,33,17,6,4,201,251,55, +76,4,49,4,201,251,55,4,125,251,207,4,49,0,0,1,0,109,1,127,2,105,3,123,0,3, +0,26,64,13,3,48,2,1,15,2,31,2,2,8,2,1,2,0,47,205,1,47,94,93,93,205,49,48, +1,33,17,33,2,105,254,4,1,252,1,127,1,252,0,0,0,2,0,109,1,127,2,105,3,123, +0,3,0,7,0,34,64,17,5,3,6,48,2,1,15,2,31,2,2,8,2,7,1,6,2,0,47,205,221,205, +1,47,94,93,93,205,221,205,49,48,1,33,17,33,3,17,33,17,2,105,254,4,1,252,76, +254,156,1,127,1,252,254,80,1,98,254,158,0,0,0,0,1,0,0,0,0,8,0,2,104,0,3,0, +0,17,33,17,33,8,0,248,0,2,104,253,152,0,0,0,1,1,158,0,0,6,76,4,174,0,2,0, +0,33,9,1,1,158,2,88,2,86,4,174,251,82,0,0,1,1,145,255,229,6,90,4,172,0,2, +0,0,9,2,1,145,4,201,251,55,4,172,253,158,253,155,0,1,1,158,255,229,6,76,4, +147,0,2,0,0,9,2,6,76,253,170,253,168,4,147,251,82,4,174,0,1,1,145,255,229, +6,90,4,172,0,2,0,0,1,17,1,6,90,251,55,4,172,251,57,2,101,0,0,2,0,8,0,0,3, +238,5,160,0,5,0,9,0,37,64,20,134,7,1,9,0,5,16,5,2,5,7,31,2,1,2,6,3,4,8,1, +0,47,51,63,51,1,47,93,51,47,93,51,49,48,93,33,35,9,1,51,9,4,2,35,82,254,55, +1,201,82,1,203,254,14,254,158,1,98,1,96,2,207,2,209,253,49,2,53,253,203,253, +194,2,62,0,2,0,167,0,162,4,46,4,41,0,19,0,39,0,46,64,28,68,37,84,37,2,75, +33,91,33,2,75,27,91,27,2,68,23,84,23,2,30,10,20,0,25,15,35,5,0,47,205,220, +205,1,47,205,220,205,49,48,93,93,93,93,19,52,62,2,51,50,30,2,21,20,14,2,35, +34,46,2,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,167,70,122,164,94,94, +165,123,71,71,123,165,94,94,164,122,70,86,57,98,133,76,76,134,99,58,58,99, +134,76,76,133,98,57,2,100,94,165,123,71,71,123,165,94,94,164,122,70,70,122, +164,94,76,132,99,57,57,99,132,76,76,134,99,58,58,99,134,0,0,0,0,1,0,178,0, +137,4,35,3,250,0,23,0,17,182,8,16,12,15,0,1,0,0,47,93,205,1,47,205,49,48, +1,50,23,30,1,23,30,1,21,20,7,6,35,34,39,38,53,52,54,55,62,1,55,54,2,106,110, +107,53,82,29,29,31,129,129,183,182,129,129,30,29,29,83,52,108,3,250,57,28, +82,52,54,110,57,183,129,129,129,129,183,58,109,54,52,82,28,57,0,0,0,2,0,41, +0,0,4,172,4,131,0,3,0,23,0,21,183,14,2,4,1,19,1,9,0,0,47,205,221,205,1,47, +205,221,205,49,48,51,17,33,17,1,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2, +41,4,131,252,4,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69,4, +131,251,125,2,65,91,160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0, +3,0,41,0,0,4,172,4,131,0,3,0,23,0,43,0,34,64,14,4,24,1,14,34,2,1,19,29,0, +9,39,1,0,0,47,221,221,206,16,221,206,1,47,221,221,206,16,221,206,49,48,51, +17,33,17,1,52,62,2,51,50,30,2,21,20,14,2,35,34,46,2,39,20,30,2,51,50,62,2, +53,52,46,2,35,34,14,2,41,4,131,252,81,58,99,133,75,75,133,99,58,58,99,133, +75,75,133,99,58,77,69,120,160,91,91,161,120,69,69,120,161,91,91,160,120,69, +4,131,251,125,2,65,75,133,99,58,58,99,133,75,75,133,99,58,58,99,133,75,91, +160,120,69,69,120,160,91,91,161,120,69,69,120,161,0,0,2,0,115,1,133,2,99, +3,117,0,18,0,34,0,21,183,19,0,27,11,31,6,23,15,0,47,205,220,205,1,47,205, +220,205,49,48,1,20,6,7,14,1,35,34,39,46,1,53,52,55,54,51,50,23,22,7,52,39, +38,35,34,7,6,21,20,23,22,51,50,55,54,2,99,37,37,37,86,51,101,75,35,37,72, +74,102,103,71,74,76,51,51,70,70,51,51,51,49,72,72,49,51,2,125,53,86,37,35, +37,72,37,86,53,102,72,74,74,71,103,70,51,51,51,51,70,69,54,49,49,54,0,0,0, +5,1,177,255,229,6,121,4,172,0,17,0,33,0,45,0,57,0,68,0,147,64,93,20,32,36, +32,116,32,3,20,28,36,28,116,28,3,27,24,43,24,123,24,3,27,20,43,20,123,20, +3,68,34,40,63,52,46,40,46,40,46,8,18,31,0,1,0,26,8,49,37,43,55,43,62,58,104, +58,1,89,58,1,71,58,1,25,58,1,58,60,65,15,43,95,43,111,43,3,8,65,64,9,14,72, +43,65,43,65,4,22,15,13,1,13,30,4,0,47,205,220,93,205,18,57,57,47,47,43,94, +93,16,205,51,93,93,93,93,17,51,17,51,16,205,50,1,47,205,220,93,205,18,57, +57,47,47,16,205,51,16,205,51,49,48,0,93,93,93,93,1,20,7,6,35,34,39,38,53, +52,54,55,54,51,50,23,30,1,7,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54,1, +20,6,35,34,38,53,52,54,51,50,22,5,20,6,35,34,38,53,52,54,51,50,22,1,22,51, +50,55,23,6,35,34,38,39,6,121,180,179,253,253,179,180,90,90,178,254,254,178, +90,90,90,153,151,218,218,151,153,153,152,217,217,152,153,253,90,46,32,32, +45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,234,76,147,145,76,62,98, +185,94,141,48,2,72,254,178,179,179,178,254,128,215,91,178,178,91,215,128, +217,153,154,154,153,217,216,153,154,154,153,1,87,32,46,46,32,32,45,45,32, +32,46,46,32,32,45,45,254,191,137,137,35,186,95,91,0,0,4,1,209,255,229,6,153, +4,172,0,17,0,29,0,41,0,52,0,96,64,55,42,18,24,47,36,30,24,30,24,30,0,8,39, +27,21,33,21,48,52,104,52,1,89,52,1,75,52,1,61,52,1,52,50,45,15,21,31,21,95, +21,111,21,4,8,79,45,95,45,2,21,45,21,45,13,4,0,47,204,57,57,47,47,93,94,93, +16,206,51,93,93,93,93,17,51,17,51,16,206,50,1,47,205,57,57,47,47,16,206,51, +16,206,51,49,48,1,20,7,6,35,34,39,38,53,52,54,55,54,51,50,23,30,1,5,52,38, +35,34,6,21,20,22,51,50,54,37,52,38,35,34,6,21,20,22,51,50,54,1,30,1,51,50, +55,39,6,35,34,39,6,153,180,179,253,253,179,180,90,90,178,254,254,178,90,90, +253,0,46,32,32,45,45,32,32,46,1,211,44,32,32,47,47,32,32,44,253,174,48,141, +94,185,98,62,76,145,147,76,2,72,254,178,179,179,178,254,128,215,91,178,178, +91,215,1,32,45,45,32,32,46,46,32,32,45,45,32,32,46,46,254,220,91,95,186,35, +137,137,0,2,1,70,255,115,6,14,4,59,0,51,0,70,0,139,185,0,47,255,240,64,13, +11,14,72,52,46,1,52,36,1,119,35,1,35,184,255,240,64,77,11,14,72,21,16,11, +14,72,59,20,1,59,9,1,8,16,11,14,72,59,47,1,52,35,1,52,21,1,59,8,1,66,143, +13,223,13,2,112,13,1,63,13,1,32,13,1,13,57,43,62,128,31,208,31,224,31,3,127, +31,1,48,31,1,47,31,1,31,52,15,51,63,51,79,51,3,8,51,0,47,94,93,205,220,93, +93,93,93,205,1,47,205,220,93,93,93,93,205,49,48,0,93,93,93,93,1,43,93,93, +43,43,93,93,93,43,1,51,21,30,3,23,55,23,7,30,1,23,51,21,35,14,1,7,23,7,39, +14,1,7,14,1,7,21,35,53,46,1,39,7,39,55,46,1,39,35,53,51,54,55,39,55,23,62, +1,55,23,34,6,7,6,21,20,23,30,1,51,50,55,54,53,52,39,46,1,3,137,66,32,57,54, +53,29,186,45,184,45,44,3,215,215,8,44,40,184,49,182,31,55,23,24,58,34,66, +63,110,48,188,43,182,40,46,8,215,215,12,80,180,40,189,57,112,54,31,69,117, +48,98,98,48,117,69,139,96,99,99,49,117,4,59,217,3,12,21,32,22,182,45,184, +59,113,57,62,60,110,51,188,43,182,23,32,11,9,12,5,217,217,9,46,35,180,45, +184,51,111,63,62,128,95,184,49,182,40,44,6,61,50,48,100,136,137,98,50,47, +97,97,138,137,99,48,50,0,0,0,2,1,218,0,80,4,38,4,129,0,28,0,47,0,98,64,62, +22,18,25,0,0,5,15,43,1,239,43,255,43,2,43,15,14,1,14,0,34,1,224,34,240,34, +2,34,5,22,25,19,0,28,16,28,80,28,3,28,0,39,1,240,39,1,39,18,0,0,128,0,2,8, +0,29,64,37,40,72,29,10,0,47,205,43,220,94,93,50,205,113,114,47,93,51,205, +50,1,47,205,113,114,220,93,205,113,114,17,57,47,51,205,50,49,48,1,46,1,39, +38,53,52,55,62,1,51,50,23,22,21,20,7,6,7,21,33,21,33,17,35,17,33,53,33,19, +34,7,14,1,21,20,22,23,22,51,50,55,54,53,52,38,39,38,2,220,55,90,35,71,83, +44,101,60,118,83,86,72,72,106,1,0,255,0,74,254,254,1,2,35,83,62,29,31,31, +29,62,83,87,59,61,30,29,62,2,66,8,46,42,80,108,122,83,43,43,86,83,122,109, +81,82,12,166,70,254,250,1,6,70,2,145,59,31,71,44,43,71,31,62,62,61,84,44, +71,31,59,0,2,1,81,0,250,4,175,4,129,0,65,0,81,0,70,64,40,49,65,59,15,78,1, +78,63,32,1,32,15,51,1,51,0,70,1,70,59,65,49,63,74,0,55,128,55,2,55,66,144, +20,1,20,15,63,1,8,63,0,47,94,93,204,93,205,220,93,205,18,57,57,1,47,205,114, +220,93,204,93,205,114,18,57,57,49,48,1,46,1,39,46,1,39,46,1,53,52,55,62,1, +51,50,22,23,30,1,51,50,54,55,54,51,50,21,20,7,14,1,21,20,22,23,30,1,21,20, +6,7,6,35,34,39,46,1,39,7,22,21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,7, +34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,3,255,17,54,37,28,40,14,5,3,6, +3,6,5,5,15,13,32,63,32,46,64,19,36,13,16,6,9,7,4,8,2,2,2,2,9,5,21,20,22,31, +11,237,84,86,87,118,118,87,84,84,85,122,71,83,154,90,62,61,61,64,88,89,60, +62,62,60,4,0,5,18,14,11,24,14,3,10,5,8,9,2,2,2,2,8,9,7,6,12,14,9,18,34,79, +45,31,64,34,11,16,5,5,7,3,6,39,42,82,42,238,81,109,125,86,88,84,84,117,117, +87,86,43,32,62,61,88,91,61,61,61,62,90,87,62,62,0,0,1,0,59,0,0,4,5,4,207, +0,47,0,40,64,25,38,32,10,48,10,96,10,112,10,4,10,14,34,64,8,11,72,34,23,79, +0,95,0,2,0,0,47,93,47,47,43,51,1,47,93,47,49,48,1,30,1,23,30,1,23,22,23,22, +21,20,7,6,35,34,39,22,23,30,1,31,1,33,55,50,55,62,3,39,14,1,35,34,39,38,53, +52,55,62,1,55,62,1,55,54,2,32,14,40,26,28,95,69,141,35,37,63,66,88,157,99, +3,36,38,163,137,8,252,232,6,125,86,43,66,44,20,1,45,132,83,90,66,63,30,23, +78,57,69,110,38,56,4,207,54,95,44,43,105,63,126,66,67,70,95,63,66,191,147, +87,86,99,9,37,37,49,25,69,91,119,75,96,95,66,63,91,74,59,42,85,47,59,113, +57,83,0,0,0,0,1,0,60,0,0,5,4,4,199,0,75,0,47,64,24,57,77,63,23,1,23,52,61, +67,13,47,30,4,18,31,18,1,27,18,27,18,1,41,1,0,47,47,18,57,57,47,47,93,18, +23,57,50,51,1,47,93,16,206,49,48,41,1,55,62,1,55,62,1,55,54,53,52,38,53,6, +7,14,1,35,34,38,39,38,53,52,55,54,51,50,22,23,46,1,39,46,1,53,52,55,62,1, +51,50,23,22,21,20,7,54,55,62,1,51,50,22,23,22,21,20,7,6,35,34,38,39,46,1, +39,30,1,23,30,1,23,22,23,4,70,252,182,8,84,108,27,41,64,26,52,2,58,90,43, +88,45,59,97,41,79,73,73,93,31,80,51,20,27,8,5,6,78,40,97,60,116,80,80,69, +84,16,14,30,17,51,86,36,73,80,80,112,62,132,50,17,43,26,3,23,23,22,67,46, +61,159,35,17,33,17,25,75,50,100,109,8,22,17,121,59,28,30,42,38,83,116,115, +79,80,25,26,34,52,19,17,38,20,115,78,38,40,80,78,109,86,98,40,3,5,3,37,41, +76,116,118,83,80,60,51,19,61,45,81,125,46,45,76,31,39,30,0,1,0,102,255,233, +4,90,4,121,0,39,0,38,64,23,18,2,1,4,2,1,8,29,41,16,12,64,12,80,12,112,12, +128,12,5,12,16,0,0,47,47,1,47,93,16,206,49,48,94,93,93,5,46,1,39,46,1,39, +46,1,39,46,1,53,52,55,54,51,50,23,30,1,23,62,1,51,50,22,23,22,21,20,7,14, +1,7,14,1,7,14,1,2,98,14,42,26,28,103,76,56,69,14,43,37,68,70,102,98,78,28, +47,17,34,142,88,50,85,35,70,41,20,78,60,75,108,32,31,44,23,56,101,48,50,147, +102,76,93,22,65,106,56,103,71,70,72,28,80,54,119,117,36,34,70,94,86,88,45, +119,75,96,152,55,54,110,0,0,0,0,1,0,66,255,231,3,210,4,199,0,26,0,18,183, +48,12,1,12,75,21,1,21,0,25,47,93,1,47,93,49,48,1,30,1,23,30,1,23,14,1,7,14, +1,7,46,1,39,46,1,39,46,1,39,62,1,55,62,1,2,7,45,113,69,69,116,47,39,120,83, +69,106,40,13,35,22,38,98,60,14,94,81,50,128,80,59,96,4,199,78,165,93,93,141, +53,40,150,111,93,159,72,25,58,32,57,135,80,20,119,99,59,160,107,77,148,0, +0,1,0,196,0,29,3,59,4,129,0,33,0,48,64,25,2,19,33,13,64,79,6,95,6,111,6,3, +6,128,27,33,18,10,10,47,0,1,0,31,24,0,47,205,204,93,57,47,57,1,47,205,26, +220,93,26,205,16,205,50,49,48,1,51,21,23,30,1,21,20,6,7,35,62,1,53,52,38, +39,38,39,17,20,6,7,6,35,34,38,53,52,55,54,51,50,23,1,233,76,153,51,58,48, +46,47,29,28,28,29,57,64,37,37,72,108,57,58,60,63,80,44,46,4,129,100,193,69, +163,85,78,134,59,65,124,59,60,99,40,81,9,254,6,63,98,38,75,54,46,73,60,60, +19,0,2,1,16,255,213,4,239,4,135,0,34,0,38,0,108,64,61,35,32,64,18,26,128, +36,15,64,111,0,1,0,128,15,9,1,9,9,0,26,1,26,17,35,86,35,1,67,35,1,35,16,36, +54,36,1,37,36,1,20,36,1,3,36,1,8,36,34,38,33,88,33,1,33,37,34,30,23,13,6, +0,47,205,47,205,47,51,51,93,17,51,17,51,94,93,93,93,93,17,51,51,93,93,17, +51,1,47,93,51,47,93,26,221,93,26,205,50,26,16,221,26,205,51,49,48,1,20,6, +7,14,1,35,34,38,53,52,55,54,51,50,23,17,5,17,20,6,7,6,35,34,38,53,52,55,54, +51,50,23,17,37,1,37,53,5,4,239,36,38,37,88,51,57,57,57,62,81,48,42,253,218, +37,35,74,106,57,58,59,60,84,45,45,2,186,253,144,2,38,253,218,1,68,63,101, +35,37,39,54,47,76,57,59,18,1,192,149,254,118,62,98,38,74,53,45,76,57,60,19, +2,240,178,254,103,149,117,152,0,0,0,3,0,29,0,0,3,118,5,204,0,27,0,31,0,35, +0,100,179,67,10,1,10,184,255,224,64,59,8,12,72,31,35,70,28,47,32,143,32,207, +32,3,31,32,79,32,111,32,143,32,4,32,79,16,95,16,2,16,16,1,70,144,2,1,111, +2,1,2,34,15,31,83,30,0,19,80,12,0,0,4,80,25,5,15,32,1,21,0,63,51,63,51,237, +50,63,237,63,237,63,1,47,93,93,237,50,47,93,47,93,113,51,237,50,49,48,0,43, +93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51, +21,19,53,51,21,3,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18, +40,51,29,11,211,134,180,180,180,3,183,252,73,3,183,131,122,59,101,75,43,6, +6,137,3,5,22,41,60,39,97,131,1,105,172,172,250,224,4,58,251,198,0,0,0,0,2, +0,29,0,0,3,119,5,204,0,27,0,31,0,90,179,67,10,1,10,184,255,224,64,53,8,12, +72,31,70,47,28,143,28,207,28,3,31,28,79,28,111,28,143,28,4,28,79,16,95,16, +2,16,16,1,70,144,2,1,111,2,1,2,30,0,19,80,12,0,0,4,80,25,5,15,28,1,21,0,63, +51,63,51,237,50,63,237,63,1,47,93,93,237,50,47,93,47,93,113,237,49,48,0,43, +93,1,17,35,17,35,53,51,53,52,62,2,51,50,22,23,21,46,1,35,34,14,2,29,1,51, +21,19,17,51,17,1,105,180,152,152,22,59,102,81,32,69,26,17,45,18,40,51,29, +11,211,135,180,3,183,252,73,3,183,131,122,59,101,75,43,6,6,137,3,5,22,41, +60,39,97,131,252,73,5,204,250,52,0,0,1,0,119,254,78,1,227,255,170,0,28,0, +75,185,0,2,255,232,179,9,17,72,27,184,255,224,64,40,9,17,72,22,22,8,16,131, +15,0,1,95,0,1,0,8,19,140,63,23,79,23,2,23,11,140,0,5,16,5,32,5,80,5,96,5, +112,5,6,5,0,47,93,237,47,93,237,1,47,221,93,113,237,18,57,47,49,48,43,43, +5,20,14,2,35,34,38,39,53,22,51,50,62,2,53,52,38,35,42,1,7,55,51,50,30,2,1, +227,30,65,104,75,20,45,25,49,37,41,56,35,15,61,72,14,29,14,31,62,52,84,60, +32,253,41,67,48,25,1,3,98,6,12,21,30,18,37,40,2,96,18,41,63,0,0,0,255,255, +0,243,1,190,1,182,2,154,17,6,0,119,56,0,0,18,64,11,0,127,0,1,111,0,1,95,0, +1,0,17,93,93,93,53,0,1,0,127,254,78,1,72,255,158,0,10,0,75,185,0,5,255,192, +179,9,17,72,2,184,255,192,64,28,9,17,72,7,151,0,150,4,9,8,146,16,3,32,3,2, +0,3,96,3,160,3,176,3,192,3,5,3,184,255,192,64,10,30,33,72,3,0,9,16,9,2,9, +0,47,93,204,43,93,113,237,1,47,51,253,237,49,48,43,43,5,20,6,7,35,62,1,53, +35,53,51,1,72,44,40,117,45,49,88,195,193,87,107,47,48,86,46,156,0,0,0,0,2, +0,14,2,51,2,150,5,129,0,10,0,23,0,108,64,74,86,10,1,86,9,1,121,6,137,6,2, +17,175,5,191,5,2,5,64,29,60,72,5,64,24,27,72,5,8,1,224,18,6,16,2,1,48,2,1, +64,2,144,2,2,2,0,4,229,8,5,95,17,111,17,127,17,3,15,17,31,17,127,17,143,17, +4,17,17,1,11,6,220,1,223,0,63,63,51,18,57,47,93,113,51,51,237,50,1,47,93, +113,114,51,51,237,50,47,43,43,93,51,49,48,93,114,114,1,21,35,53,33,53,1,51, +17,51,21,3,14,3,7,3,33,17,60,2,54,2,39,131,254,106,1,130,151,111,240,7,22, +24,22,7,199,1,23,1,2,229,178,178,111,2,45,253,213,113,2,23,13,37,39,35,11, +254,225,1,33,14,38,38,34,0,0,0,0,1,0,53,2,40,2,124,5,129,0,38,0,134,64,37, +37,36,53,36,69,36,3,3,24,9,13,72,19,34,1,4,34,1,3,31,30,25,224,139,27,1,6, +27,10,192,26,208,26,224,26,3,26,184,255,192,64,53,16,19,72,26,29,0,225,32, +19,96,19,2,32,19,96,19,160,19,224,19,4,19,22,228,34,34,16,30,229,27,220,68, +11,84,11,100,11,3,53,11,1,6,11,22,11,38,11,3,11,16,228,5,221,0,63,237,50, +93,93,93,63,237,18,57,47,237,1,47,93,113,237,50,47,43,93,51,51,95,113,237, +50,50,0,95,93,93,49,48,43,93,1,20,14,2,35,34,46,2,39,55,30,3,51,50,54,53, +52,38,35,34,6,7,35,19,33,21,33,7,62,1,51,50,30,2,2,124,38,73,108,70,66,101, +74,44,9,133,5,24,39,54,36,71,86,81,75,51,77,23,129,33,1,250,254,114,19,29, +91,54,67,103,69,36,3,67,65,104,74,40,33,59,81,48,15,27,47,36,21,85,93,81, +85,37,23,1,212,113,245,26,33,39,71,102,0,0,0,1,0,43,2,52,2,120,5,129,0,14, +0,54,64,33,5,224,6,6,0,175,12,191,12,2,12,11,96,0,1,191,0,207,0,255,0,3,96, +0,1,0,0,12,229,13,220,5,223,0,63,63,237,50,1,47,93,93,113,51,47,93,17,57, +47,237,49,48,1,14,3,21,35,52,62,2,55,33,53,33,2,120,64,106,77,43,133,47,80, +107,60,254,52,2,77,5,28,97,176,176,187,108,102,188,179,175,88,113,0,3,0,45, +2,40,2,130,5,142,0,19,0,39,0,81,0,138,185,0,68,255,232,179,11,15,72,64,184, +255,232,64,82,11,15,72,47,24,9,13,72,43,24,9,13,72,5,15,21,15,2,76,55,71, +10,226,72,61,1,61,61,30,226,224,50,1,191,50,1,50,0,226,70,71,1,71,71,40,226, +32,20,96,20,2,32,20,96,20,160,20,224,20,4,20,76,56,25,228,15,15,35,26,5,1, +11,5,1,5,228,66,222,35,228,45,221,0,63,237,63,237,93,93,18,57,47,237,57,57, +1,47,93,113,237,50,47,113,237,47,93,93,237,51,47,113,237,18,57,57,0,93,49, +48,43,43,43,43,1,52,46,2,35,34,14,2,21,20,30,2,51,50,62,2,19,52,46,2,35,34, +14,2,21,20,30,2,51,50,62,2,55,20,14,2,35,34,46,2,53,52,62,2,55,53,46,3,53, +52,62,2,51,50,30,2,21,20,14,2,7,21,30,3,1,223,12,31,53,41,39,53,31,13,9,29, +54,45,48,54,27,7,21,13,35,61,49,45,59,36,15,15,36,61,46,46,61,34,14,142,35, +73,113,77,77,113,74,35,29,47,61,32,36,55,38,20,35,70,104,68,72,105,69,33, +20,38,56,36,36,63,46,26,4,169,28,48,34,19,19,34,48,28,23,47,39,25,25,39,48, +254,155,28,52,40,24,24,41,53,28,35,59,42,23,23,42,60,22,54,91,66,37,37,66, +90,54,46,72,52,32,5,3,8,37,52,64,35,45,79,59,34,35,60,79,44,35,63,52,37,7, +3,6,31,52,72,0,1,255,229,4,176,2,195,5,240,0,17,0,62,64,41,117,11,133,11, +2,117,7,133,7,2,12,73,15,13,191,13,239,13,3,13,6,73,64,5,12,5,128,9,142,15, +0,47,0,63,0,127,0,239,0,5,0,0,47,93,237,26,205,50,1,47,26,237,220,93,237, +49,48,0,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,84,111,141,81,32, +2,164,6,104,93,93,104,6,164,2,32,81,141,4,176,57,91,115,57,103,96,96,103, +57,115,91,57,0,1,0,124,4,28,1,69,5,129,0,10,0,36,64,21,7,151,0,150,4,9,8, +146,80,3,96,3,2,160,3,176,3,2,3,9,3,0,63,204,93,113,237,1,47,51,253,237,49, +48,1,20,6,7,35,62,1,53,35,53,51,1,69,44,40,117,45,49,88,195,5,23,87,117,47, +48,96,46,167,0,0,1,0,130,4,187,1,75,6,32,0,10,0,47,64,30,4,9,150,7,151,10, +7,146,95,3,111,3,2,175,3,191,3,2,3,80,10,1,15,10,63,10,127,10,3,10,0,47,93, +113,205,93,113,237,1,47,237,237,50,49,48,19,52,54,55,51,14,1,21,51,21,35, +130,44,40,117,45,49,88,195,5,37,87,117,47,48,96,46,167,0,0,0,0,1,0,106,5, +250,2,18,6,240,0,5,0,48,64,30,117,3,133,3,2,128,4,1,64,4,1,4,64,1,2,64,16, +20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43,1,47,26,205,93,93, +49,48,93,1,37,53,51,23,21,1,160,254,202,207,217,5,250,217,29,226,20,0,1,0, +72,5,250,1,240,6,240,0,5,0,52,64,34,122,2,138,2,2,64,3,128,3,2,3,64,79,0, +143,0,2,0,2,64,16,20,72,2,128,95,0,1,0,64,9,12,72,0,0,47,43,93,26,205,43, +1,47,93,26,205,93,49,48,93,19,53,55,51,21,5,72,217,207,254,202,5,250,20,226, +29,217,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,9,134,9,2,120,8,136, +8,2,128,0,1,0,184,255,192,64,25,11,15,72,0,6,4,142,64,8,64,16,19,72,8,128, +6,95,1,1,1,64,9,12,72,1,0,47,43,93,51,26,221,43,26,237,1,47,204,43,93,49, +48,93,93,1,21,35,39,35,7,35,53,55,51,2,150,105,219,2,232,104,234,204,6,14, +20,139,139,20,240,0,0,0,0,1,0,0,5,250,2,150,6,254,0,9,0,65,64,14,118,0,134, +0,2,120,1,136,1,2,128,8,1,8,184,255,192,64,25,11,15,72,8,64,2,7,3,64,16,19, +72,3,128,6,142,95,1,1,1,64,9,12,72,1,0,47,43,93,237,26,205,43,50,1,47,26, +204,43,93,49,48,93,93,1,35,39,53,51,23,51,55,51,21,1,182,204,234,104,232, +2,219,105,5,250,239,21,139,139,21,0,0,0,0,2,0,45,5,250,2,90,6,178,0,3,0,7, +0,35,64,19,3,133,0,7,133,4,1,5,145,0,95,4,1,4,64,9,12,72,4,0,47,43,93,51, +237,50,1,47,237,220,237,49,48,1,53,51,21,33,53,51,21,1,183,163,253,211,165, +5,250,184,184,184,184,0,0,1,255,233,5,250,2,182,7,6,0,27,0,68,181,89,2,105, +2,2,26,184,255,232,64,34,9,15,72,12,24,9,15,72,64,23,1,15,23,1,23,9,22,5, +143,64,14,128,19,143,8,95,0,1,0,64,9,12,72,0,0,47,43,93,50,237,26,221,26, +237,51,1,47,204,93,93,49,48,43,43,0,93,1,34,46,2,35,34,6,7,35,62,3,51,50, +30,2,51,50,54,55,51,14,3,1,236,42,84,78,71,31,55,54,9,91,5,20,45,74,59,44, +84,78,69,30,54,55,8,92,5,20,43,74,5,250,37,45,37,62,57,45,95,78,50,37,45, +37,63,56,44,95,78,51,0,0,0,0,2,0,32,5,250,3,15,6,241,0,5,0,11,0,88,64,60, +154,8,170,8,2,154,2,170,2,2,102,10,1,98,4,1,98,3,1,10,159,7,1,15,7,31,7,127, +7,223,7,4,7,7,4,64,0,64,9,31,72,0,8,2,64,16,20,72,2,128,6,95,0,1,0,64,9,12, +72,0,0,47,43,93,50,26,205,43,50,1,47,43,26,205,220,94,93,113,205,49,48,93, +93,93,93,93,19,53,55,51,21,5,51,53,55,51,21,5,32,197,207,254,202,253,197, +207,254,202,5,250,20,227,29,218,20,227,29,218,0,1,255,232,5,250,2,130,6,243, +0,17,0,55,64,32,4,11,1,4,7,1,17,15,19,1,100,13,64,5,12,5,64,16,20,72,5,128, +9,95,0,1,0,64,9,12,72,0,0,47,43,93,205,26,205,43,50,1,47,26,204,94,93,49, +48,0,94,93,93,1,34,46,2,39,51,30,1,51,50,54,55,51,14,3,1,52,74,116,84,50, +8,117,17,109,91,91,107,17,117,9,50,83,116,5,250,41,69,90,49,53,60,61,52,49, +90,69,41,0,0,0,0,0,0,1,0,0,21,86,0,1,3,140,12,0,0,9,9,72,0,3,0,36,255,143, +0,3,0,55,255,219,0,3,0,60,255,219,0,3,1,82,255,143,0,3,1,91,255,143,0,3,1, +94,255,143,0,3,1,101,255,143,0,3,1,109,255,219,0,3,1,110,255,219,0,3,1,116, +255,219,0,20,0,20,255,104,0,36,0,3,255,143,0,36,0,55,255,104,0,36,0,57,255, +104,0,36,0,58,255,180,0,36,0,60,255,104,0,36,0,89,255,219,0,36,0,90,255,219, +0,36,0,92,255,219,0,36,2,3,255,104,0,41,0,15,255,29,0,41,0,17,255,29,0,41, +0,36,255,143,0,47,0,3,255,180,0,47,0,55,255,104,0,47,0,57,255,104,0,47,0, +58,255,104,0,47,0,60,255,104,0,47,0,92,255,180,0,47,2,3,255,143,0,51,0,3, +255,219,0,51,0,15,254,248,0,51,0,17,254,248,0,51,0,36,255,104,0,53,0,55,255, +219,0,53,0,57,255,219,0,53,0,58,255,219,0,53,0,60,255,219,0,55,0,3,255,219, +0,55,0,15,255,29,0,55,0,16,255,143,0,55,0,17,255,29,0,55,0,29,255,29,0,55, +0,30,255,29,0,55,0,36,255,104,0,55,0,50,255,219,0,55,0,68,255,29,0,55,0,70, +255,29,0,55,0,72,255,29,0,55,0,76,255,180,0,55,0,82,255,29,0,55,0,85,255, +180,0,55,0,86,255,29,0,55,0,88,255,180,0,55,0,90,255,143,0,55,0,92,255,143, +0,57,0,15,255,68,0,57,0,16,255,143,0,57,0,17,255,68,0,57,0,29,255,180,0,57, +0,30,255,180,0,57,0,36,255,104,0,57,0,68,255,104,0,57,0,72,255,143,0,57,0, +76,255,219,0,57,0,82,255,143,0,57,0,85,255,180,0,57,0,88,255,180,0,57,0,92, +255,180,0,58,0,15,255,143,0,58,0,16,255,219,0,58,0,17,255,143,0,58,0,29,255, +219,0,58,0,30,255,219,0,58,0,36,255,180,0,58,0,68,255,180,0,58,0,72,255,219, +0,58,0,82,255,219,0,58,0,85,255,219,0,58,0,88,255,219,0,58,0,92,255,238,0, +60,0,3,255,219,0,60,0,15,254,248,0,60,0,16,255,68,0,60,0,17,254,248,0,60, +0,29,255,143,0,60,0,30,255,123,0,60,0,36,255,104,0,60,0,68,255,104,0,60,0, +72,255,68,0,60,0,76,255,180,0,60,0,82,255,68,0,60,0,83,255,104,0,60,0,84, +255,68,0,60,0,88,255,143,0,60,0,89,255,143,0,73,0,73,255,219,0,73,2,3,0,37, +0,85,0,15,255,143,0,85,0,17,255,143,0,85,2,3,0,76,0,89,0,15,255,104,0,89, +0,17,255,104,0,90,0,15,255,143,0,90,0,17,255,143,0,92,0,15,255,104,0,92,0, +17,255,104,1,82,1,98,255,213,1,82,1,105,255,213,1,82,1,109,255,104,1,82,1, +110,255,104,1,82,1,111,255,197,1,82,1,116,255,104,1,82,1,124,255,219,1,82, +1,134,255,219,1,82,1,144,255,219,1,87,1,110,255,190,1,88,1,90,0,170,1,88, +1,91,255,104,1,88,1,94,255,104,1,88,1,98,255,141,1,88,1,101,255,104,1,88, +1,105,255,141,1,88,1,111,255,141,1,88,1,114,255,158,1,88,1,119,255,104,1, +88,1,120,255,180,1,88,1,122,255,70,1,88,1,128,255,104,1,88,1,130,255,180, +1,88,1,131,255,104,1,88,1,133,255,104,1,88,1,136,255,70,1,88,1,140,255,70, +1,88,1,143,255,70,1,88,1,147,0,98,1,88,1,149,255,70,1,89,1,110,255,209,1, +89,1,116,255,209,1,91,0,3,255,143,1,91,1,98,255,213,1,91,1,105,255,213,1, +91,1,109,255,104,1,91,1,110,255,104,1,91,1,111,255,197,1,91,1,116,255,104, +1,91,1,124,255,219,1,91,1,134,255,219,1,91,1,144,255,219,1,91,2,3,255,104, +1,93,0,15,255,31,1,93,0,17,255,31,1,93,1,90,0,164,1,93,1,91,255,68,1,93,1, +94,255,68,1,93,1,101,255,68,1,93,1,130,255,168,1,93,1,147,0,88,1,94,0,3,255, +143,1,94,1,98,255,213,1,94,1,105,255,213,1,94,1,109,255,137,1,94,1,110,255, +104,1,94,1,116,255,104,1,98,1,91,255,219,1,98,1,94,255,219,1,98,1,101,255, +219,1,98,1,110,255,190,1,98,1,116,255,190,1,100,1,98,255,193,1,100,1,105, +255,193,1,100,1,111,255,143,1,100,1,117,255,231,1,100,1,122,255,231,1,100, +1,125,255,231,1,100,1,127,255,231,1,100,1,129,255,231,1,100,1,135,255,231, +1,100,1,136,255,231,1,100,1,140,255,231,1,100,1,143,255,231,1,100,1,146,255, +231,1,100,1,149,255,231,1,100,1,151,255,231,1,101,0,3,255,143,1,101,1,98, +255,213,1,101,1,105,255,213,1,101,1,109,255,104,1,101,1,110,255,104,1,101, +1,116,255,104,1,105,1,91,255,219,1,105,1,94,255,213,1,105,1,101,255,219,1, +105,1,110,255,190,1,105,1,116,255,190,1,107,0,3,255,219,1,107,0,15,254,250, +1,107,0,17,254,250,1,107,1,91,255,104,1,107,1,94,255,104,1,107,1,101,255, +104,1,108,1,137,255,158,1,108,1,141,255,158,1,109,0,3,255,219,1,109,0,15, +255,31,1,109,0,17,255,31,1,109,0,29,255,31,1,109,0,30,255,31,1,109,1,90,0, +188,1,109,1,91,255,104,1,109,1,94,255,104,1,109,1,98,255,219,1,109,1,101, +255,104,1,109,1,105,255,219,1,109,1,111,255,219,1,109,1,114,255,219,1,109, +1,117,255,31,1,109,1,118,255,31,1,109,1,121,255,78,1,109,1,122,255,31,1,109, +1,124,255,78,1,109,1,126,255,31,1,109,1,128,255,106,1,109,1,130,255,180,1, +109,1,133,255,106,1,109,1,134,255,143,1,109,1,136,255,31,1,109,1,140,255, +31,1,109,1,142,255,80,1,109,1,143,255,31,1,109,1,144,255,143,1,109,1,145, +255,106,1,109,1,147,0,188,1,109,1,148,255,78,1,109,1,149,255,31,1,109,1,150, +255,78,1,110,0,3,255,219,1,110,0,15,254,250,1,110,0,16,255,70,1,110,0,17, +254,250,1,110,0,29,255,143,1,110,0,30,255,143,1,110,1,90,0,188,1,110,1,91, +255,104,1,110,1,94,255,104,1,110,1,98,255,141,1,110,1,101,255,104,1,110,1, +105,255,141,1,110,1,111,255,141,1,110,1,114,255,158,1,110,1,119,255,104,1, +110,1,120,255,180,1,110,1,122,255,70,1,110,1,124,255,158,1,110,1,128,255, +104,1,110,1,130,255,180,1,110,1,131,255,104,1,110,1,133,255,104,1,110,1,136, +255,70,1,110,1,140,255,70,1,110,1,143,255,70,1,110,1,147,0,121,1,110,1,149, +255,70,1,111,1,91,255,197,1,111,1,110,255,190,1,111,1,116,255,190,1,113,1, +117,255,178,1,113,1,122,255,178,1,113,1,125,255,178,1,113,1,129,255,217,1, +113,1,136,255,178,1,113,1,140,255,178,1,113,1,143,255,178,1,113,1,146,255, +178,1,113,1,149,255,178,1,113,1,151,255,178,1,114,1,110,255,209,1,114,1,116, +255,209,1,116,0,3,255,219,1,116,1,90,0,170,1,116,1,91,255,104,1,116,1,94, +255,104,1,116,1,98,255,141,1,116,1,101,255,104,1,116,1,105,255,141,1,116, +1,111,255,141,1,116,1,114,255,158,1,116,1,119,255,104,1,116,1,120,255,180, +1,116,1,122,255,70,1,116,1,128,255,104,1,116,1,130,255,180,1,116,1,131,255, +104,1,116,1,133,255,104,1,116,1,136,255,70,1,116,1,140,255,70,1,116,1,143, +255,70,1,116,1,147,0,98,1,116,1,149,255,70,1,125,1,132,255,217,1,125,1,137, +255,227,1,125,1,141,255,227,1,125,1,144,255,201,1,127,1,117,255,119,1,127, +1,119,255,219,1,127,1,122,255,119,1,127,1,124,255,170,1,127,1,125,255,180, +1,127,1,128,255,219,1,127,1,129,255,158,1,127,1,130,255,219,1,127,1,131,255, +219,1,127,1,134,255,170,1,127,1,136,255,119,1,127,1,137,255,170,1,127,1,140, +255,119,1,127,1,141,255,170,1,127,1,143,255,119,1,127,1,146,255,119,1,127, +1,149,255,119,1,127,1,151,255,119,1,129,1,132,255,217,1,131,1,117,255,231, +1,131,1,122,255,231,1,131,1,125,255,231,1,131,1,127,255,231,1,131,1,129,255, +231,1,131,1,135,255,231,1,131,1,136,255,231,1,131,1,139,255,231,1,131,1,140, +255,231,1,131,1,143,255,231,1,131,1,146,255,231,1,131,1,149,255,231,1,131, +1,151,255,231,1,132,1,117,255,225,1,132,1,122,255,225,1,132,1,125,255,225, +1,132,1,135,255,225,1,132,1,136,255,225,1,132,1,139,255,209,1,132,1,140,255, +225,1,132,1,142,255,207,1,132,1,143,255,219,1,132,1,146,255,225,1,132,1,149, +255,225,1,132,1,150,255,207,1,132,1,151,255,225,1,135,1,117,255,201,1,135, +1,122,255,201,1,135,1,125,255,201,1,135,1,127,255,201,1,135,1,135,255,201, +1,135,1,136,255,201,1,135,1,139,255,201,1,135,1,140,255,201,1,135,1,143,255, +201,1,135,1,149,255,201,1,136,1,132,255,217,1,136,1,137,255,227,1,136,1,141, +255,227,1,136,1,144,255,201,1,137,1,117,255,227,1,137,1,122,255,227,1,137, +1,127,255,227,1,137,1,136,255,227,1,137,1,139,255,227,1,137,1,140,255,227, +1,137,1,143,255,227,1,137,1,146,255,227,1,137,1,151,255,227,1,138,1,132,255, +217,1,138,1,137,255,227,1,138,1,141,255,227,1,141,1,117,255,227,1,141,1,122, +255,227,1,141,1,125,255,227,1,141,1,127,255,227,1,141,1,136,255,227,1,141, +1,139,255,227,1,141,1,140,255,227,1,141,1,143,255,227,1,141,1,146,255,227, +1,141,1,151,255,227,1,143,1,132,255,217,1,143,1,137,255,227,1,143,1,141,255, +227,1,143,1,144,255,201,1,144,1,117,255,201,1,144,1,122,255,201,1,144,1,125, +255,201,1,144,1,127,255,201,1,144,1,136,255,201,1,144,1,139,255,201,1,144, +1,140,255,201,1,144,1,143,255,201,1,144,1,146,255,201,1,144,1,149,255,201, +1,144,1,151,255,201,1,146,1,132,255,217,1,146,1,137,255,227,1,146,1,141,255, +227,1,146,1,144,255,201,1,149,1,132,255,217,1,149,1,137,255,227,1,149,1,141, +255,227,1,149,1,144,255,201,1,151,1,132,255,217,1,151,1,137,255,227,1,151, +1,141,255,227,1,151,1,144,255,201,1,154,0,15,255,6,1,154,0,17,255,6,1,154, +0,108,255,119,1,154,0,123,255,119,1,154,1,255,255,211,1,160,2,3,255,96,1, +161,2,3,255,119,1,166,1,170,0,68,1,166,1,173,255,233,1,166,1,177,0,45,1,166, +1,180,255,211,1,166,1,181,255,233,1,166,1,183,255,211,1,166,1,184,255,96, +1,166,1,185,255,166,1,166,1,186,255,188,1,166,1,189,255,96,1,166,1,195,255, +211,1,166,1,198,0,23,1,166,1,216,255,211,1,166,1,217,255,233,1,166,1,218, +0,23,1,166,1,227,0,45,1,166,2,3,255,141,1,167,1,166,255,211,1,167,1,173,255, +233,1,167,1,180,255,233,1,167,1,183,255,233,1,167,1,184,255,164,1,167,1,185, +255,209,1,167,1,186,255,233,1,167,1,187,255,211,1,167,1,189,255,164,1,167, +1,192,255,188,1,167,1,195,255,233,1,167,1,197,255,233,1,167,1,209,255,233, +1,167,1,217,255,211,1,168,1,166,255,188,1,168,1,170,255,211,1,168,1,172,255, +211,1,168,1,173,255,188,1,168,1,177,255,233,1,168,1,180,255,188,1,168,1,183, +255,188,1,168,1,184,255,119,1,168,1,185,255,188,1,168,1,186,255,188,1,168, +1,187,255,166,1,168,1,189,255,164,1,168,1,192,255,141,1,168,1,197,255,188, +1,168,1,202,255,233,1,168,1,210,255,233,1,168,1,216,255,188,1,168,1,217,255, +233,1,168,1,219,255,233,1,168,1,221,255,188,1,168,1,229,255,233,1,169,0,15, +255,6,1,169,0,17,255,6,1,169,0,108,255,119,1,169,0,123,255,119,1,169,1,166, +255,119,1,169,1,170,255,119,1,169,1,173,255,211,1,169,1,177,255,141,1,169, +1,178,255,209,1,169,1,180,255,141,1,169,1,183,255,164,1,169,1,197,255,188, +1,169,1,198,255,141,1,169,1,200,255,141,1,169,1,202,255,119,1,169,1,203,255, +119,1,169,1,206,255,141,1,169,1,209,255,141,1,169,1,210,255,141,1,169,1,211, +255,141,1,169,1,212,255,119,1,169,1,214,255,141,1,169,1,217,255,119,1,169, +1,225,255,141,1,169,1,226,255,141,1,169,1,228,255,141,1,169,1,229,255,119, +1,169,1,255,255,211,1,170,1,185,0,23,1,170,1,186,255,211,1,170,1,189,255, +186,1,170,1,205,0,68,1,170,1,212,0,23,1,170,1,217,0,45,1,171,1,173,255,211, +1,171,1,215,255,233,1,172,1,173,255,233,1,172,1,180,255,211,1,172,1,183,255, +233,1,172,1,184,0,23,1,172,1,185,0,45,1,172,1,192,0,45,1,172,1,198,0,23,1, +172,1,203,255,231,1,172,1,212,255,233,1,172,1,217,255,233,1,173,1,177,255, +233,1,173,1,180,255,233,1,173,1,183,255,233,1,173,1,184,255,211,1,173,1,185, +255,233,1,173,1,186,255,233,1,173,1,189,255,211,1,173,1,197,255,233,1,176, +1,173,255,233,1,176,1,180,255,233,1,176,1,183,255,233,1,176,1,185,0,23,1, +176,1,186,255,186,1,177,1,186,255,233,1,177,1,199,0,23,1,177,1,217,0,23,1, +178,1,186,255,233,1,178,1,189,255,233,1,178,1,198,0,23,1,178,1,203,0,23,1, +178,1,212,0,23,1,178,1,215,0,23,1,178,1,217,0,23,1,178,1,221,255,233,1,178, +1,227,0,23,1,180,1,166,255,211,1,180,1,170,255,211,1,180,1,172,255,211,1, +180,1,177,255,233,1,180,1,185,255,211,1,180,1,187,255,164,1,180,1,189,255, +211,1,180,1,197,255,211,1,180,1,202,255,211,1,180,1,209,255,233,1,180,1,219, +255,233,1,182,0,15,254,125,1,182,0,17,254,125,1,182,0,29,255,211,1,182,0, +30,255,211,1,182,0,123,255,141,1,182,1,166,255,119,1,182,1,170,255,119,1, +182,1,172,255,233,1,182,1,173,255,211,1,182,1,177,255,141,1,182,1,178,255, +233,1,182,1,180,255,211,1,182,1,183,255,233,1,182,1,184,255,164,1,182,1,185, +255,211,1,182,1,186,255,233,1,182,1,187,255,164,1,182,1,197,255,211,1,182, +1,198,255,188,1,182,1,202,255,96,1,182,1,203,255,166,1,182,1,212,255,166, +1,182,1,227,255,211,1,182,1,229,255,188,1,183,1,166,255,211,1,183,1,170,255, +211,1,183,1,173,255,233,1,183,1,177,255,188,1,183,1,178,255,233,1,183,1,180, +255,211,1,183,1,184,255,188,1,183,1,185,255,188,1,183,1,187,255,141,1,183, +1,189,255,188,1,183,1,192,255,186,1,183,1,195,255,233,1,183,1,198,0,23,1, +183,1,204,0,45,1,183,1,221,255,233,1,184,0,15,255,29,1,184,0,17,255,29,1, +184,0,108,255,166,1,184,0,123,255,166,1,184,1,166,255,188,1,184,1,170,255, +188,1,184,1,172,0,23,1,184,1,173,255,233,1,184,1,177,255,211,1,184,1,180, +255,164,1,184,1,186,255,188,1,184,1,197,255,211,1,184,1,198,255,164,1,184, +1,200,255,166,1,184,1,203,255,141,1,184,1,206,255,166,1,184,1,208,255,166, +1,184,1,209,255,164,1,184,1,210,255,166,1,184,1,212,255,96,1,184,1,213,255, +166,1,184,1,214,255,141,1,184,1,215,255,141,1,184,1,217,255,141,1,184,1,219, +255,166,1,184,1,223,255,166,1,184,1,225,255,166,1,184,1,226,255,166,1,184, +1,228,255,166,1,184,1,229,255,141,1,184,1,255,255,211,1,185,0,15,254,240, +1,185,0,17,254,240,1,185,0,29,255,211,1,185,0,30,255,211,1,185,0,108,255, +166,1,185,0,123,255,164,1,185,1,166,255,119,1,185,1,170,255,164,1,185,1,173, +255,211,1,185,1,177,255,188,1,185,1,180,255,188,1,185,1,186,255,188,1,185, +1,195,255,211,1,185,1,197,255,211,1,185,1,199,255,211,1,185,1,200,255,141, +1,185,1,201,255,164,1,185,1,202,255,96,1,185,1,203,255,119,1,185,1,204,255, +188,1,185,1,205,255,141,1,185,1,206,255,164,1,185,1,207,255,188,1,185,1,208, +255,164,1,185,1,209,255,119,1,185,1,210,255,164,1,185,1,211,255,164,1,185, +1,212,255,119,1,185,1,213,255,164,1,185,1,214,255,164,1,185,1,215,255,119, +1,185,1,219,255,164,1,185,1,220,255,164,1,185,1,222,255,164,1,185,1,223,255, +164,1,185,1,228,255,164,1,185,1,229,255,119,1,185,1,255,255,233,1,186,1,166, +255,211,1,186,1,170,255,188,1,186,1,177,255,188,1,186,1,184,255,141,1,186, +1,185,255,164,1,186,1,189,255,211,1,186,1,197,255,186,1,186,1,209,255,188, +1,187,1,173,255,211,1,187,1,180,255,188,1,187,1,183,255,188,1,187,1,186,255, +188,1,187,1,195,255,186,1,187,1,212,255,233,1,187,1,217,255,211,1,188,1,180, +255,211,1,188,1,198,0,45,1,191,1,198,0,23,1,191,1,217,0,45,1,192,1,197,255, +188,1,192,2,3,255,119,1,194,1,166,255,211,1,194,1,170,255,211,1,194,1,172, +255,188,1,194,1,173,255,233,1,194,1,177,255,186,1,194,1,178,255,211,1,194, +1,180,255,211,1,194,1,183,255,211,1,194,1,184,255,51,1,194,1,187,255,164, +1,194,1,189,255,96,1,194,1,195,255,233,1,194,1,197,255,164,1,194,2,3,255, +96,1,195,1,170,255,188,1,195,1,172,255,231,1,195,1,173,255,233,1,195,1,177, +255,188,1,195,1,187,255,186,1,195,1,197,255,211,1,195,1,202,255,188,1,195, +1,204,0,23,1,195,1,209,255,188,1,195,1,210,255,233,1,195,1,229,255,233,1, +196,1,166,255,188,1,196,1,170,255,166,1,196,1,172,255,211,1,196,1,177,255, +164,1,196,1,180,255,233,1,196,1,183,255,233,1,196,1,184,255,141,1,196,1,187, +255,164,1,196,1,189,255,188,1,196,1,202,255,164,1,196,1,209,255,164,1,196, +1,210,255,233,1,198,1,205,255,233,1,198,1,216,255,211,1,198,1,217,255,233, +1,198,1,221,255,211,1,199,1,198,255,209,1,199,1,202,255,164,1,199,1,203,255, +233,1,199,1,204,255,233,1,199,1,205,255,211,1,199,1,209,255,164,1,199,1,210, +255,211,1,199,1,215,255,233,1,199,1,217,255,211,1,199,1,218,255,233,1,199, +1,219,255,188,1,199,1,221,255,188,1,199,1,224,255,188,1,199,1,227,255,233, +1,199,1,229,255,211,1,200,1,198,255,233,1,200,1,199,255,233,1,200,1,202,255, +233,1,200,1,203,255,233,1,200,1,204,255,233,1,200,1,205,255,233,1,200,1,209, +255,209,1,200,1,210,255,233,1,200,1,212,255,233,1,200,1,215,255,233,1,200, +1,216,255,211,1,200,1,217,255,211,1,200,1,218,255,233,1,200,1,221,255,164, +1,200,1,224,255,188,1,200,1,229,255,233,1,201,0,15,255,6,1,201,0,17,255,6, +1,201,1,198,255,211,1,201,1,202,255,164,1,201,1,203,255,211,1,201,1,205,255, +233,1,201,1,209,255,211,1,201,1,212,255,211,1,201,1,215,255,211,1,201,1,229, +255,233,1,202,1,224,255,211,1,202,1,227,0,23,1,203,1,199,255,233,1,203,1, +202,255,211,1,203,1,204,255,233,1,203,1,205,255,211,1,203,1,209,255,188,1, +203,1,216,255,188,1,203,1,217,255,233,1,203,1,219,255,211,1,203,1,221,255, +188,1,204,1,199,0,23,1,204,1,217,0,23,1,204,1,221,255,233,1,204,1,224,0,45, +1,205,1,199,255,233,1,205,1,202,255,211,1,205,1,203,255,233,1,205,1,205,255, +233,1,205,1,209,255,233,1,205,1,212,255,233,1,205,1,215,255,233,1,205,1,217, +255,233,1,205,1,218,255,233,1,205,1,221,255,188,1,205,1,224,255,211,1,208, +1,198,0,45,1,208,1,199,0,45,1,208,1,203,0,23,1,208,1,205,0,23,1,208,1,209, +0,23,1,208,1,212,0,23,1,208,1,215,0,23,1,208,1,216,0,23,1,208,1,217,0,23, +1,208,1,227,0,23,1,209,1,212,0,23,1,209,1,221,255,211,1,210,1,199,255,233, +1,210,1,205,255,233,1,210,1,217,0,23,1,212,1,202,255,211,1,212,1,204,255, +233,1,212,1,205,255,233,1,212,1,209,255,211,1,212,1,216,255,211,1,212,1,217, +255,233,1,212,1,219,255,233,1,212,1,221,255,211,1,214,1,202,255,209,1,214, +1,205,255,233,1,214,1,209,255,186,1,214,1,216,255,211,1,214,1,217,255,233, +1,214,1,219,255,233,1,214,1,221,255,211,1,214,1,229,255,233,1,215,1,204,0, +23,1,215,1,212,0,23,1,215,1,221,255,233,1,215,1,227,0,23,1,216,0,15,255,29, +1,216,0,17,255,29,1,216,1,198,255,233,1,216,1,202,255,188,1,216,1,203,255, +233,1,216,1,204,0,68,1,216,1,209,255,211,1,216,1,212,255,233,1,216,1,215, +255,233,1,216,1,217,0,23,1,217,0,15,255,51,1,217,0,17,255,51,1,217,0,123, +0,23,1,217,1,198,255,233,1,217,1,199,0,23,1,217,1,202,255,188,1,217,1,203, +255,233,1,217,1,204,0,23,1,217,1,209,255,211,1,217,1,210,255,233,1,217,1, +212,255,231,1,217,1,214,255,233,1,217,1,215,255,233,1,217,1,218,255,233,1, +217,1,227,255,233,1,217,1,229,255,233,1,218,1,199,255,233,1,218,1,202,255, +211,1,218,1,209,255,211,1,218,1,216,255,211,1,218,1,217,255,233,1,218,1,221, +255,211,1,218,1,229,255,233,1,219,1,198,255,233,1,219,1,199,255,233,1,219, +1,203,255,233,1,219,1,205,255,233,1,219,1,212,255,233,1,219,1,215,255,233, +1,219,1,216,255,233,1,219,1,218,255,233,1,219,1,221,255,211,1,220,1,203,255, +233,1,220,1,205,255,233,1,220,1,212,255,233,1,220,1,215,255,233,1,223,1,203, +255,233,1,223,1,212,255,233,1,223,1,217,0,23,1,226,1,216,255,96,1,226,1,221, +255,119,1,227,1,202,255,211,1,227,1,203,0,23,1,227,1,205,255,233,1,227,1, +209,255,211,1,227,1,212,0,23,1,227,1,216,255,211,1,227,1,219,255,233,1,227, +1,229,255,233,1,228,1,202,255,211,1,228,1,204,255,233,1,228,1,209,255,211, +1,228,1,210,255,233,1,228,1,216,255,211,1,228,1,219,255,233,1,228,1,221,255, +211,1,242,0,15,255,51,1,242,0,17,255,51,1,244,0,15,255,6,1,244,0,17,255,6, +1,244,0,29,255,211,1,244,0,30,255,211,1,244,0,108,255,96,1,244,0,123,255, +96,1,244,1,255,255,211,2,2,2,2,255,219,2,3,0,3,255,180,2,3,0,86,255,219,2, +3,2,3,255,219,2,8,1,153,255,96,2,8,1,162,255,96,2,8,1,184,255,96,2,8,1,189, +255,188,2,8,1,192,255,188,0,0,0,0,0,28,1,86,0,1,0,0,0,0,0,0,0,64,0,130,0, +1,0,0,0,0,0,1,0,15,0,227,0,1,0,0,0,0,0,2,0,7,1,3,0,1,0,0,0,0,0,3,0,26,1,65, +0,1,0,0,0,0,0,4,0,15,1,124,0,1,0,0,0,0,0,5,0,12,1,166,0,1,0,0,0,0,0,6,0,14, +1,209,0,1,0,0,0,0,0,7,0,122,2,214,0,1,0,0,0,0,0,8,0,20,3,123,0,1,0,0,0,0, +0,9,0,14,3,174,0,1,0,0,0,0,0,11,0,28,3,247,0,1,0,0,0,0,0,12,0,46,4,114,0, +1,0,0,0,0,0,13,0,127,5,161,0,1,0,0,0,0,0,14,0,43,6,121,0,3,0,1,4,9,0,0,0, +128,0,0,0,3,0,1,4,9,0,1,0,30,0,195,0,3,0,1,4,9,0,2,0,14,0,243,0,3,0,1,4,9, +0,3,0,52,1,11,0,3,0,1,4,9,0,4,0,30,1,92,0,3,0,1,4,9,0,5,0,24,1,140,0,3,0, +1,4,9,0,6,0,28,1,179,0,3,0,1,4,9,0,7,0,244,1,224,0,3,0,1,4,9,0,8,0,40,3,81, +0,3,0,1,4,9,0,9,0,28,3,144,0,3,0,1,4,9,0,11,0,56,3,189,0,3,0,1,4,9,0,12,0, +92,4,20,0,3,0,1,4,9,0,13,0,254,4,161,0,3,0,1,4,9,0,14,0,86,6,33,0,68,0,105, +0,103,0,105,0,116,0,105,0,122,0,101,0,100,0,32,0,100,0,97,0,116,0,97,0,32, +0,169,0,32,0,50,0,48,0,48,0,55,0,32,0,65,0,115,0,99,0,101,0,110,0,100,0,101, +0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110, +0,46,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32, +0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,0,68,105,103,105,116, +105,122,101,100,32,100,97,116,97,32,169,32,50,48,48,55,32,65,115,99,101,110, +100,101,114,32,67,111,114,112,111,114,97,116,105,111,110,46,32,65,108,108, +32,114,105,103,104,116,115,32,114,101,115,101,114,118,101,100,46,0,0,76,0, +105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0, +115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115,0,0,82,0,101, +0,103,0,117,0,108,0,97,0,114,0,0,82,101,103,117,108,97,114,0,0,65,0,115,0, +99,0,101,0,110,0,100,0,101,0,114,0,32,0,45,0,32,0,76,0,105,0,98,0,101,0,114, +0,97,0,116,0,105,0,111,0,110,0,32,0,83,0,97,0,110,0,115,0,0,65,115,99,101, +110,100,101,114,32,45,32,76,105,98,101,114,97,116,105,111,110,32,83,97,110, +115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,32,0,83, +0,97,0,110,0,115,0,0,76,105,98,101,114,97,116,105,111,110,32,83,97,110,115, +0,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,48,0,50,0,0,86, +101,114,115,105,111,110,32,49,46,48,50,0,0,76,0,105,0,98,0,101,0,114,0,97, +0,116,0,105,0,111,0,110,0,83,0,97,0,110,0,115,0,0,76,105,98,101,114,97,116, +105,111,110,83,97,110,115,0,0,76,0,105,0,98,0,101,0,114,0,97,0,116,0,105, +0,111,0,110,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101, +0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,32,0,82,0,101,0,100,0,32,0,72,0, +97,0,116,0,44,0,32,0,73,0,110,0,99,0,46,0,32,0,114,0,101,0,103,0,105,0,115, +0,116,0,101,0,114,0,101,0,100,0,32,0,105,0,110,0,32,0,85,0,46,0,83,0,46,0, +32,0,80,0,97,0,116,0,101,0,110,0,116,0,32,0,97,0,110,0,100,0,32,0,84,0,114, +0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,79,0,102,0,102,0,105,0,99, +0,101,0,32,0,97,0,110,0,100,0,32,0,99,0,101,0,114,0,116,0,97,0,105,0,110, +0,32,0,111,0,116,0,104,0,101,0,114,0,32,0,106,0,117,0,114,0,105,0,115,0,100, +0,105,0,99,0,116,0,105,0,111,0,110,0,115,0,46,0,0,76,105,98,101,114,97,116, +105,111,110,32,105,115,32,97,32,116,114,97,100,101,109,97,114,107,32,111, +102,32,82,101,100,32,72,97,116,44,32,73,110,99,46,32,114,101,103,105,115, +116,101,114,101,100,32,105,110,32,85,46,83,46,32,80,97,116,101,110,116,32, +97,110,100,32,84,114,97,100,101,109,97,114,107,32,79,102,102,105,99,101,32, +97,110,100,32,99,101,114,116,97,105,110,32,111,116,104,101,114,32,106,117, +114,105,115,100,105,99,116,105,111,110,115,46,0,0,65,0,115,0,99,0,101,0,110, +0,100,0,101,0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105, +0,111,0,110,0,0,65,115,99,101,110,100,101,114,32,67,111,114,112,111,114,97, +116,105,111,110,0,0,83,0,116,0,101,0,118,0,101,0,32,0,77,0,97,0,116,0,116, +0,101,0,115,0,111,0,110,0,0,83,116,101,118,101,32,77,97,116,116,101,115,111, +110,0,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97, +0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99, +0,111,0,109,0,47,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101, +110,100,101,114,99,111,114,112,46,99,111,109,47,0,0,104,0,116,0,116,0,112, +0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,110,0,100,0, +101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,116,0,121,0, +112,0,101,0,100,0,101,0,115,0,105,0,103,0,110,0,101,0,114,0,115,0,46,0,104, +0,116,0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101, +110,100,101,114,99,111,114,112,46,99,111,109,47,116,121,112,101,100,101,115, +105,103,110,101,114,115,46,104,116,109,108,0,0,85,0,115,0,101,0,32,0,111, +0,102,0,32,0,116,0,104,0,105,0,115,0,32,0,76,0,105,0,98,0,101,0,114,0,97, +0,116,0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102, +0,116,0,119,0,97,0,114,0,101,0,32,0,105,0,115,0,32,0,115,0,117,0,98,0,106, +0,101,0,99,0,116,0,32,0,116,0,111,0,32,0,116,0,104,0,101,0,32,0,108,0,105, +0,99,0,101,0,110,0,115,0,101,0,32,0,97,0,103,0,114,0,101,0,101,0,109,0,101, +0,110,0,116,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,119,0,104,0,105,0,99, +0,104,0,32,0,121,0,111,0,117,0,32,0,97,0,99,0,99,0,101,0,112,0,116,0,101, +0,100,0,32,0,116,0,104,0,101,0,32,0,76,0,105,0,98,0,101,0,114,0,97,0,116, +0,105,0,111,0,110,0,32,0,102,0,111,0,110,0,116,0,32,0,115,0,111,0,102,0,116, +0,119,0,97,0,114,0,101,0,46,0,0,85,115,101,32,111,102,32,116,104,105,115, +32,76,105,98,101,114,97,116,105,111,110,32,102,111,110,116,32,115,111,102, +116,119,97,114,101,32,105,115,32,115,117,98,106,101,99,116,32,116,111,32, +116,104,101,32,108,105,99,101,110,115,101,32,97,103,114,101,101,109,101,110, +116,32,117,110,100,101,114,32,119,104,105,99,104,32,121,111,117,32,97,99, +99,101,112,116,101,100,32,116,104,101,32,76,105,98,101,114,97,116,105,111, +110,32,102,111,110,116,32,115,111,102,116,119,97,114,101,46,0,0,104,0,116, +0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0, +110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0, +108,0,105,0,98,0,101,0,114,0,97,0,116,0,105,0,111,0,110,0,46,0,104,0,116, +0,109,0,108,0,0,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,110, +100,101,114,99,111,114,112,46,99,111,109,47,108,105,98,101,114,97,116,105, +111,110,46,104,116,109,108,0,0,0,2,0,0,0,0,0,0,255,39,0,150,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,2,156,0,0,0,1,0,2,1,2,0,4,0,5,0,6,0,7,0,8,0,9,0, +10,0,11,0,12,0,13,0,14,0,15,1,3,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0, +25,0,26,0,27,0,28,0,29,1,4,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0, +40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54, +0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69, +0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84, +0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,163,0, +132,0,133,0,189,0,150,0,232,0,134,0,142,0,139,0,157,0,169,0,164,0,138,0,218, +0,131,0,147,1,5,1,6,0,141,1,7,0,136,1,8,0,222,1,9,0,158,0,170,0,245,0,244, +0,246,0,162,0,173,0,201,0,199,0,174,0,98,0,99,0,144,0,100,0,203,0,101,0,200, +0,202,0,207,0,204,0,205,0,206,0,233,0,102,0,211,0,208,0,209,0,175,0,103,0, +240,0,145,0,214,0,212,0,213,0,104,0,235,0,237,0,137,0,106,0,105,0,107,0,109, +0,108,0,110,0,160,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0, +234,0,120,0,122,0,121,0,123,0,125,0,124,0,184,0,161,0,127,0,126,0,128,0,129, +0,236,0,238,0,186,1,10,1,11,1,12,1,13,1,14,1,15,0,253,0,254,1,16,1,17,1,18, +1,19,0,255,1,0,1,20,1,21,1,22,1,1,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30, +1,31,1,32,1,33,1,34,0,248,0,249,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1, +43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,0,250,0,215,1,51,1,52,1,53,1,54,1,55, +1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,0,226,0,227,1,66,1,67,1, +68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,0,176,0,177, +1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,0,251,0,252,0,228,0,229, +1,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104, +1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,0,187,1,113,1,114,1,115,1, +116,0,230,0,231,1,117,0,166,1,118,1,119,1,120,1,121,1,122,1,123,0,216,0,225, +1,124,0,219,0,220,0,221,0,224,0,217,0,223,1,125,1,126,1,127,1,128,1,129,1, +130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,1,138,0,168,1,139,1,140,1,141, +1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151,1,152,1,153,1, +154,1,155,1,156,1,157,0,159,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165, +1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,0,151,1,176,1, +177,1,178,0,155,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188, +1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1, +201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213, +1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1, +226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238, +1,239,1,240,1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1, +251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10, +2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25, +2,26,2,27,2,28,2,29,2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,0,178,0, +179,2,39,2,40,0,182,0,183,0,196,2,41,0,180,0,181,0,197,0,130,0,194,0,135, +0,171,0,198,2,42,2,43,0,190,0,191,2,44,2,45,2,46,2,47,0,247,2,48,2,49,2,50, +2,51,2,52,2,53,0,140,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2, +64,2,65,2,66,0,152,2,67,0,154,0,153,0,239,0,165,0,146,2,68,2,69,0,156,0,167, +0,143,2,70,0,148,0,149,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80, +2,81,2,82,2,83,2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95, +2,96,2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108, +2,109,2,110,2,111,2,112,2,113,2,114,2,115,2,116,2,117,2,118,2,119,2,120,2, +121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,0,185,2,132, +2,133,2,134,2,135,2,136,2,137,2,138,2,139,2,140,2,141,2,142,2,143,2,144,2, +145,2,146,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,2,155,2,156,2,157, +2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,7,117,110,105, +48,48,65,48,7,117,110,105,48,48,65,68,7,117,110,105,48,51,55,69,7,117,110, +105,48,48,66,50,7,117,110,105,48,48,66,51,7,117,110,105,48,48,66,53,7,117, +110,105,50,50,49,57,7,117,110,105,48,48,66,57,7,65,109,97,99,114,111,110, +7,97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97,98,114,101,118,101, +7,65,111,103,111,110,101,107,7,97,111,103,111,110,101,107,11,67,99,105,114, +99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,10, +67,100,111,116,97,99,99,101,110,116,10,99,100,111,116,97,99,99,101,110,116, +6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,68,99,114,111,97,116,7,69, +109,97,99,114,111,110,7,101,109,97,99,114,111,110,6,69,98,114,101,118,101, +6,101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110,116,10,101,100, +111,116,97,99,99,101,110,116,7,69,111,103,111,110,101,107,7,101,111,103,111, +110,101,107,6,69,99,97,114,111,110,6,101,99,97,114,111,110,11,71,99,105,114, +99,117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108,101,120,10, +71,100,111,116,97,99,99,101,110,116,10,103,100,111,116,97,99,99,101,110,116, +12,71,99,111,109,109,97,97,99,99,101,110,116,12,103,99,111,109,109,97,97, +99,99,101,110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104,99,105, +114,99,117,109,102,108,101,120,4,72,98,97,114,4,104,98,97,114,6,73,116,105, +108,100,101,6,105,116,105,108,100,101,7,73,109,97,99,114,111,110,7,105,109, +97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101,118,101,7,73,111, +103,111,110,101,107,7,105,111,103,111,110,101,107,2,73,74,2,105,106,11,74, +99,105,114,99,117,109,102,108,101,120,11,106,99,105,114,99,117,109,102,108, +101,120,12,75,99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109,109, +97,97,99,99,101,110,116,12,107,103,114,101,101,110,108,97,110,100,105,99, +6,76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97, +99,99,101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97, +114,111,110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,6, +78,97,99,117,116,101,6,110,97,99,117,116,101,12,78,99,111,109,109,97,97,99, +99,101,110,116,12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99,97,114, +111,110,6,110,99,97,114,111,110,11,110,97,112,111,115,116,114,111,112,104, +101,3,69,110,103,3,101,110,103,7,79,109,97,99,114,111,110,7,111,109,97,99, +114,111,110,6,79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104,117, +110,103,97,114,117,109,108,97,117,116,13,111,104,117,110,103,97,114,117,109, +108,97,117,116,6,82,97,99,117,116,101,6,114,97,99,117,116,101,12,82,99,111, +109,109,97,97,99,99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110, +116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,83,97,99,117,116,101, +6,115,97,99,117,116,101,11,83,99,105,114,99,117,109,102,108,101,120,11,115, +99,105,114,99,117,109,102,108,101,120,12,84,99,111,109,109,97,97,99,99,101, +110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,6,84,99,97,114,111, +110,6,116,99,97,114,111,110,4,84,98,97,114,4,116,98,97,114,6,85,116,105,108, +100,101,6,117,116,105,108,100,101,7,85,109,97,99,114,111,110,7,117,109,97, +99,114,111,110,6,85,98,114,101,118,101,6,117,98,114,101,118,101,5,85,114, +105,110,103,5,117,114,105,110,103,13,85,104,117,110,103,97,114,117,109,108, +97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,85,111, +103,111,110,101,107,7,117,111,103,111,110,101,107,11,87,99,105,114,99,117, +109,102,108,101,120,11,119,99,105,114,99,117,109,102,108,101,120,11,89,99, +105,114,99,117,109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101, +120,6,90,97,99,117,116,101,6,122,97,99,117,116,101,10,90,100,111,116,97,99, +99,101,110,116,10,122,100,111,116,97,99,99,101,110,116,5,108,111,110,103, +115,10,65,114,105,110,103,97,99,117,116,101,10,97,114,105,110,103,97,99,117, +116,101,7,65,69,97,99,117,116,101,7,97,101,97,99,117,116,101,11,79,115,108, +97,115,104,97,99,117,116,101,11,111,115,108,97,115,104,97,99,117,116,101, +7,117,110,105,48,50,67,57,5,116,111,110,111,115,13,100,105,101,114,101,115, +105,115,116,111,110,111,115,10,65,108,112,104,97,116,111,110,111,115,9,97, +110,111,116,101,108,101,105,97,12,69,112,115,105,108,111,110,116,111,110, +111,115,8,69,116,97,116,111,110,111,115,9,73,111,116,97,116,111,110,111,115, +12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111, +110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,17,105,111, +116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,5,65,108,112,104, +97,4,66,101,116,97,5,71,97,109,109,97,7,69,112,115,105,108,111,110,4,90,101, +116,97,3,69,116,97,5,84,104,101,116,97,4,73,111,116,97,5,75,97,112,112,97, +6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111, +110,2,80,105,3,82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112,115,105, +108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,12,73,111,116,97,100,105, +101,114,101,115,105,115,15,85,112,115,105,108,111,110,100,105,101,114,101, +115,105,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108, +111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,9,105,111,116, +97,116,111,110,111,115,20,117,112,115,105,108,111,110,100,105,101,114,101, +115,105,115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116,97,5,103, +97,109,109,97,5,100,101,108,116,97,7,101,112,115,105,108,111,110,4,122,101, +116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112, +97,6,108,97,109,98,100,97,2,110,117,2,120,105,7,111,109,105,99,114,111,110, +3,114,104,111,6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97,117,7, +117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111, +109,101,103,97,12,105,111,116,97,100,105,101,114,101,115,105,115,15,117,112, +115,105,108,111,110,100,105,101,114,101,115,105,115,12,111,109,105,99,114, +111,110,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111, +115,10,111,109,101,103,97,116,111,110,111,115,9,97,102,105,105,49,48,48,50, +51,9,97,102,105,105,49,48,48,53,49,9,97,102,105,105,49,48,48,53,50,9,97,102, +105,105,49,48,48,53,51,9,97,102,105,105,49,48,48,53,52,9,97,102,105,105,49, +48,48,53,53,9,97,102,105,105,49,48,48,53,54,9,97,102,105,105,49,48,48,53, +55,9,97,102,105,105,49,48,48,53,56,9,97,102,105,105,49,48,48,53,57,9,97,102, +105,105,49,48,48,54,48,9,97,102,105,105,49,48,48,54,49,9,97,102,105,105,49, +48,48,54,50,9,97,102,105,105,49,48,49,52,53,9,97,102,105,105,49,48,48,49, +55,9,97,102,105,105,49,48,48,49,56,9,97,102,105,105,49,48,48,49,57,9,97,102, +105,105,49,48,48,50,48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105,49, +48,48,50,50,9,97,102,105,105,49,48,48,50,52,9,97,102,105,105,49,48,48,50, +53,9,97,102,105,105,49,48,48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102, +105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50,57,9,97,102,105,105,49, +48,48,51,48,9,97,102,105,105,49,48,48,51,49,9,97,102,105,105,49,48,48,51, +50,9,97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48,48,51,52,9,97,102, +105,105,49,48,48,51,53,9,97,102,105,105,49,48,48,51,54,9,97,102,105,105,49, +48,48,51,55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105,49,48,48,51, +57,9,97,102,105,105,49,48,48,52,48,9,97,102,105,105,49,48,48,52,49,9,97,102, +105,105,49,48,48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102,105,105,49, +48,48,52,52,9,97,102,105,105,49,48,48,52,53,9,97,102,105,105,49,48,48,52, +54,9,97,102,105,105,49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9,97,102, +105,105,49,48,48,52,57,9,97,102,105,105,49,48,48,54,53,9,97,102,105,105,49, +48,48,54,54,9,97,102,105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54, +56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105,49,48,48,55,48,9,97,102, +105,105,49,48,48,55,50,9,97,102,105,105,49,48,48,55,51,9,97,102,105,105,49, +48,48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102,105,105,49,48,48,55, +54,9,97,102,105,105,49,48,48,55,55,9,97,102,105,105,49,48,48,55,56,9,97,102, +105,105,49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9,97,102,105,105,49, +48,48,56,49,9,97,102,105,105,49,48,48,56,50,9,97,102,105,105,49,48,48,56, +51,9,97,102,105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56,53,9,97,102, +105,105,49,48,48,56,54,9,97,102,105,105,49,48,48,56,55,9,97,102,105,105,49, +48,48,56,56,9,97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48,48,57, +48,9,97,102,105,105,49,48,48,57,49,9,97,102,105,105,49,48,48,57,50,9,97,102, +105,105,49,48,48,57,51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105,49, +48,48,57,53,9,97,102,105,105,49,48,48,57,54,9,97,102,105,105,49,48,48,57, +55,9,97,102,105,105,49,48,48,55,49,9,97,102,105,105,49,48,48,57,57,9,97,102, +105,105,49,48,49,48,48,9,97,102,105,105,49,48,49,48,49,9,97,102,105,105,49, +48,49,48,50,9,97,102,105,105,49,48,49,48,51,9,97,102,105,105,49,48,49,48, +52,9,97,102,105,105,49,48,49,48,53,9,97,102,105,105,49,48,49,48,54,9,97,102, +105,105,49,48,49,48,55,9,97,102,105,105,49,48,49,48,56,9,97,102,105,105,49, +48,49,48,57,9,97,102,105,105,49,48,49,49,48,9,97,102,105,105,49,48,49,57, +51,9,97,102,105,105,49,48,48,53,48,9,97,102,105,105,49,48,48,57,56,6,87,103, +114,97,118,101,6,119,103,114,97,118,101,6,87,97,99,117,116,101,6,119,97,99, +117,116,101,9,87,100,105,101,114,101,115,105,115,9,119,100,105,101,114,101, +115,105,115,6,89,103,114,97,118,101,6,121,103,114,97,118,101,9,97,102,105, +105,48,48,50,48,56,13,117,110,100,101,114,115,99,111,114,101,100,98,108,13, +113,117,111,116,101,114,101,118,101,114,115,101,100,6,109,105,110,117,116, +101,6,115,101,99,111,110,100,9,101,120,99,108,97,109,100,98,108,7,117,110, +105,50,48,51,69,7,117,110,105,50,50,49,53,7,117,110,105,50,48,55,70,4,108, +105,114,97,6,112,101,115,101,116,97,4,69,117,114,111,9,97,102,105,105,54, +49,50,52,56,9,97,102,105,105,54,49,50,56,57,9,97,102,105,105,54,49,51,53, +50,7,117,110,105,50,49,50,54,9,101,115,116,105,109,97,116,101,100,9,111,110, +101,101,105,103,104,116,104,12,116,104,114,101,101,101,105,103,104,116,104, +115,11,102,105,118,101,101,105,103,104,116,104,115,12,115,101,118,101,110, +101,105,103,104,116,104,115,9,97,114,114,111,119,108,101,102,116,7,97,114, +114,111,119,117,112,10,97,114,114,111,119,114,105,103,104,116,9,97,114,114, +111,119,100,111,119,110,9,97,114,114,111,119,98,111,116,104,9,97,114,114, +111,119,117,112,100,110,12,97,114,114,111,119,117,112,100,110,98,115,101, +7,117,110,105,50,50,48,54,10,111,114,116,104,111,103,111,110,97,108,12,105, +110,116,101,114,115,101,99,116,105,111,110,11,101,113,117,105,118,97,108, +101,110,99,101,5,104,111,117,115,101,13,114,101,118,108,111,103,105,99,97, +108,110,111,116,10,105,110,116,101,103,114,97,108,116,112,10,105,110,116, +101,103,114,97,108,98,116,8,83,70,49,48,48,48,48,48,8,83,70,49,49,48,48,48, +48,8,83,70,48,49,48,48,48,48,8,83,70,48,51,48,48,48,48,8,83,70,48,50,48,48, +48,48,8,83,70,48,52,48,48,48,48,8,83,70,48,56,48,48,48,48,8,83,70,48,57,48, +48,48,48,8,83,70,48,54,48,48,48,48,8,83,70,48,55,48,48,48,48,8,83,70,48,53, +48,48,48,48,8,83,70,52,51,48,48,48,48,8,83,70,50,52,48,48,48,48,8,83,70,53, +49,48,48,48,48,8,83,70,53,50,48,48,48,48,8,83,70,51,57,48,48,48,48,8,83,70, +50,50,48,48,48,48,8,83,70,50,49,48,48,48,48,8,83,70,50,53,48,48,48,48,8,83, +70,53,48,48,48,48,48,8,83,70,52,57,48,48,48,48,8,83,70,51,56,48,48,48,48, +8,83,70,50,56,48,48,48,48,8,83,70,50,55,48,48,48,48,8,83,70,50,54,48,48,48, +48,8,83,70,51,54,48,48,48,48,8,83,70,51,55,48,48,48,48,8,83,70,52,50,48,48, +48,48,8,83,70,49,57,48,48,48,48,8,83,70,50,48,48,48,48,48,8,83,70,50,51,48, +48,48,48,8,83,70,52,55,48,48,48,48,8,83,70,52,56,48,48,48,48,8,83,70,52,49, +48,48,48,48,8,83,70,52,53,48,48,48,48,8,83,70,52,54,48,48,48,48,8,83,70,52, +48,48,48,48,48,8,83,70,53,52,48,48,48,48,8,83,70,53,51,48,48,48,48,8,83,70, +52,52,48,48,48,48,7,117,112,98,108,111,99,107,7,100,110,98,108,111,99,107, +5,98,108,111,99,107,7,108,102,98,108,111,99,107,7,114,116,98,108,111,99,107, +7,108,116,115,104,97,100,101,5,115,104,97,100,101,7,100,107,115,104,97,100, +101,9,102,105,108,108,101,100,98,111,120,6,72,50,50,48,55,51,6,72,49,56,53, +52,51,6,72,49,56,53,53,49,10,102,105,108,108,101,100,114,101,99,116,7,116, +114,105,97,103,117,112,7,116,114,105,97,103,114,116,7,116,114,105,97,103, +100,110,7,116,114,105,97,103,108,102,6,99,105,114,99,108,101,6,72,49,56,53, +51,51,9,105,110,118,98,117,108,108,101,116,9,105,110,118,99,105,114,99,108, +101,10,111,112,101,110,98,117,108,108,101,116,9,115,109,105,108,101,102,97, +99,101,12,105,110,118,115,109,105,108,101,102,97,99,101,3,115,117,110,6,102, +101,109,97,108,101,4,109,97,108,101,5,115,112,97,100,101,4,99,108,117,98, +5,104,101,97,114,116,7,100,105,97,109,111,110,100,11,109,117,115,105,99,97, +108,110,111,116,101,14,109,117,115,105,99,97,108,110,111,116,101,100,98,108, +7,117,110,105,70,66,48,49,7,117,110,105,70,66,48,50,7,117,110,105,70,48,48, +53,6,109,105,100,100,111,116,7,117,110,105,70,48,48,52,7,117,110,105,50,48, +55,52,7,117,110,105,50,48,55,53,7,117,110,105,50,48,55,55,7,117,110,105,50, +48,55,56,8,103,108,121,112,104,53,55,49,8,103,108,121,112,104,53,55,50,8, +103,108,121,112,104,53,55,51,8,103,108,121,112,104,53,55,52,8,103,108,121, +112,104,53,55,53,8,103,108,121,112,104,53,55,54,8,103,108,121,112,104,53, +55,55,8,103,108,121,112,104,53,55,56,8,103,108,121,112,104,53,55,57,8,103, +108,121,112,104,53,56,48,8,103,108,121,112,104,53,56,49,0,0,0,0,0,0,3,0,8, +0,2,0,17,0,1,255,255,0,3,0,1,0,0,0,14,0,0,0,24,0,0,0,0,0,2,0,1,0,1,2,155, +0,1,0,4,0,0,0,2,0,0,0,1,0,0,0,10,0,76,0,78,0,4,68,70,76,84,0,26,99,121,114, +108,0,36,103,114,101,107,0,46,108,97,116,110,0,56,0,4,0,0,0,0,255,255,0,0, +0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0,4,0,0,0,0,255,255,0,0,0, +0,0,0,0,1,0,0,0,10,0,84,0,98,0,4,68,70,76,84,0,26,99,121,114,108,0,38,103, +114,101,107,0,50,108,97,116,110,0,62,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0, +0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0, +0,0,1,107,101,114,110,0,8,0,0,0,1,0,0,0,1,0,4,0,2,0,0,0,1,0,8,0,1,15,112, +0,4,0,0,0,105,0,220,1,6,1,12,1,50,1,64,1,94,1,112,1,130,1,204,2,2,2,52,2, +114,2,124,2,138,2,148,2,138,2,158,2,196,2,202,3,28,3,38,3,84,3,118,3,144, +3,166,3,228,3,254,4,20,4,46,4,56,4,190,5,44,5,58,3,28,5,100,5,186,5,204,6, +22,6,28,6,82,6,136,5,186,6,178,6,216,6,230,5,186,7,16,5,186,5,186,5,186,7, +62,7,84,7,90,7,96,7,166,7,224,8,54,8,168,8,194,8,204,8,246,9,24,9,46,9,60, +9,98,9,144,9,242,10,48,10,174,11,72,11,106,11,136,11,146,11,156,11,166,11, +224,12,14,12,64,12,82,12,144,12,210,12,252,13,6,13,44,13,62,13,108,13,150, +13,160,13,174,13,208,13,242,14,4,14,46,14,112,14,142,14,180,14,198,14,212, +14,222,15,0,15,30,15,40,15,70,15,76,15,90,0,10,0,36,255,143,0,55,255,219, +0,60,255,219,1,82,255,143,1,91,255,143,1,94,255,143,1,101,255,143,1,109,255, +219,1,110,255,219,1,116,255,219,0,1,0,20,255,104,0,9,0,3,255,143,0,55,255, +104,0,57,255,104,0,58,255,180,0,60,255,104,0,89,255,219,0,90,255,219,0,92, +255,219,2,3,255,104,0,3,0,15,255,29,0,17,255,29,0,36,255,143,0,7,0,3,255, +180,0,55,255,104,0,57,255,104,0,58,255,104,0,60,255,104,0,92,255,180,2,3, +255,143,0,4,0,3,255,219,0,15,254,248,0,17,254,248,0,36,255,104,0,4,0,55,255, +219,0,57,255,219,0,58,255,219,0,60,255,219,0,18,0,3,255,219,0,15,255,29,0, +16,255,143,0,17,255,29,0,29,255,29,0,30,255,29,0,36,255,104,0,50,255,219, +0,68,255,29,0,70,255,29,0,72,255,29,0,76,255,180,0,82,255,29,0,85,255,180, +0,86,255,29,0,88,255,180,0,90,255,143,0,92,255,143,0,13,0,15,255,68,0,16, +255,143,0,17,255,68,0,29,255,180,0,30,255,180,0,36,255,104,0,68,255,104,0, +72,255,143,0,76,255,219,0,82,255,143,0,85,255,180,0,88,255,180,0,92,255,180, +0,12,0,15,255,143,0,16,255,219,0,17,255,143,0,29,255,219,0,30,255,219,0,36, +255,180,0,68,255,180,0,72,255,219,0,82,255,219,0,85,255,219,0,88,255,219, +0,92,255,238,0,15,0,3,255,219,0,15,254,248,0,16,255,68,0,17,254,248,0,29, +255,143,0,30,255,123,0,36,255,104,0,68,255,104,0,72,255,68,0,76,255,180,0, +82,255,68,0,83,255,104,0,84,255,68,0,88,255,143,0,89,255,143,0,2,0,73,255, +219,2,3,0,37,0,3,0,15,255,143,0,17,255,143,2,3,0,76,0,2,0,15,255,104,0,17, +255,104,0,2,0,15,255,143,0,17,255,143,0,9,1,98,255,213,1,105,255,213,1,109, +255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124,255,219,1,134,255, +219,1,144,255,219,0,1,1,110,255,190,0,20,1,90,0,170,1,91,255,104,1,94,255, +104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255,158, +1,119,255,104,1,120,255,180,1,122,255,70,1,128,255,104,1,130,255,180,1,131, +255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1, +149,255,70,0,2,1,110,255,209,1,116,255,209,0,11,0,3,255,143,1,98,255,213, +1,105,255,213,1,109,255,104,1,110,255,104,1,111,255,197,1,116,255,104,1,124, +255,219,1,134,255,219,1,144,255,219,2,3,255,104,0,8,0,15,255,31,0,17,255, +31,1,90,0,164,1,91,255,68,1,94,255,68,1,101,255,68,1,130,255,168,1,147,0, +88,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,137,1,110,255,104, +1,116,255,104,0,5,1,91,255,219,1,94,255,219,1,101,255,219,1,110,255,190,1, +116,255,190,0,15,1,98,255,193,1,105,255,193,1,111,255,143,1,117,255,231,1, +122,255,231,1,125,255,231,1,127,255,231,1,129,255,231,1,135,255,231,1,136, +255,231,1,140,255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255, +231,0,6,0,3,255,143,1,98,255,213,1,105,255,213,1,109,255,104,1,110,255,104, +1,116,255,104,0,5,1,91,255,219,1,94,255,213,1,101,255,219,1,110,255,190,1, +116,255,190,0,6,0,3,255,219,0,15,254,250,0,17,254,250,1,91,255,104,1,94,255, +104,1,101,255,104,0,2,1,137,255,158,1,141,255,158,0,33,0,3,255,219,0,15,255, +31,0,17,255,31,0,29,255,31,0,30,255,31,1,90,0,188,1,91,255,104,1,94,255,104, +1,98,255,219,1,101,255,104,1,105,255,219,1,111,255,219,1,114,255,219,1,117, +255,31,1,118,255,31,1,121,255,78,1,122,255,31,1,124,255,78,1,126,255,31,1, +128,255,106,1,130,255,180,1,133,255,106,1,134,255,143,1,136,255,31,1,140, +255,31,1,142,255,80,1,143,255,31,1,144,255,143,1,145,255,106,1,147,0,188, +1,148,255,78,1,149,255,31,1,150,255,78,0,27,0,3,255,219,0,15,254,250,0,16, +255,70,0,17,254,250,0,29,255,143,0,30,255,143,1,90,0,188,1,91,255,104,1,94, +255,104,1,98,255,141,1,101,255,104,1,105,255,141,1,111,255,141,1,114,255, +158,1,119,255,104,1,120,255,180,1,122,255,70,1,124,255,158,1,128,255,104, +1,130,255,180,1,131,255,104,1,133,255,104,1,136,255,70,1,140,255,70,1,143, +255,70,1,147,0,121,1,149,255,70,0,3,1,91,255,197,1,110,255,190,1,116,255, +190,0,10,1,117,255,178,1,122,255,178,1,125,255,178,1,129,255,217,1,136,255, +178,1,140,255,178,1,143,255,178,1,146,255,178,1,149,255,178,1,151,255,178, +0,21,0,3,255,219,1,90,0,170,1,91,255,104,1,94,255,104,1,98,255,141,1,101, +255,104,1,105,255,141,1,111,255,141,1,114,255,158,1,119,255,104,1,120,255, +180,1,122,255,70,1,128,255,104,1,130,255,180,1,131,255,104,1,133,255,104, +1,136,255,70,1,140,255,70,1,143,255,70,1,147,0,98,1,149,255,70,0,4,1,132, +255,217,1,137,255,227,1,141,255,227,1,144,255,201,0,18,1,117,255,119,1,119, +255,219,1,122,255,119,1,124,255,170,1,125,255,180,1,128,255,219,1,129,255, +158,1,130,255,219,1,131,255,219,1,134,255,170,1,136,255,119,1,137,255,170, +1,140,255,119,1,141,255,170,1,143,255,119,1,146,255,119,1,149,255,119,1,151, +255,119,0,1,1,132,255,217,0,13,1,117,255,231,1,122,255,231,1,125,255,231, +1,127,255,231,1,129,255,231,1,135,255,231,1,136,255,231,1,139,255,231,1,140, +255,231,1,143,255,231,1,146,255,231,1,149,255,231,1,151,255,231,0,13,1,117, +255,225,1,122,255,225,1,125,255,225,1,135,255,225,1,136,255,225,1,139,255, +209,1,140,255,225,1,142,255,207,1,143,255,219,1,146,255,225,1,149,255,225, +1,150,255,207,1,151,255,225,0,10,1,117,255,201,1,122,255,201,1,125,255,201, +1,127,255,201,1,135,255,201,1,136,255,201,1,139,255,201,1,140,255,201,1,143, +255,201,1,149,255,201,0,9,1,117,255,227,1,122,255,227,1,127,255,227,1,136, +255,227,1,139,255,227,1,140,255,227,1,143,255,227,1,146,255,227,1,151,255, +227,0,3,1,132,255,217,1,137,255,227,1,141,255,227,0,10,1,117,255,227,1,122, +255,227,1,125,255,227,1,127,255,227,1,136,255,227,1,139,255,227,1,140,255, +227,1,143,255,227,1,146,255,227,1,151,255,227,0,11,1,117,255,201,1,122,255, +201,1,125,255,201,1,127,255,201,1,136,255,201,1,139,255,201,1,140,255,201, +1,143,255,201,1,146,255,201,1,149,255,201,1,151,255,201,0,5,0,15,255,6,0, +17,255,6,0,108,255,119,0,123,255,119,1,255,255,211,0,1,2,3,255,96,0,1,2,3, +255,119,0,17,1,170,0,68,1,173,255,233,1,177,0,45,1,180,255,211,1,181,255, +233,1,183,255,211,1,184,255,96,1,185,255,166,1,186,255,188,1,189,255,96,1, +195,255,211,1,198,0,23,1,216,255,211,1,217,255,233,1,218,0,23,1,227,0,45, +2,3,255,141,0,14,1,166,255,211,1,173,255,233,1,180,255,233,1,183,255,233, +1,184,255,164,1,185,255,209,1,186,255,233,1,187,255,211,1,189,255,164,1,192, +255,188,1,195,255,233,1,197,255,233,1,209,255,233,1,217,255,211,0,21,1,166, +255,188,1,170,255,211,1,172,255,211,1,173,255,188,1,177,255,233,1,180,255, +188,1,183,255,188,1,184,255,119,1,185,255,188,1,186,255,188,1,187,255,166, +1,189,255,164,1,192,255,141,1,197,255,188,1,202,255,233,1,210,255,233,1,216, +255,188,1,217,255,233,1,219,255,233,1,221,255,188,1,229,255,233,0,28,0,15, +255,6,0,17,255,6,0,108,255,119,0,123,255,119,1,166,255,119,1,170,255,119, +1,173,255,211,1,177,255,141,1,178,255,209,1,180,255,141,1,183,255,164,1,197, +255,188,1,198,255,141,1,200,255,141,1,202,255,119,1,203,255,119,1,206,255, +141,1,209,255,141,1,210,255,141,1,211,255,141,1,212,255,119,1,214,255,141, +1,217,255,119,1,225,255,141,1,226,255,141,1,228,255,141,1,229,255,119,1,255, +255,211,0,6,1,185,0,23,1,186,255,211,1,189,255,186,1,205,0,68,1,212,0,23, +1,217,0,45,0,2,1,173,255,211,1,215,255,233,0,10,1,173,255,233,1,180,255,211, +1,183,255,233,1,184,0,23,1,185,0,45,1,192,0,45,1,198,0,23,1,203,255,231,1, +212,255,233,1,217,255,233,0,8,1,177,255,233,1,180,255,233,1,183,255,233,1, +184,255,211,1,185,255,233,1,186,255,233,1,189,255,211,1,197,255,233,0,5,1, +173,255,233,1,180,255,233,1,183,255,233,1,185,0,23,1,186,255,186,0,3,1,186, +255,233,1,199,0,23,1,217,0,23,0,9,1,186,255,233,1,189,255,233,1,198,0,23, +1,203,0,23,1,212,0,23,1,215,0,23,1,217,0,23,1,221,255,233,1,227,0,23,0,11, +1,166,255,211,1,170,255,211,1,172,255,211,1,177,255,233,1,185,255,211,1,187, +255,164,1,189,255,211,1,197,255,211,1,202,255,211,1,209,255,233,1,219,255, +233,0,24,0,15,254,125,0,17,254,125,0,29,255,211,0,30,255,211,0,123,255,141, +1,166,255,119,1,170,255,119,1,172,255,233,1,173,255,211,1,177,255,141,1,178, +255,233,1,180,255,211,1,183,255,233,1,184,255,164,1,185,255,211,1,186,255, +233,1,187,255,164,1,197,255,211,1,198,255,188,1,202,255,96,1,203,255,166, +1,212,255,166,1,227,255,211,1,229,255,188,0,15,1,166,255,211,1,170,255,211, +1,173,255,233,1,177,255,188,1,178,255,233,1,180,255,211,1,184,255,188,1,185, +255,188,1,187,255,141,1,189,255,188,1,192,255,186,1,195,255,233,1,198,0,23, +1,204,0,45,1,221,255,233,0,31,0,15,255,29,0,17,255,29,0,108,255,166,0,123, +255,166,1,166,255,188,1,170,255,188,1,172,0,23,1,173,255,233,1,177,255,211, +1,180,255,164,1,186,255,188,1,197,255,211,1,198,255,164,1,200,255,166,1,203, +255,141,1,206,255,166,1,208,255,166,1,209,255,164,1,210,255,166,1,212,255, +96,1,213,255,166,1,214,255,141,1,215,255,141,1,217,255,141,1,219,255,166, +1,223,255,166,1,225,255,166,1,226,255,166,1,228,255,166,1,229,255,141,1,255, +255,211,0,38,0,15,254,240,0,17,254,240,0,29,255,211,0,30,255,211,0,108,255, +166,0,123,255,164,1,166,255,119,1,170,255,164,1,173,255,211,1,177,255,188, +1,180,255,188,1,186,255,188,1,195,255,211,1,197,255,211,1,199,255,211,1,200, +255,141,1,201,255,164,1,202,255,96,1,203,255,119,1,204,255,188,1,205,255, +141,1,206,255,164,1,207,255,188,1,208,255,164,1,209,255,119,1,210,255,164, +1,211,255,164,1,212,255,119,1,213,255,164,1,214,255,164,1,215,255,119,1,219, +255,164,1,220,255,164,1,222,255,164,1,223,255,164,1,228,255,164,1,229,255, +119,1,255,255,233,0,8,1,166,255,211,1,170,255,188,1,177,255,188,1,184,255, +141,1,185,255,164,1,189,255,211,1,197,255,186,1,209,255,188,0,7,1,173,255, +211,1,180,255,188,1,183,255,188,1,186,255,188,1,195,255,186,1,212,255,233, +1,217,255,211,0,2,1,180,255,211,1,198,0,45,0,2,1,198,0,23,1,217,0,45,0,2, +1,197,255,188,2,3,255,119,0,14,1,166,255,211,1,170,255,211,1,172,255,188, +1,173,255,233,1,177,255,186,1,178,255,211,1,180,255,211,1,183,255,211,1,184, +255,51,1,187,255,164,1,189,255,96,1,195,255,233,1,197,255,164,2,3,255,96, +0,11,1,170,255,188,1,172,255,231,1,173,255,233,1,177,255,188,1,187,255,186, +1,197,255,211,1,202,255,188,1,204,0,23,1,209,255,188,1,210,255,233,1,229, +255,233,0,12,1,166,255,188,1,170,255,166,1,172,255,211,1,177,255,164,1,180, +255,233,1,183,255,233,1,184,255,141,1,187,255,164,1,189,255,188,1,202,255, +164,1,209,255,164,1,210,255,233,0,4,1,205,255,233,1,216,255,211,1,217,255, +233,1,221,255,211,0,15,1,198,255,209,1,202,255,164,1,203,255,233,1,204,255, +233,1,205,255,211,1,209,255,164,1,210,255,211,1,215,255,233,1,217,255,211, +1,218,255,233,1,219,255,188,1,221,255,188,1,224,255,188,1,227,255,233,1,229, +255,211,0,16,1,198,255,233,1,199,255,233,1,202,255,233,1,203,255,233,1,204, +255,233,1,205,255,233,1,209,255,209,1,210,255,233,1,212,255,233,1,215,255, +233,1,216,255,211,1,217,255,211,1,218,255,233,1,221,255,164,1,224,255,188, +1,229,255,233,0,10,0,15,255,6,0,17,255,6,1,198,255,211,1,202,255,164,1,203, +255,211,1,205,255,233,1,209,255,211,1,212,255,211,1,215,255,211,1,229,255, +233,0,2,1,224,255,211,1,227,0,23,0,9,1,199,255,233,1,202,255,211,1,204,255, +233,1,205,255,211,1,209,255,188,1,216,255,188,1,217,255,233,1,219,255,211, +1,221,255,188,0,4,1,199,0,23,1,217,0,23,1,221,255,233,1,224,0,45,0,11,1,199, +255,233,1,202,255,211,1,203,255,233,1,205,255,233,1,209,255,233,1,212,255, +233,1,215,255,233,1,217,255,233,1,218,255,233,1,221,255,188,1,224,255,211, +0,10,1,198,0,45,1,199,0,45,1,203,0,23,1,205,0,23,1,209,0,23,1,212,0,23,1, +215,0,23,1,216,0,23,1,217,0,23,1,227,0,23,0,2,1,212,0,23,1,221,255,211,0, +3,1,199,255,233,1,205,255,233,1,217,0,23,0,8,1,202,255,211,1,204,255,233, +1,205,255,233,1,209,255,211,1,216,255,211,1,217,255,233,1,219,255,233,1,221, +255,211,0,8,1,202,255,209,1,205,255,233,1,209,255,186,1,216,255,211,1,217, +255,233,1,219,255,233,1,221,255,211,1,229,255,233,0,4,1,204,0,23,1,212,0, +23,1,221,255,233,1,227,0,23,0,10,0,15,255,29,0,17,255,29,1,198,255,233,1, +202,255,188,1,203,255,233,1,204,0,68,1,209,255,211,1,212,255,233,1,215,255, +233,1,217,0,23,0,16,0,15,255,51,0,17,255,51,0,123,0,23,1,198,255,233,1,199, +0,23,1,202,255,188,1,203,255,233,1,204,0,23,1,209,255,211,1,210,255,233,1, +212,255,231,1,214,255,233,1,215,255,233,1,218,255,233,1,227,255,233,1,229, +255,233,0,7,1,199,255,233,1,202,255,211,1,209,255,211,1,216,255,211,1,217, +255,233,1,221,255,211,1,229,255,233,0,9,1,198,255,233,1,199,255,233,1,203, +255,233,1,205,255,233,1,212,255,233,1,215,255,233,1,216,255,233,1,218,255, +233,1,221,255,211,0,4,1,203,255,233,1,205,255,233,1,212,255,233,1,215,255, +233,0,3,1,203,255,233,1,212,255,233,1,217,0,23,0,2,1,216,255,96,1,221,255, +119,0,8,1,202,255,211,1,203,0,23,1,205,255,233,1,209,255,211,1,212,0,23,1, +216,255,211,1,219,255,233,1,229,255,233,0,7,1,202,255,211,1,204,255,233,1, +209,255,211,1,210,255,233,1,216,255,211,1,219,255,233,1,221,255,211,0,2,0, +15,255,51,0,17,255,51,0,7,0,15,255,6,0,17,255,6,0,29,255,211,0,30,255,211, +0,108,255,96,0,123,255,96,1,255,255,211,0,1,2,2,255,219,0,3,0,3,255,180,0, +86,255,219,2,3,255,219,0,5,1,153,255,96,1,162,255,96,1,184,255,96,1,189,255, +188,1,192,255,188,0,1,0,105,0,3,0,20,0,36,0,41,0,47,0,51,0,53,0,55,0,57,0, +58,0,60,0,73,0,85,0,89,0,90,0,92,1,82,1,87,1,88,1,89,1,91,1,93,1,94,1,98, +1,100,1,101,1,105,1,107,1,108,1,109,1,110,1,111,1,113,1,114,1,116,1,125,1, +127,1,129,1,131,1,132,1,135,1,136,1,137,1,138,1,141,1,143,1,144,1,146,1,149, +1,151,1,154,1,160,1,161,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1, +176,1,177,1,178,1,180,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,191,1,192, +1,194,1,195,1,196,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,208,1, +209,1,210,1,212,1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,223,1,226,1,227, +1,228,1,242,1,244,2,2,2,3,2,8,0,0,0,1,0,0,0,0,199,254,176,223,0,0,0,0,191, +26,255,128,0,0,0,0,196,4,48,20,}; +#endif diff --git a/contrib/media/updf_newlib/include/j2k.h b/contrib/media/updf_newlib/include/j2k.h new file mode 100755 index 000000000..8fc8e6dce --- /dev/null +++ b/contrib/media/updf_newlib/include/j2k.h @@ -0,0 +1,446 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __J2K_H +#define __J2K_H +/** +@file j2k.h +@brief The JPEG-2000 Codestream Reader/Writer (J2K) + +The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data. +*/ + +/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ +/*@{*/ + +#define J2K_CP_CSTY_PRT 0x01 +#define J2K_CP_CSTY_SOP 0x02 +#define J2K_CP_CSTY_EPH 0x04 +#define J2K_CCP_CSTY_PRT 0x01 +#define J2K_CCP_CBLKSTY_LAZY 0x01 /**< Selective arithmetic coding bypass */ +#define J2K_CCP_CBLKSTY_RESET 0x02 /**< Reset context probabilities on coding pass boundaries */ +#define J2K_CCP_CBLKSTY_TERMALL 0x04 /**< Termination on each coding pass */ +#define J2K_CCP_CBLKSTY_VSC 0x08 /**< Vertically stripe causal context */ +#define J2K_CCP_CBLKSTY_PTERM 0x10 /**< Predictable termination */ +#define J2K_CCP_CBLKSTY_SEGSYM 0x20 /**< Segmentation symbols are used */ +#define J2K_CCP_QNTSTY_NOQNT 0 +#define J2K_CCP_QNTSTY_SIQNT 1 +#define J2K_CCP_QNTSTY_SEQNT 2 + +/* ----------------------------------------------------------------------- */ + +#define J2K_MS_SOC 0xff4f /**< SOC marker value */ +#define J2K_MS_SOT 0xff90 /**< SOT marker value */ +#define J2K_MS_SOD 0xff93 /**< SOD marker value */ +#define J2K_MS_EOC 0xffd9 /**< EOC marker value */ +#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */ +#define J2K_MS_COD 0xff52 /**< COD marker value */ +#define J2K_MS_COC 0xff53 /**< COC marker value */ +#define J2K_MS_RGN 0xff5e /**< RGN marker value */ +#define J2K_MS_QCD 0xff5c /**< QCD marker value */ +#define J2K_MS_QCC 0xff5d /**< QCC marker value */ +#define J2K_MS_POC 0xff5f /**< POC marker value */ +#define J2K_MS_TLM 0xff55 /**< TLM marker value */ +#define J2K_MS_PLM 0xff57 /**< PLM marker value */ +#define J2K_MS_PLT 0xff58 /**< PLT marker value */ +#define J2K_MS_PPM 0xff60 /**< PPM marker value */ +#define J2K_MS_PPT 0xff61 /**< PPT marker value */ +#define J2K_MS_SOP 0xff91 /**< SOP marker value */ +#define J2K_MS_EPH 0xff92 /**< EPH marker value */ +#define J2K_MS_CRG 0xff63 /**< CRG marker value */ +#define J2K_MS_COM 0xff64 /**< COM marker value */ +/* UniPG>> */ +#ifdef USE_JPWL +#define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */ +#define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ +#define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ +#define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */ +#endif /* USE_JPWL */ +#ifdef USE_JPSEC +#define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */ +#define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */ +#endif /* USE_JPSEC */ +/* < there was a PPT marker for the present tile */ + int ppt; + /** used in case of multiple marker PPT (number of info already stored) */ + int ppt_store; + /** ppmbug1 */ + int ppt_len; + /** add fixed_quality */ + float distoratio[100]; + /** tile-component coding parameters */ + opj_tccp_t *tccps; +} opj_tcp_t; + +/** +Coding parameters +*/ +typedef struct opj_cp { + /** Digital cinema profile*/ + OPJ_CINEMA_MODE cinema; + /** Maximum rate for each component. If == 0, component size limitation is not considered */ + int max_comp_size; + /** Size of the image in bits*/ + int img_size; + /** Rsiz*/ + OPJ_RSIZ_CAPABILITIES rsiz; + /** Enabling Tile part generation*/ + char tp_on; + /** Flag determining tile part generation*/ + char tp_flag; + /** Position of tile part flag in progression order*/ + int tp_pos; + /** allocation by rate/distortion */ + int disto_alloc; + /** allocation by fixed layer */ + int fixed_alloc; + /** add fixed_quality */ + int fixed_quality; + /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ + int reduce; + /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ + int layer; + /** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */ + OPJ_LIMIT_DECODING limit_decoding; + /** XTOsiz */ + int tx0; + /** YTOsiz */ + int ty0; + /** XTsiz */ + int tdx; + /** YTsiz */ + int tdy; + /** comment for coding */ + char *comment; + /** number of tiles in width */ + int tw; + /** number of tiles in heigth */ + int th; + /** ID number of the tiles present in the codestream */ + int *tileno; + /** size of the vector tileno */ + int tileno_size; + /** packet header store there for futur use in t2_decode_packet */ + unsigned char *ppm_data; + /** pointer remaining on the first byte of the first header if ppm is used */ + unsigned char *ppm_data_first; + /** if ppm == 1 --> there was a PPM marker for the present tile */ + int ppm; + /** use in case of multiple marker PPM (number of info already store) */ + int ppm_store; + /** use in case of multiple marker PPM (case on non-finished previous info) */ + int ppm_previous; + /** ppmbug1 */ + int ppm_len; + /** tile coding parameters */ + opj_tcp_t *tcps; + /** fixed layer */ + int *matrice; +/* UniPG>> */ +#ifdef USE_JPWL + /** enables writing of EPC in MH, thus activating JPWL */ + bool epc_on; + /** enables writing of EPB, in case of activated JPWL */ + bool epb_on; + /** enables writing of ESD, in case of activated JPWL */ + bool esd_on; + /** enables writing of informative techniques of ESD, in case of activated JPWL */ + bool info_on; + /** enables writing of RED, in case of activated JPWL */ + bool red_on; + /** error protection method for MH (0,1,16,32,37-128) */ + int hprot_MH; + /** tile number of header protection specification (>=0) */ + int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** error protection methods for TPHs (0,1,16,32,37-128) */ + int hprot_TPH[JPWL_MAX_NO_TILESPECS]; + /** tile number of packet protection specification (>=0) */ + int pprot_tileno[JPWL_MAX_NO_PACKSPECS]; + /** packet number of packet protection specification (>=0) */ + int pprot_packno[JPWL_MAX_NO_PACKSPECS]; + /** error protection methods for packets (0,1,16,32,37-128) */ + int pprot[JPWL_MAX_NO_PACKSPECS]; + /** enables writing of ESD, (0/2/4 bytes) */ + int sens_size; + /** sensitivity addressing size (0=auto/2/4 bytes) */ + int sens_addr; + /** sensitivity range (0-3) */ + int sens_range; + /** sensitivity method for MH (-1,0-7) */ + int sens_MH; + /** tile number of sensitivity specification (>=0) */ + int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** sensitivity methods for TPHs (-1,0-7) */ + int sens_TPH[JPWL_MAX_NO_TILESPECS]; + /** enables JPWL correction at the decoder */ + bool correct; + /** expected number of components at the decoder */ + int exp_comps; + /** maximum number of tiles at the decoder */ + int max_tiles; +#endif /* USE_JPWL */ +/* <cp. +@param j2k J2K decompressor handle +@param parameters decompression parameters +*/ +void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters); +/** +Decode an image from a JPEG-2000 codestream +@param j2k J2K decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Decode an image form a JPT-stream (JPEG 2000, JPIP) +@param j2k J2K decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Creates a J2K compression structure +@param cinfo Codec context info +@return Returns a handle to a J2K compressor if successful, returns NULL otherwise +*/ +opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo); +/** +Destroy a J2K compressor handle +@param j2k J2K compressor handle to destroy +*/ +void j2k_destroy_compress(opj_j2k_t *j2k); +/** +Setup the encoder parameters using the current image and using user parameters. +Coding parameters are returned in j2k->cp. +@param j2k J2K compressor handle +@param parameters compression parameters +@param image input filled image +*/ +void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image); +/** +Converts an enum type progression order to string type +*/ +char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order); +/** +Encode an image into a JPEG-2000 codestream +@param j2k J2K compressor handle +@param cio Output buffer stream +@param image Image to encode +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns true if successful, returns false otherwise +*/ +bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __J2K_H */ diff --git a/contrib/media/updf_newlib/include/j2k_lib.h b/contrib/media/updf_newlib/include/j2k_lib.h new file mode 100755 index 000000000..7df4d3677 --- /dev/null +++ b/contrib/media/updf_newlib/include/j2k_lib.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __J2K_LIB_H +#define __J2K_LIB_H +/** +@file j2k_lib.h +@brief Internal functions + +The functions in J2K_LIB.C are internal utilities mainly used for timing. +*/ + +/** @defgroup MISC MISC - Miscellaneous internal functions */ +/*@{*/ + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ + +/** +Difference in successive opj_clock() calls tells you the elapsed time +@return Returns time in seconds +*/ +double opj_clock(void); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __J2K_LIB_H */ + diff --git a/contrib/media/updf_newlib/include/jbig2.h b/contrib/media/updf_newlib/include/jbig2.h new file mode 100755 index 000000000..c090516f6 --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2.h @@ -0,0 +1,135 @@ +/* + jbig2dec + + Copyright (C) 2002-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _JBIG2_H +#define _JBIG2_H + +/* warning levels */ +typedef enum { + JBIG2_SEVERITY_DEBUG, + JBIG2_SEVERITY_INFO, + JBIG2_SEVERITY_WARNING, + JBIG2_SEVERITY_FATAL +} Jbig2Severity; + +typedef enum { + JBIG2_OPTIONS_EMBEDDED = 1 +} Jbig2Options; + +/* forward public structure declarations */ +typedef struct _Jbig2Allocator Jbig2Allocator; +typedef struct _Jbig2Ctx Jbig2Ctx; +typedef struct _Jbig2GlobalCtx Jbig2GlobalCtx; +typedef struct _Jbig2Segment Jbig2Segment; +typedef struct _Jbig2Image Jbig2Image; + +/* private structures */ +typedef struct _Jbig2Page Jbig2Page; +typedef struct _Jbig2SymbolDictionary Jbig2SymbolDictionary; + +/* + this is the general image structure used by the jbig2dec library + images are 1 bpp, packed into rows a byte at a time. stride gives + the byte offset to the next row, while width and height define + the size of the image area in pixels. +*/ + +struct _Jbig2Image { + int width, height, stride; + uint8_t *data; + int refcount; +}; + +Jbig2Image* jbig2_image_new(Jbig2Ctx *ctx, int width, int height); +Jbig2Image* jbig2_image_clone(Jbig2Ctx *ctx, Jbig2Image *image); +void jbig2_image_release(Jbig2Ctx *ctx, Jbig2Image *image); +void jbig2_image_free(Jbig2Ctx *ctx, Jbig2Image *image); +void jbig2_image_clear(Jbig2Ctx *ctx, Jbig2Image *image, int value); +Jbig2Image *jbig2_image_resize(Jbig2Ctx *ctx, Jbig2Image *image, + int width, int height); + +/* errors are returned from the library via a callback. If no callback + is provided (a NULL argument is passed ot jbig2_ctx_new) a default + handler is used which prints fatal errors to the stderr stream. */ + +/* error callback */ +typedef int (*Jbig2ErrorCallback) (void *data, + const char *msg, Jbig2Severity severity, + int32_t seg_idx); + +/* memory allocation is likewise done via a set of callbacks so that + clients can better control memory usage. If a NULL is passed for + this argumennt of jbig2_ctx_new, a default allocator based on malloc() + is used. */ + +/* dynamic memory callbacks */ +struct _Jbig2Allocator { + void *(*alloc) (Jbig2Allocator *allocator, size_t size); + void (*free) (Jbig2Allocator *allocator, void *p); + void *(*realloc) (Jbig2Allocator *allocator, void *p, size_t size); +}; + +/* decoder context */ +Jbig2Ctx *jbig2_ctx_new (Jbig2Allocator *allocator, + Jbig2Options options, + Jbig2GlobalCtx *global_ctx, + Jbig2ErrorCallback error_callback, + void *error_callback_data); +void jbig2_ctx_free (Jbig2Ctx *ctx); + +/* global context for embedded streams */ +Jbig2GlobalCtx *jbig2_make_global_ctx (Jbig2Ctx *ctx); +void jbig2_global_ctx_free (Jbig2GlobalCtx *global_ctx); + +/* submit data to the decoder */ +int jbig2_data_in (Jbig2Ctx *ctx, const unsigned char *data, size_t size); + +/* get the next available decoded page image. NULL means there isn't one. */ +Jbig2Image *jbig2_page_out (Jbig2Ctx *ctx); +/* mark a returned page image as no longer needed. */ +int jbig2_release_page (Jbig2Ctx *ctx, Jbig2Image *image); +/* mark the current page as complete, simulating an end-of-page segment (for broken streams) */ +int jbig2_complete_page (Jbig2Ctx *ctx); + + +/* segment header routines */ + +struct _Jbig2Segment { + uint32_t number; + uint8_t flags; + uint32_t page_association; + size_t data_length; + int referred_to_segment_count; + uint32_t *referred_to_segments; + void *result; +}; + +Jbig2Segment *jbig2_parse_segment_header (Jbig2Ctx *ctx, uint8_t *buf, size_t buf_size, + size_t *p_header_size); +int jbig2_parse_segment (Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data); +void jbig2_free_segment (Jbig2Ctx *ctx, Jbig2Segment *segment); + +Jbig2Segment *jbig2_find_segment(Jbig2Ctx *ctx, uint32_t number); + +#endif /* _JBIG2_H */ + +#ifdef __cplusplus +} +#endif diff --git a/contrib/media/updf_newlib/include/jbig2_arith.h b/contrib/media/updf_newlib/include/jbig2_arith.h new file mode 100755 index 000000000..317878f57 --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_arith.h @@ -0,0 +1,31 @@ +/* + jbig2dec + + Copyright (C) 2001 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +typedef struct _Jbig2ArithState Jbig2ArithState; + +/* An arithmetic coding context is stored as a single byte, with the + index in the low order 7 bits (actually only 6 are used), and the + MPS in the top bit. */ +typedef unsigned char Jbig2ArithCx; + +/* allocate and initialize a new arithmetic coding state */ +Jbig2ArithState * +jbig2_arith_new (Jbig2Ctx *ctx, Jbig2WordStream *ws); + +/* decode a bit */ +bool +jbig2_arith_decode (Jbig2ArithState *as, Jbig2ArithCx *pcx); + + diff --git a/contrib/media/updf_newlib/include/jbig2_arith_iaid.h b/contrib/media/updf_newlib/include/jbig2_arith_iaid.h new file mode 100755 index 000000000..c04f898a8 --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_arith_iaid.h @@ -0,0 +1,26 @@ +/* + jbig2dec + + Copyright (C) 2001 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +typedef struct _Jbig2ArithIaidCtx Jbig2ArithIaidCtx; + +Jbig2ArithIaidCtx * +jbig2_arith_iaid_ctx_new(Jbig2Ctx *ctx, int SBSYMCODELEN); + +int +jbig2_arith_iaid_decode(Jbig2ArithIaidCtx *ctx, Jbig2ArithState *as, + int32_t *p_result); + +void +jbig2_arith_iaid_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIaidCtx *iax); diff --git a/contrib/media/updf_newlib/include/jbig2_arith_int.h b/contrib/media/updf_newlib/include/jbig2_arith_int.h new file mode 100755 index 000000000..3d3cb3f9c --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_arith_int.h @@ -0,0 +1,26 @@ +/* + jbig2dec + + Copyright (C) 2001 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +typedef struct _Jbig2ArithIntCtx Jbig2ArithIntCtx; + +Jbig2ArithIntCtx * +jbig2_arith_int_ctx_new(Jbig2Ctx *ctx); + +int +jbig2_arith_int_decode(Jbig2ArithIntCtx *ctx, Jbig2ArithState *as, + int32_t *p_result); + +void +jbig2_arith_int_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIntCtx *iax); diff --git a/contrib/media/updf_newlib/include/jbig2_generic.h b/contrib/media/updf_newlib/include/jbig2_generic.h new file mode 100755 index 000000000..9111cf7d3 --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_generic.h @@ -0,0 +1,62 @@ +/* + jbig2dec + + Copyright (C) 2002-2004 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/** + * Headers for Generic and Generic Refinement region handling + **/ + +/* 6.4 Table 2 */ +typedef struct { + bool MMR; + /* GBW */ + /* GBH */ + int GBTEMPLATE; + bool TPGDON; + bool USESKIP; + /* SKIP */ + int8_t gbat[8]; +} Jbig2GenericRegionParams; + +/* return the appropriate context size for the given template */ +int +jbig2_generic_stats_size(Jbig2Ctx *ctx, int template); + +int +jbig2_decode_generic_region(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats); + + +/* 6.3 Table 6 */ +typedef struct { + /* GRW */ + /* GRH */ + bool GRTEMPLATE; + Jbig2Image *reference; + int32_t DX, DY; + bool TPGRON; + int8_t grat[4]; +} Jbig2RefinementRegionParams; + +int +jbig2_decode_refinement_region(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2RefinementRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats); diff --git a/contrib/media/updf_newlib/include/jbig2_huffman.h b/contrib/media/updf_newlib/include/jbig2_huffman.h new file mode 100755 index 000000000..fb9b9f41d --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_huffman.h @@ -0,0 +1,105 @@ +/* + jbig2dec + + Copyright (C) 2001-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifndef JBIG2_HUFFMAN_H +#define JBIG2_HUFFMAN_H + +/* Huffman coder interface */ + +typedef struct _Jbig2HuffmanEntry Jbig2HuffmanEntry; +typedef struct _Jbig2HuffmanState Jbig2HuffmanState; +typedef struct _Jbig2HuffmanTable Jbig2HuffmanTable; +typedef struct _Jbig2HuffmanParams Jbig2HuffmanParams; + +struct _Jbig2HuffmanEntry { + union { + int32_t RANGELOW; + Jbig2HuffmanTable *ext_table; + } u; + byte PREFLEN; + byte RANGELEN; + byte flags; +}; + +struct _Jbig2HuffmanTable { + int log_table_size; + Jbig2HuffmanEntry *entries; +}; + +typedef struct _Jbig2HuffmanLine Jbig2HuffmanLine; + +struct _Jbig2HuffmanLine { + int PREFLEN; + int RANGELEN; + int RANGELOW; +}; + +struct _Jbig2HuffmanParams { + bool HTOOB; + int n_lines; + const Jbig2HuffmanLine *lines; +}; + +Jbig2HuffmanState * +jbig2_huffman_new (Jbig2Ctx *ctx, Jbig2WordStream *ws); + +void +jbig2_huffman_free (Jbig2Ctx *ctx, Jbig2HuffmanState *hs); + +void +jbig2_huffman_skip(Jbig2HuffmanState *hs); + +void jbig2_huffman_advance(Jbig2HuffmanState *hs, int offset); + +int +jbig2_huffman_offset(Jbig2HuffmanState *hs); + +int32_t +jbig2_huffman_get (Jbig2HuffmanState *hs, + const Jbig2HuffmanTable *table, bool *oob); + +int32_t +jbig2_huffman_get_bits (Jbig2HuffmanState *hs, const int bits); + +#ifdef JBIG2_DEBUG +void jbig2_dump_huffman_state(Jbig2HuffmanState *hs); +void jbig2_dump_huffman_binary(Jbig2HuffmanState *hs); +#endif + +Jbig2HuffmanTable * +jbig2_build_huffman_table (Jbig2Ctx *ctx, const Jbig2HuffmanParams *params); + +void +jbig2_release_huffman_table (Jbig2Ctx *ctx, Jbig2HuffmanTable *table); + +/* standard Huffman templates defined by the specification */ +extern const Jbig2HuffmanParams jbig2_huffman_params_A; /* Table B.1 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_B; /* Table B.2 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_C; /* Table B.3 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_D; /* Table B.4 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_E; /* Table B.5 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_F; /* Table B.6 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_G; /* Table B.7 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_H; /* Table B.8 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_I; /* Table B.9 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_J; /* Table B.10 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_K; /* Table B.11 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_L; /* Table B.12 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_M; /* Table B.13 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_N; /* Table B.14 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_O; /* Table B.15 */ + + +#endif /* JBIG2_HUFFMAN_H */ diff --git a/contrib/media/updf_newlib/include/jbig2_hufftab.h b/contrib/media/updf_newlib/include/jbig2_hufftab.h new file mode 100755 index 000000000..c8a967ac4 --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_hufftab.h @@ -0,0 +1,335 @@ +/* + jbig2dec + + Copyright (C) 2001-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* predefined Huffman table definitions + -- See Annex B of the JBIG2 specification */ + +#ifndef JBIG2_HUFFTAB_H +#define JBIG2_HUFFTAB_H + +/* types are in jbig2_huffman.h, you must include that first */ + + +/* Table B.1 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_A[] = { + { 1, 4, 0 }, + { 2, 8, 16 }, + { 3, 16, 272 }, + { 0, 32, -1 }, /* low */ + { 3, 32, 65808 } /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_A = { FALSE, 5, jbig2_huffman_lines_A }; + +/* Table B.2 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_B[] = { + { 1, 0, 0 }, + { 2, 0, 1 }, + { 3, 0, 2 }, + { 4, 3, 3 }, + { 5, 6, 11 }, + { 0, 32, -1 }, /* low */ + { 6, 32, 75 }, /* high */ + { 6, 0, 0 } +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_B = { TRUE, 8, jbig2_huffman_lines_B }; + +/* Table B.3 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_C[] = { + { 8, 8, -256 }, + { 1, 0, 0 }, + { 2, 0, 1 }, + { 3, 0, 2 }, + { 4, 3, 3 }, + { 5, 6, 11 }, + { 8, 32, -257 }, /* low */ + { 7, 32, 75 }, /* high */ + { 6, 0, 0 } /* OOB */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_C = { TRUE, 9, jbig2_huffman_lines_C }; + +/* Table B.4 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_D[] = { + { 1, 0, 1 }, + { 2, 0, 2 }, + { 3, 0, 3 }, + { 4, 3, 4 }, + { 5, 6, 12 }, + { 0, 32, -1 }, /* low */ + { 5, 32, 76 }, /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_D = { FALSE, 7, jbig2_huffman_lines_D }; + +/* Table B.5 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_E[] = { + {7, 8, -255}, + {1, 0, 1}, + {2, 0, 2}, + {3, 0, 3}, + {4, 3, 4}, + {5, 6, 12}, + {7, 32, -256}, /* low */ + {6, 32, 76} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_E = { FALSE, 8, jbig2_huffman_lines_E }; + +/* Table B.6 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_F[] = { + {5, 10, -2048}, + {4, 9, -1024}, + {4, 8, -512}, + {4, 7, -256}, + {5, 6, -128}, + {5, 5, -64}, + {4, 5, -32}, + {2, 7, 0}, + {3, 7, 128}, + {3, 8, 256}, + {4, 9, 512}, + {4, 10, 1024}, + {6, 32, -2049}, /* low */ + {6, 32, 2048} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_F = { FALSE, 14, jbig2_huffman_lines_F }; + +/* Table B.7 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_G[] = { + {4, 9, -1024}, + {3, 8, -512}, + {4, 7, -256}, + {5, 6, -128}, + {5, 5, -64}, + {4, 5, -32}, + {4, 5, 0}, + {5, 5, 32}, + {5, 6, 64}, + {4, 7, 128}, + {3, 8, 256}, + {3, 9, 512}, + {3, 10, 1024}, + {5, 32, -1025}, /* low */ + {5, 32, 2048} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_G = { FALSE, 15, jbig2_huffman_lines_G }; + +/* Table B.8 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_H[] = { + {8, 3, -15}, + {9, 1, -7}, + {8, 1, -5}, + {9, 0, -3}, + {7, 0, -2}, + {4, 0, -1}, + {2, 1, 0}, + {5, 0, 2}, + {6, 0, 3}, + {3, 4, 4}, + {6, 1, 20}, + {4, 4, 22}, + {4, 5, 38}, + {5, 6, 70}, + {5, 7, 134}, + {6, 7, 262}, + {7, 8, 390}, + {6, 10, 646}, + {9, 32, -16}, /* low */ + {9, 32, 1670}, /* high */ + {2, 0, 0} /* OOB */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_H = { TRUE, 21, jbig2_huffman_lines_H }; + +/* Table B.9 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_I[] = { + {8, 4, -31}, + {9, 2, -15}, + {8, 2, -11}, + {9, 1, -7}, + {7, 1, -5}, + {4, 1, -3}, + {3, 1, -1}, + {3, 1, 1}, + {5, 1, 3}, + {6, 1, 5}, + {3, 5, 7}, + {6, 2, 39}, + {4, 5, 43}, + {4, 6, 75}, + {5, 7, 139}, + {5, 8, 267}, + {6, 8, 523}, + {7, 9, 779}, + {6, 11, 1291}, + {9, 32, -32}, /* low */ + {9, 32, 3339}, /* high */ + {2, 0, 0} /* OOB */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_I = { TRUE, 22, jbig2_huffman_lines_I }; + +/* Table B.10 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_J[] = { + {7, 4, -21}, + {8, 0, -5}, + {7, 0, -4}, + {5, 0, -3}, + {2, 2, -2}, + {5, 0, 2}, + {6, 0, 3}, + {7, 0, 4}, + {8, 0, 5}, + {2, 6, 6}, + {5, 5, 70}, + {6, 5, 102}, + {6, 6, 134}, + {6, 7, 198}, + {6, 8, 326}, + {6, 9, 582}, + {6, 10, 1094}, + {7, 11, 2118}, + {8, 32, -22}, /* low */ + {8, 32, 4166}, /* high */ + {2, 0, 0} /* OOB */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_J = { TRUE, 21, jbig2_huffman_lines_J }; + +/* Table B.11 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_K[] = { + {1, 0, 1}, + {2, 1, 2}, + {4, 0, 3}, + {4, 1, 5}, + {5, 1, 7}, + {5, 2, 9}, + {6, 2, 13}, + {7, 2, 17}, + {7, 3, 21}, + {7, 4, 29}, + {7, 5, 45}, + {7, 6, 77}, + {7, 32, 141} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_K = { FALSE, 13, jbig2_huffman_lines_K }; + +/* Table B.12 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_L[] = { + {1, 0, 1}, + {2, 0, 2}, + {3, 1, 3}, + {5, 0, 5}, + {5, 1, 6}, + {6, 1, 8}, + {7, 0, 10}, + {7, 1, 11}, + {7, 2, 13}, + {7, 3, 17}, + {7, 4, 25}, + {8, 5, 41}, + {8, 32, 73} +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_L = { FALSE, 13, jbig2_huffman_lines_L }; + + +/* Table B.13 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_M[] = { + {1, 0, 1}, + {3, 0, 2}, + {4, 0, 3}, + {5, 0, 4}, + {4, 1, 5}, + {3, 3, 7}, + {6, 1, 15}, + {6, 2, 17}, + {6, 3, 21}, + {6, 4, 29}, + {6, 5, 45}, + {7, 6, 77}, + {7, 32, 141} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_M = { FALSE, 13, jbig2_huffman_lines_M }; + +/* Table B.14 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_N[] = { + { 3, 0, -2 }, + { 3, 0, -1 }, + { 1, 0, 0 }, + { 3, 3, 1 }, + { 3, 6, 2 }, + { 0, 32, -1 }, /* low */ + { 0, 32, 3 }, /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_N = { FALSE, 7, jbig2_huffman_lines_N }; + +/* Table B.15 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_O[] = { + {7, 4, -24}, + {6, 2, -8}, + {5, 1, -4}, + {4, 0, -2}, + {3, 0, -1}, + {1, 0, 0}, + {3, 0, 1}, + {4, 0, 2}, + {5, 1, 3}, + {6, 2, 5}, + {7, 4, 9}, + {7, 32, -25}, /* low */ + {7, 32, 25} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_O = { FALSE, 13, jbig2_huffman_lines_O }; + +#endif /* JBIG2_HUFFTAB_H */ diff --git a/contrib/media/updf_newlib/include/jbig2_image.h b/contrib/media/updf_newlib/include/jbig2_image.h new file mode 100755 index 000000000..a09e36820 --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_image.h @@ -0,0 +1,38 @@ +/* + jbig2dec + + Copyright (C) 2001-2002 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + + +#ifndef _JBIG2_IMAGE_H +#define _JBIG2_IMAGE_H + +int jbig2_image_get_pixel(Jbig2Image *image, int x, int y); +int jbig2_image_set_pixel(Jbig2Image *image, int x, int y, int value); + +/* routines for dumping the image data in various formats */ +/* FIXME: should these be in the client instead? */ + +#include + +int jbig2_image_write_pbm_file(Jbig2Image *image, char *filename); +int jbig2_image_write_pbm(Jbig2Image *image, FILE *out); +Jbig2Image *jbig2_image_read_pbm_file(Jbig2Ctx *ctx, char *filename); +Jbig2Image *jbig2_image_read_pbm(Jbig2Ctx *ctx, FILE *in); + +#ifdef HAVE_LIBPNG +int jbig2_image_write_png_file(Jbig2Image *image, char *filename); +int jbig2_image_write_png(Jbig2Image *image, FILE *out); +#endif + +#endif /* _JBIG2_IMAGE_H */ diff --git a/contrib/media/updf_newlib/include/jbig2_metadata.h b/contrib/media/updf_newlib/include/jbig2_metadata.h new file mode 100755 index 000000000..d61acab75 --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_metadata.h @@ -0,0 +1,48 @@ +/* + jbig2dec + + Copyright (C) 2003 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + + +#ifndef _JBIG2_METADATA_H +#define _JBIG2_METADATA_H + +/* metadata from extension segments */ + +/* these bits should be moved to jbig2.h for public access */ +typedef enum { + JBIG2_ENCODING_ASCII, + JBIG2_ENCODING_UCS16 +} Jbig2Encoding; + +typedef struct _Jbig2Metadata Jbig2Metadata; + +Jbig2Metadata *jbig2_metadata_new(Jbig2Ctx *ctx, Jbig2Encoding encoding); +void jbig2_metadata_free(Jbig2Ctx *ctx, Jbig2Metadata *md); +int jbig2_metadata_add(Jbig2Ctx *ctx, Jbig2Metadata *md, + const char *key, const int key_length, + const char *value, const int value_length); + +struct _Jbig2Metadata { + Jbig2Encoding encoding; + char **keys, **values; + int entries, max_entries; +}; + +/* these bits can go to jbig2_priv.h */ +int jbig2_comment_ascii(Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data); +int jbig2_comment_unicode(Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data); + +#endif /* _JBIG2_METADATA_H */ diff --git a/contrib/media/updf_newlib/include/jbig2_mmr.h b/contrib/media/updf_newlib/include/jbig2_mmr.h new file mode 100755 index 000000000..cde4ec689 --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_mmr.h @@ -0,0 +1,22 @@ +/* + jbig2dec + + Copyright (C) 2001 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +int +jbig2_decode_generic_mmr(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + const byte *data, size_t size, + Jbig2Image *image); + diff --git a/contrib/media/updf_newlib/include/jbig2_priv.h b/contrib/media/updf_newlib/include/jbig2_priv.h new file mode 100755 index 000000000..cf617ed06 --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_priv.h @@ -0,0 +1,177 @@ +/* + jbig2dec + + Copyright (C) 2002 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* library internals */ + +typedef uint8_t byte; +typedef int bool; + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL ((void*)0) +#endif + +typedef enum { + JBIG2_FILE_HEADER, + JBIG2_FILE_SEQUENTIAL_HEADER, + JBIG2_FILE_SEQUENTIAL_BODY, + JBIG2_FILE_RANDOM_HEADERS, + JBIG2_FILE_RANDOM_BODIES, + JBIG2_FILE_EOF +} Jbig2FileState; + +struct _Jbig2Ctx { + Jbig2Allocator *allocator; + Jbig2Options options; + const Jbig2Ctx *global_ctx; + Jbig2ErrorCallback error_callback; + void *error_callback_data; + + byte *buf; + size_t buf_size; + unsigned int buf_rd_ix; + unsigned int buf_wr_ix; + + Jbig2FileState state; + + uint8_t file_header_flags; + int32_t n_pages; + + int n_segments_max; + Jbig2Segment **segments; + int n_segments; /* index of last segment header parsed */ + int segment_index; /* index of last segment body parsed */ + + /* list of decoded pages, including the one in progress, + currently stored as a contiguous, 0-indexed array. */ + int current_page; + int max_page_index; + Jbig2Page *pages; +}; + +int32_t +jbig2_get_int32 (const byte *buf); + +int16_t +jbig2_get_int16 (const byte *buf); + +/* dynamic memory management */ +void * +jbig2_alloc (Jbig2Allocator *allocator, size_t size); + +void +jbig2_free (Jbig2Allocator *allocator, void *p); + +void * +jbig2_realloc (Jbig2Allocator *allocator, void *p, size_t size); + +#define jbig2_new(ctx, t, size) ((t *)jbig2_alloc(ctx->allocator, (size) * sizeof(t))) + +#define jbig2_renew(ctx, p, t, size) ((t *)jbig2_realloc(ctx->allocator, (p), (size) * sizeof(t))) + +int +jbig2_error (Jbig2Ctx *ctx, Jbig2Severity severity, int32_t seg_idx, + const char *fmt, ...); + +/* the page structure handles decoded page + results. it's allocated by a 'page info' + segement and marked complete by an 'end of page' + segment. +*/ +typedef enum { + JBIG2_PAGE_FREE, + JBIG2_PAGE_NEW, + JBIG2_PAGE_COMPLETE, + JBIG2_PAGE_RETURNED, + JBIG2_PAGE_RELEASED +} Jbig2PageState; + +struct _Jbig2Page { + Jbig2PageState state; + uint32_t number; + uint32_t height, width; /* in pixels */ + uint32_t x_resolution, + y_resolution; /* in pixels per meter */ + uint16_t stripe_size; + bool striped; + int end_row; + uint8_t flags; + Jbig2Image *image; +}; + +int jbig2_page_info (Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); +int jbig2_end_of_stripe(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); +int jbig2_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); +int jbig2_extension_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); + +typedef enum { + JBIG2_COMPOSE_OR = 0, + JBIG2_COMPOSE_AND = 1, + JBIG2_COMPOSE_XOR = 2, + JBIG2_COMPOSE_XNOR = 3, + JBIG2_COMPOSE_REPLACE = 4 +} Jbig2ComposeOp; + +int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, int x, int y, Jbig2ComposeOp op); +int jbig2_page_add_result(Jbig2Ctx *ctx, Jbig2Page *page, Jbig2Image *src, int x, int y, Jbig2ComposeOp op); + +/* region segment info */ + +typedef struct { + int32_t width; + int32_t height; + int32_t x; + int32_t y; + Jbig2ComposeOp op; + uint8_t flags; +} Jbig2RegionSegmentInfo; + +void jbig2_get_region_segment_info(Jbig2RegionSegmentInfo *info, const uint8_t *segment_data); +int jbig2_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); + +/* 7.4 */ +int jbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data); +int jbig2_refinement_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data); + +int jbig2_pattern_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data); +int jbig2_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data); + + +/* The word stream design is a compromise between simplicity and + trying to amortize the number of method calls. Each ::get_next_word + invocation pulls 4 bytes from the stream, packed big-endian into a + 32 bit word. The offset argument is provided as a convenience. It + begins at 0 and increments by 4 for each successive invocation. */ +typedef struct _Jbig2WordStream Jbig2WordStream; + +struct _Jbig2WordStream { + uint32_t (*get_next_word) (Jbig2WordStream *self, int offset); +}; + +Jbig2WordStream * +jbig2_word_stream_buf_new(Jbig2Ctx *ctx, const byte *data, size_t size); + +void +jbig2_word_stream_buf_free(Jbig2Ctx *ctx, Jbig2WordStream *ws); diff --git a/contrib/media/updf_newlib/include/jbig2_symbol_dict.h b/contrib/media/updf_newlib/include/jbig2_symbol_dict.h new file mode 100755 index 000000000..a927758ce --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_symbol_dict.h @@ -0,0 +1,56 @@ +/* + jbig2dec + + Copyright (C) 2001-2002 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* symbol dictionary header */ + +/* the results of decoding a symbol dictionary */ +typedef struct { + int n_symbols; + Jbig2Image **glyphs; +} Jbig2SymbolDict; + +/* decode a symbol dictionary segment and store the results */ +int +jbig2_symbol_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data); + +/* get a particular glyph by index */ +Jbig2Image * +jbig2_sd_glyph(Jbig2SymbolDict *dict, unsigned int id); + +/* return a new empty symbol dict */ +Jbig2SymbolDict * +jbig2_sd_new(Jbig2Ctx *ctx, int n_symbols); + +/* release the memory associated with a symbol dict */ +void +jbig2_sd_release(Jbig2Ctx *ctx, Jbig2SymbolDict *dict); + +/* generate a new symbol dictionary by concatenating a list of + existing dictionaries */ +Jbig2SymbolDict * +jbig2_sd_cat(Jbig2Ctx *ctx, int n_dicts, + Jbig2SymbolDict **dicts); + +/* count the number of dictionary segments referred + to by the given segment */ +int +jbig2_sd_count_referred(Jbig2Ctx *ctx, Jbig2Segment *segment); + +/* return an array of pointers to symbol dictionaries referred + to by a segment */ +Jbig2SymbolDict ** +jbig2_sd_list_referred(Jbig2Ctx *ctx, Jbig2Segment *segment); + diff --git a/contrib/media/updf_newlib/include/jbig2_text.h b/contrib/media/updf_newlib/include/jbig2_text.h new file mode 100755 index 000000000..bf6fff33a --- /dev/null +++ b/contrib/media/updf_newlib/include/jbig2_text.h @@ -0,0 +1,73 @@ +/* + jbig2dec + + Copyright (C) 2002-2004 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/** + * Headers for Text region handling + **/ + +typedef enum { + JBIG2_CORNER_BOTTOMLEFT = 0, + JBIG2_CORNER_TOPLEFT = 1, + JBIG2_CORNER_BOTTOMRIGHT = 2, + JBIG2_CORNER_TOPRIGHT = 3 +} Jbig2RefCorner; + +typedef struct { + bool SBHUFF; + bool SBREFINE; + bool SBDEFPIXEL; + Jbig2ComposeOp SBCOMBOP; + bool TRANSPOSED; + Jbig2RefCorner REFCORNER; + int SBDSOFFSET; + /* int SBW; */ + /* int SBH; */ + uint32_t SBNUMINSTANCES; + int LOGSBSTRIPS; + int SBSTRIPS; + /* int SBNUMSYMS; */ + /* SBSYMCODES */ + /* SBSYMCODELEN */ + /* SBSYMS */ + Jbig2HuffmanTable *SBHUFFFS; + Jbig2HuffmanTable *SBHUFFDS; + Jbig2HuffmanTable *SBHUFFDT; + Jbig2HuffmanTable *SBHUFFRDW; + Jbig2HuffmanTable *SBHUFFRDH; + Jbig2HuffmanTable *SBHUFFRDX; + Jbig2HuffmanTable *SBHUFFRDY; + Jbig2HuffmanTable *SBHUFFRSIZE; + Jbig2ArithIntCtx *IADT; + Jbig2ArithIntCtx *IAFS; + Jbig2ArithIntCtx *IADS; + Jbig2ArithIntCtx *IAIT; + Jbig2ArithIaidCtx *IAID; + Jbig2ArithIntCtx *IARI; + Jbig2ArithIntCtx *IARDW; + Jbig2ArithIntCtx *IARDH; + Jbig2ArithIntCtx *IARDX; + Jbig2ArithIntCtx *IARDY; + bool SBRTEMPLATE; + int8_t sbrat[4]; +} Jbig2TextRegionParams; + +int +jbig2_decode_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const Jbig2TextRegionParams *params, + const Jbig2SymbolDict * const *dicts, const int n_dicts, + Jbig2Image *image, + const byte *data, const size_t size, + Jbig2ArithCx *GR_stats, + Jbig2ArithState *as, Jbig2WordStream *ws); diff --git a/contrib/media/updf_newlib/include/jconfig.h b/contrib/media/updf_newlib/include/jconfig.h new file mode 100755 index 000000000..f759a9dbd --- /dev/null +++ b/contrib/media/updf_newlib/include/jconfig.h @@ -0,0 +1,38 @@ +/* jconfig.dj --- jconfig.h for DJGPP (Delorie's GNU C port) on MS-DOS. */ +/* see jconfig.doc for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS /* DJGPP uses flat 32-bit addressing */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE /* optional */ +#define USE_SETMODE /* Needed to make one-file style work in DJGPP */ +#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/contrib/media/updf_newlib/include/jmorecfg.h b/contrib/media/updf_newlib/include/jmorecfg.h new file mode 100755 index 000000000..54a7d1c44 --- /dev/null +++ b/contrib/media/updf_newlib/include/jmorecfg.h @@ -0,0 +1,363 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 10 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JSAMPLE; +#ifdef CHAR_IS_UNSIGNED +#define GETJSAMPLE(value) ((int) (value)) +#else +#define GETJSAMPLE(value) ((int) (value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* BITS_IN_JSAMPLE == 8 */ + + +#if BITS_IN_JSAMPLE == 12 +/* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JOCTET; +#ifdef CHAR_IS_UNSIGNED +#define GETJOCTET(value) (value) +#else +#define GETJOCTET(value) ((value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char UINT8; +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char UINT8; +#else /* not CHAR_IS_UNSIGNED */ +typedef short UINT8; +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +/* UINT16 must hold at least the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT +typedef unsigned short UINT16; +#else /* not HAVE_UNSIGNED_SHORT */ +typedef unsigned int UINT16; +#endif /* HAVE_UNSIGNED_SHORT */ + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +typedef long INT32; +#endif + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#ifdef HAVE_PROTOTYPES +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define JMETHOD(type,methodname,arglist) type (*methodname) () +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifndef HAVE_BOOLEAN +typedef int boolean; +#endif +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ + +/* Encoder capability options: */ + +#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not + * useful if you are using JPEG color spaces other than YCbCr or grayscale. + * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#ifdef HAVE_PROTOTYPES +#define FAST_FLOAT float +#else +#define FAST_FLOAT double +#endif +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/contrib/media/updf_newlib/include/jp2.h b/contrib/media/updf_newlib/include/jp2.h new file mode 100755 index 000000000..9ad662cb9 --- /dev/null +++ b/contrib/media/updf_newlib/include/jp2.h @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __JP2_H +#define __JP2_H +/** +@file jp2.h +@brief The JPEG-2000 file format Reader/Writer (JP2) + +*/ + +/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ +/*@{*/ + +#define JPIP_JPIP 0x6a706970 + +#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */ +#define JP2_FTYP 0x66747970 /**< File type box */ +#define JP2_JP2H 0x6a703268 /**< JP2 header box */ +#define JP2_IHDR 0x69686472 /**< Image header box */ +#define JP2_COLR 0x636f6c72 /**< Colour specification box */ +#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */ +#define JP2_URL 0x75726c20 /**< URL box */ +#define JP2_DTBL 0x6474626c /**< Data Reference box */ +#define JP2_BPCC 0x62706363 /**< Bits per component box */ +#define JP2_JP2 0x6a703220 /**< File type fields */ +#define JP2_PCLR 0x70636c72 /**< Palette box */ +#define JP2_CMAP 0x636d6170 /**< Component Mapping box */ +#define JP2_CDEF 0x63646566 /**< Channel Definition box */ + +/* ----------------------------------------------------------------------- */ +/** +Channel description: channel index, type, assocation +*/ +typedef struct opj_jp2_cdef_info +{ + unsigned short cn, typ, asoc; +} opj_jp2_cdef_info_t; + +/** +Channel descriptions and number of descriptions +*/ +typedef struct opj_jp2_cdef +{ + opj_jp2_cdef_info_t *info; + unsigned short n; +} opj_jp2_cdef_t; + +/** +Component mappings: channel index, mapping type, palette index +*/ +typedef struct opj_jp2_cmap_comp +{ + unsigned short cmp; + unsigned char mtyp, pcol; +} opj_jp2_cmap_comp_t; + +/** +Palette data: table entries, palette columns +*/ +typedef struct opj_jp2_pclr +{ + unsigned int *entries; + unsigned char *channel_sign; + unsigned char *channel_size; + opj_jp2_cmap_comp_t *cmap; + unsigned short nr_entries, nr_channels; +} opj_jp2_pclr_t; + +/** +Collector for ICC profile, palette, component mapping, channel description +*/ +typedef struct opj_jp2_color +{ + unsigned char *icc_profile_buf; + int icc_profile_len; + + opj_jp2_cdef_t *jp2_cdef; + opj_jp2_pclr_t *jp2_pclr; + unsigned char jp2_has_colr; +} opj_jp2_color_t; + +/** +JP2 component +*/ +typedef struct opj_jp2_comps { + int depth; + int sgnd; + int bpcc; +} opj_jp2_comps_t; + +/** +JPEG-2000 file format reader/writer +*/ +typedef struct opj_jp2 { + /** codec context */ + opj_common_ptr cinfo; + /** handle to the J2K codec */ + opj_j2k_t *j2k; + unsigned int w; + unsigned int h; + unsigned int numcomps; + unsigned int bpc; + unsigned int C; + unsigned int UnkC; + unsigned int IPR; + unsigned int meth; + unsigned int approx; + unsigned int enumcs; + unsigned int precedence; + unsigned int brand; + unsigned int minversion; + unsigned int numcl; + unsigned int *cl; + opj_jp2_comps_t *comps; + unsigned int j2k_codestream_offset; + unsigned int j2k_codestream_length; +} opj_jp2_t; + +/** +JP2 Box +*/ +typedef struct opj_jp2_box { + int length; + int type; + int init_pos; +} opj_jp2_box_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Write the JP2H box - JP2 Header box (used in MJ2) +@param jp2 JP2 handle +@param cio Output buffer stream +*/ +void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio); +/** +Read the JP2H box - JP2 Header box (used in MJ2) +@param jp2 JP2 handle +@param cio Input buffer stream +@param ext Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color); +/** +Creates a JP2 decompression structure +@param cinfo Codec context info +@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise +*/ +opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo); +/** +Destroy a JP2 decompressor handle +@param jp2 JP2 decompressor handle to destroy +*/ +void jp2_destroy_decompress(opj_jp2_t *jp2); +/** +Setup the decoder decoding parameters using user parameters. +Decoding parameters are returned in jp2->j2k->cp. +@param jp2 JP2 decompressor handle +@param parameters decompression parameters +*/ +void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters); +/** +Decode an image from a JPEG-2000 file stream +@param jp2 JP2 decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Creates a JP2 compression structure +@param cinfo Codec context info +@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise +*/ +opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo); +/** +Destroy a JP2 compressor handle +@param jp2 JP2 compressor handle to destroy +*/ +void jp2_destroy_compress(opj_jp2_t *jp2); +/** +Setup the encoder parameters using the current image and using user parameters. +Coding parameters are returned in jp2->j2k->cp. +@param jp2 JP2 compressor handle +@param parameters compression parameters +@param image input filled image +*/ +void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image); +/** +Encode an image into a JPEG-2000 file stream +@param jp2 JP2 compressor handle +@param cio Output buffer stream +@param image Image to encode +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns true if successful, returns false otherwise +*/ +bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __JP2_H */ + diff --git a/contrib/media/updf_newlib/include/jpeglib.h b/contrib/media/updf_newlib/include/jpeglib.h new file mode 100755 index 000000000..d1be8ddef --- /dev/null +++ b/contrib/media/updf_newlib/include/jpeglib.h @@ -0,0 +1,1096 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +/* Version ID for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60". + */ + +#define JPEG_LIB_VERSION 62 /* Version 6b */ + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples. Always DCTSIZE for compression. + * For decompression this is the size of the output from one DCT block, + * reflecting any scaling we choose to apply during the IDCT step. + * Values of 1,2,4,8 are likely to be supported. Note that different + * components may receive different IDCT scalings. + */ + int DCT_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface), thus + * downsampled_width = ceil(image_width * Hi/Hmax) + * and similarly for height. For decompression, IDCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(void, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +}; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#ifdef HAVE_PROTOTYPES +#define JPP(arglist) arglist +#else +#define JPP(arglist) () +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. + * We shorten external names to be unique in the first six letters, which + * is good enough for all known systems. + * (If your compiler itself needs names to be unique in less than 15 + * characters, you are out of luck. Get a better compiler.) + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_error jStdError +#define jpeg_CreateCompress jCreaCompress +#define jpeg_CreateDecompress jCreaDecompress +#define jpeg_destroy_compress jDestCompress +#define jpeg_destroy_decompress jDestDecompress +#define jpeg_stdio_dest jStdDest +#define jpeg_stdio_src jStdSrc +#define jpeg_set_defaults jSetDefaults +#define jpeg_set_colorspace jSetColorspace +#define jpeg_default_colorspace jDefColorspace +#define jpeg_set_quality jSetQuality +#define jpeg_set_linear_quality jSetLQuality +#define jpeg_add_quant_table jAddQuantTable +#define jpeg_quality_scaling jQualityScaling +#define jpeg_simple_progression jSimProgress +#define jpeg_suppress_tables jSuppressTables +#define jpeg_alloc_quant_table jAlcQTable +#define jpeg_alloc_huff_table jAlcHTable +#define jpeg_start_compress jStrtCompress +#define jpeg_write_scanlines jWrtScanlines +#define jpeg_finish_compress jFinCompress +#define jpeg_write_raw_data jWrtRawData +#define jpeg_write_marker jWrtMarker +#define jpeg_write_m_header jWrtMHeader +#define jpeg_write_m_byte jWrtMByte +#define jpeg_write_tables jWrtTables +#define jpeg_read_header jReadHeader +#define jpeg_start_decompress jStrtDecompress +#define jpeg_read_scanlines jReadScanlines +#define jpeg_finish_decompress jFinDecompress +#define jpeg_read_raw_data jReadRawData +#define jpeg_has_multiple_scans jHasMultScn +#define jpeg_start_output jStrtOutput +#define jpeg_finish_output jFinOutput +#define jpeg_input_complete jInComplete +#define jpeg_new_colormap jNewCMap +#define jpeg_consume_input jConsumeInput +#define jpeg_calc_output_dimensions jCalcDimensions +#define jpeg_save_markers jSaveMarkers +#define jpeg_set_marker_processor jSetMarker +#define jpeg_read_coefficients jReadCoefs +#define jpeg_write_coefficients jWrtCoefs +#define jpeg_copy_critical_parameters jCopyCrit +#define jpeg_abort_compress jAbrtCompress +#define jpeg_abort_decompress jAbrtDecompress +#define jpeg_abort jAbort +#define jpeg_destroy jDestroy +#define jpeg_resync_to_restart jResyncRestart +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); +EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.doc concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#endif /* JPEGLIB_H */ diff --git a/contrib/media/updf_newlib/include/jpt.h b/contrib/media/updf_newlib/include/jpt.h new file mode 100755 index 000000000..eb01f98eb --- /dev/null +++ b/contrib/media/updf_newlib/include/jpt.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __JPT_H +#define __JPT_H +/** +@file jpt.h +@brief JPT-stream reader (JPEG 2000, JPIP) + +JPT-stream functions are implemented in J2K.C. +*/ + +/** +Message Header JPT stream structure +*/ +typedef struct opj_jpt_msg_header { + /** In-class Identifier */ + unsigned int Id; + /** Last byte information */ + unsigned int last_byte; + /** Class Identifier */ + unsigned int Class_Id; + /** CSn : index identifier */ + unsigned int CSn_Id; + /** Message offset */ + unsigned int Msg_offset; + /** Message length */ + unsigned int Msg_length; + /** Auxiliary for JPP case */ + unsigned int Layer_nb; +} opj_jpt_msg_header_t; + +/* ----------------------------------------------------------------------- */ + +/** +Initialize the value of the message header structure +@param header Message header structure +*/ +void jpt_init_msg_header(opj_jpt_msg_header_t * header); + +/** +Read the message header for a JPP/JPT - stream +@param cinfo Codec context info +@param cio CIO handle +@param header Message header structure +*/ +void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header); + +#endif diff --git a/contrib/media/updf_newlib/include/openjpeg.h b/contrib/media/updf_newlib/include/openjpeg.h new file mode 100755 index 000000000..7ad62bf6d --- /dev/null +++ b/contrib/media/updf_newlib/include/openjpeg.h @@ -0,0 +1,915 @@ + /* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef OPENJPEG_H +#define OPENJPEG_H + + +/* +========================================================== + Compiler directives +========================================================== +*/ + +#if defined(OPJ_STATIC) || !defined(_WIN32) +#define OPJ_API +#define OPJ_CALLCONV +#else +#define OPJ_CALLCONV __stdcall +/* +The following ifdef block is the standard way of creating macros which make exporting +from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS +symbol defined on the command line. this symbol should not be defined on any project +that uses this DLL. This way any other project whose source files include this file see +OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols +defined with this macro as being exported. +*/ +#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT) +#define OPJ_API __declspec(dllexport) +#else +#define OPJ_API __declspec(dllimport) +#endif /* OPJ_EXPORTS */ +#endif /* !OPJ_STATIC || !_WIN32 */ + +#ifndef __cplusplus +#if defined(HAVE_STDBOOL_H) +/* +The C language implementation does correctly provide the standard header +file "stdbool.h". + */ +#include +#else +/* +The C language implementation does not provide the standard header file +"stdbool.h" as required by ISO/IEC 9899:1999. Try to compensate for this +braindamage below. +*/ +#if !defined(bool) +#define bool int +#endif +#if !defined(true) +#define true 1 +#endif +#if !defined(false) +#define false 0 +#endif +#endif +#endif /* __cplusplus */ + +/* +========================================================== + Useful constant definitions +========================================================== +*/ + +#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */ + +#define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */ +#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */ + +/* UniPG>> */ +#define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */ +#define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */ +#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */ +#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */ +#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */ +#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */ +#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */ +#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */ +/* < +
  • Error messages +
  • Warning messages +
  • Debugging messages + +*/ +typedef struct opj_event_mgr { + /** Error message callback if available, NULL otherwise */ + opj_msg_callback error_handler; + /** Warning message callback if available, NULL otherwise */ + opj_msg_callback warning_handler; + /** Debug message callback if available, NULL otherwise */ + opj_msg_callback info_handler; +} opj_event_mgr_t; + + +/* +========================================================== + codec typedef definitions +========================================================== +*/ + +/** +Progression order changes +*/ +typedef struct opj_poc { + /** Resolution num start, Component num start, given by POC */ + int resno0, compno0; + /** Layer num end,Resolution num end, Component num end, given by POC */ + int layno1, resno1, compno1; + /** Layer num start,Precinct num start, Precinct num end */ + int layno0, precno0, precno1; + /** Progression order enum*/ + OPJ_PROG_ORDER prg1,prg; + /** Progression order string*/ + char progorder[5]; + /** Tile number */ + int tile; + /** Start and end values for Tile width and height*/ + int tx0,tx1,ty0,ty1; + /** Start value, initialised in pi_initialise_encode*/ + int layS, resS, compS, prcS; + /** End value, initialised in pi_initialise_encode */ + int layE, resE, compE, prcE; + /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/ + int txS,txE,tyS,tyE,dx,dy; + /** Temporary values for Tile parts, initialised in pi_create_encode */ + int lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t; +} opj_poc_t; + +/** +Compression parameters +*/ +typedef struct opj_cparameters { + /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */ + bool tile_size_on; + /** XTOsiz */ + int cp_tx0; + /** YTOsiz */ + int cp_ty0; + /** XTsiz */ + int cp_tdx; + /** YTsiz */ + int cp_tdy; + /** allocation by rate/distortion */ + int cp_disto_alloc; + /** allocation by fixed layer */ + int cp_fixed_alloc; + /** add fixed_quality */ + int cp_fixed_quality; + /** fixed layer */ + int *cp_matrice; + /** comment for coding */ + char *cp_comment; + /** csty : coding style */ + int csty; + /** progression order (default LRCP) */ + OPJ_PROG_ORDER prog_order; + /** progression order changes */ + opj_poc_t POC[32]; + /** number of progression order changes (POC), default to 0 */ + int numpocs; + /** number of layers */ + int tcp_numlayers; + /** rates of layers */ + float tcp_rates[100]; + /** different psnr for successive layers */ + float tcp_distoratio[100]; + /** number of resolutions */ + int numresolution; + /** initial code block width, default to 64 */ + int cblockw_init; + /** initial code block height, default to 64 */ + int cblockh_init; + /** mode switch (cblk_style) */ + int mode; + /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ + int irreversible; + /** region of interest: affected component in [0..3], -1 means no ROI */ + int roi_compno; + /** region of interest: upshift value */ + int roi_shift; + /* number of precinct size specifications */ + int res_spec; + /** initial precinct width */ + int prcw_init[J2K_MAXRLVLS]; + /** initial precinct height */ + int prch_init[J2K_MAXRLVLS]; + + /**@name command line encoder parameters (not used inside the library) */ + /*@{*/ + /** input file name */ + char infile[OPJ_PATH_LEN]; + /** output file name */ + char outfile[OPJ_PATH_LEN]; + /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ + int index_on; + /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ + char index[OPJ_PATH_LEN]; + /** subimage encoding: origin image offset in x direction */ + int image_offset_x0; + /** subimage encoding: origin image offset in y direction */ + int image_offset_y0; + /** subsampling value for dx */ + int subsampling_dx; + /** subsampling value for dy */ + int subsampling_dy; + /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/ + int decod_format; + /** output file format 0: J2K, 1: JP2, 2: JPT */ + int cod_format; + /*@}*/ + +/* UniPG>> */ + /**@name JPWL encoding parameters */ + /*@{*/ + /** enables writing of EPC in MH, thus activating JPWL */ + bool jpwl_epc_on; + /** error protection method for MH (0,1,16,32,37-128) */ + int jpwl_hprot_MH; + /** tile number of header protection specification (>=0) */ + int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** error protection methods for TPHs (0,1,16,32,37-128) */ + int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS]; + /** tile number of packet protection specification (>=0) */ + int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS]; + /** packet number of packet protection specification (>=0) */ + int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS]; + /** error protection methods for packets (0,1,16,32,37-128) */ + int jpwl_pprot[JPWL_MAX_NO_PACKSPECS]; + /** enables writing of ESD, (0=no/1/2 bytes) */ + int jpwl_sens_size; + /** sensitivity addressing size (0=auto/2/4 bytes) */ + int jpwl_sens_addr; + /** sensitivity range (0-3) */ + int jpwl_sens_range; + /** sensitivity method for MH (-1=no,0-7) */ + int jpwl_sens_MH; + /** tile number of sensitivity specification (>=0) */ + int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** sensitivity methods for TPHs (-1=no,0-7) */ + int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS]; + /*@}*/ +/* <> */ + /**@name JPWL decoding parameters */ + /*@{*/ + /** activates the JPWL correction capabilities */ + bool jpwl_correct; + /** expected number of components */ + int jpwl_exp_comps; + /** maximum number of tiles */ + int jpwl_max_tiles; + /*@}*/ +/* <> */ +/** +Marker structure +*/ +typedef struct opj_marker_info_t { + /** marker type */ + unsigned short int type; + /** position in codestream */ + int pos; + /** length, marker val included */ + int len; +} opj_marker_info_t; +/* <> */ + /** number of markers */ + int marknum; + /** list of markers */ + opj_marker_info_t *marker; + /** actual size of markers array */ + int maxmarknum; +/* <cp. +@param dinfo decompressor handle +@param parameters decompression parameters +*/ +OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters); +/** +Decode an image from a JPEG-2000 codestream +@param dinfo decompressor handle +@param cio Input buffer stream +@return Returns a decoded image if successful, returns NULL otherwise +*/ +OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio); + +/** +Decode an image from a JPEG-2000 codestream and extract the codestream information +@param dinfo decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if needed afterwards, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Creates a J2K/JP2 compression structure +@param format Coder to select +@return Returns a handle to a compressor if successful, returns NULL otherwise +*/ +OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format); +/** +Destroy a compressor handle +@param cinfo compressor handle to destroy +*/ +OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo); +/** +Set encoding parameters to default values, that means : +
      +
    • Lossless +
    • 1 tile +
    • Size of precinct : 2^15 x 2^15 (means 1 precinct) +
    • Size of code-block : 64 x 64 +
    • Number of resolutions: 6 +
    • No SOP marker in the codestream +
    • No EPH marker in the codestream +
    • No sub-sampling in x or y direction +
    • No mode switch activated +
    • Progression order: LRCP +
    • No index file +
    • No ROI upshifted +
    • No offset of the origin of the image +
    • No offset of the origin of the tiles +
    • Reversible DWT 5-3 +
    +@param parameters Compression parameters +*/ +OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters); +/** +Setup the encoder parameters using the current image and using user parameters. +@param cinfo Compressor handle +@param parameters Compression parameters +@param image Input filled image +*/ +OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image); +/** +Encode an image into a JPEG-2000 codestream +@param cinfo compressor handle +@param cio Output buffer stream +@param image Image to encode +@param index Depreacted -> Set to NULL. To extract index, used opj_encode_wci() +@return Returns true if successful, returns false otherwise +*/ +OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index); +/** +Encode an image into a JPEG-2000 codestream and extract the codestream information +@param cinfo compressor handle +@param cio Output buffer stream +@param image Image to encode +@param cstr_info Codestream information structure if needed afterwards, NULL otherwise +@return Returns true if successful, returns false otherwise +*/ +OPJ_API bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); +/** +Destroy Codestream information after compression or decompression +@param cstr_info Codestream information structure +*/ +OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info); + +#ifdef __cplusplus +} +#endif + +#endif /* OPENJPEG_H */ diff --git a/contrib/media/updf_newlib/libjbig2dec/Makefile b/contrib/media/updf_newlib/libjbig2dec/Makefile new file mode 100755 index 000000000..7d70288fe --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/Makefile @@ -0,0 +1,18 @@ +CC = kos32-gcc +LD = kos32-ld + +SDK_DIR = /media/maxim/E22406D62406AE1B/SVNKOS/contrib/sdk +CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 + +INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I $(SDK_DIR)/sources/freetype/include -I $(SDK_DIR)/sources/libpng -I $(SDK_DIR)/sources/zlib -I . + +SRC := $(notdir $(wildcard *.c)) +OBJECTS = $(patsubst %.c, %.o, $(SRC)) + +default: $(patsubst %.c,%.o,$(SRC)) + ar rcs libjbig2dec.a *.o + rm *.o + mv libjbig2dec.a ../lib + +%.o : %.c Makefile $(SRC) + $(CC) $(CFLAGS) -DHAVE_CONFIG_H $(INCLUDES) -o $@ $< diff --git a/contrib/media/updf_newlib/libjbig2dec/config.h b/contrib/media/updf_newlib/libjbig2dec/config.h new file mode 100755 index 000000000..f15184a10 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/config.h @@ -0,0 +1,120 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if the local libc includes getopt_long() */ +#define HAVE_GETOPT_LONG /**/ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LIBINTL_H 1 + +/* Define if libpng is available (-lpng) */ +#define HAVE_LIBPNG 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* set by configure if an alternate header with the stdint.h types is found */ +/* #undef JBIG2_REPLACE_STDINT_H */ + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "jbig2dec" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "jbig2-dev@ghostscript.com" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "jbig2dec" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "jbig2dec 0.11" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "jbig2dec" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.11" + +/* The size of `char', as computed by sizeof. */ +#define SIZEOF_CHAR 1 + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* The size of `short', as computed by sizeof. */ +#define SIZEOF_SHORT 2 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "0.11" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ diff --git a/contrib/media/updf_newlib/libjbig2dec/config_types.h b/contrib/media/updf_newlib/libjbig2dec/config_types.h new file mode 100755 index 000000000..b6c67332b --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/config_types.h @@ -0,0 +1,19 @@ +/* + generated header with missing types for the + jbig2dec program and library. include this + after config.h, within the HAVE_CONFIG_H + ifdef +*/ + +#ifndef HAVE_STDINT_H +# ifdef JBIG2_REPLACE_STDINT_H +# include +# else + typedef unsigned int uint32_t; + typedef unsigned short uint16_t; + typedef unsigned char uint8_t; + typedef signed int int32_t; + typedef signed short int16_t; + typedef signed char int8_t; +# endif /* JBIG2_REPLACE_STDINT */ +#endif /* HAVE_STDINT_H */ diff --git a/contrib/media/updf_newlib/libjbig2dec/config_win32.h b/contrib/media/updf_newlib/libjbig2dec/config_win32.h new file mode 100755 index 000000000..2f33e7400 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/config_win32.h @@ -0,0 +1,41 @@ +/* + jbig2dec + + Copyright (C) 2002-2003 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* configuration header file for compiling under Microsoft Windows */ + +/* update package version here */ +#define PACKAGE "jbig2dec" +#define VERSION "0.3" + +#if defined(_MSC_VER) || (defined(__BORLANDC__) && defined(__WIN32__)) + /* Microsoft Visual C++ or Borland C++ */ + typedef signed char int8_t; + typedef short int int16_t; + typedef int int32_t; + typedef __int64 int64_t; + + typedef unsigned char uint8_t; + typedef unsigned short int uint16_t; + typedef unsigned int uint32_t; + /* no uint64_t */ + +# if defined(_MSC_VER) +# if _MSC_VER < 1500 /* VS 2008 has vsnprintf */ +# define vsnprintf _vsnprintf +# endif +# endif +# define snprintf _snprintf + +#endif /* _MSC_VER */ diff --git a/contrib/media/updf_newlib/libjbig2dec/getopt.h b/contrib/media/updf_newlib/libjbig2dec/getopt.h new file mode 100755 index 000000000..a1b8dd665 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/getopt.h @@ -0,0 +1,180 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +# if (defined __STDC__ && __STDC__) || defined __cplusplus + const char *name; +# else + char *name; +# endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#if (defined __STDC__ && __STDC__) || defined __cplusplus +# ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int __argc, char *const *__argv, const char *__shortopts); +# else /* not __GNU_LIBRARY__ */ +extern int getopt (); +# endif /* __GNU_LIBRARY__ */ + +# ifndef __need_getopt +extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, + const struct option *__longopts, int *__longind); +extern int getopt_long_only (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); +# endif +#else /* not __STDC__ */ +extern int getopt (); +# ifndef __need_getopt +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +# endif +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2.c b/contrib/media/updf_newlib/libjbig2dec/jbig2.c new file mode 100755 index 000000000..77f2eef46 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2.c @@ -0,0 +1,428 @@ +/* + jbig2dec + + Copyright (C) 2002-2005 Artifex Software, Inc. + + This software is provided AS-IS with no warranty, + either express or implied. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include +#include +#include + +#include "jbig2.h" +#include "jbig2_priv.h" + +static void * +jbig2_default_alloc (Jbig2Allocator *allocator, size_t size) +{ + return malloc (size); +} + +static void +jbig2_default_free (Jbig2Allocator *allocator, void *p) +{ + free (p); +} + +static void * +jbig2_default_realloc (Jbig2Allocator *allocator, void *p, size_t size) +{ + return realloc (p, size); +} + +static Jbig2Allocator jbig2_default_allocator = +{ + jbig2_default_alloc, + jbig2_default_free, + jbig2_default_realloc +}; + +void * +jbig2_alloc (Jbig2Allocator *allocator, size_t size) +{ + return allocator->alloc (allocator, size); +} + +void +jbig2_free (Jbig2Allocator *allocator, void *p) +{ + allocator->free (allocator, p); +} + +void * +jbig2_realloc (Jbig2Allocator *allocator, void *p, size_t size) +{ + return allocator->realloc (allocator, p, size); +} + +static int +jbig2_default_error(void *data, const char *msg, + Jbig2Severity severity, int32_t seg_idx) +{ + /* report only fatal errors by default */ + if (severity == JBIG2_SEVERITY_FATAL) { + fprintf(stderr, "jbig2 decoder FATAL ERROR: %s", msg); + if (seg_idx != -1) fprintf(stderr, " (segment 0x%02x)", seg_idx); + fprintf(stderr, "\n"); + fflush(stderr); + } + + return 0; +} + +int +jbig2_error(Jbig2Ctx *ctx, Jbig2Severity severity, int32_t segment_number, + const char *fmt, ...) +{ + char buf[1024]; + va_list ap; + int n; + int code; + + va_start (ap, fmt); + n = vsnprintf (buf, sizeof(buf), fmt, ap); + va_end (ap); + if (n < 0 || n == sizeof(buf)) + strncpy (buf, "jbig2_error: error in generating error string", sizeof(buf)); + code = ctx->error_callback (ctx->error_callback_data, buf, severity, segment_number); + if (severity == JBIG2_SEVERITY_FATAL) + code = -1; + return code; +} + +Jbig2Ctx * +jbig2_ctx_new (Jbig2Allocator *allocator, + Jbig2Options options, + Jbig2GlobalCtx *global_ctx, + Jbig2ErrorCallback error_callback, + void *error_callback_data) +{ + Jbig2Ctx *result; + + if (allocator == NULL) + allocator = &jbig2_default_allocator; + if (error_callback == NULL) + error_callback = &jbig2_default_error; + + result = (Jbig2Ctx *)jbig2_alloc(allocator, sizeof(Jbig2Ctx)); + if (result == NULL) { + error_callback(error_callback_data, "initial context allocation failed!", + JBIG2_SEVERITY_FATAL, -1); + return result; + } + + result->allocator = allocator; + result->options = options; + result->global_ctx = (const Jbig2Ctx *)global_ctx; + result->error_callback = error_callback; + result->error_callback_data = error_callback_data; + + result->state = (options & JBIG2_OPTIONS_EMBEDDED) ? + JBIG2_FILE_SEQUENTIAL_HEADER : + JBIG2_FILE_HEADER; + + result->buf = NULL; + + result->n_segments = 0; + result->n_segments_max = 16; + result->segments = (Jbig2Segment **)jbig2_alloc(allocator, result->n_segments_max * sizeof(Jbig2Segment *)); + result->segment_index = 0; + + result->current_page = 0; + result->max_page_index = 4; + result->pages = (Jbig2Page *)jbig2_alloc(allocator, result->max_page_index * sizeof(Jbig2Page)); + { + int index; + for (index = 0; index < result->max_page_index; index++) { + result->pages[index].state = JBIG2_PAGE_FREE; + result->pages[index].number = 0; + result->pages[index].image = NULL; + } + } + + return result; +} + +int32_t +jbig2_get_int32 (const byte *buf) +{ + return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; +} + +int16_t +jbig2_get_int16 (const byte *buf) +{ + return (buf[0] << 8) | buf[1]; +} + + +/** + * jbig2_data_in: submit data for decoding + * @ctx: The jbig2dec decoder context + * @data: a pointer to the data buffer + * @size: the size of the data buffer in bytes + * + * Copies the specified data into internal storage and attempts + * to (continue to) parse it as part of a jbig2 data stream. + * + * Return code: 0 on success + * -1 if there is a parsing error, or whatever + * the error handling callback returns + **/ +int +jbig2_data_in (Jbig2Ctx *ctx, const unsigned char *data, size_t size) +{ + const size_t initial_buf_size = 1024; + + if (ctx->buf == NULL) + { + size_t buf_size = initial_buf_size; + + do + buf_size <<= 1; + while (buf_size < size); + ctx->buf = (byte *)jbig2_alloc(ctx->allocator, buf_size); + ctx->buf_size = buf_size; + ctx->buf_rd_ix = 0; + ctx->buf_wr_ix = 0; + } + else if (ctx->buf_wr_ix + size > ctx->buf_size) + { + if (ctx->buf_rd_ix <= (ctx->buf_size >> 1) && + ctx->buf_wr_ix - ctx->buf_rd_ix + size <= ctx->buf_size) + { + memmove(ctx->buf, ctx->buf + ctx->buf_rd_ix, + ctx->buf_wr_ix - ctx->buf_rd_ix); + } + else + { + byte *buf; + size_t buf_size = initial_buf_size; + + do + buf_size <<= 1; + while (buf_size < ctx->buf_wr_ix - ctx->buf_rd_ix + size); + buf = (byte *)jbig2_alloc(ctx->allocator, buf_size); + memcpy(buf, ctx->buf + ctx->buf_rd_ix, + ctx->buf_wr_ix - ctx->buf_rd_ix); + jbig2_free(ctx->allocator, ctx->buf); + ctx->buf = buf; + ctx->buf_size = buf_size; + } + ctx->buf_wr_ix -= ctx->buf_rd_ix; + ctx->buf_rd_ix = 0; + } + memcpy(ctx->buf + ctx->buf_wr_ix, data, size); + ctx->buf_wr_ix += size; + + /* data has now been added to buffer */ + + for (;;) + { + const byte jbig2_id_string[8] = { 0x97, 0x4a, 0x42, 0x32, 0x0d, 0x0a, 0x1a, 0x0a }; + Jbig2Segment *segment; + size_t header_size; + int code; + + switch (ctx->state) + { + case JBIG2_FILE_HEADER: + /* D.4.1 */ + if (ctx->buf_wr_ix - ctx->buf_rd_ix < 9) + return 0; + if (memcmp(ctx->buf + ctx->buf_rd_ix, jbig2_id_string, 8)) + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, + "Not a JBIG2 file header"); + /* D.4.2 */ + ctx->file_header_flags = ctx->buf[ctx->buf_rd_ix + 8]; + if (ctx->file_header_flags & 0xFC) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, -1, + "reserved bits (2-7) of file header flags are not zero (0x%02x)", ctx->file_header_flags); + } + /* D.4.3 */ + if (!(ctx->file_header_flags & 2)) /* number of pages is known */ + { + if (ctx->buf_wr_ix - ctx->buf_rd_ix < 13) + return 0; + ctx->n_pages = jbig2_get_int32(ctx->buf + ctx->buf_rd_ix + 9); + ctx->buf_rd_ix += 13; + if (ctx->n_pages == 1) + jbig2_error(ctx, JBIG2_SEVERITY_INFO, -1, "file header indicates a single page document"); + else + jbig2_error(ctx, JBIG2_SEVERITY_INFO, -1, "file header indicates a %d page document", ctx->n_pages); + } + else /* number of pages not known */ + { + ctx->n_pages=0; + ctx->buf_rd_ix += 9; + } + /* determine the file organization based on the flags - D.4.2 again */ + if (ctx->file_header_flags & 1) + { + ctx->state = JBIG2_FILE_SEQUENTIAL_HEADER; + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1, "file header indicates sequential organization"); + } + else + { + ctx->state = JBIG2_FILE_RANDOM_HEADERS; + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1, "file header indicates random-access organization"); + + } + break; + case JBIG2_FILE_SEQUENTIAL_HEADER: + case JBIG2_FILE_RANDOM_HEADERS: + segment = jbig2_parse_segment_header(ctx, ctx->buf + ctx->buf_rd_ix, + ctx->buf_wr_ix - ctx->buf_rd_ix, + &header_size); + if (segment == NULL) + return 0; /* need more data */ + ctx->buf_rd_ix += header_size; + + if (ctx->n_segments == ctx->n_segments_max) + ctx->segments = (Jbig2Segment **)jbig2_realloc(ctx->allocator, + ctx->segments, (ctx->n_segments_max <<= 2) * sizeof(Jbig2Segment *)); + + ctx->segments[ctx->n_segments++] = segment; + if (ctx->state == JBIG2_FILE_RANDOM_HEADERS) + { + if ((segment->flags & 63) == 51) /* end of file */ + ctx->state = JBIG2_FILE_RANDOM_BODIES; + } + else /* JBIG2_FILE_SEQUENTIAL_HEADER */ + ctx->state = JBIG2_FILE_SEQUENTIAL_BODY; + break; + case JBIG2_FILE_SEQUENTIAL_BODY: + case JBIG2_FILE_RANDOM_BODIES: + segment = ctx->segments[ctx->segment_index]; + if (segment->data_length > ctx->buf_wr_ix - ctx->buf_rd_ix) + return 0; /* need more data */ + code = jbig2_parse_segment(ctx, segment, ctx->buf + ctx->buf_rd_ix); + ctx->buf_rd_ix += segment->data_length; + ctx->segment_index++; + if (ctx->state == JBIG2_FILE_RANDOM_BODIES) + { + if (ctx->segment_index == ctx->n_segments) + ctx->state = JBIG2_FILE_EOF; + } + else /* JBIG2_FILE_SEQUENCIAL_BODY */ + { + ctx->state = JBIG2_FILE_SEQUENTIAL_HEADER; + } + if (code < 0) + { + ctx->state = JBIG2_FILE_EOF; + return code; + } + break; + case JBIG2_FILE_EOF: + if (ctx->buf_rd_ix == ctx->buf_wr_ix) + return 0; + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, -1, + "Garbage beyond end of file"); + } + } + return 0; +} + +void +jbig2_ctx_free (Jbig2Ctx *ctx) +{ + Jbig2Allocator *ca = ctx->allocator; + int i; + + jbig2_free(ca, ctx->buf); + if (ctx->segments != NULL) { + for (i = 0; i < ctx->n_segments; i++) + jbig2_free_segment(ctx, ctx->segments[i]); + jbig2_free(ca, ctx->segments); + } + + if (ctx->pages != NULL) { + for (i = 0; i <= ctx->current_page; i++) + if (ctx->pages[i].image != NULL) + jbig2_image_release(ctx, ctx->pages[i].image); + jbig2_free(ca, ctx->pages); + } + + jbig2_free(ca, ctx); +} + +Jbig2GlobalCtx *jbig2_make_global_ctx (Jbig2Ctx *ctx) +{ + return (Jbig2GlobalCtx *)ctx; +} + +void jbig2_global_ctx_free(Jbig2GlobalCtx *global_ctx) +{ + jbig2_ctx_free((Jbig2Ctx *)global_ctx); +} + + +/* I'm not committed to keeping the word stream interface. It's handy + when you think you may be streaming your input, but if you're not + (as is currently the case), it just adds complexity. +*/ + +typedef struct { + Jbig2WordStream super; + const byte *data; + size_t size; +} Jbig2WordStreamBuf; + +static uint32_t +jbig2_word_stream_buf_get_next_word(Jbig2WordStream *self, int offset) +{ + Jbig2WordStreamBuf *z = (Jbig2WordStreamBuf *)self; + const byte *data = z->data; + uint32_t result; + + if (offset + 4 < z->size) + result = (data[offset] << 24) | (data[offset + 1] << 16) | + (data[offset + 2] << 8) | data[offset + 3]; + else if (offset >= z->size) + return 0; + else + { + int i; + + result = 0; + for (i = 0; i < z->size - offset; i++) + result |= data[offset + i] << ((3 - i) << 3); + } + return result; +} + +Jbig2WordStream * +jbig2_word_stream_buf_new(Jbig2Ctx *ctx, const byte *data, size_t size) +{ + Jbig2WordStreamBuf *result = (Jbig2WordStreamBuf *)jbig2_alloc(ctx->allocator, sizeof(Jbig2WordStreamBuf)); + + result->super.get_next_word = jbig2_word_stream_buf_get_next_word; + result->data = data; + result->size = size; + + return &result->super; +} + +void +jbig2_word_stream_buf_free(Jbig2Ctx *ctx, Jbig2WordStream *ws) +{ + jbig2_free(ctx->allocator, ws); +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2.h b/contrib/media/updf_newlib/libjbig2dec/jbig2.h new file mode 100755 index 000000000..c090516f6 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2.h @@ -0,0 +1,135 @@ +/* + jbig2dec + + Copyright (C) 2002-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _JBIG2_H +#define _JBIG2_H + +/* warning levels */ +typedef enum { + JBIG2_SEVERITY_DEBUG, + JBIG2_SEVERITY_INFO, + JBIG2_SEVERITY_WARNING, + JBIG2_SEVERITY_FATAL +} Jbig2Severity; + +typedef enum { + JBIG2_OPTIONS_EMBEDDED = 1 +} Jbig2Options; + +/* forward public structure declarations */ +typedef struct _Jbig2Allocator Jbig2Allocator; +typedef struct _Jbig2Ctx Jbig2Ctx; +typedef struct _Jbig2GlobalCtx Jbig2GlobalCtx; +typedef struct _Jbig2Segment Jbig2Segment; +typedef struct _Jbig2Image Jbig2Image; + +/* private structures */ +typedef struct _Jbig2Page Jbig2Page; +typedef struct _Jbig2SymbolDictionary Jbig2SymbolDictionary; + +/* + this is the general image structure used by the jbig2dec library + images are 1 bpp, packed into rows a byte at a time. stride gives + the byte offset to the next row, while width and height define + the size of the image area in pixels. +*/ + +struct _Jbig2Image { + int width, height, stride; + uint8_t *data; + int refcount; +}; + +Jbig2Image* jbig2_image_new(Jbig2Ctx *ctx, int width, int height); +Jbig2Image* jbig2_image_clone(Jbig2Ctx *ctx, Jbig2Image *image); +void jbig2_image_release(Jbig2Ctx *ctx, Jbig2Image *image); +void jbig2_image_free(Jbig2Ctx *ctx, Jbig2Image *image); +void jbig2_image_clear(Jbig2Ctx *ctx, Jbig2Image *image, int value); +Jbig2Image *jbig2_image_resize(Jbig2Ctx *ctx, Jbig2Image *image, + int width, int height); + +/* errors are returned from the library via a callback. If no callback + is provided (a NULL argument is passed ot jbig2_ctx_new) a default + handler is used which prints fatal errors to the stderr stream. */ + +/* error callback */ +typedef int (*Jbig2ErrorCallback) (void *data, + const char *msg, Jbig2Severity severity, + int32_t seg_idx); + +/* memory allocation is likewise done via a set of callbacks so that + clients can better control memory usage. If a NULL is passed for + this argumennt of jbig2_ctx_new, a default allocator based on malloc() + is used. */ + +/* dynamic memory callbacks */ +struct _Jbig2Allocator { + void *(*alloc) (Jbig2Allocator *allocator, size_t size); + void (*free) (Jbig2Allocator *allocator, void *p); + void *(*realloc) (Jbig2Allocator *allocator, void *p, size_t size); +}; + +/* decoder context */ +Jbig2Ctx *jbig2_ctx_new (Jbig2Allocator *allocator, + Jbig2Options options, + Jbig2GlobalCtx *global_ctx, + Jbig2ErrorCallback error_callback, + void *error_callback_data); +void jbig2_ctx_free (Jbig2Ctx *ctx); + +/* global context for embedded streams */ +Jbig2GlobalCtx *jbig2_make_global_ctx (Jbig2Ctx *ctx); +void jbig2_global_ctx_free (Jbig2GlobalCtx *global_ctx); + +/* submit data to the decoder */ +int jbig2_data_in (Jbig2Ctx *ctx, const unsigned char *data, size_t size); + +/* get the next available decoded page image. NULL means there isn't one. */ +Jbig2Image *jbig2_page_out (Jbig2Ctx *ctx); +/* mark a returned page image as no longer needed. */ +int jbig2_release_page (Jbig2Ctx *ctx, Jbig2Image *image); +/* mark the current page as complete, simulating an end-of-page segment (for broken streams) */ +int jbig2_complete_page (Jbig2Ctx *ctx); + + +/* segment header routines */ + +struct _Jbig2Segment { + uint32_t number; + uint8_t flags; + uint32_t page_association; + size_t data_length; + int referred_to_segment_count; + uint32_t *referred_to_segments; + void *result; +}; + +Jbig2Segment *jbig2_parse_segment_header (Jbig2Ctx *ctx, uint8_t *buf, size_t buf_size, + size_t *p_header_size); +int jbig2_parse_segment (Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data); +void jbig2_free_segment (Jbig2Ctx *ctx, Jbig2Segment *segment); + +Jbig2Segment *jbig2_find_segment(Jbig2Ctx *ctx, uint32_t number); + +#endif /* _JBIG2_H */ + +#ifdef __cplusplus +} +#endif diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_arith.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith.c new file mode 100755 index 000000000..8785c4ef9 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith.c @@ -0,0 +1,394 @@ +/* + jbig2dec + + Copyright (C) 2001-2005 Artifex Software, Inc. + + This software is provided AS-IS with no warranty, + either express or implied. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_arith.h" + +#ifdef JBIG2_DEBUG +#include +#endif + +struct _Jbig2ArithState { + uint32_t C; + int A; + + int CT; + + uint32_t next_word; + int next_word_bytes; + + Jbig2WordStream *ws; + int offset; +}; + +#undef SOFTWARE_CONVENTION + +/* + A note on the "software conventions". + + Previously, I had misinterpreted the spec, and had thought that the + spec's description of the "software convention" was wrong. Now I + believe that this code is both correct and matches the spec, with + SOFTWARE_CONVENTION defined or not. Thanks to William Rucklidge for + the clarification. + + In any case, my benchmarking indicates no speed difference at all. + Therefore, for now we will just use the normative version. + + */ + +static void +jbig2_arith_bytein (Jbig2ArithState *as) +{ + byte B; + + /* invariant: as->next_word_bytes > 0 */ + + /* Figure G.3 */ + B = (byte)((as->next_word >> 24) & 0xFF); + if (B == 0xFF) + { + byte B1; + if (as->next_word_bytes == 1) + { + Jbig2WordStream *ws = as->ws; + as->next_word = ws->get_next_word (ws, as->offset); + as->offset += 4; + B1 = (byte)((as->next_word >> 24) & 0xFF); + if (B1 > 0x8F) + { +#ifdef JBIG2_DEBUG_ARITH + fprintf(stderr, "read %02x (aa)\n", B); +#endif +#ifndef SOFTWARE_CONVENTION + as->C += 0xFF00; +#endif + as->CT = 8; + as->next_word = (0xFF00 | B1) << 16; + as->next_word_bytes = 2; + } + else + { +#ifdef JBIG2_DEBUG_ARITH + fprintf(stderr, "read %02x (a)\n", B); +#endif +#ifdef SOFTWARE_CONVENTION + as->C += 0xFE00 - (B1 << 9); +#else + as->C += B1 << 9; +#endif + as->CT = 7; + as->next_word_bytes = 4; + } + } + else + { + B1 = (byte)((as->next_word >> 16) & 0xFF); + if (B1 > 0x8F) + { +#ifdef JBIG2_DEBUG_ARITH + fprintf(stderr, "read %02x (ba)\n", B); +#endif +#ifndef SOFTWARE_CONVENTION + as->C += 0xFF00; +#endif + as->CT = 8; + } + else + { + as->next_word_bytes--; + as->next_word <<= 8; +#ifdef JBIG2_DEBUG_ARITH + fprintf(stderr, "read %02x (b)\n", B); +#endif + +#ifdef SOFTWARE_CONVENTION + as->C += 0xFE00 - (B1 << 9); +#else + as->C += (B1 << 9); +#endif + as->CT = 7; + } + } + } + else + { +#ifdef JBIG2_DEBUG_ARITH + fprintf(stderr, "read %02x\n", B); +#endif + as->CT = 8; + as->next_word <<= 8; + as->next_word_bytes--; + if (as->next_word_bytes == 0) + { + Jbig2WordStream *ws = as->ws; + + as->next_word = ws->get_next_word (ws, as->offset); + as->offset += 4; + as->next_word_bytes = 4; + } + B = (byte)((as->next_word >> 24) & 0xFF); +#ifdef SOFTWARE_CONVENTION + as->C += 0xFF00 - (B << 8); +#else + as->C += (B << 8); +#endif + } +} + +#if defined(JBIG2_DEBUG) || defined(JBIG2_DEBUG_ARITH) +#include + +static void +jbig2_arith_trace (Jbig2ArithState *as, Jbig2ArithCx cx) +{ + fprintf(stderr, "I = %2d, MPS = %d, A = %04x, CT = %2d, C = %08x\n", + cx & 0x7f, cx >> 7, as->A, as->CT, as->C); +} +#endif + +/** Allocate and initialize a new arithmetic coding state + * the returned pointer can simply be freed; this does + * not affect the associated Jbig2WordStream. + */ +Jbig2ArithState * +jbig2_arith_new (Jbig2Ctx *ctx, Jbig2WordStream *ws) +{ + Jbig2ArithState *result; + + result = (Jbig2ArithState *)jbig2_alloc(ctx->allocator, + sizeof(Jbig2ArithState)); + + result->ws = ws; + + result->next_word = ws->get_next_word (ws, 0); + result->next_word_bytes = 4; + result->offset = 4; + + /* Figure G.1 */ +#ifdef SOFTWARE_CONVENTION + result->C = (~(result->next_word >> 8)) & 0xFF0000; +#else + result->C = (result->next_word >> 8) & 0xFF0000; +#endif + + jbig2_arith_bytein (result); + result->C <<= 7; + result->CT -= 7; + result->A = 0x8000; + + return result; +} + +/* could put bit fields in to minimize memory usage */ +typedef struct { + unsigned short Qe; + byte mps_xor; /* mps_xor = index ^ NMPS */ + byte lps_xor; /* lps_xor = index ^ NLPS ^ (SWITCH << 7) */ +} Jbig2ArithQe; + +const Jbig2ArithQe jbig2_arith_Qe[] = { + { 0x5601, 1 ^ 0, 1 ^ 0 ^ 0x80 }, + { 0x3401, 2 ^ 1, 6 ^ 1 }, + { 0x1801, 3 ^ 2, 9 ^ 2 }, + { 0x0AC1, 4 ^ 3, 12 ^ 3 }, + { 0x0521, 5 ^ 4, 29 ^ 4 }, + { 0x0221, 38 ^ 5, 33 ^ 5 }, + { 0x5601, 7 ^ 6, 6 ^ 6 ^ 0x80 }, + { 0x5401, 8 ^ 7, 14 ^ 7 }, + { 0x4801, 9 ^ 8, 14 ^ 8 }, + { 0x3801, 10 ^ 9, 14 ^ 9 }, + { 0x3001, 11 ^ 10, 17 ^ 10 }, + { 0x2401, 12 ^ 11, 18 ^ 11 }, + { 0x1C01, 13 ^ 12, 20 ^ 12 }, + { 0x1601, 29 ^ 13, 21 ^ 13 }, + { 0x5601, 15 ^ 14, 14 ^ 14 ^ 0x80 }, + { 0x5401, 16 ^ 15, 14 ^ 15 }, + { 0x5101, 17 ^ 16, 15 ^ 16 }, + { 0x4801, 18 ^ 17, 16 ^ 17 }, + { 0x3801, 19 ^ 18, 17 ^ 18 }, + { 0x3401, 20 ^ 19, 18 ^ 19 }, + { 0x3001, 21 ^ 20, 19 ^ 20 }, + { 0x2801, 22 ^ 21, 19 ^ 21 }, + { 0x2401, 23 ^ 22, 20 ^ 22 }, + { 0x2201, 24 ^ 23, 21 ^ 23 }, + { 0x1C01, 25 ^ 24, 22 ^ 24 }, + { 0x1801, 26 ^ 25, 23 ^ 25 }, + { 0x1601, 27 ^ 26, 24 ^ 26 }, + { 0x1401, 28 ^ 27, 25 ^ 27 }, + { 0x1201, 29 ^ 28, 26 ^ 28 }, + { 0x1101, 30 ^ 29, 27 ^ 29 }, + { 0x0AC1, 31 ^ 30, 28 ^ 30 }, + { 0x09C1, 32 ^ 31, 29 ^ 31 }, + { 0x08A1, 33 ^ 32, 30 ^ 32 }, + { 0x0521, 34 ^ 33, 31 ^ 33 }, + { 0x0441, 35 ^ 34, 32 ^ 34 }, + { 0x02A1, 36 ^ 35, 33 ^ 35 }, + { 0x0221, 37 ^ 36, 34 ^ 36 }, + { 0x0141, 38 ^ 37, 35 ^ 37 }, + { 0x0111, 39 ^ 38, 36 ^ 38 }, + { 0x0085, 40 ^ 39, 37 ^ 39 }, + { 0x0049, 41 ^ 40, 38 ^ 40 }, + { 0x0025, 42 ^ 41, 39 ^ 41 }, + { 0x0015, 43 ^ 42, 40 ^ 42 }, + { 0x0009, 44 ^ 43, 41 ^ 43 }, + { 0x0005, 45 ^ 44, 42 ^ 44 }, + { 0x0001, 45 ^ 45, 43 ^ 45 }, + { 0x5601, 46 ^ 46, 46 ^ 46 } +}; + +static void +jbig2_arith_renormd (Jbig2ArithState *as) +{ + /* Figure E.18 */ + do + { + if (as->CT == 0) + jbig2_arith_bytein (as); + as->A <<= 1; + as->C <<= 1; + as->CT--; + } + while ((as->A & 0x8000) == 0); +} + +bool +jbig2_arith_decode (Jbig2ArithState *as, Jbig2ArithCx *pcx) +{ + Jbig2ArithCx cx = *pcx; + const Jbig2ArithQe *pqe = &jbig2_arith_Qe[cx & 0x7f]; + bool D; + + /* Figure G.2 */ + as->A -= pqe->Qe; + if ( +#ifdef SOFTWARE_CONVENTION + /* Note: I do not think this is correct. See above. */ + (as->C >> 16) < as->A +#else + !((as->C >> 16) < pqe->Qe) +#endif + ) + { +#ifndef SOFTWARE_CONVENTION + as->C -= pqe->Qe << 16; +#endif + if ((as->A & 0x8000) == 0) + { + /* MPS_EXCHANGE, Figure E.16 */ + if (as->A < pqe->Qe) + { + D = 1 - (cx >> 7); + *pcx ^= pqe->lps_xor; + } + else + { + D = cx >> 7; + *pcx ^= pqe->mps_xor; + } + jbig2_arith_renormd (as); + return D; + } + else + return cx >> 7; + } + else + { +#ifdef SOFTWARE_CONVENTION + as->C -= (as->A) << 16; +#endif + /* LPS_EXCHANGE, Figure E.17 */ + if (as->A < pqe->Qe) + { + as->A = pqe->Qe; + D = cx >> 7; + *pcx ^= pqe->mps_xor; + } + else + { + as->A = pqe->Qe; + D = 1 - (cx >> 7); + *pcx ^= pqe->lps_xor; + } + jbig2_arith_renormd (as); + return D; + } +} + +#ifdef TEST + +static uint32_t +test_get_word (Jbig2WordStream *self, int offset) +{ + byte stream[] = { + 0x84, 0xC7, 0x3B, 0xFC, 0xE1, 0xA1, 0x43, 0x04, 0x02, 0x20, 0x00, 0x00, + 0x41, 0x0D, 0xBB, 0x86, 0xF4, 0x31, 0x7F, 0xFF, 0x88, 0xFF, 0x37, 0x47, + 0x1A, 0xDB, 0x6A, 0xDF, 0xFF, 0xAC, + 0x00, 0x00 + }; + if (offset >= sizeof(stream)) + return 0; + else + return (stream[offset] << 24) | (stream[offset + 1] << 16) | + (stream[offset + 2] << 8) | stream[offset + 3]; +} + +int +main (int argc, char **argv) +{ + Jbig2Ctx *ctx; + Jbig2WordStream ws; + Jbig2ArithState *as; + int i; + Jbig2ArithCx cx = 0; + + ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL); + + ws.get_next_word = test_get_word; + as = jbig2_arith_new (ctx, &ws); +#ifdef JBIG2_DEBUG_ARITH + jbig2_arith_trace (as, cx); +#endif + + for (i = 0; i < 256; i++) + { + bool D; + + D = jbig2_arith_decode (as, &cx); +#ifdef JBIG2_DEBUG_ARITH + fprintf(stderr, "%3d: D = %d, ", i, D); + jbig2_arith_trace (as, cx); +#endif + } + + jbig2_free(ctx->allocator, as); + + jbig2_ctx_free(ctx); + + return 0; +} +#endif diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_arith.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith.h new file mode 100755 index 000000000..317878f57 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith.h @@ -0,0 +1,31 @@ +/* + jbig2dec + + Copyright (C) 2001 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +typedef struct _Jbig2ArithState Jbig2ArithState; + +/* An arithmetic coding context is stored as a single byte, with the + index in the low order 7 bits (actually only 6 are used), and the + MPS in the top bit. */ +typedef unsigned char Jbig2ArithCx; + +/* allocate and initialize a new arithmetic coding state */ +Jbig2ArithState * +jbig2_arith_new (Jbig2Ctx *ctx, Jbig2WordStream *ws); + +/* decode a bit */ +bool +jbig2_arith_decode (Jbig2ArithState *as, Jbig2ArithCx *pcx); + + diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_iaid.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_iaid.c new file mode 100755 index 000000000..b0d768293 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_iaid.c @@ -0,0 +1,91 @@ +/* + jbig2dec + + Copyright (C) 2001 Artifex Software, Inc. + + This software is provided AS-IS with no warranty, + either express or implied. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* Annex A.3 */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include /* memset() */ + +#ifdef VERBOSE +#include /* for debug printing only */ +#endif + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_arith.h" +#include "jbig2_arith_iaid.h" + +struct _Jbig2ArithIaidCtx { + int SBSYMCODELEN; + Jbig2ArithCx *IAIDx; +}; + +Jbig2ArithIaidCtx * +jbig2_arith_iaid_ctx_new(Jbig2Ctx *ctx, int SBSYMCODELEN) +{ + Jbig2ArithIaidCtx *result = jbig2_new(ctx, Jbig2ArithIaidCtx, 1); + int ctx_size = 1 << SBSYMCODELEN; + + result->SBSYMCODELEN = SBSYMCODELEN; + result->IAIDx = jbig2_alloc(ctx->allocator, ctx_size); + memset(result->IAIDx, 0, ctx_size); + + return result; +} + +/* A.3 */ +/* Return value: -1 on error, 0 on normal value */ +int +jbig2_arith_iaid_decode(Jbig2ArithIaidCtx *ctx, Jbig2ArithState *as, + int32_t *p_result) +{ + Jbig2ArithCx *IAIDx = ctx->IAIDx; + int SBSYMCODELEN = ctx->SBSYMCODELEN; + int PREV = 1; + int D; + int i; + + /* A.3 (2) */ + for (i = 0; i < SBSYMCODELEN; i++) + { + D = jbig2_arith_decode(as, &IAIDx[PREV]); +#ifdef VERBOSE + fprintf(stderr, "IAID%x: D = %d\n", PREV, D); +#endif + PREV = (PREV << 1) | D; + } + /* A.3 (3) */ + PREV -= 1 << SBSYMCODELEN; +#ifdef VERBOSE + fprintf(stderr, "IAID result: %d\n", PREV); +#endif + *p_result = PREV; + return 0; +} + +void +jbig2_arith_iaid_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIaidCtx *iax) +{ + jbig2_free(ctx->allocator, iax->IAIDx); + jbig2_free(ctx->allocator, iax); +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_iaid.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_iaid.h new file mode 100755 index 000000000..c04f898a8 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_iaid.h @@ -0,0 +1,26 @@ +/* + jbig2dec + + Copyright (C) 2001 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +typedef struct _Jbig2ArithIaidCtx Jbig2ArithIaidCtx; + +Jbig2ArithIaidCtx * +jbig2_arith_iaid_ctx_new(Jbig2Ctx *ctx, int SBSYMCODELEN); + +int +jbig2_arith_iaid_decode(Jbig2ArithIaidCtx *ctx, Jbig2ArithState *as, + int32_t *p_result); + +void +jbig2_arith_iaid_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIaidCtx *iax); diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_int.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_int.c new file mode 100755 index 000000000..f948c8c34 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_int.c @@ -0,0 +1,139 @@ +/* + jbig2dec + + Copyright (C) 2001 Artifex Software, Inc. + + This software is provided AS-IS with no warranty, + either express or implied. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* Annex A */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include /* memset() */ + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_arith.h" +#include "jbig2_arith_int.h" + +struct _Jbig2ArithIntCtx { + Jbig2ArithCx IAx[512]; +}; + +Jbig2ArithIntCtx * +jbig2_arith_int_ctx_new(Jbig2Ctx *ctx) +{ + Jbig2ArithIntCtx *result = jbig2_new(ctx, Jbig2ArithIntCtx, 1); + + memset(result->IAx, 0, sizeof(result->IAx)); + + return result; +} + +/* A.2 */ +/* Return value: -1 on error, 0 on normal value, 1 on OOB return. */ +int +jbig2_arith_int_decode(Jbig2ArithIntCtx *ctx, Jbig2ArithState *as, + int32_t *p_result) +{ + Jbig2ArithCx *IAx = ctx->IAx; + int PREV = 1; + int S, V; + int bit; + int n_tail, offset; + int i; + + S = jbig2_arith_decode(as, &IAx[PREV]); + PREV = (PREV << 1) | S; + + bit = jbig2_arith_decode(as, &IAx[PREV]); + PREV = (PREV << 1) | bit; + if (bit) + { + bit = jbig2_arith_decode(as, &IAx[PREV]); + PREV = (PREV << 1) | bit; + + if (bit) + { + bit = jbig2_arith_decode(as, &IAx[PREV]); + PREV = (PREV << 1) | bit; + + if (bit) + { + bit = jbig2_arith_decode(as, &IAx[PREV]); + PREV = (PREV << 1) | bit; + + if (bit) + { + bit = jbig2_arith_decode(as, &IAx[PREV]); + PREV = (PREV << 1) | bit; + + if (bit) + { + n_tail = 32; + offset = 4436; + } + else + { + n_tail = 12; + offset = 340; + } + } + else + { + n_tail = 8; + offset = 84; + } + } + else + { + n_tail = 6; + offset = 20; + } + } + else + { + n_tail = 4; + offset = 4; + } + } + else + { + n_tail = 2; + offset = 0; + } + + V = 0; + for (i = 0; i < n_tail; i++) + { + bit = jbig2_arith_decode(as, &IAx[PREV]); + PREV = ((PREV << 1) & 511) | (PREV & 256) | bit; + V = (V << 1) | bit; + } + + V += offset; + V = S ? -V : V; + *p_result = V; + return S && V == 0 ? 1 : 0; +} + +void +jbig2_arith_int_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIntCtx *iax) +{ + jbig2_free(ctx->allocator, iax); +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_int.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_int.h new file mode 100755 index 000000000..3d3cb3f9c --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_arith_int.h @@ -0,0 +1,26 @@ +/* + jbig2dec + + Copyright (C) 2001 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +typedef struct _Jbig2ArithIntCtx Jbig2ArithIntCtx; + +Jbig2ArithIntCtx * +jbig2_arith_int_ctx_new(Jbig2Ctx *ctx); + +int +jbig2_arith_int_decode(Jbig2ArithIntCtx *ctx, Jbig2ArithState *as, + int32_t *p_result); + +void +jbig2_arith_int_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIntCtx *iax); diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_generic.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_generic.c new file mode 100755 index 000000000..4be415db5 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_generic.c @@ -0,0 +1,854 @@ +/* + jbig2dec + + Copyright (C) 2002-2005 Artifex Software, Inc. + + This software is provided AS-IS with no warranty, + either express or implied. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/** + * Generic region handlers. + **/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include /* memcpy(), memset() */ + +#ifdef OUTPUT_PBM +#include +#endif + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_image.h" +#include "jbig2_arith.h" +#include "jbig2_generic.h" +#include "jbig2_mmr.h" + +/* return the appropriate context size for the given template */ +int +jbig2_generic_stats_size(Jbig2Ctx *ctx, int template) +{ + int stats_size = template == 0 ? 1 << 16 : + template == 1 ? 1 << 1 << 13 : 1 << 10; + return stats_size; +} + + +static int +jbig2_decode_generic_template0(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + const int rowstride = image->stride; + int x, y; + byte *gbreg_line = (byte *)image->data; + + /* todo: currently we only handle the nominal gbat location */ + +#ifdef OUTPUT_PBM + printf("P4\n%d %d\n", GBW, GBH); +#endif + + for (y = 0; y < GBH; y++) + { + uint32_t CONTEXT; + uint32_t line_m1; + uint32_t line_m2; + int padded_width = (GBW + 7) & -8; + + line_m1 = (y >= 1) ? gbreg_line[-rowstride] : 0; + line_m2 = (y >= 2) ? gbreg_line[-(rowstride << 1)] << 6 : 0; + CONTEXT = (line_m1 & 0x7f0) | (line_m2 & 0xf800); + + /* 6.2.5.7 3d */ + for (x = 0; x < padded_width; x += 8) + { + byte result = 0; + int x_minor; + int minor_width = GBW - x > 8 ? 8 : GBW - x; + + if (y >= 1) + line_m1 = (line_m1 << 8) | + (x + 8 < GBW ? gbreg_line[-rowstride + (x >> 3) + 1] : 0); + + if (y >= 2) + line_m2 = (line_m2 << 8) | + (x + 8 < GBW ? gbreg_line[-(rowstride << 1) + (x >> 3) + 1] << 6: 0); + + /* This is the speed-critical inner loop. */ + for (x_minor = 0; x_minor < minor_width; x_minor++) + { + bool bit; + + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + result |= bit << (7 - x_minor); + CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bit | + ((line_m1 >> (7 - x_minor)) & 0x10) | + ((line_m2 >> (7 - x_minor)) & 0x800); + } + gbreg_line[x >> 3] = result; + } +#ifdef OUTPUT_PBM + fwrite(gbreg_line, 1, rowstride, stdout); +#endif + gbreg_line += rowstride; + } + + return 0; +} + +static int +jbig2_decode_generic_template0_unopt(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + uint32_t CONTEXT; + int x,y; + bool bit; + + /* this version is generic and easy to understand, but very slow */ + + for (y = 0; y < GBH; y++) { + for (x = 0; x < GBW; x++) { + CONTEXT = 0; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y) << 0; + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1; + CONTEXT |= jbig2_image_get_pixel(image, x - 3, y) << 2; + CONTEXT |= jbig2_image_get_pixel(image, x - 4, y) << 3; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], + y + params->gbat[1]) << 4; + CONTEXT |= jbig2_image_get_pixel(image, x + 2, y - 1) << 5; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 6; + CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 7; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 8; + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 9; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2], + y + params->gbat[3]) << 10; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4], + y + params->gbat[5]) << 11; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 2) << 12; + CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 2) << 13; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 2) << 14; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6], + y + params->gbat[7]) << 15; + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + jbig2_image_set_pixel(image, x, y, bit); + } + } + return 0; +} + +static int +jbig2_decode_generic_template1(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + const int rowstride = image->stride; + int x, y; + byte *gbreg_line = (byte *)image->data; + + /* todo: currently we only handle the nominal gbat location */ + +#ifdef OUTPUT_PBM + printf("P4\n%d %d\n", GBW, GBH); +#endif + + for (y = 0; y < GBH; y++) + { + uint32_t CONTEXT; + uint32_t line_m1; + uint32_t line_m2; + int padded_width = (GBW + 7) & -8; + + line_m1 = (y >= 1) ? gbreg_line[-rowstride] : 0; + line_m2 = (y >= 2) ? gbreg_line[-(rowstride << 1)] << 5 : 0; + CONTEXT = ((line_m1 >> 1) & 0x1f8) | ((line_m2 >> 1) & 0x1e00); + + /* 6.2.5.7 3d */ + for (x = 0; x < padded_width; x += 8) + { + byte result = 0; + int x_minor; + int minor_width = GBW - x > 8 ? 8 : GBW - x; + + if (y >= 1) + line_m1 = (line_m1 << 8) | + (x + 8 < GBW ? gbreg_line[-rowstride + (x >> 3) + 1] : 0); + + if (y >= 2) + line_m2 = (line_m2 << 8) | + (x + 8 < GBW ? gbreg_line[-(rowstride << 1) + (x >> 3) + 1] << 5: 0); + + /* This is the speed-critical inner loop. */ + for (x_minor = 0; x_minor < minor_width; x_minor++) + { + bool bit; + + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + result |= bit << (7 - x_minor); + CONTEXT = ((CONTEXT & 0xefb) << 1) | bit | + ((line_m1 >> (8 - x_minor)) & 0x8) | + ((line_m2 >> (8 - x_minor)) & 0x200); + } + gbreg_line[x >> 3] = result; + } +#ifdef OUTPUT_PBM + fwrite(gbreg_line, 1, rowstride, stdout); +#endif + gbreg_line += rowstride; + } + + return 0; +} + +static int +jbig2_decode_generic_template2(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + const int rowstride = image->stride; + int x, y; + byte *gbreg_line = (byte *)image->data; + + /* todo: currently we only handle the nominal gbat location */ + +#ifdef OUTPUT_PBM + printf("P4\n%d %d\n", GBW, GBH); +#endif + + for (y = 0; y < GBH; y++) + { + uint32_t CONTEXT; + uint32_t line_m1; + uint32_t line_m2; + int padded_width = (GBW + 7) & -8; + + line_m1 = (y >= 1) ? gbreg_line[-rowstride] : 0; + line_m2 = (y >= 2) ? gbreg_line[-(rowstride << 1)] << 4 : 0; + CONTEXT = ((line_m1 >> 3) & 0x7c) | ((line_m2 >> 3) & 0x380); + + /* 6.2.5.7 3d */ + for (x = 0; x < padded_width; x += 8) + { + byte result = 0; + int x_minor; + int minor_width = GBW - x > 8 ? 8 : GBW - x; + + if (y >= 1) + line_m1 = (line_m1 << 8) | + (x + 8 < GBW ? gbreg_line[-rowstride + (x >> 3) + 1] : 0); + + if (y >= 2) + line_m2 = (line_m2 << 8) | + (x + 8 < GBW ? gbreg_line[-(rowstride << 1) + (x >> 3) + 1] << 4: 0); + + /* This is the speed-critical inner loop. */ + for (x_minor = 0; x_minor < minor_width; x_minor++) + { + bool bit; + + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + result |= bit << (7 - x_minor); + CONTEXT = ((CONTEXT & 0x1bd) << 1) | bit | + ((line_m1 >> (10 - x_minor)) & 0x4) | + ((line_m2 >> (10 - x_minor)) & 0x80); + } + gbreg_line[x >> 3] = result; + } +#ifdef OUTPUT_PBM + fwrite(gbreg_line, 1, rowstride, stdout); +#endif + gbreg_line += rowstride; + } + + return 0; +} + +static int +jbig2_decode_generic_template2a(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + const int rowstride = image->stride; + int x, y; + byte *gbreg_line = (byte *)image->data; + + /* This is a special case for GBATX1 = 3, GBATY1 = -1 */ + +#ifdef OUTPUT_PBM + printf("P4\n%d %d\n", GBW, GBH); +#endif + + for (y = 0; y < GBH; y++) + { + uint32_t CONTEXT; + uint32_t line_m1; + uint32_t line_m2; + int padded_width = (GBW + 7) & -8; + + line_m1 = (y >= 1) ? gbreg_line[-rowstride] : 0; + line_m2 = (y >= 2) ? gbreg_line[-(rowstride << 1)] << 4 : 0; + CONTEXT = ((line_m1 >> 3) & 0x78) | ((line_m1 >> 2) & 0x4) | ((line_m2 >> 3) & 0x380); + + /* 6.2.5.7 3d */ + for (x = 0; x < padded_width; x += 8) + { + byte result = 0; + int x_minor; + int minor_width = GBW - x > 8 ? 8 : GBW - x; + + if (y >= 1) + line_m1 = (line_m1 << 8) | + (x + 8 < GBW ? gbreg_line[-rowstride + (x >> 3) + 1] : 0); + + if (y >= 2) + line_m2 = (line_m2 << 8) | + (x + 8 < GBW ? gbreg_line[-(rowstride << 1) + (x >> 3) + 1] << 4: 0); + + /* This is the speed-critical inner loop. */ + for (x_minor = 0; x_minor < minor_width; x_minor++) + { + bool bit; + + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + result |= bit << (7 - x_minor); + CONTEXT = ((CONTEXT & 0x1b9) << 1) | bit | + ((line_m1 >> (10 - x_minor)) & 0x8) | + ((line_m1 >> (9 - x_minor)) & 0x4) | + ((line_m2 >> (10 - x_minor)) & 0x80); + } + gbreg_line[x >> 3] = result; + } +#ifdef OUTPUT_PBM + fwrite(gbreg_line, 1, rowstride, stdout); +#endif + gbreg_line += rowstride; + } + + return 0; +} + +static int +jbig2_decode_generic_template3(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + const int rowstride = image->stride; + byte *gbreg_line = (byte *)image->data; + int x, y; + + /* this routine only handles the nominal AT location */ + +#ifdef OUTPUT_PBM + printf("P4\n%d %d\n", GBW, GBH); +#endif + + for (y = 0; y < GBH; y++) + { + uint32_t CONTEXT; + uint32_t line_m1; + int padded_width = (GBW + 7) & -8; + + line_m1 = (y >= 1) ? gbreg_line[-rowstride] : 0; + CONTEXT = (line_m1 >> 1) & 0x3f0; + + /* 6.2.5.7 3d */ + for (x = 0; x < padded_width; x += 8) + { + byte result = 0; + int x_minor; + int minor_width = GBW - x > 8 ? 8 : GBW - x; + + if (y >= 1) + line_m1 = (line_m1 << 8) | + (x + 8 < GBW ? gbreg_line[-rowstride + (x >> 3) + 1] : 0); + + /* This is the speed-critical inner loop. */ + for (x_minor = 0; x_minor < minor_width; x_minor++) + { + bool bit; + + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + result |= bit << (7 - x_minor); + CONTEXT = ((CONTEXT & 0x1f7) << 1) | bit | + ((line_m1 >> (10 - x_minor)) & 0x010); + } + gbreg_line[x >> 3] = result; + } +#ifdef OUTPUT_PBM + fwrite(gbreg_line, 1, rowstride, stdout); +#endif + gbreg_line += rowstride; + } + + return 0; +} + +static int +jbig2_decode_generic_template3_unopt(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + uint32_t CONTEXT; + int x,y; + bool bit; + + /* this version is generic and easy to understand, but very slow */ + + for (y = 0; y < GBH; y++) { + for (x = 0; x < GBW; x++) { + CONTEXT = 0; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y) << 0; + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1; + CONTEXT |= jbig2_image_get_pixel(image, x - 3, y) << 2; + CONTEXT |= jbig2_image_get_pixel(image, x - 4, y) << 3; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], + y + params->gbat[1]) << 4; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 5; + CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 6; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 7; + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 8; + CONTEXT |= jbig2_image_get_pixel(image, x - 3, y - 1) << 9; + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + jbig2_image_set_pixel(image, x, y, bit); + } + } + return 0; +} + +static void +copy_prev_row(Jbig2Image *image, int row) +{ + if (!row) { + /* no previous row */ + memset( image->data, 0, image->stride ); + } else { + /* duplicate data from the previous row */ + uint8_t *src = image->data + (row - 1) * image->stride; + memcpy( src + image->stride, src, image->stride ); + } +} + +static int +jbig2_decode_generic_template0_TPGDON(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + uint32_t CONTEXT; + int x, y; + bool bit; + int LTP = 0; + + for (y = 0; y < GBH; y++) + { + LTP ^= jbig2_arith_decode(as, &GB_stats[0x9B25]); + if (!LTP) { + for (x = 0; x < GBW; x++) { + CONTEXT = jbig2_image_get_pixel(image, x - 1, y); + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1; + CONTEXT |= jbig2_image_get_pixel(image, x - 3, y) << 2; + CONTEXT |= jbig2_image_get_pixel(image, x - 4, y) << 3; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], + y + params->gbat[1]) << 4; + CONTEXT |= jbig2_image_get_pixel(image, x + 2, y - 1) << 5; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 6; + CONTEXT |= jbig2_image_get_pixel(image, x , y - 1) << 7; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 8; + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 9; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2], + y + params->gbat[3]) << 10; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4], + y + params->gbat[5]) << 11; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 2) << 12; + CONTEXT |= jbig2_image_get_pixel(image, x , y - 2) << 13; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 2) << 14; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6], + y + params->gbat[7]) << 15; + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + jbig2_image_set_pixel(image, x, y, bit); + } + } else { + copy_prev_row(image, y); + } + } + + return 0; +} + +static int +jbig2_decode_generic_template1_TPGDON(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + uint32_t CONTEXT; + int x, y; + bool bit; + int LTP = 0; + + for (y = 0; y < GBH; y++) { + LTP ^= jbig2_arith_decode(as, &GB_stats[0x0795]); + if (!LTP) { + for (x = 0; x < GBW; x++) { + CONTEXT = jbig2_image_get_pixel(image, x - 1, y); + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1; + CONTEXT |= jbig2_image_get_pixel(image, x - 3, y) << 2; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], + y + params->gbat[1]) << 3; + CONTEXT |= jbig2_image_get_pixel(image, x + 2, y - 1) << 4; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 5; + CONTEXT |= jbig2_image_get_pixel(image, x , y - 1) << 6; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 7; + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 8; + CONTEXT |= jbig2_image_get_pixel(image, x + 2, y - 2) << 9; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 2) << 10; + CONTEXT |= jbig2_image_get_pixel(image, x , y - 2) << 11; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 2) << 12; + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + jbig2_image_set_pixel(image, x, y, bit); + } + } else { + copy_prev_row(image, y); + } + } + + return 0; +} + +static int +jbig2_decode_generic_template2_TPGDON(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + uint32_t CONTEXT; + int x, y; + bool bit; + int LTP = 0; + + for (y = 0; y < GBH; y++) { + LTP ^= jbig2_arith_decode(as, &GB_stats[0xE5]); + if (!LTP) { + for (x = 0; x < GBW; x++) { + CONTEXT = jbig2_image_get_pixel(image, x - 1, y); + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], + y + params->gbat[1]) << 2; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 3; + CONTEXT |= jbig2_image_get_pixel(image, x , y - 1) << 4; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 5; + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 6; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 2) << 7; + CONTEXT |= jbig2_image_get_pixel(image, x , y - 2) << 8; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 2) << 9; + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + jbig2_image_set_pixel(image, x, y, bit); + } + } else { + copy_prev_row(image, y); + } + } + + return 0; +} + +static int +jbig2_decode_generic_template3_TPGDON(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int GBW = image->width; + const int GBH = image->height; + uint32_t CONTEXT; + int x, y; + bool bit; + int LTP = 0; + + for (y = 0; y < GBH; y++) { + LTP ^= jbig2_arith_decode(as, &GB_stats[0x0195]); + if (!LTP) { + for (x = 0; x < GBW; x++) { + CONTEXT = jbig2_image_get_pixel(image, x - 1, y); + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y) << 1; + CONTEXT |= jbig2_image_get_pixel(image, x - 3, y) << 2; + CONTEXT |= jbig2_image_get_pixel(image, x - 4, y) << 3; + CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], + y + params->gbat[1]) << 4; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 5; + CONTEXT |= jbig2_image_get_pixel(image, x , y - 1) << 6; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 7; + CONTEXT |= jbig2_image_get_pixel(image, x - 2, y - 1) << 8; + CONTEXT |= jbig2_image_get_pixel(image, x - 3, y - 1) << 9; + bit = jbig2_arith_decode(as, &GB_stats[CONTEXT]); + jbig2_image_set_pixel(image, x, y, bit); + } + } else { + copy_prev_row(image, y); + } + } + + return 0; +} + +static int +jbig2_decode_generic_region_TPGDON(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + switch (params->GBTEMPLATE) { + case 0: + return jbig2_decode_generic_template0_TPGDON(ctx, segment, + params, as, image, GB_stats); + case 1: + return jbig2_decode_generic_template1_TPGDON(ctx, segment, + params, as, image, GB_stats); + case 2: + return jbig2_decode_generic_template2_TPGDON(ctx, segment, + params, as, image, GB_stats); + case 3: + return jbig2_decode_generic_template3_TPGDON(ctx, segment, + params, as, image, GB_stats); + } + + return -1; +} + +/** + * jbig2_decode_generic_region: Decode a generic region. + * @ctx: The context for allocation and error reporting. + * @segment: A segment reference for error reporting. + * @params: Decoding parameter set. + * @as: Arithmetic decoder state. + * @image: Where to store the decoded data. + * @GB_stats: Arithmetic stats. + * + * Decodes a generic region, according to section 6.2. The caller should + * pass an already allocated Jbig2Image object for @image + * + * Because this API is based on an arithmetic decoding state, it is + * not suitable for MMR decoding. + * + * Return code: 0 on success. + **/ +int +jbig2_decode_generic_region(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + const int8_t *gbat = params->gbat; + + if (!params->MMR && params->TPGDON) + return jbig2_decode_generic_region_TPGDON(ctx, segment, params, + as, image, GB_stats); + + if (!params->MMR && params->GBTEMPLATE == 0) { + if (gbat[0] == +3 && gbat[1] == -1 && + gbat[2] == -3 && gbat[3] == -1 && + gbat[4] == +2 && gbat[5] == -2 && + gbat[6] == -2 && gbat[7] == -2) + return jbig2_decode_generic_template0(ctx, segment, params, + as, image, GB_stats); + else + return jbig2_decode_generic_template0_unopt(ctx, segment, params, + as, image, GB_stats); + } else if (!params->MMR && params->GBTEMPLATE == 1) + return jbig2_decode_generic_template1(ctx, segment, params, + as, image, GB_stats); + else if (!params->MMR && params->GBTEMPLATE == 2) + { + if (gbat[0] == 3 && gbat[1] == -1) + return jbig2_decode_generic_template2a(ctx, segment, params, + as, image, GB_stats); + else + return jbig2_decode_generic_template2(ctx, segment, params, + as, image, GB_stats); + } + else if (!params->MMR && params->GBTEMPLATE == 3) { + if (gbat[0] == 2 && gbat[1] == -1) + return jbig2_decode_generic_template3_unopt(ctx, segment, params, + as, image, GB_stats); + else + return jbig2_decode_generic_template3_unopt(ctx, segment, params, + as, image, GB_stats); + } + + { + int i; + for (i = 0; i < 8; i++) + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "gbat[%d] = %d", i, params->gbat[i]); + } + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "decode_generic_region: MMR=%d, GBTEMPLATE=%d NYI", + params->MMR, params->GBTEMPLATE); + return -1; +} + +/** + * Handler for immediate generic region segments + */ +int +jbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data) +{ + Jbig2RegionSegmentInfo rsi; + byte seg_flags; + int8_t gbat[8]; + int offset; + int gbat_bytes = 0; + Jbig2GenericRegionParams params; + int code; + Jbig2Image *image; + Jbig2WordStream *ws; + Jbig2ArithState *as; + Jbig2ArithCx *GB_stats = NULL; + + /* 7.4.6 */ + if (segment->data_length < 18) + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Segment too short"); + + jbig2_get_region_segment_info(&rsi, segment_data); + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "generic region: %d x %d @ (%d, %d), flags = %02x", + rsi.width, rsi.height, rsi.x, rsi.y, rsi.flags); + + /* 7.4.6.2 */ + seg_flags = segment_data[17]; + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "segment flags = %02x", seg_flags); + if ((seg_flags & 1) && (seg_flags & 6)) + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "MMR is 1, but GBTEMPLATE is not 0"); + + /* 7.4.6.3 */ + if (!(seg_flags & 1)) + { + gbat_bytes = (seg_flags & 6) ? 2 : 8; + if (18 + gbat_bytes > segment->data_length) + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Segment too short"); + memcpy(gbat, segment_data + 18, gbat_bytes); + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "gbat: %d, %d", gbat[0], gbat[1]); + } + + offset = 18 + gbat_bytes; + + /* Table 34 */ + params.MMR = seg_flags & 1; + params.GBTEMPLATE = (seg_flags & 6) >> 1; + params.TPGDON = (seg_flags & 8) >> 3; + params.USESKIP = 0; + memcpy (params.gbat, gbat, gbat_bytes); + + image = jbig2_image_new(ctx, rsi.width, rsi.height); + if (image == NULL) + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "unable to allocate generic image"); + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "allocated %d x %d image buffer for region decode results", + rsi.width, rsi.height); + + if (params.MMR) + { + code = jbig2_decode_generic_mmr(ctx, segment, ¶ms, + segment_data + offset, segment->data_length - offset, + image); + } + else + { + int stats_size = jbig2_generic_stats_size(ctx, params.GBTEMPLATE); + GB_stats = jbig2_alloc(ctx->allocator, stats_size); + memset(GB_stats, 0, stats_size); + + ws = jbig2_word_stream_buf_new(ctx, + segment_data + offset, + segment->data_length - offset); + as = jbig2_arith_new(ctx, ws); + code = jbig2_decode_generic_region(ctx, segment, ¶ms, + as, image, GB_stats); + jbig2_free(ctx->allocator, as); + jbig2_word_stream_buf_free(ctx, ws); + + jbig2_free(ctx->allocator, GB_stats); + } + + jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], + image, rsi.x, rsi.y, JBIG2_COMPOSE_OR); + jbig2_image_release(ctx, image); + + return code; +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_generic.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_generic.h new file mode 100755 index 000000000..9111cf7d3 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_generic.h @@ -0,0 +1,62 @@ +/* + jbig2dec + + Copyright (C) 2002-2004 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/** + * Headers for Generic and Generic Refinement region handling + **/ + +/* 6.4 Table 2 */ +typedef struct { + bool MMR; + /* GBW */ + /* GBH */ + int GBTEMPLATE; + bool TPGDON; + bool USESKIP; + /* SKIP */ + int8_t gbat[8]; +} Jbig2GenericRegionParams; + +/* return the appropriate context size for the given template */ +int +jbig2_generic_stats_size(Jbig2Ctx *ctx, int template); + +int +jbig2_decode_generic_region(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats); + + +/* 6.3 Table 6 */ +typedef struct { + /* GRW */ + /* GRH */ + bool GRTEMPLATE; + Jbig2Image *reference; + int32_t DX, DY; + bool TPGRON; + int8_t grat[4]; +} Jbig2RefinementRegionParams; + +int +jbig2_decode_refinement_region(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2RefinementRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GB_stats); diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_halftone.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_halftone.c new file mode 100755 index 000000000..3d0cb1818 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_halftone.c @@ -0,0 +1,372 @@ +/* + jbig2dec + + Copyright (C) 2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* JBIG2 Pattern Dictionary and Halftone Region decoding */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include /* memset() */ + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_arith.h" +#include "jbig2_generic.h" +#include "jbig2_mmr.h" + +typedef struct { + int n_patterns; + Jbig2Image **patterns; + int HPW, HPH; +} Jbig2PatternDict; + +/* Table 24 */ +typedef struct { + bool HDMMR; + uint32_t HDPW; + uint32_t HDPH; + uint32_t GRAYMAX; + int HDTEMPLATE; +} Jbig2PatternDictParams; + +/* Table 33 */ +typedef struct { + byte flags; + uint32_t HGW; + uint32_t HGH; + int32_t HGX; + int32_t HGY; + uint16_t HRX; + uint16_t HRY; + bool HMMR; + int HTEMPLATE; + bool HENABLESKIP; + Jbig2ComposeOp op; + bool HDEFPIXEL; +} Jbig2HalftoneRegionParams; + + +/** + * jbig2_hd_new: create a new dictionary from a collective bitmap + */ +Jbig2PatternDict * +jbig2_hd_new(Jbig2Ctx *ctx, + const Jbig2PatternDictParams *params, + Jbig2Image *image) +{ + Jbig2PatternDict *new; + const int N = params->GRAYMAX + 1; + const int HPW = params->HDPW; + const int HPH = params->HDPH; + int i; + + /* allocate a new struct */ + new = (Jbig2PatternDict *)jbig2_alloc(ctx->allocator, + sizeof(Jbig2PatternDict)); + if (new != NULL) { + new->patterns = (Jbig2Image **)jbig2_alloc(ctx->allocator, + N*sizeof(Jbig2Image*)); + if (new->patterns == NULL) { + jbig2_free(ctx->allocator, new); + return NULL; + } + new->n_patterns = N; + new->HPW = HPW; + new->HPH = HPH; + + /* 6.7.5(4) - copy out the individual pattern images */ + for (i = 0; i < N; i++) { + new->patterns[i] = jbig2_image_new(ctx, HPW, HPH); + if (new->patterns[i] == NULL) { + int j; + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, + "failed to allocate pattern element image"); + for (j = 0; j < i; j++) + jbig2_free(ctx->allocator, new->patterns[j]); + jbig2_free(ctx->allocator, new); + return NULL; + } + /* compose with the REPLACE operator; the source + will be clipped to the destintion, selecting the + proper sub image */ + jbig2_image_compose(ctx, new->patterns[i], image, + -i * HPW, 0, JBIG2_COMPOSE_REPLACE); + } + } + + return new; +} + +/** + * jbig2_hd_release: release a pattern dictionary + */ +void +jbig2_hd_release(Jbig2Ctx *ctx, Jbig2PatternDict *dict) +{ + int i; + + if (dict == NULL) return; + for (i = 0; i < dict->n_patterns; i++) + if (dict->patterns[i]) jbig2_image_release(ctx, dict->patterns[i]); + jbig2_free(ctx->allocator, dict->patterns); + jbig2_free(ctx->allocator, dict); +} + +/** + * jbig2_decode_pattern_dict: decode pattern dictionary data + * + * @ctx: jbig2 decoder context + * @segment: jbig2 segment (header) structure + * @params: parameters from the pattern dictionary header + * @data: pointer to text region data to be decoded + * @size: length of text region data + * @GB_stats: artimetic coding context to use + * + * Implements the patten dictionary decoding proceedure + * described in section 6.7 of the JBIG2 spec. + * + * returns: a pointer to the resulting dictionary on success + * returns: 0 on failure + **/ +static Jbig2PatternDict * +jbig2_decode_pattern_dict(Jbig2Ctx *ctx, Jbig2Segment *segment, + const Jbig2PatternDictParams *params, + const byte *data, const size_t size, + Jbig2ArithCx *GB_stats) +{ + Jbig2PatternDict *hd = NULL; + Jbig2Image *image; + Jbig2GenericRegionParams rparams; + int code; + + /* allocate the collective image */ + image = jbig2_image_new(ctx, + params->HDPW * (params->GRAYMAX + 1), params->HDPH); + if (image == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "failed to allocate collective bitmap for halftone dict!"); + return NULL; + } + + /* fill out the generic region decoder parameters */ + rparams.MMR = params->HDMMR; + rparams.GBTEMPLATE = params->HDTEMPLATE; + rparams.TPGDON = 0; /* not used if HDMMR = 1 */ + rparams.USESKIP = 0; + rparams.gbat[0] = -params->HDPW; + rparams.gbat[1] = 0; + rparams.gbat[2] = -3; + rparams.gbat[3] = -1; + rparams.gbat[4] = 2; + rparams.gbat[5] = -2; + rparams.gbat[6] = -2; + rparams.gbat[7] = -2; + + if (params->HDMMR) { + code = jbig2_decode_generic_mmr(ctx, segment, &rparams, + data, size, image); + } else { + Jbig2WordStream *ws = jbig2_word_stream_buf_new(ctx, data, size); + Jbig2ArithState *as = jbig2_arith_new(ctx, ws); + + code = jbig2_decode_generic_region(ctx, segment, &rparams, + as, image, GB_stats); + + jbig2_free(ctx->allocator, as); + jbig2_word_stream_buf_free(ctx, ws); + } + if (code != 0) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "error decoding collective pattern dictionary bitmap!"); + } + + hd = jbig2_hd_new(ctx, params, image); + jbig2_image_release(ctx, image); + + return hd; +} + +/* 7.4.4 */ +int +jbig2_pattern_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data) +{ + Jbig2PatternDictParams params; + Jbig2ArithCx *GB_stats = NULL; + byte flags; + int offset = 0; + + /* 7.4.4.1 - Data header */ + if (segment->data_length < 7) { + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Segment too short"); + } + flags = segment_data[0]; + params.HDMMR = flags & 1; + params.HDTEMPLATE = (flags & 6) >> 1; + params.HDPW = segment_data[1]; + params.HDPH = segment_data[2]; + params.GRAYMAX = jbig2_get_int32(segment_data + 3); + offset += 7; + + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "pattern dictionary, flags=%02x, %d grays (%dx%d cell)", + flags, params.GRAYMAX + 1, params.HDPW, params.HDPH); + + if (params.HDMMR && params.HDTEMPLATE) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "HDTEMPLATE is %d when HDMMR is %d, contrary to spec", + params.HDTEMPLATE, params.HDMMR); + } + if (flags & 0xf8) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "Reserved flag bits non-zero"); + } + + /* 7.4.4.2 */ + if (!params.HDMMR) { + /* allocate and zero arithmetic coding stats */ + int stats_size = jbig2_generic_stats_size(ctx, params.HDTEMPLATE); + GB_stats = jbig2_alloc(ctx->allocator, stats_size); + memset(GB_stats, 0, stats_size); + } + + segment->result = jbig2_decode_pattern_dict(ctx, segment, ¶ms, + segment_data + offset, + segment->data_length - offset, GB_stats); + + /* todo: retain GB_stats? */ + if (!params.HDMMR) { + jbig2_free(ctx->allocator, GB_stats); + } + + return (segment->result != NULL) ? 0 : 1; +} + + + +/** + * jbig2_decode_halftone_region: decode a halftone region + **/ +int +jbig2_decode_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + Jbig2HalftoneRegionParams *params, + const byte *data, const size_t size, + Jbig2Image *image, + Jbig2ArithCx *GB_stats) +{ + int code = 0; + + /* todo: implement */ + return code; +} + +/** + * jbig2_halftone_region: read a halftone region segment header + **/ +int +jbig2_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data) +{ + int offset = 0; + Jbig2RegionSegmentInfo region_info; + Jbig2HalftoneRegionParams params; + Jbig2Image *image; + Jbig2ArithCx *GB_stats; + int code; + + /* 7.4.5.1 */ + if (segment->data_length < 17) goto too_short; + jbig2_get_region_segment_info(®ion_info, segment_data); + offset += 17; + + if (segment->data_length < 18) goto too_short; + + /* 7.4.5.1.1 */ + params.flags = segment_data[offset]; + params.HMMR = params.flags & 1; + params.HTEMPLATE = (params.flags & 6) >> 1; + params.HENABLESKIP = (params.flags & 8) >> 3; + params.op = (params.flags & 0x70) >> 4; + params.HDEFPIXEL = (params.flags &0x80) >> 7; + offset += 1; + + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "halftone region: %d x %d @ (%x,%d) flags=%02x", + region_info.width, region_info.height, + region_info.x, region_info.y, params.flags); + + if (params.HMMR && params.HTEMPLATE) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "HTEMPLATE is %d when HMMR is %d, contrary to spec", + params.HTEMPLATE, params.HMMR); + } + if (params.HMMR && params.HENABLESKIP) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "HENABLESKIP is %d when HMMR is %d, contrary to spec", + params.HENABLESKIP, params.HMMR); + } + + /* Figure 43 */ + if (segment->data_length - offset < 16) goto too_short; + params.HGW = jbig2_get_int32(segment_data + offset); + params.HGH = jbig2_get_int32(segment_data + offset + 4); + params.HGX = jbig2_get_int32(segment_data + offset + 8); + params.HGY = jbig2_get_int32(segment_data + offset + 12); + offset += 16; + + /* Figure 44 */ + if (segment->data_length - offset < 4) goto too_short; + params.HRX = jbig2_get_int16(segment_data + offset); + params.HRY = jbig2_get_int16(segment_data + offset + 2); + offset += 4; + + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + " grid %d x %d @ (%d.%d,%d.%d) vector (%d.%d,%d.%d)", + params.HGW, params.HGH, + params.HGX >> 8, params.HGX & 0xff, + params.HGY >> 8, params.HGY & 0xff, + params.HRX >> 8, params.HRX & 0xff, + params.HRY >> 8, params.HRY & 0xff); + + /* 7.4.5.2.2 */ + if (!params.HMMR) { + /* allocate and zero arithmetic coding stats */ + int stats_size = jbig2_generic_stats_size(ctx, params.HTEMPLATE); + GB_stats = jbig2_alloc(ctx->allocator, stats_size); + memset(GB_stats, 0, stats_size); + } + + image = jbig2_image_new(ctx, region_info.width, region_info.height); + if (image == NULL) + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "unable to allocate halftone image"); + + code = jbig2_decode_halftone_region(ctx, segment, ¶ms, + segment_data + offset, segment->data_length - offset, + image, GB_stats); + + /* todo: retain GB_stats? */ + if (!params.HMMR) { + jbig2_free(ctx->allocator, GB_stats); + } + + return code; + +too_short: + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Segment too short"); +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_huffman.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_huffman.c new file mode 100755 index 000000000..521c666c7 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_huffman.c @@ -0,0 +1,480 @@ +/* + jbig2dec + + Copyright (C) 2001-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* Huffman table decoding procedures + -- See Annex B of the JBIG2 specification */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include + +#ifdef JBIG2_DEBUG +#include +#endif + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_huffman.h" +#include "jbig2_hufftab.h" + +#define JBIG2_HUFFMAN_FLAGS_ISOOB 1 +#define JBIG2_HUFFMAN_FLAGS_ISLOW 2 +#define JBIG2_HUFFMAN_FLAGS_ISEXT 4 + + + +struct _Jbig2HuffmanState { + /* The current bit offset is equal to (offset * 8) + offset_bits. + The MSB of this_word is the current bit offset. The MSB of next_word + is (offset + 4) * 8. */ + uint32_t this_word; + uint32_t next_word; + int offset_bits; + int offset; + + Jbig2WordStream *ws; +}; + + +/** Allocate and initialize a new huffman coding state + * the returned pointer can simply be freed; this does + * not affect the associated Jbig2WordStream. + */ +Jbig2HuffmanState * +jbig2_huffman_new (Jbig2Ctx *ctx, Jbig2WordStream *ws) +{ + Jbig2HuffmanState *result; + + result = (Jbig2HuffmanState *)jbig2_alloc(ctx->allocator, + sizeof(Jbig2HuffmanState)); + + if (result != NULL) { + result->offset = 0; + result->offset_bits = 0; + result->this_word = ws->get_next_word (ws, 0); + result->next_word = ws->get_next_word (ws, 4); + + result->ws = ws; + } + + return result; +} + +/** Free an allocated huffman coding state. + * This just calls jbig2_free() if the pointer is not NULL + */ +void +jbig2_huffman_free (Jbig2Ctx *ctx, Jbig2HuffmanState *hs) +{ + if (hs != NULL) free(hs); + return; +} + +/** debug routines **/ +#ifdef JBIG2_DEBUG + +/** print current huffman state */ +void jbig2_dump_huffman_state(Jbig2HuffmanState *hs) { + fprintf(stderr, "huffman state %08x %08x offset %d.%d\n", + hs->this_word, hs->next_word, hs->offset, hs->offset_bits); +} + +/** print the binary string we're reading from */ +void jbig2_dump_huffman_binary(Jbig2HuffmanState *hs) +{ + const uint32_t word = hs->this_word; + int i; + + fprintf(stderr, "huffman binary "); + for (i = 31; i >= 0; i--) + fprintf(stderr, ((word >> i) & 1) ? "1" : "0"); + fprintf(stderr, "\n"); +} + +#endif /* JBIG2_DEBUG */ + +/** Skip bits up to the next byte boundary + */ +void +jbig2_huffman_skip(Jbig2HuffmanState *hs) +{ + int bits = hs->offset_bits & 7; + + if (bits) { + bits = 8 - bits; + hs->offset_bits += bits; + hs->this_word = (hs->this_word << bits) | + (hs->next_word >> (32 - hs->offset_bits)); + } + + if (hs->offset_bits >= 32) { + Jbig2WordStream *ws = hs->ws; + hs->this_word = hs->next_word; + hs->offset += 4; + hs->next_word = ws->get_next_word (ws, hs->offset + 4); + hs->offset_bits -= 32; + if (hs->offset_bits) { + hs->this_word = (hs->this_word << hs->offset_bits) | + (hs->next_word >> (32 - hs->offset_bits)); + } + } +} + +/* skip ahead a specified number of bytes in the word stream + */ +void jbig2_huffman_advance(Jbig2HuffmanState *hs, int offset) +{ + Jbig2WordStream *ws = hs->ws; + + hs->offset += offset & ~3; + hs->offset_bits += (offset & 3) << 3; + if (hs->offset_bits >= 32) { + hs->offset += 4; + hs->offset_bits -= 32; + } + hs->this_word = ws->get_next_word (ws, hs->offset); + hs->next_word = ws->get_next_word (ws, hs->offset + 4); + if (hs->offset_bits > 0) + hs->this_word = (hs->this_word << hs->offset_bits) | + (hs->next_word >> (32 - hs->offset_bits)); +} + +/* return the offset of the huffman decode pointer (in bytes) + * from the beginning of the WordStream + */ +int +jbig2_huffman_offset(Jbig2HuffmanState *hs) +{ + return hs->offset + (hs->offset_bits >> 3); +} + +/* read a number of bits directly from the huffman state + * without decoding against a table + */ +int32_t +jbig2_huffman_get_bits (Jbig2HuffmanState *hs, const int bits) +{ + uint32_t this_word = hs->this_word; + int32_t result; + + result = this_word >> (32 - bits); + hs->offset_bits += bits; + if (hs->offset_bits >= 32) { + hs->offset += 4; + hs->offset_bits -= 32; + hs->this_word = hs->next_word; + hs->next_word = hs->ws->get_next_word(hs->ws, hs->offset + 4); + if (hs->offset_bits) { + hs->this_word = (hs->this_word << hs->offset_bits) | + (hs->next_word >> (32 - hs->offset_bits)); + } else { + hs->this_word = (hs->this_word << hs->offset_bits); + } + } else { + hs->this_word = (this_word << bits) | + (hs->next_word >> (32 - hs->offset_bits)); + } + + return result; +} + +int32_t +jbig2_huffman_get (Jbig2HuffmanState *hs, + const Jbig2HuffmanTable *table, bool *oob) +{ + Jbig2HuffmanEntry *entry; + byte flags; + int offset_bits = hs->offset_bits; + uint32_t this_word = hs->this_word; + uint32_t next_word; + int RANGELEN; + int32_t result; + + for (;;) + { + int log_table_size = table->log_table_size; + int PREFLEN; + + entry = &table->entries[this_word >> (32 - log_table_size)]; + flags = entry->flags; + PREFLEN = entry->PREFLEN; + + next_word = hs->next_word; + offset_bits += PREFLEN; + if (offset_bits >= 32) + { + Jbig2WordStream *ws = hs->ws; + this_word = next_word; + hs->offset += 4; + next_word = ws->get_next_word (ws, hs->offset + 4); + offset_bits -= 32; + hs->next_word = next_word; + PREFLEN = offset_bits; + } + if (PREFLEN) + this_word = (this_word << PREFLEN) | + (next_word >> (32 - offset_bits)); + if (flags & JBIG2_HUFFMAN_FLAGS_ISEXT) + { + table = entry->u.ext_table; + } + else + break; + } + result = entry->u.RANGELOW; + RANGELEN = entry->RANGELEN; + if (RANGELEN > 0) + { + int32_t HTOFFSET; + + HTOFFSET = this_word >> (32 - RANGELEN); + if (flags & JBIG2_HUFFMAN_FLAGS_ISLOW) + result -= HTOFFSET; + else + result += HTOFFSET; + + offset_bits += RANGELEN; + if (offset_bits >= 32) + { + Jbig2WordStream *ws = hs->ws; + this_word = next_word; + hs->offset += 4; + next_word = ws->get_next_word (ws, hs->offset + 4); + offset_bits -= 32; + hs->next_word = next_word; + RANGELEN = offset_bits; + } +if (RANGELEN) + this_word = (this_word << RANGELEN) | + (next_word >> (32 - offset_bits)); + } + + hs->this_word = this_word; + hs->offset_bits = offset_bits; + + if (oob != NULL) + *oob = (flags & JBIG2_HUFFMAN_FLAGS_ISOOB); + + return result; +} + +/* TODO: more than 8 bits here is wasteful of memory. We have support + for sub-trees in jbig2_huffman_get() above, but don't use it here. + We should, and then revert to 8 bits */ +#define LOG_TABLE_SIZE_MAX 16 + +/** Build an in-memory representation of a Huffman table from the + * set of template params provided by the spec or a table segment + */ +Jbig2HuffmanTable * +jbig2_build_huffman_table (Jbig2Ctx *ctx, const Jbig2HuffmanParams *params) +{ + int *LENCOUNT; + int LENMAX = -1; + const int lencountsize = 256 * sizeof(*LENCOUNT); + const Jbig2HuffmanLine *lines = params->lines; + int n_lines = params->n_lines; + int i, j; + int max_j; + int log_table_size = 0; + Jbig2HuffmanTable *result; + Jbig2HuffmanEntry *entries; + int CURLEN; + int firstcode = 0; + int CURCODE; + int CURTEMP; + + LENCOUNT = jbig2_alloc(ctx->allocator, lencountsize); + if (LENCOUNT == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, + "couldn't allocate storage for huffman histogram"); + return NULL; + } + memset(LENCOUNT, 0, lencountsize); + + /* B.3, 1. */ + for (i = 0; i < params->n_lines; i++) + { + int PREFLEN = lines[i].PREFLEN; + int lts; + + if (PREFLEN > LENMAX) + { + for (j = LENMAX + 1; j < PREFLEN + 1; j++) + LENCOUNT[j] = 0; + LENMAX = PREFLEN; + } + LENCOUNT[PREFLEN]++; + + lts = PREFLEN + lines[i].RANGELEN; + if (lts > LOG_TABLE_SIZE_MAX) + lts = PREFLEN; + if (lts <= LOG_TABLE_SIZE_MAX && log_table_size < lts) + log_table_size = lts; + } + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1, + "constructing huffman table log size %d", log_table_size); + max_j = 1 << log_table_size; + + result = (Jbig2HuffmanTable *)jbig2_alloc(ctx->allocator, sizeof(Jbig2HuffmanTable)); + result->log_table_size = log_table_size; + entries = (Jbig2HuffmanEntry *)jbig2_alloc(ctx->allocator, max_j * sizeof(Jbig2HuffmanEntry)); + result->entries = entries; + + LENCOUNT[0] = 0; + + for (CURLEN = 1; CURLEN <= LENMAX; CURLEN++) + { + int shift = log_table_size - CURLEN; + + /* B.3 3.(a) */ + firstcode = (firstcode + LENCOUNT[CURLEN - 1]) << 1; + CURCODE = firstcode; + /* B.3 3.(b) */ + for (CURTEMP = 0; CURTEMP < n_lines; CURTEMP++) + { + int PREFLEN = lines[CURTEMP].PREFLEN; + if (PREFLEN == CURLEN) + { + int RANGELEN = lines[CURTEMP].RANGELEN; + int start_j = CURCODE << shift; + int end_j = (CURCODE + 1) << shift; + byte eflags = 0; + + if (end_j > max_j) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, + "ran off the end of the entries table! (%d >= %d)", + end_j, max_j); + jbig2_free(ctx->allocator, result->entries); + jbig2_free(ctx->allocator, result); + jbig2_free(ctx->allocator, LENCOUNT); + return NULL; + } + /* todo: build extension tables */ + if (params->HTOOB && CURTEMP == n_lines - 1) + eflags |= JBIG2_HUFFMAN_FLAGS_ISOOB; + if (CURTEMP == n_lines - (params->HTOOB ? 3 : 2)) + eflags |= JBIG2_HUFFMAN_FLAGS_ISLOW; + if (PREFLEN + RANGELEN > LOG_TABLE_SIZE_MAX) { + for (j = start_j; j < end_j; j++) { + entries[j].u.RANGELOW = lines[CURTEMP].RANGELOW; + entries[j].PREFLEN = PREFLEN; + entries[j].RANGELEN = RANGELEN; + entries[j].flags = eflags; + } + } else { + for (j = start_j; j < end_j; j++) { + int32_t HTOFFSET = (j >> (shift - RANGELEN)) & + ((1 << RANGELEN) - 1); + if (eflags & JBIG2_HUFFMAN_FLAGS_ISLOW) + entries[j].u.RANGELOW = lines[CURTEMP].RANGELOW - + HTOFFSET; + else + entries[j].u.RANGELOW = lines[CURTEMP].RANGELOW + + HTOFFSET; + entries[j].PREFLEN = PREFLEN + RANGELEN; + entries[j].RANGELEN = 0; + entries[j].flags = eflags; + } + } + CURCODE++; + } + } + } + + jbig2_free(ctx->allocator, LENCOUNT); + + return result; +} + +/** Free the memory associated with the representation of table */ +void +jbig2_release_huffman_table (Jbig2Ctx *ctx, Jbig2HuffmanTable *table) +{ + if (table != NULL) { + jbig2_free(ctx->allocator, table->entries); + jbig2_free(ctx->allocator, table); + } + return; +} + +#ifdef TEST +#include + +/* a test bitstream, and a list of the table indicies + to use in decoding it. 1 = table B.1 (A), 2 = table B.2 (B), and so on */ +/* this test stream should decode to { 8, 5, oob, 8 } */ + +const byte test_stream[] = { 0xe9, 0xcb, 0xf4, 0x00 }; +const byte test_tabindex[] = { 4, 2, 2, 1 }; + +static uint32_t +test_get_word (Jbig2WordStream *self, int offset) +{ + /* assume test_stream[] is at least 4 bytes */ + if (offset+3 > sizeof(test_stream)) + return 0; + else + return ( (test_stream[offset] << 24) | + (test_stream[offset+1] << 16) | + (test_stream[offset+2] << 8) | + (test_stream[offset+3]) ); +} + +int +main (int argc, char **argv) +{ + Jbig2Ctx *ctx; + Jbig2HuffmanTable *tables[5]; + Jbig2HuffmanState *hs; + Jbig2WordStream ws; + bool oob; + int32_t code; + + ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL); + + tables[0] = NULL; + tables[1] = jbig2_build_huffman_table (ctx, &jbig2_huffman_params_A); + tables[2] = jbig2_build_huffman_table (ctx, &jbig2_huffman_params_B); + tables[3] = NULL; + tables[4] = jbig2_build_huffman_table (ctx, &jbig2_huffman_params_D); + ws.get_next_word = test_get_word; + hs = jbig2_huffman_new (ctx, &ws); + + printf("testing jbig2 huffmann decoding..."); + printf("\t(should be 8 5 (oob) 8)\n"); + + { + int i; + int sequence_length = sizeof(test_tabindex); + + for (i = 0; i < sequence_length; i++) { + code = jbig2_huffman_get (hs, tables[test_tabindex[i]], &oob); + if (oob) printf("(oob) "); + else printf("%d ", code); + } + } + + printf("\n"); + + jbig2_ctx_free(ctx); + + return 0; +} +#endif diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_huffman.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_huffman.h new file mode 100755 index 000000000..fb9b9f41d --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_huffman.h @@ -0,0 +1,105 @@ +/* + jbig2dec + + Copyright (C) 2001-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifndef JBIG2_HUFFMAN_H +#define JBIG2_HUFFMAN_H + +/* Huffman coder interface */ + +typedef struct _Jbig2HuffmanEntry Jbig2HuffmanEntry; +typedef struct _Jbig2HuffmanState Jbig2HuffmanState; +typedef struct _Jbig2HuffmanTable Jbig2HuffmanTable; +typedef struct _Jbig2HuffmanParams Jbig2HuffmanParams; + +struct _Jbig2HuffmanEntry { + union { + int32_t RANGELOW; + Jbig2HuffmanTable *ext_table; + } u; + byte PREFLEN; + byte RANGELEN; + byte flags; +}; + +struct _Jbig2HuffmanTable { + int log_table_size; + Jbig2HuffmanEntry *entries; +}; + +typedef struct _Jbig2HuffmanLine Jbig2HuffmanLine; + +struct _Jbig2HuffmanLine { + int PREFLEN; + int RANGELEN; + int RANGELOW; +}; + +struct _Jbig2HuffmanParams { + bool HTOOB; + int n_lines; + const Jbig2HuffmanLine *lines; +}; + +Jbig2HuffmanState * +jbig2_huffman_new (Jbig2Ctx *ctx, Jbig2WordStream *ws); + +void +jbig2_huffman_free (Jbig2Ctx *ctx, Jbig2HuffmanState *hs); + +void +jbig2_huffman_skip(Jbig2HuffmanState *hs); + +void jbig2_huffman_advance(Jbig2HuffmanState *hs, int offset); + +int +jbig2_huffman_offset(Jbig2HuffmanState *hs); + +int32_t +jbig2_huffman_get (Jbig2HuffmanState *hs, + const Jbig2HuffmanTable *table, bool *oob); + +int32_t +jbig2_huffman_get_bits (Jbig2HuffmanState *hs, const int bits); + +#ifdef JBIG2_DEBUG +void jbig2_dump_huffman_state(Jbig2HuffmanState *hs); +void jbig2_dump_huffman_binary(Jbig2HuffmanState *hs); +#endif + +Jbig2HuffmanTable * +jbig2_build_huffman_table (Jbig2Ctx *ctx, const Jbig2HuffmanParams *params); + +void +jbig2_release_huffman_table (Jbig2Ctx *ctx, Jbig2HuffmanTable *table); + +/* standard Huffman templates defined by the specification */ +extern const Jbig2HuffmanParams jbig2_huffman_params_A; /* Table B.1 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_B; /* Table B.2 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_C; /* Table B.3 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_D; /* Table B.4 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_E; /* Table B.5 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_F; /* Table B.6 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_G; /* Table B.7 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_H; /* Table B.8 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_I; /* Table B.9 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_J; /* Table B.10 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_K; /* Table B.11 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_L; /* Table B.12 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_M; /* Table B.13 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_N; /* Table B.14 */ +extern const Jbig2HuffmanParams jbig2_huffman_params_O; /* Table B.15 */ + + +#endif /* JBIG2_HUFFMAN_H */ diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_hufftab.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_hufftab.h new file mode 100755 index 000000000..c8a967ac4 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_hufftab.h @@ -0,0 +1,335 @@ +/* + jbig2dec + + Copyright (C) 2001-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* predefined Huffman table definitions + -- See Annex B of the JBIG2 specification */ + +#ifndef JBIG2_HUFFTAB_H +#define JBIG2_HUFFTAB_H + +/* types are in jbig2_huffman.h, you must include that first */ + + +/* Table B.1 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_A[] = { + { 1, 4, 0 }, + { 2, 8, 16 }, + { 3, 16, 272 }, + { 0, 32, -1 }, /* low */ + { 3, 32, 65808 } /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_A = { FALSE, 5, jbig2_huffman_lines_A }; + +/* Table B.2 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_B[] = { + { 1, 0, 0 }, + { 2, 0, 1 }, + { 3, 0, 2 }, + { 4, 3, 3 }, + { 5, 6, 11 }, + { 0, 32, -1 }, /* low */ + { 6, 32, 75 }, /* high */ + { 6, 0, 0 } +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_B = { TRUE, 8, jbig2_huffman_lines_B }; + +/* Table B.3 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_C[] = { + { 8, 8, -256 }, + { 1, 0, 0 }, + { 2, 0, 1 }, + { 3, 0, 2 }, + { 4, 3, 3 }, + { 5, 6, 11 }, + { 8, 32, -257 }, /* low */ + { 7, 32, 75 }, /* high */ + { 6, 0, 0 } /* OOB */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_C = { TRUE, 9, jbig2_huffman_lines_C }; + +/* Table B.4 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_D[] = { + { 1, 0, 1 }, + { 2, 0, 2 }, + { 3, 0, 3 }, + { 4, 3, 4 }, + { 5, 6, 12 }, + { 0, 32, -1 }, /* low */ + { 5, 32, 76 }, /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_D = { FALSE, 7, jbig2_huffman_lines_D }; + +/* Table B.5 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_E[] = { + {7, 8, -255}, + {1, 0, 1}, + {2, 0, 2}, + {3, 0, 3}, + {4, 3, 4}, + {5, 6, 12}, + {7, 32, -256}, /* low */ + {6, 32, 76} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_E = { FALSE, 8, jbig2_huffman_lines_E }; + +/* Table B.6 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_F[] = { + {5, 10, -2048}, + {4, 9, -1024}, + {4, 8, -512}, + {4, 7, -256}, + {5, 6, -128}, + {5, 5, -64}, + {4, 5, -32}, + {2, 7, 0}, + {3, 7, 128}, + {3, 8, 256}, + {4, 9, 512}, + {4, 10, 1024}, + {6, 32, -2049}, /* low */ + {6, 32, 2048} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_F = { FALSE, 14, jbig2_huffman_lines_F }; + +/* Table B.7 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_G[] = { + {4, 9, -1024}, + {3, 8, -512}, + {4, 7, -256}, + {5, 6, -128}, + {5, 5, -64}, + {4, 5, -32}, + {4, 5, 0}, + {5, 5, 32}, + {5, 6, 64}, + {4, 7, 128}, + {3, 8, 256}, + {3, 9, 512}, + {3, 10, 1024}, + {5, 32, -1025}, /* low */ + {5, 32, 2048} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_G = { FALSE, 15, jbig2_huffman_lines_G }; + +/* Table B.8 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_H[] = { + {8, 3, -15}, + {9, 1, -7}, + {8, 1, -5}, + {9, 0, -3}, + {7, 0, -2}, + {4, 0, -1}, + {2, 1, 0}, + {5, 0, 2}, + {6, 0, 3}, + {3, 4, 4}, + {6, 1, 20}, + {4, 4, 22}, + {4, 5, 38}, + {5, 6, 70}, + {5, 7, 134}, + {6, 7, 262}, + {7, 8, 390}, + {6, 10, 646}, + {9, 32, -16}, /* low */ + {9, 32, 1670}, /* high */ + {2, 0, 0} /* OOB */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_H = { TRUE, 21, jbig2_huffman_lines_H }; + +/* Table B.9 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_I[] = { + {8, 4, -31}, + {9, 2, -15}, + {8, 2, -11}, + {9, 1, -7}, + {7, 1, -5}, + {4, 1, -3}, + {3, 1, -1}, + {3, 1, 1}, + {5, 1, 3}, + {6, 1, 5}, + {3, 5, 7}, + {6, 2, 39}, + {4, 5, 43}, + {4, 6, 75}, + {5, 7, 139}, + {5, 8, 267}, + {6, 8, 523}, + {7, 9, 779}, + {6, 11, 1291}, + {9, 32, -32}, /* low */ + {9, 32, 3339}, /* high */ + {2, 0, 0} /* OOB */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_I = { TRUE, 22, jbig2_huffman_lines_I }; + +/* Table B.10 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_J[] = { + {7, 4, -21}, + {8, 0, -5}, + {7, 0, -4}, + {5, 0, -3}, + {2, 2, -2}, + {5, 0, 2}, + {6, 0, 3}, + {7, 0, 4}, + {8, 0, 5}, + {2, 6, 6}, + {5, 5, 70}, + {6, 5, 102}, + {6, 6, 134}, + {6, 7, 198}, + {6, 8, 326}, + {6, 9, 582}, + {6, 10, 1094}, + {7, 11, 2118}, + {8, 32, -22}, /* low */ + {8, 32, 4166}, /* high */ + {2, 0, 0} /* OOB */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_J = { TRUE, 21, jbig2_huffman_lines_J }; + +/* Table B.11 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_K[] = { + {1, 0, 1}, + {2, 1, 2}, + {4, 0, 3}, + {4, 1, 5}, + {5, 1, 7}, + {5, 2, 9}, + {6, 2, 13}, + {7, 2, 17}, + {7, 3, 21}, + {7, 4, 29}, + {7, 5, 45}, + {7, 6, 77}, + {7, 32, 141} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_K = { FALSE, 13, jbig2_huffman_lines_K }; + +/* Table B.12 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_L[] = { + {1, 0, 1}, + {2, 0, 2}, + {3, 1, 3}, + {5, 0, 5}, + {5, 1, 6}, + {6, 1, 8}, + {7, 0, 10}, + {7, 1, 11}, + {7, 2, 13}, + {7, 3, 17}, + {7, 4, 25}, + {8, 5, 41}, + {8, 32, 73} +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_L = { FALSE, 13, jbig2_huffman_lines_L }; + + +/* Table B.13 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_M[] = { + {1, 0, 1}, + {3, 0, 2}, + {4, 0, 3}, + {5, 0, 4}, + {4, 1, 5}, + {3, 3, 7}, + {6, 1, 15}, + {6, 2, 17}, + {6, 3, 21}, + {6, 4, 29}, + {6, 5, 45}, + {7, 6, 77}, + {7, 32, 141} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_M = { FALSE, 13, jbig2_huffman_lines_M }; + +/* Table B.14 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_N[] = { + { 3, 0, -2 }, + { 3, 0, -1 }, + { 1, 0, 0 }, + { 3, 3, 1 }, + { 3, 6, 2 }, + { 0, 32, -1 }, /* low */ + { 0, 32, 3 }, /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_N = { FALSE, 7, jbig2_huffman_lines_N }; + +/* Table B.15 */ +const Jbig2HuffmanLine +jbig2_huffman_lines_O[] = { + {7, 4, -24}, + {6, 2, -8}, + {5, 1, -4}, + {4, 0, -2}, + {3, 0, -1}, + {1, 0, 0}, + {3, 0, 1}, + {4, 0, 2}, + {5, 1, 3}, + {6, 2, 5}, + {7, 4, 9}, + {7, 32, -25}, /* low */ + {7, 32, 25} /* high */ +}; + +const Jbig2HuffmanParams +jbig2_huffman_params_O = { FALSE, 13, jbig2_huffman_lines_O }; + +#endif /* JBIG2_HUFFTAB_H */ diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_image.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_image.c new file mode 100755 index 000000000..325ef6632 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_image.c @@ -0,0 +1,313 @@ +/* + jbig2dec + + Copyright (C) 2001-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include +#include /* memcpy() */ + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_image.h" + + +/* allocate a Jbig2Image structure and its associated bitmap */ +Jbig2Image* jbig2_image_new(Jbig2Ctx *ctx, int width, int height) +{ + Jbig2Image *image; + int stride; + + image = (Jbig2Image *)jbig2_alloc(ctx->allocator, sizeof(*image)); + if (image == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, + "could not allocate image structure"); + return NULL; + } + + stride = ((width - 1) >> 3) + 1; /* generate a byte-aligned stride */ + image->data = (uint8_t *)jbig2_alloc(ctx->allocator, stride*height); + if (image->data == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, + "could not allocate image data buffer! [%d bytes]\n", stride*height); + jbig2_free(ctx->allocator, image); + return NULL; + } + + image->width = width; + image->height = height; + image->stride = stride; + image->refcount = 1; + + return image; +} + +/* clone an image pointer by bumping its reference count */ +Jbig2Image* jbig2_image_clone(Jbig2Ctx *ctx, Jbig2Image *image) +{ + image->refcount++; + return image; +} + +/* release an image pointer, freeing it it appropriate */ +void jbig2_image_release(Jbig2Ctx *ctx, Jbig2Image *image) +{ + image->refcount--; + if (!image->refcount) jbig2_image_free(ctx, image); +} + +/* free a Jbig2Image structure and its associated memory */ +void jbig2_image_free(Jbig2Ctx *ctx, Jbig2Image *image) +{ + jbig2_free(ctx->allocator, image->data); + jbig2_free(ctx->allocator, image); +} + +/* resize a Jbig2Image */ +Jbig2Image *jbig2_image_resize(Jbig2Ctx *ctx, Jbig2Image *image, + int width, int height) +{ + if (width == image->width) { + /* use the same stride, just change the length */ + image->data = jbig2_realloc(ctx->allocator, + image->data, image->stride*height); + if (image->data == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, + "could not resize image buffer!"); + return NULL; + } + if (height > image->height) { + memset(image->data + image->height*image->stride, + 0, (height - image->height)*image->stride); + } + image->height = height; + + } else { + /* we must allocate a new image buffer and copy */ + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, -1, + "jbig2_image_resize called with a different width (NYI)"); + } + + return NULL; +} + +/* composite one jbig2_image onto another + slow but general version */ +int jbig2_image_compose_unopt(Jbig2Ctx *ctx, + Jbig2Image *dst, Jbig2Image *src, + int x, int y, Jbig2ComposeOp op) +{ + int i, j; + int sw = src->width; + int sh = src->height; + int sx = 0; + int sy = 0; + + /* clip to the dst image boundaries */ + if (x < 0) { sx += -x; sw -= -x; x = 0; } + if (y < 0) { sy += -y; sh -= -y; y = 0; } + if (x + sw >= dst->width) sw = dst->width - x; + if (y + sh >= dst->height) sh = dst->height - y; + + switch (op) { + case JBIG2_COMPOSE_OR: + for (j = 0; j < sh; j++) { + for (i = 0; i < sw; i++) { + jbig2_image_set_pixel(dst, i+x, j+y, + jbig2_image_get_pixel(src, i+sx, j+sy) | + jbig2_image_get_pixel(dst, i+x, j+y)); + } + } + break; + case JBIG2_COMPOSE_AND: + for (j = 0; j < sh; j++) { + for (i = 0; i < sw; i++) { + jbig2_image_set_pixel(dst, i+x, j+y, + jbig2_image_get_pixel(src, i+sx, j+sy) & + jbig2_image_get_pixel(dst, i+x, j+y)); + } + } + break; + case JBIG2_COMPOSE_XOR: + for (j = 0; j < sh; j++) { + for (i = 0; i < sw; i++) { + jbig2_image_set_pixel(dst, i+x, j+y, + jbig2_image_get_pixel(src, i+sx, j+sy) ^ + jbig2_image_get_pixel(dst, i+x, j+y)); + } + } + break; + case JBIG2_COMPOSE_XNOR: + for (j = 0; j < sh; j++) { + for (i = 0; i < sw; i++) { + jbig2_image_set_pixel(dst, i+x, j+y, + ~(jbig2_image_get_pixel(src, i+sx, j+sy) ^ + jbig2_image_get_pixel(dst, i+x, j+y))); + } + } + break; + case JBIG2_COMPOSE_REPLACE: + for (j = 0; j < sh; j++) { + for (i = 0; i < sw; i++) { + jbig2_image_set_pixel(dst, i+x, j+y, + jbig2_image_get_pixel(src, i+sx, j+sy)); + } + } + break; + } + + return 0; +} + +/* composite one jbig2_image onto another */ +int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, + int x, int y, Jbig2ComposeOp op) +{ + int i, j; + int w, h; + int leftbyte, rightbyte; + int shift; + uint8_t *s, *ss; + uint8_t *d, *dd; + uint8_t mask, rightmask; + + if (op != JBIG2_COMPOSE_OR) { + /* hand off the the general routine */ + return jbig2_image_compose_unopt(ctx, dst, src, x, y, op); + } + + /* clip */ + w = src->width; + h = src->height; + ss = src->data; + /* FIXME: this isn't sufficient for the < 0 cases */ + if (x < 0) { w += x; x = 0; } + if (y < 0) { h += y; y = 0; } + w = (x + w < dst->width) ? w : dst->width - x; + h = (y + h < dst->height) ? h : dst->height - y; +#ifdef JBIG2_DEBUG + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1, + "compositing %dx%d at (%d, %d) after clipping\n", + w, h, x, y); +#endif + +#if 0 + /* special case complete/strip replacement */ + /* disabled because it's only safe to do when the destination + buffer is all-blank. */ + if ((x == 0) && (w == src->width)) { + memcpy(dst->data + y*dst->stride, src->data, h*src->stride); + return 0; + } +#endif + + leftbyte = x >> 3; + rightbyte = (x + w - 1) >> 3; + shift = x & 7; + + /* general OR case */ + s = ss; + d = dd = dst->data + y*dst->stride + leftbyte; + if (leftbyte == rightbyte) { + mask = 0x100 - (0x100 >> w); + for (j = 0; j < h; j++) { + *d |= (*s & mask) >> shift; + d += dst->stride; + s += src->stride; + } + } else if (shift == 0) { + rightmask = (w & 7) ? 0x100 - (1 << (8 - (w & 7))) : 0xFF; + for (j = 0; j < h; j++) { + for (i = leftbyte; i < rightbyte; i++) + *d++ |= *s++; + *d |= *s & rightmask; + d = (dd += dst->stride); + s = (ss += src->stride); + } + } else { + bool overlap = (((w + 7) >> 3) < ((x + w + 7) >> 3) - (x >> 3)); + mask = 0x100 - (1 << shift); + if (overlap) + rightmask = (0x100 - (0x100 >> ((x + w) & 7))) >> (8 - shift); + else + rightmask = 0x100 - (0x100 >> (w & 7)); + for (j = 0; j < h; j++) { + *d++ |= (*s & mask) >> shift; + for(i = leftbyte; i < rightbyte - 1; i++) { + *d |= ((*s++ & ~mask) << (8 - shift)); + *d++ |= ((*s & mask) >> shift); + } + if (overlap) + *d |= (*s & rightmask) << (8 - shift); + else + *d |= ((s[0] & ~mask) << (8 - shift)) | + ((s[1] & rightmask) >> shift); + d = (dd += dst->stride); + s = (ss += src->stride); + } + } + + return 0; +} + + +/* initialize an image bitmap to a constant value */ +void jbig2_image_clear(Jbig2Ctx *ctx, Jbig2Image *image, int value) +{ + const uint8_t fill = value ? 0xFF : 0x00; + + memset(image->data, fill, image->stride*image->height); +} + +/* look up a pixel value in an image. + returns 0 outside the image frame for the convenience of + the template code +*/ +int jbig2_image_get_pixel(Jbig2Image *image, int x, int y) +{ + const int w = image->width; + const int h = image->height; + const int byte = (x >> 3) + y*image->stride; + const int bit = 7 - (x & 7); + + if ((x < 0) || (x >= w)) return 0; + if ((y < 0) || (y >= h)) return 0; + + return ((image->data[byte]>>bit) & 1); +} + +/* set an individual pixel value in an image */ +int jbig2_image_set_pixel(Jbig2Image *image, int x, int y, bool value) +{ + const int w = image->width; + const int h = image->height; + int scratch, mask; + int bit, byte; + + if ((x < 0) || (x >= w)) return 0; + if ((y < 0) || (y >= h)) return 0; + + byte = (x >> 3) + y*image->stride; + bit = 7 - (x & 7); + mask = (1 << bit) ^ 0xff; + + scratch = image->data[byte] & mask; + image->data[byte] = scratch | (value << bit); + + return 1; +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_image.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_image.h new file mode 100755 index 000000000..a09e36820 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_image.h @@ -0,0 +1,38 @@ +/* + jbig2dec + + Copyright (C) 2001-2002 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + + +#ifndef _JBIG2_IMAGE_H +#define _JBIG2_IMAGE_H + +int jbig2_image_get_pixel(Jbig2Image *image, int x, int y); +int jbig2_image_set_pixel(Jbig2Image *image, int x, int y, int value); + +/* routines for dumping the image data in various formats */ +/* FIXME: should these be in the client instead? */ + +#include + +int jbig2_image_write_pbm_file(Jbig2Image *image, char *filename); +int jbig2_image_write_pbm(Jbig2Image *image, FILE *out); +Jbig2Image *jbig2_image_read_pbm_file(Jbig2Ctx *ctx, char *filename); +Jbig2Image *jbig2_image_read_pbm(Jbig2Ctx *ctx, FILE *in); + +#ifdef HAVE_LIBPNG +int jbig2_image_write_png_file(Jbig2Image *image, char *filename); +int jbig2_image_write_png(Jbig2Image *image, FILE *out); +#endif + +#endif /* _JBIG2_IMAGE_H */ diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_image_pbm.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_image_pbm.c new file mode 100755 index 000000000..b32a476fa --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_image_pbm.c @@ -0,0 +1,150 @@ +/* + jbig2dec + + Copyright (C) 2009 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include + +#include "jbig2.h" +#include "jbig2_image.h" + +/* take an image structure and write it to a file in pbm format */ + +int jbig2_image_write_pbm_file(Jbig2Image *image, char *filename) +{ + FILE *out; + int error; + + if ((out = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "unable to open '%s' for writing", filename); + return 1; + } + + error = jbig2_image_write_pbm(image, out); + + fclose(out); + return (error); +} + +/* write out an image struct as a pbm stream to an open file pointer */ + +int jbig2_image_write_pbm(Jbig2Image *image, FILE *out) +{ + /* pbm header */ + fprintf(out, "P4\n%d %d\n", image->width, image->height); + + /* pbm format pads to a byte boundary, so we can + just write out the whole data buffer + NB: this assumes minimal stride for the width */ + fwrite(image->data, 1, image->height*image->stride, out); + + /* success */ + return 0; +} + +/* take an image from a file in pbm format */ +Jbig2Image *jbig2_image_read_pbm_file(Jbig2Ctx *ctx, char *filename) +{ + FILE *in; + Jbig2Image *image; + + if ((in = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "unable to open '%s' for reading\n", filename); + return NULL; + } + + image = jbig2_image_read_pbm(ctx, in); + + fclose(in); + + return (image); +} + +/* FIXME: should handle multi-image files */ +Jbig2Image *jbig2_image_read_pbm(Jbig2Ctx *ctx, FILE *in) +{ + int i, dim[2]; + int done; + Jbig2Image *image; + int c; + char buf[32]; + + /* look for 'P4' magic */ + while ((c = fgetc(in)) != 'P') { + if (feof(in)) return NULL; + } + if ((c = fgetc(in)) != '4') { + fprintf(stderr, "not a binary pbm file.\n"); + return NULL; + } + /* read size. we must find two decimal numbers representing + the image dimensions. 'done' will index whether we're + looking for the width or the height and 'i' will be our + array index for copying strings into our buffer */ + done = 0; + i = 0; + while (done < 2) { + c = fgetc(in); + /* skip whitespace */ + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') continue; + /* skip comments */ + if (c == '#') { + while ((c = fgetc(in)) != '\n'); + continue; + } + /* report unexpected eof */ + if (c == EOF) { + fprintf(stderr, "end-of-file parsing pbm header\n"); + return NULL; + } + if (isdigit(c)) { + buf[i++] = c; + while (isdigit(c = fgetc(in))) { + if (i >= 32) { + fprintf(stderr, "pbm parsing error\n"); + return NULL; + } + buf[i++] = c; + } + buf[i] = '\0'; + if (sscanf(buf, "%d", &dim[done]) != 1) { + fprintf(stderr, "couldn't read pbm image dimensions\n"); + return NULL; + } + i = 0; + done++; + } + } + /* allocate image structure */ + image = jbig2_image_new(ctx, dim[0], dim[1]); + if (image == NULL) { + fprintf(stderr, "could not allocate %dx%d image for pbm file\n", dim[0], dim[1]); + return NULL; + } + /* the pbm data is byte-aligned, so we can + do a simple block read */ + fread(image->data, 1, image->height*image->stride, in); + if (feof(in)) { + fprintf(stderr, "unexpected end of pbm file.\n"); + jbig2_image_release(ctx, image); + return NULL; + } + /* success */ + return image; +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_metadata.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_metadata.c new file mode 100755 index 000000000..a2fc5ee1d --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_metadata.c @@ -0,0 +1,155 @@ +/* + jbig2dec + + Copyright (C) 2003 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_metadata.h" + +/* metadata key,value list object */ +Jbig2Metadata *jbig2_metadata_new(Jbig2Ctx *ctx, Jbig2Encoding encoding) +{ + Jbig2Metadata *md = jbig2_alloc(ctx->allocator, sizeof(Jbig2Metadata)); + + if (md != NULL) { + md->encoding = encoding; + md->entries = 0; + md->max_entries = 4; + md->keys = jbig2_alloc(ctx->allocator, md->max_entries*sizeof(char*)); + md->values = jbig2_alloc(ctx->allocator, md->max_entries*sizeof(char*)); + if (md->keys == NULL || md->values == NULL) { + jbig2_metadata_free(ctx, md); + md = NULL; + } + } + return md; +} + +void jbig2_metadata_free(Jbig2Ctx *ctx, Jbig2Metadata *md) +{ + int i; + + if (md->keys) { + /* assume we own the pointers */ + for (i = 0; i < md->entries; i++) + jbig2_free(ctx->allocator, md->keys[i]); + jbig2_free(ctx->allocator, md->keys); + } + if (md->values) { + for (i = 0; i < md->entries; i++) + jbig2_free(ctx->allocator, md->values[i]); + jbig2_free(ctx->allocator, md->values); + } + jbig2_free(ctx->allocator, md); +} + +static char *jbig2_strndup(Jbig2Ctx *ctx, const char *c, const int len) +{ + char *s = jbig2_alloc(ctx->allocator, len*sizeof(char)); + if (s == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, + "unable to duplicate comment string"); + } else { + memcpy(s, c, len); + } + return s; +} + +int jbig2_metadata_add(Jbig2Ctx *ctx, Jbig2Metadata *md, + const char *key, const int key_length, + const char *value, const int value_length) +{ + char **keys, **values; + + /* grow the array if necessary */ + if (md->entries == md->max_entries) { + md->max_entries >>= 2; + keys = jbig2_realloc(ctx->allocator, md->keys, md->max_entries); + values = jbig2_realloc(ctx->allocator, md->values, md->max_entries); + if (keys == NULL || values == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, + "unable to resize metadata structure"); + return -1; + } + md->keys = keys; + md->values = values; + } + + /* copy the passed key,value pair */ + md->keys[md->entries] = jbig2_strndup(ctx, key, key_length); + md->values[md->entries] = jbig2_strndup(ctx, value, value_length); + md->entries++; + + return 0; +} + + +/* decode an ascii comment segment 7.4.15.1 */ +int jbig2_comment_ascii(Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data) +{ + char *s = (char *)(segment_data + 4); + char *end = (char *)(segment_data + segment->data_length); + Jbig2Metadata *comment; + char *key, *value; + int key_length, value_length; + + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "ASCII comment data"); + + comment = jbig2_metadata_new(ctx, JBIG2_ENCODING_ASCII); + if (comment == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unable to allocate comment structure"); + return -1; + } + /* loop over the segment data pulling out the key,value pairs */ + while(*s && s < end) { + key_length = strlen(s) + 1; + key = s; s += key_length; + if (s >= end) goto too_short; + value_length = strlen(s) + 1; + value = s; s += value_length; + if (s >= end) goto too_short; + jbig2_metadata_add(ctx, comment, key, key_length, value, value_length); + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "'%s'\t'%s'", key, value); + } + + /* TODO: associate with ctx, page, or referred-to segment(s) */ + segment->result = comment; + + return 0; + +too_short: + jbig2_metadata_free(ctx, comment); + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unexpected end of comment segment"); +} + +/* decode a UCS-16 comment segement 7.4.15.2 */ +int jbig2_comment_unicode(Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data) +{ + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unhandled unicode comment segment"); +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_metadata.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_metadata.h new file mode 100755 index 000000000..d61acab75 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_metadata.h @@ -0,0 +1,48 @@ +/* + jbig2dec + + Copyright (C) 2003 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + + +#ifndef _JBIG2_METADATA_H +#define _JBIG2_METADATA_H + +/* metadata from extension segments */ + +/* these bits should be moved to jbig2.h for public access */ +typedef enum { + JBIG2_ENCODING_ASCII, + JBIG2_ENCODING_UCS16 +} Jbig2Encoding; + +typedef struct _Jbig2Metadata Jbig2Metadata; + +Jbig2Metadata *jbig2_metadata_new(Jbig2Ctx *ctx, Jbig2Encoding encoding); +void jbig2_metadata_free(Jbig2Ctx *ctx, Jbig2Metadata *md); +int jbig2_metadata_add(Jbig2Ctx *ctx, Jbig2Metadata *md, + const char *key, const int key_length, + const char *value, const int value_length); + +struct _Jbig2Metadata { + Jbig2Encoding encoding; + char **keys, **values; + int entries, max_entries; +}; + +/* these bits can go to jbig2_priv.h */ +int jbig2_comment_ascii(Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data); +int jbig2_comment_unicode(Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data); + +#endif /* _JBIG2_METADATA_H */ diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_mmr.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_mmr.c new file mode 100755 index 000000000..eeb5220c4 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_mmr.c @@ -0,0 +1,998 @@ +/* + jbig2dec + + Copyright (C) 2001-2002 Artifex Software, Inc. + + This software is provided AS-IS with no warranty, + either express or implied. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* An implementation of MMR decoding. This is based on the + implementation in Fitz, which in turn is based on the one + in Ghostscript. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include +#include + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_arith.h" +#include "jbig2_generic.h" +#include "jbig2_mmr.h" + +typedef struct { + int width; + int height; + const byte *data; + size_t size; + int data_index; + int bit_index; + uint32_t word; +} Jbig2MmrCtx; + + +static void +jbig2_decode_mmr_init(Jbig2MmrCtx *mmr, int width, int height, const byte *data, size_t size) +{ + int i; + uint32_t word = 0; + + mmr->width = width; + mmr->height = height; + mmr->data = data; + mmr->size = size; + mmr->data_index = 0; + mmr->bit_index = 0; + + for (i = 0; i < size && i < 4; i++) + word |= (data[i] << ((3 - i) << 3)); + mmr->word = word; +} + +static void +jbig2_decode_mmr_consume(Jbig2MmrCtx *mmr, int n_bits) +{ + mmr->word <<= n_bits; + mmr->bit_index += n_bits; + while (mmr->bit_index >= 8) { + mmr->bit_index -= 8; + if (mmr->data_index + 4 < mmr->size) + mmr->word |= (mmr->data[mmr->data_index + 4] << mmr->bit_index); + mmr->data_index++; + } +} + +/* + the first 2^(initialbits) entries map bit patterns to decodes + let's say initial_bits is 8 for the sake of example + and that the code is 1001 + that means that entries 0x90 .. 0x9f have the entry { val, 4 } + because those are all the bytes that start with the code + and the 4 is the length of the code +... if (n_bits > initial_bits) ... + anyway, in that case, it basically points to a mini table + the n_bits is the maximum length of all codes beginning with that byte + so 2^(n_bits - initial_bits) is the size of the mini-table + peter came up with this, and it makes sense +*/ + +typedef struct { + short val; + short n_bits; +} mmr_table_node; + +/* white decode table (runlength huffman codes) */ +const mmr_table_node jbig2_mmr_white_decode[] = { +{ 256, 12 }, +{ 272, 12 }, +{ 29, 8 }, +{ 30, 8 }, +{ 45, 8 }, +{ 46, 8 }, +{ 22, 7 }, +{ 22, 7 }, +{ 23, 7 }, +{ 23, 7 }, +{ 47, 8 }, +{ 48, 8 }, +{ 13, 6 }, +{ 13, 6 }, +{ 13, 6 }, +{ 13, 6 }, +{ 20, 7 }, +{ 20, 7 }, +{ 33, 8 }, +{ 34, 8 }, +{ 35, 8 }, +{ 36, 8 }, +{ 37, 8 }, +{ 38, 8 }, +{ 19, 7 }, +{ 19, 7 }, +{ 31, 8 }, +{ 32, 8 }, +{ 1, 6 }, +{ 1, 6 }, +{ 1, 6 }, +{ 1, 6 }, +{ 12, 6 }, +{ 12, 6 }, +{ 12, 6 }, +{ 12, 6 }, +{ 53, 8 }, +{ 54, 8 }, +{ 26, 7 }, +{ 26, 7 }, +{ 39, 8 }, +{ 40, 8 }, +{ 41, 8 }, +{ 42, 8 }, +{ 43, 8 }, +{ 44, 8 }, +{ 21, 7 }, +{ 21, 7 }, +{ 28, 7 }, +{ 28, 7 }, +{ 61, 8 }, +{ 62, 8 }, +{ 63, 8 }, +{ 0, 8 }, +{ 320, 8 }, +{ 384, 8 }, +{ 10, 5 }, +{ 10, 5 }, +{ 10, 5 }, +{ 10, 5 }, +{ 10, 5 }, +{ 10, 5 }, +{ 10, 5 }, +{ 10, 5 }, +{ 11, 5 }, +{ 11, 5 }, +{ 11, 5 }, +{ 11, 5 }, +{ 11, 5 }, +{ 11, 5 }, +{ 11, 5 }, +{ 11, 5 }, +{ 27, 7 }, +{ 27, 7 }, +{ 59, 8 }, +{ 60, 8 }, +{ 288, 9 }, +{ 290, 9 }, +{ 18, 7 }, +{ 18, 7 }, +{ 24, 7 }, +{ 24, 7 }, +{ 49, 8 }, +{ 50, 8 }, +{ 51, 8 }, +{ 52, 8 }, +{ 25, 7 }, +{ 25, 7 }, +{ 55, 8 }, +{ 56, 8 }, +{ 57, 8 }, +{ 58, 8 }, +{ 192, 6 }, +{ 192, 6 }, +{ 192, 6 }, +{ 192, 6 }, +{ 1664, 6 }, +{ 1664, 6 }, +{ 1664, 6 }, +{ 1664, 6 }, +{ 448, 8 }, +{ 512, 8 }, +{ 292, 9 }, +{ 640, 8 }, +{ 576, 8 }, +{ 294, 9 }, +{ 296, 9 }, +{ 298, 9 }, +{ 300, 9 }, +{ 302, 9 }, +{ 256, 7 }, +{ 256, 7 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 2, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 3, 4 }, +{ 128, 5 }, +{ 128, 5 }, +{ 128, 5 }, +{ 128, 5 }, +{ 128, 5 }, +{ 128, 5 }, +{ 128, 5 }, +{ 128, 5 }, +{ 8, 5 }, +{ 8, 5 }, +{ 8, 5 }, +{ 8, 5 }, +{ 8, 5 }, +{ 8, 5 }, +{ 8, 5 }, +{ 8, 5 }, +{ 9, 5 }, +{ 9, 5 }, +{ 9, 5 }, +{ 9, 5 }, +{ 9, 5 }, +{ 9, 5 }, +{ 9, 5 }, +{ 9, 5 }, +{ 16, 6 }, +{ 16, 6 }, +{ 16, 6 }, +{ 16, 6 }, +{ 17, 6 }, +{ 17, 6 }, +{ 17, 6 }, +{ 17, 6 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 4, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 14, 6 }, +{ 14, 6 }, +{ 14, 6 }, +{ 14, 6 }, +{ 15, 6 }, +{ 15, 6 }, +{ 15, 6 }, +{ 15, 6 }, +{ 64, 5 }, +{ 64, 5 }, +{ 64, 5 }, +{ 64, 5 }, +{ 64, 5 }, +{ 64, 5 }, +{ 64, 5 }, +{ 64, 5 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ 7, 4 }, +{ -2, 3 }, +{ -2, 3 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -3, 4 }, +{ 1792, 3 }, +{ 1792, 3 }, +{ 1984, 4 }, +{ 2048, 4 }, +{ 2112, 4 }, +{ 2176, 4 }, +{ 2240, 4 }, +{ 2304, 4 }, +{ 1856, 3 }, +{ 1856, 3 }, +{ 1920, 3 }, +{ 1920, 3 }, +{ 2368, 4 }, +{ 2432, 4 }, +{ 2496, 4 }, +{ 2560, 4 }, +{ 1472, 1 }, +{ 1536, 1 }, +{ 1600, 1 }, +{ 1728, 1 }, +{ 704, 1 }, +{ 768, 1 }, +{ 832, 1 }, +{ 896, 1 }, +{ 960, 1 }, +{ 1024, 1 }, +{ 1088, 1 }, +{ 1152, 1 }, +{ 1216, 1 }, +{ 1280, 1 }, +{ 1344, 1 }, +{ 1408, 1 } +}; + +/* black decode table (runlength huffman codes) */ +const mmr_table_node jbig2_mmr_black_decode[] = { +{ 128, 12 }, +{ 160, 13 }, +{ 224, 12 }, +{ 256, 12 }, +{ 10, 7 }, +{ 11, 7 }, +{ 288, 12 }, +{ 12, 7 }, +{ 9, 6 }, +{ 9, 6 }, +{ 8, 6 }, +{ 8, 6 }, +{ 7, 5 }, +{ 7, 5 }, +{ 7, 5 }, +{ 7, 5 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 6, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 5, 4 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 1, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 4, 3 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 3, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ 2, 2 }, +{ -2, 4 }, +{ -2, 4 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -1, 0 }, +{ -3, 5 }, +{ 1792, 4 }, +{ 1792, 4 }, +{ 1984, 5 }, +{ 2048, 5 }, +{ 2112, 5 }, +{ 2176, 5 }, +{ 2240, 5 }, +{ 2304, 5 }, +{ 1856, 4 }, +{ 1856, 4 }, +{ 1920, 4 }, +{ 1920, 4 }, +{ 2368, 5 }, +{ 2432, 5 }, +{ 2496, 5 }, +{ 2560, 5 }, +{ 18, 3 }, +{ 18, 3 }, +{ 18, 3 }, +{ 18, 3 }, +{ 18, 3 }, +{ 18, 3 }, +{ 18, 3 }, +{ 18, 3 }, +{ 52, 5 }, +{ 52, 5 }, +{ 640, 6 }, +{ 704, 6 }, +{ 768, 6 }, +{ 832, 6 }, +{ 55, 5 }, +{ 55, 5 }, +{ 56, 5 }, +{ 56, 5 }, +{ 1280, 6 }, +{ 1344, 6 }, +{ 1408, 6 }, +{ 1472, 6 }, +{ 59, 5 }, +{ 59, 5 }, +{ 60, 5 }, +{ 60, 5 }, +{ 1536, 6 }, +{ 1600, 6 }, +{ 24, 4 }, +{ 24, 4 }, +{ 24, 4 }, +{ 24, 4 }, +{ 25, 4 }, +{ 25, 4 }, +{ 25, 4 }, +{ 25, 4 }, +{ 1664, 6 }, +{ 1728, 6 }, +{ 320, 5 }, +{ 320, 5 }, +{ 384, 5 }, +{ 384, 5 }, +{ 448, 5 }, +{ 448, 5 }, +{ 512, 6 }, +{ 576, 6 }, +{ 53, 5 }, +{ 53, 5 }, +{ 54, 5 }, +{ 54, 5 }, +{ 896, 6 }, +{ 960, 6 }, +{ 1024, 6 }, +{ 1088, 6 }, +{ 1152, 6 }, +{ 1216, 6 }, +{ 64, 3 }, +{ 64, 3 }, +{ 64, 3 }, +{ 64, 3 }, +{ 64, 3 }, +{ 64, 3 }, +{ 64, 3 }, +{ 64, 3 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 13, 1 }, +{ 23, 4 }, +{ 23, 4 }, +{ 50, 5 }, +{ 51, 5 }, +{ 44, 5 }, +{ 45, 5 }, +{ 46, 5 }, +{ 47, 5 }, +{ 57, 5 }, +{ 58, 5 }, +{ 61, 5 }, +{ 256, 5 }, +{ 16, 3 }, +{ 16, 3 }, +{ 16, 3 }, +{ 16, 3 }, +{ 17, 3 }, +{ 17, 3 }, +{ 17, 3 }, +{ 17, 3 }, +{ 48, 5 }, +{ 49, 5 }, +{ 62, 5 }, +{ 63, 5 }, +{ 30, 5 }, +{ 31, 5 }, +{ 32, 5 }, +{ 33, 5 }, +{ 40, 5 }, +{ 41, 5 }, +{ 22, 4 }, +{ 22, 4 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 14, 1 }, +{ 15, 2 }, +{ 15, 2 }, +{ 15, 2 }, +{ 15, 2 }, +{ 15, 2 }, +{ 15, 2 }, +{ 15, 2 }, +{ 15, 2 }, +{ 128, 5 }, +{ 192, 5 }, +{ 26, 5 }, +{ 27, 5 }, +{ 28, 5 }, +{ 29, 5 }, +{ 19, 4 }, +{ 19, 4 }, +{ 20, 4 }, +{ 20, 4 }, +{ 34, 5 }, +{ 35, 5 }, +{ 36, 5 }, +{ 37, 5 }, +{ 38, 5 }, +{ 39, 5 }, +{ 21, 4 }, +{ 21, 4 }, +{ 42, 5 }, +{ 43, 5 }, +{ 0, 3 }, +{ 0, 3 }, +{ 0, 3 }, +{ 0, 3 } +}; + +#define getbit(buf, x) ( ( buf[x >> 3] >> ( 7 - (x & 7) ) ) & 1 ) + +static int +jbig2_find_changing_element(const byte *line, int x, int w) +{ + int a, b; + + if (line == 0) + return w; + + if (x == -1) { + a = 0; + x = 0; + } + else { + a = getbit(line, x); + x ++; + } + + while (x < w) { + b = getbit(line, x); + if (a != b) + break; + x++; + } + + return x; +} + +static int +jbig2_find_changing_element_of_color(const byte *line, int x, int w, int color) +{ + if (line == 0) + return w; + x = jbig2_find_changing_element(line, x, w); + if (x < w && getbit(line, x) != color) + x = jbig2_find_changing_element(line, x, w); + return x; +} + +static const byte lm[8] = { 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01 }; +static const byte rm[8] = { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE }; + +static void +jbig2_set_bits(byte *line, int x0, int x1) +{ + int a0, a1, b0, b1, a; + + a0 = x0 >> 3; + a1 = x1 >> 3; + + b0 = x0 & 7; + b1 = x1 & 7; + + if (a0 == a1) { + line[a0] |= lm[b0] & rm[b1]; + } + else { + line[a0] |= lm[b0]; + for (a = a0 + 1; a < a1; a++) + line[a] = 0xFF; + line[a1] |= rm[b1]; + } +} + + +static int +jbig2_decode_get_code(Jbig2MmrCtx *mmr, const mmr_table_node *table, int initial_bits) +{ + uint32_t word = mmr->word; + int table_ix = word >> (32 - initial_bits); + int val = table[table_ix].val; + int n_bits = table[table_ix].n_bits; + + if (n_bits > initial_bits) { + int mask = (1 << (32 - initial_bits)) - 1; + table_ix = val + ((word & mask) >> (32 - n_bits)); + val = table[table_ix].val; + n_bits = initial_bits + table[table_ix].n_bits; + } + + jbig2_decode_mmr_consume(mmr, n_bits); + + return val; +} + +static int +jbig2_decode_get_run(Jbig2MmrCtx *mmr, const mmr_table_node *table, int initial_bits) +{ + int result = 0; + int val; + + do { + val = jbig2_decode_get_code(mmr, table, initial_bits); + result += val; + } while (val >= 64); + + return result; +} + +static void +jbig2_decode_mmr_line(Jbig2MmrCtx *mmr, const byte *ref, byte *dst) +{ + int a0, a1, a2, b1, b2; + int c; + + a0 = -1; + c = 0; /* 0 is white, black is 1 */ + + while (1) + { + uint32_t word = mmr->word; + /* printf ("%08x\n", word); */ + + if (a0 >= mmr->width) + break; + + if ((word >> (32 - 3)) == 1) + { + int white_run, black_run; + + jbig2_decode_mmr_consume(mmr, 3); + + if (a0 == -1) + a0 = 0; + + if (c == 0) { + white_run = jbig2_decode_get_run(mmr, jbig2_mmr_white_decode, 8); + black_run = jbig2_decode_get_run(mmr, jbig2_mmr_black_decode, 7); + a1 = a0 + white_run; + a2 = a1 + black_run; + if (a1 > mmr->width) a1 = mmr->width; + if (a2 > mmr->width) a2 = mmr->width; + jbig2_set_bits(dst, a1, a2); + a0 = a2; + /* printf ("H %d %d\n", white_run, black_run); */ + } + else + { + black_run = jbig2_decode_get_run(mmr, jbig2_mmr_black_decode, 7); + white_run = jbig2_decode_get_run(mmr, jbig2_mmr_white_decode, 8); + a1 = a0 + black_run; + a2 = a1 + white_run; + if (a1 > mmr->width) a1 = mmr->width; + if (a2 > mmr->width) a2 = mmr->width; + jbig2_set_bits(dst, a0, a1); + a0 = a2; + /* printf ("H %d %d\n", black_run, white_run); */ + } + } + + else if ((word >> (32 - 4)) == 1) + { + /* printf ("P\n"); */ + jbig2_decode_mmr_consume(mmr, 4); + b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c); + b2 = jbig2_find_changing_element(ref, b1, mmr->width); + if (c) jbig2_set_bits(dst, a0, b2); + a0 = b2; + } + + else if ((word >> (32 - 1)) == 1) + { + /* printf ("V(0)\n"); */ + jbig2_decode_mmr_consume(mmr, 1); + b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c); + if (c) jbig2_set_bits(dst, a0, b1); + a0 = b1; + c = !c; + } + + else if ((word >> (32 - 3)) == 3) + { + /* printf ("VR(1)\n"); */ + jbig2_decode_mmr_consume(mmr, 3); + b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c); + if (b1 + 1 > mmr->width) break; + if (c) jbig2_set_bits(dst, a0, b1 + 1); + a0 = b1 + 1; + c = !c; + } + + else if ((word >> (32 - 6)) == 3) + { + /* printf ("VR(2)\n"); */ + jbig2_decode_mmr_consume(mmr, 6); + b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c); + if (b1 + 2 > mmr->width) break; + if (c) jbig2_set_bits(dst, a0, b1 + 2); + a0 = b1 + 2; + c = !c; + } + + else if ((word >> (32 - 7)) == 3) + { + /* printf ("VR(3)\n"); */ + jbig2_decode_mmr_consume(mmr, 7); + b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c); + if (b1 + 3 > mmr->width) break; + if (c) jbig2_set_bits(dst, a0, b1 + 3); + a0 = b1 + 3; + c = !c; + } + + else if ((word >> (32 - 3)) == 2) + { + /* printf ("VL(1)\n"); */ + jbig2_decode_mmr_consume(mmr, 3); + b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c); + if (b1 - 1 < 0) break; + if (c) jbig2_set_bits(dst, a0, b1 - 1); + a0 = b1 - 1; + c = !c; + } + + else if ((word >> (32 - 6)) == 2) + { + /* printf ("VL(2)\n"); */ + jbig2_decode_mmr_consume(mmr, 6); + b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c); + if (b1 - 2 < 0) break; + if (c) jbig2_set_bits(dst, a0, b1 - 2); + a0 = b1 - 2; + c = !c; + } + + else if ((word >> (32 - 7)) == 2) + { + /* printf ("VL(3)\n"); */ + jbig2_decode_mmr_consume(mmr, 7); + b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c); + if (b1 - 3 < 0) break; + if (c) jbig2_set_bits(dst, a0, b1 - 3); + a0 = b1 - 3; + c = !c; + } + + else + break; + } +} + +int +jbig2_decode_generic_mmr(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + const byte *data, size_t size, + Jbig2Image *image) +{ + Jbig2MmrCtx mmr; + const int rowstride = image->stride; + byte *dst = image->data; + byte *ref = NULL; + int y; + + jbig2_decode_mmr_init(&mmr, image->width, image->height, data, size); + + for (y = 0; y < image->height; y++) { + memset(dst, 0, rowstride); + jbig2_decode_mmr_line(&mmr, ref, dst); + ref = dst; + dst += rowstride; + } + + return 0; +} + diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_mmr.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_mmr.h new file mode 100755 index 000000000..cde4ec689 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_mmr.h @@ -0,0 +1,22 @@ +/* + jbig2dec + + Copyright (C) 2001 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +int +jbig2_decode_generic_mmr(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2GenericRegionParams *params, + const byte *data, size_t size, + Jbig2Image *image); + diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_page.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_page.c new file mode 100755 index 000000000..f11cb6fc3 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_page.c @@ -0,0 +1,327 @@ +/* + jbig2dec + + Copyright (C) 2001-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include + +#include "jbig2.h" +#include "jbig2_priv.h" + +#ifdef OUTPUT_PBM +#include +#include "jbig2_image.h" +#endif + +/* dump the page struct info */ +static void +dump_page_info(Jbig2Ctx *ctx, Jbig2Segment *segment, Jbig2Page *page) +{ + if (page->x_resolution == 0) { + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "page %d image is %dx%d (unknown res)", page->number, + page->width, page->height); + } else if (page->x_resolution == page->y_resolution) { + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "page %d image is %dx%d (%d ppm)", page->number, + page->width, page->height, + page->x_resolution); + } else { + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "page %d image is %dx%d (%dx%d ppm)", page->number, + page->width, page->height, + page->x_resolution, page->y_resolution); + } + if (page->striped) { + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "\tmaximum stripe size: %d", page->stripe_size); + } +} + +/** + * jbig2_page_info: parse page info segment + * + * Parse the page info segment data and fill out a corresponding + * Jbig2Page struct and ready it for subsequent rendered data, + * including allocating an image buffer for the page (or the first stripe) + **/ +int +jbig2_page_info (Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data) +{ + Jbig2Page *page; + + /* a new page info segment implies the previous page is finished */ + page = &(ctx->pages[ctx->current_page]); + if ((page->number != 0) && + ((page->state == JBIG2_PAGE_NEW) || (page->state == JBIG2_PAGE_FREE))) { + page->state = JBIG2_PAGE_COMPLETE; + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unexpected page info segment, marking previous page finished"); + } + + /* find a free page */ + { + int index, j; + index = ctx->current_page; + while (ctx->pages[index].state != JBIG2_PAGE_FREE) { + index++; + if (index >= ctx->max_page_index) { + /* grow the list */ + ctx->pages = jbig2_realloc(ctx->allocator, ctx->pages, + (ctx->max_page_index <<= 2) * sizeof(Jbig2Page)); + for (j=index; j < ctx->max_page_index; j++) { + ctx->pages[j].state = JBIG2_PAGE_FREE; + ctx->pages[j].number = 0; + ctx->pages[j].image = NULL; + + } + } + } + page = &(ctx->pages[index]); + ctx->current_page = index; + page->state = JBIG2_PAGE_NEW; + page->number = segment->page_association; + } + + /* FIXME: would be nice if we tried to work around this */ + if (segment->data_length < 19) { + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "segment too short"); + } + + /* 7.4.8.x */ + page->width = jbig2_get_int32(segment_data); + page->height = jbig2_get_int32(segment_data + 4); + + page->x_resolution = jbig2_get_int32(segment_data + 8); + page->y_resolution = jbig2_get_int32(segment_data + 12); + page->flags = segment_data[16]; + + /* 7.4.8.6 */ + { + int16_t striping = jbig2_get_int16(segment_data +17); + if (striping & 0x8000) { + page->striped = TRUE; + page->stripe_size = striping & 0x7FFF; + } else { + page->striped = FALSE; + page->stripe_size = 0; /* would page->height be better? */ + } + } + if (page->height == 0xFFFFFFFF && page->striped == FALSE) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "height is unspecified but page is not markes as striped"); + page->striped = TRUE; + } + page->end_row = 0; + + if (segment->data_length > 19) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "extra data in segment"); + } + + dump_page_info(ctx, segment, page); + + /* allocate an approprate page image buffer */ + /* 7.4.8.2 */ + if (page->height == 0xFFFFFFFF) { + page->image = jbig2_image_new(ctx, page->width, page->stripe_size); + } else { + page->image = jbig2_image_new(ctx, page->width, page->height); + } + if (page->image == NULL) { + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "failed to allocate buffer for page image"); + } else { + /* 8.2 (3) fill the page with the default pixel value */ + jbig2_image_clear(ctx, page->image, (page->flags & 4)); + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "allocated %dx%d page image (%d bytes)", + page->image->width, page->image->height, + page->image->stride*page->image->height); + } + + return 0; +} + +/** + * jbig2_end_of_stripe: parse and implement an end of stripe segment + **/ +int +jbig2_end_of_stripe(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data) +{ + Jbig2Page page = ctx->pages[ctx->current_page]; + int end_row; + + end_row = jbig2_get_int32(segment_data); + if (end_row < page.end_row) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "end of stripe segment with non-positive end row advance" + " (new end row %d vs current end row %d)", + end_row, page.end_row); + } else { + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "end of stripe: advancing end row to %d", end_row); + } + + page.end_row = end_row; + + return 0; +} + +/** + * jbig2_complete_page: complete a page image + * + * called upon seeing an 'end of page' segment, this routine + * marks a page as completed so it can be returned. + * compositing will have already happened in the previous + * segment handlers. + **/ +int +jbig2_complete_page (Jbig2Ctx *ctx) +{ + + /* check for unfinished segments */ + if (ctx->segment_index != ctx->n_segments) { + Jbig2Segment *segment = ctx->segments[ctx->segment_index]; + int code = 0; + /* Some versions of Xerox Workcentre generate PDF files + with the segment data length field of the last segment + set to -1. Try to cope with this here. */ + if ((segment->data_length & 0xffffffff) == 0xffffffff) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "File has an invalid segment data length!" + " Trying to decode using the available data."); + segment->data_length = ctx->buf_wr_ix - ctx->buf_rd_ix; + code = jbig2_parse_segment(ctx, segment, ctx->buf + ctx->buf_rd_ix); + ctx->buf_rd_ix += segment->data_length; + ctx->segment_index++; + } + } + ctx->pages[ctx->current_page].state = JBIG2_PAGE_COMPLETE; + + return 0; +} + +/** + * jbig2_end_of_page: parse and implement an end of page segment + **/ +int +jbig2_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data) +{ + uint32_t page_number = ctx->pages[ctx->current_page].number; + + if (segment->page_association != page_number) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "end of page marker for page %d doesn't match current page number %d", + segment->page_association, page_number); + } + + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "end of page %d", page_number); + + jbig2_complete_page(ctx); + +#ifdef OUTPUT_PBM + jbig2_image_write_pbm(ctx->pages[ctx->current_page].image, stdout); +#endif + + return 0; +} + +/** + * jbig2_add_page_result: composite a decoding result onto a page + * + * this is called to add the results of segment decode (when it + * is an image) to a page image buffer + **/ +int +jbig2_page_add_result(Jbig2Ctx *ctx, Jbig2Page *page, Jbig2Image *image, + int x, int y, Jbig2ComposeOp op) +{ + /* grow the page to accomodate a new stripe if necessary */ + if (page->striped) { + int new_height = y + image->height + page->end_row; + if (page->image->height < new_height) { + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1, + "growing page buffer to %d rows " + "to accomodate new stripe", new_height); + jbig2_image_resize(ctx, page->image, + page->image->width, new_height); + } + } + + jbig2_image_compose(ctx, page->image, image, + x, y + page->end_row, JBIG2_COMPOSE_OR); + + return 0; +} + +/** + * jbig2_get_page: return the next available page image buffer + * + * the client can call this at any time to check if any pages + * have been decoded. If so, it returns the first available + * one. The client should then call jbig2_release_page() when + * it no longer needs to refer to the image buffer. + * + * since this is a public routine for the library clients, we + * return an image structure pointer, even though the function + * name refers to a page; the page structure is private. + **/ +Jbig2Image *jbig2_page_out(Jbig2Ctx *ctx) +{ + int index; + + /* search for a completed page */ + for (index=0; index < ctx->max_page_index; index++) { + if (ctx->pages[index].state == JBIG2_PAGE_COMPLETE) { + ctx->pages[index].state = JBIG2_PAGE_RETURNED; + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1, + "page %d returned to the client", ctx->pages[index].number); + return jbig2_image_clone(ctx, ctx->pages[index].image); + } + } + + /* no pages available */ + return NULL; +} + +/** + * jbig2_release_page: tell the library a page can be freed + **/ +int jbig2_release_page(Jbig2Ctx *ctx, Jbig2Image *image) +{ + int index; + + /* find the matching page struct and mark it released */ + for (index = 0; index < ctx->max_page_index; index++) { + if (ctx->pages[index].image == image) { + jbig2_image_release(ctx, image); + ctx->pages[index].state = JBIG2_PAGE_RELEASED; + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1, + "page %d released by the client", ctx->pages[index].number); + return 0; + } + } + + /* no matching pages */ + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, -1, + "jbig2_release_page called on unknown page"); + return 1; +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_priv.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_priv.h new file mode 100755 index 000000000..cf617ed06 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_priv.h @@ -0,0 +1,177 @@ +/* + jbig2dec + + Copyright (C) 2002 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* library internals */ + +typedef uint8_t byte; +typedef int bool; + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL ((void*)0) +#endif + +typedef enum { + JBIG2_FILE_HEADER, + JBIG2_FILE_SEQUENTIAL_HEADER, + JBIG2_FILE_SEQUENTIAL_BODY, + JBIG2_FILE_RANDOM_HEADERS, + JBIG2_FILE_RANDOM_BODIES, + JBIG2_FILE_EOF +} Jbig2FileState; + +struct _Jbig2Ctx { + Jbig2Allocator *allocator; + Jbig2Options options; + const Jbig2Ctx *global_ctx; + Jbig2ErrorCallback error_callback; + void *error_callback_data; + + byte *buf; + size_t buf_size; + unsigned int buf_rd_ix; + unsigned int buf_wr_ix; + + Jbig2FileState state; + + uint8_t file_header_flags; + int32_t n_pages; + + int n_segments_max; + Jbig2Segment **segments; + int n_segments; /* index of last segment header parsed */ + int segment_index; /* index of last segment body parsed */ + + /* list of decoded pages, including the one in progress, + currently stored as a contiguous, 0-indexed array. */ + int current_page; + int max_page_index; + Jbig2Page *pages; +}; + +int32_t +jbig2_get_int32 (const byte *buf); + +int16_t +jbig2_get_int16 (const byte *buf); + +/* dynamic memory management */ +void * +jbig2_alloc (Jbig2Allocator *allocator, size_t size); + +void +jbig2_free (Jbig2Allocator *allocator, void *p); + +void * +jbig2_realloc (Jbig2Allocator *allocator, void *p, size_t size); + +#define jbig2_new(ctx, t, size) ((t *)jbig2_alloc(ctx->allocator, (size) * sizeof(t))) + +#define jbig2_renew(ctx, p, t, size) ((t *)jbig2_realloc(ctx->allocator, (p), (size) * sizeof(t))) + +int +jbig2_error (Jbig2Ctx *ctx, Jbig2Severity severity, int32_t seg_idx, + const char *fmt, ...); + +/* the page structure handles decoded page + results. it's allocated by a 'page info' + segement and marked complete by an 'end of page' + segment. +*/ +typedef enum { + JBIG2_PAGE_FREE, + JBIG2_PAGE_NEW, + JBIG2_PAGE_COMPLETE, + JBIG2_PAGE_RETURNED, + JBIG2_PAGE_RELEASED +} Jbig2PageState; + +struct _Jbig2Page { + Jbig2PageState state; + uint32_t number; + uint32_t height, width; /* in pixels */ + uint32_t x_resolution, + y_resolution; /* in pixels per meter */ + uint16_t stripe_size; + bool striped; + int end_row; + uint8_t flags; + Jbig2Image *image; +}; + +int jbig2_page_info (Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); +int jbig2_end_of_stripe(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); +int jbig2_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); +int jbig2_extension_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); + +typedef enum { + JBIG2_COMPOSE_OR = 0, + JBIG2_COMPOSE_AND = 1, + JBIG2_COMPOSE_XOR = 2, + JBIG2_COMPOSE_XNOR = 3, + JBIG2_COMPOSE_REPLACE = 4 +} Jbig2ComposeOp; + +int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, int x, int y, Jbig2ComposeOp op); +int jbig2_page_add_result(Jbig2Ctx *ctx, Jbig2Page *page, Jbig2Image *src, int x, int y, Jbig2ComposeOp op); + +/* region segment info */ + +typedef struct { + int32_t width; + int32_t height; + int32_t x; + int32_t y; + Jbig2ComposeOp op; + uint8_t flags; +} Jbig2RegionSegmentInfo; + +void jbig2_get_region_segment_info(Jbig2RegionSegmentInfo *info, const uint8_t *segment_data); +int jbig2_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); + +/* 7.4 */ +int jbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data); +int jbig2_refinement_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data); + +int jbig2_pattern_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data); +int jbig2_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data); + + +/* The word stream design is a compromise between simplicity and + trying to amortize the number of method calls. Each ::get_next_word + invocation pulls 4 bytes from the stream, packed big-endian into a + 32 bit word. The offset argument is provided as a convenience. It + begins at 0 and increments by 4 for each successive invocation. */ +typedef struct _Jbig2WordStream Jbig2WordStream; + +struct _Jbig2WordStream { + uint32_t (*get_next_word) (Jbig2WordStream *self, int offset); +}; + +Jbig2WordStream * +jbig2_word_stream_buf_new(Jbig2Ctx *ctx, const byte *data, size_t size); + +void +jbig2_word_stream_buf_free(Jbig2Ctx *ctx, Jbig2WordStream *ws); diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_refinement.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_refinement.c new file mode 100755 index 000000000..568fbff8e --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_refinement.c @@ -0,0 +1,440 @@ +/* + jbig2dec + + Copyright (C) 2004 Artifex Software, Inc. + + This software is provided AS-IS with no warranty, + either express or implied. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/** + * Generic Refinement region handlers. + **/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include /* memcpy(), memset() */ + +#include + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_arith.h" +#include "jbig2_generic.h" +#include "jbig2_image.h" + +static int +jbig2_decode_refinement_template0(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2RefinementRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GR_stats) +{ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "refinement region template 0 NYI"); +} + +static int +jbig2_decode_refinement_template0_unopt(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2RefinementRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GR_stats) +{ + const int GRW = image->width; + const int GRH = image->height; + const int dx = params->DX; + const int dy = params->DY; + Jbig2Image *ref = params->reference; + uint32_t CONTEXT; + int x,y; + bool bit; + + for (y = 0; y < GRH; y++) { + for (x = 0; x < GRW; x++) { + CONTEXT = 0; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y + 0) << 0; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 1; + CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 2; + CONTEXT |= jbig2_image_get_pixel(image, x + params->grat[0], + y + params->grat[1]) << 3; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+1, y-dy+1) << 4; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy+1) << 5; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx-1, y-dy+1) << 6; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+1, y-dy+0) << 7; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy+0) << 8; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx-1, y-dy+0) << 9; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+1, y-dy-1) << 10; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy-1) << 11; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+params->grat[2], + y-dy+params->grat[3]) << 12; + bit = jbig2_arith_decode(as, &GR_stats[CONTEXT]); + jbig2_image_set_pixel(image, x, y, bit); + } + } +#ifdef JBIG2_DEBUG_DUMP + { + static count = 0; + char name[32]; + snprintf(name, 32, "refin-%d.pbm", count); + jbig2_image_write_pbm_file(ref, name); + snprintf(name, 32, "refout-%d.pbm", count); + jbig2_image_write_pbm_file(image, name); + count++; + } +#endif + + return 0; +} + + +static int +jbig2_decode_refinement_template1_unopt(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2RefinementRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GR_stats) +{ + const int GRW = image->width; + const int GRH = image->height; + const int dx = params->DX; + const int dy = params->DY; + Jbig2Image *ref = params->reference; + uint32_t CONTEXT; + int x,y; + bool bit; + + for (y = 0; y < GRH; y++) { + for (x = 0; x < GRW; x++) { + CONTEXT = 0; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y + 0) << 0; + CONTEXT |= jbig2_image_get_pixel(image, x + 1, y - 1) << 1; + CONTEXT |= jbig2_image_get_pixel(image, x + 0, y - 1) << 2; + CONTEXT |= jbig2_image_get_pixel(image, x - 1, y - 1) << 3; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+1, y-dy+1) << 4; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy+1) << 5; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+1, y-dy+0) << 6; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy+0) << 7; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx-1, y-dy+0) << 8; + CONTEXT |= jbig2_image_get_pixel(ref, x-dx+0, y-dy-1) << 9; + bit = jbig2_arith_decode(as, &GR_stats[CONTEXT]); + jbig2_image_set_pixel(image, x, y, bit); + } + } + +#ifdef JBIG2_DEBUG_DUMP + { + static count = 0; + char name[32]; + snprintf(name, 32, "refin-%d.pbm", count); + jbig2_image_write_pbm_file(ref, name); + snprintf(name, 32, "refout-%d.pbm", count); + jbig2_image_write_pbm_file(image, name); + count++; + } +#endif + + return 0; +} + +static int +jbig2_decode_refinement_template1(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2RefinementRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GR_stats) +{ + const int GRW = image->width; + const int GRH = image->height; + const int stride = image->stride; + const int refstride = params->reference->stride; + const int dy = params->DY; + byte *grreg_line = (byte *)image->data; + byte *grref_line = (byte *)params->reference->data; + int x,y; + + for (y = 0; y < GRH; y++) { + const int padded_width = (GRW + 7) & -8; + uint32_t CONTEXT; + uint32_t refline_m1; /* previous line of the reference bitmap */ + uint32_t refline_0; /* current line of the reference bitmap */ + uint32_t refline_1; /* next line of the reference bitmap */ + uint32_t line_m1; /* previous line of the decoded bitmap */ + + line_m1 = (y >= 1) ? grreg_line[-stride] : 0; + refline_m1 = ((y-dy) >= 1) ? grref_line[(-1-dy)*stride] << 2: 0; + refline_0 = (((y-dy) > 0) && ((y-dy) < GRH)) ? grref_line[(0-dy)*stride] << 4 : 0; + refline_1 = (y < GRH - 1) ? grref_line[(+1-dy)*stride] << 7 : 0; + CONTEXT = ((line_m1 >> 5) & 0x00e) | + ((refline_1 >> 5) & 0x030) | + ((refline_0 >> 5) & 0x1c0) | + ((refline_m1 >> 5) & 0x200); + + for (x = 0; x < padded_width; x += 8) { + byte result = 0; + int x_minor; + const int minor_width = GRW - x > 8 ? 8 : GRW - x; + + if (y >= 1) { + line_m1 = (line_m1 << 8) | + (x + 8 < GRW ? grreg_line[-stride + (x >> 3) + 1] : 0); + refline_m1 = (refline_m1 << 8) | + (x + 8 < GRW ? grref_line[-refstride + (x >> 3) + 1] << 2 : 0); + } + + refline_0 = (refline_0 << 8) | + (x + 8 < GRW ? grref_line[(x >> 3) + 1] << 4 : 0); + + if (y < GRH - 1) + refline_1 = (refline_1 << 8) | + (x + 8 < GRW ? grref_line[+refstride + (x >> 3) + 1] << 7 : 0); + else + refline_1 = 0; + + /* this is the speed critical inner-loop */ + for (x_minor = 0; x_minor < minor_width; x_minor++) { + bool bit; + + bit = jbig2_arith_decode(as, &GR_stats[CONTEXT]); + result |= bit << (7 - x_minor); + CONTEXT = ((CONTEXT & 0x0d6) << 1) | bit | + ((line_m1 >> (9 - x_minor)) & 0x002) | + ((refline_1 >> (9 - x_minor)) & 0x010) | + ((refline_0 >> (9 - x_minor)) & 0x040) | + ((refline_m1 >> (9 - x_minor)) & 0x200); + } + + grreg_line[x>>3] = result; + + } + + grreg_line += stride; + grref_line += refstride; + + } + + return 0; + +} + + +/** + * jbig2_decode_refinement_region: Decode a generic refinement region. + * @ctx: The context for allocation and error reporting. + * @segment: A segment reference for error reporting. + * @params: Decoding parameter set. + * @as: Arithmetic decoder state. + * @image: Where to store the decoded image. + * @GR_stats: Arithmetic stats. + * + * Decodes a generic refinement region, according to section 6.3. + * an already allocated Jbig2Image object in @image for the result. + * + * Because this API is based on an arithmetic decoding state, it is + * not suitable for MMR decoding. + * + * Return code: 0 on success. + **/ +int +jbig2_decode_refinement_region(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2RefinementRegionParams *params, + Jbig2ArithState *as, + Jbig2Image *image, + Jbig2ArithCx *GR_stats) +{ + { + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "decoding generic refinement region with offset %d,%x,\n" + " GRTEMPLATE=%d, TPGRON=%d, RA1=(%d,%d) RA2=(%d,%d)\n", + params->DX, params->DY, params->GRTEMPLATE, params->TPGRON, + params->grat[0], params->grat[1], params->grat[2], params->grat[3]); + } + if (params->TPGRON) + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "decode_refinement_region: typical prediction coding NYI"); + if (params->GRTEMPLATE) + return jbig2_decode_refinement_template1_unopt(ctx, segment, params, + as, image, GR_stats); + else + return jbig2_decode_refinement_template0_unopt(ctx, segment, params, + as, image, GR_stats); +} + +/** + * Find the first referred-to intermediate region segment + * with a non-NULL result for use as a reference image + */ +Jbig2Segment * +jbig2_region_find_referred(Jbig2Ctx *ctx,Jbig2Segment *segment) +{ + const int nsegments = segment->referred_to_segment_count; + Jbig2Segment *rsegment; + int index; + + for (index = 0; index < nsegments; index++) { + rsegment = jbig2_find_segment(ctx, + segment->referred_to_segments[index]); + if (rsegment == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "could not find referred to segment %d", + segment->referred_to_segments[index]); + continue; + } + switch (rsegment->flags & 63) { + case 4: /* intermediate text region */ + case 20: /* intermediate halftone region */ + case 36: /* intermediate generic region */ + case 40: /* intermediate generic refinement region */ + if (rsegment->result) return rsegment; + break; + default: /* keep looking */ + break; + } + } + /* no appropriate reference was found. */ + return NULL; +} + +/** + * Handler for generic refinement region segments + */ +int +jbig2_refinement_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data) +{ + Jbig2RefinementRegionParams params; + Jbig2RegionSegmentInfo rsi; + int offset = 0; + byte seg_flags; + + /* 7.4.7 */ + if (segment->data_length < 18) + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Segment too short"); + + jbig2_get_region_segment_info(&rsi, segment_data); + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "generic region: %d x %d @ (%d, %d), flags = %02x", + rsi.width, rsi.height, rsi.x, rsi.y, rsi.flags); + + /* 7.4.7.2 */ + seg_flags = segment_data[17]; + params.GRTEMPLATE = seg_flags & 0x01; + params.TPGRON = seg_flags & 0x02 ? 1 : 0; + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "segment flags = %02x %s%s", seg_flags, + params.GRTEMPLATE ? " GRTEMPLATE" :"", + params.TPGRON ? " TPGRON" : "" ); + if (seg_flags & 0xFC) + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "reserved segment flag bits are non-zero"); + offset += 18; + + /* 7.4.7.3 */ + if (!params.GRTEMPLATE) { + if (segment->data_length < 22) + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Segment too short"); + params.grat[0] = segment_data[offset + 0]; + params.grat[1] = segment_data[offset + 1]; + params.grat[2] = segment_data[offset + 2]; + params.grat[3] = segment_data[offset + 3]; + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "grat1: (%d, %d) grat2: (%d, %d)", + params.grat[0], params.grat[1], + params.grat[2], params.grat[3]); + offset += 4; + } + + /* 7.4.7.4 - set up the reference image */ + if (segment->referred_to_segment_count) { + Jbig2Segment *ref; + + ref = jbig2_region_find_referred(ctx, segment); + if (ref == NULL) + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "could not find reference bitmap!"); + /* the reference bitmap is the result of a previous + intermediate region segment; the reference selection + rules say to use the first one available, and not to + reuse any intermediate result, so we simply clone it + and free the original to keep track of this. */ + params.reference = jbig2_image_clone(ctx, ref->result); + jbig2_image_release(ctx, ref->result); + ref->result = NULL; + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "found reference bitmap in segment %d", ref->number); + } else { + /* the reference is just (a subset of) the page buffer */ + params.reference = jbig2_image_clone(ctx, + ctx->pages[ctx->current_page].image); + /* TODO: subset the image if appropriate */ + } + + /* 7.4.7.5 */ + params.DX = 0; + params.DY = 0; + { + Jbig2WordStream *ws; + Jbig2ArithState *as; + Jbig2ArithCx *GR_stats = NULL; + int stats_size; + Jbig2Image *image; + int code; + + image = jbig2_image_new(ctx, rsi.width, rsi.height); + if (image == NULL) + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "unable to allocate refinement image"); + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "allocated %d x %d image buffer for region decode results", + rsi.width, rsi.height); + + stats_size = params.GRTEMPLATE ? 1 << 10 : 1 << 13; + GR_stats = jbig2_alloc(ctx->allocator, stats_size); + memset(GR_stats, 0, stats_size); + + ws = jbig2_word_stream_buf_new(ctx, segment_data + offset, + segment->data_length - offset); + as = jbig2_arith_new(ctx, ws); + code = jbig2_decode_refinement_region(ctx, segment, ¶ms, + as, image, GR_stats); + + jbig2_free(ctx->allocator, as); + jbig2_word_stream_buf_free(ctx, ws); + jbig2_free(ctx->allocator, GR_stats); + + if ((segment->flags & 63) == 40) { + /* intermediate region. save the result for later */ + segment->result = image; + } else { + /* immediate region. composite onto the page */ + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "composing %dx%d decoded refinement region onto page at (%d, %d)", + rsi.width, rsi.height, rsi.x, rsi.y); + jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], + image, rsi.x, rsi.y, rsi.op); + jbig2_image_release(ctx, image); + } + } + + return 0; +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_segment.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_segment.c new file mode 100755 index 000000000..46bb5a0c3 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_segment.c @@ -0,0 +1,295 @@ +/* + jbig2dec + + Copyright (C) 2002-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include /* size_t */ + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_symbol_dict.h" +#include "jbig2_metadata.h" + +Jbig2Segment * +jbig2_parse_segment_header (Jbig2Ctx *ctx, uint8_t *buf, size_t buf_size, + size_t *p_header_size) +{ + Jbig2Segment *result; + uint8_t rtscarf; + uint32_t rtscarf_long; + uint32_t *referred_to_segments; + int referred_to_segment_count; + int referred_to_segment_size; + int pa_size; + int offset; + + /* minimum possible size of a jbig2 segment header */ + if (buf_size < 11) + return NULL; + + result = (Jbig2Segment *)jbig2_alloc(ctx->allocator, + sizeof(Jbig2Segment)); + + /* 7.2.2 */ + result->number = jbig2_get_int32(buf); + + /* 7.2.3 */ + result->flags = buf[4]; + + /* 7.2.4 referred-to segments */ + rtscarf = buf[5]; + if ((rtscarf & 0xe0) == 0xe0) + { + rtscarf_long = jbig2_get_int32(buf + 5); + referred_to_segment_count = rtscarf_long & 0x1fffffff; + offset = 5 + 4 + (referred_to_segment_count + 1) / 8; + } + else + { + referred_to_segment_count = (rtscarf >> 5); + offset = 5 + 1; + } + result->referred_to_segment_count = referred_to_segment_count; + + /* we now have enough information to compute the full header length */ + referred_to_segment_size = result->number <= 256 ? 1: + result->number <= 65536 ? 2 : 4; /* 7.2.5 */ + pa_size = result->flags & 0x40 ? 4 : 1; /* 7.2.6 */ + if (offset + referred_to_segment_count*referred_to_segment_size + pa_size + 4 > buf_size) + { + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number, + "jbig2_parse_segment_header() called with insufficient data", -1); + jbig2_free (ctx->allocator, result); + return NULL; + } + + /* 7.2.5 */ + if (referred_to_segment_count) + { + int i; + + referred_to_segments = jbig2_alloc(ctx->allocator, referred_to_segment_count * referred_to_segment_size * sizeof(uint32_t)); + + for (i = 0; i < referred_to_segment_count; i++) { + referred_to_segments[i] = + (referred_to_segment_size == 1) ? buf[offset] : + (referred_to_segment_size == 2) ? jbig2_get_int16(buf+offset) : + jbig2_get_int32(buf + offset); + offset += referred_to_segment_size; + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number, + "segment %d refers to segment %d", + result->number, referred_to_segments[i]); + } + result->referred_to_segments = referred_to_segments; + } + else /* no referred-to segments */ + { + result->referred_to_segments = NULL; + } + + /* 7.2.6 */ + if (result->flags & 0x40) { + result->page_association = jbig2_get_int32(buf + offset); + offset += 4; + } else { + result->page_association = buf[offset++]; + } + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number, + "segment %d is associated with page %d", + result->number, result->page_association); + + /* 7.2.7 */ + result->data_length = jbig2_get_int32(buf + offset); + *p_header_size = offset + 4; + + /* no body parsing results yet */ + result->result = NULL; + + return result; +} + +void +jbig2_free_segment (Jbig2Ctx *ctx, Jbig2Segment *segment) +{ + if (segment->referred_to_segments != NULL) { + jbig2_free(ctx->allocator, segment->referred_to_segments); + } + /* todo: we need either some separate fields or + a more complex result object rather than this + brittle special casing */ + switch (segment->flags & 63) { + case 0: /* symbol dictionary */ + if (segment->result != NULL) + jbig2_sd_release(ctx, segment->result); + break; + case 4: /* intermediate text region */ + case 40: /* intermediate refinement region */ + if (segment->result != NULL) + jbig2_image_release(ctx, segment->result); + break; + case 62: + if (segment->result != NULL) + jbig2_metadata_free(ctx, segment->result); + break; + default: + /* anything else is probably an undefined pointer */ + break; + } + jbig2_free (ctx->allocator, segment); +} + +/* find a segment by number */ +Jbig2Segment * +jbig2_find_segment(Jbig2Ctx *ctx, uint32_t number) +{ + int index, index_max = ctx->segment_index - 1; + const Jbig2Ctx *global_ctx = ctx->global_ctx; + + /* FIXME: binary search would be better */ + for (index = index_max; index >= 0; index--) + if (ctx->segments[index]->number == number) + return (ctx->segments[index]); + + if (global_ctx) + for (index = global_ctx->segment_index - 1; index >= 0; index--) + if (global_ctx->segments[index]->number == number) + return (global_ctx->segments[index]); + + /* didn't find a match */ + return NULL; +} + +/* parse the generic portion of a region segment data header */ +void +jbig2_get_region_segment_info(Jbig2RegionSegmentInfo *info, + const uint8_t *segment_data) +{ + /* 7.4.1 */ + info->width = jbig2_get_int32(segment_data); + info->height = jbig2_get_int32(segment_data + 4); + info->x = jbig2_get_int32(segment_data + 8); + info->y = jbig2_get_int32(segment_data + 12); + info->flags = segment_data[16]; + info->op = info->flags & 0x7; +} + +/* dispatch code for extension segment parsing */ +int jbig2_parse_extension_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data) +{ + uint32_t type; + bool reserved, dependent, necessary; + + type = jbig2_get_int32(segment_data); + + reserved = type & 0x20000000; + dependent = type & 0x40000000; + necessary = type & 0x80000000; + + if (necessary && !reserved) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "extension segment is marked 'necessary' but not 'reservered' contrary to spec"); + } + + switch (type) { + case 0x20000000: return jbig2_comment_ascii(ctx, segment, segment_data); + case 0x20000002: return jbig2_comment_unicode(ctx, segment, segment_data); + default: + if (necessary) { + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "unhandled necessary extension segment type 0x%08x", type); + } else { + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unhandled extension segment"); + } + } + + return 0; +} + +/* general segment parsing dispatch */ +int jbig2_parse_segment (Jbig2Ctx *ctx, Jbig2Segment *segment, + const uint8_t *segment_data) +{ + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "Segment %d, flags=%x, type=%d, data_length=%d", + segment->number, segment->flags, segment->flags & 63, + segment->data_length); + switch (segment->flags & 63) + { + case 0: + return jbig2_symbol_dictionary(ctx, segment, segment_data); + case 4: /* intermediate text region */ + case 6: /* immediate text region */ + case 7: /* immediate lossless text region */ + return jbig2_text_region(ctx, segment, segment_data); +#ifdef JBIG2_HALFTONE + case 16: + return jbig2_pattern_dictionary(ctx, segment, segment_data); + case 20: /* intermediate halftone region */ + case 22: /* immediate halftone region */ + case 23: /* immediate lossless halftone region */ + return jbig2_halftone_region(ctx, segment, segment_data); +#else + case 16: + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unhandled segment type 'pattern dictionary'"); + case 20: + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unhandled segment type 'intermediate halftone region'"); + case 22: + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unhandled segment type 'immediate halftone region'"); + case 23: + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unhandled segment type 'immediate lossless halftone region'"); +#endif + case 36: + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unhandled segment type 'intermediate generic region'"); + case 38: /* immediate generic region */ + case 39: /* immediate lossless generic region */ + return jbig2_immediate_generic_region(ctx, segment, segment_data); + case 40: /* intermediate generic refinement region */ + case 42: /* immediate generic refinement region */ + case 43: /* immediate lossless generic refinement region */ + return jbig2_refinement_region(ctx, segment, segment_data); + case 48: + return jbig2_page_info(ctx, segment, segment_data); + case 49: + return jbig2_end_of_page(ctx, segment, segment_data); + case 50: + return jbig2_end_of_stripe(ctx, segment, segment_data); + case 51: + ctx->state = JBIG2_FILE_EOF; + return jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "end of file"); + case 52: + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unhandled segment type 'profile'"); + case 53: + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unhandled table segment"); + case 62: + return jbig2_parse_extension_segment(ctx, segment, segment_data); + default: + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unknown segment type %d", segment->flags & 63); + } + return 0; +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_symbol_dict.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_symbol_dict.c new file mode 100755 index 000000000..4524f854f --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_symbol_dict.c @@ -0,0 +1,937 @@ +/* + jbig2dec + + Copyright (C) 2001-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* symbol dictionary segment decode and support */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include /* memset() */ + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_arith.h" +#include "jbig2_arith_int.h" +#include "jbig2_arith_iaid.h" +#include "jbig2_huffman.h" +#include "jbig2_generic.h" +#include "jbig2_mmr.h" +#include "jbig2_symbol_dict.h" +#include "jbig2_text.h" + +#if defined(OUTPUT_PBM) || defined(DUMP_SYMDICT) +#include +#include "jbig2_image.h" +#endif + +/* Table 13 */ +typedef struct { + bool SDHUFF; + bool SDREFAGG; + int32_t SDNUMINSYMS; + Jbig2SymbolDict *SDINSYMS; + uint32_t SDNUMNEWSYMS; + uint32_t SDNUMEXSYMS; + Jbig2HuffmanTable *SDHUFFDH; + Jbig2HuffmanTable *SDHUFFDW; + Jbig2HuffmanTable *SDHUFFBMSIZE; + Jbig2HuffmanTable *SDHUFFAGGINST; + int SDTEMPLATE; + int8_t sdat[8]; + bool SDRTEMPLATE; + int8_t sdrat[4]; +} Jbig2SymbolDictParams; + + +/* Utility routines */ + +#ifdef DUMP_SYMDICT +void +jbig2_dump_symbol_dict(Jbig2Ctx *ctx, Jbig2Segment *segment) +{ + Jbig2SymbolDict *dict = (Jbig2SymbolDict *)segment->result; + int index; + char filename[24]; + + if (dict == NULL) return; + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "dumping symbol dict as %d individual png files\n", dict->n_symbols); + for (index = 0; index < dict->n_symbols; index++) { + snprintf(filename, sizeof(filename), "symbol_%02d-%04d.png", + segment->number, index); + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "dumping symbol %d/%d as '%s'", index, dict->n_symbols, filename); +#ifdef HAVE_LIBPNG + jbig2_image_write_png_file(dict->glyphs[index], filename); +#else + jbig2_image_write_pbm_file(dict->glyphs[index], filename); +#endif + } +} +#endif /* DUMP_SYMDICT */ + +/* return a new empty symbol dict */ +Jbig2SymbolDict * +jbig2_sd_new(Jbig2Ctx *ctx, int n_symbols) +{ + Jbig2SymbolDict *new = NULL; + + new = (Jbig2SymbolDict *)jbig2_alloc(ctx->allocator, + sizeof(Jbig2SymbolDict)); + if (new != NULL) { + new->glyphs = (Jbig2Image **)jbig2_alloc(ctx->allocator, + n_symbols*sizeof(Jbig2Image*)); + new->n_symbols = n_symbols; + } else { + return NULL; + } + + if (new->glyphs != NULL) { + memset(new->glyphs, 0, n_symbols*sizeof(Jbig2Image*)); + } else { + jbig2_free(ctx->allocator, new); + return NULL; + } + + return new; +} + +/* release the memory associated with a symbol dict */ +void +jbig2_sd_release(Jbig2Ctx *ctx, Jbig2SymbolDict *dict) +{ + int i; + + if (dict == NULL) return; + for (i = 0; i < dict->n_symbols; i++) + if (dict->glyphs[i]) jbig2_image_release(ctx, dict->glyphs[i]); + jbig2_free(ctx->allocator, dict->glyphs); + jbig2_free(ctx->allocator, dict); +} + +/* get a particular glyph by index */ +Jbig2Image * +jbig2_sd_glyph(Jbig2SymbolDict *dict, unsigned int id) +{ + if (dict == NULL) return NULL; + return dict->glyphs[id]; +} + +/* count the number of dictionary segments referred to by the given segment */ +int +jbig2_sd_count_referred(Jbig2Ctx *ctx, Jbig2Segment *segment) +{ + int index; + Jbig2Segment *rsegment; + int n_dicts = 0; + + for (index = 0; index < segment->referred_to_segment_count; index++) { + rsegment = jbig2_find_segment(ctx, segment->referred_to_segments[index]); + if (rsegment && ((rsegment->flags & 63) == 0)) n_dicts++; + } + + return (n_dicts); +} + +/* return an array of pointers to symbol dictionaries referred to by the given segment */ +Jbig2SymbolDict ** +jbig2_sd_list_referred(Jbig2Ctx *ctx, Jbig2Segment *segment) +{ + int index; + Jbig2Segment *rsegment; + Jbig2SymbolDict **dicts; + int n_dicts = jbig2_sd_count_referred(ctx, segment); + int dindex = 0; + + dicts = jbig2_alloc(ctx->allocator, sizeof(Jbig2SymbolDict *) * n_dicts); + for (index = 0; index < segment->referred_to_segment_count; index++) { + rsegment = jbig2_find_segment(ctx, segment->referred_to_segments[index]); + if (rsegment && ((rsegment->flags & 63) == 0)) { + /* add this referred to symbol dictionary */ + dicts[dindex++] = (Jbig2SymbolDict *)rsegment->result; + } + } + + if (dindex != n_dicts) { + /* should never happen */ + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "counted %d symbol dictionaries but build a list with %d.\n", + n_dicts, dindex); + } + + return (dicts); +} + +/* generate a new symbol dictionary by concatenating a list of + existing dictionaries */ +Jbig2SymbolDict * +jbig2_sd_cat(Jbig2Ctx *ctx, int n_dicts, Jbig2SymbolDict **dicts) +{ + int i,j,k, symbols; + Jbig2SymbolDict *new = NULL; + + /* count the imported symbols and allocate a new array */ + symbols = 0; + for(i = 0; i < n_dicts; i++) + symbols += dicts[i]->n_symbols; + + /* fill a new array with cloned glyph pointers */ + new = jbig2_sd_new(ctx, symbols); + if (new != NULL) { + k = 0; + for (i = 0; i < n_dicts; i++) + for (j = 0; j < dicts[i]->n_symbols; j++) + new->glyphs[k++] = jbig2_image_clone(ctx, dicts[i]->glyphs[j]); + } + + return new; +} + + +/* Decoding routines */ + +/* 6.5 */ +static Jbig2SymbolDict * +jbig2_decode_symbol_dict(Jbig2Ctx *ctx, + Jbig2Segment *segment, + const Jbig2SymbolDictParams *params, + const byte *data, size_t size, + Jbig2ArithCx *GB_stats, + Jbig2ArithCx *GR_stats) +{ + Jbig2SymbolDict *SDNEWSYMS; + Jbig2SymbolDict *SDEXSYMS; + int32_t HCHEIGHT; + uint32_t NSYMSDECODED; + int32_t SYMWIDTH, TOTWIDTH; + uint32_t HCFIRSTSYM; + uint32_t *SDNEWSYMWIDTHS = NULL; + int SBSYMCODELEN = 0; + Jbig2WordStream *ws = NULL; + Jbig2HuffmanState *hs = NULL; + Jbig2HuffmanTable *SDHUFFRDX = NULL; + Jbig2ArithState *as = NULL; + Jbig2ArithIntCtx *IADH = NULL; + Jbig2ArithIntCtx *IADW = NULL; + Jbig2ArithIntCtx *IAEX = NULL; + Jbig2ArithIntCtx *IAAI = NULL; + Jbig2ArithIaidCtx *IAID = NULL; + Jbig2ArithIntCtx *IARDX = NULL; + Jbig2ArithIntCtx *IARDY = NULL; + int code = 0; + Jbig2SymbolDict **refagg_dicts; + int n_refagg_dicts = 1; + + Jbig2TextRegionParams *tparams = NULL; + + /* 6.5.5 (3) */ + HCHEIGHT = 0; + NSYMSDECODED = 0; + + ws = jbig2_word_stream_buf_new(ctx, data, size); + + if (!params->SDHUFF) { + as = jbig2_arith_new(ctx, ws); + IADH = jbig2_arith_int_ctx_new(ctx); + IADW = jbig2_arith_int_ctx_new(ctx); + IAEX = jbig2_arith_int_ctx_new(ctx); + IAAI = jbig2_arith_int_ctx_new(ctx); + if (params->SDREFAGG) { + int tmp = params->SDINSYMS->n_symbols + params->SDNUMNEWSYMS; + for (SBSYMCODELEN = 0; (1 << SBSYMCODELEN) < tmp; SBSYMCODELEN++); + IAID = jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN); + IARDX = jbig2_arith_int_ctx_new(ctx); + IARDY = jbig2_arith_int_ctx_new(ctx); + } + } else { + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "huffman coded symbol dictionary"); + hs = jbig2_huffman_new(ctx, ws); + SDHUFFRDX = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_O); + if (!params->SDREFAGG) { + SDNEWSYMWIDTHS = jbig2_alloc(ctx->allocator, + sizeof(*SDNEWSYMWIDTHS)*params->SDNUMNEWSYMS); + if (SDNEWSYMWIDTHS == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "could not allocate storage for symbol widths"); + return NULL; + } + } + } + + SDNEWSYMS = jbig2_sd_new(ctx, params->SDNUMNEWSYMS); + + /* 6.5.5 (4a) */ + while (NSYMSDECODED < params->SDNUMNEWSYMS) { + int32_t HCDH, DW; + + /* 6.5.6 */ + if (params->SDHUFF) { + HCDH = jbig2_huffman_get(hs, params->SDHUFFDH, &code); + } else { + code = jbig2_arith_int_decode(IADH, as, &HCDH); + } + + if (code != 0) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "error or OOB decoding height class delta (%d)\n", code); + } + + /* 6.5.5 (4b) */ + HCHEIGHT = HCHEIGHT + HCDH; + SYMWIDTH = 0; + TOTWIDTH = 0; + HCFIRSTSYM = NSYMSDECODED; + + if (HCHEIGHT < 0) { + /* todo: mem cleanup */ + code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Invalid HCHEIGHT value"); + return NULL; + } +#ifdef JBIG2_DEBUG + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "HCHEIGHT = %d", HCHEIGHT); +#endif + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "decoding height class %d with %d syms decoded", HCHEIGHT, NSYMSDECODED); + + for (;;) { + /* check for broken symbol table */ + if (NSYMSDECODED > params->SDNUMNEWSYMS) + { + /* todo: mem cleanup? */ + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "No OOB signalling end of height class %d", HCHEIGHT); + break; + } + /* 6.5.7 */ + if (params->SDHUFF) { + DW = jbig2_huffman_get(hs, params->SDHUFFDW, &code); + } else { + code = jbig2_arith_int_decode(IADW, as, &DW); + } + + /* 6.5.5 (4c.i) */ + if (code == 1) { + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + " OOB signals end of height class %d", HCHEIGHT); + break; + } + SYMWIDTH = SYMWIDTH + DW; + TOTWIDTH = TOTWIDTH + SYMWIDTH; + if (SYMWIDTH < 0) { + /* todo: mem cleanup */ + code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Invalid SYMWIDTH value (%d) at symbol %d", SYMWIDTH, NSYMSDECODED+1); + return NULL; + } +#ifdef JBIG2_DEBUG + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "SYMWIDTH = %d TOTWIDTH = %d", SYMWIDTH, TOTWIDTH); +#endif + /* 6.5.5 (4c.ii) */ + if (!params->SDHUFF || params->SDREFAGG) { +#ifdef JBIG2_DEBUG + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "SDHUFF = %d; SDREFAGG = %d", params->SDHUFF, params->SDREFAGG); +#endif + /* 6.5.8 */ + if (!params->SDREFAGG) { + Jbig2GenericRegionParams region_params; + int sdat_bytes; + Jbig2Image *image; + + /* Table 16 */ + region_params.MMR = 0; + region_params.GBTEMPLATE = params->SDTEMPLATE; + region_params.TPGDON = 0; + region_params.USESKIP = 0; + sdat_bytes = params->SDTEMPLATE == 0 ? 8 : 2; + memcpy(region_params.gbat, params->sdat, sdat_bytes); + + image = jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT); + + code = jbig2_decode_generic_region(ctx, segment, ®ion_params, + as, image, GB_stats); + /* todo: handle errors */ + + SDNEWSYMS->glyphs[NSYMSDECODED] = image; + + } else { + /* 6.5.8.2 refinement/aggregate symbol */ + uint32_t REFAGGNINST; + + if (params->SDHUFF) { + REFAGGNINST = jbig2_huffman_get(hs, params->SDHUFFAGGINST, &code); + } else { + code = jbig2_arith_int_decode(IAAI, as, (int32_t*)&REFAGGNINST); + } + if (code || (int32_t)REFAGGNINST <= 0) { + code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "invalid number of symbols or OOB in aggregate glyph"); + return NULL; + } + + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "aggregate symbol coding (%d instances)", REFAGGNINST); + + if (REFAGGNINST > 1) { + Jbig2Image *image; + int i; + + if (tparams == NULL) + { + /* First time through, we need to initialise the */ + /* various tables for Huffman or adaptive encoding */ + /* as well as the text region parameters structure */ + refagg_dicts = jbig2_alloc(ctx->allocator, sizeof(Jbig2SymbolDict *) * n_refagg_dicts); + if (refagg_dicts == NULL) { + code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Out of memory allocating dictionary array"); + return NULL; + } + refagg_dicts[0] = jbig2_sd_new(ctx, params->SDNUMINSYMS + params->SDNUMNEWSYMS); + if (refagg_dicts[0] == NULL) { + code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Out of memory allocating symbol dictionary"); + jbig2_free(ctx->allocator, refagg_dicts); + return NULL; + } + refagg_dicts[0]->n_symbols = params->SDNUMINSYMS + params->SDNUMNEWSYMS; + for (i=0;i < params->SDNUMINSYMS;i++) + { + refagg_dicts[0]->glyphs[i] = jbig2_image_clone(ctx, params->SDINSYMS->glyphs[i]); + } + + tparams = jbig2_alloc(ctx->allocator, sizeof(Jbig2TextRegionParams)); + if (tparams == NULL) { + code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Out of memory creating text region params"); + jbig2_sd_release(ctx, refagg_dicts[0]); + jbig2_free(ctx->allocator, refagg_dicts); + return NULL; + } + if (!params->SDHUFF) { + /* Values from Table 17, section 6.5.8.2 (2) */ + tparams->IADT = jbig2_arith_int_ctx_new(ctx); + tparams->IAFS = jbig2_arith_int_ctx_new(ctx); + tparams->IADS = jbig2_arith_int_ctx_new(ctx); + tparams->IAIT = jbig2_arith_int_ctx_new(ctx); + /* Table 31 */ + for (SBSYMCODELEN = 0; (1 << SBSYMCODELEN) < + (int)(params->SDNUMINSYMS + params->SDNUMNEWSYMS); SBSYMCODELEN++); + tparams->IAID = jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN); + tparams->IARI = jbig2_arith_int_ctx_new(ctx); + tparams->IARDW = jbig2_arith_int_ctx_new(ctx); + tparams->IARDH = jbig2_arith_int_ctx_new(ctx); + tparams->IARDX = jbig2_arith_int_ctx_new(ctx); + tparams->IARDY = jbig2_arith_int_ctx_new(ctx); + } else { + tparams->SBHUFFFS = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_F); /* Table B.6 */ + tparams->SBHUFFDS = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_H); /* Table B.8 */ + tparams->SBHUFFDT = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_K); /* Table B.11 */ + tparams->SBHUFFRDW = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_O); /* Table B.15 */ + tparams->SBHUFFRDH = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_O); /* Table B.15 */ + tparams->SBHUFFRDX = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_O); /* Table B.15 */ + tparams->SBHUFFRDY = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_O); /* Table B.15 */ + } + tparams->SBHUFF = params->SDHUFF; + tparams->SBREFINE = 1; + tparams->SBSTRIPS = 1; + tparams->SBDEFPIXEL = 0; + tparams->SBCOMBOP = JBIG2_COMPOSE_OR; + tparams->TRANSPOSED = 0; + tparams->REFCORNER = JBIG2_CORNER_TOPLEFT; + tparams->SBDSOFFSET = 0; + tparams->SBRTEMPLATE = params->SDRTEMPLATE; + } + tparams->SBNUMINSTANCES = REFAGGNINST; + + image = jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT); + if (image == NULL) { + code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Out of memory creating symbol image"); + jbig2_free(ctx->allocator, tparams); + jbig2_sd_release(ctx, refagg_dicts[0]); + jbig2_free(ctx->allocator, refagg_dicts); + return NULL; + } + + /* multiple symbols are handled as a text region */ + jbig2_decode_text_region(ctx, segment, tparams, (const Jbig2SymbolDict * const *)refagg_dicts, + n_refagg_dicts, image, data, size, GR_stats, as, (Jbig2WordStream *)NULL); + + SDNEWSYMS->glyphs[NSYMSDECODED] = image; + refagg_dicts[0]->glyphs[params->SDNUMINSYMS + NSYMSDECODED] = jbig2_image_clone(ctx, SDNEWSYMS->glyphs[NSYMSDECODED]); + } else { + /* 6.5.8.2.2 */ + /* bool SBHUFF = params->SDHUFF; */ + Jbig2RefinementRegionParams rparams; + Jbig2Image *image; + uint32_t ID; + int32_t RDX, RDY; + int ninsyms = params->SDINSYMS->n_symbols; + + if (params->SDHUFF) { + ID = jbig2_huffman_get_bits(hs, SBSYMCODELEN); + RDX = jbig2_huffman_get(hs, SDHUFFRDX, &code); + RDY = jbig2_huffman_get(hs, SDHUFFRDX, &code); + } else { + code = jbig2_arith_iaid_decode(IAID, as, (int32_t*)&ID); + code = jbig2_arith_int_decode(IARDX, as, &RDX); + code = jbig2_arith_int_decode(IARDY, as, &RDY); + } + + if (ID >= ninsyms+NSYMSDECODED) { + code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "refinement references unknown symbol %d", ID); + return NULL; + } + + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "symbol is a refinement of id %d with the refinement applied at (%d,%d)", + ID, RDX, RDY); + + image = jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT); + + /* Table 18 */ + rparams.GRTEMPLATE = params->SDRTEMPLATE; + rparams.reference = (ID < ninsyms) ? + params->SDINSYMS->glyphs[ID] : + SDNEWSYMS->glyphs[ID-ninsyms]; + rparams.DX = RDX; + rparams.DY = RDY; + rparams.TPGRON = 0; + memcpy(rparams.grat, params->sdrat, 4); + jbig2_decode_refinement_region(ctx, segment, + &rparams, as, image, GR_stats); + + SDNEWSYMS->glyphs[NSYMSDECODED] = image; + + } + } + +#ifdef OUTPUT_PBM + { + char name[64]; + FILE *out; + snprintf(name, 64, "sd.%04d.%04d.pbm", + segment->number, NSYMSDECODED); + out = fopen(name, "wb"); + jbig2_image_write_pbm(SDNEWSYMS->glyphs[NSYMSDECODED], out); + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "writing out glyph as '%s' ...", name); + fclose(out); + } +#endif + + } + + /* 6.5.5 (4c.iii) */ + if (params->SDHUFF && !params->SDREFAGG) { + SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH; + } + + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "decoded symbol %d of %d (%dx%d)", + NSYMSDECODED, params->SDNUMNEWSYMS, + SYMWIDTH, HCHEIGHT); + + /* 6.5.5 (4c.iv) */ + NSYMSDECODED = NSYMSDECODED + 1; + + } /* end height class decode loop */ + + /* 6.5.5 (4d) */ + if (params->SDHUFF && !params->SDREFAGG) { + /* 6.5.9 */ + Jbig2Image *image; + int BMSIZE = jbig2_huffman_get(hs, params->SDHUFFBMSIZE, &code); + int j, x; + + if (code || (BMSIZE < 0)) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "error decoding size of collective bitmap!"); + /* todo: memory cleanup */ + return NULL; + } + + /* skip any bits before the next byte boundary */ + jbig2_huffman_skip(hs); + + image = jbig2_image_new(ctx, TOTWIDTH, HCHEIGHT); + if (image == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "could not allocate collective bitmap image!"); + /* todo: memory cleanup */ + return NULL; + } + + if (BMSIZE == 0) { + /* if BMSIZE == 0 bitmap is uncompressed */ + const byte *src = data + jbig2_huffman_offset(hs); + const int stride = (image->width >> 3) + + ((image->width & 7) ? 1 : 0); + byte *dst = image->data; + + BMSIZE = image->height * stride; + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "reading %dx%d uncompressed bitmap" + " for %d symbols (%d bytes)", + image->width, image->height, NSYMSDECODED - HCFIRSTSYM, BMSIZE); + + for (j = 0; j < image->height; j++) { + memcpy(dst, src, stride); + dst += image->stride; + src += stride; + } + } else { + Jbig2GenericRegionParams rparams; + + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "reading %dx%d collective bitmap for %d symbols (%d bytes)", + image->width, image->height, NSYMSDECODED - HCFIRSTSYM, BMSIZE); + + rparams.MMR = 1; + code = jbig2_decode_generic_mmr(ctx, segment, &rparams, + data + jbig2_huffman_offset(hs), BMSIZE, image); + if (code) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "error decoding MMR bitmap image!"); + /* todo: memory cleanup */ + return NULL; + } + } + + /* advance past the data we've just read */ + jbig2_huffman_advance(hs, BMSIZE); + + /* copy the collective bitmap into the symbol dictionary */ + x = 0; + for (j = HCFIRSTSYM; j < NSYMSDECODED; j++) { + Jbig2Image *glyph; + glyph = jbig2_image_new(ctx, SDNEWSYMWIDTHS[j], HCHEIGHT); + jbig2_image_compose(ctx, glyph, image, + -x, 0, JBIG2_COMPOSE_REPLACE); + x += SDNEWSYMWIDTHS[j]; + SDNEWSYMS->glyphs[j] = glyph; + } + jbig2_image_release(ctx, image); + } + + } /* end of symbol decode loop */ + + if (tparams != NULL) + { + if (!params->SDHUFF) + { + jbig2_arith_int_ctx_free(ctx, tparams->IADT); + jbig2_arith_int_ctx_free(ctx, tparams->IAFS); + jbig2_arith_int_ctx_free(ctx, tparams->IADS); + jbig2_arith_int_ctx_free(ctx, tparams->IAIT); + jbig2_arith_iaid_ctx_free(ctx, tparams->IAID); + jbig2_arith_int_ctx_free(ctx, tparams->IARI); + jbig2_arith_int_ctx_free(ctx, tparams->IARDW); + jbig2_arith_int_ctx_free(ctx, tparams->IARDH); + jbig2_arith_int_ctx_free(ctx, tparams->IARDX); + jbig2_arith_int_ctx_free(ctx, tparams->IARDY); + } + else + { + jbig2_release_huffman_table(ctx, tparams->SBHUFFFS); + jbig2_release_huffman_table(ctx, tparams->SBHUFFDS); + jbig2_release_huffman_table(ctx, tparams->SBHUFFDT); + jbig2_release_huffman_table(ctx, tparams->SBHUFFRDX); + jbig2_release_huffman_table(ctx, tparams->SBHUFFRDY); + jbig2_release_huffman_table(ctx, tparams->SBHUFFRDW); + jbig2_release_huffman_table(ctx, tparams->SBHUFFRDH); + } + jbig2_free(ctx->allocator, tparams); + tparams = NULL; + jbig2_sd_release(ctx, refagg_dicts[0]); + jbig2_free(ctx->allocator, refagg_dicts); + } + + jbig2_free(ctx->allocator, GB_stats); + + /* 6.5.10 */ + SDEXSYMS = jbig2_sd_new(ctx, params->SDNUMEXSYMS); + { + int i = 0; + int j = 0; + int k, m, exflag = 0; + int32_t exrunlength; + + if (params->SDINSYMS != NULL) + m = params->SDINSYMS->n_symbols; + else + m = 0; + while (j < params->SDNUMEXSYMS) { + if (params->SDHUFF) + /* FIXME: implement reading from huff table B.1 */ + exrunlength = params->SDNUMEXSYMS; + else + code = jbig2_arith_int_decode(IAEX, as, &exrunlength); + if (exrunlength > params->SDNUMEXSYMS - j) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "runlength too large in export symbol table (%d > %d - %d)\n", + exrunlength, params->SDNUMEXSYMS, j); + jbig2_sd_release(ctx, SDEXSYMS); + /* skip to the cleanup code and return SDEXSYMS = NULL */ + SDEXSYMS = NULL; + break; + } + for(k = 0; k < exrunlength; k++) + if (exflag) { + SDEXSYMS->glyphs[j++] = (i < m) ? + jbig2_image_clone(ctx, params->SDINSYMS->glyphs[i]) : + jbig2_image_clone(ctx, SDNEWSYMS->glyphs[i-m]); + i++; + } + exflag = !exflag; + } + } + + jbig2_sd_release(ctx, SDNEWSYMS); + + if (!params->SDHUFF) { + jbig2_arith_int_ctx_free(ctx, IADH); + jbig2_arith_int_ctx_free(ctx, IADW); + jbig2_arith_int_ctx_free(ctx, IAEX); + jbig2_arith_int_ctx_free(ctx, IAAI); + if (params->SDREFAGG) { + jbig2_arith_iaid_ctx_free(ctx, IAID); + jbig2_arith_int_ctx_free(ctx, IARDX); + jbig2_arith_int_ctx_free(ctx, IARDY); + } + jbig2_free(ctx->allocator, as); + } else { + if (params->SDREFAGG) { + jbig2_free(ctx->allocator, SDNEWSYMWIDTHS); + } + jbig2_release_huffman_table(ctx, SDHUFFRDX); + jbig2_free(ctx->allocator, hs); + } + + jbig2_word_stream_buf_free(ctx, ws); + + return SDEXSYMS; +} + +/* 7.4.2 */ +int +jbig2_symbol_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data) +{ + Jbig2SymbolDictParams params; + uint16_t flags; + int sdat_bytes; + int offset; + Jbig2ArithCx *GB_stats = NULL; + Jbig2ArithCx *GR_stats = NULL; + + if (segment->data_length < 10) + goto too_short; + + /* 7.4.2.1.1 */ + flags = jbig2_get_int16(segment_data); + params.SDHUFF = flags & 1; + params.SDREFAGG = (flags >> 1) & 1; + params.SDTEMPLATE = (flags >> 10) & 3; + params.SDRTEMPLATE = (flags >> 12) & 1; + + params.SDHUFFDH = NULL; + params.SDHUFFDW = NULL; + params.SDHUFFBMSIZE = NULL; + params.SDHUFFAGGINST = NULL; + + if (params.SDHUFF) { + switch ((flags & 0x000c) >> 2) { + case 0: /* Table B.4 */ + params.SDHUFFDH = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_D); + break; + case 1: /* Table B.5 */ + params.SDHUFFDH = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_E); + break; + case 3: /* Custom table from referred segment */ + /* We handle this case later by leaving the table as NULL */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "symbol dictionary uses custom DH huffman table (NYI)"); + case 2: + default: + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "symbol dictionary specified invalid huffman table"); + break; + } + switch ((flags & 0x0030) >> 4) { + case 0: /* Table B.2 */ + params.SDHUFFDW = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_B); + break; + case 1: /* Table B.3 */ + params.SDHUFFDW = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_C); + break; + case 3: /* Custom table from referred segment */ + /* We handle this case later by leaving the table as NULL */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "symbol dictionary uses custom DW huffman table (NYI)"); + case 2: + default: + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "symbol dictionary specified invalid huffman table"); + break; + } + if (flags & 0x0040) { + /* Custom table from referred segment */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "symbol dictionary uses custom BMSIZE huffman table (NYI)"); + } else { + /* Table B.1 */ + params.SDHUFFBMSIZE = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_A); + } + if (flags & 0x0080) { + /* Custom table from referred segment */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "symbol dictionary uses custom REFAGG huffman table (NYI)"); + } else { + /* Table B.1 */ + params.SDHUFFAGGINST = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_A); + } + } + + /* FIXME: there are quite a few of these conditions to check */ + /* maybe #ifdef CONFORMANCE and a separate routine */ + if (!params.SDHUFF) { + if (flags & 0x000c) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "SDHUFF is zero, but contrary to spec SDHUFFDH is not."); + } + if (flags & 0x0030) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "SDHUFF is zero, but contrary to spec SDHUFFDW is not."); + } + } + + if (flags & 0x0080) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "bitmap coding context is used (NYI) symbol data likely to be garbage!"); + } + + /* 7.4.2.1.2 */ + sdat_bytes = params.SDHUFF ? 0 : params.SDTEMPLATE == 0 ? 8 : 2; + memcpy(params.sdat, segment_data + 2, sdat_bytes); + offset = 2 + sdat_bytes; + + /* 7.4.2.1.3 */ + if (params.SDREFAGG && !params.SDRTEMPLATE) { + if (offset + 4 > segment->data_length) + goto too_short; + memcpy(params.sdrat, segment_data + offset, 4); + offset += 4; + } else { + /* sdrat is meaningless if SDRTEMPLATE is 1, but set a value + to avoid confusion if anybody looks */ + memset(params.sdrat, 0, 4); + } + + if (offset + 8 > segment->data_length) + goto too_short; + + /* 7.4.2.1.4 */ + params.SDNUMEXSYMS = jbig2_get_int32(segment_data + offset); + /* 7.4.2.1.5 */ + params.SDNUMNEWSYMS = jbig2_get_int32(segment_data + offset + 4); + offset += 8; + + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "symbol dictionary, flags=%04x, %d exported syms, %d new syms", + flags, params.SDNUMEXSYMS, params.SDNUMNEWSYMS); + + /* 7.4.2.2 (2) */ + { + int n_dicts = jbig2_sd_count_referred(ctx, segment); + Jbig2SymbolDict **dicts = NULL; + + params.SDINSYMS = NULL; + if (n_dicts > 0) { + dicts = jbig2_sd_list_referred(ctx, segment); + params.SDINSYMS = jbig2_sd_cat(ctx, n_dicts, dicts); + } + if (params.SDINSYMS != NULL) { + params.SDNUMINSYMS = params.SDINSYMS->n_symbols; + } else { + params.SDNUMINSYMS = 0; + } + } + + /* 7.4.2.2 (4) */ + if (!params.SDHUFF) { + int stats_size = params.SDTEMPLATE == 0 ? 65536 : + params.SDTEMPLATE == 1 ? 8192 : 1024; + GB_stats = jbig2_alloc(ctx->allocator, stats_size); + memset(GB_stats, 0, stats_size); + if (params.SDREFAGG) { + stats_size = params.SDRTEMPLATE ? 1 << 10 : 1 << 13; + GR_stats = jbig2_alloc(ctx->allocator, stats_size); + memset(GR_stats, 0, stats_size); + } + } + + if (flags & 0x0100) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "segment marks bitmap coding context as retained (NYI)"); + } + + segment->result = (void *)jbig2_decode_symbol_dict(ctx, segment, + ¶ms, + segment_data + offset, + segment->data_length - offset, + GB_stats, GR_stats); +#ifdef DUMP_SYMDICT + if (segment->result) jbig2_dump_symbol_dict(ctx, segment); +#endif + + if (params.SDHUFF) { + jbig2_release_huffman_table(ctx, params.SDHUFFDH); + jbig2_release_huffman_table(ctx, params.SDHUFFDW); + jbig2_release_huffman_table(ctx, params.SDHUFFBMSIZE); + jbig2_release_huffman_table(ctx, params.SDHUFFAGGINST); + } + + /* todo: retain or free GB_stats, GR_stats */ + + return (segment->result != NULL) ? 0 : -1; + + too_short: + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Segment too short"); +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_symbol_dict.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_symbol_dict.h new file mode 100755 index 000000000..a927758ce --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_symbol_dict.h @@ -0,0 +1,56 @@ +/* + jbig2dec + + Copyright (C) 2001-2002 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* symbol dictionary header */ + +/* the results of decoding a symbol dictionary */ +typedef struct { + int n_symbols; + Jbig2Image **glyphs; +} Jbig2SymbolDict; + +/* decode a symbol dictionary segment and store the results */ +int +jbig2_symbol_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, + const byte *segment_data); + +/* get a particular glyph by index */ +Jbig2Image * +jbig2_sd_glyph(Jbig2SymbolDict *dict, unsigned int id); + +/* return a new empty symbol dict */ +Jbig2SymbolDict * +jbig2_sd_new(Jbig2Ctx *ctx, int n_symbols); + +/* release the memory associated with a symbol dict */ +void +jbig2_sd_release(Jbig2Ctx *ctx, Jbig2SymbolDict *dict); + +/* generate a new symbol dictionary by concatenating a list of + existing dictionaries */ +Jbig2SymbolDict * +jbig2_sd_cat(Jbig2Ctx *ctx, int n_dicts, + Jbig2SymbolDict **dicts); + +/* count the number of dictionary segments referred + to by the given segment */ +int +jbig2_sd_count_referred(Jbig2Ctx *ctx, Jbig2Segment *segment); + +/* return an array of pointers to symbol dictionaries referred + to by a segment */ +Jbig2SymbolDict ** +jbig2_sd_list_referred(Jbig2Ctx *ctx, Jbig2Segment *segment); + diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_text.c b/contrib/media/updf_newlib/libjbig2dec/jbig2_text.c new file mode 100755 index 000000000..d910d8138 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_text.c @@ -0,0 +1,787 @@ +/* + jbig2dec + + Copyright (C) 2002-2008 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include +#include /* memset() */ + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_arith.h" +#include "jbig2_arith_int.h" +#include "jbig2_arith_iaid.h" +#include "jbig2_huffman.h" +#include "jbig2_generic.h" +#include "jbig2_symbol_dict.h" +#include "jbig2_text.h" + + +/** + * jbig2_decode_text_region: decode a text region segment + * + * @ctx: jbig2 decoder context + * @segment: jbig2 segment (header) structure + * @params: parameters from the text region header + * @dicts: an array of referenced symbol dictionaries + * @n_dicts: the number of referenced symbol dictionaries + * @image: image structure in which to store the decoded region bitmap + * @data: pointer to text region data to be decoded + * @size: length of text region data + * + * Implements the text region decoding procedure + * described in section 6.4 of the JBIG2 spec. + * + * returns: 0 on success + **/ +int +jbig2_decode_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const Jbig2TextRegionParams *params, + const Jbig2SymbolDict * const *dicts, const int n_dicts, + Jbig2Image *image, + const byte *data, const size_t size, + Jbig2ArithCx *GR_stats, Jbig2ArithState *as, Jbig2WordStream *ws) +{ + /* relevent bits of 6.4.4 */ + uint32_t NINSTANCES; + uint32_t ID; + int32_t STRIPT; + int32_t FIRSTS; + int32_t DT; + int32_t DFS; + int32_t IDS; + int32_t CURS; + int32_t CURT; + int S,T; + int x,y; + bool first_symbol; + uint32_t index, SBNUMSYMS; + Jbig2Image *IB; + Jbig2HuffmanState *hs = NULL; + Jbig2HuffmanTable *SBSYMCODES = NULL; + int code = 0; + int RI; + + SBNUMSYMS = 0; + for (index = 0; index < n_dicts; index++) { + SBNUMSYMS += dicts[index]->n_symbols; + } + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "symbol list contains %d glyphs in %d dictionaries", SBNUMSYMS, n_dicts); + + if (params->SBHUFF) { + Jbig2HuffmanTable *runcodes; + Jbig2HuffmanParams runcodeparams; + Jbig2HuffmanLine runcodelengths[35]; + Jbig2HuffmanLine *symcodelengths; + Jbig2HuffmanParams symcodeparams; + int code, err, len, range, r; + + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "huffman coded text region"); + hs = jbig2_huffman_new(ctx, ws); + + /* 7.4.3.1.7 - decode symbol ID Huffman table */ + /* this is actually part of the segment header, but it is more + convenient to handle it here */ + + /* parse and build the runlength code huffman table */ + for (index = 0; index < 35; index++) { + runcodelengths[index].PREFLEN = jbig2_huffman_get_bits(hs, 4); + runcodelengths[index].RANGELEN = 0; + runcodelengths[index].RANGELOW = index; + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + " read runcode%d length %d", index, runcodelengths[index].PREFLEN); + } + runcodeparams.HTOOB = 0; + runcodeparams.lines = runcodelengths; + runcodeparams.n_lines = 35; + runcodes = jbig2_build_huffman_table(ctx, &runcodeparams); + if (runcodes == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "error constructing symbol id runcode table!"); + return -1; + } + + /* decode the symbol id codelengths using the runlength table */ + symcodelengths = jbig2_alloc(ctx->allocator, SBNUMSYMS*sizeof(Jbig2HuffmanLine)); + if (symcodelengths == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "memory allocation failure reading symbol ID huffman table!"); + return -1; + } + index = 0; + while (index < SBNUMSYMS) { + code = jbig2_huffman_get(hs, runcodes, &err); + if (err != 0 || code < 0 || code >= 35) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "error reading symbol ID huffman table!"); + return err ? err : -1; + } + + if (code < 32) { + len = code; + range = 1; + } else { + if (code == 32) { + len = symcodelengths[index-1].PREFLEN; + if (index < 1) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "error decoding symbol id table: run length with no antecedent!"); + /* todo: memory cleanup */ + return -1; + } + } else { + len = 0; /* code == 33 or 34 */ + } + if (code == 32) range = jbig2_huffman_get_bits(hs, 2) + 3; + else if (code == 33) range = jbig2_huffman_get_bits(hs, 3) + 3; + else if (code == 34) range = jbig2_huffman_get_bits(hs, 7) + 11; + } + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + " read runcode%d at index %d (length %d range %d)", code, index, len, range); + if (index+range > SBNUMSYMS) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "runlength extends %d entries beyond the end of symbol id table!", + index+range - SBNUMSYMS); + range = SBNUMSYMS - index; + } + for (r = 0; r < range; r++) { + symcodelengths[index+r].PREFLEN = len; + symcodelengths[index+r].RANGELEN = 0; + symcodelengths[index+r].RANGELOW = index + r; + } + index += r; + } + + if (index < SBNUMSYMS) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "runlength codes do not cover the available symbol set"); + } + symcodeparams.HTOOB = 0; + symcodeparams.lines = symcodelengths; + symcodeparams.n_lines = SBNUMSYMS; + + /* skip to byte boundary */ + jbig2_huffman_skip(hs); + + /* finally, construct the symbol id huffman table itself */ + SBSYMCODES = jbig2_build_huffman_table(ctx, &symcodeparams); + + jbig2_free(ctx->allocator, symcodelengths); + jbig2_release_huffman_table(ctx, runcodes); + + if (SBSYMCODES == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "could not construct Symbol ID huffman table!"); + return -1; + } + } + + /* 6.4.5 (1) */ + jbig2_image_clear(ctx, image, params->SBDEFPIXEL); + + /* 6.4.6 */ + if (params->SBHUFF) { + STRIPT = jbig2_huffman_get(hs, params->SBHUFFDT, &code); + } else { + code = jbig2_arith_int_decode(params->IADT, as, &STRIPT); + } + + /* 6.4.5 (2) */ + STRIPT *= -(params->SBSTRIPS); + FIRSTS = 0; + NINSTANCES = 0; + + /* 6.4.5 (3) */ + while (NINSTANCES < params->SBNUMINSTANCES) { + /* (3b) */ + if (params->SBHUFF) { + DT = jbig2_huffman_get(hs, params->SBHUFFDT, &code); + } else { + code = jbig2_arith_int_decode(params->IADT, as, &DT); + } + DT *= params->SBSTRIPS; + STRIPT += DT; + + first_symbol = TRUE; + /* 6.4.5 (3c) - decode symbols in strip */ + for (;;) { + /* (3c.i) */ + if (first_symbol) { + /* 6.4.7 */ + if (params->SBHUFF) { + DFS = jbig2_huffman_get(hs, params->SBHUFFFS, &code); + } else { + code = jbig2_arith_int_decode(params->IAFS, as, &DFS); + } + FIRSTS += DFS; + CURS = FIRSTS; + first_symbol = FALSE; + + } else { + /* (3c.ii) / 6.4.8 */ + if (params->SBHUFF) { + IDS = jbig2_huffman_get(hs, params->SBHUFFDS, &code); + } else { + code = jbig2_arith_int_decode(params->IADS, as, &IDS); + } + if (code) { + break; + } + CURS += IDS + params->SBDSOFFSET; + } + + /* (3c.iii) / 6.4.9 */ + if (params->SBSTRIPS == 1) { + CURT = 0; + } else if (params->SBHUFF) { + CURT = jbig2_huffman_get_bits(hs, params->LOGSBSTRIPS); + } else { + code = jbig2_arith_int_decode(params->IAIT, as, &CURT); + } + T = STRIPT + CURT; + + /* (3b.iv) / 6.4.10 - decode the symbol id */ + if (params->SBHUFF) { + ID = jbig2_huffman_get(hs, SBSYMCODES, &code); + } else { + code = jbig2_arith_iaid_decode(params->IAID, as, (int *)&ID); + } + if (ID >= SBNUMSYMS) { + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "symbol id out of range! (%d/%d)", ID, SBNUMSYMS); + } + + /* (3c.v) / 6.4.11 - look up the symbol bitmap IB */ + { + uint32_t id = ID; + + index = 0; + while (id >= dicts[index]->n_symbols) + id -= dicts[index++]->n_symbols; + IB = jbig2_image_clone(ctx, dicts[index]->glyphs[id]); + } + if (params->SBREFINE) { + if (params->SBHUFF) { + RI = jbig2_huffman_get_bits(hs, 1); + } else { + code = jbig2_arith_int_decode(params->IARI, as, &RI); + } + } else { + RI = 0; + } + if (RI) { + Jbig2RefinementRegionParams rparams; + Jbig2Image *IBO; + int32_t RDW, RDH, RDX, RDY; + Jbig2Image *refimage; + int BMSIZE = 0; + + /* 6.4.11 (1, 2, 3, 4) */ + if (!params->SBHUFF) { + code = jbig2_arith_int_decode(params->IARDW, as, &RDW); + code = jbig2_arith_int_decode(params->IARDH, as, &RDH); + code = jbig2_arith_int_decode(params->IARDX, as, &RDX); + code = jbig2_arith_int_decode(params->IARDY, as, &RDY); + } else { + RDW = jbig2_huffman_get(hs, params->SBHUFFRDW, &code); + RDH = jbig2_huffman_get(hs, params->SBHUFFRDH, &code); + RDX = jbig2_huffman_get(hs, params->SBHUFFRDX, &code); + RDY = jbig2_huffman_get(hs, params->SBHUFFRDY, &code); + BMSIZE = jbig2_huffman_get(hs, params->SBHUFFRSIZE, &code); + jbig2_huffman_skip(hs); + } + + /* 6.4.11 (6) */ + IBO = IB; + refimage = jbig2_image_new(ctx, IBO->width + RDW, + IBO->height + RDH); + if (refimage == NULL) { + jbig2_image_release(ctx, IBO); + if (params->SBHUFF) { + jbig2_release_huffman_table(ctx, SBSYMCODES); + } + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, + segment->number, + "couldn't allocate reference image"); + } + + /* Table 12 */ + rparams.GRTEMPLATE = params->SBRTEMPLATE; + rparams.reference = IBO; + rparams.DX = (RDW >> 1) + RDX; + rparams.DY = (RDH >> 1) + RDY; + rparams.TPGRON = 0; + memcpy(rparams.grat, params->sbrat, 4); + jbig2_decode_refinement_region(ctx, segment, + &rparams, as, refimage, GR_stats); + IB = refimage; + + jbig2_image_release(ctx, IBO); + + /* 6.4.11 (7) */ + if (params->SBHUFF) { + jbig2_huffman_advance(hs, BMSIZE); + } + + } + + /* (3c.vi) */ + if ((!params->TRANSPOSED) && (params->REFCORNER > 1)) { + CURS += IB->width - 1; + } else if ((params->TRANSPOSED) && !(params->REFCORNER & 1)) { + CURS += IB->height - 1; + } + + /* (3c.vii) */ + S = CURS; + + /* (3c.viii) */ + if (!params->TRANSPOSED) { + switch (params->REFCORNER) { + case JBIG2_CORNER_TOPLEFT: x = S; y = T; break; + case JBIG2_CORNER_TOPRIGHT: x = S - IB->width + 1; y = T; break; + case JBIG2_CORNER_BOTTOMLEFT: x = S; y = T - IB->height + 1; break; + case JBIG2_CORNER_BOTTOMRIGHT: x = S - IB->width + 1; y = T - IB->height + 1; break; + } + } else { /* TRANSPOSED */ + switch (params->REFCORNER) { + case JBIG2_CORNER_TOPLEFT: x = T; y = S; break; + case JBIG2_CORNER_TOPRIGHT: x = T - IB->width + 1; y = S; break; + case JBIG2_CORNER_BOTTOMLEFT: x = T; y = S - IB->height + 1; break; + case JBIG2_CORNER_BOTTOMRIGHT: x = T - IB->width + 1; y = S - IB->height + 1; break; + } + } + + /* (3c.ix) */ +#ifdef JBIG2_DEBUG + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "composing glyph id %d: %dx%d @ (%d,%d) symbol %d/%d", + ID, IB->width, IB->height, x, y, NINSTANCES + 1, + params->SBNUMINSTANCES); +#endif + jbig2_image_compose(ctx, image, IB, x, y, params->SBCOMBOP); + + /* (3c.x) */ + if ((!params->TRANSPOSED) && (params->REFCORNER < 2)) { + CURS += IB->width -1 ; + } else if ((params->TRANSPOSED) && (params->REFCORNER & 1)) { + CURS += IB->height - 1; + } + + /* (3c.xi) */ + NINSTANCES++; + + jbig2_image_release(ctx, IB); + } + /* end strip */ + } + /* 6.4.5 (4) */ + + if (params->SBHUFF) { + jbig2_release_huffman_table(ctx, SBSYMCODES); + } + + return 0; +} + +/** + * jbig2_text_region: read a text region segment header + **/ +int +jbig2_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data) +{ + int offset = 0; + Jbig2RegionSegmentInfo region_info; + Jbig2TextRegionParams params; + Jbig2Image *image; + Jbig2SymbolDict **dicts; + int n_dicts; + uint16_t flags; + uint16_t huffman_flags = 0; + Jbig2ArithCx *GR_stats = NULL; + int code = 0; + Jbig2WordStream *ws = NULL; + Jbig2ArithState *as = NULL; + + /* 7.4.1 */ + if (segment->data_length < 17) + goto too_short; + jbig2_get_region_segment_info(®ion_info, segment_data); + offset += 17; + + /* 7.4.3.1.1 */ + flags = jbig2_get_int16(segment_data + offset); + offset += 2; + + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "text region header flags 0x%04x", flags); + + params.SBHUFF = flags & 0x0001; + params.SBREFINE = flags & 0x0002; + params.LOGSBSTRIPS = (flags & 0x000c) >> 2; + params.SBSTRIPS = 1 << params.LOGSBSTRIPS; + params.REFCORNER = (flags & 0x0030) >> 4; + params.TRANSPOSED = flags & 0x0040; + params.SBCOMBOP = (flags & 0x0180) >> 7; + params.SBDEFPIXEL = flags & 0x0200; + /* SBDSOFFSET is a signed 5 bit integer */ + params.SBDSOFFSET = (flags & 0x7C00) >> 10; + if (params.SBDSOFFSET > 0x0f) params.SBDSOFFSET -= 0x20; + params.SBRTEMPLATE = flags & 0x8000; + + if (params.SBDSOFFSET) { + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "text region has SBDSOFFSET %d", params.SBDSOFFSET); + } + + if (params.SBHUFF) /* Huffman coding */ + { + /* 7.4.3.1.2 */ + huffman_flags = jbig2_get_int16(segment_data + offset); + offset += 2; + + if (huffman_flags & 0x8000) + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "reserved bit 15 of text region huffman flags is not zero"); + } + else /* arithmetic coding */ + { + /* 7.4.3.1.3 */ + if ((params.SBREFINE) && !(params.SBRTEMPLATE)) + { + params.sbrat[0] = segment_data[offset]; + params.sbrat[1] = segment_data[offset + 1]; + params.sbrat[2] = segment_data[offset + 2]; + params.sbrat[3] = segment_data[offset + 3]; + offset += 4; + } else { + /* zero these for the sake of later debug messages */ + memset(params.sbrat, 0, sizeof(params.sbrat)); + } + } + + /* 7.4.3.1.4 */ + params.SBNUMINSTANCES = jbig2_get_int32(segment_data + offset); + offset += 4; + + if (params.SBHUFF) { + /* 7.4.3.1.5 - Symbol ID Huffman table */ + /* ...this is handled in the segment body decoder */ + + /* 7.4.3.1.6 - Other Huffman table selection */ + switch (huffman_flags & 0x0003) { + case 0: /* Table B.6 */ + params.SBHUFFFS = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_F); + break; + case 1: /* Table B.7 */ + params.SBHUFFFS = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_G); + break; + case 3: /* Custom table from referred segment */ + /* We handle this case later by leaving the table as NULL */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region uses custom FS huffman table (NYI)"); + break; + case 2: /* invalid */ + default: + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region specified invalid FS huffman table"); + break; + } + switch ((huffman_flags & 0x000c) >> 2) { + case 0: /* Table B.8 */ + params.SBHUFFDS = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_H); + break; + case 1: /* Table B.9 */ + params.SBHUFFDS = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_I); + break; + case 2: /* Table B.10 */ + params.SBHUFFDS = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_J); + break; + case 3: /* Custom table from referred segment */ + /* We handle this case later by leaving the table as NULL */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region uses custom DS huffman table (NYI)"); + break; + } + switch ((huffman_flags & 0x0030) >> 4) { + case 0: /* Table B.11 */ + params.SBHUFFDT = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_K); + break; + case 1: /* Table B.12 */ + params.SBHUFFDT = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_L); + break; + case 2: /* Table B.13 */ + params.SBHUFFDT = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_M); + break; + case 3: /* Custom table from referred segment */ + /* We handle this case later by leaving the table as NULL */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region uses custom DT huffman table (NYI)"); + break; + } + switch ((huffman_flags & 0x00c0) >> 6) { + case 0: /* Table B.14 */ + params.SBHUFFRDW = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_N); + break; + case 1: /* Table B.15 */ + params.SBHUFFRDW = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_O); + break; + case 3: /* Custom table from referred segment */ + /* We handle this case later by leaving the table as NULL */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region uses custom RDW huffman table (NYI)"); + break; + case 2: /* invalid */ + default: + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region specified invalid RDW huffman table"); + break; + } + switch ((huffman_flags & 0x0300) >> 8) { + case 0: /* Table B.14 */ + params.SBHUFFRDH = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_N); + break; + case 1: /* Table B.15 */ + params.SBHUFFRDH = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_O); + break; + case 3: /* Custom table from referred segment */ + /* We handle this case later by leaving the table as NULL */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region uses custom RDH huffman table (NYI)"); + break; + case 2: /* invalid */ + default: + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region specified invalid RDH huffman table"); + break; + } + switch ((huffman_flags & 0x0c00) >> 10) { + case 0: /* Table B.14 */ + params.SBHUFFRDX = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_N); + break; + case 1: /* Table B.15 */ + params.SBHUFFRDX = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_O); + break; + case 3: /* Custom table from referred segment */ + /* We handle this case later by leaving the table as NULL */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region uses custom RDX huffman table (NYI)"); + break; + case 2: /* invalid */ + default: + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region specified invalid RDX huffman table"); + break; + } + switch ((huffman_flags & 0x3000) >> 12) { + case 0: /* Table B.14 */ + params.SBHUFFRDY = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_N); + break; + case 1: /* Table B.15 */ + params.SBHUFFRDY = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_O); + break; + case 3: /* Custom table from referred segment */ + /* We handle this case later by leaving the table as NULL */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region uses custom RDY huffman table (NYI)"); + break; + case 2: /* invalid */ + default: + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region specified invalid RDY huffman table"); + break; + } + switch ((huffman_flags & 0x4000) >> 14) { + case 0: /* Table B.1 */ + params.SBHUFFRSIZE = jbig2_build_huffman_table(ctx, + &jbig2_huffman_params_A); + break; + case 1: /* Custom table from referred segment */ + /* We handle this case later by leaving the table as NULL */ + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region uses custom RSIZE huffman table (NYI)"); + break; + } + + if (huffman_flags & 0x8000) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "text region huffman flags bit 15 is set, contrary to spec"); + } + + /* 7.4.3.1.7 */ + /* For convenience this is done in the body decoder routine */ + } + + jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, + "text region: %d x %d @ (%d,%d) %d symbols", + region_info.width, region_info.height, + region_info.x, region_info.y, params.SBNUMINSTANCES); + + /* 7.4.3.2 (2) - compose the list of symbol dictionaries */ + n_dicts = jbig2_sd_count_referred(ctx, segment); + if (n_dicts != 0) { + dicts = jbig2_sd_list_referred(ctx, segment); + } else { + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "text region refers to no symbol dictionaries!"); + } + if (dicts == NULL) { + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "unable to retrive symbol dictionaries!" + " previous parsing error?"); + } else { + int index; + if (dicts[0] == NULL) { + return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, + segment->number, + "unable to find first referenced symbol dictionary!"); + } + for (index = 1; index < n_dicts; index++) + if (dicts[index] == NULL) { + jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, + "unable to find all referenced symbol dictionaries!"); + n_dicts = index; + } + } + + /* 7.4.3.2 (3) */ + if (!params.SBHUFF && params.SBREFINE) { + int stats_size = params.SBRTEMPLATE ? 1 << 10 : 1 << 13; + GR_stats = jbig2_alloc(ctx->allocator, stats_size); + memset(GR_stats, 0, stats_size); + } + + image = jbig2_image_new(ctx, region_info.width, region_info.height); + if (image == NULL) { + if (!params.SBHUFF && params.SBREFINE) { + jbig2_free(ctx->allocator, GR_stats); + } else if (params.SBHUFF) { + jbig2_release_huffman_table(ctx, params.SBHUFFFS); + jbig2_release_huffman_table(ctx, params.SBHUFFDS); + jbig2_release_huffman_table(ctx, params.SBHUFFDT); + jbig2_release_huffman_table(ctx, params.SBHUFFRDX); + jbig2_release_huffman_table(ctx, params.SBHUFFRDY); + jbig2_release_huffman_table(ctx, params.SBHUFFRDW); + jbig2_release_huffman_table(ctx, params.SBHUFFRDH); + jbig2_release_huffman_table(ctx, params.SBHUFFRSIZE); + } + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "couldn't allocate text region image"); + } + + ws = jbig2_word_stream_buf_new(ctx, segment_data + offset, segment->data_length - offset); + if (!params.SBHUFF) { + int SBSYMCODELEN, index; + int SBNUMSYMS = 0; + for (index = 0; index < n_dicts; index++) { + SBNUMSYMS += dicts[index]->n_symbols; + } + + as = jbig2_arith_new(ctx, ws); + ws = 0; + + params.IADT = jbig2_arith_int_ctx_new(ctx); + params.IAFS = jbig2_arith_int_ctx_new(ctx); + params.IADS = jbig2_arith_int_ctx_new(ctx); + params.IAIT = jbig2_arith_int_ctx_new(ctx); + /* Table 31 */ + for (SBSYMCODELEN = 0; (1 << SBSYMCODELEN) < SBNUMSYMS; SBSYMCODELEN++); + params.IAID = jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN); + params.IARI = jbig2_arith_int_ctx_new(ctx); + params.IARDW = jbig2_arith_int_ctx_new(ctx); + params.IARDH = jbig2_arith_int_ctx_new(ctx); + params.IARDX = jbig2_arith_int_ctx_new(ctx); + params.IARDY = jbig2_arith_int_ctx_new(ctx); + } + + code = jbig2_decode_text_region(ctx, segment, ¶ms, + (const Jbig2SymbolDict * const *)dicts, n_dicts, image, + segment_data + offset, segment->data_length - offset, + GR_stats, as, ws); + + if (!params.SBHUFF && params.SBREFINE) { + jbig2_free(ctx->allocator, GR_stats); + } + + if (params.SBHUFF) { + jbig2_release_huffman_table(ctx, params.SBHUFFFS); + jbig2_release_huffman_table(ctx, params.SBHUFFDS); + jbig2_release_huffman_table(ctx, params.SBHUFFDT); + jbig2_release_huffman_table(ctx, params.SBHUFFRDX); + jbig2_release_huffman_table(ctx, params.SBHUFFRDY); + jbig2_release_huffman_table(ctx, params.SBHUFFRDW); + jbig2_release_huffman_table(ctx, params.SBHUFFRDH); + jbig2_release_huffman_table(ctx, params.SBHUFFRSIZE); + } + else { + jbig2_arith_int_ctx_free(ctx, params.IADT); + jbig2_arith_int_ctx_free(ctx, params.IAFS); + jbig2_arith_int_ctx_free(ctx, params.IADS); + jbig2_arith_int_ctx_free(ctx, params.IAIT); + jbig2_arith_iaid_ctx_free(ctx, params.IAID); + jbig2_arith_int_ctx_free(ctx, params.IARI); + jbig2_arith_int_ctx_free(ctx, params.IARDW); + jbig2_arith_int_ctx_free(ctx, params.IARDH); + jbig2_arith_int_ctx_free(ctx, params.IARDX); + jbig2_arith_int_ctx_free(ctx, params.IARDY); + jbig2_free(ctx->allocator, as); + jbig2_word_stream_buf_free(ctx, ws); + } + + jbig2_free(ctx->allocator, dicts); + + /* todo: check errors */ + + if ((segment->flags & 63) == 4) { + /* we have an intermediate region here. save it for later */ + segment->result = image; + } else { + /* otherwise composite onto the page */ + jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, + "composing %dx%d decoded text region onto page at (%d, %d)", + region_info.width, region_info.height, region_info.x, region_info.y); + jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], image, + region_info.x, region_info.y, region_info.op); + jbig2_image_release(ctx, image); + } + + /* success */ + return 0; + + too_short: + return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, + "Segment too short"); +} diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2_text.h b/contrib/media/updf_newlib/libjbig2dec/jbig2_text.h new file mode 100755 index 000000000..bf6fff33a --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2_text.h @@ -0,0 +1,73 @@ +/* + jbig2dec + + Copyright (C) 2002-2004 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/** + * Headers for Text region handling + **/ + +typedef enum { + JBIG2_CORNER_BOTTOMLEFT = 0, + JBIG2_CORNER_TOPLEFT = 1, + JBIG2_CORNER_BOTTOMRIGHT = 2, + JBIG2_CORNER_TOPRIGHT = 3 +} Jbig2RefCorner; + +typedef struct { + bool SBHUFF; + bool SBREFINE; + bool SBDEFPIXEL; + Jbig2ComposeOp SBCOMBOP; + bool TRANSPOSED; + Jbig2RefCorner REFCORNER; + int SBDSOFFSET; + /* int SBW; */ + /* int SBH; */ + uint32_t SBNUMINSTANCES; + int LOGSBSTRIPS; + int SBSTRIPS; + /* int SBNUMSYMS; */ + /* SBSYMCODES */ + /* SBSYMCODELEN */ + /* SBSYMS */ + Jbig2HuffmanTable *SBHUFFFS; + Jbig2HuffmanTable *SBHUFFDS; + Jbig2HuffmanTable *SBHUFFDT; + Jbig2HuffmanTable *SBHUFFRDW; + Jbig2HuffmanTable *SBHUFFRDH; + Jbig2HuffmanTable *SBHUFFRDX; + Jbig2HuffmanTable *SBHUFFRDY; + Jbig2HuffmanTable *SBHUFFRSIZE; + Jbig2ArithIntCtx *IADT; + Jbig2ArithIntCtx *IAFS; + Jbig2ArithIntCtx *IADS; + Jbig2ArithIntCtx *IAIT; + Jbig2ArithIaidCtx *IAID; + Jbig2ArithIntCtx *IARI; + Jbig2ArithIntCtx *IARDW; + Jbig2ArithIntCtx *IARDH; + Jbig2ArithIntCtx *IARDX; + Jbig2ArithIntCtx *IARDY; + bool SBRTEMPLATE; + int8_t sbrat[4]; +} Jbig2TextRegionParams; + +int +jbig2_decode_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, + const Jbig2TextRegionParams *params, + const Jbig2SymbolDict * const *dicts, const int n_dicts, + Jbig2Image *image, + const byte *data, const size_t size, + Jbig2ArithCx *GR_stats, + Jbig2ArithState *as, Jbig2WordStream *ws); diff --git a/contrib/media/updf_newlib/libjbig2dec/jbig2dec.c b/contrib/media/updf_newlib/libjbig2dec/jbig2dec.c new file mode 100755 index 000000000..7f2763677 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/jbig2dec.c @@ -0,0 +1,513 @@ +/* + jbig2dec + + Copyright (C) 2001-2009 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef PACKAGE +#define PACKAGE "jbig2dec" +#endif +#ifndef VERSION +#define VERSION "unknown-version" +#endif + +#include +#include +#include +#include + +#ifdef HAVE_GETOPT_H +# include +#else +# include "getopt.h" +#endif + +#include "os_types.h" +#include "sha1.h" + +#include "jbig2.h" +#include "jbig2_image.h" + +typedef enum { + usage,dump,render +} jbig2dec_mode; + +typedef enum { + jbig2dec_format_jbig2, + jbig2dec_format_pbm, + jbig2dec_format_png, + jbig2dec_format_none +} jbig2dec_format; + +typedef struct { + jbig2dec_mode mode; + int verbose, hash; + SHA1_CTX *hash_ctx; + char *output_file; + jbig2dec_format output_format; +} jbig2dec_params_t; + +static int print_version(void); +static int print_usage(void); + +/* page hashing functions */ +static void +hash_init(jbig2dec_params_t *params) +{ + params->hash_ctx = malloc(sizeof(SHA1_CTX)); + if (params->hash_ctx == NULL) { + fprintf(stderr, "unable to allocate hash state\n"); + params->hash = 0; + return; + } else { + SHA1_Init(params->hash_ctx); + } +} + +static void +hash_image(jbig2dec_params_t *params, Jbig2Image *image) +{ + unsigned int N = image->stride * image->height; + SHA1_Update(params->hash_ctx, image->data, N); +} + +static void +hash_print(jbig2dec_params_t *params, FILE *out) +{ + unsigned char md[SHA1_DIGEST_SIZE]; + char digest[2*SHA1_DIGEST_SIZE + 1]; + int i; + + SHA1_Final(params->hash_ctx, md); + for (i = 0; i < SHA1_DIGEST_SIZE; i++) { + snprintf(&(digest[2*i]), 3, "%02x", md[i]); + } + fprintf(out, "%s", digest); +} + +static void +hash_free(jbig2dec_params_t *params) +{ + free(params->hash_ctx); + params->hash_ctx = NULL; +} + +static int +set_output_format(jbig2dec_params_t *params, const char *format) +{ +#ifdef HAVE_LIBPNG + /* this should really by strncasecmp() + TODO: we need to provide our own for portability */ + if (!strncmp(format, "png", 3) || !strncmp(format, "PNG", 3)) { + params->output_format=jbig2dec_format_png; + return 0; + } +#endif + /* default to pbm */ + params->output_format=jbig2dec_format_pbm; + + return 0; +} + +static int +parse_options(int argc, char *argv[], jbig2dec_params_t *params) +{ + static struct option long_options[] = { + {"version", 0, NULL, 'V'}, + {"help", 0, NULL, 'h'}, + {"quiet", 0, NULL, 'q'}, + {"verbose", 2, NULL, 'v'}, + {"dump", 0, NULL, 'd'}, + {"hash", 0, NULL, 'm'}, + {"output", 1, NULL, 'o'}, + {"format", 1, NULL, 't'}, + {NULL, 0, NULL, 0} + }; + int option_idx = 1; + int option; + + while (1) { + option = getopt_long(argc, argv, + "Vh?qvdo:t:", long_options, &option_idx); + if (option == -1) break; + + switch (option) { + case 0: /* unknown long option */ + if (!params->verbose) fprintf(stdout, + "unrecognized option: --%s\n", + long_options[option_idx].name); + break; + case 'q': + params->verbose = 0; + break; + case 'v': + if (optarg) params->verbose = atoi(optarg); + else params->verbose = 2; + break; + case 'h': + case '?': + params->mode = usage; + break; + case 'V': + /* the GNU Coding Standards suggest --version + should override all other options */ + print_version(); + exit(0); + break; + case 'd': + params->mode=dump; + break; + case 'm': + params->hash = 1; + break; + case 'o': + params->output_file = strdup(optarg); + break; + case 't': + set_output_format(params, optarg); + break; + default: + if (!params->verbose) fprintf(stdout, + "unrecognized option: -%c\n", option); + break; + } + } + return (optind); +} + +static int +print_version (void) +{ + fprintf(stdout, "%s %s\n", PACKAGE, VERSION); + return 0; +} + +static int +print_usage (void) +{ + fprintf(stderr, + "Usage: jbig2dec [options] \n" + " or jbig2dec [options] \n" + "\n" + " When invoked with a single file, it attempts to parse it as\n" + " a normal jbig2 file. Invoked with two files, it treats the\n" + " first as the global segments, and the second as the segment\n" + " stream for a particular page. This is useful for examining\n" + " embedded streams.\n" + "\n" + " available options:\n" + " -h --help this usage summary\n" + " -q --quiet suppress diagnostic output\n" + " -v --verbose set the verbosity level\n" + " -d --dump print the structure of the jbig2 file\n" + " rather than explicitly decoding\n" + " --version program name and version information\n" + " --hash print a hash of the decoded document\n" + " -o send decoded output to \n" + " Defaults to the the input with a different\n" + " extension. Pass '-' for stdout.\n" + " -t force a particular output file format\n" + #ifdef HAVE_LIBPNG + " supported options are 'png' and 'pbm'\n" + #else + " the only supported option is 'pbm'\n" + #endif + "\n" + ); + + return 1; +} + +static int +error_callback(void *error_callback_data, const char *buf, Jbig2Severity severity, + int32_t seg_idx) +{ + const jbig2dec_params_t *params = error_callback_data; + char *type; + char segment[22]; + + switch (severity) { + case JBIG2_SEVERITY_DEBUG: + if (params->verbose < 3) return 0; + type = "DEBUG"; break;; + case JBIG2_SEVERITY_INFO: + if (params->verbose < 2) return 0; + type = "info"; break;; + case JBIG2_SEVERITY_WARNING: + if (params->verbose < 1) return 0; + type = "WARNING"; break;; + case JBIG2_SEVERITY_FATAL: type = "FATAL ERROR"; break;; + default: type = "unknown message"; break;; + } + if (seg_idx == -1) segment[0] = '\0'; + else snprintf(segment, sizeof(segment), "(segment 0x%02x)", seg_idx); + + fprintf(stderr, "jbig2dec %s %s %s\n", type, buf, segment); + + return 0; +} + +static char * +make_output_filename(const char *input_filename, const char *extension) +{ + char *output_filename; + const char *c, *e; + int len; + + if (extension == NULL) { + fprintf(stderr, "make_output_filename called with no extension!\n"); + exit (1); + } + + if (input_filename == NULL) + c = "out"; + else { + /* strip any leading path */ + c = strrchr(input_filename, '/'); /* *nix */ + if (c == NULL) + c = strrchr(input_filename, '\\'); /* win32/dos */ + if (c != NULL) + c++; /* skip the path separator */ + else + c = input_filename; /* no leading path */ + } + + /* make sure we haven't just stripped the last character */ + if (*c == '\0') + c = "out"; + + /* strip the extension */ + len = strlen(c); + e = strrchr(c, '.'); + if (e != NULL) + len -= strlen(e); + + /* allocate enough space for the base + ext */ + output_filename = malloc(len + strlen(extension) + 1); + if (output_filename == NULL) { + fprintf(stderr, "couldn't allocate memory for output_filename\n"); + exit (1); + } + + strncpy(output_filename, c, len); + strncpy(output_filename + len, extension, strlen(extension)); + *(output_filename + len + strlen(extension)) = '\0'; + + /* return the new string */ + return (output_filename); +} + +static int +write_page_image(jbig2dec_params_t *params, Jbig2Image *image) +{ + if (!strncmp(params->output_file, "-", 2)) + { + switch (params->output_format) { +#ifdef HAVE_LIBPNG + case jbig2dec_format_png: + jbig2_image_write_png(image, stdout); + break; +#endif + case jbig2dec_format_pbm: + jbig2_image_write_pbm(image, stdout); + break; + default: + fprintf(stderr, "unsupported output format.\n"); + return 1; + } + } + else + { + if (params->verbose > 1) + fprintf(stderr, "saving decoded page as '%s'\n", params->output_file); + switch (params->output_format) { +#ifdef HAVE_LIBPNG + case jbig2dec_format_png: + jbig2_image_write_png_file(image, params->output_file); + break; +#endif + case jbig2dec_format_pbm: + jbig2_image_write_pbm_file(image, params->output_file); + break; + default: + fprintf(stderr, "unsupported output format.\n"); + return 1; + } + } + + return 0; +} + +static int +write_document_hash(jbig2dec_params_t *params) +{ + FILE *out; + + if (!strncmp(params->output_file, "-", 2)) { + out = stderr; + } else { + out = stdout; + } + + fprintf(out, "Hash of decoded document: "); + hash_print(params, out); + fprintf(out, "\n"); + + return 0; +} + +int +main (int argc, char **argv) +{ + FILE *f = NULL, *f_page = NULL; + Jbig2Ctx *ctx; + uint8_t buf[4096]; + jbig2dec_params_t params; + int filearg; + + /* set defaults */ + params.mode = render; + params.verbose = 1; + params.hash = 0; + params.output_file = NULL; + params.output_format = jbig2dec_format_none; + + filearg = parse_options(argc, argv, ¶ms); + + if (params.hash) hash_init(¶ms); + + switch (params.mode) { + case usage: + print_usage(); + exit (0); + break; + case dump: + fprintf(stderr, "Sorry, segment dump not yet implemented\n"); + break; + case render: + + if ((argc - filearg) == 1) + /* only one argument--open as a jbig2 file */ + { + char *fn = argv[filearg]; + + f = fopen(fn, "rb"); + if (f == NULL) + { + fprintf(stderr, "error opening %s\n", fn); + return 1; + } + } + else if ((argc - filearg) == 2) + /* two arguments open as separate global and page streams */ + { + char *fn = argv[filearg]; + char *fn_page = argv[filearg+1]; + + f = fopen(fn, "rb"); + if (f == NULL) + { + fprintf(stderr, "error opening %s\n", fn); + return 1; + } + + f_page = fopen(fn_page, "rb"); + if (f_page == NULL) + { + fprintf(stderr, "error opening %s\n", fn_page); + return 1; + } + } + else + /* any other number of arguments */ + return print_usage(); + + ctx = jbig2_ctx_new(NULL, f_page != NULL ? JBIG2_OPTIONS_EMBEDDED : 0, + NULL, + error_callback, ¶ms); + + /* pull the whole file/global stream into memory */ + for (;;) + { + int n_bytes = fread(buf, 1, sizeof(buf), f); + if (n_bytes <= 0) + break; + if (jbig2_data_in(ctx, buf, n_bytes)) + break; + } + fclose(f); + + /* if there's a local page stream read that in its entirety */ + if (f_page != NULL) + { + Jbig2GlobalCtx *global_ctx = jbig2_make_global_ctx(ctx); + ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, global_ctx, + error_callback, ¶ms); + for (;;) + { + int n_bytes = fread(buf, 1, sizeof(buf), f_page); + if (n_bytes <= 0) + break; + if (jbig2_data_in(ctx, buf, n_bytes)) + break; + } + fclose(f_page); + jbig2_global_ctx_free(global_ctx); + } + + /* retrieve and output the returned pages */ + { + Jbig2Image *image; + + /* work around broken CVision embedded streams */ + if (f_page != NULL) + jbig2_complete_page(ctx); + + if (params.output_file == NULL) + { +#ifdef HAVE_LIBPNG + params.output_file = make_output_filename(argv[filearg], ".png"); + params.output_format = jbig2dec_format_png; +#else + params.output_file = make_output_filename(argv[filearg], ".pbm"); + params.output_format = jbig2dec_format_pbm; +#endif + } else { + int len = strlen(params.output_file); + if ((len >= 3) && (params.output_format == jbig2dec_format_none)) + /* try to set the output type by the given extension */ + set_output_format(¶ms, params.output_file + len - 3); + } + + /* retrieve and write out all the completed pages */ + while ((image = jbig2_page_out(ctx)) != NULL) { + write_page_image(¶ms, image); + if (params.hash) hash_image(¶ms, image); + jbig2_release_page(ctx, image); + } + if (params.hash) write_document_hash(¶ms); + } + + jbig2_ctx_free(ctx); + + } /* end params.mode switch */ + + if (params.output_file) free(params.output_file); + if (params.hash) hash_free(¶ms); + + /* fin */ + return 0; +} diff --git a/contrib/media/updf_newlib/libjbig2dec/memcmp.c b/contrib/media/updf_newlib/libjbig2dec/memcmp.c new file mode 100755 index 000000000..4fa313051 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/memcmp.c @@ -0,0 +1,49 @@ +/* + jbig2dec + + Copyright (C) 2001-2005 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +/* replacement for broken memcmp() */ + +/* + * compares two byte strings 'a' and 'b', both assumed to be 'len' bytes long + * returns zero if the two strings are identical, otherwise returns -1 or 1 + * depending on the relative magnitude of the first differing elements, + * considered as unsigned chars + */ + +int memcmp(const void *b1, const void *b2, size_t len) +{ + unsigned char *a, *b; + size_t i; + + a = (unsigned char *)b1; + b = (unsigned char *)b2; + for(i = 0; i < len; i++) { + if (*a != *b) { + /* strings differ */ + return (*a < *b) ? -1 : 1; + } + a++; + b++; + } + + /* strings match */ + return 0; +} diff --git a/contrib/media/updf_newlib/libjbig2dec/os_types.h b/contrib/media/updf_newlib/libjbig2dec/os_types.h new file mode 100755 index 000000000..d20dcdfd9 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/os_types.h @@ -0,0 +1,51 @@ +/* + jbig2dec + + Copyright (C) 2003 Artifex Software, Inc. + + This software is distributed under license and may not + be copied, modified or distributed except as expressly + authorized under the terms of the license contained in + the file LICENSE in this distribution. + + For further licensing information refer to http://artifex.com/ or + contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861. +*/ + +/* + indirection layer for build and platform-specific definitions + + in general, this header should ensure that the stdint types are + available, and that any optional compile flags are defined if + the build system doesn't pass them directly. +*/ + +#ifndef _JBIG2_OS_TYPES_H +#define _JBIG2_OS_TYPES_H + +#if defined(__CYGWIN__) && !defined(HAVE_STDINT_H) +# include +# if defined(OLD_CYGWIN_SYS_TYPES) + /* + * Old versions of Cygwin have no stdint.h but define "MS types". Some of + * them conflict with a standard type emulation provided by config_types.h + * so we do a fixup here. + */ + typedef u_int8_t uint8_t; + typedef u_int16_t uint16_t; + typedef u_int32_t uint32_t; +#endif +#elif defined(HAVE_CONFIG_H) +# include "config_types.h" +#elif defined(_WIN32) || defined(__WIN32__) +# include "config_win32.h" +#endif + +#if defined(HAVE_STDINT_H) || defined(__MACOS__) +# include +#elif defined(__VMS) +# include +#endif + +#endif /* _JBIG2_OS_TYPES_H */ diff --git a/contrib/media/updf_newlib/libjbig2dec/sha1.c b/contrib/media/updf_newlib/libjbig2dec/sha1.c new file mode 100755 index 000000000..da9b8e27b --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/sha1.c @@ -0,0 +1,375 @@ +/* +SHA-1 in C +By Steve Reid +100% Public Domain + +----------------- +Modified 7/98 +By James H. Brown +Still 100% Public Domain + +Corrected a problem which generated improper hash values on 16 bit machines +Routine SHA1Update changed from + void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int +len) +to + void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned +long len) + +The 'len' parameter was declared an int which works fine on 32 bit machines. +However, on 16 bit machines an int is too small for the shifts being done +against +it. This caused the hash function to generate incorrect values if len was +greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update(). + +Since the file IO in main() reads 16K at a time, any file 8K or larger would +be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million +"a"s). + +I also changed the declaration of variables i & j in SHA1Update to +unsigned long from unsigned int for the same reason. + +These changes should make no difference to any 32 bit implementations since +an +int and a long are the same size in those environments. + +-- +I also corrected a few compiler warnings generated by Borland C. +1. Added #include for exit() prototype +2. Removed unused variable 'j' in SHA1Final +3. Changed exit(0) to return(0) at end of main. + +ALL changes I made can be located by searching for comments containing 'JHB' +----------------- +Modified 8/98 +By Steve Reid +Still 100% public domain + +1- Removed #include and used return() instead of exit() +2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall) +3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net + +----------------- +Modified 4/01 +By Saul Kravitz +Still 100% PD +Modified to run on Compaq Alpha hardware. + +----------------- +Modified 07/2002 +By Ralph Giles +Still 100% public domain +modified for use with stdint types, autoconf +code cleanup, removed attribution comments +switched SHA1Final() argument order for consistency +use SHA1_ prefix for public api +move public api to sha1.h +*/ + +/* +Test Vectors (from FIPS PUB 180-1) +"abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + +/* #define SHA1HANDSOFF */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "os_types.h" +#include "sha1.h" + +void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]); + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +/* FIXME: can we do this in an endian-proof way? */ +#ifdef WORDS_BIGENDIAN +#define blk0(i) block->l[i] +#else +#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ + |(rol(block->l[i],8)&0x00FF00FF)) +#endif +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ + ^block->l[(i+2)&15]^block->l[i&15],1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); + + +#ifdef VERBOSE /* SAK */ +void SHAPrintContext(SHA1_CTX *context, char *msg){ + printf("%s (%d,%d) %x %x %x %x %x\n", + msg, + context->count[0], context->count[1], + context->state[0], + context->state[1], + context->state[2], + context->state[3], + context->state[4]); +} +#endif /* VERBOSE */ + +/* Hash a single 512-bit block. This is the core of the algorithm. */ +void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]) +{ + uint32_t a, b, c, d, e; + typedef union { + uint8_t c[64]; + uint32_t l[16]; + } CHAR64LONG16; + CHAR64LONG16* block; + +#ifdef SHA1HANDSOFF + static uint8_t workspace[64]; + block = (CHAR64LONG16*)workspace; + memcpy(block, buffer, 64); +#else + block = (CHAR64LONG16*)buffer; +#endif + + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); + + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + + /* Wipe variables */ + a = b = c = d = e = 0; +} + + +/* SHA1Init - Initialize new context */ +void SHA1_Init(SHA1_CTX* context) +{ + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + + +/* Run your data through this. */ +void SHA1_Update(SHA1_CTX* context, const uint8_t* data, const size_t len) +{ + size_t i, j; + +#ifdef VERBOSE + SHAPrintContext(context, "before"); +#endif + + j = (context->count[0] >> 3) & 63; + if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; + context->count[1] += (len >> 29); + if ((j + len) > 63) { + memcpy(&context->buffer[j], data, (i = 64-j)); + SHA1_Transform(context->state, context->buffer); + for ( ; i + 63 < len; i += 64) { + SHA1_Transform(context->state, data + i); + } + j = 0; + } + else i = 0; + memcpy(&context->buffer[j], &data[i], len - i); + +#ifdef VERBOSE + SHAPrintContext(context, "after "); +#endif +} + + +/* Add padding and return the message digest. */ +void SHA1_Final(SHA1_CTX* context, uint8_t digest[SHA1_DIGEST_SIZE]) +{ + uint32_t i; + uint8_t finalcount[8]; + + for (i = 0; i < 8; i++) { + finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] + >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ + } + SHA1_Update(context, (uint8_t *)"\200", 1); + while ((context->count[0] & 504) != 448) { + SHA1_Update(context, (uint8_t *)"\0", 1); + } + SHA1_Update(context, finalcount, 8); /* Should cause a SHA1_Transform() */ + for (i = 0; i < SHA1_DIGEST_SIZE; i++) { + digest[i] = (uint8_t) + ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); + } + + /* Wipe variables */ + i = 0; + memset(context->buffer, 0, 64); + memset(context->state, 0, 20); + memset(context->count, 0, 8); + memset(finalcount, 0, 8); /* SWR */ + +#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite its own static vars */ + SHA1_Transform(context->state, context->buffer); +#endif +} + +/*************************************************************/ + +#if 0 +int main(int argc, char** argv) +{ +int i, j; +SHA1_CTX context; +unsigned char digest[SHA1_DIGEST_SIZE], buffer[16384]; +FILE* file; + + if (argc > 2) { + puts("Public domain SHA-1 implementation - by Steve Reid "); + puts("Modified for 16 bit environments 7/98 - by James H. Brown "); /* JHB */ + puts("Produces the SHA-1 hash of a file, or stdin if no file is specified."); + return(0); + } + if (argc < 2) { + file = stdin; + } + else { + if (!(file = fopen(argv[1], "rb"))) { + fputs("Unable to open file.", stderr); + return(-1); + } + } + SHA1_Init(&context); + while (!feof(file)) { /* note: what if ferror(file) */ + i = fread(buffer, 1, 16384, file); + SHA1_Update(&context, buffer, i); + } + SHA1_Final(&context, digest); + fclose(file); + for (i = 0; i < SHA1_DIGEST_SIZE/4; i++) { + for (j = 0; j < 4; j++) { + printf("%02X", digest[i*4+j]); + } + putchar(' '); + } + putchar('\n'); + return(0); /* JHB */ +} +#endif + +/* self test */ + +#ifdef TEST + +static char *test_data[] = { + "abc", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "A million repetitions of 'a'"}; +static char *test_results[] = { + "A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D", + "84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1", + "34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F"}; + + +void digest_to_hex(const uint8_t digest[SHA1_DIGEST_SIZE], char *output) +{ + int i,j; + char *c = output; + + for (i = 0; i < SHA1_DIGEST_SIZE/4; i++) { + for (j = 0; j < 4; j++) { + sprintf(c,"%02X", digest[i*4+j]); + c += 2; + } + sprintf(c, " "); + c += 1; + } + *(c - 1) = '\0'; +} + +int main(int argc, char** argv) +{ + int k; + SHA1_CTX context; + uint8_t digest[20]; + char output[80]; + + fprintf(stdout, "verifying SHA-1 implementation... "); + + for (k = 0; k < 2; k++){ + SHA1_Init(&context); + SHA1_Update(&context, (uint8_t*)test_data[k], strlen(test_data[k])); + SHA1_Final(&context, digest); + digest_to_hex(digest, output); + + if (strcmp(output, test_results[k])) { + fprintf(stdout, "FAIL\n"); + fprintf(stderr,"* hash of \"%s\" incorrect:\n", test_data[k]); + fprintf(stderr,"\t%s returned\n", output); + fprintf(stderr,"\t%s is correct\n", test_results[k]); + return (1); + } + } + /* million 'a' vector we feed separately */ + SHA1_Init(&context); + for (k = 0; k < 1000000; k++) + SHA1_Update(&context, (uint8_t*)"a", 1); + SHA1_Final(&context, digest); + digest_to_hex(digest, output); + if (strcmp(output, test_results[2])) { + fprintf(stdout, "FAIL\n"); + fprintf(stderr,"* hash of \"%s\" incorrect:\n", test_data[2]); + fprintf(stderr,"\t%s returned\n", output); + fprintf(stderr,"\t%s is correct\n", test_results[2]); + return (1); + } + + /* success */ + fprintf(stdout, "ok\n"); + return(0); +} +#endif /* TEST */ diff --git a/contrib/media/updf_newlib/libjbig2dec/sha1.h b/contrib/media/updf_newlib/libjbig2dec/sha1.h new file mode 100755 index 000000000..e57a8c3e3 --- /dev/null +++ b/contrib/media/updf_newlib/libjbig2dec/sha1.h @@ -0,0 +1,27 @@ +/* public api for steve reid's public domain SHA-1 implementation */ +/* this file is in the public domain */ + +#ifndef __SHA1_H +#define __SHA1_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + uint32_t state[5]; + uint32_t count[2]; + uint8_t buffer[64]; +} SHA1_CTX; + +#define SHA1_DIGEST_SIZE 20 + +void SHA1_Init(SHA1_CTX* context); +void SHA1_Update(SHA1_CTX* context, const uint8_t* data, const size_t len); +void SHA1_Final(SHA1_CTX* context, uint8_t digest[SHA1_DIGEST_SIZE]); + +#ifdef __cplusplus +} +#endif + +#endif /* __SHA1_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/Makefile b/contrib/media/updf_newlib/libopenjpeg/Makefile new file mode 100755 index 000000000..a0145616b --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/Makefile @@ -0,0 +1,18 @@ +CC = kos32-gcc +LD = kos32-ld + +SDK_DIR = /media/maxim/E22406D62406AE1B/SVNKOS/contrib/sdk +CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 + +INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I $(SDK_DIR)/sources/freetype/include -I $(SDK_DIR)/sources/zlib -I . + +SRC := $(notdir $(wildcard *.c)) +OBJECTS = $(patsubst %.c, %.o, $(SRC)) + +default: $(patsubst %.c,%.o,$(SRC)) + ar rcs libopenjpeg.a *.o + rm *.o + mv libopenjpeg.a ../lib + +%.o : %.c Makefile $(SRC) + $(CC) $(CFLAGS) $(INCLUDES) -o $@ $< diff --git a/contrib/media/updf_newlib/libopenjpeg/bio.c b/contrib/media/updf_newlib/libopenjpeg/bio.c new file mode 100755 index 000000000..4c02f464d --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/bio.c @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +/** @defgroup BIO BIO - Individual bit input-output stream */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Write a bit +@param bio BIO handle +@param b Bit to write (0 or 1) +*/ +static void bio_putbit(opj_bio_t *bio, int b); +/** +Read a bit +@param bio BIO handle +@return Returns the read bit +*/ +static int bio_getbit(opj_bio_t *bio); +/** +Write a byte +@param bio BIO handle +@return Returns 0 if successful, returns 1 otherwise +*/ +static int bio_byteout(opj_bio_t *bio); +/** +Read a byte +@param bio BIO handle +@return Returns 0 if successful, returns 1 otherwise +*/ +static int bio_bytein(opj_bio_t *bio); + +/*@}*/ + +/*@}*/ + +/* +========================================================== + local functions +========================================================== +*/ + +static int bio_byteout(opj_bio_t *bio) { + bio->buf = (bio->buf << 8) & 0xffff; + bio->ct = bio->buf == 0xff00 ? 7 : 8; + if (bio->bp >= bio->end) { + return 1; + } + *bio->bp++ = bio->buf >> 8; + return 0; +} + +static int bio_bytein(opj_bio_t *bio) { + bio->buf = (bio->buf << 8) & 0xffff; + bio->ct = bio->buf == 0xff00 ? 7 : 8; + if (bio->bp >= bio->end) { + return 1; + } + bio->buf |= *bio->bp++; + return 0; +} + +static void bio_putbit(opj_bio_t *bio, int b) { + if (bio->ct == 0) { + bio_byteout(bio); + } + bio->ct--; + bio->buf |= b << bio->ct; +} + +static int bio_getbit(opj_bio_t *bio) { + if (bio->ct == 0) { + bio_bytein(bio); + } + bio->ct--; + return (bio->buf >> bio->ct) & 1; +} + +/* +========================================================== + Bit Input/Output interface +========================================================== +*/ + +opj_bio_t* bio_create(void) { + opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); + return bio; +} + +void bio_destroy(opj_bio_t *bio) { + if(bio) { + opj_free(bio); + } +} + +int bio_numbytes(opj_bio_t *bio) { + return (bio->bp - bio->start); +} + +void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) { + bio->start = bp; + bio->end = bp + len; + bio->bp = bp; + bio->buf = 0; + bio->ct = 8; +} + +void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) { + bio->start = bp; + bio->end = bp + len; + bio->bp = bp; + bio->buf = 0; + bio->ct = 0; +} + +void bio_write(opj_bio_t *bio, int v, int n) { + int i; + for (i = n - 1; i >= 0; i--) { + bio_putbit(bio, (v >> i) & 1); + } +} + +int bio_read(opj_bio_t *bio, int n) { + int i, v; + v = 0; + for (i = n - 1; i >= 0; i--) { + v += bio_getbit(bio) << i; + } + return v; +} + +int bio_flush(opj_bio_t *bio) { + bio->ct = 0; + if (bio_byteout(bio)) { + return 1; + } + if (bio->ct == 7) { + bio->ct = 0; + if (bio_byteout(bio)) { + return 1; + } + } + return 0; +} + +int bio_inalign(opj_bio_t *bio) { + bio->ct = 0; + if ((bio->buf & 0xff) == 0xff) { + if (bio_bytein(bio)) { + return 1; + } + bio->ct = 0; + } + return 0; +} diff --git a/contrib/media/updf_newlib/libopenjpeg/bio.h b/contrib/media/updf_newlib/libopenjpeg/bio.h new file mode 100755 index 000000000..764d7cb2e --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/bio.h @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __BIO_H +#define __BIO_H +/** +@file bio.h +@brief Implementation of an individual bit input-output (BIO) + +The functions in BIO.C have for goal to realize an individual bit input - output. +*/ + +/** @defgroup BIO BIO - Individual bit input-output stream */ +/*@{*/ + +/** +Individual bit input-output stream (BIO) +*/ +typedef struct opj_bio { + /** pointer to the start of the buffer */ + unsigned char *start; + /** pointer to the end of the buffer */ + unsigned char *end; + /** pointer to the present position in the buffer */ + unsigned char *bp; + /** temporary place where each byte is read or written */ + unsigned int buf; + /** coder : number of bits free to write. decoder : number of bits read */ + int ct; +} opj_bio_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a new BIO handle +@return Returns a new BIO handle if successful, returns NULL otherwise +*/ +opj_bio_t* bio_create(void); +/** +Destroy a previously created BIO handle +@param bio BIO handle to destroy +*/ +void bio_destroy(opj_bio_t *bio); +/** +Number of bytes written. +@param bio BIO handle +@return Returns the number of bytes written +*/ +int bio_numbytes(opj_bio_t *bio); +/** +Init encoder +@param bio BIO handle +@param bp Output buffer +@param len Output buffer length +*/ +void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len); +/** +Init decoder +@param bio BIO handle +@param bp Input buffer +@param len Input buffer length +*/ +void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len); +/** +Write bits +@param bio BIO handle +@param v Value of bits +@param n Number of bits to write +*/ +void bio_write(opj_bio_t *bio, int v, int n); +/** +Read bits +@param bio BIO handle +@param n Number of bits to read +@return Returns the corresponding read number +*/ +int bio_read(opj_bio_t *bio, int n); +/** +Flush bits +@param bio BIO handle +@return Returns 1 if successful, returns 0 otherwise +*/ +int bio_flush(opj_bio_t *bio); +/** +Passes the ending bits (coming from flushing) +@param bio BIO handle +@return Returns 1 if successful, returns 0 otherwise +*/ +int bio_inalign(opj_bio_t *bio); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __BIO_H */ + diff --git a/contrib/media/updf_newlib/libopenjpeg/cio.c b/contrib/media/updf_newlib/libopenjpeg/cio.c new file mode 100755 index 000000000..2ac262a1f --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/cio.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +/* ----------------------------------------------------------------------- */ + +opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) { + opj_cp_t *cp = NULL; + opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t)); + if(!cio) return NULL; + cio->cinfo = cinfo; + if(buffer && length) { + /* wrap a user buffer containing the encoded image */ + cio->openmode = OPJ_STREAM_READ; + cio->buffer = buffer; + cio->length = length; + } + else if(!buffer && !length && cinfo) { + /* allocate a buffer for the encoded image */ + cio->openmode = OPJ_STREAM_WRITE; + switch(cinfo->codec_format) { + case CODEC_J2K: + cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp; + break; + case CODEC_JP2: + cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp; + break; + default: + opj_free(cio); + return NULL; + } + cio->length = (unsigned int) (0.1625 * cp->img_size + 2000); /* 0.1625 = 1.3/8 and 2000 bytes as a minimum for headers */ + cio->buffer = (unsigned char *)opj_malloc(cio->length); + if(!cio->buffer) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error allocating memory for compressed bitstream\n"); + opj_free(cio); + return NULL; + } + } + else { + opj_free(cio); + return NULL; + } + + /* Initialize byte IO */ + cio->start = cio->buffer; + cio->end = cio->buffer + cio->length; + cio->bp = cio->buffer; + + return cio; +} + +void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio) { + if(cio) { + if(cio->openmode == OPJ_STREAM_WRITE) { + /* destroy the allocated buffer */ + opj_free(cio->buffer); + } + /* destroy the cio */ + opj_free(cio); + } +} + + +/* ----------------------------------------------------------------------- */ + +/* + * Get position in byte stream. + */ +int OPJ_CALLCONV cio_tell(opj_cio_t *cio) { + return cio->bp - cio->start; +} + +/* + * Set position in byte stream. + * + * pos : position, in number of bytes, from the beginning of the stream + */ +void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) { + cio->bp = cio->start + pos; +} + +/* + * Number of bytes left before the end of the stream. + */ +int cio_numbytesleft(opj_cio_t *cio) { + return cio->end - cio->bp; +} + +/* + * Get pointer to the current position in the stream. + */ +unsigned char *cio_getbp(opj_cio_t *cio) { + return cio->bp; +} + +/* + * Write a byte. + */ +bool cio_byteout(opj_cio_t *cio, unsigned char v) { + if (cio->bp >= cio->end) { + opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n"); + return false; + } + *cio->bp++ = v; + return true; +} + +/* + * Read a byte. + */ +unsigned char cio_bytein(opj_cio_t *cio) { + if (cio->bp >= cio->end) { + opj_event_msg(cio->cinfo, EVT_ERROR, "read error: passed the end of the codestream (start = %d, current = %d, end = %d\n", cio->start, cio->bp, cio->end); + return 0; + } + return *cio->bp++; +} + +/* + * Write some bytes. + * + * v : value to write + * n : number of bytes to write + */ +unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) { + int i; + for (i = n - 1; i >= 0; i--) { + if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) ) + return 0; + } + return n; +} + +/* + * Read some bytes. + * + * n : number of bytes to read + * + * return : value of the n bytes read + */ +unsigned int cio_read(opj_cio_t *cio, int n) { + int i; + unsigned int v; + v = 0; + for (i = n - 1; i >= 0; i--) { + v += cio_bytein(cio) << (i << 3); + } + return v; +} + +/* + * Skip some bytes. + * + * n : number of bytes to skip + */ +void cio_skip(opj_cio_t *cio, int n) { + cio->bp += n; +} + + + diff --git a/contrib/media/updf_newlib/libopenjpeg/cio.h b/contrib/media/updf_newlib/libopenjpeg/cio.h new file mode 100755 index 000000000..580bf9c0d --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/cio.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __CIO_H +#define __CIO_H +/** +@file cio.h +@brief Implementation of a byte input-output process (CIO) + +The functions in CIO.C have for goal to realize a byte input / output process. +*/ + +/** @defgroup CIO CIO - byte input-output stream */ +/*@{*/ + +/** @name Exported functions (see also openjpeg.h) */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Number of bytes left before the end of the stream +@param cio CIO handle +@return Returns the number of bytes before the end of the stream +*/ +int cio_numbytesleft(opj_cio_t *cio); +/** +Get pointer to the current position in the stream +@param cio CIO handle +@return Returns a pointer to the current position +*/ +unsigned char *cio_getbp(opj_cio_t *cio); +/** +Write some bytes +@param cio CIO handle +@param v Value to write +@param n Number of bytes to write +@return Returns the number of bytes written or 0 if an error occured +*/ +unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n); +/** +Read some bytes +@param cio CIO handle +@param n Number of bytes to read +@return Returns the value of the n bytes read +*/ +unsigned int cio_read(opj_cio_t *cio, int n); +/** +Skip some bytes +@param cio CIO handle +@param n Number of bytes to skip +*/ +void cio_skip(opj_cio_t *cio, int n); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __CIO_H */ + diff --git a/contrib/media/updf_newlib/libopenjpeg/dwt.c b/contrib/media/updf_newlib/libopenjpeg/dwt.c new file mode 100755 index 000000000..a8d579fa9 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/dwt.c @@ -0,0 +1,858 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2007, Jonathan Ballard + * Copyright (c) 2007, Callum Lerwick + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef __SSE__ +#include +#endif + +#include "opj_includes.h" + +/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ +/*@{*/ + +#define WS(i) v->mem[(i)*2] +#define WD(i) v->mem[(1+(i)*2)] + +/** @name Local data structures */ +/*@{*/ + +typedef struct dwt_local { + int* mem; + int dn; + int sn; + int cas; +} dwt_t; + +typedef union { + float f[4]; +} v4; + +typedef struct v4dwt_local { + v4* wavelet ; + int dn ; + int sn ; + int cas ; +} v4dwt_t ; + +static const float dwt_alpha = 1.586134342f; // 12994 +static const float dwt_beta = 0.052980118f; // 434 +static const float dwt_gamma = -0.882911075f; // -7233 +static const float dwt_delta = -0.443506852f; // -3633 + +static const float K = 1.230174105f; // 10078 +/* FIXME: What is this constant? */ +static const float c13318 = 1.625732422f; + +/*@}*/ + +/** +Virtual function type for wavelet transform in 1-D +*/ +typedef void (*DWT1DFN)(dwt_t* v); + +/** @name Local static functions */ +/*@{*/ + +/** +Forward lazy transform (horizontal) +*/ +static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas); +/** +Forward lazy transform (vertical) +*/ +static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas); +/** +Inverse lazy transform (horizontal) +*/ +static void dwt_interleave_h(dwt_t* h, int *a); +/** +Inverse lazy transform (vertical) +*/ +static void dwt_interleave_v(dwt_t* v, int *a, int x); +/** +Forward 5-3 wavelet transform in 1-D +*/ +static void dwt_encode_1(int *a, int dn, int sn, int cas); +/** +Inverse 5-3 wavelet transform in 1-D +*/ +static void dwt_decode_1(dwt_t *v); +/** +Forward 9-7 wavelet transform in 1-D +*/ +static void dwt_encode_1_real(int *a, int dn, int sn, int cas); +/** +Explicit calculation of the Quantization Stepsizes +*/ +static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize); +/** +Inverse wavelet transform in 2-D. +*/ +static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int i, DWT1DFN fn); + +/*@}*/ + +/*@}*/ + +#define S(i) a[(i)*2] +#define D(i) a[(1+(i)*2)] +#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i))) +#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i))) +/* new */ +#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i))) +#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i))) + +/* */ +/* This table contains the norms of the 5-3 wavelets for different bands. */ +/* */ +static const double dwt_norms[4][10] = { + {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, + {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, + {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, + {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93} +}; + +/* */ +/* This table contains the norms of the 9-7 wavelets for different bands. */ +/* */ +static const double dwt_norms_real[4][10] = { + {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9}, + {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, + {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, + {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2} +}; + +/* +========================================================== + local functions +========================================================== +*/ + +/* */ +/* Forward lazy transform (horizontal). */ +/* */ +static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) { + int i; + for (i=0; i */ +/* Forward lazy transform (vertical). */ +/* */ +static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) { + int i; + for (i=0; i */ +/* Inverse lazy transform (horizontal). */ +/* */ +static void dwt_interleave_h(dwt_t* h, int *a) { + int *ai = a; + int *bi = h->mem + h->cas; + int i = h->sn; + while( i-- ) { + *bi = *(ai++); + bi += 2; + } + ai = a + h->sn; + bi = h->mem + 1 - h->cas; + i = h->dn ; + while( i-- ) { + *bi = *(ai++); + bi += 2; + } +} + +/* */ +/* Inverse lazy transform (vertical). */ +/* */ +static void dwt_interleave_v(dwt_t* v, int *a, int x) { + int *ai = a; + int *bi = v->mem + v->cas; + int i = v->sn; + while( i-- ) { + *bi = *ai; + bi += 2; + ai += x; + } + ai = a + (v->sn * x); + bi = v->mem + 1 - v->cas; + i = v->dn ; + while( i-- ) { + *bi = *ai; + bi += 2; + ai += x; + } +} + + +/* */ +/* Forward 5-3 wavelet transform in 1-D. */ +/* */ +static void dwt_encode_1(int *a, int dn, int sn, int cas) { + int i; + + if (!cas) { + if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ + for (i = 0; i < dn; i++) D(i) -= (S_(i) + S_(i + 1)) >> 1; + for (i = 0; i < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2; + } + } else { + if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ + S(0) *= 2; + else { + for (i = 0; i < dn; i++) S(i) -= (DD_(i) + DD_(i - 1)) >> 1; + for (i = 0; i < sn; i++) D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2; + } + } +} + +/* */ +/* Inverse 5-3 wavelet transform in 1-D. */ +/* */ +static void dwt_decode_1_(int *a, int dn, int sn, int cas) { + int i; + + if (!cas) { + if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ + for (i = 0; i < sn; i++) S(i) -= (D_(i - 1) + D_(i) + 2) >> 2; + for (i = 0; i < dn; i++) D(i) += (S_(i) + S_(i + 1)) >> 1; + } + } else { + if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ + S(0) /= 2; + else { + for (i = 0; i < sn; i++) D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2; + for (i = 0; i < dn; i++) S(i) += (DD_(i) + DD_(i - 1)) >> 1; + } + } +} + +/* */ +/* Inverse 5-3 wavelet transform in 1-D. */ +/* */ +static void dwt_decode_1(dwt_t *v) { + dwt_decode_1_(v->mem, v->dn, v->sn, v->cas); +} + +/* */ +/* Forward 9-7 wavelet transform in 1-D. */ +/* */ +static void dwt_encode_1_real(int *a, int dn, int sn, int cas) { + int i; + if (!cas) { + if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ + for (i = 0; i < dn; i++) + D(i) -= fix_mul(S_(i) + S_(i + 1), 12993); + for (i = 0; i < sn; i++) + S(i) -= fix_mul(D_(i - 1) + D_(i), 434); + for (i = 0; i < dn; i++) + D(i) += fix_mul(S_(i) + S_(i + 1), 7233); + for (i = 0; i < sn; i++) + S(i) += fix_mul(D_(i - 1) + D_(i), 3633); + for (i = 0; i < dn; i++) + D(i) = fix_mul(D(i), 5038); /*5038 */ + for (i = 0; i < sn; i++) + S(i) = fix_mul(S(i), 6659); /*6660 */ + } + } else { + if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ + for (i = 0; i < dn; i++) + S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993); + for (i = 0; i < sn; i++) + D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434); + for (i = 0; i < dn; i++) + S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233); + for (i = 0; i < sn; i++) + D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633); + for (i = 0; i < dn; i++) + S(i) = fix_mul(S(i), 5038); /*5038 */ + for (i = 0; i < sn; i++) + D(i) = fix_mul(D(i), 6659); /*6660 */ + } + } +} + +static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) { + int p, n; + p = int_floorlog2(stepsize) - 13; + n = 11 - int_floorlog2(stepsize); + bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff; + bandno_stepsize->expn = numbps - p; +} + +/* +========================================================== + DWT interface +========================================================== +*/ + +/* */ +/* Forward 5-3 wavelet transform in 2-D. */ +/* */ +void dwt_encode(opj_tcd_tilecomp_t * tilec) { + int i, j, k; + int *a = NULL; + int *aj = NULL; + int *bj = NULL; + int w, l; + + w = tilec->x1-tilec->x0; + l = tilec->numresolutions-1; + a = tilec->data; + + for (i = 0; i < l; i++) { + int rw; /* width of the resolution level computed */ + int rh; /* height of the resolution level computed */ + int rw1; /* width of the resolution level once lower than computed one */ + int rh1; /* height of the resolution level once lower than computed one */ + int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ + int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ + int dn, sn; + + rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; + rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; + rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; + rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; + + cas_row = tilec->resolutions[l - i].x0 % 2; + cas_col = tilec->resolutions[l - i].y0 % 2; + + sn = rh1; + dn = rh - rh1; + bj = (int*)opj_malloc(rh * sizeof(int)); + for (j = 0; j < rw; j++) { + aj = a + j; + for (k = 0; k < rh; k++) bj[k] = aj[k*w]; + dwt_encode_1(bj, dn, sn, cas_col); + dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); + } + opj_free(bj); + + sn = rw1; + dn = rw - rw1; + bj = (int*)opj_malloc(rw * sizeof(int)); + for (j = 0; j < rh; j++) { + aj = a + j * w; + for (k = 0; k < rw; k++) bj[k] = aj[k]; + dwt_encode_1(bj, dn, sn, cas_row); + dwt_deinterleave_h(bj, aj, dn, sn, cas_row); + } + opj_free(bj); + } +} + + +/* */ +/* Inverse 5-3 wavelet transform in 2-D. */ +/* */ +void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres) { + dwt_decode_tile(tilec, numres, &dwt_decode_1); +} + + +/* */ +/* Get gain of 5-3 wavelet transform. */ +/* */ +int dwt_getgain(int orient) { + if (orient == 0) + return 0; + if (orient == 1 || orient == 2) + return 1; + return 2; +} + +/* */ +/* Get norm of 5-3 wavelet. */ +/* */ +double dwt_getnorm(int level, int orient) { + return dwt_norms[orient][level]; +} + +/* */ +/* Forward 9-7 wavelet transform in 2-D. */ +/* */ + +void dwt_encode_real(opj_tcd_tilecomp_t * tilec) { + int i, j, k; + int *a = NULL; + int *aj = NULL; + int *bj = NULL; + int w, l; + + w = tilec->x1-tilec->x0; + l = tilec->numresolutions-1; + a = tilec->data; + + for (i = 0; i < l; i++) { + int rw; /* width of the resolution level computed */ + int rh; /* height of the resolution level computed */ + int rw1; /* width of the resolution level once lower than computed one */ + int rh1; /* height of the resolution level once lower than computed one */ + int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ + int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ + int dn, sn; + + rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; + rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; + rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; + rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; + + cas_row = tilec->resolutions[l - i].x0 % 2; + cas_col = tilec->resolutions[l - i].y0 % 2; + + sn = rh1; + dn = rh - rh1; + bj = (int*)opj_malloc(rh * sizeof(int)); + for (j = 0; j < rw; j++) { + aj = a + j; + for (k = 0; k < rh; k++) bj[k] = aj[k*w]; + dwt_encode_1_real(bj, dn, sn, cas_col); + dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); + } + opj_free(bj); + + sn = rw1; + dn = rw - rw1; + bj = (int*)opj_malloc(rw * sizeof(int)); + for (j = 0; j < rh; j++) { + aj = a + j * w; + for (k = 0; k < rw; k++) bj[k] = aj[k]; + dwt_encode_1_real(bj, dn, sn, cas_row); + dwt_deinterleave_h(bj, aj, dn, sn, cas_row); + } + opj_free(bj); + } +} + + +/* */ +/* Get gain of 9-7 wavelet transform. */ +/* */ +int dwt_getgain_real(int orient) { + (void)orient; + return 0; +} + +/* */ +/* Get norm of 9-7 wavelet. */ +/* */ +double dwt_getnorm_real(int level, int orient) { + return dwt_norms_real[orient][level]; +} + +void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) { + int numbands, bandno; + numbands = 3 * tccp->numresolutions - 2; + for (bandno = 0; bandno < numbands; bandno++) { + double stepsize; + int resno, level, orient, gain; + + resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1); + orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1); + level = tccp->numresolutions - 1 - resno; + gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2)); + if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { + stepsize = 1.0; + } else { + double norm = dwt_norms_real[orient][level]; + stepsize = (1 << (gain)) / norm; + } + dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]); + } +} + + +/* */ +/* Determine maximum computed resolution level for inverse wavelet transform */ +/* */ +static int dwt_decode_max_resolution(opj_tcd_resolution_t* restrict r, int i) { + int mr = 1; + int w; + while( --i ) { + r++; + if( mr < ( w = r->x1 - r->x0 ) ) + mr = w ; + if( mr < ( w = r->y1 - r->y0 ) ) + mr = w ; + } + return mr ; +} + + +/* */ +/* Inverse wavelet transform in 2-D. */ +/* */ +static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int numres, DWT1DFN dwt_1D) { + dwt_t h; + dwt_t v; + + opj_tcd_resolution_t* tr = tilec->resolutions; + + int rw = tr->x1 - tr->x0; /* width of the resolution level computed */ + int rh = tr->y1 - tr->y0; /* height of the resolution level computed */ + + int w = tilec->x1 - tilec->x0; + + h.mem = opj_aligned_malloc(dwt_decode_max_resolution(tr, numres) * sizeof(int)); + v.mem = h.mem; + + while( --numres) { + int * restrict tiledp = tilec->data; + int j; + + ++tr; + h.sn = rw; + v.sn = rh; + + rw = tr->x1 - tr->x0; + rh = tr->y1 - tr->y0; + + h.dn = rw - h.sn; + h.cas = tr->x0 % 2; + + for(j = 0; j < rh; ++j) { + dwt_interleave_h(&h, &tiledp[j*w]); + (dwt_1D)(&h); + memcpy(&tiledp[j*w], h.mem, rw * sizeof(int)); + } + + v.dn = rh - v.sn; + v.cas = tr->y0 % 2; + + for(j = 0; j < rw; ++j){ + int k; + dwt_interleave_v(&v, &tiledp[j], w); + (dwt_1D)(&v); + for(k = 0; k < rh; ++k) { + tiledp[k * w + j] = v.mem[k]; + } + } + } + opj_aligned_free(h.mem); +} + +static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, int size){ + float* restrict bi = (float*) (w->wavelet + w->cas); + int count = w->sn; + int i, k; + for(k = 0; k < 2; ++k){ + if (count + 3 * x < size && ((int) a & 0x0f) == 0 && ((int) bi & 0x0f) == 0 && (x & 0x0f) == 0) { + /* Fast code path */ + for(i = 0; i < count; ++i){ + int j = i; + bi[i*8 ] = a[j]; + j += x; + bi[i*8 + 1] = a[j]; + j += x; + bi[i*8 + 2] = a[j]; + j += x; + bi[i*8 + 3] = a[j]; + } + } else { + /* Slow code path */ + for(i = 0; i < count; ++i){ + int j = i; + bi[i*8 ] = a[j]; + j += x; + if(j > size) continue; + bi[i*8 + 1] = a[j]; + j += x; + if(j > size) continue; + bi[i*8 + 2] = a[j]; + j += x; + if(j > size) continue; + bi[i*8 + 3] = a[j]; + } + } + bi = (float*) (w->wavelet + 1 - w->cas); + a += w->sn; + size -= w->sn; + count = w->dn; + } +} + +static void v4dwt_interleave_v(v4dwt_t* restrict v , float* restrict a , int x){ + v4* restrict bi = v->wavelet + v->cas; + int i; + for(i = 0; i < v->sn; ++i){ + memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float)); + } + a += v->sn * x; + bi = v->wavelet + 1 - v->cas; + for(i = 0; i < v->dn; ++i){ + memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float)); + } +} + +#ifdef __SSE__ + +static void v4dwt_decode_step1_sse(v4* w, int count, const __m128 c){ + __m128* restrict vw = (__m128*) w; + int i; + /* 4x unrolled loop */ + for(i = 0; i < count >> 2; ++i){ + *vw = _mm_mul_ps(*vw, c); + vw += 2; + *vw = _mm_mul_ps(*vw, c); + vw += 2; + *vw = _mm_mul_ps(*vw, c); + vw += 2; + *vw = _mm_mul_ps(*vw, c); + vw += 2; + } + count &= 3; + for(i = 0; i < count; ++i){ + *vw = _mm_mul_ps(*vw, c); + vw += 2; + } +} + +static void v4dwt_decode_step2_sse(v4* l, v4* w, int k, int m, __m128 c){ + __m128* restrict vl = (__m128*) l; + __m128* restrict vw = (__m128*) w; + int i; + __m128 tmp1, tmp2, tmp3; + tmp1 = vl[0]; + for(i = 0; i < m; ++i){ + tmp2 = vw[-1]; + tmp3 = vw[ 0]; + vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c)); + tmp1 = tmp3; + vw += 2; + } + vl = vw - 2; + if(m >= k){ + return; + } + c = _mm_add_ps(c, c); + c = _mm_mul_ps(c, vl[0]); + for(; m < k; ++m){ + __m128 tmp = vw[-1]; + vw[-1] = _mm_add_ps(tmp, c); + vw += 2; + } +} + +#else + +static void v4dwt_decode_step1(v4* w, int count, const float c){ + float* restrict fw = (float*) w; + int i; + for(i = 0; i < count; ++i){ + float tmp1 = fw[i*8 ]; + float tmp2 = fw[i*8 + 1]; + float tmp3 = fw[i*8 + 2]; + float tmp4 = fw[i*8 + 3]; + fw[i*8 ] = tmp1 * c; + fw[i*8 + 1] = tmp2 * c; + fw[i*8 + 2] = tmp3 * c; + fw[i*8 + 3] = tmp4 * c; + } +} + +static void v4dwt_decode_step2(v4* l, v4* w, int k, int m, float c){ + float* restrict fl = (float*) l; + float* restrict fw = (float*) w; + int i; + for(i = 0; i < m; ++i){ + float tmp1_1 = fl[0]; + float tmp1_2 = fl[1]; + float tmp1_3 = fl[2]; + float tmp1_4 = fl[3]; + float tmp2_1 = fw[-4]; + float tmp2_2 = fw[-3]; + float tmp2_3 = fw[-2]; + float tmp2_4 = fw[-1]; + float tmp3_1 = fw[0]; + float tmp3_2 = fw[1]; + float tmp3_3 = fw[2]; + float tmp3_4 = fw[3]; + fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c); + fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c); + fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c); + fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c); + fl = fw; + fw += 8; + } + if(m < k){ + float c1; + float c2; + float c3; + float c4; + c += c; + c1 = fl[0] * c; + c2 = fl[1] * c; + c3 = fl[2] * c; + c4 = fl[3] * c; + for(; m < k; ++m){ + float tmp1 = fw[-4]; + float tmp2 = fw[-3]; + float tmp3 = fw[-2]; + float tmp4 = fw[-1]; + fw[-4] = tmp1 + c1; + fw[-3] = tmp2 + c2; + fw[-2] = tmp3 + c3; + fw[-1] = tmp4 + c4; + fw += 8; + } + } +} + +#endif + +/* */ +/* Inverse 9-7 wavelet transform in 1-D. */ +/* */ +static void v4dwt_decode(v4dwt_t* restrict dwt){ + int a, b; + if(dwt->cas == 0) { + if(!((dwt->dn > 0) || (dwt->sn > 1))){ + return; + } + a = 0; + b = 1; + }else{ + if(!((dwt->sn > 0) || (dwt->dn > 1))) { + return; + } + a = 1; + b = 0; + } +#ifdef __SSE__ + v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(K)); + v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(c13318)); + v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_delta)); + v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_gamma)); + v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_beta)); + v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_alpha)); +#else + v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, K); + v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, c13318); + v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_delta); + v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_gamma); + v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_beta); + v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_alpha); +#endif +} + +/* */ +/* Inverse 9-7 wavelet transform in 2-D. */ +/* */ +void dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, int numres){ + v4dwt_t h; + v4dwt_t v; + + opj_tcd_resolution_t* res = tilec->resolutions; + + int rw = res->x1 - res->x0; /* width of the resolution level computed */ + int rh = res->y1 - res->y0; /* height of the resolution level computed */ + + int w = tilec->x1 - tilec->x0; + + h.wavelet = (v4*) opj_aligned_malloc((dwt_decode_max_resolution(res, numres)+5) * sizeof(v4)); + v.wavelet = h.wavelet; + + while( --numres) { + float * restrict aj = (float*) tilec->data; + int bufsize = (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0); + int j; + + h.sn = rw; + v.sn = rh; + + ++res; + + rw = res->x1 - res->x0; /* width of the resolution level computed */ + rh = res->y1 - res->y0; /* height of the resolution level computed */ + + h.dn = rw - h.sn; + h.cas = res->x0 % 2; + + for(j = rh; j > 3; j -= 4){ + int k; + v4dwt_interleave_h(&h, aj, w, bufsize); + v4dwt_decode(&h); + for(k = rw; --k >= 0;){ + aj[k ] = h.wavelet[k].f[0]; + aj[k+w ] = h.wavelet[k].f[1]; + aj[k+w*2] = h.wavelet[k].f[2]; + aj[k+w*3] = h.wavelet[k].f[3]; + } + aj += w*4; + bufsize -= w*4; + } + if (rh & 0x03) { + int k; + j = rh & 0x03; + v4dwt_interleave_h(&h, aj, w, bufsize); + v4dwt_decode(&h); + for(k = rw; --k >= 0;){ + switch(j) { + case 3: aj[k+w*2] = h.wavelet[k].f[2]; + case 2: aj[k+w ] = h.wavelet[k].f[1]; + case 1: aj[k ] = h.wavelet[k].f[0]; + } + } + } + + v.dn = rh - v.sn; + v.cas = res->y0 % 2; + + aj = (float*) tilec->data; + for(j = rw; j > 3; j -= 4){ + int k; + v4dwt_interleave_v(&v, aj, w); + v4dwt_decode(&v); + for(k = 0; k < rh; ++k){ + memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(float)); + } + aj += 4; + } + if (rw & 0x03){ + int k; + j = rw & 0x03; + v4dwt_interleave_v(&v, aj, w); + v4dwt_decode(&v); + for(k = 0; k < rh; ++k){ + memcpy(&aj[k*w], &v.wavelet[k], j * sizeof(float)); + } + } + } + + opj_aligned_free(h.wavelet); +} + diff --git a/contrib/media/updf_newlib/libopenjpeg/dwt.h b/contrib/media/updf_newlib/libopenjpeg/dwt.h new file mode 100755 index 000000000..adf73e544 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/dwt.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __DWT_H +#define __DWT_H +/** +@file dwt.h +@brief Implementation of a discrete wavelet transform (DWT) + +The functions in DWT.C have for goal to realize forward and inverse discret wavelet +transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in +DWT.C are used by some function in TCD.C. +*/ + +/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ +/*@{*/ + + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Forward 5-3 wavelet tranform in 2-D. +Apply a reversible DWT transform to a component of an image. +@param tilec Tile component information (current tile) +*/ +void dwt_encode(opj_tcd_tilecomp_t * tilec); +/** +Inverse 5-3 wavelet tranform in 2-D. +Apply a reversible inverse DWT transform to a component of an image. +@param tilec Tile component information (current tile) +@param numres Number of resolution levels to decode +*/ +void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres); +/** +Get the gain of a subband for the reversible 5-3 DWT. +@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) +@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise +*/ +int dwt_getgain(int orient); +/** +Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT. +@param level Level of the wavelet function +@param orient Band of the wavelet function +@return Returns the norm of the wavelet function +*/ +double dwt_getnorm(int level, int orient); +/** +Forward 9-7 wavelet transform in 2-D. +Apply an irreversible DWT transform to a component of an image. +@param tilec Tile component information (current tile) +*/ +void dwt_encode_real(opj_tcd_tilecomp_t * tilec); +/** +Inverse 9-7 wavelet transform in 2-D. +Apply an irreversible inverse DWT transform to a component of an image. +@param tilec Tile component information (current tile) +@param numres Number of resolution levels to decode +*/ +void dwt_decode_real(opj_tcd_tilecomp_t* tilec, int numres); +/** +Get the gain of a subband for the irreversible 9-7 DWT. +@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) +@return Returns the gain of the 9-7 wavelet transform +*/ +int dwt_getgain_real(int orient); +/** +Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT +@param level Level of the wavelet function +@param orient Band of the wavelet function +@return Returns the norm of the 9-7 wavelet +*/ +double dwt_getnorm_real(int level, int orient); +/** +Explicit calculation of the Quantization Stepsizes +@param tccp Tile-component coding parameters +@param prec Precint analyzed +*/ +void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __DWT_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/event.c b/contrib/media/updf_newlib/libopenjpeg/event.c new file mode 100755 index 000000000..953a9973e --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/event.c @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +/* ========================================================== + Utility functions + ==========================================================*/ + +#ifndef _WIN32 +static char* +i2a(unsigned i, char *a, unsigned r) { + if (i/r > 0) a = i2a(i/r,a,r); + *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r]; + return a+1; +} + +/** + Transforms integer i into an ascii string and stores the result in a; + string is encoded in the base indicated by r. + @param i Number to be converted + @param a String result + @param r Base of value; must be in the range 2 - 36 + @return Returns a +*/ +static char * +_itoa(int i, char *a, int r) { + r = ((r < 2) || (r > 36)) ? 10 : r; + if(i < 0) { + *a = '-'; + *i2a(-i, a+1, r) = 0; + } + else *i2a(i, a, r) = 0; + return a; +} + +#endif /* !_WIN32 */ + +/* ----------------------------------------------------------------------- */ + +opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) { + if(cinfo) { + opj_event_mgr_t *previous = cinfo->event_mgr; + cinfo->event_mgr = event_mgr; + cinfo->client_data = context; + return previous; + } + + return NULL; +} + +bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) { +#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */ + opj_msg_callback msg_handler = NULL; + + opj_event_mgr_t *event_mgr = cinfo->event_mgr; + if(event_mgr != NULL) { + switch(event_type) { + case EVT_ERROR: + msg_handler = event_mgr->error_handler; + break; + case EVT_WARNING: + msg_handler = event_mgr->warning_handler; + break; + case EVT_INFO: + msg_handler = event_mgr->info_handler; + break; + default: + break; + } + if(msg_handler == NULL) { + return false; + } + } else { + return false; + } + + if ((fmt != NULL) && (event_mgr != NULL)) { + va_list arg; + int str_length/*, i, j*/; /* UniPG */ + char message[MSG_SIZE]; + memset(message, 0, MSG_SIZE); + /* initialize the optional parameter list */ + va_start(arg, fmt); + /* check the length of the format string */ + str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt); + /* parse the format string and put the result in 'message' */ + vsprintf(message, fmt, arg); /* UniPG */ + /* deinitialize the optional parameter list */ + va_end(arg); + + /* output the message to the user program */ + msg_handler(message, cinfo->client_data); + } + + return true; +} + diff --git a/contrib/media/updf_newlib/libopenjpeg/event.h b/contrib/media/updf_newlib/libopenjpeg/event.h new file mode 100755 index 000000000..11910b0e4 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/event.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __EVENT_H +#define __EVENT_H +/** +@file event.h +@brief Implementation of a event callback system + +The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user. +*/ + +#define EVT_ERROR 1 /**< Error event type */ +#define EVT_WARNING 2 /**< Warning event type */ +#define EVT_INFO 4 /**< Debug event type */ + +/** @defgroup EVENT EVENT - Implementation of a event callback system */ +/*@{*/ + +/** @name Exported functions (see also openjpeg.h) */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Write formatted data to a string and send the string to a user callback. +@param cinfo Codec context info +@param event_type Event type or callback to use to send the message +@param fmt Format-control string (plus optionnal arguments) +@return Returns true if successful, returns false otherwise +*/ +bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __EVENT_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/fix.h b/contrib/media/updf_newlib/libopenjpeg/fix.h new file mode 100755 index 000000000..bcb2acb54 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/fix.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __FIX_H +#define __FIX_H + +#if defined(_MSC_VER) || defined(__BORLANDC__) +#define int64 __int64 +#else +#define int64 long long +#endif + +/** +@file fix.h +@brief Implementation of operations of specific multiplication (FIX) + +The functions in FIX.H have for goal to realize specific multiplication. +*/ + +/** @defgroup FIX FIX - Implementation of operations of specific multiplication */ +/*@{*/ + +/** +Multiply two fixed-precision rational numbers. +@param a +@param b +@return Returns a * b +*/ +static INLINE int fix_mul(int a, int b) { + int64 temp = (int64) a * (int64) b ; + temp += temp & 4096; + return (int) (temp >> 13) ; +} + +/*@}*/ + +#endif /* __FIX_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/image.c b/contrib/media/updf_newlib/libopenjpeg/image.c new file mode 100755 index 000000000..30b7d139e --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/image.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +opj_image_t* opj_image_create0(void) { + opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t)); + return image; +} + +opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) { + int compno; + opj_image_t *image = NULL; + + image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t)); + if(image) { + image->color_space = clrspc; + image->numcomps = numcmpts; + /* allocate memory for the per-component information */ + image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t)); + if(!image->comps) { + fprintf(stderr,"Unable to allocate memory for image.\n"); + opj_image_destroy(image); + return NULL; + } + /* create the individual image components */ + for(compno = 0; compno < numcmpts; compno++) { + opj_image_comp_t *comp = &image->comps[compno]; + comp->dx = cmptparms[compno].dx; + comp->dy = cmptparms[compno].dy; + comp->w = cmptparms[compno].w; + comp->h = cmptparms[compno].h; + comp->x0 = cmptparms[compno].x0; + comp->y0 = cmptparms[compno].y0; + comp->prec = cmptparms[compno].prec; + comp->bpp = cmptparms[compno].bpp; + comp->sgnd = cmptparms[compno].sgnd; + comp->data = (int*) opj_calloc(comp->w * comp->h, sizeof(int)); + if(!comp->data) { + fprintf(stderr,"Unable to allocate memory for image.\n"); + opj_image_destroy(image); + return NULL; + } + } + } + + return image; +} + +void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) { + int i; + if(image) { + if(image->comps) { + /* image components */ + for(i = 0; i < image->numcomps; i++) { + opj_image_comp_t *image_comp = &image->comps[i]; + if(image_comp->data) { + opj_free(image_comp->data); + } + } + opj_free(image->comps); + } + opj_free(image); + } +} + diff --git a/contrib/media/updf_newlib/libopenjpeg/image.h b/contrib/media/updf_newlib/libopenjpeg/image.h new file mode 100755 index 000000000..04c362eb8 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/image.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __IMAGE_H +#define __IMAGE_H +/** +@file image.h +@brief Implementation of operations on images (IMAGE) + +The functions in IMAGE.C have for goal to realize operations on images. +*/ + +/** @defgroup IMAGE IMAGE - Implementation of operations on images */ +/*@{*/ + +/** +Create an empty image +@todo this function should be removed +@return returns an empty image if successful, returns NULL otherwise +*/ +opj_image_t* opj_image_create0(void); + +/*@}*/ + +#endif /* __IMAGE_H */ + diff --git a/contrib/media/updf_newlib/libopenjpeg/int.h b/contrib/media/updf_newlib/libopenjpeg/int.h new file mode 100755 index 000000000..4e5fe08eb --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/int.h @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __INT_H +#define __INT_H +/** +@file int.h +@brief Implementation of operations on integers (INT) + +The functions in INT.H have for goal to realize operations on integers. +*/ + +/** @defgroup INT INT - Implementation of operations on integers */ +/*@{*/ + +/** @name Exported functions (see also openjpeg.h) */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Get the minimum of two integers +@return Returns a if a < b else b +*/ +static INLINE int int_min(int a, int b) { + return a < b ? a : b; +} +/** +Get the maximum of two integers +@return Returns a if a > b else b +*/ +static INLINE int int_max(int a, int b) { + return (a > b) ? a : b; +} +/** +Clamp an integer inside an interval +@return +
      +
    • Returns a if (min < a < max) +
    • Returns max if (a > max) +
    • Returns min if (a < min) +
    +*/ +static INLINE int int_clamp(int a, int min, int max) { + if (a < min) + return min; + if (a > max) + return max; + return a; +} +/** +@return Get absolute value of integer +*/ +static INLINE int int_abs(int a) { + return a < 0 ? -a : a; +} +/** +Divide an integer and round upwards +@return Returns a divided by b +*/ +static INLINE int int_ceildiv(int a, int b) { + return (a + b - 1) / b; +} +/** +Divide an integer by a power of 2 and round upwards +@return Returns a divided by 2^b +*/ +static INLINE int int_ceildivpow2(int a, int b) { + return (a + (1 << b) - 1) >> b; +} +/** +Divide an integer by a power of 2 and round downwards +@return Returns a divided by 2^b +*/ +static INLINE int int_floordivpow2(int a, int b) { + return a >> b; +} +/** +Get logarithm of an integer and round downwards +@return Returns log2(a) +*/ +static INLINE int int_floorlog2(int a) { + int l; + for (l = 0; a > 1; l++) { + a >>= 1; + } + return l; +} +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif diff --git a/contrib/media/updf_newlib/libopenjpeg/j2k.c b/contrib/media/updf_newlib/libopenjpeg/j2k.c new file mode 100755 index 000000000..de1c2067d --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/j2k.c @@ -0,0 +1,2434 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Write the SOC marker (Start Of Codestream) +@param j2k J2K handle +*/ +static void j2k_write_soc(opj_j2k_t *j2k); +/** +Read the SOC marker (Start of Codestream) +@param j2k J2K handle +*/ +static void j2k_read_soc(opj_j2k_t *j2k); +/** +Write the SIZ marker (image and tile size) +@param j2k J2K handle +*/ +static void j2k_write_siz(opj_j2k_t *j2k); +/** +Read the SIZ marker (image and tile size) +@param j2k J2K handle +*/ +static void j2k_read_siz(opj_j2k_t *j2k); +/** +Write the COM marker (comment) +@param j2k J2K handle +*/ +static void j2k_write_com(opj_j2k_t *j2k); +/** +Read the COM marker (comment) +@param j2k J2K handle +*/ +static void j2k_read_com(opj_j2k_t *j2k); +/** +Write the value concerning the specified component in the marker COD and COC +@param j2k J2K handle +@param compno Number of the component concerned by the information written +*/ +static void j2k_write_cox(opj_j2k_t *j2k, int compno); +/** +Read the value concerning the specified component in the marker COD and COC +@param j2k J2K handle +@param compno Number of the component concerned by the information read +*/ +static void j2k_read_cox(opj_j2k_t *j2k, int compno); +/** +Write the COD marker (coding style default) +@param j2k J2K handle +*/ +static void j2k_write_cod(opj_j2k_t *j2k); +/** +Read the COD marker (coding style default) +@param j2k J2K handle +*/ +static void j2k_read_cod(opj_j2k_t *j2k); +/** +Write the COC marker (coding style component) +@param j2k J2K handle +@param compno Number of the component concerned by the information written +*/ +static void j2k_write_coc(opj_j2k_t *j2k, int compno); +/** +Read the COC marker (coding style component) +@param j2k J2K handle +*/ +static void j2k_read_coc(opj_j2k_t *j2k); +/** +Write the value concerning the specified component in the marker QCD and QCC +@param j2k J2K handle +@param compno Number of the component concerned by the information written +*/ +static void j2k_write_qcx(opj_j2k_t *j2k, int compno); +/** +Read the value concerning the specified component in the marker QCD and QCC +@param j2k J2K handle +@param compno Number of the component concern by the information read +@param len Length of the information in the QCX part of the marker QCD/QCC +*/ +static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len); +/** +Write the QCD marker (quantization default) +@param j2k J2K handle +*/ +static void j2k_write_qcd(opj_j2k_t *j2k); +/** +Read the QCD marker (quantization default) +@param j2k J2K handle +*/ +static void j2k_read_qcd(opj_j2k_t *j2k); +/** +Write the QCC marker (quantization component) +@param j2k J2K handle +@param compno Number of the component concerned by the information written +*/ +static void j2k_write_qcc(opj_j2k_t *j2k, int compno); +/** +Read the QCC marker (quantization component) +@param j2k J2K handle +*/ +static void j2k_read_qcc(opj_j2k_t *j2k); +/** +Write the POC marker (progression order change) +@param j2k J2K handle +*/ +static void j2k_write_poc(opj_j2k_t *j2k); +/** +Read the POC marker (progression order change) +@param j2k J2K handle +*/ +static void j2k_read_poc(opj_j2k_t *j2k); +/** +Read the CRG marker (component registration) +@param j2k J2K handle +*/ +static void j2k_read_crg(opj_j2k_t *j2k); +/** +Read the TLM marker (tile-part lengths) +@param j2k J2K handle +*/ +static void j2k_read_tlm(opj_j2k_t *j2k); +/** +Read the PLM marker (packet length, main header) +@param j2k J2K handle +*/ +static void j2k_read_plm(opj_j2k_t *j2k); +/** +Read the PLT marker (packet length, tile-part header) +@param j2k J2K handle +*/ +static void j2k_read_plt(opj_j2k_t *j2k); +/** +Read the PPM marker (packet packet headers, main header) +@param j2k J2K handle +*/ +static void j2k_read_ppm(opj_j2k_t *j2k); +/** +Read the PPT marker (packet packet headers, tile-part header) +@param j2k J2K handle +*/ +static void j2k_read_ppt(opj_j2k_t *j2k); +/** +Write the TLM marker (Mainheader) +@param j2k J2K handle +*/ +static void j2k_write_tlm(opj_j2k_t *j2k); +/** +Write the SOT marker (start of tile-part) +@param j2k J2K handle +*/ +static void j2k_write_sot(opj_j2k_t *j2k); +/** +Read the SOT marker (start of tile-part) +@param j2k J2K handle +*/ +static void j2k_read_sot(opj_j2k_t *j2k); +/** +Write the SOD marker (start of data) +@param j2k J2K handle +@param tile_coder Pointer to a TCD handle +*/ +static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder); +/** +Read the SOD marker (start of data) +@param j2k J2K handle +*/ +static void j2k_read_sod(opj_j2k_t *j2k); +/** +Write the RGN marker (region-of-interest) +@param j2k J2K handle +@param compno Number of the component concerned by the information written +@param tileno Number of the tile concerned by the information written +*/ +static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno); +/** +Read the RGN marker (region-of-interest) +@param j2k J2K handle +*/ +static void j2k_read_rgn(opj_j2k_t *j2k); +/** +Write the EOC marker (end of codestream) +@param j2k J2K handle +*/ +static void j2k_write_eoc(opj_j2k_t *j2k); +/** +Read the EOC marker (end of codestream) +@param j2k J2K handle +*/ +static void j2k_read_eoc(opj_j2k_t *j2k); +/** +Read an unknown marker +@param j2k J2K handle +*/ +static void j2k_read_unk(opj_j2k_t *j2k); + +/*@}*/ + +/*@}*/ + +/* ----------------------------------------------------------------------- */ +typedef struct j2k_prog_order{ + OPJ_PROG_ORDER enum_prog; + char str_prog[4]; +}j2k_prog_order_t; + +j2k_prog_order_t j2k_prog_order_list[] = { + {CPRL, "CPRL"}, + {LRCP, "LRCP"}, + {PCRL, "PCRL"}, + {RLCP, "RLCP"}, + {RPCL, "RPCL"}, + {(OPJ_PROG_ORDER)-1, ""} +}; + +char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){ + j2k_prog_order_t *po; + for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){ + if(po->enum_prog == prg_order){ + break; + } + } + return po->str_prog; +} + +/* ----------------------------------------------------------------------- */ +static int j2k_get_num_tp(opj_cp_t *cp,int pino,int tileno){ + char *prog; + int i; + int tpnum=1,tpend=0; + opj_tcp_t *tcp = &cp->tcps[tileno]; + prog = j2k_convert_progression_order(tcp->prg); + + if(cp->tp_on == 1){ + for(i=0;i<4;i++){ + if(tpend!=1){ + if( cp->tp_flag == prog[i] ){ + tpend=1;cp->tp_pos=i; + } + switch(prog[i]){ + case 'C': + tpnum= tpnum * tcp->pocs[pino].compE; + break; + case 'R': + tpnum= tpnum * tcp->pocs[pino].resE; + break; + case 'P': + tpnum= tpnum * tcp->pocs[pino].prcE; + break; + case 'L': + tpnum= tpnum * tcp->pocs[pino].layE; + break; + } + } + } + }else{ + tpnum=1; + } + return tpnum; +} + +/** mem allocation for TLM marker*/ +int j2k_calculate_tp(opj_cp_t *cp,int img_numcomp,opj_image_t *image,opj_j2k_t *j2k ){ + int pino,tileno,totnum_tp=0; + j2k->cur_totnum_tp = (int *) opj_malloc(cp->tw * cp->th * sizeof(int)); + for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { + int cur_totnum_tp = 0; + opj_tcp_t *tcp = &cp->tcps[tileno]; + for(pino = 0; pino <= tcp->numpocs; pino++) { + int tp_num=0; + opj_pi_iterator_t *pi = pi_initialise_encode(image, cp, tileno,FINAL_PASS); + if(!pi) { return -1;} + tp_num = j2k_get_num_tp(cp,pino,tileno); + totnum_tp = totnum_tp + tp_num; + cur_totnum_tp = cur_totnum_tp + tp_num; + pi_destroy(pi, cp, tileno); + } + j2k->cur_totnum_tp[tileno] = cur_totnum_tp; + /* INDEX >> */ + if (j2k->cstr_info) { + j2k->cstr_info->tile[tileno].num_tps = cur_totnum_tp; + j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t)); + } + /* << INDEX */ + } + return totnum_tp; +} + +static void j2k_write_soc(opj_j2k_t *j2k) { + opj_cio_t *cio = j2k->cio; + cio_write(cio, J2K_MS_SOC, 2); + +/* UniPG>> */ +#ifdef USE_JPWL + + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio) - 2, 2); + +#endif /* USE_JPWL */ +/* <state = J2K_STATE_MHSIZ; + /* Index */ + if (j2k->cstr_info) { + j2k->cstr_info->main_head_start = cio_tell(j2k->cio) - 2; + j2k->cstr_info->codestream_size = cio_numbytesleft(j2k->cio) + 2 - j2k->cstr_info->main_head_start; + } +} + +static void j2k_write_siz(opj_j2k_t *j2k) { + int i; + int lenp, len; + + opj_cio_t *cio = j2k->cio; + opj_image_t *image = j2k->image; + opj_cp_t *cp = j2k->cp; + + cio_write(cio, J2K_MS_SIZ, 2); /* SIZ */ + lenp = cio_tell(cio); + cio_skip(cio, 2); + cio_write(cio, cp->rsiz, 2); /* Rsiz (capabilities) */ + cio_write(cio, image->x1, 4); /* Xsiz */ + cio_write(cio, image->y1, 4); /* Ysiz */ + cio_write(cio, image->x0, 4); /* X0siz */ + cio_write(cio, image->y0, 4); /* Y0siz */ + cio_write(cio, cp->tdx, 4); /* XTsiz */ + cio_write(cio, cp->tdy, 4); /* YTsiz */ + cio_write(cio, cp->tx0, 4); /* XT0siz */ + cio_write(cio, cp->ty0, 4); /* YT0siz */ + cio_write(cio, image->numcomps, 2); /* Csiz */ + for (i = 0; i < image->numcomps; i++) { + cio_write(cio, image->comps[i].prec - 1 + (image->comps[i].sgnd << 7), 1); /* Ssiz_i */ + cio_write(cio, image->comps[i].dx, 1); /* XRsiz_i */ + cio_write(cio, image->comps[i].dy, 1); /* YRsiz_i */ + } + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lsiz */ + cio_seek(cio, lenp + len); +} + +static void j2k_read_siz(opj_j2k_t *j2k) { + int len, i; + + opj_cio_t *cio = j2k->cio; + opj_image_t *image = j2k->image; + opj_cp_t *cp = j2k->cp; + + len = cio_read(cio, 2); /* Lsiz */ + cio_read(cio, 2); /* Rsiz (capabilities) */ + image->x1 = cio_read(cio, 4); /* Xsiz */ + image->y1 = cio_read(cio, 4); /* Ysiz */ + image->x0 = cio_read(cio, 4); /* X0siz */ + image->y0 = cio_read(cio, 4); /* Y0siz */ + cp->tdx = cio_read(cio, 4); /* XTsiz */ + cp->tdy = cio_read(cio, 4); /* YTsiz */ + cp->tx0 = cio_read(cio, 4); /* XT0siz */ + cp->ty0 = cio_read(cio, 4); /* YT0siz */ + + if ((image->x0<0)||(image->x1<0)||(image->y0<0)||(image->y1<0)) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "%s: invalid image size (x0:%d, x1:%d, y0:%d, y1:%d)\n", + image->x0,image->x1,image->y0,image->y1); + return; + } + + image->numcomps = cio_read(cio, 2); /* Csiz */ + +#ifdef USE_JPWL + if (j2k->cp->correct) { + /* if JPWL is on, we check whether TX errors have damaged + too much the SIZ parameters */ + if (!(image->x1 * image->y1)) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: bad image size (%d x %d)\n", + image->x1, image->y1); + if (!JPWL_ASSUME || JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + } + if (image->numcomps != ((len - 38) / 3)) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n", + image->numcomps, ((len - 38) / 3)); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"); + if (image->numcomps < ((len - 38) / 3)) { + len = 38 + 3 * image->numcomps; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n", + len); + } else { + image->numcomps = ((len - 38) / 3); + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n", + image->numcomps); + } + } + + /* update components number in the jpwl_exp_comps filed */ + cp->exp_comps = image->numcomps; + } +#endif /* USE_JPWL */ + + image->comps = (opj_image_comp_t*) opj_calloc(image->numcomps, sizeof(opj_image_comp_t)); + for (i = 0; i < image->numcomps; i++) { + int tmp, w, h; + tmp = cio_read(cio, 1); /* Ssiz_i */ + image->comps[i].prec = (tmp & 0x7f) + 1; + image->comps[i].sgnd = tmp >> 7; + image->comps[i].dx = cio_read(cio, 1); /* XRsiz_i */ + image->comps[i].dy = cio_read(cio, 1); /* YRsiz_i */ + +#ifdef USE_JPWL + if (j2k->cp->correct) { + /* if JPWL is on, we check whether TX errors have damaged + too much the SIZ parameters, again */ + if (!(image->comps[i].dx * image->comps[i].dy)) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n", + i, i, image->comps[i].dx, image->comps[i].dy); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"); + if (!image->comps[i].dx) { + image->comps[i].dx = 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n", + i, image->comps[i].dx); + } + if (!image->comps[i].dy) { + image->comps[i].dy = 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n", + i, image->comps[i].dy); + } + } + + } +#endif /* USE_JPWL */ + + /* TODO: unused ? */ + w = int_ceildiv(image->x1 - image->x0, image->comps[i].dx); + h = int_ceildiv(image->y1 - image->y0, image->comps[i].dy); + + image->comps[i].resno_decoded = 0; /* number of resolution decoded */ + image->comps[i].factor = cp->reduce; /* reducing factor per component */ + } + + cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx); + cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy); + +#ifdef USE_JPWL + if (j2k->cp->correct) { + /* if JPWL is on, we check whether TX errors have damaged + too much the SIZ parameters */ + if ((cp->tw < 1) || (cp->th < 1) || (cp->tw > cp->max_tiles) || (cp->th > cp->max_tiles)) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: bad number of tiles (%d x %d)\n", + cp->tw, cp->th); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"); + if (cp->tw < 1) { + cp->tw= 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n", + cp->tw); + } + if (cp->tw > cp->max_tiles) { + cp->tw= 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large x, increase expectance of %d\n" + "- setting %d tiles in x => HYPOTHESIS!!!\n", + cp->max_tiles, cp->tw); + } + if (cp->th < 1) { + cp->th= 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n", + cp->th); + } + if (cp->th > cp->max_tiles) { + cp->th= 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large y, increase expectance of %d to continue\n", + "- setting %d tiles in y => HYPOTHESIS!!!\n", + cp->max_tiles, cp->th); + } + } + } +#endif /* USE_JPWL */ + + cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); + cp->tileno = (int*) opj_malloc(cp->tw * cp->th * sizeof(int)); + cp->tileno_size = 0; + +#ifdef USE_JPWL + if (j2k->cp->correct) { + if (!cp->tcps) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: could not alloc tcps field of cp\n"); + if (!JPWL_ASSUME || JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + } + } +#endif /* USE_JPWL */ + + for (i = 0; i < cp->tw * cp->th; i++) { + cp->tcps[i].POC = 0; + cp->tcps[i].numpocs = 0; + cp->tcps[i].first = 1; + } + + /* Initialization for PPM marker */ + cp->ppm = 0; + cp->ppm_data = NULL; + cp->ppm_data_first = NULL; + cp->ppm_previous = 0; + cp->ppm_store = 0; + + j2k->default_tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t)); + for (i = 0; i < cp->tw * cp->th; i++) { + cp->tcps[i].tccps = (opj_tccp_t*) opj_malloc(image->numcomps * sizeof(opj_tccp_t)); + } + j2k->tile_data = (unsigned char**) opj_calloc(cp->tw * cp->th, sizeof(unsigned char*)); + j2k->tile_len = (int*) opj_calloc(cp->tw * cp->th, sizeof(int)); + j2k->state = J2K_STATE_MH; + + /* Index */ + if (j2k->cstr_info) { + opj_codestream_info_t *cstr_info = j2k->cstr_info; + cstr_info->image_w = image->x1 - image->x0; + cstr_info->image_h = image->y1 - image->y0; + cstr_info->numcomps = image->numcomps; + cstr_info->tw = cp->tw; + cstr_info->th = cp->th; + cstr_info->tile_x = cp->tdx; + cstr_info->tile_y = cp->tdy; + cstr_info->tile_Ox = cp->tx0; + cstr_info->tile_Oy = cp->ty0; + cstr_info->tile = (opj_tile_info_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tile_info_t)); + } +} + +static void j2k_write_com(opj_j2k_t *j2k) { + unsigned int i; + int lenp, len; + + if(j2k->cp->comment) { + opj_cio_t *cio = j2k->cio; + char *comment = j2k->cp->comment; + + cio_write(cio, J2K_MS_COM, 2); + lenp = cio_tell(cio); + cio_skip(cio, 2); + cio_write(cio, 1, 2); /* General use (IS 8859-15:1999 (Latin) values) */ + for (i = 0; i < strlen(comment); i++) { + cio_write(cio, comment[i], 1); + } + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); + cio_seek(cio, lenp + len); + } +} + +static void j2k_read_com(opj_j2k_t *j2k) { + int len; + + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); + cio_skip(cio, len - 2); +} + +static void j2k_write_cox(opj_j2k_t *j2k, int compno) { + int i; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_cio_t *cio = j2k->cio; + + cio_write(cio, tccp->numresolutions - 1, 1); /* SPcox (D) */ + cio_write(cio, tccp->cblkw - 2, 1); /* SPcox (E) */ + cio_write(cio, tccp->cblkh - 2, 1); /* SPcox (F) */ + cio_write(cio, tccp->cblksty, 1); /* SPcox (G) */ + cio_write(cio, tccp->qmfbid, 1); /* SPcox (H) */ + + if (tccp->csty & J2K_CCP_CSTY_PRT) { + for (i = 0; i < tccp->numresolutions; i++) { + cio_write(cio, tccp->prcw[i] + (tccp->prch[i] << 4), 1); /* SPcox (I_i) */ + } + } +} + +static void j2k_read_cox(opj_j2k_t *j2k, int compno) { + int i; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_cio_t *cio = j2k->cio; + + tccp->numresolutions = cio_read(cio, 1) + 1; /* SPcox (D) */ + + // If user wants to remove more resolutions than the codestream contains, return error + if (cp->reduce >= tccp->numresolutions) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number " + "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno); + j2k->state |= J2K_STATE_ERR; + } + + tccp->cblkw = cio_read(cio, 1) + 2; /* SPcox (E) */ + tccp->cblkh = cio_read(cio, 1) + 2; /* SPcox (F) */ + tccp->cblksty = cio_read(cio, 1); /* SPcox (G) */ + tccp->qmfbid = cio_read(cio, 1); /* SPcox (H) */ + if (tccp->csty & J2K_CP_CSTY_PRT) { + for (i = 0; i < tccp->numresolutions; i++) { + int tmp = cio_read(cio, 1); /* SPcox (I_i) */ + tccp->prcw[i] = tmp & 0xf; + tccp->prch[i] = tmp >> 4; + } + } + + /* INDEX >> */ + if(j2k->cstr_info && compno == 0) { + for (i = 0; i < tccp->numresolutions; i++) { + if (tccp->csty & J2K_CP_CSTY_PRT) { + j2k->cstr_info->tile[j2k->curtileno].pdx[i] = tccp->prcw[i]; + j2k->cstr_info->tile[j2k->curtileno].pdy[i] = tccp->prch[i]; + } + else { + j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15; + j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15; + } + } + } + /* << INDEX */ +} + +static void j2k_write_cod(opj_j2k_t *j2k) { + opj_cp_t *cp = NULL; + opj_tcp_t *tcp = NULL; + int lenp, len; + + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_COD, 2); /* COD */ + + lenp = cio_tell(cio); + cio_skip(cio, 2); + + cp = j2k->cp; + tcp = &cp->tcps[j2k->curtileno]; + + cio_write(cio, tcp->csty, 1); /* Scod */ + cio_write(cio, tcp->prg, 1); /* SGcod (A) */ + cio_write(cio, tcp->numlayers, 2); /* SGcod (B) */ + cio_write(cio, tcp->mct, 1); /* SGcod (C) */ + + j2k_write_cox(j2k, 0); + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lcod */ + cio_seek(cio, lenp + len); +} + +static void j2k_read_cod(opj_j2k_t *j2k) { + int len, i, pos; + + opj_cio_t *cio = j2k->cio; + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_image_t *image = j2k->image; + + len = cio_read(cio, 2); /* Lcod */ + tcp->csty = cio_read(cio, 1); /* Scod */ + tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* SGcod (A) */ + tcp->numlayers = cio_read(cio, 2); /* SGcod (B) */ + tcp->mct = cio_read(cio, 1); /* SGcod (C) */ + + pos = cio_tell(cio); + for (i = 0; i < image->numcomps; i++) { + tcp->tccps[i].csty = tcp->csty & J2K_CP_CSTY_PRT; + cio_seek(cio, pos); + j2k_read_cox(j2k, i); + } + + /* Index */ + if (j2k->cstr_info) { + opj_codestream_info_t *cstr_info = j2k->cstr_info; + cstr_info->prog = tcp->prg; + cstr_info->numlayers = tcp->numlayers; + cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int)); + for (i = 0; i < image->numcomps; i++) { + cstr_info->numdecompos[i] = tcp->tccps[i].numresolutions - 1; + } + } +} + +static void j2k_write_coc(opj_j2k_t *j2k, int compno) { + int lenp, len; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; + opj_image_t *image = j2k->image; + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_COC, 2); /* COC */ + lenp = cio_tell(cio); + cio_skip(cio, 2); + cio_write(cio, compno, image->numcomps <= 256 ? 1 : 2); /* Ccoc */ + cio_write(cio, tcp->tccps[compno].csty, 1); /* Scoc */ + j2k_write_cox(j2k, compno); + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lcoc */ + cio_seek(cio, lenp + len); +} + +static void j2k_read_coc(opj_j2k_t *j2k) { + int len, compno; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_image_t *image = j2k->image; + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); /* Lcoc */ + compno = cio_read(cio, image->numcomps <= 256 ? 1 : 2); /* Ccoc */ + tcp->tccps[compno].csty = cio_read(cio, 1); /* Scoc */ + j2k_read_cox(j2k, compno); +} + +static void j2k_write_qcx(opj_j2k_t *j2k, int compno) { + int bandno, numbands; + int expn, mant; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_cio_t *cio = j2k->cio; + + cio_write(cio, tccp->qntsty + (tccp->numgbits << 5), 1); /* Sqcx */ + numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2; + + for (bandno = 0; bandno < numbands; bandno++) { + expn = tccp->stepsizes[bandno].expn; + mant = tccp->stepsizes[bandno].mant; + + if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { + cio_write(cio, expn << 3, 1); /* SPqcx_i */ + } else { + cio_write(cio, (expn << 11) + mant, 2); /* SPqcx_i */ + } + } +} + +static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len) { + int tmp; + int bandno, numbands; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_cio_t *cio = j2k->cio; + + tmp = cio_read(cio, 1); /* Sqcx */ + tccp->qntsty = tmp & 0x1f; + tccp->numgbits = tmp >> 5; + numbands = (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? + 1 : ((tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ? len - 1 : (len - 1) / 2); + +#ifdef USE_JPWL + if (j2k->cp->correct) { + + /* if JPWL is on, we check whether there are too many subbands */ + if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) { + opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, + "JPWL: bad number of subbands in Sqcx (%d)\n", + numbands); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + numbands = 1; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n" + "- setting number of bands to %d => HYPOTHESIS!!!\n", + numbands); + }; + + }; +#endif /* USE_JPWL */ + + for (bandno = 0; bandno < numbands; bandno++) { + int expn, mant; + if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { + expn = cio_read(cio, 1) >> 3; /* SPqcx_i */ + mant = 0; + } else { + tmp = cio_read(cio, 2); /* SPqcx_i */ + expn = tmp >> 11; + mant = tmp & 0x7ff; + } + tccp->stepsizes[bandno].expn = expn; + tccp->stepsizes[bandno].mant = mant; + } + + /* Add Antonin : if scalar_derived -> compute other stepsizes */ + if (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) { + for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { + tccp->stepsizes[bandno].expn = + ((tccp->stepsizes[0].expn) - ((bandno - 1) / 3) > 0) ? + (tccp->stepsizes[0].expn) - ((bandno - 1) / 3) : 0; + tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant; + } + } + /* ddA */ +} + +static void j2k_write_qcd(opj_j2k_t *j2k) { + int lenp, len; + + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_QCD, 2); /* QCD */ + lenp = cio_tell(cio); + cio_skip(cio, 2); + j2k_write_qcx(j2k, 0); + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lqcd */ + cio_seek(cio, lenp + len); +} + +static void j2k_read_qcd(opj_j2k_t *j2k) { + int len, i, pos; + + opj_cio_t *cio = j2k->cio; + opj_image_t *image = j2k->image; + + len = cio_read(cio, 2); /* Lqcd */ + pos = cio_tell(cio); + for (i = 0; i < image->numcomps; i++) { + cio_seek(cio, pos); + j2k_read_qcx(j2k, i, len - 2); + } +} + +static void j2k_write_qcc(opj_j2k_t *j2k, int compno) { + int lenp, len; + + opj_cio_t *cio = j2k->cio; + + cio_write(cio, J2K_MS_QCC, 2); /* QCC */ + lenp = cio_tell(cio); + cio_skip(cio, 2); + cio_write(cio, compno, j2k->image->numcomps <= 256 ? 1 : 2); /* Cqcc */ + j2k_write_qcx(j2k, compno); + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lqcc */ + cio_seek(cio, lenp + len); +} + +static void j2k_read_qcc(opj_j2k_t *j2k) { + int len, compno; + int numcomp = j2k->image->numcomps; + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); /* Lqcc */ + compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */ + +#ifdef USE_JPWL + if (j2k->cp->correct) { + + static int backup_compno = 0; + + /* compno is negative or larger than the number of components!!! */ + if ((compno < 0) || (compno >= numcomp)) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: bad component number in QCC (%d out of a maximum of %d)\n", + compno, numcomp); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + compno = backup_compno % numcomp; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" + "- setting component number to %d\n", + compno); + } + + /* keep your private count of tiles */ + backup_compno++; + }; +#endif /* USE_JPWL */ + + j2k_read_qcx(j2k, compno, len - 2 - (numcomp <= 256 ? 1 : 2)); +} + +static void j2k_write_poc(opj_j2k_t *j2k) { + int len, numpchgs, i; + + int numcomps = j2k->image->numcomps; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; + opj_tccp_t *tccp = &tcp->tccps[0]; + opj_cio_t *cio = j2k->cio; + + numpchgs = 1 + tcp->numpocs; + cio_write(cio, J2K_MS_POC, 2); /* POC */ + len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs; + cio_write(cio, len, 2); /* Lpoc */ + for (i = 0; i < numpchgs; i++) { + opj_poc_t *poc = &tcp->pocs[i]; + cio_write(cio, poc->resno0, 1); /* RSpoc_i */ + cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2)); /* CSpoc_i */ + cio_write(cio, poc->layno1, 2); /* LYEpoc_i */ + poc->layno1 = int_min(poc->layno1, tcp->numlayers); + cio_write(cio, poc->resno1, 1); /* REpoc_i */ + poc->resno1 = int_min(poc->resno1, tccp->numresolutions); + cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2)); /* CEpoc_i */ + poc->compno1 = int_min(poc->compno1, numcomps); + cio_write(cio, poc->prg, 1); /* Ppoc_i */ + } +} + +static void j2k_read_poc(opj_j2k_t *j2k) { + int len, numpchgs, i, old_poc; + + int numcomps = j2k->image->numcomps; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_cio_t *cio = j2k->cio; + + old_poc = tcp->POC ? tcp->numpocs + 1 : 0; + tcp->POC = 1; + len = cio_read(cio, 2); /* Lpoc */ + numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2)); + + for (i = old_poc; i < numpchgs + old_poc; i++) { + opj_poc_t *poc; + poc = &tcp->pocs[i]; + poc->resno0 = cio_read(cio, 1); /* RSpoc_i */ + poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2); /* CSpoc_i */ + poc->layno1 = cio_read(cio, 2); /* LYEpoc_i */ + poc->resno1 = cio_read(cio, 1); /* REpoc_i */ + poc->compno1 = int_min( + cio_read(cio, numcomps <= 256 ? 1 : 2), (unsigned int) numcomps); /* CEpoc_i */ + poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* Ppoc_i */ + } + + tcp->numpocs = numpchgs + old_poc - 1; +} + +static void j2k_read_crg(opj_j2k_t *j2k) { + int len, i, Xcrg_i, Ycrg_i; + + opj_cio_t *cio = j2k->cio; + int numcomps = j2k->image->numcomps; + + len = cio_read(cio, 2); /* Lcrg */ + for (i = 0; i < numcomps; i++) { + Xcrg_i = cio_read(cio, 2); /* Xcrg_i */ + Ycrg_i = cio_read(cio, 2); /* Ycrg_i */ + } +} + +static void j2k_read_tlm(opj_j2k_t *j2k) { + int len, Ztlm, Stlm, ST, SP, tile_tlm, i; + long int Ttlm_i, Ptlm_i; + + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); /* Ltlm */ + Ztlm = cio_read(cio, 1); /* Ztlm */ + Stlm = cio_read(cio, 1); /* Stlm */ + ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02); + SP = (Stlm >> 6) & 0x01; + tile_tlm = (len - 4) / ((SP + 1) * 2 + ST); + for (i = 0; i < tile_tlm; i++) { + Ttlm_i = cio_read(cio, ST); /* Ttlm_i */ + Ptlm_i = cio_read(cio, SP ? 4 : 2); /* Ptlm_i */ + } +} + +static void j2k_read_plm(opj_j2k_t *j2k) { + int len, i, Zplm, Nplm, add, packet_len = 0; + + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); /* Lplm */ + Zplm = cio_read(cio, 1); /* Zplm */ + len -= 3; + while (len > 0) { + Nplm = cio_read(cio, 4); /* Nplm */ + len -= 4; + for (i = Nplm; i > 0; i--) { + add = cio_read(cio, 1); + len--; + packet_len = (packet_len << 7) + add; /* Iplm_ij */ + if ((add & 0x80) == 0) { + /* New packet */ + packet_len = 0; + } + if (len <= 0) + break; + } + } +} + +static void j2k_read_plt(opj_j2k_t *j2k) { + int len, i, Zplt, packet_len = 0, add; + + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); /* Lplt */ + Zplt = cio_read(cio, 1); /* Zplt */ + for (i = len - 3; i > 0; i--) { + add = cio_read(cio, 1); + packet_len = (packet_len << 7) + add; /* Iplt_i */ + if ((add & 0x80) == 0) { + /* New packet */ + packet_len = 0; + } + } +} + +static void j2k_read_ppm(opj_j2k_t *j2k) { + int len, Z_ppm, i, j; + int N_ppm; + + opj_cp_t *cp = j2k->cp; + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); + cp->ppm = 1; + + Z_ppm = cio_read(cio, 1); /* Z_ppm */ + len -= 3; + while (len > 0) { + if (cp->ppm_previous == 0) { + N_ppm = cio_read(cio, 4); /* N_ppm */ + len -= 4; + } else { + N_ppm = cp->ppm_previous; + } + j = cp->ppm_store; + if (Z_ppm == 0) { /* First PPM marker */ + cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char)); + cp->ppm_data_first = cp->ppm_data; + cp->ppm_len = N_ppm; + } else { /* NON-first PPM marker */ + cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data, (N_ppm + cp->ppm_store) * sizeof(unsigned char)); + +#ifdef USE_JPWL + /* this memory allocation check could be done even in non-JPWL cases */ + if (cp->correct) { + if (!cp->ppm_data) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: failed memory allocation during PPM marker parsing (pos. %x)\n", + cio_tell(cio)); + if (!JPWL_ASSUME || JPWL_ASSUME) { + opj_free(cp->ppm_data); + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + } + } +#endif + + cp->ppm_data_first = cp->ppm_data; + cp->ppm_len = N_ppm + cp->ppm_store; + } + for (i = N_ppm; i > 0; i--) { /* Read packet header */ + cp->ppm_data[j] = cio_read(cio, 1); + j++; + len--; + if (len == 0) + break; /* Case of non-finished packet header in present marker but finished in next one */ + } + cp->ppm_previous = i - 1; + cp->ppm_store = j; + } +} + +static void j2k_read_ppt(opj_j2k_t *j2k) { + int len, Z_ppt, i, j = 0; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = cp->tcps + j2k->curtileno; + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); + Z_ppt = cio_read(cio, 1); + tcp->ppt = 1; + if (Z_ppt == 0) { /* First PPT marker */ + tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char)); + tcp->ppt_data_first = tcp->ppt_data; + tcp->ppt_store = 0; + tcp->ppt_len = len - 3; + } else { /* NON-first PPT marker */ + tcp->ppt_data = (unsigned char *) opj_realloc(tcp->ppt_data, (len - 3 + tcp->ppt_store) * sizeof(unsigned char)); + tcp->ppt_data_first = tcp->ppt_data; + tcp->ppt_len = len - 3 + tcp->ppt_store; + } + j = tcp->ppt_store; + for (i = len - 3; i > 0; i--) { + tcp->ppt_data[j] = cio_read(cio, 1); + j++; + } + tcp->ppt_store = j; +} + +static void j2k_write_tlm(opj_j2k_t *j2k){ + int lenp; + opj_cio_t *cio = j2k->cio; + j2k->tlm_start = cio_tell(cio); + cio_write(cio, J2K_MS_TLM, 2);/* TLM */ + lenp = 4 + (5*j2k->totnum_tp); + cio_write(cio,lenp,2); /* Ltlm */ + cio_write(cio, 0,1); /* Ztlm=0*/ + cio_write(cio,80,1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */ + cio_skip(cio,5*j2k->totnum_tp); +} + +static void j2k_write_sot(opj_j2k_t *j2k) { + int lenp, len; + + opj_cio_t *cio = j2k->cio; + + j2k->sot_start = cio_tell(cio); + cio_write(cio, J2K_MS_SOT, 2); /* SOT */ + lenp = cio_tell(cio); + cio_skip(cio, 2); /* Lsot (further) */ + cio_write(cio, j2k->curtileno, 2); /* Isot */ + cio_skip(cio, 4); /* Psot (further in j2k_write_sod) */ + cio_write(cio, j2k->cur_tp_num , 1); /* TPsot */ + cio_write(cio, j2k->cur_totnum_tp[j2k->curtileno], 1); /* TNsot */ + len = cio_tell(cio) - lenp; + cio_seek(cio, lenp); + cio_write(cio, len, 2); /* Lsot */ + cio_seek(cio, lenp + len); + + /* UniPG>> */ +#ifdef USE_JPWL + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_SOT, j2k->sot_start, len + 2); +#endif /* USE_JPWL */ + /* <cp; + opj_cio_t *cio = j2k->cio; + + len = cio_read(cio, 2); + tileno = cio_read(cio, 2); + +#ifdef USE_JPWL + if (j2k->cp->correct) { + + static int backup_tileno = 0; + + /* tileno is negative or larger than the number of tiles!!! */ + if ((tileno < 0) || (tileno > (cp->tw * cp->th))) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: bad tile number (%d out of a maximum of %d)\n", + tileno, (cp->tw * cp->th)); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + tileno = backup_tileno; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" + "- setting tile number to %d\n", + tileno); + } + + /* keep your private count of tiles */ + backup_tileno++; + }; +#endif /* USE_JPWL */ + + if (cp->tileno_size == 0) { + cp->tileno[cp->tileno_size] = tileno; + cp->tileno_size++; + } else { + i = 0; + while (i < cp->tileno_size && status == 0) { + status = cp->tileno[i] == tileno ? 1 : 0; + i++; + } + if (status == 0) { + cp->tileno[cp->tileno_size] = tileno; + cp->tileno_size++; + } + } + + totlen = cio_read(cio, 4); + +#ifdef USE_JPWL + if (j2k->cp->correct) { + + /* totlen is negative or larger than the bytes left!!! */ + if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: bad tile byte size (%d bytes against %d bytes left)\n", + totlen, cio_numbytesleft(cio) + 8); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + /* we try to correct */ + totlen = 0; + opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" + "- setting Psot to %d => assuming it is the last tile\n", + totlen); + } + + }; +#endif /* USE_JPWL */ + + if (!totlen) + totlen = cio_numbytesleft(cio) + 8; + + partno = cio_read(cio, 1); + numparts = cio_read(cio, 1); + + j2k->curtileno = tileno; + j2k->cur_tp_num = partno; + j2k->eot = cio_getbp(cio) - 12 + totlen; + j2k->state = J2K_STATE_TPH; + tcp = &cp->tcps[j2k->curtileno]; + + /* Index */ + if (j2k->cstr_info) { + if (tcp->first) { + if (tileno == 0) + j2k->cstr_info->main_head_end = cio_tell(cio) - 13; + j2k->cstr_info->tile[tileno].tileno = tileno; + j2k->cstr_info->tile[tileno].start_pos = cio_tell(cio) - 12; + j2k->cstr_info->tile[tileno].end_pos = j2k->cstr_info->tile[tileno].start_pos + totlen - 1; + j2k->cstr_info->tile[tileno].num_tps = numparts; + if (numparts) + j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t)); + else + j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10) + } + else { + j2k->cstr_info->tile[tileno].end_pos += totlen; + } + j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = cio_tell(cio) - 12; + j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos = + j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1; + } + + if (tcp->first == 1) { + /* Initialization PPT */ + opj_tccp_t *tmp = tcp->tccps; + memcpy(tcp, j2k->default_tcp, sizeof(opj_tcp_t)); + tcp->ppt = 0; + tcp->ppt_data = NULL; + tcp->ppt_data_first = NULL; + tcp->tccps = tmp; + + for (i = 0; i < j2k->image->numcomps; i++) { + tcp->tccps[i] = j2k->default_tcp->tccps[i]; + } + cp->tcps[j2k->curtileno].first = 0; + } +} + +static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) { + int l, layno; + int totlen; + opj_tcp_t *tcp = NULL; + opj_codestream_info_t *cstr_info = NULL; + + opj_tcd_t *tcd = (opj_tcd_t*)tile_coder; /* cast is needed because of conflicts in header inclusions */ + opj_cp_t *cp = j2k->cp; + opj_cio_t *cio = j2k->cio; + + tcd->tp_num = j2k->tp_num ; + tcd->cur_tp_num = j2k->cur_tp_num; + + cio_write(cio, J2K_MS_SOD, 2); + if (j2k->curtileno == 0) { + j2k->sod_start = cio_tell(cio) + j2k->pos_correction; + } + + /* INDEX >> */ + cstr_info = j2k->cstr_info; + if (cstr_info) { + if (!j2k->cur_tp_num ) { + cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1; + j2k->cstr_info->tile[j2k->curtileno].tileno = j2k->curtileno; + } + else{ + if(cstr_info->tile[j2k->curtileno].packet[cstr_info->packno - 1].end_pos < cio_tell(cio)) + cstr_info->tile[j2k->curtileno].packet[cstr_info->packno].start_pos = cio_tell(cio); + } + /* UniPG>> */ +#ifdef USE_JPWL + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_SOD, j2k->sod_start, 2); +#endif /* USE_JPWL */ + /* <tcps[j2k->curtileno]; + for (layno = 0; layno < tcp->numlayers; layno++) { + if (tcp->rates[layno]>(j2k->sod_start / (cp->th * cp->tw))) { + tcp->rates[layno]-=(j2k->sod_start / (cp->th * cp->tw)); + } else if (tcp->rates[layno]) { + tcp->rates[layno]=1; + } + } + if(j2k->cur_tp_num == 0){ + tcd->tcd_image->tiles->packno = 0; + if(cstr_info) + cstr_info->packno = 0; + } + + l = tcd_encode_tile(tcd, j2k->curtileno, cio_getbp(cio), cio_numbytesleft(cio) - 2, cstr_info); + + /* Writing Psot in SOT marker */ + totlen = cio_tell(cio) + l - j2k->sot_start; + cio_seek(cio, j2k->sot_start + 6); + cio_write(cio, totlen, 4); + cio_seek(cio, j2k->sot_start + totlen); + /* Writing Ttlm and Ptlm in TLM marker */ + if(cp->cinema){ + cio_seek(cio, j2k->tlm_start + 6 + (5*j2k->cur_tp_num)); + cio_write(cio, j2k->curtileno, 1); + cio_write(cio, totlen, 4); + } + cio_seek(cio, j2k->sot_start + totlen); +} + +static void j2k_read_sod(opj_j2k_t *j2k) { + int len, truncate = 0, i; + unsigned char *data = NULL, *data_ptr = NULL; + + opj_cio_t *cio = j2k->cio; + int curtileno = j2k->curtileno; + + /* Index */ + if (j2k->cstr_info) { + j2k->cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header = + cio_tell(cio) + j2k->pos_correction - 1; + if (j2k->cur_tp_num == 0) + j2k->cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1; + j2k->cstr_info->packno = 0; + } + + len = int_min(j2k->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1); + + if (len == cio_numbytesleft(cio) + 1) { + truncate = 1; /* Case of a truncate codestream */ + } + + data = j2k->tile_data[curtileno]; + data = (unsigned char*) opj_realloc(data, (j2k->tile_len[curtileno] + len) * sizeof(unsigned char)); + + data_ptr = data + j2k->tile_len[curtileno]; + for (i = 0; i < len; i++) { + data_ptr[i] = cio_read(cio, 1); + } + + j2k->tile_len[curtileno] += len; + j2k->tile_data[curtileno] = data; + + if (!truncate) { + j2k->state = J2K_STATE_TPHSOT; + } else { + j2k->state = J2K_STATE_NEOC; /* RAJOUTE !! */ + } + j2k->cur_tp_num++; +} + +static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno) { + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = &cp->tcps[tileno]; + opj_cio_t *cio = j2k->cio; + int numcomps = j2k->image->numcomps; + + cio_write(cio, J2K_MS_RGN, 2); /* RGN */ + cio_write(cio, numcomps <= 256 ? 5 : 6, 2); /* Lrgn */ + cio_write(cio, compno, numcomps <= 256 ? 1 : 2); /* Crgn */ + cio_write(cio, 0, 1); /* Srgn */ + cio_write(cio, tcp->tccps[compno].roishift, 1); /* SPrgn */ +} + +static void j2k_read_rgn(opj_j2k_t *j2k) { + int len, compno, roisty; + + opj_cp_t *cp = j2k->cp; + opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; + opj_cio_t *cio = j2k->cio; + int numcomps = j2k->image->numcomps; + + len = cio_read(cio, 2); /* Lrgn */ + compno = cio_read(cio, numcomps <= 256 ? 1 : 2); /* Crgn */ + roisty = cio_read(cio, 1); /* Srgn */ + +#ifdef USE_JPWL + if (j2k->cp->correct) { + /* totlen is negative or larger than the bytes left!!! */ + if (compno >= numcomps) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: bad component number in RGN (%d when there are only %d)\n", + compno, numcomps); + if (!JPWL_ASSUME || JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return; + } + } + }; +#endif /* USE_JPWL */ + + tcp->tccps[compno].roishift = cio_read(cio, 1); /* SPrgn */ +} + +static void j2k_write_eoc(opj_j2k_t *j2k) { + opj_cio_t *cio = j2k->cio; + /* opj_event_msg(j2k->cinfo, "%.8x: EOC\n", cio_tell(cio) + j2k->pos_correction); */ + cio_write(cio, J2K_MS_EOC, 2); + +/* UniPG>> */ +#ifdef USE_JPWL + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_EOC, cio_tell(cio) - 2, 2); +#endif /* USE_JPWL */ +/* <cp->limit_decoding != DECODE_ALL_BUT_PACKETS) { + opj_tcd_t *tcd = tcd_create(j2k->cinfo); + tcd_malloc_decode(tcd, j2k->image, j2k->cp); + for (i = 0; i < j2k->cp->tileno_size; i++) { + tcd_malloc_decode_tile(tcd, j2k->image, j2k->cp, i, j2k->cstr_info); + tileno = j2k->cp->tileno[i]; + success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno, j2k->cstr_info); + opj_free(j2k->tile_data[tileno]); + j2k->tile_data[tileno] = NULL; + tcd_free_decode_tile(tcd, i); + if (success == false) { + j2k->state |= J2K_STATE_ERR; + break; + } + } + tcd_free_decode(tcd); + tcd_destroy(tcd); + } + /* if packets should not be decoded */ + else { + for (i = 0; i < j2k->cp->tileno_size; i++) { + tileno = j2k->cp->tileno[i]; + opj_free(j2k->tile_data[tileno]); + j2k->tile_data[tileno] = NULL; + } + } + if (j2k->state & J2K_STATE_ERR) + j2k->state = J2K_STATE_MT + J2K_STATE_ERR; + else + j2k->state = J2K_STATE_MT; +} + +typedef struct opj_dec_mstabent { + /** marker value */ + int id; + /** value of the state when the marker can appear */ + int states; + /** action linked to the marker */ + void (*handler) (opj_j2k_t *j2k); +} opj_dec_mstabent_t; + +opj_dec_mstabent_t j2k_dec_mstab[] = { + {J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc}, + {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, j2k_read_sot}, + {J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod}, + {J2K_MS_EOC, J2K_STATE_TPHSOT, j2k_read_eoc}, + {J2K_MS_SIZ, J2K_STATE_MHSIZ, j2k_read_siz}, + {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_cod}, + {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_coc}, + {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_rgn}, + {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcd}, + {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcc}, + {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_poc}, + {J2K_MS_TLM, J2K_STATE_MH, j2k_read_tlm}, + {J2K_MS_PLM, J2K_STATE_MH, j2k_read_plm}, + {J2K_MS_PLT, J2K_STATE_TPH, j2k_read_plt}, + {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm}, + {J2K_MS_PPT, J2K_STATE_TPH, j2k_read_ppt}, + {J2K_MS_SOP, 0, 0}, + {J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg}, + {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_com}, + +#ifdef USE_JPWL + {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc}, + {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb}, + {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd}, + {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red}, +#endif /* USE_JPWL */ +#ifdef USE_JPSEC + {J2K_MS_SEC, J2K_STATE_MH, j2k_read_sec}, + {J2K_MS_INSEC, 0, j2k_read_insec}, +#endif /* USE_JPSEC */ + + {0, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_unk} +}; + +static void j2k_read_unk(opj_j2k_t *j2k) { + opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown marker\n"); + +#ifdef USE_JPWL + if (j2k->cp->correct) { + int m = 0, id, i; + int min_id = 0, min_dist = 17, cur_dist = 0, tmp_id; + cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); + id = cio_read(j2k->cio, 2); + opj_event_msg(j2k->cinfo, EVT_ERROR, + "JPWL: really don't know this marker %x\n", + id); + if (!JPWL_ASSUME) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "- possible synch loss due to uncorrectable codestream errors => giving up\n"); + return; + } + /* OK, activate this at your own risk!!! */ + /* we look for the marker at the minimum hamming distance from this */ + while (j2k_dec_mstab[m].id) { + + /* 1's where they differ */ + tmp_id = j2k_dec_mstab[m].id ^ id; + + /* compute the hamming distance between our id and the current */ + cur_dist = 0; + for (i = 0; i < 16; i++) { + if ((tmp_id >> i) & 0x0001) { + cur_dist++; + } + } + + /* if current distance is smaller, set the minimum */ + if (cur_dist < min_dist) { + min_dist = cur_dist; + min_id = j2k_dec_mstab[m].id; + } + + /* jump to the next marker */ + m++; + } + + /* do we substitute the marker? */ + if (min_dist < JPWL_MAXIMUM_HAMMING) { + opj_event_msg(j2k->cinfo, EVT_ERROR, + "- marker %x is at distance %d from the read %x\n", + min_id, min_dist, id); + opj_event_msg(j2k->cinfo, EVT_ERROR, + "- trying to substitute in place and crossing fingers!\n"); + cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); + cio_write(j2k->cio, min_id, 2); + + /* rewind */ + cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); + + } + + }; +#endif /* USE_JPWL */ + +} + +/** +Read the lookup table containing all the marker, status and action +@param id Marker value +*/ +static opj_dec_mstabent_t *j2k_dec_mstab_lookup(int id) { + opj_dec_mstabent_t *e; + for (e = j2k_dec_mstab; e->id != 0; e++) { + if (e->id == id) { + break; + } + } + return e; +} + +/* ----------------------------------------------------------------------- */ +/* J2K / JPT decoder interface */ +/* ----------------------------------------------------------------------- */ + +opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo) { + opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t)); + if(!j2k) + return NULL; + + j2k->default_tcp = (opj_tcp_t*) opj_calloc(1, sizeof(opj_tcp_t)); + if(!j2k->default_tcp) { + opj_free(j2k); + return NULL; + } + + j2k->cinfo = cinfo; + j2k->tile_data = NULL; + + return j2k; +} + +void j2k_destroy_decompress(opj_j2k_t *j2k) { + int i = 0; + + if(j2k->tile_len != NULL) { + opj_free(j2k->tile_len); + } + if(j2k->tile_data != NULL) { + opj_free(j2k->tile_data); + } + if(j2k->default_tcp != NULL) { + opj_tcp_t *default_tcp = j2k->default_tcp; + if(default_tcp->ppt_data_first != NULL) { + opj_free(default_tcp->ppt_data_first); + } + if(j2k->default_tcp->tccps != NULL) { + opj_free(j2k->default_tcp->tccps); + } + opj_free(j2k->default_tcp); + } + if(j2k->cp != NULL) { + opj_cp_t *cp = j2k->cp; + if(cp->tcps != NULL) { + for(i = 0; i < cp->tw * cp->th; i++) { + if(cp->tcps[i].ppt_data_first != NULL) { + opj_free(cp->tcps[i].ppt_data_first); + } + if(cp->tcps[i].tccps != NULL) { + opj_free(cp->tcps[i].tccps); + } + } + opj_free(cp->tcps); + } + if(cp->ppm_data_first != NULL) { + opj_free(cp->ppm_data_first); + } + if(cp->tileno != NULL) { + opj_free(cp->tileno); + } + if(cp->comment != NULL) { + opj_free(cp->comment); + } + + opj_free(cp); + } + opj_free(j2k); +} + +void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters) { + if(j2k && parameters) { + /* create and initialize the coding parameters structure */ + opj_cp_t *cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t)); + cp->reduce = parameters->cp_reduce; + cp->layer = parameters->cp_layer; + cp->limit_decoding = parameters->cp_limit_decoding; + +#ifdef USE_JPWL + cp->correct = parameters->jpwl_correct; + cp->exp_comps = parameters->jpwl_exp_comps; + cp->max_tiles = parameters->jpwl_max_tiles; +#endif /* USE_JPWL */ + + + /* keep a link to cp so that we can destroy it later in j2k_destroy_decompress */ + j2k->cp = cp; + } +} + +opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { + opj_image_t *image = NULL; + + opj_common_ptr cinfo = j2k->cinfo; + + j2k->cio = cio; + j2k->cstr_info = cstr_info; + if (cstr_info) + memset(cstr_info, 0, sizeof(opj_codestream_info_t)); + + /* create an empty image */ + image = opj_image_create0(); + j2k->image = image; + + j2k->state = J2K_STATE_MHSOC; + + for (;;) { + opj_dec_mstabent_t *e; + int id = cio_read(cio, 2); + +#ifdef USE_JPWL + /* we try to honor JPWL correction power */ + if (j2k->cp->correct) { + + int orig_pos = cio_tell(cio); + bool status; + + /* call the corrector */ + status = jpwl_correct(j2k); + + /* go back to where you were */ + cio_seek(cio, orig_pos - 2); + + /* re-read the marker */ + id = cio_read(cio, 2); + + /* check whether it begins with ff */ + if (id >> 8 != 0xff) { + opj_event_msg(cinfo, EVT_ERROR, + "JPWL: possible bad marker %x at %d\n", + id, cio_tell(cio) - 2); + if (!JPWL_ASSUME) { + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "JPWL: giving up\n"); + return 0; + } + /* we try to correct */ + id = id | 0xff00; + cio_seek(cio, cio_tell(cio) - 2); + cio_write(cio, id, 2); + opj_event_msg(cinfo, EVT_WARNING, "- trying to adjust this\n" + "- setting marker to %x\n", + id); + } + + } +#endif /* USE_JPWL */ + + if (id >> 8 != 0xff) { + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id); + return 0; + } + e = j2k_dec_mstab_lookup(id); + // Check if the marker is known + if (!(j2k->state & e->states)) { + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id); + return 0; + } + // Check if the decoding is limited to the main header + if (e->id == J2K_MS_SOT && j2k->cp->limit_decoding == LIMIT_TO_MAIN_HEADER) { + opj_event_msg(cinfo, EVT_INFO, "Main Header decoded.\n"); + return image; + } + + if (e->handler) { + (*e->handler)(j2k); + } + if (j2k->state & J2K_STATE_ERR) + return NULL; + + if (j2k->state == J2K_STATE_MT) { + break; + } + if (j2k->state == J2K_STATE_NEOC) { + break; + } + } + if (j2k->state == J2K_STATE_NEOC) { + j2k_read_eoc(j2k); + } + + if (j2k->state != J2K_STATE_MT) { + opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); + } + + return image; +} + +/* +* Read a JPT-stream and decode file +* +*/ +opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { + opj_image_t *image = NULL; + opj_jpt_msg_header_t header; + int position; + + opj_common_ptr cinfo = j2k->cinfo; + + j2k->cio = cio; + + /* create an empty image */ + image = opj_image_create0(); + j2k->image = image; + + j2k->state = J2K_STATE_MHSOC; + + /* Initialize the header */ + jpt_init_msg_header(&header); + /* Read the first header of the message */ + jpt_read_msg_header(cinfo, cio, &header); + + position = cio_tell(cio); + if (header.Class_Id != 6) { /* 6 : Main header data-bin message */ + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Main header first [class_Id %d] !\n", header.Class_Id); + return 0; + } + + for (;;) { + opj_dec_mstabent_t *e = NULL; + int id; + + if (!cio_numbytesleft(cio)) { + j2k_read_eoc(j2k); + return image; + } + /* data-bin read -> need to read a new header */ + if ((unsigned int) (cio_tell(cio) - position) == header.Msg_length) { + jpt_read_msg_header(cinfo, cio, &header); + position = cio_tell(cio); + if (header.Class_Id != 4) { /* 4 : Tile data-bin message */ + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Tile info !\n"); + return 0; + } + } + + id = cio_read(cio, 2); + if (id >> 8 != 0xff) { + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id); + return 0; + } + e = j2k_dec_mstab_lookup(id); + if (!(j2k->state & e->states)) { + opj_image_destroy(image); + opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id); + return 0; + } + if (e->handler) { + (*e->handler)(j2k); + } + if (j2k->state == J2K_STATE_MT) { + break; + } + if (j2k->state == J2K_STATE_NEOC) { + break; + } + } + if (j2k->state == J2K_STATE_NEOC) { + j2k_read_eoc(j2k); + } + + if (j2k->state != J2K_STATE_MT) { + opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); + } + + return image; +} + +/* ----------------------------------------------------------------------- */ +/* J2K encoder interface */ +/* ----------------------------------------------------------------------- */ + +opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo) { + opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t)); + if(j2k) { + j2k->cinfo = cinfo; + } + return j2k; +} + +void j2k_destroy_compress(opj_j2k_t *j2k) { + int tileno; + + if(!j2k) return; + if(j2k->cp != NULL) { + opj_cp_t *cp = j2k->cp; + + if(cp->comment) { + opj_free(cp->comment); + } + if(cp->matrice) { + opj_free(cp->matrice); + } + for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { + opj_free(cp->tcps[tileno].tccps); + } + opj_free(cp->tcps); + opj_free(cp); + } + + opj_free(j2k); +} + +void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image) { + int i, j, tileno, numpocs_tile; + opj_cp_t *cp = NULL; + + if(!j2k || !parameters || ! image) { + return; + } + + /* create and initialize the coding parameters structure */ + cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t)); + + /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */ + j2k->cp = cp; + + /* set default values for cp */ + cp->tw = 1; + cp->th = 1; + + /* + copy user encoding parameters + */ + cp->cinema = parameters->cp_cinema; + cp->max_comp_size = parameters->max_comp_size; + cp->rsiz = parameters->cp_rsiz; + cp->disto_alloc = parameters->cp_disto_alloc; + cp->fixed_alloc = parameters->cp_fixed_alloc; + cp->fixed_quality = parameters->cp_fixed_quality; + + /* mod fixed_quality */ + if(parameters->cp_matrice) { + size_t array_size = parameters->tcp_numlayers * parameters->numresolution * 3 * sizeof(int); + cp->matrice = (int *) opj_malloc(array_size); + memcpy(cp->matrice, parameters->cp_matrice, array_size); + } + + /* tiles */ + cp->tdx = parameters->cp_tdx; + cp->tdy = parameters->cp_tdy; + + /* tile offset */ + cp->tx0 = parameters->cp_tx0; + cp->ty0 = parameters->cp_ty0; + + /* comment string */ + if(parameters->cp_comment) { + cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1); + if(cp->comment) { + strcpy(cp->comment, parameters->cp_comment); + } + } + + /* + calculate other encoding parameters + */ + + if (parameters->tile_size_on) { + cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx); + cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy); + } else { + cp->tdx = image->x1 - cp->tx0; + cp->tdy = image->y1 - cp->ty0; + } + + if(parameters->tp_on){ + cp->tp_flag = parameters->tp_flag; + cp->tp_on = 1; + } + + cp->img_size = 0; + for(i=0;inumcomps ;i++){ + cp->img_size += (image->comps[i].w *image->comps[i].h * image->comps[i].prec); + } + + +#ifdef USE_JPWL + /* + calculate JPWL encoding parameters + */ + + if (parameters->jpwl_epc_on) { + int i; + + /* set JPWL on */ + cp->epc_on = true; + cp->info_on = false; /* no informative technique */ + + /* set EPB on */ + if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) { + cp->epb_on = true; + + cp->hprot_MH = parameters->jpwl_hprot_MH; + for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { + cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i]; + cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i]; + } + /* if tile specs are not specified, copy MH specs */ + if (cp->hprot_TPH[0] == -1) { + cp->hprot_TPH_tileno[0] = 0; + cp->hprot_TPH[0] = parameters->jpwl_hprot_MH; + } + for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { + cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i]; + cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i]; + cp->pprot[i] = parameters->jpwl_pprot[i]; + } + } + + /* set ESD writing */ + if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) { + cp->esd_on = true; + + cp->sens_size = parameters->jpwl_sens_size; + cp->sens_addr = parameters->jpwl_sens_addr; + cp->sens_range = parameters->jpwl_sens_range; + + cp->sens_MH = parameters->jpwl_sens_MH; + for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { + cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i]; + cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i]; + } + } + + /* always set RED writing to false: we are at the encoder */ + cp->red_on = false; + + } else { + cp->epc_on = false; + } +#endif /* USE_JPWL */ + + + /* initialize the mutiple tiles */ + /* ---------------------------- */ + cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); + + for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { + opj_tcp_t *tcp = &cp->tcps[tileno]; + tcp->numlayers = parameters->tcp_numlayers; + for (j = 0; j < tcp->numlayers; j++) { + if(cp->cinema){ + if (cp->fixed_quality) { + tcp->distoratio[j] = parameters->tcp_distoratio[j]; + } + tcp->rates[j] = parameters->tcp_rates[j]; + }else{ + if (cp->fixed_quality) { /* add fixed_quality */ + tcp->distoratio[j] = parameters->tcp_distoratio[j]; + } else { + tcp->rates[j] = parameters->tcp_rates[j]; + } + } + } + tcp->csty = parameters->csty; + tcp->prg = parameters->prog_order; + tcp->mct = parameters->tcp_mct; + + numpocs_tile = 0; + tcp->POC = 0; + if (parameters->numpocs) { + /* initialisation of POC */ + tcp->POC = 1; + for (i = 0; i < parameters->numpocs; i++) { + if((tileno == parameters->POC[i].tile - 1) || (parameters->POC[i].tile == -1)) { + opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile]; + tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0; + tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0; + tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1; + tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1; + tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1; + tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1; + tcp_poc->tile = parameters->POC[numpocs_tile].tile; + numpocs_tile++; + } + } + tcp->numpocs = numpocs_tile -1 ; + }else{ + tcp->numpocs = 0; + } + + tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t)); + + for (i = 0; i < image->numcomps; i++) { + opj_tccp_t *tccp = &tcp->tccps[i]; + tccp->csty = parameters->csty & 0x01; /* 0 => one precinct || 1 => custom precinct */ + tccp->numresolutions = parameters->numresolution; + tccp->cblkw = int_floorlog2(parameters->cblockw_init); + tccp->cblkh = int_floorlog2(parameters->cblockh_init); + tccp->cblksty = parameters->mode; + tccp->qmfbid = parameters->irreversible ? 0 : 1; + tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT; + tccp->numgbits = 2; + if (i == parameters->roi_compno) { + tccp->roishift = parameters->roi_shift; + } else { + tccp->roishift = 0; + } + + if(parameters->cp_cinema) + { + //Precinct size for lowest frequency subband=128 + tccp->prcw[0] = 7; + tccp->prch[0] = 7; + //Precinct size at all other resolutions = 256 + for (j = 1; j < tccp->numresolutions; j++) { + tccp->prcw[j] = 8; + tccp->prch[j] = 8; + } + }else{ + if (parameters->csty & J2K_CCP_CSTY_PRT) { + int p = 0; + for (j = tccp->numresolutions - 1; j >= 0; j--) { + if (p < parameters->res_spec) { + + if (parameters->prcw_init[p] < 1) { + tccp->prcw[j] = 1; + } else { + tccp->prcw[j] = int_floorlog2(parameters->prcw_init[p]); + } + + if (parameters->prch_init[p] < 1) { + tccp->prch[j] = 1; + }else { + tccp->prch[j] = int_floorlog2(parameters->prch_init[p]); + } + + } else { + int res_spec = parameters->res_spec; + int size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1)); + int size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1)); + + if (size_prcw < 1) { + tccp->prcw[j] = 1; + } else { + tccp->prcw[j] = int_floorlog2(size_prcw); + } + + if (size_prch < 1) { + tccp->prch[j] = 1; + } else { + tccp->prch[j] = int_floorlog2(size_prch); + } + } + p++; + /*printf("\nsize precinct for level %d : %d,%d\n", j,tccp->prcw[j], tccp->prch[j]); */ + } //end for + } else { + for (j = 0; j < tccp->numresolutions; j++) { + tccp->prcw[j] = 15; + tccp->prch[j] = 15; + } + } + } + + dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec); + } + } +} + +bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { + int tileno, compno; + opj_cp_t *cp = NULL; + + opj_tcd_t *tcd = NULL; /* TCD component */ + + j2k->cio = cio; + j2k->image = image; + + cp = j2k->cp; + + /* INDEX >> */ + j2k->cstr_info = cstr_info; + if (cstr_info) { + int compno; + cstr_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tile_info_t)); + cstr_info->image_w = image->x1 - image->x0; + cstr_info->image_h = image->y1 - image->y0; + cstr_info->prog = (&cp->tcps[0])->prg; + cstr_info->tw = cp->tw; + cstr_info->th = cp->th; + cstr_info->tile_x = cp->tdx; /* new version parser */ + cstr_info->tile_y = cp->tdy; /* new version parser */ + cstr_info->tile_Ox = cp->tx0; /* new version parser */ + cstr_info->tile_Oy = cp->ty0; /* new version parser */ + cstr_info->numcomps = image->numcomps; + cstr_info->numlayers = (&cp->tcps[0])->numlayers; + cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int)); + for (compno=0; compno < image->numcomps; compno++) { + cstr_info->numdecompos[compno] = (&cp->tcps[0])->tccps->numresolutions - 1; + } + cstr_info->D_max = 0.0; /* ADD Marcela */ + cstr_info->main_head_start = cio_tell(cio); /* position of SOC */ + cstr_info->maxmarknum = 100; + cstr_info->marker = (opj_marker_info_t *) opj_malloc(cstr_info->maxmarknum * sizeof(opj_marker_info_t)); + cstr_info->marknum = 0; + } + /* << INDEX */ + + j2k_write_soc(j2k); + j2k_write_siz(j2k); + j2k_write_cod(j2k); + j2k_write_qcd(j2k); + + if(cp->cinema){ + for (compno = 1; compno < image->numcomps; compno++) { + j2k_write_coc(j2k, compno); + j2k_write_qcc(j2k, compno); + } + } + + for (compno = 0; compno < image->numcomps; compno++) { + opj_tcp_t *tcp = &cp->tcps[0]; + if (tcp->tccps[compno].roishift) + j2k_write_rgn(j2k, compno, 0); + } + if (cp->comment != NULL) { + j2k_write_com(j2k); + } + + j2k->totnum_tp = j2k_calculate_tp(cp,image->numcomps,image,j2k); + /* TLM Marker*/ + if(cp->cinema){ + j2k_write_tlm(j2k); + if (cp->cinema == CINEMA4K_24) { + j2k_write_poc(j2k); + } + } + + /* uncomment only for testing JPSEC marker writing */ + /* j2k_write_sec(j2k); */ + + /* INDEX >> */ + if(cstr_info) { + cstr_info->main_head_end = cio_tell(cio) - 1; + } + /* << INDEX */ + /**** Main Header ENDS here ***/ + + /* create the tile encoder */ + tcd = tcd_create(j2k->cinfo); + + /* encode each tile */ + for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { + int pino; + int tilepartno=0; + /* UniPG>> */ + int acc_pack_num = 0; + /* <tcps[tileno]; + opj_event_msg(j2k->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1, cp->tw * cp->th); + + j2k->curtileno = tileno; + j2k->cur_tp_num = 0; + tcd->cur_totnum_tp = j2k->cur_totnum_tp[j2k->curtileno]; + /* initialisation before tile encoding */ + if (tileno == 0) { + tcd_malloc_encode(tcd, image, cp, j2k->curtileno); + } else { + tcd_init_encode(tcd, image, cp, j2k->curtileno); + } + + /* INDEX >> */ + if(cstr_info) { + cstr_info->tile[j2k->curtileno].start_pos = cio_tell(cio) + j2k->pos_correction; + } + /* << INDEX */ + + for(pino = 0; pino <= tcp->numpocs; pino++) { + int tot_num_tp; + tcd->cur_pino=pino; + + /*Get number of tile parts*/ + tot_num_tp = j2k_get_num_tp(cp,pino,tileno); + tcd->tp_pos = cp->tp_pos; + + for(tilepartno = 0; tilepartno < tot_num_tp ; tilepartno++){ + j2k->tp_num = tilepartno; + /* INDEX >> */ + if(cstr_info) + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pos = + cio_tell(cio) + j2k->pos_correction; + /* << INDEX */ + j2k_write_sot(j2k); + + if(j2k->cur_tp_num == 0 && cp->cinema == 0){ + for (compno = 1; compno < image->numcomps; compno++) { + j2k_write_coc(j2k, compno); + j2k_write_qcc(j2k, compno); + } + if (cp->tcps[tileno].numpocs) { + j2k_write_poc(j2k); + } + } + + /* INDEX >> */ + if(cstr_info) + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header = + cio_tell(cio) + j2k->pos_correction + 1; + /* << INDEX */ + + j2k_write_sod(j2k, tcd); + + /* INDEX >> */ + if(cstr_info) { + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_pos = + cio_tell(cio) + j2k->pos_correction - 1; + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pack = + acc_pack_num; + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_numpacks = + cstr_info->packno - acc_pack_num; + acc_pack_num = cstr_info->packno; + } + /* << INDEX */ + + j2k->cur_tp_num++; + } + } + if(cstr_info) { + cstr_info->tile[j2k->curtileno].end_pos = cio_tell(cio) + j2k->pos_correction - 1; + } + + + /* + if (tile->PPT) { // BAD PPT !!! + FILE *PPT_file; + int i; + PPT_file=fopen("PPT","rb"); + fprintf(stderr,"%c%c%c%c",255,97,tile->len_ppt/256,tile->len_ppt%256); + for (i=0;ilen_ppt;i++) { + unsigned char elmt; + fread(&elmt, 1, 1, PPT_file); + fwrite(&elmt,1,1,f); + } + fclose(PPT_file); + unlink("PPT"); + } + */ + + } + + /* destroy the tile encoder */ + tcd_free_encode(tcd); + tcd_destroy(tcd); + + opj_free(j2k->cur_totnum_tp); + + j2k_write_eoc(j2k); + + if(cstr_info) { + cstr_info->codestream_size = cio_tell(cio) + j2k->pos_correction; + /* UniPG>> */ + /* The following adjustment is done to adjust the codestream size */ + /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */ + /* the first bunch of bytes is not in the codestream */ + cstr_info->codestream_size -= cstr_info->main_head_start; + /* <epc_on) { + + /* encode according to JPWL */ + jpwl_encode(j2k, cio, image); + + } +#endif /* USE_JPWL */ + + return true; +} + + + + + + diff --git a/contrib/media/updf_newlib/libopenjpeg/j2k.h b/contrib/media/updf_newlib/libopenjpeg/j2k.h new file mode 100755 index 000000000..8fc8e6dce --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/j2k.h @@ -0,0 +1,446 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __J2K_H +#define __J2K_H +/** +@file j2k.h +@brief The JPEG-2000 Codestream Reader/Writer (J2K) + +The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data. +*/ + +/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ +/*@{*/ + +#define J2K_CP_CSTY_PRT 0x01 +#define J2K_CP_CSTY_SOP 0x02 +#define J2K_CP_CSTY_EPH 0x04 +#define J2K_CCP_CSTY_PRT 0x01 +#define J2K_CCP_CBLKSTY_LAZY 0x01 /**< Selective arithmetic coding bypass */ +#define J2K_CCP_CBLKSTY_RESET 0x02 /**< Reset context probabilities on coding pass boundaries */ +#define J2K_CCP_CBLKSTY_TERMALL 0x04 /**< Termination on each coding pass */ +#define J2K_CCP_CBLKSTY_VSC 0x08 /**< Vertically stripe causal context */ +#define J2K_CCP_CBLKSTY_PTERM 0x10 /**< Predictable termination */ +#define J2K_CCP_CBLKSTY_SEGSYM 0x20 /**< Segmentation symbols are used */ +#define J2K_CCP_QNTSTY_NOQNT 0 +#define J2K_CCP_QNTSTY_SIQNT 1 +#define J2K_CCP_QNTSTY_SEQNT 2 + +/* ----------------------------------------------------------------------- */ + +#define J2K_MS_SOC 0xff4f /**< SOC marker value */ +#define J2K_MS_SOT 0xff90 /**< SOT marker value */ +#define J2K_MS_SOD 0xff93 /**< SOD marker value */ +#define J2K_MS_EOC 0xffd9 /**< EOC marker value */ +#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */ +#define J2K_MS_COD 0xff52 /**< COD marker value */ +#define J2K_MS_COC 0xff53 /**< COC marker value */ +#define J2K_MS_RGN 0xff5e /**< RGN marker value */ +#define J2K_MS_QCD 0xff5c /**< QCD marker value */ +#define J2K_MS_QCC 0xff5d /**< QCC marker value */ +#define J2K_MS_POC 0xff5f /**< POC marker value */ +#define J2K_MS_TLM 0xff55 /**< TLM marker value */ +#define J2K_MS_PLM 0xff57 /**< PLM marker value */ +#define J2K_MS_PLT 0xff58 /**< PLT marker value */ +#define J2K_MS_PPM 0xff60 /**< PPM marker value */ +#define J2K_MS_PPT 0xff61 /**< PPT marker value */ +#define J2K_MS_SOP 0xff91 /**< SOP marker value */ +#define J2K_MS_EPH 0xff92 /**< EPH marker value */ +#define J2K_MS_CRG 0xff63 /**< CRG marker value */ +#define J2K_MS_COM 0xff64 /**< COM marker value */ +/* UniPG>> */ +#ifdef USE_JPWL +#define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */ +#define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ +#define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ +#define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */ +#endif /* USE_JPWL */ +#ifdef USE_JPSEC +#define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */ +#define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */ +#endif /* USE_JPSEC */ +/* < there was a PPT marker for the present tile */ + int ppt; + /** used in case of multiple marker PPT (number of info already stored) */ + int ppt_store; + /** ppmbug1 */ + int ppt_len; + /** add fixed_quality */ + float distoratio[100]; + /** tile-component coding parameters */ + opj_tccp_t *tccps; +} opj_tcp_t; + +/** +Coding parameters +*/ +typedef struct opj_cp { + /** Digital cinema profile*/ + OPJ_CINEMA_MODE cinema; + /** Maximum rate for each component. If == 0, component size limitation is not considered */ + int max_comp_size; + /** Size of the image in bits*/ + int img_size; + /** Rsiz*/ + OPJ_RSIZ_CAPABILITIES rsiz; + /** Enabling Tile part generation*/ + char tp_on; + /** Flag determining tile part generation*/ + char tp_flag; + /** Position of tile part flag in progression order*/ + int tp_pos; + /** allocation by rate/distortion */ + int disto_alloc; + /** allocation by fixed layer */ + int fixed_alloc; + /** add fixed_quality */ + int fixed_quality; + /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ + int reduce; + /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ + int layer; + /** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */ + OPJ_LIMIT_DECODING limit_decoding; + /** XTOsiz */ + int tx0; + /** YTOsiz */ + int ty0; + /** XTsiz */ + int tdx; + /** YTsiz */ + int tdy; + /** comment for coding */ + char *comment; + /** number of tiles in width */ + int tw; + /** number of tiles in heigth */ + int th; + /** ID number of the tiles present in the codestream */ + int *tileno; + /** size of the vector tileno */ + int tileno_size; + /** packet header store there for futur use in t2_decode_packet */ + unsigned char *ppm_data; + /** pointer remaining on the first byte of the first header if ppm is used */ + unsigned char *ppm_data_first; + /** if ppm == 1 --> there was a PPM marker for the present tile */ + int ppm; + /** use in case of multiple marker PPM (number of info already store) */ + int ppm_store; + /** use in case of multiple marker PPM (case on non-finished previous info) */ + int ppm_previous; + /** ppmbug1 */ + int ppm_len; + /** tile coding parameters */ + opj_tcp_t *tcps; + /** fixed layer */ + int *matrice; +/* UniPG>> */ +#ifdef USE_JPWL + /** enables writing of EPC in MH, thus activating JPWL */ + bool epc_on; + /** enables writing of EPB, in case of activated JPWL */ + bool epb_on; + /** enables writing of ESD, in case of activated JPWL */ + bool esd_on; + /** enables writing of informative techniques of ESD, in case of activated JPWL */ + bool info_on; + /** enables writing of RED, in case of activated JPWL */ + bool red_on; + /** error protection method for MH (0,1,16,32,37-128) */ + int hprot_MH; + /** tile number of header protection specification (>=0) */ + int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** error protection methods for TPHs (0,1,16,32,37-128) */ + int hprot_TPH[JPWL_MAX_NO_TILESPECS]; + /** tile number of packet protection specification (>=0) */ + int pprot_tileno[JPWL_MAX_NO_PACKSPECS]; + /** packet number of packet protection specification (>=0) */ + int pprot_packno[JPWL_MAX_NO_PACKSPECS]; + /** error protection methods for packets (0,1,16,32,37-128) */ + int pprot[JPWL_MAX_NO_PACKSPECS]; + /** enables writing of ESD, (0/2/4 bytes) */ + int sens_size; + /** sensitivity addressing size (0=auto/2/4 bytes) */ + int sens_addr; + /** sensitivity range (0-3) */ + int sens_range; + /** sensitivity method for MH (-1,0-7) */ + int sens_MH; + /** tile number of sensitivity specification (>=0) */ + int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** sensitivity methods for TPHs (-1,0-7) */ + int sens_TPH[JPWL_MAX_NO_TILESPECS]; + /** enables JPWL correction at the decoder */ + bool correct; + /** expected number of components at the decoder */ + int exp_comps; + /** maximum number of tiles at the decoder */ + int max_tiles; +#endif /* USE_JPWL */ +/* <cp. +@param j2k J2K decompressor handle +@param parameters decompression parameters +*/ +void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters); +/** +Decode an image from a JPEG-2000 codestream +@param j2k J2K decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Decode an image form a JPT-stream (JPEG 2000, JPIP) +@param j2k J2K decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Creates a J2K compression structure +@param cinfo Codec context info +@return Returns a handle to a J2K compressor if successful, returns NULL otherwise +*/ +opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo); +/** +Destroy a J2K compressor handle +@param j2k J2K compressor handle to destroy +*/ +void j2k_destroy_compress(opj_j2k_t *j2k); +/** +Setup the encoder parameters using the current image and using user parameters. +Coding parameters are returned in j2k->cp. +@param j2k J2K compressor handle +@param parameters compression parameters +@param image input filled image +*/ +void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image); +/** +Converts an enum type progression order to string type +*/ +char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order); +/** +Encode an image into a JPEG-2000 codestream +@param j2k J2K compressor handle +@param cio Output buffer stream +@param image Image to encode +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns true if successful, returns false otherwise +*/ +bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __J2K_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/j2k_lib.c b/contrib/media/updf_newlib/libopenjpeg/j2k_lib.c new file mode 100755 index 000000000..d815f166d --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/j2k_lib.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef _WIN32 +#include +#else +#include +#include +#include +#endif /* _WIN32 */ +#include "opj_includes.h" + +double opj_clock(void) { +#ifdef _WIN32 + /* _WIN32: use QueryPerformance (very accurate) */ + LARGE_INTEGER freq , t ; + /* freq is the clock speed of the CPU */ + QueryPerformanceFrequency(&freq) ; + /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ + /* t is the high resolution performance counter (see MSDN) */ + QueryPerformanceCounter ( & t ) ; + return ( t.QuadPart /(double) freq.QuadPart ) ; +#else + /* Unix or Linux: use resource usage */ + struct rusage t; + double procTime; + /* (1) Get the rusage data structure at this moment (man getrusage) */ + getrusage(0,&t); + /* (2) What is the elapsed time ? - CPU time = User time + System time */ + /* (2a) Get the seconds */ + procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec; + /* (2b) More precisely! Get the microseconds part ! */ + return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ; +#endif +} + diff --git a/contrib/media/updf_newlib/libopenjpeg/j2k_lib.h b/contrib/media/updf_newlib/libopenjpeg/j2k_lib.h new file mode 100755 index 000000000..7df4d3677 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/j2k_lib.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __J2K_LIB_H +#define __J2K_LIB_H +/** +@file j2k_lib.h +@brief Internal functions + +The functions in J2K_LIB.C are internal utilities mainly used for timing. +*/ + +/** @defgroup MISC MISC - Miscellaneous internal functions */ +/*@{*/ + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ + +/** +Difference in successive opj_clock() calls tells you the elapsed time +@return Returns time in seconds +*/ +double opj_clock(void); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __J2K_LIB_H */ + diff --git a/contrib/media/updf_newlib/libopenjpeg/jp2.c b/contrib/media/updf_newlib/libopenjpeg/jp2.c new file mode 100755 index 000000000..20cf2e678 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/jp2.c @@ -0,0 +1,1089 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include "opj_includes.h" + +/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Read box headers +@param cinfo Codec context info +@param cio Input stream +@param box +@return Returns true if successful, returns false otherwise +*/ +static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box); +/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/ +/** +Read the IHDR box - Image Header box +@param jp2 JP2 handle +@param cio Input buffer stream +@return Returns true if successful, returns false otherwise +*/ +static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio); +static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio); +static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio); +static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio); +static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio); +/** +Write the FTYP box - File type box +@param jp2 JP2 handle +@param cio Output buffer stream +*/ +static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio); +/** +Read the FTYP box - File type box +@param jp2 JP2 handle +@param cio Input buffer stream +@return Returns true if successful, returns false otherwise +*/ +static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio); +static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); +static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset); +static void jp2_write_jp(opj_cio_t *cio); +/** +Read the JP box - JPEG 2000 signature +@param jp2 JP2 handle +@param cio Input buffer stream +@return Returns true if successful, returns false otherwise +*/ +static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio); +/** +Decode the structure of a JP2 file +@param jp2 JP2 handle +@param cio Input buffer stream +@param color Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_color_t *color); +/** +Apply collected palette data +@param color Collector for profile, cdef and pclr data +@param image +*/ +static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image); +/** +Collect palette data +@param jp2 JP2 handle +@param cio Input buffer stream +@param box +@param color Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color); +/** +Collect component mapping data +@param jp2 JP2 handle +@param cio Input buffer stream +@param box +@param color Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +static bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color); +/** +Collect colour specification data +@param jp2 JP2 handle +@param cio Input buffer stream +@param box +@param color Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color); +/*@}*/ + +/*@}*/ + +/* ----------------------------------------------------------------------- */ + +static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box) { + box->init_pos = cio_tell(cio); + box->length = cio_read(cio, 4); + box->type = cio_read(cio, 4); + if (box->length == 1) { + if (cio_read(cio, 4) != 0) { + opj_event_msg(cinfo, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n"); + return false; + } + box->length = cio_read(cio, 4); + if (box->length == 0) + box->length = cio_numbytesleft(cio) + 12; + } + else if (box->length == 0) { + box->length = cio_numbytesleft(cio) + 8; + } + + return true; +} + +#if 0 +static void jp2_write_url(opj_cio_t *cio, char *Idx_file) { + unsigned int i; + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_URL, 4); /* DBTL */ + cio_write(cio, 0, 1); /* VERS */ + cio_write(cio, 0, 3); /* FLAG */ + + if(Idx_file) { + for (i = 0; i < strlen(Idx_file); i++) { + cio_write(cio, Idx_file[i], 1); + } + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} +#endif + +static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) { + opj_jp2_box_t box; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + if (JP2_IHDR != box.type) { + opj_event_msg(cinfo, EVT_ERROR, "Expected IHDR Marker\n"); + return false; + } + + jp2->h = cio_read(cio, 4); /* HEIGHT */ + jp2->w = cio_read(cio, 4); /* WIDTH */ + jp2->numcomps = cio_read(cio, 2); /* NC */ + jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t)); + + jp2->bpc = cio_read(cio, 1); /* BPC */ + + jp2->C = cio_read(cio, 1); /* C */ + jp2->UnkC = cio_read(cio, 1); /* UnkC */ + jp2->IPR = cio_read(cio, 1); /* IPR */ + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cinfo, EVT_ERROR, "Error with IHDR Box\n"); + return false; + } + + return true; +} + +static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) { + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_IHDR, 4); /* IHDR */ + + cio_write(cio, jp2->h, 4); /* HEIGHT */ + cio_write(cio, jp2->w, 4); /* WIDTH */ + cio_write(cio, jp2->numcomps, 2); /* NC */ + + cio_write(cio, jp2->bpc, 1); /* BPC */ + + cio_write(cio, jp2->C, 1); /* C : Always 7 */ + cio_write(cio, jp2->UnkC, 1); /* UnkC, colorspace unknown */ + cio_write(cio, jp2->IPR, 1); /* IPR, no intellectual property */ + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) { + unsigned int i; + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_BPCC, 4); /* BPCC */ + + for (i = 0; i < jp2->numcomps; i++) { + cio_write(cio, jp2->comps[i].bpcc, 1); + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + + +static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) { + unsigned int i; + opj_jp2_box_t box; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + if (JP2_BPCC != box.type) { + opj_event_msg(cinfo, EVT_ERROR, "Expected BPCC Marker\n"); + return false; + } + + for (i = 0; i < jp2->numcomps; i++) { + jp2->comps[i].bpcc = cio_read(cio, 1); + } + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n"); + return false; + } + + return true; +} + +static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) { + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_COLR, 4); /* COLR */ + + cio_write(cio, jp2->meth, 1); /* METH */ + cio_write(cio, jp2->precedence, 1); /* PRECEDENCE */ + cio_write(cio, jp2->approx, 1); /* APPROX */ + + if (jp2->meth == 1) { + cio_write(cio, jp2->enumcs, 4); /* EnumCS */ + } else { + cio_write(cio, 0, 1); /* PROFILE (??) */ + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +static void jp2_free_pclr(opj_jp2_color_t *color) +{ + opj_free(color->jp2_pclr->channel_sign); + opj_free(color->jp2_pclr->channel_size); + opj_free(color->jp2_pclr->entries); + + if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap); + + opj_free(color->jp2_pclr); color->jp2_pclr = NULL; +} + +static void free_color_data(opj_jp2_color_t *color) +{ + if(color->jp2_pclr) + { + jp2_free_pclr(color); + } + if(color->jp2_cdef) + { + if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info); + opj_free(color->jp2_cdef); + } + if(color->icc_profile_buf) opj_free(color->icc_profile_buf); +} + +static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image) +{ + opj_image_comp_t *old_comps, *new_comps; + unsigned char *channel_size, *channel_sign; + unsigned int *entries; + opj_jp2_cmap_comp_t *cmap; + int *src, *dst; + unsigned int j, max; + unsigned short i, nr_channels, cmp, pcol; + int k, top_k; + + channel_size = color->jp2_pclr->channel_size; + channel_sign = color->jp2_pclr->channel_sign; + entries = color->jp2_pclr->entries; + cmap = color->jp2_pclr->cmap; + nr_channels = color->jp2_pclr->nr_channels; + + old_comps = image->comps; + new_comps = (opj_image_comp_t*) + opj_malloc(nr_channels * sizeof(opj_image_comp_t)); + + for(i = 0; i < nr_channels; ++i) + { + pcol = cmap[i].pcol; cmp = cmap[i].cmp; + + new_comps[pcol] = old_comps[cmp]; + + if(cmap[i].mtyp == 0) /* Direct use */ + { + old_comps[cmp].data = NULL; continue; + } +/* Palette mapping: */ + new_comps[pcol].data = (int*) + opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(int)); + new_comps[pcol].prec = channel_size[i]; + new_comps[pcol].sgnd = channel_sign[i]; + } + top_k = color->jp2_pclr->nr_entries - 1; + + for(i = 0; i < nr_channels; ++i) + { +/* Direct use: */ + if(cmap[i].mtyp == 0) continue; + +/* Palette mapping: */ + cmp = cmap[i].cmp; pcol = cmap[i].pcol; + src = old_comps[cmp].data; + dst = new_comps[pcol].data; + max = new_comps[pcol].w * new_comps[pcol].h; + + for(j = 0; j < max; ++j) + { +/* The index */ + if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k; +/* The colour */ + dst[j] = entries[k * nr_channels + pcol]; + } + } + max = image->numcomps; + for(i = 0; i < max; ++i) + { + if(old_comps[i].data) opj_free(old_comps[i].data); + } + opj_free(old_comps); + image->comps = new_comps; + image->numcomps = nr_channels; + + jp2_free_pclr(color); + +}/* apply_pclr() */ + +static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color) +{ + opj_jp2_pclr_t *jp2_pclr; + unsigned char *channel_size, *channel_sign; + unsigned int *entries; + unsigned short nr_entries, nr_channels; + unsigned short i, j; + unsigned char uc; + +/* Part 1, I.5.3.4: 'There shall be at most one Palette box inside + * a JP2 Header box' : +*/ + if(color->jp2_pclr) return false; + + nr_entries = cio_read(cio, 2); /* NE */ + nr_channels = cio_read(cio, 1);/* NPC */ + + entries = (unsigned int*) + opj_malloc(nr_channels * nr_entries * sizeof(unsigned int)); + channel_size = (unsigned char*)opj_malloc(nr_channels); + channel_sign = (unsigned char*)opj_malloc(nr_channels); + + jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t)); + jp2_pclr->channel_sign = channel_sign; + jp2_pclr->channel_size = channel_size; + jp2_pclr->entries = entries; + jp2_pclr->nr_entries = nr_entries; + jp2_pclr->nr_channels = nr_channels; + jp2_pclr->cmap = NULL; + + color->jp2_pclr = jp2_pclr; + + for(i = 0; i < nr_channels; ++i) + { + uc = cio_read(cio, 1); /* Bi */ + channel_size[i] = (uc & 0x7f) + 1; + channel_sign[i] = (uc & 0x80)?1:0; + } + + for(j = 0; j < nr_entries; ++j) + { + for(i = 0; i < nr_channels; ++i) + { +/* Cji */ + *entries++ = cio_read(cio, channel_size[i]>>3); + } + } + + return true; +}/* jp2_read_pclr() */ + +static bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color) +{ + opj_jp2_cmap_comp_t *cmap; + unsigned short i, nr_channels; + +/* Need nr_channels: */ + if(color->jp2_pclr == NULL) return false; + +/* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box + * inside a JP2 Header box' : +*/ + if(color->jp2_pclr->cmap) return false; + + nr_channels = color->jp2_pclr->nr_channels; + cmap = (opj_jp2_cmap_comp_t*) + opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t)); + + for(i = 0; i < nr_channels; ++i) + { + cmap[i].cmp = cio_read(cio, 2); + cmap[i].mtyp = cio_read(cio, 1); + cmap[i].pcol = cio_read(cio, 1); + + } + color->jp2_pclr->cmap = cmap; + + return true; +}/* jp2_read_cmap() */ + +static void jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color) +{ + opj_jp2_cdef_info_t *info; + int color_space; + unsigned short i, n, cn, typ, asoc, acn; + + color_space = image->color_space; + info = color->jp2_cdef->info; + n = color->jp2_cdef->n; + + for(i = 0; i < n; ++i) + { +/* WATCH: acn = asoc - 1 ! */ + if((asoc = info[i].asoc) == 0) continue; + + cn = info[i].cn; typ = info[i].typ; acn = asoc - 1; + + if(cn != acn) + { + opj_image_comp_t saved; + + memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t)); + memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t)); + memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t)); + + info[i].asoc = cn + 1; + info[acn].asoc = info[acn].cn + 1; + } + } + if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info); + + opj_free(color->jp2_cdef); color->jp2_cdef = NULL; + +}/* jp2_apply_cdef() */ + +static bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color) +{ + opj_jp2_cdef_info_t *info; + unsigned short i, n; + +/* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box + * inside a JP2 Header box.' +*/ + if(color->jp2_cdef) return false; + + if((n = cio_read(cio, 2)) == 0) return false; /* szukw000: FIXME */ + + info = (opj_jp2_cdef_info_t*) + opj_malloc(n * sizeof(opj_jp2_cdef_info_t)); + + color->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t)); + color->jp2_cdef->info = info; + color->jp2_cdef->n = n; + + for(i = 0; i < n; ++i) + { + info[i].cn = cio_read(cio, 2); + info[i].typ = cio_read(cio, 2); + info[i].asoc = cio_read(cio, 2); + + } + return true; +}/* jp2_read_cdef() */ + +static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_box_t *box, opj_jp2_color_t *color) +{ + int skip_len; + opj_common_ptr cinfo; + +/* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour + * Specification boxes after the first.' +*/ + if(color->jp2_has_colr) return false; + + cinfo = jp2->cinfo; + + jp2->meth = cio_read(cio, 1); /* METH */ + jp2->precedence = cio_read(cio, 1); /* PRECEDENCE */ + jp2->approx = cio_read(cio, 1); /* APPROX */ + + if (jp2->meth == 1) + { + jp2->enumcs = cio_read(cio, 4); /* EnumCS */ + } + else + { +/* skip PROFILE */ + skip_len = box->init_pos + box->length - cio_tell(cio); + if (skip_len < 0) + { + opj_event_msg(cinfo, EVT_ERROR, "Error with COLR box size\n"); + return false; + } + if(skip_len > 0) + { + unsigned char *start; + + start = cio_getbp(cio); + color->icc_profile_buf = (unsigned char*)opj_malloc(skip_len); + color->icc_profile_len = skip_len; + + cio_skip(cio, box->init_pos + box->length - cio_tell(cio)); + + memcpy(color->icc_profile_buf, start, skip_len); + } + } + + if (cio_tell(cio) - box->init_pos != box->length) + { + opj_event_msg(cinfo, EVT_ERROR, "Error with COLR Box\n"); + return false; + } + color->jp2_has_colr = 1; + + return true; +}/* jp2_read_colr() */ + +bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color) +{ + opj_jp2_box_t box; + unsigned int jp2h_end; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + do + { + if (JP2_JP2H != box.type) + { + if (box.type == JP2_JP2C) + { + opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n"); + return false; + } + cio_skip(cio, box.length - 8); + + if(cio->bp >= cio->end) return false; + + jp2_read_boxhdr(cinfo, cio, &box); + } + } while(JP2_JP2H != box.type); + + if (!jp2_read_ihdr(jp2, cio)) + return false; + jp2h_end = box.init_pos + box.length; + + if (jp2->bpc == 255) + { + if (!jp2_read_bpcc(jp2, cio)) + return false; + } + jp2_read_boxhdr(cinfo, cio, &box); + + while(cio_tell(cio) < jp2h_end) + { + if(box.type == JP2_COLR) + { + if( !jp2_read_colr(jp2, cio, &box, color)) + { + cio_seek(cio, box.init_pos + 8); + cio_skip(cio, box.length - 8); + } + jp2_read_boxhdr(cinfo, cio, &box); + continue; + } + if(box.type == JP2_CDEF) + { + if( !jp2_read_cdef(jp2, cio, &box, color)) + { + cio_seek(cio, box.init_pos + 8); + cio_skip(cio, box.length - 8); + } + jp2_read_boxhdr(cinfo, cio, &box); + continue; + } + if(box.type == JP2_PCLR) + { + if( !jp2_read_pclr(jp2, cio, &box, color)) + { + cio_seek(cio, box.init_pos + 8); + cio_skip(cio, box.length - 8); + } + jp2_read_boxhdr(cinfo, cio, &box); + continue; + } + if(box.type == JP2_CMAP) + { + if( !jp2_read_cmap(jp2, cio, &box, color)) + { + cio_seek(cio, box.init_pos + 8); + cio_skip(cio, box.length - 8); + } + jp2_read_boxhdr(cinfo, cio, &box); + continue; + } + cio_seek(cio, box.init_pos + 8); + cio_skip(cio, box.length - 8); + jp2_read_boxhdr(cinfo, cio, &box); + + }/* while(cio_tell(cio) < box_end) */ + + cio_seek(cio, jp2h_end); + +/* Part 1, I.5.3.3 : 'must contain at least one' */ + return (color->jp2_has_colr == 1); + +}/* jp2_read_jp2h() */ + +opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, + opj_codestream_info_t *cstr_info) +{ + opj_common_ptr cinfo; + opj_image_t *image = NULL; + opj_jp2_color_t color; + + if(!jp2 || !cio) + { + return NULL; + } + memset(&color, 0, sizeof(opj_jp2_color_t)); + cinfo = jp2->cinfo; + +/* JP2 decoding */ + if(!jp2_read_struct(jp2, cio, &color)) + { + free_color_data(&color); + opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n"); + return NULL; + } + +/* J2K decoding */ + image = j2k_decode(jp2->j2k, cio, cstr_info); + + if(!image) + { + free_color_data(&color); + opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n"); + return NULL; + } + +/* Set Image Color Space */ + if (jp2->enumcs == 16) + image->color_space = CLRSPC_SRGB; + else if (jp2->enumcs == 17) + image->color_space = CLRSPC_GRAY; + else if (jp2->enumcs == 18) + image->color_space = CLRSPC_SYCC; + else + image->color_space = CLRSPC_UNKNOWN; + + if(color.jp2_cdef) + { + jp2_apply_cdef(image, &color); + } + if(color.jp2_pclr) + { +/* Part 1, I.5.3.4: Either both or none : */ + if( !color.jp2_pclr->cmap) + jp2_free_pclr(&color); + else + jp2_apply_pclr(&color, image); + } + if(color.icc_profile_buf) + { + image->icc_profile_buf = color.icc_profile_buf; + color.icc_profile_buf = NULL; + image->icc_profile_len = color.icc_profile_len; + } + return image; + +}/* jp2_decode() */ + + +void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) { + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_JP2H, 4); /* JP2H */ + + jp2_write_ihdr(jp2, cio); + + if (jp2->bpc == 255) { + jp2_write_bpcc(jp2, cio); + } + jp2_write_colr(jp2, cio); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) { + unsigned int i; + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_FTYP, 4); /* FTYP */ + + cio_write(cio, jp2->brand, 4); /* BR */ + cio_write(cio, jp2->minversion, 4); /* MinV */ + + for (i = 0; i < jp2->numcl; i++) { + cio_write(cio, jp2->cl[i], 4); /* CL */ + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) { + int i; + opj_jp2_box_t box; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + + if (JP2_FTYP != box.type) { + opj_event_msg(cinfo, EVT_ERROR, "Expected FTYP Marker\n"); + return false; + } + + jp2->brand = cio_read(cio, 4); /* BR */ + jp2->minversion = cio_read(cio, 4); /* MinV */ + jp2->numcl = (box.length - 16) / 4; + jp2->cl = (unsigned int *) opj_malloc(jp2->numcl * sizeof(unsigned int)); + + for (i = 0; i < (int)jp2->numcl; i++) { + jp2->cl[i] = cio_read(cio, 4); /* CLi */ + } + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cinfo, EVT_ERROR, "Error with FTYP Box\n"); + return false; + } + + return true; +} + +static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { + unsigned int j2k_codestream_offset, j2k_codestream_length; + opj_jp2_box_t box; + + opj_j2k_t *j2k = jp2->j2k; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_JP2C, 4); /* JP2C */ + + /* J2K encoding */ + j2k_codestream_offset = cio_tell(cio); + if(!j2k_encode(j2k, cio, image, cstr_info)) { + opj_event_msg(j2k->cinfo, EVT_ERROR, "Failed to encode image\n"); + return 0; + } + j2k_codestream_length = cio_tell(cio) - j2k_codestream_offset; + + jp2->j2k_codestream_offset = j2k_codestream_offset; + jp2->j2k_codestream_length = j2k_codestream_length; + + box.length = 8 + jp2->j2k_codestream_length; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); + + return box.length; +} + +static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset) { + opj_jp2_box_t box; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + do { + if(JP2_JP2C != box.type) { + cio_skip(cio, box.length - 8); + jp2_read_boxhdr(cinfo, cio, &box); + } + } while(JP2_JP2C != box.type); + + *j2k_codestream_offset = cio_tell(cio); + *j2k_codestream_length = box.length - 8; + + return true; +} + +static void jp2_write_jp(opj_cio_t *cio) { + opj_jp2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, JP2_JP, 4); /* JP2 signature */ + cio_write(cio, 0x0d0a870a, 4); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) { + opj_jp2_box_t box; + + opj_common_ptr cinfo = jp2->cinfo; + + jp2_read_boxhdr(cinfo, cio, &box); + if (JP2_JP != box.type) { + opj_event_msg(cinfo, EVT_ERROR, "Expected JP Marker\n"); + return false; + } + if (0x0d0a870a != cio_read(cio, 4)) { + opj_event_msg(cinfo, EVT_ERROR, "Error with JP Marker\n"); + return false; + } + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cinfo, EVT_ERROR, "Error with JP Box size\n"); + return false; + } + + return true; +} + + +static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio, + opj_jp2_color_t *color) { + if (!jp2_read_jp(jp2, cio)) + return false; + if (!jp2_read_ftyp(jp2, cio)) + return false; + if (!jp2_read_jp2h(jp2, cio, color)) + return false; + if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, &jp2->j2k_codestream_offset)) + return false; + + return true; +} + +/* ----------------------------------------------------------------------- */ +/* JP2 decoder interface */ +/* ----------------------------------------------------------------------- */ + +opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo) { + opj_jp2_t *jp2 = (opj_jp2_t*) opj_calloc(1, sizeof(opj_jp2_t)); + if(jp2) { + jp2->cinfo = cinfo; + /* create the J2K codec */ + jp2->j2k = j2k_create_decompress(cinfo); + if(jp2->j2k == NULL) { + jp2_destroy_decompress(jp2); + return NULL; + } + } + return jp2; +} + +void jp2_destroy_decompress(opj_jp2_t *jp2) { + if(jp2) { + /* destroy the J2K codec */ + j2k_destroy_decompress(jp2->j2k); + + if(jp2->comps) { + opj_free(jp2->comps); + } + if(jp2->cl) { + opj_free(jp2->cl); + } + opj_free(jp2); + } +} + +void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters) { + /* setup the J2K codec */ + j2k_setup_decoder(jp2->j2k, parameters); + /* further JP2 initializations go here */ +} + +/* ----------------------------------------------------------------------- */ +/* JP2 encoder interface */ +/* ----------------------------------------------------------------------- */ + +opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo) { + opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t)); + if(jp2) { + jp2->cinfo = cinfo; + /* create the J2K codec */ + jp2->j2k = j2k_create_compress(cinfo); + if(jp2->j2k == NULL) { + jp2_destroy_compress(jp2); + return NULL; + } + } + return jp2; +} + +void jp2_destroy_compress(opj_jp2_t *jp2) { + if(jp2) { + /* destroy the J2K codec */ + j2k_destroy_compress(jp2->j2k); + + if(jp2->comps) { + opj_free(jp2->comps); + } + if(jp2->cl) { + opj_free(jp2->cl); + } + opj_free(jp2); + } +} + +void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image) { + int i; + int depth_0, sign; + + if(!jp2 || !parameters || !image) + return; + + /* setup the J2K codec */ + /* ------------------- */ + + /* Check if number of components respects standard */ + if (image->numcomps < 1 || image->numcomps > 16384) { + opj_event_msg(jp2->cinfo, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n"); + return; + } + + j2k_setup_encoder(jp2->j2k, parameters, image); + + /* setup the JP2 codec */ + /* ------------------- */ + + /* Profile box */ + + jp2->brand = JP2_JP2; /* BR */ + jp2->minversion = 0; /* MinV */ + jp2->numcl = 1; + jp2->cl = (unsigned int*) opj_malloc(jp2->numcl * sizeof(unsigned int)); + jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */ + + /* Image Header box */ + + jp2->numcomps = image->numcomps; /* NC */ + jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t)); + jp2->h = image->y1 - image->y0; /* HEIGHT */ + jp2->w = image->x1 - image->x0; /* WIDTH */ + /* BPC */ + depth_0 = image->comps[0].prec - 1; + sign = image->comps[0].sgnd; + jp2->bpc = depth_0 + (sign << 7); + for (i = 1; i < image->numcomps; i++) { + int depth = image->comps[i].prec - 1; + sign = image->comps[i].sgnd; + if (depth_0 != depth) + jp2->bpc = 255; + } + jp2->C = 7; /* C : Always 7 */ + jp2->UnkC = 0; /* UnkC, colorspace specified in colr box */ + jp2->IPR = 0; /* IPR, no intellectual property */ + + /* BitsPerComponent box */ + + for (i = 0; i < image->numcomps; i++) { + jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7); + } + + /* Colour Specification box */ + + if ((image->numcomps == 1 || image->numcomps == 3) && (jp2->bpc != 255)) { + jp2->meth = 1; /* METH: Enumerated colourspace */ + } else { + jp2->meth = 2; /* METH: Restricted ICC profile */ + } + if (jp2->meth == 1) { + if (image->color_space == 1) + jp2->enumcs = 16; /* sRGB as defined by IEC 61966–2–1 */ + else if (image->color_space == 2) + jp2->enumcs = 17; /* greyscale */ + else if (image->color_space == 3) + jp2->enumcs = 18; /* YUV */ + } else { + jp2->enumcs = 0; /* PROFILE (??) */ + } + jp2->precedence = 0; /* PRECEDENCE */ + jp2->approx = 0; /* APPROX */ + +} + +bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { + + /* JP2 encoding */ + + /* JPEG 2000 Signature box */ + jp2_write_jp(cio); + /* File Type box */ + jp2_write_ftyp(jp2, cio); + /* JP2 Header box */ + jp2_write_jp2h(jp2, cio); + + /* J2K encoding */ + + if(!jp2_write_jp2c(jp2, cio, image, cstr_info)) { + opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n"); + return false; + } + + return true; +} + + diff --git a/contrib/media/updf_newlib/libopenjpeg/jp2.h b/contrib/media/updf_newlib/libopenjpeg/jp2.h new file mode 100755 index 000000000..9ad662cb9 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/jp2.h @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __JP2_H +#define __JP2_H +/** +@file jp2.h +@brief The JPEG-2000 file format Reader/Writer (JP2) + +*/ + +/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ +/*@{*/ + +#define JPIP_JPIP 0x6a706970 + +#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */ +#define JP2_FTYP 0x66747970 /**< File type box */ +#define JP2_JP2H 0x6a703268 /**< JP2 header box */ +#define JP2_IHDR 0x69686472 /**< Image header box */ +#define JP2_COLR 0x636f6c72 /**< Colour specification box */ +#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */ +#define JP2_URL 0x75726c20 /**< URL box */ +#define JP2_DTBL 0x6474626c /**< Data Reference box */ +#define JP2_BPCC 0x62706363 /**< Bits per component box */ +#define JP2_JP2 0x6a703220 /**< File type fields */ +#define JP2_PCLR 0x70636c72 /**< Palette box */ +#define JP2_CMAP 0x636d6170 /**< Component Mapping box */ +#define JP2_CDEF 0x63646566 /**< Channel Definition box */ + +/* ----------------------------------------------------------------------- */ +/** +Channel description: channel index, type, assocation +*/ +typedef struct opj_jp2_cdef_info +{ + unsigned short cn, typ, asoc; +} opj_jp2_cdef_info_t; + +/** +Channel descriptions and number of descriptions +*/ +typedef struct opj_jp2_cdef +{ + opj_jp2_cdef_info_t *info; + unsigned short n; +} opj_jp2_cdef_t; + +/** +Component mappings: channel index, mapping type, palette index +*/ +typedef struct opj_jp2_cmap_comp +{ + unsigned short cmp; + unsigned char mtyp, pcol; +} opj_jp2_cmap_comp_t; + +/** +Palette data: table entries, palette columns +*/ +typedef struct opj_jp2_pclr +{ + unsigned int *entries; + unsigned char *channel_sign; + unsigned char *channel_size; + opj_jp2_cmap_comp_t *cmap; + unsigned short nr_entries, nr_channels; +} opj_jp2_pclr_t; + +/** +Collector for ICC profile, palette, component mapping, channel description +*/ +typedef struct opj_jp2_color +{ + unsigned char *icc_profile_buf; + int icc_profile_len; + + opj_jp2_cdef_t *jp2_cdef; + opj_jp2_pclr_t *jp2_pclr; + unsigned char jp2_has_colr; +} opj_jp2_color_t; + +/** +JP2 component +*/ +typedef struct opj_jp2_comps { + int depth; + int sgnd; + int bpcc; +} opj_jp2_comps_t; + +/** +JPEG-2000 file format reader/writer +*/ +typedef struct opj_jp2 { + /** codec context */ + opj_common_ptr cinfo; + /** handle to the J2K codec */ + opj_j2k_t *j2k; + unsigned int w; + unsigned int h; + unsigned int numcomps; + unsigned int bpc; + unsigned int C; + unsigned int UnkC; + unsigned int IPR; + unsigned int meth; + unsigned int approx; + unsigned int enumcs; + unsigned int precedence; + unsigned int brand; + unsigned int minversion; + unsigned int numcl; + unsigned int *cl; + opj_jp2_comps_t *comps; + unsigned int j2k_codestream_offset; + unsigned int j2k_codestream_length; +} opj_jp2_t; + +/** +JP2 Box +*/ +typedef struct opj_jp2_box { + int length; + int type; + int init_pos; +} opj_jp2_box_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Write the JP2H box - JP2 Header box (used in MJ2) +@param jp2 JP2 handle +@param cio Output buffer stream +*/ +void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio); +/** +Read the JP2H box - JP2 Header box (used in MJ2) +@param jp2 JP2 handle +@param cio Input buffer stream +@param ext Collector for profile, cdef and pclr data +@return Returns true if successful, returns false otherwise +*/ +bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color); +/** +Creates a JP2 decompression structure +@param cinfo Codec context info +@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise +*/ +opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo); +/** +Destroy a JP2 decompressor handle +@param jp2 JP2 decompressor handle to destroy +*/ +void jp2_destroy_decompress(opj_jp2_t *jp2); +/** +Setup the decoder decoding parameters using user parameters. +Decoding parameters are returned in jp2->j2k->cp. +@param jp2 JP2 decompressor handle +@param parameters decompression parameters +*/ +void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters); +/** +Decode an image from a JPEG-2000 file stream +@param jp2 JP2 decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Creates a JP2 compression structure +@param cinfo Codec context info +@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise +*/ +opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo); +/** +Destroy a JP2 compressor handle +@param jp2 JP2 compressor handle to destroy +*/ +void jp2_destroy_compress(opj_jp2_t *jp2); +/** +Setup the encoder parameters using the current image and using user parameters. +Coding parameters are returned in jp2->j2k->cp. +@param jp2 JP2 compressor handle +@param parameters compression parameters +@param image input filled image +*/ +void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image); +/** +Encode an image into a JPEG-2000 file stream +@param jp2 JP2 compressor handle +@param cio Output buffer stream +@param image Image to encode +@param cstr_info Codestream information structure if required, NULL otherwise +@return Returns true if successful, returns false otherwise +*/ +bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __JP2_H */ + diff --git a/contrib/media/updf_newlib/libopenjpeg/jpt.c b/contrib/media/updf_newlib/libopenjpeg/jpt.c new file mode 100755 index 000000000..a2566ea88 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/jpt.c @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +/* + * Read the information contains in VBAS [JPP/JPT stream message header] + * Store information (7 bits) in value + * + */ +unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) { + unsigned char elmt; + + elmt = cio_read(cio, 1); + while ((elmt >> 7) == 1) { + value = (value << 7); + value |= (elmt & 0x7f); + elmt = cio_read(cio, 1); + } + value = (value << 7); + value |= (elmt & 0x7f); + + return value; +} + +/* + * Initialize the value of the message header structure + * + */ +void jpt_init_msg_header(opj_jpt_msg_header_t * header) { + header->Id = 0; /* In-class Identifier */ + header->last_byte = 0; /* Last byte information */ + header->Class_Id = 0; /* Class Identifier */ + header->CSn_Id = 0; /* CSn : index identifier */ + header->Msg_offset = 0; /* Message offset */ + header->Msg_length = 0; /* Message length */ + header->Layer_nb = 0; /* Auxiliary for JPP case */ +} + +/* + * Re-initialize the value of the message header structure + * + * Only parameters always present in message header + * + */ +void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) { + header->Id = 0; /* In-class Identifier */ + header->last_byte = 0; /* Last byte information */ + header->Msg_offset = 0; /* Message offset */ + header->Msg_length = 0; /* Message length */ +} + +/* + * Read the message header for a JPP/JPT - stream + * + */ +void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) { + unsigned char elmt, Class = 0, CSn = 0; + jpt_reinit_msg_header(header); + + /* ------------- */ + /* VBAS : Bin-ID */ + /* ------------- */ + elmt = cio_read(cio, 1); + + /* See for Class and CSn */ + switch ((elmt >> 5) & 0x03) { + case 0: + opj_event_msg(cinfo, EVT_ERROR, "Forbidden value encounter in message header !!\n"); + break; + case 1: + Class = 0; + CSn = 0; + break; + case 2: + Class = 1; + CSn = 0; + break; + case 3: + Class = 1; + CSn = 1; + break; + default: + break; + } + + /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */ + if (((elmt >> 4) & 0x01) == 1) + header->last_byte = 1; + + /* In-class identifier */ + header->Id |= (elmt & 0x0f); + if ((elmt >> 7) == 1) + header->Id = jpt_read_VBAS_info(cio, header->Id); + + /* ------------ */ + /* VBAS : Class */ + /* ------------ */ + if (Class == 1) { + header->Class_Id = 0; + header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id); + } + + /* ---------- */ + /* VBAS : CSn */ + /* ---------- */ + if (CSn == 1) { + header->CSn_Id = 0; + header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id); + } + + /* ----------------- */ + /* VBAS : Msg_offset */ + /* ----------------- */ + header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset); + + /* ----------------- */ + /* VBAS : Msg_length */ + /* ----------------- */ + header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length); + + /* ---------- */ + /* VBAS : Aux */ + /* ---------- */ + if ((header->Class_Id & 0x01) == 1) { + header->Layer_nb = 0; + header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb); + } +} diff --git a/contrib/media/updf_newlib/libopenjpeg/jpt.h b/contrib/media/updf_newlib/libopenjpeg/jpt.h new file mode 100755 index 000000000..eb01f98eb --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/jpt.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __JPT_H +#define __JPT_H +/** +@file jpt.h +@brief JPT-stream reader (JPEG 2000, JPIP) + +JPT-stream functions are implemented in J2K.C. +*/ + +/** +Message Header JPT stream structure +*/ +typedef struct opj_jpt_msg_header { + /** In-class Identifier */ + unsigned int Id; + /** Last byte information */ + unsigned int last_byte; + /** Class Identifier */ + unsigned int Class_Id; + /** CSn : index identifier */ + unsigned int CSn_Id; + /** Message offset */ + unsigned int Msg_offset; + /** Message length */ + unsigned int Msg_length; + /** Auxiliary for JPP case */ + unsigned int Layer_nb; +} opj_jpt_msg_header_t; + +/* ----------------------------------------------------------------------- */ + +/** +Initialize the value of the message header structure +@param header Message header structure +*/ +void jpt_init_msg_header(opj_jpt_msg_header_t * header); + +/** +Read the message header for a JPP/JPT - stream +@param cinfo Codec context info +@param cio CIO handle +@param header Message header structure +*/ +void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header); + +#endif diff --git a/contrib/media/updf_newlib/libopenjpeg/lrintf.c b/contrib/media/updf_newlib/libopenjpeg/lrintf.c new file mode 100755 index 000000000..c72f058a3 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/lrintf.c @@ -0,0 +1,6 @@ +#include +/* +long long int lrintf(float x) { + return floor(x); +} +*/ diff --git a/contrib/media/updf_newlib/libopenjpeg/mct.c b/contrib/media/updf_newlib/libopenjpeg/mct.c new file mode 100755 index 000000000..870993b06 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/mct.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef __SSE__ +#include +#endif + +#include "opj_includes.h" + +/* */ +/* This table contains the norms of the basis function of the reversible MCT. */ +/* */ +static const double mct_norms[3] = { 1.732, .8292, .8292 }; + +/* */ +/* This table contains the norms of the basis function of the irreversible MCT. */ +/* */ +static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 }; + +/* */ +/* Foward reversible MCT. */ +/* */ +void mct_encode( + int* restrict c0, + int* restrict c1, + int* restrict c2, + int n) +{ + int i; + for(i = 0; i < n; ++i) { + int r = c0[i]; + int g = c1[i]; + int b = c2[i]; + int y = (r + (g * 2) + b) >> 2; + int u = b - g; + int v = r - g; + c0[i] = y; + c1[i] = u; + c2[i] = v; + } +} + +/* */ +/* Inverse reversible MCT. */ +/* */ +void mct_decode( + int* restrict c0, + int* restrict c1, + int* restrict c2, + int n) +{ + int i; + for (i = 0; i < n; ++i) { + int y = c0[i]; + int u = c1[i]; + int v = c2[i]; + int g = y - ((u + v) >> 2); + int r = v + g; + int b = u + g; + c0[i] = r; + c1[i] = g; + c2[i] = b; + } +} + +/* */ +/* Get norm of basis function of reversible MCT. */ +/* */ +double mct_getnorm(int compno) { + return mct_norms[compno]; +} + +/* */ +/* Foward irreversible MCT. */ +/* */ +void mct_encode_real( + int* restrict c0, + int* restrict c1, + int* restrict c2, + int n) +{ + int i; + for(i = 0; i < n; ++i) { + int r = c0[i]; + int g = c1[i]; + int b = c2[i]; + int y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934); + int u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096); + int v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666); + c0[i] = y; + c1[i] = u; + c2[i] = v; + } +} + +/* */ +/* Inverse irreversible MCT. */ +/* */ +void mct_decode_real( + float* restrict c0, + float* restrict c1, + float* restrict c2, + int n) +{ + int i; +#ifdef __SSE__ + __m128 vrv, vgu, vgv, vbu; + vrv = _mm_set1_ps(1.402f); + vgu = _mm_set1_ps(0.34413f); + vgv = _mm_set1_ps(0.71414f); + vbu = _mm_set1_ps(1.772f); + for (i = 0; i < (n >> 3); ++i) { + __m128 vy, vu, vv; + __m128 vr, vg, vb; + + vy = _mm_load_ps(c0); + vu = _mm_load_ps(c1); + vv = _mm_load_ps(c2); + vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv)); + vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv)); + vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu)); + _mm_store_ps(c0, vr); + _mm_store_ps(c1, vg); + _mm_store_ps(c2, vb); + c0 += 4; + c1 += 4; + c2 += 4; + + vy = _mm_load_ps(c0); + vu = _mm_load_ps(c1); + vv = _mm_load_ps(c2); + vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv)); + vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv)); + vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu)); + _mm_store_ps(c0, vr); + _mm_store_ps(c1, vg); + _mm_store_ps(c2, vb); + c0 += 4; + c1 += 4; + c2 += 4; + } + n &= 7; +#endif + for(i = 0; i < n; ++i) { + float y = c0[i]; + float u = c1[i]; + float v = c2[i]; + float r = y + (v * 1.402f); + float g = y - (u * 0.34413f) - (v * (0.71414f)); + float b = y + (u * 1.772f); + c0[i] = r; + c1[i] = g; + c2[i] = b; + } +} + +/* */ +/* Get norm of basis function of irreversible MCT. */ +/* */ +double mct_getnorm_real(int compno) { + return mct_norms_real[compno]; +} diff --git a/contrib/media/updf_newlib/libopenjpeg/mct.h b/contrib/media/updf_newlib/libopenjpeg/mct.h new file mode 100755 index 000000000..84e3f8add --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/mct.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __MCT_H +#define __MCT_H +/** +@file mct.h +@brief Implementation of a multi-component transforms (MCT) + +The functions in MCT.C have for goal to realize reversible and irreversible multicomponent +transform. The functions in MCT.C are used by some function in TCD.C. +*/ + +/** @defgroup MCT MCT - Implementation of a multi-component transform */ +/*@{*/ + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Apply a reversible multi-component transform to an image +@param c0 Samples for red component +@param c1 Samples for green component +@param c2 Samples blue component +@param n Number of samples for each component +*/ +void mct_encode(int *c0, int *c1, int *c2, int n); +/** +Apply a reversible multi-component inverse transform to an image +@param c0 Samples for luminance component +@param c1 Samples for red chrominance component +@param c2 Samples for blue chrominance component +@param n Number of samples for each component +*/ +void mct_decode(int *c0, int *c1, int *c2, int n); +/** +Get norm of the basis function used for the reversible multi-component transform +@param compno Number of the component (0->Y, 1->U, 2->V) +@return +*/ +double mct_getnorm(int compno); + +/** +Apply an irreversible multi-component transform to an image +@param c0 Samples for red component +@param c1 Samples for green component +@param c2 Samples blue component +@param n Number of samples for each component +*/ +void mct_encode_real(int *c0, int *c1, int *c2, int n); +/** +Apply an irreversible multi-component inverse transform to an image +@param c0 Samples for luminance component +@param c1 Samples for red chrominance component +@param c2 Samples for blue chrominance component +@param n Number of samples for each component +*/ +void mct_decode_real(float* c0, float* c1, float* c2, int n); +/** +Get norm of the basis function used for the irreversible multi-component transform +@param compno Number of the component (0->Y, 1->U, 2->V) +@return +*/ +double mct_getnorm_real(int compno); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __MCT_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/mqc.c b/contrib/media/updf_newlib/libopenjpeg/mqc.c new file mode 100755 index 000000000..5d25238ee --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/mqc.c @@ -0,0 +1,593 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +/** @defgroup MQC MQC - Implementation of an MQ-Coder */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Output a byte, doing bit-stuffing if necessary. +After a 0xff byte, the next byte must be smaller than 0x90. +@param mqc MQC handle +*/ +static void mqc_byteout(opj_mqc_t *mqc); +/** +Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000 +@param mqc MQC handle +*/ +static void mqc_renorme(opj_mqc_t *mqc); +/** +Encode the most probable symbol +@param mqc MQC handle +*/ +static void mqc_codemps(opj_mqc_t *mqc); +/** +Encode the most least symbol +@param mqc MQC handle +*/ +static void mqc_codelps(opj_mqc_t *mqc); +/** +Fill mqc->c with 1's for flushing +@param mqc MQC handle +*/ +static void mqc_setbits(opj_mqc_t *mqc); +/** +FIXME: documentation ??? +@param mqc MQC handle +@return +*/ +static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc); +/** +FIXME: documentation ??? +@param mqc MQC handle +@return +*/ +static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc); +/** +Input a byte +@param mqc MQC handle +*/ +static INLINE void mqc_bytein(opj_mqc_t *const mqc); +/** +Renormalize mqc->a and mqc->c while decoding +@param mqc MQC handle +*/ +static INLINE void mqc_renormd(opj_mqc_t *const mqc); +/*@}*/ + +/*@}*/ + +/* */ +/* This array defines all the possible states for a context. */ +/* */ +static opj_mqc_state_t mqc_states[47 * 2] = { + {0x5601, 0, &mqc_states[2], &mqc_states[3]}, + {0x5601, 1, &mqc_states[3], &mqc_states[2]}, + {0x3401, 0, &mqc_states[4], &mqc_states[12]}, + {0x3401, 1, &mqc_states[5], &mqc_states[13]}, + {0x1801, 0, &mqc_states[6], &mqc_states[18]}, + {0x1801, 1, &mqc_states[7], &mqc_states[19]}, + {0x0ac1, 0, &mqc_states[8], &mqc_states[24]}, + {0x0ac1, 1, &mqc_states[9], &mqc_states[25]}, + {0x0521, 0, &mqc_states[10], &mqc_states[58]}, + {0x0521, 1, &mqc_states[11], &mqc_states[59]}, + {0x0221, 0, &mqc_states[76], &mqc_states[66]}, + {0x0221, 1, &mqc_states[77], &mqc_states[67]}, + {0x5601, 0, &mqc_states[14], &mqc_states[13]}, + {0x5601, 1, &mqc_states[15], &mqc_states[12]}, + {0x5401, 0, &mqc_states[16], &mqc_states[28]}, + {0x5401, 1, &mqc_states[17], &mqc_states[29]}, + {0x4801, 0, &mqc_states[18], &mqc_states[28]}, + {0x4801, 1, &mqc_states[19], &mqc_states[29]}, + {0x3801, 0, &mqc_states[20], &mqc_states[28]}, + {0x3801, 1, &mqc_states[21], &mqc_states[29]}, + {0x3001, 0, &mqc_states[22], &mqc_states[34]}, + {0x3001, 1, &mqc_states[23], &mqc_states[35]}, + {0x2401, 0, &mqc_states[24], &mqc_states[36]}, + {0x2401, 1, &mqc_states[25], &mqc_states[37]}, + {0x1c01, 0, &mqc_states[26], &mqc_states[40]}, + {0x1c01, 1, &mqc_states[27], &mqc_states[41]}, + {0x1601, 0, &mqc_states[58], &mqc_states[42]}, + {0x1601, 1, &mqc_states[59], &mqc_states[43]}, + {0x5601, 0, &mqc_states[30], &mqc_states[29]}, + {0x5601, 1, &mqc_states[31], &mqc_states[28]}, + {0x5401, 0, &mqc_states[32], &mqc_states[28]}, + {0x5401, 1, &mqc_states[33], &mqc_states[29]}, + {0x5101, 0, &mqc_states[34], &mqc_states[30]}, + {0x5101, 1, &mqc_states[35], &mqc_states[31]}, + {0x4801, 0, &mqc_states[36], &mqc_states[32]}, + {0x4801, 1, &mqc_states[37], &mqc_states[33]}, + {0x3801, 0, &mqc_states[38], &mqc_states[34]}, + {0x3801, 1, &mqc_states[39], &mqc_states[35]}, + {0x3401, 0, &mqc_states[40], &mqc_states[36]}, + {0x3401, 1, &mqc_states[41], &mqc_states[37]}, + {0x3001, 0, &mqc_states[42], &mqc_states[38]}, + {0x3001, 1, &mqc_states[43], &mqc_states[39]}, + {0x2801, 0, &mqc_states[44], &mqc_states[38]}, + {0x2801, 1, &mqc_states[45], &mqc_states[39]}, + {0x2401, 0, &mqc_states[46], &mqc_states[40]}, + {0x2401, 1, &mqc_states[47], &mqc_states[41]}, + {0x2201, 0, &mqc_states[48], &mqc_states[42]}, + {0x2201, 1, &mqc_states[49], &mqc_states[43]}, + {0x1c01, 0, &mqc_states[50], &mqc_states[44]}, + {0x1c01, 1, &mqc_states[51], &mqc_states[45]}, + {0x1801, 0, &mqc_states[52], &mqc_states[46]}, + {0x1801, 1, &mqc_states[53], &mqc_states[47]}, + {0x1601, 0, &mqc_states[54], &mqc_states[48]}, + {0x1601, 1, &mqc_states[55], &mqc_states[49]}, + {0x1401, 0, &mqc_states[56], &mqc_states[50]}, + {0x1401, 1, &mqc_states[57], &mqc_states[51]}, + {0x1201, 0, &mqc_states[58], &mqc_states[52]}, + {0x1201, 1, &mqc_states[59], &mqc_states[53]}, + {0x1101, 0, &mqc_states[60], &mqc_states[54]}, + {0x1101, 1, &mqc_states[61], &mqc_states[55]}, + {0x0ac1, 0, &mqc_states[62], &mqc_states[56]}, + {0x0ac1, 1, &mqc_states[63], &mqc_states[57]}, + {0x09c1, 0, &mqc_states[64], &mqc_states[58]}, + {0x09c1, 1, &mqc_states[65], &mqc_states[59]}, + {0x08a1, 0, &mqc_states[66], &mqc_states[60]}, + {0x08a1, 1, &mqc_states[67], &mqc_states[61]}, + {0x0521, 0, &mqc_states[68], &mqc_states[62]}, + {0x0521, 1, &mqc_states[69], &mqc_states[63]}, + {0x0441, 0, &mqc_states[70], &mqc_states[64]}, + {0x0441, 1, &mqc_states[71], &mqc_states[65]}, + {0x02a1, 0, &mqc_states[72], &mqc_states[66]}, + {0x02a1, 1, &mqc_states[73], &mqc_states[67]}, + {0x0221, 0, &mqc_states[74], &mqc_states[68]}, + {0x0221, 1, &mqc_states[75], &mqc_states[69]}, + {0x0141, 0, &mqc_states[76], &mqc_states[70]}, + {0x0141, 1, &mqc_states[77], &mqc_states[71]}, + {0x0111, 0, &mqc_states[78], &mqc_states[72]}, + {0x0111, 1, &mqc_states[79], &mqc_states[73]}, + {0x0085, 0, &mqc_states[80], &mqc_states[74]}, + {0x0085, 1, &mqc_states[81], &mqc_states[75]}, + {0x0049, 0, &mqc_states[82], &mqc_states[76]}, + {0x0049, 1, &mqc_states[83], &mqc_states[77]}, + {0x0025, 0, &mqc_states[84], &mqc_states[78]}, + {0x0025, 1, &mqc_states[85], &mqc_states[79]}, + {0x0015, 0, &mqc_states[86], &mqc_states[80]}, + {0x0015, 1, &mqc_states[87], &mqc_states[81]}, + {0x0009, 0, &mqc_states[88], &mqc_states[82]}, + {0x0009, 1, &mqc_states[89], &mqc_states[83]}, + {0x0005, 0, &mqc_states[90], &mqc_states[84]}, + {0x0005, 1, &mqc_states[91], &mqc_states[85]}, + {0x0001, 0, &mqc_states[90], &mqc_states[86]}, + {0x0001, 1, &mqc_states[91], &mqc_states[87]}, + {0x5601, 0, &mqc_states[92], &mqc_states[92]}, + {0x5601, 1, &mqc_states[93], &mqc_states[93]}, +}; + +/* +========================================================== + local functions +========================================================== +*/ + +static void mqc_byteout(opj_mqc_t *mqc) { + if (*mqc->bp == 0xff) { + mqc->bp++; + *mqc->bp = mqc->c >> 20; + mqc->c &= 0xfffff; + mqc->ct = 7; + } else { + if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */ + mqc->bp++; + *mqc->bp = mqc->c >> 19; + mqc->c &= 0x7ffff; + mqc->ct = 8; + } else { + (*mqc->bp)++; + if (*mqc->bp == 0xff) { + mqc->c &= 0x7ffffff; + mqc->bp++; + *mqc->bp = mqc->c >> 20; + mqc->c &= 0xfffff; + mqc->ct = 7; + } else { + mqc->bp++; + *mqc->bp = mqc->c >> 19; + mqc->c &= 0x7ffff; + mqc->ct = 8; + } + } + } +} + +static void mqc_renorme(opj_mqc_t *mqc) { + do { + mqc->a <<= 1; + mqc->c <<= 1; + mqc->ct--; + if (mqc->ct == 0) { + mqc_byteout(mqc); + } + } while ((mqc->a & 0x8000) == 0); +} + +static void mqc_codemps(opj_mqc_t *mqc) { + mqc->a -= (*mqc->curctx)->qeval; + if ((mqc->a & 0x8000) == 0) { + if (mqc->a < (*mqc->curctx)->qeval) { + mqc->a = (*mqc->curctx)->qeval; + } else { + mqc->c += (*mqc->curctx)->qeval; + } + *mqc->curctx = (*mqc->curctx)->nmps; + mqc_renorme(mqc); + } else { + mqc->c += (*mqc->curctx)->qeval; + } +} + +static void mqc_codelps(opj_mqc_t *mqc) { + mqc->a -= (*mqc->curctx)->qeval; + if (mqc->a < (*mqc->curctx)->qeval) { + mqc->c += (*mqc->curctx)->qeval; + } else { + mqc->a = (*mqc->curctx)->qeval; + } + *mqc->curctx = (*mqc->curctx)->nlps; + mqc_renorme(mqc); +} + +static void mqc_setbits(opj_mqc_t *mqc) { + unsigned int tempc = mqc->c + mqc->a; + mqc->c |= 0xffff; + if (mqc->c >= tempc) { + mqc->c -= 0x8000; + } +} + +static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc) { + int d; + if (mqc->a < (*mqc->curctx)->qeval) { + d = 1 - (*mqc->curctx)->mps; + *mqc->curctx = (*mqc->curctx)->nlps; + } else { + d = (*mqc->curctx)->mps; + *mqc->curctx = (*mqc->curctx)->nmps; + } + + return d; +} + +static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc) { + int d; + if (mqc->a < (*mqc->curctx)->qeval) { + mqc->a = (*mqc->curctx)->qeval; + d = (*mqc->curctx)->mps; + *mqc->curctx = (*mqc->curctx)->nmps; + } else { + mqc->a = (*mqc->curctx)->qeval; + d = 1 - (*mqc->curctx)->mps; + *mqc->curctx = (*mqc->curctx)->nlps; + } + + return d; +} + +#ifdef MQC_PERF_OPT +static INLINE void mqc_bytein(opj_mqc_t *const mqc) { + unsigned int i = *((unsigned int *) mqc->bp); + mqc->c += i & 0xffff00; + mqc->ct = i & 0x0f; + mqc->bp += (i >> 2) & 0x04; +} +#else +static void mqc_bytein(opj_mqc_t *const mqc) { + if (mqc->bp != mqc->end) { + unsigned int c; + if (mqc->bp + 1 != mqc->end) { + c = *(mqc->bp + 1); + } else { + c = 0xff; + } + if (*mqc->bp == 0xff) { + if (c > 0x8f) { + mqc->c += 0xff00; + mqc->ct = 8; + } else { + mqc->bp++; + mqc->c += c << 9; + mqc->ct = 7; + } + } else { + mqc->bp++; + mqc->c += c << 8; + mqc->ct = 8; + } + } else { + mqc->c += 0xff00; + mqc->ct = 8; + } +} +#endif + +static INLINE void mqc_renormd(opj_mqc_t *const mqc) { + do { + if (mqc->ct == 0) { + mqc_bytein(mqc); + } + mqc->a <<= 1; + mqc->c <<= 1; + mqc->ct--; + } while (mqc->a < 0x8000); +} + +/* +========================================================== + MQ-Coder interface +========================================================== +*/ + +opj_mqc_t* mqc_create(void) { + opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t)); +#ifdef MQC_PERF_OPT + mqc->buffer = NULL; +#endif + return mqc; +} + +void mqc_destroy(opj_mqc_t *mqc) { + if(mqc) { +#ifdef MQC_PERF_OPT + if (mqc->buffer) { + opj_free(mqc->buffer); + } +#endif + opj_free(mqc); + } +} + +int mqc_numbytes(opj_mqc_t *mqc) { + return mqc->bp - mqc->start; +} + +void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) { + mqc_setcurctx(mqc, 0); + mqc->a = 0x8000; + mqc->c = 0; + mqc->bp = bp - 1; + mqc->ct = 12; + if (*mqc->bp == 0xff) { + mqc->ct = 13; + } + mqc->start = bp; +} + +void mqc_encode(opj_mqc_t *mqc, int d) { + if ((*mqc->curctx)->mps == d) { + mqc_codemps(mqc); + } else { + mqc_codelps(mqc); + } +} + +void mqc_flush(opj_mqc_t *mqc) { + mqc_setbits(mqc); + mqc->c <<= mqc->ct; + mqc_byteout(mqc); + mqc->c <<= mqc->ct; + mqc_byteout(mqc); + + if (*mqc->bp != 0xff) { + mqc->bp++; + } +} + +void mqc_bypass_init_enc(opj_mqc_t *mqc) { + mqc->c = 0; + mqc->ct = 8; + /*if (*mqc->bp == 0xff) { + mqc->ct = 7; + } */ +} + +void mqc_bypass_enc(opj_mqc_t *mqc, int d) { + mqc->ct--; + mqc->c = mqc->c + (d << mqc->ct); + if (mqc->ct == 0) { + mqc->bp++; + *mqc->bp = mqc->c; + mqc->ct = 8; + if (*mqc->bp == 0xff) { + mqc->ct = 7; + } + mqc->c = 0; + } +} + +int mqc_bypass_flush_enc(opj_mqc_t *mqc) { + unsigned char bit_padding; + + bit_padding = 0; + + if (mqc->ct != 0) { + while (mqc->ct > 0) { + mqc->ct--; + mqc->c += bit_padding << mqc->ct; + bit_padding = (bit_padding + 1) & 0x01; + } + mqc->bp++; + *mqc->bp = mqc->c; + mqc->ct = 8; + mqc->c = 0; + } + + return 1; +} + +void mqc_reset_enc(opj_mqc_t *mqc) { + mqc_resetstates(mqc); + mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); + mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); + mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); +} + +int mqc_restart_enc(opj_mqc_t *mqc) { + int correction = 1; + + /* */ + int n = 27 - 15 - mqc->ct; + mqc->c <<= mqc->ct; + while (n > 0) { + mqc_byteout(mqc); + n -= mqc->ct; + mqc->c <<= mqc->ct; + } + mqc_byteout(mqc); + + return correction; +} + +void mqc_restart_init_enc(opj_mqc_t *mqc) { + /* */ + mqc_setcurctx(mqc, 0); + mqc->a = 0x8000; + mqc->c = 0; + mqc->ct = 12; + mqc->bp--; + if (*mqc->bp == 0xff) { + mqc->ct = 13; + } +} + +void mqc_erterm_enc(opj_mqc_t *mqc) { + int k = 11 - mqc->ct + 1; + + while (k > 0) { + mqc->c <<= mqc->ct; + mqc->ct = 0; + mqc_byteout(mqc); + k -= mqc->ct; + } + + if (*mqc->bp != 0xff) { + mqc_byteout(mqc); + } +} + +void mqc_segmark_enc(opj_mqc_t *mqc) { + int i; + mqc_setcurctx(mqc, 18); + + for (i = 1; i < 5; i++) { + mqc_encode(mqc, i % 2); + } +} + +void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) { + mqc_setcurctx(mqc, 0); + mqc->start = bp; + mqc->end = bp + len; + mqc->bp = bp; + if (len==0) mqc->c = 0xff << 16; + else mqc->c = *mqc->bp << 16; + +#ifdef MQC_PERF_OPT + { + unsigned int c; + unsigned int *ip; + unsigned char *end = mqc->end - 1; + mqc->buffer = opj_realloc(mqc->buffer, (2 * len + 1) * sizeof(unsigned int)); + ip = (unsigned int *) mqc->buffer; + + while (bp != end) { + c = *(bp + 1); + if (*bp == 0xff) { + if (c > 0x8f) { + *ip = 0x0000ff18; + } else { + bp++; + *ip = 0x00000017 | (c << 9); + } + } else { + bp++; + *ip = 0x00000018 | (c << 8); + } + ip++; + } + + /* Handle last byte of data */ + c = 0xff; + if (*bp == 0xff) { + *ip = 0x0000ff18; + } else { + bp++; + *ip = 0x00000018 | (c << 8); + } + ip++; + + *ip = 0x0000ff08; + mqc->bp = mqc->buffer; + } +#endif + mqc_bytein(mqc); + mqc->c <<= 7; + mqc->ct -= 7; + mqc->a = 0x8000; +} + +int mqc_decode(opj_mqc_t *const mqc) { + int d; + mqc->a -= (*mqc->curctx)->qeval; + if ((mqc->c >> 16) < (*mqc->curctx)->qeval) { + d = mqc_lpsexchange(mqc); + mqc_renormd(mqc); + } else { + mqc->c -= (*mqc->curctx)->qeval << 16; + if ((mqc->a & 0x8000) == 0) { + d = mqc_mpsexchange(mqc); + mqc_renormd(mqc); + } else { + d = (*mqc->curctx)->mps; + } + } + + return d; +} + +void mqc_resetstates(opj_mqc_t *mqc) { + int i; + for (i = 0; i < MQC_NUMCTXS; i++) { + mqc->ctxs[i] = mqc_states; + } +} + +void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) { + mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)]; +} + + diff --git a/contrib/media/updf_newlib/libopenjpeg/mqc.h b/contrib/media/updf_newlib/libopenjpeg/mqc.h new file mode 100755 index 000000000..d00cd1067 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/mqc.h @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __MQC_H +#define __MQC_H +/** +@file mqc.h +@brief Implementation of an MQ-Coder (MQC) + +The functions in MQC.C have for goal to realize the MQ-coder operations. The functions +in MQC.C are used by some function in T1.C. +*/ + +/** @defgroup MQC MQC - Implementation of an MQ-Coder */ +/*@{*/ + +/** +This struct defines the state of a context. +*/ +typedef struct opj_mqc_state { + /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ + unsigned int qeval; + /** the Most Probable Symbol (0 or 1) */ + int mps; + /** next state if the next encoded symbol is the MPS */ + struct opj_mqc_state *nmps; + /** next state if the next encoded symbol is the LPS */ + struct opj_mqc_state *nlps; +} opj_mqc_state_t; + +#define MQC_NUMCTXS 19 + +/** +MQ coder +*/ +typedef struct opj_mqc { + unsigned int c; + unsigned int a; + unsigned int ct; + unsigned char *bp; + unsigned char *start; + unsigned char *end; + opj_mqc_state_t *ctxs[MQC_NUMCTXS]; + opj_mqc_state_t **curctx; +#ifdef MQC_PERF_OPT + unsigned char *buffer; +#endif +} opj_mqc_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a new MQC handle +@return Returns a new MQC handle if successful, returns NULL otherwise +*/ +opj_mqc_t* mqc_create(void); +/** +Destroy a previously created MQC handle +@param mqc MQC handle to destroy +*/ +void mqc_destroy(opj_mqc_t *mqc); +/** +Return the number of bytes written/read since initialisation +@param mqc MQC handle +@return Returns the number of bytes already encoded +*/ +int mqc_numbytes(opj_mqc_t *mqc); +/** +Reset the states of all the context of the coder/decoder +(each context is set to a state where 0 and 1 are more or less equiprobable) +@param mqc MQC handle +*/ +void mqc_resetstates(opj_mqc_t *mqc); +/** +Set the state of a particular context +@param mqc MQC handle +@param ctxno Number that identifies the context +@param msb The MSB of the new state of the context +@param prob Number that identifies the probability of the symbols for the new state of the context +*/ +void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob); +/** +Initialize the encoder +@param mqc MQC handle +@param bp Pointer to the start of the buffer where the bytes will be written +*/ +void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp); +/** +Set the current context used for coding/decoding +@param mqc MQC handle +@param ctxno Number that identifies the context +*/ +#define mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(int)(ctxno)] +/** +Encode a symbol using the MQ-coder +@param mqc MQC handle +@param d The symbol to be encoded (0 or 1) +*/ +void mqc_encode(opj_mqc_t *mqc, int d); +/** +Flush the encoder, so that all remaining data is written +@param mqc MQC handle +*/ +void mqc_flush(opj_mqc_t *mqc); +/** +BYPASS mode switch, initialization operation. +JPEG 2000 p 505. +

    Not fully implemented and tested !!

    +@param mqc MQC handle +*/ +void mqc_bypass_init_enc(opj_mqc_t *mqc); +/** +BYPASS mode switch, coding operation. +JPEG 2000 p 505. +

    Not fully implemented and tested !!

    +@param mqc MQC handle +@param d The symbol to be encoded (0 or 1) +*/ +void mqc_bypass_enc(opj_mqc_t *mqc, int d); +/** +BYPASS mode switch, flush operation +

    Not fully implemented and tested !!

    +@param mqc MQC handle +@return Returns 1 (always) +*/ +int mqc_bypass_flush_enc(opj_mqc_t *mqc); +/** +RESET mode switch +@param mqc MQC handle +*/ +void mqc_reset_enc(opj_mqc_t *mqc); +/** +RESTART mode switch (TERMALL) +@param mqc MQC handle +@return Returns 1 (always) +*/ +int mqc_restart_enc(opj_mqc_t *mqc); +/** +RESTART mode switch (TERMALL) reinitialisation +@param mqc MQC handle +*/ +void mqc_restart_init_enc(opj_mqc_t *mqc); +/** +ERTERM mode switch (PTERM) +@param mqc MQC handle +*/ +void mqc_erterm_enc(opj_mqc_t *mqc); +/** +SEGMARK mode switch (SEGSYM) +@param mqc MQC handle +*/ +void mqc_segmark_enc(opj_mqc_t *mqc); +/** +Initialize the decoder +@param mqc MQC handle +@param bp Pointer to the start of the buffer from which the bytes will be read +@param len Length of the input buffer +*/ +void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len); +/** +Decode a symbol +@param mqc MQC handle +@return Returns the decoded symbol (0 or 1) +*/ +int mqc_decode(opj_mqc_t *const mqc); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __MQC_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/openjpeg.c b/contrib/media/updf_newlib/libopenjpeg/openjpeg.c new file mode 100755 index 000000000..d95cfc91b --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/openjpeg.c @@ -0,0 +1,337 @@ +/* + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef _WIN32 +#include +#endif /* _WIN32 */ + +#include "../opj_config.h" +#include "opj_includes.h" + +/* ---------------------------------------------------------------------- */ +#ifdef _WIN32 +#ifndef OPJ_STATIC +BOOL APIENTRY +DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { + switch (ul_reason_for_call) { + case DLL_PROCESS_ATTACH : + break; + case DLL_PROCESS_DETACH : + break; + case DLL_THREAD_ATTACH : + case DLL_THREAD_DETACH : + break; + } + + return TRUE; +} +#endif /* OPJ_STATIC */ +#endif /* _WIN32 */ + +/* ---------------------------------------------------------------------- */ + + +const char* OPJ_CALLCONV opj_version(void) { + return PACKAGE_VERSION; +} + +opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format) { + opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_calloc(1, sizeof(opj_dinfo_t)); + if(!dinfo) return NULL; + dinfo->is_decompressor = true; + switch(format) { + case CODEC_J2K: + case CODEC_JPT: + /* get a J2K decoder handle */ + dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo); + if(!dinfo->j2k_handle) { + opj_free(dinfo); + return NULL; + } + break; + case CODEC_JP2: + /* get a JP2 decoder handle */ + dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo); + if(!dinfo->jp2_handle) { + opj_free(dinfo); + return NULL; + } + break; + case CODEC_UNKNOWN: + default: + opj_free(dinfo); + return NULL; + } + + dinfo->codec_format = format; + + return dinfo; +} + +void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo) { + if(dinfo) { + /* destroy the codec */ + switch(dinfo->codec_format) { + case CODEC_J2K: + case CODEC_JPT: + j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle); + break; + case CODEC_JP2: + jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle); + break; + case CODEC_UNKNOWN: + default: + break; + } + /* destroy the decompressor */ + opj_free(dinfo); + } +} + +void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters) { + if(parameters) { + memset(parameters, 0, sizeof(opj_dparameters_t)); + /* default decoding parameters */ + parameters->cp_layer = 0; + parameters->cp_reduce = 0; + parameters->cp_limit_decoding = NO_LIMITATION; + + parameters->decod_format = -1; + parameters->cod_format = -1; +/* UniPG>> */ +#ifdef USE_JPWL + parameters->jpwl_correct = false; + parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS; + parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES; +#endif /* USE_JPWL */ +/* <codec_format) { + case CODEC_J2K: + case CODEC_JPT: + j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters); + break; + case CODEC_JP2: + jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters); + break; + case CODEC_UNKNOWN: + default: + break; + } + } +} + +opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) { + return opj_decode_with_info(dinfo, cio, NULL); +} + +opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { + if(dinfo && cio) { + switch(dinfo->codec_format) { + case CODEC_J2K: + return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info); + case CODEC_JPT: + return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info); + case CODEC_JP2: + return jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio, cstr_info); + case CODEC_UNKNOWN: + default: + break; + } + } + return NULL; +} + +opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format) { + opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_calloc(1, sizeof(opj_cinfo_t)); + if(!cinfo) return NULL; + cinfo->is_decompressor = false; + switch(format) { + case CODEC_J2K: + /* get a J2K coder handle */ + cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo); + if(!cinfo->j2k_handle) { + opj_free(cinfo); + return NULL; + } + break; + case CODEC_JP2: + /* get a JP2 coder handle */ + cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo); + if(!cinfo->jp2_handle) { + opj_free(cinfo); + return NULL; + } + break; + case CODEC_JPT: + case CODEC_UNKNOWN: + default: + opj_free(cinfo); + return NULL; + } + + cinfo->codec_format = format; + + return cinfo; +} + +void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo) { + if(cinfo) { + /* destroy the codec */ + switch(cinfo->codec_format) { + case CODEC_J2K: + j2k_destroy_compress((opj_j2k_t*)cinfo->j2k_handle); + break; + case CODEC_JP2: + jp2_destroy_compress((opj_jp2_t*)cinfo->jp2_handle); + break; + case CODEC_JPT: + case CODEC_UNKNOWN: + default: + break; + } + /* destroy the decompressor */ + opj_free(cinfo); + } +} + +void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) { + if(parameters) { + memset(parameters, 0, sizeof(opj_cparameters_t)); + /* default coding parameters */ + parameters->cp_cinema = OFF; + parameters->max_comp_size = 0; + parameters->numresolution = 6; + parameters->cp_rsiz = STD_RSIZ; + parameters->cblockw_init = 64; + parameters->cblockh_init = 64; + parameters->prog_order = LRCP; + parameters->roi_compno = -1; /* no ROI */ + parameters->subsampling_dx = 1; + parameters->subsampling_dy = 1; + parameters->tp_on = 0; + parameters->decod_format = -1; + parameters->cod_format = -1; + parameters->tcp_rates[0] = 0; + parameters->tcp_numlayers = 0; + parameters->cp_disto_alloc = 0; + parameters->cp_fixed_alloc = 0; + parameters->cp_fixed_quality = 0; + +/* UniPG>> */ +#ifdef USE_JPWL + parameters->jpwl_epc_on = false; + parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */ + { + int i; + for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { + parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */ + parameters->jpwl_hprot_TPH[i] = 0; /* absent */ + } + }; + { + int i; + for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { + parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */ + parameters->jpwl_pprot_packno[i] = -1; /* unassigned */ + parameters->jpwl_pprot[i] = 0; /* absent */ + } + }; + parameters->jpwl_sens_size = 0; /* 0 means no ESD */ + parameters->jpwl_sens_addr = 0; /* 0 means auto */ + parameters->jpwl_sens_range = 0; /* 0 means packet */ + parameters->jpwl_sens_MH = -1; /* -1 means unassigned */ + { + int i; + for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { + parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */ + parameters->jpwl_sens_TPH[i] = -1; /* absent */ + } + }; +#endif /* USE_JPWL */ +/* <codec_format) { + case CODEC_J2K: + j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image); + break; + case CODEC_JP2: + jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image); + break; + case CODEC_JPT: + case CODEC_UNKNOWN: + default: + break; + } + } +} + +bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) { + if (index != NULL) + opj_event_msg((opj_common_ptr)cinfo, EVT_WARNING, "Set index to NULL when calling the opj_encode function.\n" + "To extract the index, use the opj_encode_with_info() function.\n" + "No index will be generated during this encoding\n"); + return opj_encode_with_info(cinfo, cio, image, NULL); +} + +bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { + if(cinfo && cio && image) { + switch(cinfo->codec_format) { + case CODEC_J2K: + return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, cstr_info); + case CODEC_JP2: + return jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, cstr_info); + case CODEC_JPT: + case CODEC_UNKNOWN: + default: + break; + } + } + return false; +} + +void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) { + if (cstr_info) { + int tileno; + for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { + opj_tile_info_t *tile_info = &cstr_info->tile[tileno]; + opj_free(tile_info->thresh); + opj_free(tile_info->packet); + opj_free(tile_info->tp); + } + opj_free(cstr_info->tile); + opj_free(cstr_info->marker); + opj_free(cstr_info->numdecompos); + } +} diff --git a/contrib/media/updf_newlib/libopenjpeg/openjpeg.h b/contrib/media/updf_newlib/libopenjpeg/openjpeg.h new file mode 100755 index 000000000..7ad62bf6d --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/openjpeg.h @@ -0,0 +1,915 @@ + /* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef OPENJPEG_H +#define OPENJPEG_H + + +/* +========================================================== + Compiler directives +========================================================== +*/ + +#if defined(OPJ_STATIC) || !defined(_WIN32) +#define OPJ_API +#define OPJ_CALLCONV +#else +#define OPJ_CALLCONV __stdcall +/* +The following ifdef block is the standard way of creating macros which make exporting +from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS +symbol defined on the command line. this symbol should not be defined on any project +that uses this DLL. This way any other project whose source files include this file see +OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols +defined with this macro as being exported. +*/ +#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT) +#define OPJ_API __declspec(dllexport) +#else +#define OPJ_API __declspec(dllimport) +#endif /* OPJ_EXPORTS */ +#endif /* !OPJ_STATIC || !_WIN32 */ + +#ifndef __cplusplus +#if defined(HAVE_STDBOOL_H) +/* +The C language implementation does correctly provide the standard header +file "stdbool.h". + */ +#include +#else +/* +The C language implementation does not provide the standard header file +"stdbool.h" as required by ISO/IEC 9899:1999. Try to compensate for this +braindamage below. +*/ +#if !defined(bool) +#define bool int +#endif +#if !defined(true) +#define true 1 +#endif +#if !defined(false) +#define false 0 +#endif +#endif +#endif /* __cplusplus */ + +/* +========================================================== + Useful constant definitions +========================================================== +*/ + +#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */ + +#define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */ +#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */ + +/* UniPG>> */ +#define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */ +#define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */ +#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */ +#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */ +#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */ +#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */ +#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */ +#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */ +/* < +
  • Error messages +
  • Warning messages +
  • Debugging messages + +*/ +typedef struct opj_event_mgr { + /** Error message callback if available, NULL otherwise */ + opj_msg_callback error_handler; + /** Warning message callback if available, NULL otherwise */ + opj_msg_callback warning_handler; + /** Debug message callback if available, NULL otherwise */ + opj_msg_callback info_handler; +} opj_event_mgr_t; + + +/* +========================================================== + codec typedef definitions +========================================================== +*/ + +/** +Progression order changes +*/ +typedef struct opj_poc { + /** Resolution num start, Component num start, given by POC */ + int resno0, compno0; + /** Layer num end,Resolution num end, Component num end, given by POC */ + int layno1, resno1, compno1; + /** Layer num start,Precinct num start, Precinct num end */ + int layno0, precno0, precno1; + /** Progression order enum*/ + OPJ_PROG_ORDER prg1,prg; + /** Progression order string*/ + char progorder[5]; + /** Tile number */ + int tile; + /** Start and end values for Tile width and height*/ + int tx0,tx1,ty0,ty1; + /** Start value, initialised in pi_initialise_encode*/ + int layS, resS, compS, prcS; + /** End value, initialised in pi_initialise_encode */ + int layE, resE, compE, prcE; + /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/ + int txS,txE,tyS,tyE,dx,dy; + /** Temporary values for Tile parts, initialised in pi_create_encode */ + int lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t; +} opj_poc_t; + +/** +Compression parameters +*/ +typedef struct opj_cparameters { + /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */ + bool tile_size_on; + /** XTOsiz */ + int cp_tx0; + /** YTOsiz */ + int cp_ty0; + /** XTsiz */ + int cp_tdx; + /** YTsiz */ + int cp_tdy; + /** allocation by rate/distortion */ + int cp_disto_alloc; + /** allocation by fixed layer */ + int cp_fixed_alloc; + /** add fixed_quality */ + int cp_fixed_quality; + /** fixed layer */ + int *cp_matrice; + /** comment for coding */ + char *cp_comment; + /** csty : coding style */ + int csty; + /** progression order (default LRCP) */ + OPJ_PROG_ORDER prog_order; + /** progression order changes */ + opj_poc_t POC[32]; + /** number of progression order changes (POC), default to 0 */ + int numpocs; + /** number of layers */ + int tcp_numlayers; + /** rates of layers */ + float tcp_rates[100]; + /** different psnr for successive layers */ + float tcp_distoratio[100]; + /** number of resolutions */ + int numresolution; + /** initial code block width, default to 64 */ + int cblockw_init; + /** initial code block height, default to 64 */ + int cblockh_init; + /** mode switch (cblk_style) */ + int mode; + /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ + int irreversible; + /** region of interest: affected component in [0..3], -1 means no ROI */ + int roi_compno; + /** region of interest: upshift value */ + int roi_shift; + /* number of precinct size specifications */ + int res_spec; + /** initial precinct width */ + int prcw_init[J2K_MAXRLVLS]; + /** initial precinct height */ + int prch_init[J2K_MAXRLVLS]; + + /**@name command line encoder parameters (not used inside the library) */ + /*@{*/ + /** input file name */ + char infile[OPJ_PATH_LEN]; + /** output file name */ + char outfile[OPJ_PATH_LEN]; + /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ + int index_on; + /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ + char index[OPJ_PATH_LEN]; + /** subimage encoding: origin image offset in x direction */ + int image_offset_x0; + /** subimage encoding: origin image offset in y direction */ + int image_offset_y0; + /** subsampling value for dx */ + int subsampling_dx; + /** subsampling value for dy */ + int subsampling_dy; + /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/ + int decod_format; + /** output file format 0: J2K, 1: JP2, 2: JPT */ + int cod_format; + /*@}*/ + +/* UniPG>> */ + /**@name JPWL encoding parameters */ + /*@{*/ + /** enables writing of EPC in MH, thus activating JPWL */ + bool jpwl_epc_on; + /** error protection method for MH (0,1,16,32,37-128) */ + int jpwl_hprot_MH; + /** tile number of header protection specification (>=0) */ + int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** error protection methods for TPHs (0,1,16,32,37-128) */ + int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS]; + /** tile number of packet protection specification (>=0) */ + int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS]; + /** packet number of packet protection specification (>=0) */ + int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS]; + /** error protection methods for packets (0,1,16,32,37-128) */ + int jpwl_pprot[JPWL_MAX_NO_PACKSPECS]; + /** enables writing of ESD, (0=no/1/2 bytes) */ + int jpwl_sens_size; + /** sensitivity addressing size (0=auto/2/4 bytes) */ + int jpwl_sens_addr; + /** sensitivity range (0-3) */ + int jpwl_sens_range; + /** sensitivity method for MH (-1=no,0-7) */ + int jpwl_sens_MH; + /** tile number of sensitivity specification (>=0) */ + int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; + /** sensitivity methods for TPHs (-1=no,0-7) */ + int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS]; + /*@}*/ +/* <> */ + /**@name JPWL decoding parameters */ + /*@{*/ + /** activates the JPWL correction capabilities */ + bool jpwl_correct; + /** expected number of components */ + int jpwl_exp_comps; + /** maximum number of tiles */ + int jpwl_max_tiles; + /*@}*/ +/* <> */ +/** +Marker structure +*/ +typedef struct opj_marker_info_t { + /** marker type */ + unsigned short int type; + /** position in codestream */ + int pos; + /** length, marker val included */ + int len; +} opj_marker_info_t; +/* <> */ + /** number of markers */ + int marknum; + /** list of markers */ + opj_marker_info_t *marker; + /** actual size of markers array */ + int maxmarknum; +/* <cp. +@param dinfo decompressor handle +@param parameters decompression parameters +*/ +OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters); +/** +Decode an image from a JPEG-2000 codestream +@param dinfo decompressor handle +@param cio Input buffer stream +@return Returns a decoded image if successful, returns NULL otherwise +*/ +OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio); + +/** +Decode an image from a JPEG-2000 codestream and extract the codestream information +@param dinfo decompressor handle +@param cio Input buffer stream +@param cstr_info Codestream information structure if needed afterwards, NULL otherwise +@return Returns a decoded image if successful, returns NULL otherwise +*/ +OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info); +/** +Creates a J2K/JP2 compression structure +@param format Coder to select +@return Returns a handle to a compressor if successful, returns NULL otherwise +*/ +OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format); +/** +Destroy a compressor handle +@param cinfo compressor handle to destroy +*/ +OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo); +/** +Set encoding parameters to default values, that means : +
      +
    • Lossless +
    • 1 tile +
    • Size of precinct : 2^15 x 2^15 (means 1 precinct) +
    • Size of code-block : 64 x 64 +
    • Number of resolutions: 6 +
    • No SOP marker in the codestream +
    • No EPH marker in the codestream +
    • No sub-sampling in x or y direction +
    • No mode switch activated +
    • Progression order: LRCP +
    • No index file +
    • No ROI upshifted +
    • No offset of the origin of the image +
    • No offset of the origin of the tiles +
    • Reversible DWT 5-3 +
    +@param parameters Compression parameters +*/ +OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters); +/** +Setup the encoder parameters using the current image and using user parameters. +@param cinfo Compressor handle +@param parameters Compression parameters +@param image Input filled image +*/ +OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image); +/** +Encode an image into a JPEG-2000 codestream +@param cinfo compressor handle +@param cio Output buffer stream +@param image Image to encode +@param index Depreacted -> Set to NULL. To extract index, used opj_encode_wci() +@return Returns true if successful, returns false otherwise +*/ +OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index); +/** +Encode an image into a JPEG-2000 codestream and extract the codestream information +@param cinfo compressor handle +@param cio Output buffer stream +@param image Image to encode +@param cstr_info Codestream information structure if needed afterwards, NULL otherwise +@return Returns true if successful, returns false otherwise +*/ +OPJ_API bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); +/** +Destroy Codestream information after compression or decompression +@param cstr_info Codestream information structure +*/ +OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info); + +#ifdef __cplusplus +} +#endif + +#endif /* OPENJPEG_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/opj_includes.h b/contrib/media/updf_newlib/libopenjpeg/opj_includes.h new file mode 100755 index 000000000..13bc96324 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/opj_includes.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef OPJ_INCLUDES_H +#define OPJ_INCLUDES_H + +/* + ========================================================== + Standard includes used by the library + ========================================================== +*/ +// #include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + ========================================================== + OpenJPEG interface + ========================================================== + */ +#include "openjpeg.h" + +/* + ========================================================== + OpenJPEG modules + ========================================================== +*/ + +/* Ignore GCC attributes if this is not GCC */ +#ifndef __GNUC__ + #define __attribute__(x) /* __attribute__(x) */ +#endif + +/* +The inline keyword is supported by C99 but not by C90. +Most compilers implement their own version of this keyword ... +*/ +#ifndef INLINE + #if defined(_MSC_VER) + #define INLINE __forceinline + #elif defined(__GNUC__) + #define INLINE __inline__ + #elif defined(__MWERKS__) + #define INLINE inline + #else + /* add other compilers here ... */ + #define INLINE + #endif /* defined() */ +#endif /* INLINE */ + +/* Are restricted pointers available? (C99) */ +#if (__STDC_VERSION__ != 199901L) + /* Not a C99 compiler */ + #ifdef __GNUC__ + #define restrict __restrict__ + #else + #define restrict /* restrict */ + #endif +#endif + +/* MSVC and Borland C do not have lrintf */ +#if defined(_MSC_VER) || defined(__BORLANDC__) +static INLINE long lrintf(float f){ +#ifdef _M_X64 + return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f)); +#else + int i; + + _asm{ + fld f + fistp i + }; + + return i; +#endif +} +#endif + +#include "j2k_lib.h" +#include "opj_malloc.h" +#include "event.h" +#include "cio.h" + +#include "image.h" +#include "j2k.h" +#include "jp2.h" +#include "jpt.h" + +#include "mqc.h" +#include "raw.h" +#include "bio.h" +#include "tgt.h" +#include "pi.h" +#include "tcd.h" +#include "t1.h" +#include "dwt.h" +#include "t2.h" +#include "mct.h" +#include "int.h" +#include "fix.h" + +/* JPWL>> */ +#ifdef USE_JPWL +#include "../jpwl/jpwl.h" +#endif /* USE_JPWL */ +/* < + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __OPJ_MALLOC_H +#define __OPJ_MALLOC_H +/** +@file opj_malloc.h +@brief Internal functions + +The functions in opj_malloc.h are internal utilities used for memory management. +*/ + +/** @defgroup MISC MISC - Miscellaneous internal functions */ +/*@{*/ + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ + +/** +Allocate an uninitialized memory block +@param size Bytes to allocate +@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available +*/ +#ifdef ALLOC_PERF_OPT +void * OPJ_CALLCONV opj_malloc(size_t size); +#else +#define opj_malloc(size) malloc(size) +#endif + +/** +Allocate a memory block with elements initialized to 0 +@param num Blocks to allocate +@param size Bytes per block to allocate +@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available +*/ +#ifdef ALLOC_PERF_OPT +void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements); +#else +#define opj_calloc(num, size) calloc(num, size) +#endif + +/** +Allocate memory aligned to a 16 byte boundry +@param size Bytes to allocate +@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available +*/ +/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */ +#ifdef _WIN32 + /* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */ + #ifdef __GNUC__ + #include + #define HAVE_MM_MALLOC + #else /* MSVC, Intel C++ */ + #include + #ifdef _mm_malloc + #define HAVE_MM_MALLOC + #endif + #endif +#else /* Not _WIN32 */ + + #if defined(__sun) + #define HAVE_MEMALIGN + /* Linux x86_64 and OSX always align allocations to 16 bytes */ + #elif !defined(__amd64__) && !defined(__APPLE__) +// #define HAVE_MEMALIGN + #include + #endif +#endif + +#define opj_aligned_malloc(size) malloc(size) +#define opj_aligned_free(m) free(m) + +#ifdef HAVE_MM_MALLOC + #undef opj_aligned_malloc + #define opj_aligned_malloc(size) _mm_malloc(size, 16) + #undef opj_aligned_free + #define opj_aligned_free(m) _mm_free(m) +#endif + +#undef HAVE_MEMALIGN +#ifdef HAVE_MEMALIGN + extern void* memalign(size_t, size_t); + #undef opj_aligned_malloc + #define opj_aligned_malloc(size) memalign(16, (size)) + #undef opj_aligned_free + #define opj_aligned_free(m) free(m) +#endif + +#undef HAVE_POSIX_MEMALIGN +#ifdef HAVE_POSIX_MEMALIGN + #undef opj_aligned_malloc + extern int posix_memalign(void**, size_t, size_t); + + static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){ + void* mem = NULL; + posix_memalign(&mem, 16, size); + return mem; + } + #undef opj_aligned_free + #define opj_aligned_free(m) free(m) +#endif + +#ifdef ALLOC_PERF_OPT + #undef opj_aligned_malloc + #define opj_aligned_malloc(size) opj_malloc(size) + #undef opj_aligned_free + #define opj_aligned_free(m) opj_free(m) +#endif + +/** +Reallocate memory blocks. +@param m Pointer to previously allocated memory block +@param s New size in bytes +@return Returns a void pointer to the reallocated (and possibly moved) memory block +*/ +#ifdef ALLOC_PERF_OPT +void * OPJ_CALLCONV opj_realloc(void * m, size_t s); +#else +#define opj_realloc(m, s) realloc(m, s) +#endif + +/** +Deallocates or frees a memory block. +@param m Previously allocated memory block to be freed +*/ +#ifdef ALLOC_PERF_OPT +void OPJ_CALLCONV opj_free(void * m); +#else +#define opj_free(m) free(m) +#endif + +#ifdef __GNUC__ +#pragma GCC poison malloc calloc realloc free +#endif + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __OPJ_MALLOC_H */ + diff --git a/contrib/media/updf_newlib/libopenjpeg/pi.c b/contrib/media/updf_newlib/libopenjpeg/pi.c new file mode 100755 index 000000000..06e76af76 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/pi.c @@ -0,0 +1,963 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +/** @defgroup PI PI - Implementation of a packet iterator */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Get next packet in layer-resolution-component-precinct order. +@param pi packet iterator to modify +@return returns false if pi pointed to the last packet or else returns true +*/ +static bool pi_next_lrcp(opj_pi_iterator_t * pi); +/** +Get next packet in resolution-layer-component-precinct order. +@param pi packet iterator to modify +@return returns false if pi pointed to the last packet or else returns true +*/ +static bool pi_next_rlcp(opj_pi_iterator_t * pi); +/** +Get next packet in resolution-precinct-component-layer order. +@param pi packet iterator to modify +@return returns false if pi pointed to the last packet or else returns true +*/ +static bool pi_next_rpcl(opj_pi_iterator_t * pi); +/** +Get next packet in precinct-component-resolution-layer order. +@param pi packet iterator to modify +@return returns false if pi pointed to the last packet or else returns true +*/ +static bool pi_next_pcrl(opj_pi_iterator_t * pi); +/** +Get next packet in component-precinct-resolution-layer order. +@param pi packet iterator to modify +@return returns false if pi pointed to the last packet or else returns true +*/ +static bool pi_next_cprl(opj_pi_iterator_t * pi); + +/*@}*/ + +/*@}*/ + +/* +========================================================== + local functions +========================================================== +*/ + +static bool pi_next_lrcp(opj_pi_iterator_t * pi) { + opj_pi_comp_t *comp = NULL; + opj_pi_resolution_t *res = NULL; + long index = 0; + + if (!pi->first) { + comp = &pi->comps[pi->compno]; + res = &comp->resolutions[pi->resno]; + goto LABEL_SKIP; + } else { + pi->first = 0; + } + + for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { + for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; + pi->resno++) { + for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { + comp = &pi->comps[pi->compno]; + if (pi->resno >= comp->numresolutions) { + continue; + } + res = &comp->resolutions[pi->resno]; + if (!pi->tp_on){ + pi->poc.precno1 = res->pw * res->ph; + } + for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { + index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; + if (!pi->include[index]) { + pi->include[index] = 1; + return true; + } +LABEL_SKIP:; + } + } + } + } + + return false; +} + +static bool pi_next_rlcp(opj_pi_iterator_t * pi) { + opj_pi_comp_t *comp = NULL; + opj_pi_resolution_t *res = NULL; + long index = 0; + + if (!pi->first) { + comp = &pi->comps[pi->compno]; + res = &comp->resolutions[pi->resno]; + goto LABEL_SKIP; + } else { + pi->first = 0; + } + + for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { + for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { + for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { + comp = &pi->comps[pi->compno]; + if (pi->resno >= comp->numresolutions) { + continue; + } + res = &comp->resolutions[pi->resno]; + if(!pi->tp_on){ + pi->poc.precno1 = res->pw * res->ph; + } + for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { + index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; + if (!pi->include[index]) { + pi->include[index] = 1; + return true; + } +LABEL_SKIP:; + } + } + } + } + + return false; +} + +static bool pi_next_rpcl(opj_pi_iterator_t * pi) { + opj_pi_comp_t *comp = NULL; + opj_pi_resolution_t *res = NULL; + long index = 0; + + if (!pi->first) { + goto LABEL_SKIP; + } else { + int compno, resno; + pi->first = 0; + pi->dx = 0; + pi->dy = 0; + for (compno = 0; compno < pi->numcomps; compno++) { + comp = &pi->comps[compno]; + for (resno = 0; resno < comp->numresolutions; resno++) { + int dx, dy; + res = &comp->resolutions[resno]; + dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); + dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); + pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); + pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); + } + } + } +if (!pi->tp_on){ + pi->poc.ty0 = pi->ty0; + pi->poc.tx0 = pi->tx0; + pi->poc.ty1 = pi->ty1; + pi->poc.tx1 = pi->tx1; + } + for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { + for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { + for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { + for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { + int levelno; + int trx0, try0; + int trx1, try1; + int rpx, rpy; + int prci, prcj; + comp = &pi->comps[pi->compno]; + if (pi->resno >= comp->numresolutions) { + continue; + } + res = &comp->resolutions[pi->resno]; + levelno = comp->numresolutions - 1 - pi->resno; + trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); + try0 = int_ceildiv(pi->ty0, comp->dy << levelno); + trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); + try1 = int_ceildiv(pi->ty1, comp->dy << levelno); + rpx = res->pdx + levelno; + rpy = res->pdy + levelno; + if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ + continue; + } + if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ + continue; + } + + if ((res->pw==0)||(res->ph==0)) continue; + + if ((trx0==trx1)||(try0==try1)) continue; + + prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) + - int_floordivpow2(trx0, res->pdx); + prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) + - int_floordivpow2(try0, res->pdy); + pi->precno = prci + prcj * res->pw; + for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { + index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; + if (!pi->include[index]) { + pi->include[index] = 1; + return true; + } +LABEL_SKIP:; + } + } + } + } + } + + return false; +} + +static bool pi_next_pcrl(opj_pi_iterator_t * pi) { + opj_pi_comp_t *comp = NULL; + opj_pi_resolution_t *res = NULL; + long index = 0; + + if (!pi->first) { + comp = &pi->comps[pi->compno]; + goto LABEL_SKIP; + } else { + int compno, resno; + pi->first = 0; + pi->dx = 0; + pi->dy = 0; + for (compno = 0; compno < pi->numcomps; compno++) { + comp = &pi->comps[compno]; + for (resno = 0; resno < comp->numresolutions; resno++) { + int dx, dy; + res = &comp->resolutions[resno]; + dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); + dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); + pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); + pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); + } + } + } + if (!pi->tp_on){ + pi->poc.ty0 = pi->ty0; + pi->poc.tx0 = pi->tx0; + pi->poc.ty1 = pi->ty1; + pi->poc.tx1 = pi->tx1; + } + for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { + for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { + for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { + comp = &pi->comps[pi->compno]; + for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { + int levelno; + int trx0, try0; + int trx1, try1; + int rpx, rpy; + int prci, prcj; + res = &comp->resolutions[pi->resno]; + levelno = comp->numresolutions - 1 - pi->resno; + trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); + try0 = int_ceildiv(pi->ty0, comp->dy << levelno); + trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); + try1 = int_ceildiv(pi->ty1, comp->dy << levelno); + rpx = res->pdx + levelno; + rpy = res->pdy + levelno; + if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ + continue; + } + if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ + continue; + } + + if ((res->pw==0)||(res->ph==0)) continue; + + if ((trx0==trx1)||(try0==try1)) continue; + + prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) + - int_floordivpow2(trx0, res->pdx); + prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) + - int_floordivpow2(try0, res->pdy); + pi->precno = prci + prcj * res->pw; + for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { + index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; + if (!pi->include[index]) { + pi->include[index] = 1; + return true; + } +LABEL_SKIP:; + } + } + } + } + } + + return false; +} + +static bool pi_next_cprl(opj_pi_iterator_t * pi) { + opj_pi_comp_t *comp = NULL; + opj_pi_resolution_t *res = NULL; + long index = 0; + + if (!pi->first) { + comp = &pi->comps[pi->compno]; + goto LABEL_SKIP; + } else { + pi->first = 0; + } + + for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { + int resno; + comp = &pi->comps[pi->compno]; + pi->dx = 0; + pi->dy = 0; + for (resno = 0; resno < comp->numresolutions; resno++) { + int dx, dy; + res = &comp->resolutions[resno]; + dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); + dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); + pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); + pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); + } + if (!pi->tp_on){ + pi->poc.ty0 = pi->ty0; + pi->poc.tx0 = pi->tx0; + pi->poc.ty1 = pi->ty1; + pi->poc.tx1 = pi->tx1; + } + for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { + for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { + for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { + int levelno; + int trx0, try0; + int trx1, try1; + int rpx, rpy; + int prci, prcj; + res = &comp->resolutions[pi->resno]; + levelno = comp->numresolutions - 1 - pi->resno; + trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); + try0 = int_ceildiv(pi->ty0, comp->dy << levelno); + trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); + try1 = int_ceildiv(pi->ty1, comp->dy << levelno); + rpx = res->pdx + levelno; + rpy = res->pdy + levelno; + if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ + continue; + } + if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ + continue; + } + + if ((res->pw==0)||(res->ph==0)) continue; + + if ((trx0==trx1)||(try0==try1)) continue; + + prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) + - int_floordivpow2(trx0, res->pdx); + prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) + - int_floordivpow2(try0, res->pdy); + pi->precno = prci + prcj * res->pw; + for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { + index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; + if (!pi->include[index]) { + pi->include[index] = 1; + return true; + } +LABEL_SKIP:; + } + } + } + } + } + + return false; +} + +/* +========================================================== + Packet iterator interface +========================================================== +*/ + +opj_pi_iterator_t *pi_create_decode(opj_image_t *image, opj_cp_t *cp, int tileno) { + int p, q; + int compno, resno, pino; + opj_pi_iterator_t *pi = NULL; + opj_tcp_t *tcp = NULL; + opj_tccp_t *tccp = NULL; + + tcp = &cp->tcps[tileno]; + + pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t)); + if(!pi) { + /* TODO: throw an error */ + return NULL; + } + + for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */ + int maxres = 0; + int maxprec = 0; + p = tileno % cp->tw; + q = tileno / cp->tw; + + pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); + pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); + pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); + pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); + pi[pino].numcomps = image->numcomps; + + pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t)); + if(!pi[pino].comps) { + /* TODO: throw an error */ + pi_destroy(pi, cp, tileno); + return NULL; + } + + for (compno = 0; compno < pi->numcomps; compno++) { + int tcx0, tcy0, tcx1, tcy1; + opj_pi_comp_t *comp = &pi[pino].comps[compno]; + tccp = &tcp->tccps[compno]; + comp->dx = image->comps[compno].dx; + comp->dy = image->comps[compno].dy; + comp->numresolutions = tccp->numresolutions; + + comp->resolutions = (opj_pi_resolution_t*) opj_calloc(comp->numresolutions, sizeof(opj_pi_resolution_t)); + if(!comp->resolutions) { + /* TODO: throw an error */ + pi_destroy(pi, cp, tileno); + return NULL; + } + + tcx0 = int_ceildiv(pi->tx0, comp->dx); + tcy0 = int_ceildiv(pi->ty0, comp->dy); + tcx1 = int_ceildiv(pi->tx1, comp->dx); + tcy1 = int_ceildiv(pi->ty1, comp->dy); + if (comp->numresolutions > maxres) { + maxres = comp->numresolutions; + } + + for (resno = 0; resno < comp->numresolutions; resno++) { + int levelno; + int rx0, ry0, rx1, ry1; + int px0, py0, px1, py1; + opj_pi_resolution_t *res = &comp->resolutions[resno]; + if (tccp->csty & J2K_CCP_CSTY_PRT) { + res->pdx = tccp->prcw[resno]; + res->pdy = tccp->prch[resno]; + } else { + res->pdx = 15; + res->pdy = 15; + } + levelno = comp->numresolutions - 1 - resno; + rx0 = int_ceildivpow2(tcx0, levelno); + ry0 = int_ceildivpow2(tcy0, levelno); + rx1 = int_ceildivpow2(tcx1, levelno); + ry1 = int_ceildivpow2(tcy1, levelno); + px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; + py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; + px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; + py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; + res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); + res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); + + if (res->pw*res->ph > maxprec) { + maxprec = res->pw*res->ph; + } + + } + } + + tccp = &tcp->tccps[0]; + pi[pino].step_p = 1; + pi[pino].step_c = maxprec * pi[pino].step_p; + pi[pino].step_r = image->numcomps * pi[pino].step_c; + pi[pino].step_l = maxres * pi[pino].step_r; + + if (pino == 0) { + pi[pino].include = (short int*) opj_calloc(image->numcomps * maxres * tcp->numlayers * maxprec, sizeof(short int)); + if(!pi[pino].include) { + /* TODO: throw an error */ + pi_destroy(pi, cp, tileno); + return NULL; + } + } + else { + pi[pino].include = pi[pino - 1].include; + } + + if (tcp->POC == 0) { + pi[pino].first = 1; + pi[pino].poc.resno0 = 0; + pi[pino].poc.compno0 = 0; + pi[pino].poc.layno1 = tcp->numlayers; + pi[pino].poc.resno1 = maxres; + pi[pino].poc.compno1 = image->numcomps; + pi[pino].poc.prg = tcp->prg; + } else { + pi[pino].first = 1; + pi[pino].poc.resno0 = tcp->pocs[pino].resno0; + pi[pino].poc.compno0 = tcp->pocs[pino].compno0; + pi[pino].poc.layno1 = tcp->pocs[pino].layno1; + pi[pino].poc.resno1 = tcp->pocs[pino].resno1; + pi[pino].poc.compno1 = tcp->pocs[pino].compno1; + pi[pino].poc.prg = tcp->pocs[pino].prg; + } + pi[pino].poc.layno0 = 0; + pi[pino].poc.precno0 = 0; + pi[pino].poc.precno1 = maxprec; + + } + + return pi; +} + + +opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno, J2K_T2_MODE t2_mode){ + int p, q, pino; + int compno, resno; + int maxres = 0; + int maxprec = 0; + opj_pi_iterator_t *pi = NULL; + opj_tcp_t *tcp = NULL; + opj_tccp_t *tccp = NULL; + + tcp = &cp->tcps[tileno]; + + pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t)); + if(!pi) { return NULL;} + pi->tp_on = cp->tp_on; + + for(pino = 0;pino < tcp->numpocs+1 ; pino ++){ + p = tileno % cp->tw; + q = tileno / cp->tw; + + pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); + pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); + pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); + pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); + pi[pino].numcomps = image->numcomps; + + pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t)); + if(!pi[pino].comps) { + pi_destroy(pi, cp, tileno); + return NULL; + } + + for (compno = 0; compno < pi[pino].numcomps; compno++) { + int tcx0, tcy0, tcx1, tcy1; + opj_pi_comp_t *comp = &pi[pino].comps[compno]; + tccp = &tcp->tccps[compno]; + comp->dx = image->comps[compno].dx; + comp->dy = image->comps[compno].dy; + comp->numresolutions = tccp->numresolutions; + + comp->resolutions = (opj_pi_resolution_t*) opj_malloc(comp->numresolutions * sizeof(opj_pi_resolution_t)); + if(!comp->resolutions) { + pi_destroy(pi, cp, tileno); + return NULL; + } + + tcx0 = int_ceildiv(pi[pino].tx0, comp->dx); + tcy0 = int_ceildiv(pi[pino].ty0, comp->dy); + tcx1 = int_ceildiv(pi[pino].tx1, comp->dx); + tcy1 = int_ceildiv(pi[pino].ty1, comp->dy); + if (comp->numresolutions > maxres) { + maxres = comp->numresolutions; + } + + for (resno = 0; resno < comp->numresolutions; resno++) { + int levelno; + int rx0, ry0, rx1, ry1; + int px0, py0, px1, py1; + opj_pi_resolution_t *res = &comp->resolutions[resno]; + if (tccp->csty & J2K_CCP_CSTY_PRT) { + res->pdx = tccp->prcw[resno]; + res->pdy = tccp->prch[resno]; + } else { + res->pdx = 15; + res->pdy = 15; + } + levelno = comp->numresolutions - 1 - resno; + rx0 = int_ceildivpow2(tcx0, levelno); + ry0 = int_ceildivpow2(tcy0, levelno); + rx1 = int_ceildivpow2(tcx1, levelno); + ry1 = int_ceildivpow2(tcy1, levelno); + px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; + py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; + px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; + py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; + res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); + res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); + + if (res->pw*res->ph > maxprec) { + maxprec = res->pw * res->ph; + } + } + } + + tccp = &tcp->tccps[0]; + pi[pino].step_p = 1; + pi[pino].step_c = maxprec * pi[pino].step_p; + pi[pino].step_r = image->numcomps * pi[pino].step_c; + pi[pino].step_l = maxres * pi[pino].step_r; + + for (compno = 0; compno < pi->numcomps; compno++) { + opj_pi_comp_t *comp = &pi->comps[compno]; + for (resno = 0; resno < comp->numresolutions; resno++) { + int dx, dy; + opj_pi_resolution_t *res = &comp->resolutions[resno]; + dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); + dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); + pi[pino].dx = !pi->dx ? dx : int_min(pi->dx, dx); + pi[pino].dy = !pi->dy ? dy : int_min(pi->dy, dy); + } + } + + if (pino == 0) { + pi[pino].include = (short int*) opj_calloc(tcp->numlayers * pi[pino].step_l, sizeof(short int)); + if(!pi[pino].include) { + pi_destroy(pi, cp, tileno); + return NULL; + } + } + else { + pi[pino].include = pi[pino - 1].include; + } + + /* Generation of boundaries for each prog flag*/ + if(tcp->POC && ( cp->cinema || ((!cp->cinema) && (t2_mode == FINAL_PASS)))){ + tcp->pocs[pino].compS= tcp->pocs[pino].compno0; + tcp->pocs[pino].compE= tcp->pocs[pino].compno1; + tcp->pocs[pino].resS = tcp->pocs[pino].resno0; + tcp->pocs[pino].resE = tcp->pocs[pino].resno1; + tcp->pocs[pino].layE = tcp->pocs[pino].layno1; + tcp->pocs[pino].prg = tcp->pocs[pino].prg1; + if (pino > 0) + tcp->pocs[pino].layS = (tcp->pocs[pino].layE > tcp->pocs[pino - 1].layE) ? tcp->pocs[pino - 1].layE : 0; + }else { + tcp->pocs[pino].compS= 0; + tcp->pocs[pino].compE= image->numcomps; + tcp->pocs[pino].resS = 0; + tcp->pocs[pino].resE = maxres; + tcp->pocs[pino].layS = 0; + tcp->pocs[pino].layE = tcp->numlayers; + tcp->pocs[pino].prg = tcp->prg; + } + tcp->pocs[pino].prcS = 0; + tcp->pocs[pino].prcE = maxprec;; + tcp->pocs[pino].txS = pi[pino].tx0; + tcp->pocs[pino].txE = pi[pino].tx1; + tcp->pocs[pino].tyS = pi[pino].ty0; + tcp->pocs[pino].tyE = pi[pino].ty1; + tcp->pocs[pino].dx = pi[pino].dx; + tcp->pocs[pino].dy = pi[pino].dy; + } + return pi; + } + + + +void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) { + int compno, pino; + opj_tcp_t *tcp = &cp->tcps[tileno]; + if(pi) { + for (pino = 0; pino < tcp->numpocs + 1; pino++) { + if(pi[pino].comps) { + for (compno = 0; compno < pi->numcomps; compno++) { + opj_pi_comp_t *comp = &pi[pino].comps[compno]; + if(comp->resolutions) { + opj_free(comp->resolutions); + } + } + opj_free(pi[pino].comps); + } + } + if(pi->include) { + opj_free(pi->include); + } + opj_free(pi); + } +} + +bool pi_next(opj_pi_iterator_t * pi) { + switch (pi->poc.prg) { + case LRCP: + return pi_next_lrcp(pi); + case RLCP: + return pi_next_rlcp(pi); + case RPCL: + return pi_next_rpcl(pi); + case PCRL: + return pi_next_pcrl(pi); + case CPRL: + return pi_next_cprl(pi); + case PROG_UNKNOWN: + return false; + } + + return false; +} + +bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){ + char prog[4]; + int i; + int incr_top=1,resetX=0; + opj_tcp_t *tcps =&cp->tcps[tileno]; + opj_poc_t *tcp= &tcps->pocs[pino]; + + pi[pino].first = 1; + pi[pino].poc.prg = tcp->prg; + + switch(tcp->prg){ + case CPRL: strncpy(prog, "CPRL",4); + break; + case LRCP: strncpy(prog, "LRCP",4); + break; + case PCRL: strncpy(prog, "PCRL",4); + break; + case RLCP: strncpy(prog, "RLCP",4); + break; + case RPCL: strncpy(prog, "RPCL",4); + break; + case PROG_UNKNOWN: + return true; + } + + if(!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))){ + pi[pino].poc.resno0 = tcp->resS; + pi[pino].poc.resno1 = tcp->resE; + pi[pino].poc.compno0 = tcp->compS; + pi[pino].poc.compno1 = tcp->compE; + pi[pino].poc.layno0 = tcp->layS; + pi[pino].poc.layno1 = tcp->layE; + pi[pino].poc.precno0 = tcp->prcS; + pi[pino].poc.precno1 = tcp->prcE; + pi[pino].poc.tx0 = tcp->txS; + pi[pino].poc.ty0 = tcp->tyS; + pi[pino].poc.tx1 = tcp->txE; + pi[pino].poc.ty1 = tcp->tyE; + }else { + if( tpnum < cur_totnum_tp){ + for(i=3;i>=0;i--){ + switch(prog[i]){ + case 'C': + if (i > tppos){ + pi[pino].poc.compno0 = tcp->compS; + pi[pino].poc.compno1 = tcp->compE; + }else{ + if (tpnum == 0){ + tcp->comp_t = tcp->compS; + pi[pino].poc.compno0 = tcp->comp_t; + pi[pino].poc.compno1 = tcp->comp_t+1; + tcp->comp_t+=1; + }else{ + if (incr_top == 1){ + if(tcp->comp_t ==tcp->compE){ + tcp->comp_t = tcp->compS; + pi[pino].poc.compno0 = tcp->comp_t; + pi[pino].poc.compno1 = tcp->comp_t+1; + tcp->comp_t+=1; + incr_top=1; + }else{ + pi[pino].poc.compno0 = tcp->comp_t; + pi[pino].poc.compno1 = tcp->comp_t+1; + tcp->comp_t+=1; + incr_top=0; + } + }else{ + pi[pino].poc.compno0 = tcp->comp_t-1; + pi[pino].poc.compno1 = tcp->comp_t; + } + } + } + break; + + case 'R': + if (i > tppos){ + pi[pino].poc.resno0 = tcp->resS; + pi[pino].poc.resno1 = tcp->resE; + }else{ + if (tpnum == 0){ + tcp->res_t = tcp->resS; + pi[pino].poc.resno0 = tcp->res_t; + pi[pino].poc.resno1 = tcp->res_t+1; + tcp->res_t+=1; + }else{ + if (incr_top == 1){ + if(tcp->res_t==tcp->resE){ + tcp->res_t = tcp->resS; + pi[pino].poc.resno0 = tcp->res_t; + pi[pino].poc.resno1 = tcp->res_t+1; + tcp->res_t+=1; + incr_top=1; + }else{ + pi[pino].poc.resno0 = tcp->res_t; + pi[pino].poc.resno1 = tcp->res_t+1; + tcp->res_t+=1; + incr_top=0; + } + }else{ + pi[pino].poc.resno0 = tcp->res_t - 1; + pi[pino].poc.resno1 = tcp->res_t; + } + } + } + break; + + case 'L': + if (i > tppos){ + pi[pino].poc.layno0 = tcp->layS; + pi[pino].poc.layno1 = tcp->layE; + }else{ + if (tpnum == 0){ + tcp->lay_t = tcp->layS; + pi[pino].poc.layno0 = tcp->lay_t; + pi[pino].poc.layno1 = tcp->lay_t+1; + tcp->lay_t+=1; + }else{ + if (incr_top == 1){ + if(tcp->lay_t == tcp->layE){ + tcp->lay_t = tcp->layS; + pi[pino].poc.layno0 = tcp->lay_t; + pi[pino].poc.layno1 = tcp->lay_t+1; + tcp->lay_t+=1; + incr_top=1; + }else{ + pi[pino].poc.layno0 = tcp->lay_t; + pi[pino].poc.layno1 = tcp->lay_t+1; + tcp->lay_t+=1; + incr_top=0; + } + }else{ + pi[pino].poc.layno0 = tcp->lay_t - 1; + pi[pino].poc.layno1 = tcp->lay_t; + } + } + } + break; + + case 'P': + switch(tcp->prg){ + case LRCP: + case RLCP: + if (i > tppos){ + pi[pino].poc.precno0 = tcp->prcS; + pi[pino].poc.precno1 = tcp->prcE; + }else{ + if (tpnum == 0){ + tcp->prc_t = tcp->prcS; + pi[pino].poc.precno0 = tcp->prc_t; + pi[pino].poc.precno1 = tcp->prc_t+1; + tcp->prc_t+=1; + }else{ + if (incr_top == 1){ + if(tcp->prc_t == tcp->prcE){ + tcp->prc_t = tcp->prcS; + pi[pino].poc.precno0 = tcp->prc_t; + pi[pino].poc.precno1 = tcp->prc_t+1; + tcp->prc_t+=1; + incr_top=1; + }else{ + pi[pino].poc.precno0 = tcp->prc_t; + pi[pino].poc.precno1 = tcp->prc_t+1; + tcp->prc_t+=1; + incr_top=0; + } + }else{ + pi[pino].poc.precno0 = tcp->prc_t - 1; + pi[pino].poc.precno1 = tcp->prc_t; + } + } + } + break; + default: + if (i > tppos){ + pi[pino].poc.tx0 = tcp->txS; + pi[pino].poc.ty0 = tcp->tyS; + pi[pino].poc.tx1 = tcp->txE; + pi[pino].poc.ty1 = tcp->tyE; + }else{ + if (tpnum == 0){ + tcp->tx0_t = tcp->txS; + tcp->ty0_t = tcp->tyS; + pi[pino].poc.tx0 = tcp->tx0_t; + pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx); + pi[pino].poc.ty0 = tcp->ty0_t; + pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); + tcp->tx0_t = pi[pino].poc.tx1; + tcp->ty0_t = pi[pino].poc.ty1; + }else{ + if (incr_top == 1){ + if(tcp->tx0_t >= tcp->txE){ + if(tcp->ty0_t >= tcp->tyE){ + tcp->ty0_t = tcp->tyS; + pi[pino].poc.ty0 = tcp->ty0_t; + pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); + tcp->ty0_t = pi[pino].poc.ty1; + incr_top=1;resetX=1; + }else{ + pi[pino].poc.ty0 = tcp->ty0_t; + pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); + tcp->ty0_t = pi[pino].poc.ty1; + incr_top=0;resetX=1; + } + if(resetX==1){ + tcp->tx0_t = tcp->txS; + pi[pino].poc.tx0 = tcp->tx0_t; + pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); + tcp->tx0_t = pi[pino].poc.tx1; + } + }else{ + pi[pino].poc.tx0 = tcp->tx0_t; + pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); + tcp->tx0_t = pi[pino].poc.tx1; + pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); + pi[pino].poc.ty1 = tcp->ty0_t ; + incr_top=0; + } + }else{ + pi[pino].poc.tx0 = tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx); + pi[pino].poc.tx1 = tcp->tx0_t ; + pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); + pi[pino].poc.ty1 = tcp->ty0_t ; + } + } + } + break; + } + break; + } + } + } + } + return false; +} + diff --git a/contrib/media/updf_newlib/libopenjpeg/pi.h b/contrib/media/updf_newlib/libopenjpeg/pi.h new file mode 100755 index 000000000..80febc5c6 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/pi.h @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __PI_H +#define __PI_H +/** +@file pi.h +@brief Implementation of a packet iterator (PI) + +The functions in PI.C have for goal to realize a packet iterator that permits to get the next +packet following the progression order and change of it. The functions in PI.C are used +by some function in T2.C. +*/ + +/** @defgroup PI PI - Implementation of a packet iterator */ +/*@{*/ + +/** +FIXME: documentation +*/ +typedef struct opj_pi_resolution { + int pdx, pdy; + int pw, ph; +} opj_pi_resolution_t; + +/** +FIXME: documentation +*/ +typedef struct opj_pi_comp { + int dx, dy; + /** number of resolution levels */ + int numresolutions; + opj_pi_resolution_t *resolutions; +} opj_pi_comp_t; + +/** +Packet iterator +*/ +typedef struct opj_pi_iterator { + /** Enabling Tile part generation*/ + char tp_on; + /** precise if the packet has been already used (usefull for progression order change) */ + short int *include; + /** layer step used to localize the packet in the include vector */ + int step_l; + /** resolution step used to localize the packet in the include vector */ + int step_r; + /** component step used to localize the packet in the include vector */ + int step_c; + /** precinct step used to localize the packet in the include vector */ + int step_p; + /** component that identify the packet */ + int compno; + /** resolution that identify the packet */ + int resno; + /** precinct that identify the packet */ + int precno; + /** layer that identify the packet */ + int layno; + /** 0 if the first packet */ + int first; + /** progression order change information */ + opj_poc_t poc; + /** number of components in the image */ + int numcomps; + /** Components*/ + opj_pi_comp_t *comps; + int tx0, ty0, tx1, ty1; + int x, y, dx, dy; +} opj_pi_iterator_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a packet iterator for Encoder +@param image Raw image for which the packets will be listed +@param cp Coding parameters +@param tileno Number that identifies the tile for which to list the packets +@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass +@return Returns a packet iterator that points to the first packet of the tile +@see pi_destroy +*/ +opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno,J2K_T2_MODE t2_mode); +/** +Modify the packet iterator for enabling tile part generation +@param pi Handle to the packet iterator generated in pi_initialise_encode +@param cp Coding parameters +@param tileno Number that identifies the tile for which to list the packets +@param pino Iterator index for pi +@param tpnum Tile part number of the current tile +@param tppos The position of the tile part flag in the progression order +@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass +@param cur_totnum_tp The total number of tile parts in the current tile +@return Returns true if an error is detected +*/ +bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp); +/** +Create a packet iterator for Decoder +@param image Raw image for which the packets will be listed +@param cp Coding parameters +@param tileno Number that identifies the tile for which to list the packets +@return Returns a packet iterator that points to the first packet of the tile +@see pi_destroy +*/ +opj_pi_iterator_t *pi_create_decode(opj_image_t * image, opj_cp_t * cp, int tileno); + +/** +Destroy a packet iterator +@param pi Previously created packet iterator +@param cp Coding parameters +@param tileno Number that identifies the tile for which the packets were listed +@see pi_create +*/ +void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno); + +/** +Modify the packet iterator to point to the next packet +@param pi Packet iterator to modify +@return Returns false if pi pointed to the last packet or else returns true +*/ +bool pi_next(opj_pi_iterator_t * pi); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __PI_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/raw.c b/contrib/media/updf_newlib/libopenjpeg/raw.c new file mode 100755 index 000000000..3d231bfdc --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/raw.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +/* +========================================================== + local functions +========================================================== +*/ + + +/* +========================================================== + RAW encoding interface +========================================================== +*/ + +opj_raw_t* raw_create(void) { + opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t)); + return raw; +} + +void raw_destroy(opj_raw_t *raw) { + if(raw) { + opj_free(raw); + } +} + +int raw_numbytes(opj_raw_t *raw) { + return raw->bp - raw->start; +} + +void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) { + raw->start = bp; + raw->lenmax = len; + raw->len = 0; + raw->c = 0; + raw->ct = 0; +} + +int raw_decode(opj_raw_t *raw) { + int d; + if (raw->ct == 0) { + raw->ct = 8; + if (raw->len == raw->lenmax) { + raw->c = 0xff; + } else { + if (raw->c == 0xff) { + raw->ct = 7; + } + raw->c = *(raw->start + raw->len); + raw->len++; + } + } + raw->ct--; + d = (raw->c >> raw->ct) & 0x01; + + return d; +} + diff --git a/contrib/media/updf_newlib/libopenjpeg/raw.h b/contrib/media/updf_newlib/libopenjpeg/raw.h new file mode 100755 index 000000000..3c4b372f3 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/raw.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __RAW_H +#define __RAW_H +/** +@file raw.h +@brief Implementation of operations for raw encoding (RAW) + +The functions in RAW.C have for goal to realize the operation of raw encoding linked +with the corresponding mode switch. +*/ + +/** @defgroup RAW RAW - Implementation of operations for raw encoding */ +/*@{*/ + +/** +RAW encoding operations +*/ +typedef struct opj_raw { + /** temporary buffer where bits are coded or decoded */ + unsigned char c; + /** number of bits already read or free to write */ + unsigned int ct; + /** maximum length to decode */ + unsigned int lenmax; + /** length decoded */ + unsigned int len; + /** pointer to the current position in the buffer */ + unsigned char *bp; + /** pointer to the start of the buffer */ + unsigned char *start; + /** pointer to the end of the buffer */ + unsigned char *end; +} opj_raw_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a new RAW handle +@return Returns a new RAW handle if successful, returns NULL otherwise +*/ +opj_raw_t* raw_create(void); +/** +Destroy a previously created RAW handle +@param raw RAW handle to destroy +*/ +void raw_destroy(opj_raw_t *raw); +/** +Return the number of bytes written/read since initialisation +@param raw RAW handle to destroy +@return Returns the number of bytes already encoded +*/ +int raw_numbytes(opj_raw_t *raw); +/** +Initialize the decoder +@param raw RAW handle +@param bp Pointer to the start of the buffer from which the bytes will be read +@param len Length of the input buffer +*/ +void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len); +/** +Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN +@param raw RAW handle +@return Returns the decoded symbol (0 or 1) +*/ +int raw_decode(opj_raw_t *raw); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __RAW_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/t1.c b/contrib/media/updf_newlib/libopenjpeg/t1.c new file mode 100755 index 000000000..493007475 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/t1.c @@ -0,0 +1,1581 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2007, Callum Lerwick + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" +#include "t1_luts.h" + +/** @defgroup T1 T1 - Implementation of the tier-1 coding */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +static INLINE char t1_getctxno_zc(int f, int orient); +static char t1_getctxno_sc(int f); +static INLINE int t1_getctxno_mag(int f); +static char t1_getspb(int f); +static short t1_getnmsedec_sig(int x, int bitpos); +static short t1_getnmsedec_ref(int x, int bitpos); +static void t1_updateflags(flag_t *flagsp, int s, int stride); +/** +Encode significant pass +*/ +static void t1_enc_sigpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int bpno, + int one, + int *nmsedec, + char type, + int vsc); +/** +Decode significant pass +*/ +static INLINE void t1_dec_sigpass_step_raw( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int vsc); +static INLINE void t1_dec_sigpass_step_mqc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf); +static INLINE void t1_dec_sigpass_step_mqc_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int vsc); +/** +Encode significant pass +*/ +static void t1_enc_sigpass( + opj_t1_t *t1, + int bpno, + int orient, + int *nmsedec, + char type, + int cblksty); +/** +Decode significant pass +*/ +static void t1_dec_sigpass_raw( + opj_t1_t *t1, + int bpno, + int orient, + int cblksty); +static void t1_dec_sigpass_mqc( + opj_t1_t *t1, + int bpno, + int orient); +static void t1_dec_sigpass_mqc_vsc( + opj_t1_t *t1, + int bpno, + int orient); +/** +Encode refinement pass +*/ +static void t1_enc_refpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int bpno, + int one, + int *nmsedec, + char type, + int vsc); +/** +Decode refinement pass +*/ +static void INLINE t1_dec_refpass_step_raw( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf, + int vsc); +static void INLINE t1_dec_refpass_step_mqc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf); +static void INLINE t1_dec_refpass_step_mqc_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf, + int vsc); + +/** +Encode refinement pass +*/ +static void t1_enc_refpass( + opj_t1_t *t1, + int bpno, + int *nmsedec, + char type, + int cblksty); +/** +Decode refinement pass +*/ +static void t1_dec_refpass_raw( + opj_t1_t *t1, + int bpno, + int cblksty); +static void t1_dec_refpass_mqc( + opj_t1_t *t1, + int bpno); +static void t1_dec_refpass_mqc_vsc( + opj_t1_t *t1, + int bpno); +/** +Encode clean-up pass +*/ +static void t1_enc_clnpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int bpno, + int one, + int *nmsedec, + int partial, + int vsc); +/** +Decode clean-up pass +*/ +static void t1_dec_clnpass_step_partial( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf); +static void t1_dec_clnpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf); +static void t1_dec_clnpass_step_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int partial, + int vsc); +/** +Encode clean-up pass +*/ +static void t1_enc_clnpass( + opj_t1_t *t1, + int bpno, + int orient, + int *nmsedec, + int cblksty); +/** +Decode clean-up pass +*/ +static void t1_dec_clnpass( + opj_t1_t *t1, + int bpno, + int orient, + int cblksty); +static double t1_getwmsedec( + int nmsedec, + int compno, + int level, + int orient, + int bpno, + int qmfbid, + double stepsize, + int numcomps, + int mct); +/** +Encode 1 code-block +@param t1 T1 handle +@param cblk Code-block coding parameters +@param orient +@param compno Component number +@param level +@param qmfbid +@param stepsize +@param cblksty Code-block style +@param numcomps +@param mct +@param tile +*/ +static void t1_encode_cblk( + opj_t1_t *t1, + opj_tcd_cblk_enc_t* cblk, + int orient, + int compno, + int level, + int qmfbid, + double stepsize, + int cblksty, + int numcomps, + int mct, + opj_tcd_tile_t * tile); +/** +Decode 1 code-block +@param t1 T1 handle +@param cblk Code-block coding parameters +@param orient +@param roishift Region of interest shifting value +@param cblksty Code-block style +*/ +static void t1_decode_cblk( + opj_t1_t *t1, + opj_tcd_cblk_dec_t* cblk, + int orient, + int roishift, + int cblksty); + +/*@}*/ + +/*@}*/ + +/* ----------------------------------------------------------------------- */ + +static char t1_getctxno_zc(int f, int orient) { + return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)]; +} + +static char t1_getctxno_sc(int f) { + return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; +} + +static int t1_getctxno_mag(int f) { + int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG; + int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1; + return (tmp2); +} + +static char t1_getspb(int f) { + return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; +} + +static short t1_getnmsedec_sig(int x, int bitpos) { + if (bitpos > T1_NMSEDEC_FRACBITS) { + return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; + } + + return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; +} + +static short t1_getnmsedec_ref(int x, int bitpos) { + if (bitpos > T1_NMSEDEC_FRACBITS) { + return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; + } + + return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; +} + +static void t1_updateflags(flag_t *flagsp, int s, int stride) { + flag_t *np = flagsp - stride; + flag_t *sp = flagsp + stride; + + static const flag_t mod[] = { + T1_SIG_S, T1_SIG_S|T1_SGN_S, + T1_SIG_E, T1_SIG_E|T1_SGN_E, + T1_SIG_W, T1_SIG_W|T1_SGN_W, + T1_SIG_N, T1_SIG_N|T1_SGN_N + }; + + np[-1] |= T1_SIG_SE; + np[0] |= mod[s]; + np[1] |= T1_SIG_SW; + + flagsp[-1] |= mod[s+2]; + flagsp[0] |= T1_SIG; + flagsp[1] |= mod[s+4]; + + sp[-1] |= T1_SIG_NE; + sp[0] |= mod[s+6]; + sp[1] |= T1_SIG_NW; +} + +static void t1_enc_sigpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int bpno, + int one, + int *nmsedec, + char type, + int vsc) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { + v = int_abs(*datap) & one ? 1 : 0; + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */ + if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ + mqc_bypass_enc(mqc, v); + } else { + mqc_encode(mqc, v); + } + if (v) { + v = *datap < 0 ? 1 : 0; + *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */ + if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ + mqc_bypass_enc(mqc, v); + } else { + mqc_encode(mqc, v ^ t1_getspb(flag)); + } + t1_updateflags(flagsp, v, t1->flags_stride); + } + *flagsp |= T1_VISIT; + } +} + +static INLINE void t1_dec_sigpass_step_raw( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int vsc) +{ + int v, flag; + + opj_raw_t *raw = t1->raw; /* RAW component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { + if (raw_decode(raw)) { + v = raw_decode(raw); /* ESSAI */ + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + } + *flagsp |= T1_VISIT; + } +} /* VSC and BYPASS by Antonin */ + +static INLINE void t1_dec_sigpass_step_mqc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = *flagsp; + if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); + if (mqc_decode(mqc)) { + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = mqc_decode(mqc) ^ t1_getspb(flag); + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + } + *flagsp |= T1_VISIT; + } +} /* VSC and BYPASS by Antonin */ + +static INLINE void t1_dec_sigpass_step_mqc_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int vsc) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); + if (mqc_decode(mqc)) { + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = mqc_decode(mqc) ^ t1_getspb(flag); + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + } + *flagsp |= T1_VISIT; + } +} /* VSC and BYPASS by Antonin */ + +static void t1_enc_sigpass( + opj_t1_t *t1, + int bpno, + int orient, + int *nmsedec, + char type, + int cblksty) +{ + int i, j, k, one, vsc; + *nmsedec = 0; + one = 1 << (bpno + T1_NMSEDEC_FRACBITS); + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_enc_sigpass_step( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + orient, + bpno, + one, + nmsedec, + type, + vsc); + } + } + } +} + +static void t1_dec_sigpass_raw( + opj_t1_t *t1, + int bpno, + int orient, + int cblksty) +{ + int i, j, k, one, half, oneplushalf, vsc; + one = 1 << bpno; + half = one >> 1; + oneplushalf = one | half; + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_dec_sigpass_step_raw( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + orient, + oneplushalf, + vsc); + } + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_sigpass_mqc( + opj_t1_t *t1, + int bpno, + int orient) +{ + int i, j, k, one, half, oneplushalf; + int *data1 = t1->data; + flag_t *flags1 = &t1->flags[1]; + one = 1 << bpno; + half = one >> 1; + oneplushalf = one | half; + for (k = 0; k < (t1->h & ~3); k += 4) { + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + flags2 += t1->flags_stride; + t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + } + data1 += t1->w << 2; + flags1 += t1->flags_stride << 2; + } + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + for (j = k; j < t1->h; ++j) { + flags2 += t1->flags_stride; + t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_sigpass_mqc_vsc( + opj_t1_t *t1, + int bpno, + int orient) +{ + int i, j, k, one, half, oneplushalf, vsc; + one = 1 << bpno; + half = one >> 1; + oneplushalf = one | half; + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0; + t1_dec_sigpass_step_mqc_vsc( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + orient, + oneplushalf, + vsc); + } + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_enc_refpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int bpno, + int one, + int *nmsedec, + char type, + int vsc) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { + *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); + v = int_abs(*datap) & one ? 1 : 0; + mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ + if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ + mqc_bypass_enc(mqc, v); + } else { + mqc_encode(mqc, v); + } + *flagsp |= T1_REFINE; + } +} + +static INLINE void t1_dec_refpass_step_raw( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf, + int vsc) +{ + int v, t, flag; + + opj_raw_t *raw = t1->raw; /* RAW component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { + v = raw_decode(raw); + t = v ? poshalf : neghalf; + *datap += *datap < 0 ? -t : t; + *flagsp |= T1_REFINE; + } +} /* VSC and BYPASS by Antonin */ + +static INLINE void t1_dec_refpass_step_mqc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf) +{ + int v, t, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = *flagsp; + if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { + mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ + v = mqc_decode(mqc); + t = v ? poshalf : neghalf; + *datap += *datap < 0 ? -t : t; + *flagsp |= T1_REFINE; + } +} /* VSC and BYPASS by Antonin */ + +static INLINE void t1_dec_refpass_step_mqc_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int poshalf, + int neghalf, + int vsc) +{ + int v, t, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { + mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ + v = mqc_decode(mqc); + t = v ? poshalf : neghalf; + *datap += *datap < 0 ? -t : t; + *flagsp |= T1_REFINE; + } +} /* VSC and BYPASS by Antonin */ + +static void t1_enc_refpass( + opj_t1_t *t1, + int bpno, + int *nmsedec, + char type, + int cblksty) +{ + int i, j, k, one, vsc; + *nmsedec = 0; + one = 1 << (bpno + T1_NMSEDEC_FRACBITS); + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_enc_refpass_step( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + bpno, + one, + nmsedec, + type, + vsc); + } + } + } +} + +static void t1_dec_refpass_raw( + opj_t1_t *t1, + int bpno, + int cblksty) +{ + int i, j, k, one, poshalf, neghalf; + int vsc; + one = 1 << bpno; + poshalf = one >> 1; + neghalf = bpno > 0 ? -poshalf : -1; + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_dec_refpass_step_raw( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + poshalf, + neghalf, + vsc); + } + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_refpass_mqc( + opj_t1_t *t1, + int bpno) +{ + int i, j, k, one, poshalf, neghalf; + int *data1 = t1->data; + flag_t *flags1 = &t1->flags[1]; + one = 1 << bpno; + poshalf = one >> 1; + neghalf = bpno > 0 ? -poshalf : -1; + for (k = 0; k < (t1->h & ~3); k += 4) { + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + flags2 += t1->flags_stride; + t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); + data2 += t1->w; + } + data1 += t1->w << 2; + flags1 += t1->flags_stride << 2; + } + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + for (j = k; j < t1->h; ++j) { + flags2 += t1->flags_stride; + t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); + data2 += t1->w; + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_refpass_mqc_vsc( + opj_t1_t *t1, + int bpno) +{ + int i, j, k, one, poshalf, neghalf; + int vsc; + one = 1 << bpno; + poshalf = one >> 1; + neghalf = bpno > 0 ? -poshalf : -1; + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + for (j = k; j < k + 4 && j < t1->h; ++j) { + vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_dec_refpass_step_mqc_vsc( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + poshalf, + neghalf, + vsc); + } + } + } +} /* VSC and BYPASS by Antonin */ + +static void t1_enc_clnpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int bpno, + int one, + int *nmsedec, + int partial, + int vsc) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if (partial) { + goto LABEL_PARTIAL; + } + if (!(*flagsp & (T1_SIG | T1_VISIT))) { + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); + v = int_abs(*datap) & one ? 1 : 0; + mqc_encode(mqc, v); + if (v) { +LABEL_PARTIAL: + *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = *datap < 0 ? 1 : 0; + mqc_encode(mqc, v ^ t1_getspb(flag)); + t1_updateflags(flagsp, v, t1->flags_stride); + } + } + *flagsp &= ~T1_VISIT; +} + +static void t1_dec_clnpass_step_partial( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = *flagsp; + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = mqc_decode(mqc) ^ t1_getspb(flag); + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + *flagsp &= ~T1_VISIT; +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_clnpass_step( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = *flagsp; + if (!(flag & (T1_SIG | T1_VISIT))) { + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); + if (mqc_decode(mqc)) { + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = mqc_decode(mqc) ^ t1_getspb(flag); + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + } + } + *flagsp &= ~T1_VISIT; +} /* VSC and BYPASS by Antonin */ + +static void t1_dec_clnpass_step_vsc( + opj_t1_t *t1, + flag_t *flagsp, + int *datap, + int orient, + int oneplushalf, + int partial, + int vsc) +{ + int v, flag; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); + if (partial) { + goto LABEL_PARTIAL; + } + if (!(flag & (T1_SIG | T1_VISIT))) { + mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); + if (mqc_decode(mqc)) { +LABEL_PARTIAL: + mqc_setcurctx(mqc, t1_getctxno_sc(flag)); + v = mqc_decode(mqc) ^ t1_getspb(flag); + *datap = v ? -oneplushalf : oneplushalf; + t1_updateflags(flagsp, v, t1->flags_stride); + } + } + *flagsp &= ~T1_VISIT; +} + +static void t1_enc_clnpass( + opj_t1_t *t1, + int bpno, + int orient, + int *nmsedec, + int cblksty) +{ + int i, j, k, one, agg, runlen, vsc; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + *nmsedec = 0; + one = 1 << (bpno + T1_NMSEDEC_FRACBITS); + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + if (k + 3 < t1->h) { + if (cblksty & J2K_CCP_CBLKSTY_VSC) { + agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || (MACRO_t1_flags(1 + k + 3,1 + i) + & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); + } else { + agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); + } + } else { + agg = 0; + } + if (agg) { + for (runlen = 0; runlen < 4; ++runlen) { + if (int_abs(t1->data[((k + runlen)*t1->w) + i]) & one) + break; + } + mqc_setcurctx(mqc, T1_CTXNO_AGG); + mqc_encode(mqc, runlen != 4); + if (runlen == 4) { + continue; + } + mqc_setcurctx(mqc, T1_CTXNO_UNI); + mqc_encode(mqc, runlen >> 1); + mqc_encode(mqc, runlen & 1); + } else { + runlen = 0; + } + for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { + vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; + t1_enc_clnpass_step( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + orient, + bpno, + one, + nmsedec, + agg && (j == k + runlen), + vsc); + } + } + } +} + +static void t1_dec_clnpass( + opj_t1_t *t1, + int bpno, + int orient, + int cblksty) +{ + int i, j, k, one, half, oneplushalf, agg, runlen, vsc; + int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + one = 1 << bpno; + half = one >> 1; + oneplushalf = one | half; + if (cblksty & J2K_CCP_CBLKSTY_VSC) { + for (k = 0; k < t1->h; k += 4) { + for (i = 0; i < t1->w; ++i) { + if (k + 3 < t1->h) { + agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || (MACRO_t1_flags(1 + k + 3,1 + i) + & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); + } else { + agg = 0; + } + if (agg) { + mqc_setcurctx(mqc, T1_CTXNO_AGG); + if (!mqc_decode(mqc)) { + continue; + } + mqc_setcurctx(mqc, T1_CTXNO_UNI); + runlen = mqc_decode(mqc); + runlen = (runlen << 1) | mqc_decode(mqc); + } else { + runlen = 0; + } + for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { + vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0; + t1_dec_clnpass_step_vsc( + t1, + &t1->flags[((j+1) * t1->flags_stride) + i + 1], + &t1->data[(j * t1->w) + i], + orient, + oneplushalf, + agg && (j == k + runlen), + vsc); + } + } + } + } else { + int *data1 = t1->data; + flag_t *flags1 = &t1->flags[1]; + for (k = 0; k < (t1->h & ~3); k += 4) { + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) + || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); + if (agg) { + mqc_setcurctx(mqc, T1_CTXNO_AGG); + if (!mqc_decode(mqc)) { + continue; + } + mqc_setcurctx(mqc, T1_CTXNO_UNI); + runlen = mqc_decode(mqc); + runlen = (runlen << 1) | mqc_decode(mqc); + flags2 += runlen * t1->flags_stride; + data2 += runlen * t1->w; + for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { + flags2 += t1->flags_stride; + if (agg && (j == k + runlen)) { + t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf); + } else { + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + } + data2 += t1->w; + } + } else { + flags2 += t1->flags_stride; + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + flags2 += t1->flags_stride; + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + } + } + data1 += t1->w << 2; + flags1 += t1->flags_stride << 2; + } + for (i = 0; i < t1->w; ++i) { + int *data2 = data1 + i; + flag_t *flags2 = flags1 + i; + for (j = k; j < t1->h; ++j) { + flags2 += t1->flags_stride; + t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); + data2 += t1->w; + } + } + } + + if (segsym) { + int v = 0; + mqc_setcurctx(mqc, T1_CTXNO_UNI); + v = mqc_decode(mqc); + v = (v << 1) | mqc_decode(mqc); + v = (v << 1) | mqc_decode(mqc); + v = (v << 1) | mqc_decode(mqc); + /* + if (v!=0xa) { + opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v); + } + */ + } +} /* VSC and BYPASS by Antonin */ + + +/** mod fixed_quality */ +static double t1_getwmsedec( + int nmsedec, + int compno, + int level, + int orient, + int bpno, + int qmfbid, + double stepsize, + int numcomps, + int mct) +{ + double w1, w2, wmsedec; + if (qmfbid == 1) { + w1 = (mct && numcomps==3) ? mct_getnorm(compno) : 1.0; + w2 = dwt_getnorm(level, orient); + } else { /* if (qmfbid == 0) */ + w1 = (mct && numcomps==3) ? mct_getnorm_real(compno) : 1.0; + w2 = dwt_getnorm_real(level, orient); + } + wmsedec = w1 * w2 * stepsize * (1 << bpno); + wmsedec *= wmsedec * nmsedec / 8192.0; + + return wmsedec; +} + +static bool allocate_buffers( + opj_t1_t *t1, + int w, + int h) +{ + int datasize=w * h; + int flagssize; + + if(datasize > t1->datasize){ + opj_aligned_free(t1->data); + t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int)); + if(!t1->data){ + return false; + } + t1->datasize=datasize; + } + memset(t1->data,0,datasize * sizeof(int)); + + t1->flags_stride=w+2; + flagssize=t1->flags_stride * (h+2); + + if(flagssize > t1->flagssize){ + opj_aligned_free(t1->flags); + t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t)); + if(!t1->flags){ + return false; + } + t1->flagssize=flagssize; + } + memset(t1->flags,0,flagssize * sizeof(flag_t)); + + t1->w=w; + t1->h=h; + + return true; +} + +/** mod fixed_quality */ +static void t1_encode_cblk( + opj_t1_t *t1, + opj_tcd_cblk_enc_t* cblk, + int orient, + int compno, + int level, + int qmfbid, + double stepsize, + int cblksty, + int numcomps, + int mct, + opj_tcd_tile_t * tile) +{ + double cumwmsedec = 0.0; + + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + int passno, bpno, passtype; + int nmsedec = 0; + int i, max; + char type = T1_TYPE_MQ; + double tempwmsedec; + + max = 0; + for (i = 0; i < t1->w * t1->h; ++i) { + int tmp = abs(t1->data[i]); + max = int_max(max, tmp); + } + + cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0; + + bpno = cblk->numbps - 1; + passtype = 2; + + mqc_resetstates(mqc); + mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); + mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); + mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); + mqc_init_enc(mqc, cblk->data); + + for (passno = 0; bpno >= 0; ++passno) { + opj_tcd_pass_t *pass = &cblk->passes[passno]; + int correction = 3; + type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; + + switch (passtype) { + case 0: + t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty); + break; + case 1: + t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty); + break; + case 2: + t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty); + /* code switch SEGMARK (i.e. SEGSYM) */ + if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) + mqc_segmark_enc(mqc); + break; + } + + /* fixed_quality */ + tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps, mct); + cumwmsedec += tempwmsedec; + tile->distotile += tempwmsedec; + + /* Code switch "RESTART" (i.e. TERMALL) */ + if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) { + if (type == T1_TYPE_RAW) { + mqc_flush(mqc); + correction = 1; + /* correction = mqc_bypass_flush_enc(); */ + } else { /* correction = mqc_restart_enc(); */ + mqc_flush(mqc); + correction = 1; + } + pass->term = 1; + } else { + if (((bpno < (cblk->numbps - 4) && (passtype > 0)) + || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) { + if (type == T1_TYPE_RAW) { + mqc_flush(mqc); + correction = 1; + /* correction = mqc_bypass_flush_enc(); */ + } else { /* correction = mqc_restart_enc(); */ + mqc_flush(mqc); + correction = 1; + } + pass->term = 1; + } else { + pass->term = 0; + } + } + + if (++passtype == 3) { + passtype = 0; + bpno--; + } + + if (pass->term && bpno > 0) { + type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; + if (type == T1_TYPE_RAW) + mqc_bypass_init_enc(mqc); + else + mqc_restart_init_enc(mqc); + } + + pass->distortiondec = cumwmsedec; + pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */ + + /* Code-switch "RESET" */ + if (cblksty & J2K_CCP_CBLKSTY_RESET) + mqc_reset_enc(mqc); + } + + /* Code switch "ERTERM" (i.e. PTERM) */ + if (cblksty & J2K_CCP_CBLKSTY_PTERM) + mqc_erterm_enc(mqc); + else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) + mqc_flush(mqc); + + cblk->totalpasses = passno; + + for (passno = 0; passnototalpasses; passno++) { + opj_tcd_pass_t *pass = &cblk->passes[passno]; + if (pass->rate > mqc_numbytes(mqc)) + pass->rate = mqc_numbytes(mqc); + /*Preventing generation of FF as last data byte of a pass*/ + if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){ + pass->rate--; + } + pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate); + } +} + +static void t1_decode_cblk( + opj_t1_t *t1, + opj_tcd_cblk_dec_t* cblk, + int orient, + int roishift, + int cblksty) +{ + opj_raw_t *raw = t1->raw; /* RAW component */ + opj_mqc_t *mqc = t1->mqc; /* MQC component */ + + int bpno, passtype; + int segno, passno; + char type = T1_TYPE_MQ; /* BYPASS mode */ + + if(!allocate_buffers( + t1, + cblk->x1 - cblk->x0, + cblk->y1 - cblk->y0)) + { + return; + } + + bpno = roishift + cblk->numbps - 1; + passtype = 2; + + mqc_resetstates(mqc); + mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); + mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); + mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); + + for (segno = 0; segno < cblk->numsegs; ++segno) { + opj_tcd_seg_t *seg = &cblk->segs[segno]; + + /* BYPASS mode */ + type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; + /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */ + if(seg->data == NULL){ + continue; + } + if (type == T1_TYPE_RAW) { + raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len); + } else { + mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len); + } + + for (passno = 0; passno < seg->numpasses; ++passno) { + switch (passtype) { + case 0: + if (type == T1_TYPE_RAW) { + t1_dec_sigpass_raw(t1, bpno+1, orient, cblksty); + } else { + if (cblksty & J2K_CCP_CBLKSTY_VSC) { + t1_dec_sigpass_mqc_vsc(t1, bpno+1, orient); + } else { + t1_dec_sigpass_mqc(t1, bpno+1, orient); + } + } + break; + case 1: + if (type == T1_TYPE_RAW) { + t1_dec_refpass_raw(t1, bpno+1, cblksty); + } else { + if (cblksty & J2K_CCP_CBLKSTY_VSC) { + t1_dec_refpass_mqc_vsc(t1, bpno+1); + } else { + t1_dec_refpass_mqc(t1, bpno+1); + } + } + break; + case 2: + t1_dec_clnpass(t1, bpno+1, orient, cblksty); + break; + } + + if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) { + mqc_resetstates(mqc); + mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); + mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); + mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); + } + if (++passtype == 3) { + passtype = 0; + bpno--; + } + } + } +} + +/* ----------------------------------------------------------------------- */ + +opj_t1_t* t1_create(opj_common_ptr cinfo) { + opj_t1_t *t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t)); + if(!t1) + return NULL; + + t1->cinfo = cinfo; + /* create MQC and RAW handles */ + t1->mqc = mqc_create(); + t1->raw = raw_create(); + + t1->data=NULL; + t1->flags=NULL; + t1->datasize=0; + t1->flagssize=0; + + return t1; +} + +void t1_destroy(opj_t1_t *t1) { + if(t1) { + /* destroy MQC and RAW handles */ + mqc_destroy(t1->mqc); + raw_destroy(t1->raw); + opj_aligned_free(t1->data); + opj_aligned_free(t1->flags); + opj_free(t1); + } +} + +void t1_encode_cblks( + opj_t1_t *t1, + opj_tcd_tile_t *tile, + opj_tcp_t *tcp) +{ + int compno, resno, bandno, precno, cblkno; + + tile->distotile = 0; /* fixed_quality */ + + for (compno = 0; compno < tile->numcomps; ++compno) { + opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; + opj_tccp_t* tccp = &tcp->tccps[compno]; + int tile_w = tilec->x1 - tilec->x0; + + for (resno = 0; resno < tilec->numresolutions; ++resno) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + for (bandno = 0; bandno < res->numbands; ++bandno) { + opj_tcd_band_t* restrict band = &res->bands[bandno]; + + for (precno = 0; precno < res->pw * res->ph; ++precno) { + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) { + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + int* restrict datap; + int* restrict tiledp; + int cblk_w; + int cblk_h; + int i, j; + + int x = cblk->x0 - band->x0; + int y = cblk->y0 - band->y0; + if (band->bandno & 1) { + opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; + x += pres->x1 - pres->x0; + } + if (band->bandno & 2) { + opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; + y += pres->y1 - pres->y0; + } + + if(!allocate_buffers( + t1, + cblk->x1 - cblk->x0, + cblk->y1 - cblk->y0)) + { + return; + } + + datap=t1->data; + cblk_w = t1->w; + cblk_h = t1->h; + + tiledp=&tilec->data[(y * tile_w) + x]; + if (tccp->qmfbid == 1) { + for (j = 0; j < cblk_h; ++j) { + for (i = 0; i < cblk_w; ++i) { + int tmp = tiledp[(j * tile_w) + i]; + datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS; + } + } + } else { /* if (tccp->qmfbid == 0) */ + for (j = 0; j < cblk_h; ++j) { + for (i = 0; i < cblk_w; ++i) { + int tmp = tiledp[(j * tile_w) + i]; + datap[(j * cblk_w) + i] = + fix_mul( + tmp, + 8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (11 - T1_NMSEDEC_FRACBITS); + } + } + } + + t1_encode_cblk( + t1, + cblk, + band->bandno, + compno, + tilec->numresolutions - 1 - resno, + tccp->qmfbid, + band->stepsize, + tccp->cblksty, + tile->numcomps, + tcp->mct, + tile); + + } /* cblkno */ + } /* precno */ + } /* bandno */ + } /* resno */ + } /* compno */ +} + +void t1_decode_cblks( + opj_t1_t* t1, + opj_tcd_tilecomp_t* tilec, + opj_tccp_t* tccp) +{ + int resno, bandno, precno, cblkno; + + int tile_w = tilec->x1 - tilec->x0; + + for (resno = 0; resno < tilec->numresolutions; ++resno) { + opj_tcd_resolution_t* res = &tilec->resolutions[resno]; + + for (bandno = 0; bandno < res->numbands; ++bandno) { + opj_tcd_band_t* restrict band = &res->bands[bandno]; + + for (precno = 0; precno < res->pw * res->ph; ++precno) { + opj_tcd_precinct_t* precinct = &band->precincts[precno]; + + for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) { + opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno]; + int* restrict datap; + int cblk_w, cblk_h; + int x, y; + int i, j; + + t1_decode_cblk( + t1, + cblk, + band->bandno, + tccp->roishift, + tccp->cblksty); + + x = cblk->x0 - band->x0; + y = cblk->y0 - band->y0; + if (band->bandno & 1) { + opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; + x += pres->x1 - pres->x0; + } + if (band->bandno & 2) { + opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; + y += pres->y1 - pres->y0; + } + + datap=t1->data; + cblk_w = t1->w; + cblk_h = t1->h; + + if (tccp->roishift) { + int thresh = 1 << tccp->roishift; + for (j = 0; j < cblk_h; ++j) { + for (i = 0; i < cblk_w; ++i) { + int val = datap[(j * cblk_w) + i]; + int mag = abs(val); + if (mag >= thresh) { + mag >>= tccp->roishift; + datap[(j * cblk_w) + i] = val < 0 ? -mag : mag; + } + } + } + } + + if (tccp->qmfbid == 1) { + int* restrict tiledp = &tilec->data[(y * tile_w) + x]; + for (j = 0; j < cblk_h; ++j) { + for (i = 0; i < cblk_w; ++i) { + int tmp = datap[(j * cblk_w) + i]; + ((int*)tiledp)[(j * tile_w) + i] = tmp / 2; + } + } + } else { /* if (tccp->qmfbid == 0) */ + float* restrict tiledp = (float*) &tilec->data[(y * tile_w) + x]; + for (j = 0; j < cblk_h; ++j) { + float* restrict tiledp2 = tiledp; + for (i = 0; i < cblk_w; ++i) { + float tmp = *datap * band->stepsize; + *tiledp2 = tmp; + datap++; + tiledp2++; + } + tiledp += tile_w; + } + } + opj_free(cblk->data); + opj_free(cblk->segs); + } /* cblkno */ + opj_free(precinct->cblks.dec); + } /* precno */ + } /* bandno */ + } /* resno */ +} + diff --git a/contrib/media/updf_newlib/libopenjpeg/t1.h b/contrib/media/updf_newlib/libopenjpeg/t1.h new file mode 100755 index 000000000..572ec88d2 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/t1.h @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __T1_H +#define __T1_H +/** +@file t1.h +@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1) + +The functions in T1.C have for goal to realize the tier-1 coding operation. The functions +in T1.C are used by some function in TCD.C. +*/ + +/** @defgroup T1 T1 - Implementation of the tier-1 coding */ +/*@{*/ + +/* ----------------------------------------------------------------------- */ +#define T1_NMSEDEC_BITS 7 + +#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */ +#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */ +#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */ +#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */ +#define T1_SIG_N 0x0010 /**< Context orientation : North direction */ +#define T1_SIG_E 0x0020 /**< Context orientation : East direction */ +#define T1_SIG_S 0x0040 /**< Context orientation : South direction */ +#define T1_SIG_W 0x0080 /**< Context orientation : West direction */ +#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW) +#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W) + +#define T1_SGN_N 0x0100 +#define T1_SGN_E 0x0200 +#define T1_SGN_S 0x0400 +#define T1_SGN_W 0x0800 +#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W) + +#define T1_SIG 0x1000 +#define T1_REFINE 0x2000 +#define T1_VISIT 0x4000 + +#define T1_NUMCTXS_ZC 9 +#define T1_NUMCTXS_SC 5 +#define T1_NUMCTXS_MAG 3 +#define T1_NUMCTXS_AGG 1 +#define T1_NUMCTXS_UNI 1 + +#define T1_CTXNO_ZC 0 +#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC) +#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC) +#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG) +#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG) +#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI) + +#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1) + +#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */ +#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/ + +/* ----------------------------------------------------------------------- */ + +typedef short flag_t; + +/** +Tier-1 coding (coding of code-block coefficients) +*/ +typedef struct opj_t1 { + /** codec context */ + opj_common_ptr cinfo; + + /** MQC component */ + opj_mqc_t *mqc; + /** RAW component */ + opj_raw_t *raw; + + int *data; + flag_t *flags; + int w; + int h; + int datasize; + int flagssize; + int flags_stride; +} opj_t1_t; + +#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)] + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a new T1 handle +and initialize the look-up tables of the Tier-1 coder/decoder +@return Returns a new T1 handle if successful, returns NULL otherwise +@see t1_init_luts +*/ +opj_t1_t* t1_create(opj_common_ptr cinfo); +/** +Destroy a previously created T1 handle +@param t1 T1 handle to destroy +*/ +void t1_destroy(opj_t1_t *t1); +/** +Encode the code-blocks of a tile +@param t1 T1 handle +@param tile The tile to encode +@param tcp Tile coding parameters +*/ +void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); +/** +Decode the code-blocks of a tile +@param t1 T1 handle +@param tilec The tile to decode +@param tccp Tile coding parameters +*/ +void t1_decode_cblks(opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __T1_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/t1_generate_luts.c b/contrib/media/updf_newlib/libopenjpeg/t1_generate_luts.c new file mode 100755 index 000000000..39880414f --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/t1_generate_luts.c @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2007, Callum Lerwick + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" +#include + +static int t1_init_ctxno_zc(int f, int orient) { + int h, v, d, n, t, hv; + n = 0; + h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0); + v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0); + d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != 0) + ((f & T1_SIG_SE) != 0) + ((f & T1_SIG_SW) != 0); + + switch (orient) { + case 2: + t = h; + h = v; + v = t; + case 0: + case 1: + if (!h) { + if (!v) { + if (!d) + n = 0; + else if (d == 1) + n = 1; + else + n = 2; + } else if (v == 1) { + n = 3; + } else { + n = 4; + } + } else if (h == 1) { + if (!v) { + if (!d) + n = 5; + else + n = 6; + } else { + n = 7; + } + } else + n = 8; + break; + case 3: + hv = h + v; + if (!d) { + if (!hv) { + n = 0; + } else if (hv == 1) { + n = 1; + } else { + n = 2; + } + } else if (d == 1) { + if (!hv) { + n = 3; + } else if (hv == 1) { + n = 4; + } else { + n = 5; + } + } else if (d == 2) { + if (!hv) { + n = 6; + } else { + n = 7; + } + } else { + n = 8; + } + break; + } + + return (T1_CTXNO_ZC + n); +} + +static int t1_init_ctxno_sc(int f) { + int hc, vc, n; + n = 0; + + hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) == + T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W), + 1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) == + (T1_SIG_E | T1_SGN_E)) + + ((f & (T1_SIG_W | T1_SGN_W)) == + (T1_SIG_W | T1_SGN_W)), 1); + + vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) == + T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S), + 1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) == + (T1_SIG_N | T1_SGN_N)) + + ((f & (T1_SIG_S | T1_SGN_S)) == + (T1_SIG_S | T1_SGN_S)), 1); + + if (hc < 0) { + hc = -hc; + vc = -vc; + } + if (!hc) { + if (vc == -1) + n = 1; + else if (!vc) + n = 0; + else + n = 1; + } else if (hc == 1) { + if (vc == -1) + n = 2; + else if (!vc) + n = 3; + else + n = 4; + } + + return (T1_CTXNO_SC + n); +} + +static int t1_init_spb(int f) { + int hc, vc, n; + + hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) == + T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W), + 1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) == + (T1_SIG_E | T1_SGN_E)) + + ((f & (T1_SIG_W | T1_SGN_W)) == + (T1_SIG_W | T1_SGN_W)), 1); + + vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) == + T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S), + 1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) == + (T1_SIG_N | T1_SGN_N)) + + ((f & (T1_SIG_S | T1_SGN_S)) == + (T1_SIG_S | T1_SGN_S)), 1); + + if (!hc && !vc) + n = 0; + else + n = (!(hc > 0 || (!hc && vc > 0))); + + return n; +} + +void dump_array16(int array[],int size){ + int i; + --size; + for (i = 0; i < size; ++i) { + printf("0x%04x, ", array[i]); + if(!((i+1)&0x7)) + printf("\n "); + } + printf("0x%04x\n};\n\n", array[size]); +} + +int main(){ + int i, j; + double u, v, t; + + int lut_ctxno_zc[1024]; + int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS]; + int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS]; + int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS]; + int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS]; + + printf("/* This file was automatically generated by t1_generate_luts.c */\n\n"); + + // lut_ctxno_zc + for (j = 0; j < 4; ++j) { + for (i = 0; i < 256; ++i) { + int orient = j; + if (orient == 2) { + orient = 1; + } else if (orient == 1) { + orient = 2; + } + lut_ctxno_zc[(orient << 8) | i] = t1_init_ctxno_zc(i, j); + } + } + + printf("static char lut_ctxno_zc[1024] = {\n "); + for (i = 0; i < 1023; ++i) { + printf("%i, ", lut_ctxno_zc[i]); + if(!((i+1)&0x1f)) + printf("\n "); + } + printf("%i\n};\n\n", lut_ctxno_zc[1023]); + + // lut_ctxno_sc + printf("static char lut_ctxno_sc[256] = {\n "); + for (i = 0; i < 255; ++i) { + printf("0x%x, ", t1_init_ctxno_sc(i << 4)); + if(!((i+1)&0xf)) + printf("\n "); + } + printf("0x%x\n};\n\n", t1_init_ctxno_sc(255 << 4)); + + // lut_spb + printf("static char lut_spb[256] = {\n "); + for (i = 0; i < 255; ++i) { + printf("%i, ", t1_init_spb(i << 4)); + if(!((i+1)&0x1f)) + printf("\n "); + } + printf("%i\n};\n\n", t1_init_spb(255 << 4)); + + /* FIXME FIXME FIXME */ + /* fprintf(stdout,"nmsedec luts:\n"); */ + for (i = 0; i < (1 << T1_NMSEDEC_BITS); ++i) { + t = i / pow(2, T1_NMSEDEC_FRACBITS); + u = t; + v = t - 1.5; + lut_nmsedec_sig[i] = + int_max(0, + (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); + lut_nmsedec_sig0[i] = + int_max(0, + (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); + u = t - 1.0; + if (i & (1 << (T1_NMSEDEC_BITS - 1))) { + v = t - 1.5; + } else { + v = t - 0.5; + } + lut_nmsedec_ref[i] = + int_max(0, + (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); + lut_nmsedec_ref0[i] = + int_max(0, + (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); + } + + printf("static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n "); + dump_array16(lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS); + + printf("static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n "); + dump_array16(lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS); + + printf("static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n "); + dump_array16(lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS); + + printf("static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n "); + dump_array16(lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS); + + return 0; +} diff --git a/contrib/media/updf_newlib/libopenjpeg/t1_luts.h b/contrib/media/updf_newlib/libopenjpeg/t1_luts.h new file mode 100755 index 000000000..e5e33f665 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/t1_luts.h @@ -0,0 +1,143 @@ +/* This file was automatically generated by t1_generate_luts.c */ + +static char lut_ctxno_zc[1024] = { + 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, + 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, + 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, + 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, + 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, + 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, + 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, + 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8 +}; + +static char lut_ctxno_sc[256] = { + 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, + 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, + 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, + 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, + 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, + 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, + 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, + 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, + 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, + 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, + 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, + 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, + 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, + 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, + 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, + 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd +}; + +static char lut_spb[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80, + 0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680, + 0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280, + 0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80, + 0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80, + 0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, + 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280, + 0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80, + 0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80, + 0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680 +}; + +static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, + 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, + 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, + 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, + 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, + 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, + 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00, + 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780, + 0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100, + 0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00, + 0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, + 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300, + 0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080, + 0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80, + 0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00 +}; + +static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = { + 0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480, + 0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080, + 0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80, + 0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, + 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480, + 0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380, + 0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, + 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80, + 0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80, + 0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380, + 0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780 +}; + +static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = { + 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980, + 0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300, + 0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00, + 0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, + 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500, + 0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280, + 0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, + 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, + 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, + 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, + 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, + 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, + 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00 +}; + diff --git a/contrib/media/updf_newlib/libopenjpeg/t2.c b/contrib/media/updf_newlib/libopenjpeg/t2.c new file mode 100755 index 000000000..48463c9ca --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/t2.c @@ -0,0 +1,791 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +/** @defgroup T2 T2 - Implementation of a tier-2 coding */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +static void t2_putcommacode(opj_bio_t *bio, int n); +static int t2_getcommacode(opj_bio_t *bio); +/** +Variable length code for signalling delta Zil (truncation point) +@param bio Bit Input/Output component +@param n delta Zil +*/ +static void t2_putnumpasses(opj_bio_t *bio, int n); +static int t2_getnumpasses(opj_bio_t *bio); +/** +Encode a packet of a tile to a destination buffer +@param tile Tile for which to write the packets +@param tcp Tile coding parameters +@param pi Packet identity +@param dest Destination buffer +@param len Length of the destination buffer +@param cstr_info Codestream information structure +@param tileno Number of the tile encoded +@return +*/ +static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_codestream_info_t *cstr_info, int tileno); +/** +@param cblk +@param index +@param cblksty +@param first +*/ +static void t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first); +/** +Decode a packet of a tile from a source buffer +@param t2 T2 handle +@param src Source buffer +@param len Length of the source buffer +@param tile Tile for which to write the packets +@param tcp Tile coding parameters +@param pi Packet identity +@param pack_info Packet information +@return +*/ +static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, + opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info); + +/*@}*/ + +/*@}*/ + +/* ----------------------------------------------------------------------- */ + +/* #define RESTART 0x04 */ + +static void t2_putcommacode(opj_bio_t *bio, int n) { + while (--n >= 0) { + bio_write(bio, 1, 1); + } + bio_write(bio, 0, 1); +} + +static int t2_getcommacode(opj_bio_t *bio) { + int n; + for (n = 0; bio_read(bio, 1); n++) { + ; + } + return n; +} + +static void t2_putnumpasses(opj_bio_t *bio, int n) { + if (n == 1) { + bio_write(bio, 0, 1); + } else if (n == 2) { + bio_write(bio, 2, 2); + } else if (n <= 5) { + bio_write(bio, 0xc | (n - 3), 4); + } else if (n <= 36) { + bio_write(bio, 0x1e0 | (n - 6), 9); + } else if (n <= 164) { + bio_write(bio, 0xff80 | (n - 37), 16); + } +} + +static int t2_getnumpasses(opj_bio_t *bio) { + int n; + if (!bio_read(bio, 1)) + return 1; + if (!bio_read(bio, 1)) + return 2; + if ((n = bio_read(bio, 2)) != 3) + return (3 + n); + if ((n = bio_read(bio, 5)) != 31) + return (6 + n); + return (37 + bio_read(bio, 7)); +} + +static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int length, opj_codestream_info_t *cstr_info, int tileno) { + int bandno, cblkno; + unsigned char *c = dest; + + int compno = pi->compno; /* component value */ + int resno = pi->resno; /* resolution level value */ + int precno = pi->precno; /* precinct value */ + int layno = pi->layno; /* quality layer value */ + + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + opj_bio_t *bio = NULL; /* BIO component */ + + /* */ + if (tcp->csty & J2K_CP_CSTY_SOP) { + c[0] = 255; + c[1] = 145; + c[2] = 0; + c[3] = 4; + c[4] = (tile->packno % 65536) / 256; + c[5] = (tile->packno % 65536) % 256; + c += 6; + } + /* */ + + if (!layno) { + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + tgt_reset(prc->incltree); + tgt_reset(prc->imsbtree); + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + cblk->numpasses = 0; + tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps); + } + } + } + + bio = bio_create(); + bio_init_enc(bio, c, length); + bio_write(bio, 1, 1); /* Empty header bit */ + + /* Writing Packet header */ + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + opj_tcd_layer_t *layer = &cblk->layers[layno]; + if (!cblk->numpasses && layer->numpasses) { + tgt_setvalue(prc->incltree, cblkno, layno); + } + } + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + opj_tcd_layer_t *layer = &cblk->layers[layno]; + int increment = 0; + int nump = 0; + int len = 0, passno; + /* cblk inclusion bits */ + if (!cblk->numpasses) { + tgt_encode(bio, prc->incltree, cblkno, layno + 1); + } else { + bio_write(bio, layer->numpasses != 0, 1); + } + /* if cblk not included, go to the next cblk */ + if (!layer->numpasses) { + continue; + } + /* if first instance of cblk --> zero bit-planes information */ + if (!cblk->numpasses) { + cblk->numlenbits = 3; + tgt_encode(bio, prc->imsbtree, cblkno, 999); + } + /* number of coding passes included */ + t2_putnumpasses(bio, layer->numpasses); + + /* computation of the increase of the length indicator and insertion in the header */ + for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) { + opj_tcd_pass_t *pass = &cblk->passes[passno]; + nump++; + len += pass->len; + if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { + increment = int_max(increment, int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump))); + len = 0; + nump = 0; + } + } + t2_putcommacode(bio, increment); + + /* computation of the new Length indicator */ + cblk->numlenbits += increment; + + /* insertion of the codeword segment length */ + for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) { + opj_tcd_pass_t *pass = &cblk->passes[passno]; + nump++; + len += pass->len; + if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { + bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump)); + len = 0; + nump = 0; + } + } + } + } + + if (bio_flush(bio)) { + bio_destroy(bio); + return -999; /* modified to eliminate longjmp !! */ + } + + c += bio_numbytes(bio); + bio_destroy(bio); + + /* */ + if (tcp->csty & J2K_CP_CSTY_EPH) { + c[0] = 255; + c[1] = 146; + c += 2; + } + /* */ + + /* << INDEX */ + // End of packet header position. Currently only represents the distance to start of packet + // Will be updated later by incrementing with packet start value + if(cstr_info && cstr_info->index_write) { + opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno]; + info_PK->end_ph_pos = (int)(c - dest); + } + /* INDEX >> */ + + /* Writing the packet body */ + + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + opj_tcd_layer_t *layer = &cblk->layers[layno]; + if (!layer->numpasses) { + continue; + } + if (c + layer->len > dest + length) { + return -999; + } + + memcpy(c, layer->data, layer->len); + cblk->numpasses += layer->numpasses; + c += layer->len; + /* << INDEX */ + if(cstr_info && cstr_info->index_write) { + opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno]; + info_PK->disto += layer->disto; + if (cstr_info->D_max < info_PK->disto) { + cstr_info->D_max = info_PK->disto; + } + } + /* INDEX >> */ + } + } + + return (c - dest); +} + +static void t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first) { + opj_tcd_seg_t* seg; + cblk->segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, (index + 1) * sizeof(opj_tcd_seg_t)); + seg = &cblk->segs[index]; + seg->data = NULL; + seg->dataindex = 0; + seg->numpasses = 0; + seg->len = 0; + if (cblksty & J2K_CCP_CBLKSTY_TERMALL) { + seg->maxpasses = 1; + } + else if (cblksty & J2K_CCP_CBLKSTY_LAZY) { + if (first) { + seg->maxpasses = 10; + } else { + seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1; + } + } else { + seg->maxpasses = 109; + } +} + +static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, + opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info) { + int bandno, cblkno; + unsigned char *c = src; + + opj_cp_t *cp = t2->cp; + + int compno = pi->compno; /* component value */ + int resno = pi->resno; /* resolution level value */ + int precno = pi->precno; /* precinct value */ + int layno = pi->layno; /* quality layer value */ + + opj_tcd_resolution_t* res = &tile->comps[compno].resolutions[resno]; + + unsigned char *hd = NULL; + int present; + + opj_bio_t *bio = NULL; /* BIO component */ + + if (layno == 0) { + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; + + tgt_reset(prc->incltree); + tgt_reset(prc->imsbtree); + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; + cblk->numsegs = 0; + } + } + } + + /* SOP markers */ + + if (tcp->csty & J2K_CP_CSTY_SOP) { + if ((*c) != 0xff || (*(c + 1) != 0x91)) { + opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n"); + } else { + c += 6; + } + + /** TODO : check the Nsop value */ + } + + /* + When the marker PPT/PPM is used the packet header are store in PPT/PPM marker + This part deal with this caracteristic + step 1: Read packet header in the saved structure + step 2: Return to codestream for decoding + */ + + bio = bio_create(); + + if (cp->ppm == 1) { /* PPM */ + hd = cp->ppm_data; + bio_init_dec(bio, hd, cp->ppm_len); + } else if (tcp->ppt == 1) { /* PPT */ + hd = tcp->ppt_data; + bio_init_dec(bio, hd, tcp->ppt_len); + } else { /* Normal Case */ + hd = c; + bio_init_dec(bio, hd, src+len-hd); + } + + present = bio_read(bio, 1); + + if (!present) { + bio_inalign(bio); + hd += bio_numbytes(bio); + bio_destroy(bio); + + /* EPH markers */ + + if (tcp->csty & J2K_CP_CSTY_EPH) { + if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { + printf("Error : expected EPH marker\n"); + } else { + hd += 2; + } + } + + /* << INDEX */ + // End of packet header position. Currently only represents the distance to start of packet + // Will be updated later by incrementing with packet start value + if(pack_info) { + pack_info->end_ph_pos = (int)(c - src); + } + /* INDEX >> */ + + if (cp->ppm == 1) { /* PPM case */ + cp->ppm_len += cp->ppm_data-hd; + cp->ppm_data = hd; + return (c - src); + } + if (tcp->ppt == 1) { /* PPT case */ + tcp->ppt_len+=tcp->ppt_data-hd; + tcp->ppt_data = hd; + return (c - src); + } + + return (hd - src); + } + + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + int included, increment, n, segno; + opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; + /* if cblk not yet included before --> inclusion tagtree */ + if (!cblk->numsegs) { + included = tgt_decode(bio, prc->incltree, cblkno, layno + 1); + /* else one bit */ + } else { + included = bio_read(bio, 1); + } + /* if cblk not included */ + if (!included) { + cblk->numnewpasses = 0; + continue; + } + /* if cblk not yet included --> zero-bitplane tagtree */ + if (!cblk->numsegs) { + int i, numimsbs; + for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++) { + ; + } + numimsbs = i - 1; + cblk->numbps = band->numbps - numimsbs; + cblk->numlenbits = 3; + } + /* number of coding passes */ + cblk->numnewpasses = t2_getnumpasses(bio); + increment = t2_getcommacode(bio); + /* length indicator increment */ + cblk->numlenbits += increment; + segno = 0; + if (!cblk->numsegs) { + t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 1); + } else { + segno = cblk->numsegs - 1; + if (cblk->segs[segno].numpasses == cblk->segs[segno].maxpasses) { + ++segno; + t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0); + } + } + n = cblk->numnewpasses; + + do { + cblk->segs[segno].numnewpasses = int_min(cblk->segs[segno].maxpasses - cblk->segs[segno].numpasses, n); + cblk->segs[segno].newlen = bio_read(bio, cblk->numlenbits + int_floorlog2(cblk->segs[segno].numnewpasses)); + n -= cblk->segs[segno].numnewpasses; + if (n > 0) { + ++segno; + t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0); + } + } while (n > 0); + } + } + + if (bio_inalign(bio)) { + bio_destroy(bio); + return -999; + } + + hd += bio_numbytes(bio); + bio_destroy(bio); + + /* EPH markers */ + if (tcp->csty & J2K_CP_CSTY_EPH) { + if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { + opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n"); + return -999; + } else { + hd += 2; + } + } + + /* << INDEX */ + // End of packet header position. Currently only represents the distance to start of packet + // Will be updated later by incrementing with packet start value + if(pack_info) { + pack_info->end_ph_pos = (int)(hd - src); + } + /* INDEX >> */ + + if (cp->ppm==1) { + cp->ppm_len+=cp->ppm_data-hd; + cp->ppm_data = hd; + } else if (tcp->ppt == 1) { + tcp->ppt_len+=tcp->ppt_data-hd; + tcp->ppt_data = hd; + } else { + c=hd; + } + + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; + opj_tcd_seg_t *seg = NULL; + if (!cblk->numnewpasses) + continue; + if (!cblk->numsegs) { + seg = &cblk->segs[0]; + cblk->numsegs++; + cblk->len = 0; + } else { + seg = &cblk->segs[cblk->numsegs - 1]; + if (seg->numpasses == seg->maxpasses) { + seg++; + cblk->numsegs++; + } + } + + do { + if (c + seg->newlen > src + len) { + return -999; + } + +#ifdef USE_JPWL + /* we need here a j2k handle to verify if making a check to + the validity of cblocks parameters is selected from user (-W) */ + + /* let's check that we are not exceeding */ + if ((cblk->len + seg->newlen) > 8192) { + opj_event_msg(t2->cinfo, EVT_WARNING, + "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n", + seg->newlen, cblkno, precno, bandno, resno, compno); + if (!JPWL_ASSUME) { + opj_event_msg(t2->cinfo, EVT_ERROR, "JPWL: giving up\n"); + return -999; + } + seg->newlen = 8192 - cblk->len; + opj_event_msg(t2->cinfo, EVT_WARNING, " - truncating segment to %d\n", seg->newlen); + break; + }; + +#endif /* USE_JPWL */ + + cblk->data = (unsigned char*) opj_realloc(cblk->data, (cblk->len + seg->newlen) * sizeof(unsigned char*)); + memcpy(cblk->data + cblk->len, c, seg->newlen); + if (seg->numpasses == 0) { + seg->data = &cblk->data; + seg->dataindex = cblk->len; + } + c += seg->newlen; + cblk->len += seg->newlen; + seg->len += seg->newlen; + seg->numpasses += seg->numnewpasses; + cblk->numnewpasses -= seg->numnewpasses; + if (cblk->numnewpasses > 0) { + seg++; + cblk->numsegs++; + } + } while (cblk->numnewpasses > 0); + } + } + + return (c - src); +} + +/* ----------------------------------------------------------------------- */ + +int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino, J2K_T2_MODE t2_mode, int cur_totnum_tp){ + unsigned char *c = dest; + int e = 0; + int compno; + opj_pi_iterator_t *pi = NULL; + int poc; + opj_image_t *image = t2->image; + opj_cp_t *cp = t2->cp; + opj_tcp_t *tcp = &cp->tcps[tileno]; + int pocno = cp->cinema == CINEMA4K_24? 2: 1; + int maxcomp = cp->max_comp_size > 0 ? image->numcomps : 1; + + pi = pi_initialise_encode(image, cp, tileno, t2_mode); + if(!pi) { + /* TODO: throw an error */ + return -999; + } + + if(t2_mode == THRESH_CALC ){ /* Calculating threshold */ + for(compno = 0; compno < maxcomp; compno++ ){ + for(poc = 0; poc < pocno ; poc++){ + int comp_len = 0; + int tpnum = compno; + if (pi_create_encode(pi, cp,tileno,poc,tpnum,tppos,t2_mode,cur_totnum_tp)) { + opj_event_msg(t2->cinfo, EVT_ERROR, "Error initializing Packet Iterator\n"); + pi_destroy(pi, cp, tileno); + return -999; + } + while (pi_next(&pi[poc])) { + if (pi[poc].layno < maxlayers) { + e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c, cstr_info, tileno); + comp_len = comp_len + e; + if (e == -999) { + break; + } else { + c += e; + } + } + } + if (e == -999) break; + if (cp->max_comp_size){ + if (comp_len > cp->max_comp_size){ + e = -999; + break; + } + } + } + if (e == -999) break; + } + }else{ /* t2_mode == FINAL_PASS */ + pi_create_encode(pi, cp,tileno,pino,tpnum,tppos,t2_mode,cur_totnum_tp); + while (pi_next(&pi[pino])) { + if (pi[pino].layno < maxlayers) { + e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c, cstr_info, tileno); + if (e == -999) { + break; + } else { + c += e; + } + /* INDEX >> */ + if(cstr_info) { + if(cstr_info->index_write) { + opj_tile_info_t *info_TL = &cstr_info->tile[tileno]; + opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno]; + if (!cstr_info->packno) { + info_PK->start_pos = info_TL->end_header + 1; + } else { + info_PK->start_pos = ((cp->tp_on | tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1; + } + info_PK->end_pos = info_PK->start_pos + e - 1; + info_PK->end_ph_pos += info_PK->start_pos - 1; // End of packet header which now only represents the distance + // to start of packet is incremented by value of start of packet + } + + cstr_info->packno++; + } + /* << INDEX */ + tile->packno++; + } + } + } + + pi_destroy(pi, cp, tileno); + + if (e == -999) { + return e; + } + + return (c - dest); +} + +int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info) { + unsigned char *c = src; + opj_pi_iterator_t *pi; + int pino, e = 0; + int n = 0, curtp = 0; + int tp_start_packno; + + opj_image_t *image = t2->image; + opj_cp_t *cp = t2->cp; + + /* create a packet iterator */ + pi = pi_create_decode(image, cp, tileno); + if(!pi) { + /* TODO: throw an error */ + return -999; + } + + tp_start_packno = 0; + + for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) { + while (pi_next(&pi[pino])) { + if ((cp->layer==0) || (cp->layer>=((pi[pino].layno)+1))) { + opj_packet_info_t *pack_info; + if (cstr_info) + pack_info = &cstr_info->tile[tileno].packet[cstr_info->packno]; + else + pack_info = NULL; + e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino], pack_info); + } else { + e = 0; + } + if(e == -999) return -999; + /* progression in resolution */ + image->comps[pi[pino].compno].resno_decoded = + (e > 0) ? + int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded) + : image->comps[pi[pino].compno].resno_decoded; + n++; + + /* INDEX >> */ + if(cstr_info) { + opj_tile_info_t *info_TL = &cstr_info->tile[tileno]; + opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno]; + if (!cstr_info->packno) { + info_PK->start_pos = info_TL->end_header + 1; + } else if (info_TL->packet[cstr_info->packno-1].end_pos >= (int)cstr_info->tile[tileno].tp[curtp].tp_end_pos){ // New tile part + info_TL->tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; // Number of packets in previous tile-part + tp_start_packno = cstr_info->packno; + curtp++; + info_PK->start_pos = cstr_info->tile[tileno].tp[curtp].tp_end_header+1; + } else { + info_PK->start_pos = (cp->tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1; + } + info_PK->end_pos = info_PK->start_pos + e - 1; + info_PK->end_ph_pos += info_PK->start_pos - 1; // End of packet header which now only represents the distance + // to start of packet is incremented by value of start of packet + cstr_info->packno++; + } + /* << INDEX */ + + if (e == -999) { /* ADD */ + break; + } else { + c += e; + } + } + } + /* INDEX >> */ + if(cstr_info) { + cstr_info->tile[tileno].tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; // Number of packets in last tile-part + } + /* << INDEX */ + + /* don't forget to release pi */ + pi_destroy(pi, cp, tileno); + + if (e == -999) { + return e; + } + + return (c - src); +} + +/* ----------------------------------------------------------------------- */ + +opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp) { + /* create the tcd structure */ + opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t)); + if(!t2) return NULL; + t2->cinfo = cinfo; + t2->image = image; + t2->cp = cp; + + return t2; +} + +void t2_destroy(opj_t2_t *t2) { + if(t2) { + opj_free(t2); + } +} + + + + + diff --git a/contrib/media/updf_newlib/libopenjpeg/t2.h b/contrib/media/updf_newlib/libopenjpeg/t2.h new file mode 100755 index 000000000..2151ba67f --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/t2.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __T2_H +#define __T2_H +/** +@file t2.h +@brief Implementation of a tier-2 coding (packetization of code-block data) (T2) + +*/ + +/** @defgroup T2 T2 - Implementation of a tier-2 coding */ +/*@{*/ + +/** +Tier-2 coding +*/ +typedef struct opj_t2 { + /** codec context */ + opj_common_ptr cinfo; + + /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */ + opj_image_t *image; + /** pointer to the image coding parameters */ + opj_cp_t *cp; +} opj_t2_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ + +/** +Encode the packets of a tile to a destination buffer +@param t2 T2 handle +@param tileno number of the tile encoded +@param tile the tile for which to write the packets +@param maxlayers maximum number of layers +@param dest the destination buffer +@param len the length of the destination buffer +@param cstr_info Codestream information structure +@param tpnum Tile part number of the current tile +@param tppos The position of the tile part flag in the progression order +@param pino +@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass +@param cur_totnum_tp The total number of tile parts in the current tile +*/ +int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino,J2K_T2_MODE t2_mode,int cur_totnum_tp); +/** +Decode the packets of a tile from a source buffer +@param t2 T2 handle +@param src the source buffer +@param len length of the source buffer +@param tileno number that identifies the tile for which to decode the packets +@param tile tile for which to decode the packets +@param cstr_info Codestream information structure + */ +int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info); + +/** +Create a T2 handle +@param cinfo Codec context info +@param image Source or destination image +@param cp Image coding parameters +@return Returns a new T2 handle if successful, returns NULL otherwise +*/ +opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp); +/** +Destroy a T2 handle +@param t2 T2 handle to destroy +*/ +void t2_destroy(opj_t2_t *t2); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __T2_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/tcd.c b/contrib/media/updf_newlib/libopenjpeg/tcd.c new file mode 100755 index 000000000..7f154f4b0 --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/tcd.c @@ -0,0 +1,1516 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2006-2007, Parvatha Elangovan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) { + int tileno, compno, resno, bandno, precno;//, cblkno; + + fprintf(fd, "image {\n"); + fprintf(fd, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", + img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1); + + for (tileno = 0; tileno < img->th * img->tw; tileno++) { + opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno]; + fprintf(fd, " tile {\n"); + fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n", + tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps); + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + fprintf(fd, " tilec {\n"); + fprintf(fd, + " x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n", + tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions); + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + fprintf(fd, "\n res {\n"); + fprintf(fd, + " x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n", + res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands); + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + fprintf(fd, " band {\n"); + fprintf(fd, + " x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n", + band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps); + for (precno = 0; precno < res->pw * res->ph; precno++) { + opj_tcd_precinct_t *prec = &band->precincts[precno]; + fprintf(fd, " prec {\n"); + fprintf(fd, + " x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n", + prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch); + /* + for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) { + opj_tcd_cblk_t *cblk = &prec->cblks[cblkno]; + fprintf(fd, " cblk {\n"); + fprintf(fd, + " x0=%d, y0=%d, x1=%d, y1=%d\n", + cblk->x0, cblk->y0, cblk->x1, cblk->y1); + fprintf(fd, " }\n"); + } + */ + fprintf(fd, " }\n"); + } + fprintf(fd, " }\n"); + } + fprintf(fd, " }\n"); + } + fprintf(fd, " }\n"); + } + fprintf(fd, " }\n"); + } + fprintf(fd, "}\n"); +} + +/* ----------------------------------------------------------------------- */ + +/** +Create a new TCD handle +*/ +opj_tcd_t* tcd_create(opj_common_ptr cinfo) { + /* create the tcd structure */ + opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t)); + if(!tcd) return NULL; + tcd->cinfo = cinfo; + tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t)); + if(!tcd->tcd_image) { + opj_free(tcd); + return NULL; + } + + return tcd; +} + +/** +Destroy a previously created TCD handle +*/ +void tcd_destroy(opj_tcd_t *tcd) { + if(tcd) { + opj_free(tcd->tcd_image); + opj_free(tcd); + } +} + +/* ----------------------------------------------------------------------- */ + +void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) { + int tileno, compno, resno, bandno, precno, cblkno; + + tcd->image = image; + tcd->cp = cp; + tcd->tcd_image->tw = cp->tw; + tcd->tcd_image->th = cp->th; + tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t)); + + for (tileno = 0; tileno < 1; tileno++) { + opj_tcp_t *tcp = &cp->tcps[curtileno]; + int j; + + /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + int p = curtileno % cp->tw; /* si numerotation matricielle .. */ + int q = curtileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ + + /* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */ + opj_tcd_tile_t *tile = tcd->tcd_image->tiles; + + /* 4 borders of the tile rescale on the image if necessary */ + tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); + tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); + tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); + tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); + tile->numcomps = image->numcomps; + /* tile->PPT=image->PPT; */ + + /* Modification of the RATE >> */ + for (j = 0; j < tcp->numlayers; j++) { + tcp->rates[j] = tcp->rates[j] ? + cp->tp_on ? + (((float) (tile->numcomps + * (tile->x1 - tile->x0) + * (tile->y1 - tile->y0) + * image->comps[0].prec)) + /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers) + : + ((float) (tile->numcomps + * (tile->x1 - tile->x0) + * (tile->y1 - tile->y0) + * image->comps[0].prec))/ + (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) + : 0; + + if (tcp->rates[j]) { + if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { + tcp->rates[j] = tcp->rates[j - 1] + 20; + } else { + if (!j && tcp->rates[j] < 30) + tcp->rates[j] = 30; + } + + if(j == (tcp->numlayers-1)){ + tcp->rates[j] = tcp->rates[j]- 2; + } + } + } + /* << Modification of the RATE */ + + tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t)); + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tccp_t *tccp = &tcp->tccps[compno]; + + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + + /* border of each tile component (global) */ + tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); + tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); + tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); + tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); + + tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); + tilec->numresolutions = tccp->numresolutions; + + tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t)); + + for (resno = 0; resno < tilec->numresolutions; resno++) { + int pdx, pdy; + int levelno = tilec->numresolutions - 1 - resno; + int tlprcxstart, tlprcystart, brprcxend, brprcyend; + int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; + int cbgwidthexpn, cbgheightexpn; + int cblkwidthexpn, cblkheightexpn; + + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + /* border for each resolution level (global) */ + res->x0 = int_ceildivpow2(tilec->x0, levelno); + res->y0 = int_ceildivpow2(tilec->y0, levelno); + res->x1 = int_ceildivpow2(tilec->x1, levelno); + res->y1 = int_ceildivpow2(tilec->y1, levelno); + + res->numbands = resno == 0 ? 1 : 3; + /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ + if (tccp->csty & J2K_CCP_CSTY_PRT) { + pdx = tccp->prcw[resno]; + pdy = tccp->prch[resno]; + } else { + pdx = 15; + pdy = 15; + } + /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; + tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; + + brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; + brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; + + res->pw = (brprcxend - tlprcxstart) >> pdx; + res->ph = (brprcyend - tlprcystart) >> pdy; + + if (resno == 0) { + tlcbgxstart = tlprcxstart; + tlcbgystart = tlprcystart; + brcbgxend = brprcxend; + brcbgyend = brprcyend; + cbgwidthexpn = pdx; + cbgheightexpn = pdy; + } else { + tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); + tlcbgystart = int_ceildivpow2(tlprcystart, 1); + brcbgxend = int_ceildivpow2(brprcxend, 1); + brcbgyend = int_ceildivpow2(brprcyend, 1); + cbgwidthexpn = pdx - 1; + cbgheightexpn = pdy - 1; + } + + cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); + cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); + + for (bandno = 0; bandno < res->numbands; bandno++) { + int x0b, y0b, i; + int gain, numbps; + opj_stepsize_t *ss = NULL; + + opj_tcd_band_t *band = &res->bands[bandno]; + + band->bandno = resno == 0 ? 0 : bandno + 1; + x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; + y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; + + if (band->bandno == 0) { + /* band border (global) */ + band->x0 = int_ceildivpow2(tilec->x0, levelno); + band->y0 = int_ceildivpow2(tilec->y0, levelno); + band->x1 = int_ceildivpow2(tilec->x1, levelno); + band->y1 = int_ceildivpow2(tilec->y1, levelno); + } else { + /* band border (global) */ + band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); + band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); + band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); + band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); + } + + ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; + gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); + numbps = image->comps[compno].prec + gain; + + band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); + band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ + + band->precincts = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph * sizeof(opj_tcd_precinct_t)); + + for (i = 0; i < res->pw * res->ph * 3; i++) { + band->precincts[i].imsbtree = NULL; + band->precincts[i].incltree = NULL; + } + + for (precno = 0; precno < res->pw * res->ph; precno++) { + int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; + + int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); + int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); + int cbgxend = cbgxstart + (1 << cbgwidthexpn); + int cbgyend = cbgystart + (1 << cbgheightexpn); + + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + /* precinct size (global) */ + prc->x0 = int_max(cbgxstart, band->x0); + prc->y0 = int_max(cbgystart, band->y0); + prc->x1 = int_min(cbgxend, band->x1); + prc->y1 = int_min(cbgyend, band->y1); + + tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; + tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; + brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; + brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; + prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; + prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; + + prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc((prc->cw * prc->ch), sizeof(opj_tcd_cblk_enc_t)); + prc->incltree = tgt_create(prc->cw, prc->ch); + prc->imsbtree = tgt_create(prc->cw, prc->ch); + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); + int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); + int cblkxend = cblkxstart + (1 << cblkwidthexpn); + int cblkyend = cblkystart + (1 << cblkheightexpn); + + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + + /* code-block size (global) */ + cblk->x0 = int_max(cblkxstart, prc->x0); + cblk->y0 = int_max(cblkystart, prc->y0); + cblk->x1 = int_min(cblkxend, prc->x1); + cblk->y1 = int_min(cblkyend, prc->y1); + cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char)); + /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */ + cblk->data += 2; + cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t)); + cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t)); + } + } + } + } + } + } + + /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ +} + +void tcd_free_encode(opj_tcd_t *tcd) { + int tileno, compno, resno, bandno, precno, cblkno; + + for (tileno = 0; tileno < 1; tileno++) { + opj_tcd_tile_t *tile = tcd->tcd_image->tiles; + + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + + for (precno = 0; precno < res->pw * res->ph; precno++) { + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + if (prc->incltree != NULL) { + tgt_destroy(prc->incltree); + prc->incltree = NULL; + } + if (prc->imsbtree != NULL) { + tgt_destroy(prc->imsbtree); + prc->imsbtree = NULL; + } + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_free(prc->cblks.enc[cblkno].data - 2); + opj_free(prc->cblks.enc[cblkno].layers); + opj_free(prc->cblks.enc[cblkno].passes); + } + opj_free(prc->cblks.enc); + } /* for (precno */ + opj_free(band->precincts); + band->precincts = NULL; + } /* for (bandno */ + } /* for (resno */ + opj_free(tilec->resolutions); + tilec->resolutions = NULL; + } /* for (compno */ + opj_free(tile->comps); + tile->comps = NULL; + } /* for (tileno */ + opj_free(tcd->tcd_image->tiles); + tcd->tcd_image->tiles = NULL; +} + +void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) { + int tileno, compno, resno, bandno, precno, cblkno; + + for (tileno = 0; tileno < 1; tileno++) { + opj_tcp_t *tcp = &cp->tcps[curtileno]; + int j; + /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + int p = curtileno % cp->tw; + int q = curtileno / cp->tw; + + opj_tcd_tile_t *tile = tcd->tcd_image->tiles; + + /* 4 borders of the tile rescale on the image if necessary */ + tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); + tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); + tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); + tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); + + tile->numcomps = image->numcomps; + /* tile->PPT=image->PPT; */ + + /* Modification of the RATE >> */ + for (j = 0; j < tcp->numlayers; j++) { + tcp->rates[j] = tcp->rates[j] ? + cp->tp_on ? + (((float) (tile->numcomps + * (tile->x1 - tile->x0) + * (tile->y1 - tile->y0) + * image->comps[0].prec)) + /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers) + : + ((float) (tile->numcomps + * (tile->x1 - tile->x0) + * (tile->y1 - tile->y0) + * image->comps[0].prec))/ + (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) + : 0; + + if (tcp->rates[j]) { + if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { + tcp->rates[j] = tcp->rates[j - 1] + 20; + } else { + if (!j && tcp->rates[j] < 30) + tcp->rates[j] = 30; + } + } + } + /* << Modification of the RATE */ + + /* tile->comps=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */ + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tccp_t *tccp = &tcp->tccps[compno]; + + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + + /* border of each tile component (global) */ + tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); + tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); + tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); + tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); + + tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); + tilec->numresolutions = tccp->numresolutions; + /* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */ + for (resno = 0; resno < tilec->numresolutions; resno++) { + int pdx, pdy; + + int levelno = tilec->numresolutions - 1 - resno; + int tlprcxstart, tlprcystart, brprcxend, brprcyend; + int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; + int cbgwidthexpn, cbgheightexpn; + int cblkwidthexpn, cblkheightexpn; + + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + /* border for each resolution level (global) */ + res->x0 = int_ceildivpow2(tilec->x0, levelno); + res->y0 = int_ceildivpow2(tilec->y0, levelno); + res->x1 = int_ceildivpow2(tilec->x1, levelno); + res->y1 = int_ceildivpow2(tilec->y1, levelno); + res->numbands = resno == 0 ? 1 : 3; + + /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ + if (tccp->csty & J2K_CCP_CSTY_PRT) { + pdx = tccp->prcw[resno]; + pdy = tccp->prch[resno]; + } else { + pdx = 15; + pdy = 15; + } + /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; + tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; + brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; + brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; + + res->pw = (brprcxend - tlprcxstart) >> pdx; + res->ph = (brprcyend - tlprcystart) >> pdy; + + if (resno == 0) { + tlcbgxstart = tlprcxstart; + tlcbgystart = tlprcystart; + brcbgxend = brprcxend; + brcbgyend = brprcyend; + cbgwidthexpn = pdx; + cbgheightexpn = pdy; + } else { + tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); + tlcbgystart = int_ceildivpow2(tlprcystart, 1); + brcbgxend = int_ceildivpow2(brprcxend, 1); + brcbgyend = int_ceildivpow2(brprcyend, 1); + cbgwidthexpn = pdx - 1; + cbgheightexpn = pdy - 1; + } + + cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); + cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); + + for (bandno = 0; bandno < res->numbands; bandno++) { + int x0b, y0b; + int gain, numbps; + opj_stepsize_t *ss = NULL; + + opj_tcd_band_t *band = &res->bands[bandno]; + + band->bandno = resno == 0 ? 0 : bandno + 1; + x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; + y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; + + if (band->bandno == 0) { + /* band border */ + band->x0 = int_ceildivpow2(tilec->x0, levelno); + band->y0 = int_ceildivpow2(tilec->y0, levelno); + band->x1 = int_ceildivpow2(tilec->x1, levelno); + band->y1 = int_ceildivpow2(tilec->y1, levelno); + } else { + band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); + band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); + band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); + band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); + } + + ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; + gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); + numbps = image->comps[compno].prec + gain; + band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); + band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ + + for (precno = 0; precno < res->pw * res->ph; precno++) { + int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; + + int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); + int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); + int cbgxend = cbgxstart + (1 << cbgwidthexpn); + int cbgyend = cbgystart + (1 << cbgheightexpn); + + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + /* precinct size (global) */ + prc->x0 = int_max(cbgxstart, band->x0); + prc->y0 = int_max(cbgystart, band->y0); + prc->x1 = int_min(cbgxend, band->x1); + prc->y1 = int_min(cbgyend, band->y1); + + tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; + tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; + brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; + brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; + prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; + prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; + + opj_free(prc->cblks.enc); + prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc(prc->cw * prc->ch, sizeof(opj_tcd_cblk_enc_t)); + + if (prc->incltree != NULL) { + tgt_destroy(prc->incltree); + } + if (prc->imsbtree != NULL) { + tgt_destroy(prc->imsbtree); + } + + prc->incltree = tgt_create(prc->cw, prc->ch); + prc->imsbtree = tgt_create(prc->cw, prc->ch); + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); + int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); + int cblkxend = cblkxstart + (1 << cblkwidthexpn); + int cblkyend = cblkystart + (1 << cblkheightexpn); + + opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; + + /* code-block size (global) */ + cblk->x0 = int_max(cblkxstart, prc->x0); + cblk->y0 = int_max(cblkystart, prc->y0); + cblk->x1 = int_min(cblkxend, prc->x1); + cblk->y1 = int_min(cblkyend, prc->y1); + cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char)); + /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */ + cblk->data += 2; + cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t)); + cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t)); + } + } /* precno */ + } /* bandno */ + } /* resno */ + } /* compno */ + } /* tileno */ + + /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ +} + +void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) { + int i, j, tileno, p, q; + unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h; + + tcd->image = image; + tcd->tcd_image->tw = cp->tw; + tcd->tcd_image->th = cp->th; + tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tcd_tile_t)); + + /* + Allocate place to store the decoded data = final image + Place limited by the tile really present in the codestream + */ + + for (j = 0; j < cp->tileno_size; j++) { + opj_tcd_tile_t *tile; + + tileno = cp->tileno[j]; + tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); + tile->numcomps = image->numcomps; + tile->comps = (opj_tcd_tilecomp_t*) opj_calloc(image->numcomps, sizeof(opj_tcd_tilecomp_t)); + } + + for (i = 0; i < image->numcomps; i++) { + for (j = 0; j < cp->tileno_size; j++) { + opj_tcd_tile_t *tile; + opj_tcd_tilecomp_t *tilec; + + /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + + tileno = cp->tileno[j]; + + tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); + tilec = &tile->comps[i]; + + p = tileno % cp->tw; /* si numerotation matricielle .. */ + q = tileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ + + /* 4 borders of the tile rescale on the image if necessary */ + tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); + tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); + tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); + tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); + + tilec->x0 = int_ceildiv(tile->x0, image->comps[i].dx); + tilec->y0 = int_ceildiv(tile->y0, image->comps[i].dy); + tilec->x1 = int_ceildiv(tile->x1, image->comps[i].dx); + tilec->y1 = int_ceildiv(tile->y1, image->comps[i].dy); + + x0 = j == 0 ? tilec->x0 : int_min(x0, (unsigned int) tilec->x0); + y0 = j == 0 ? tilec->y0 : int_min(y0, (unsigned int) tilec->x0); + x1 = j == 0 ? tilec->x1 : int_max(x1, (unsigned int) tilec->x1); + y1 = j == 0 ? tilec->y1 : int_max(y1, (unsigned int) tilec->y1); + } + + w = int_ceildivpow2(x1 - x0, image->comps[i].factor); + h = int_ceildivpow2(y1 - y0, image->comps[i].factor); + + image->comps[i].w = w; + image->comps[i].h = h; + image->comps[i].x0 = x0; + image->comps[i].y0 = y0; + } +} + +void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info) { + int compno, resno, bandno, precno, cblkno; + opj_tcp_t *tcp; + opj_tcd_tile_t *tile; + + tcd->cp = cp; + + tcp = &(cp->tcps[cp->tileno[tileno]]); + tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); + + tileno = cp->tileno[tileno]; + + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + + /* border of each tile component (global) */ + tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); + tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); + tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); + tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); + + tilec->numresolutions = tccp->numresolutions; + tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t)); + + for (resno = 0; resno < tilec->numresolutions; resno++) { + int pdx, pdy; + int levelno = tilec->numresolutions - 1 - resno; + int tlprcxstart, tlprcystart, brprcxend, brprcyend; + int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; + int cbgwidthexpn, cbgheightexpn; + int cblkwidthexpn, cblkheightexpn; + + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + /* border for each resolution level (global) */ + res->x0 = int_ceildivpow2(tilec->x0, levelno); + res->y0 = int_ceildivpow2(tilec->y0, levelno); + res->x1 = int_ceildivpow2(tilec->x1, levelno); + res->y1 = int_ceildivpow2(tilec->y1, levelno); + res->numbands = resno == 0 ? 1 : 3; + + /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ + if (tccp->csty & J2K_CCP_CSTY_PRT) { + pdx = tccp->prcw[resno]; + pdy = tccp->prch[resno]; + } else { + pdx = 15; + pdy = 15; + } + + /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ + tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; + tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; + brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; + brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; + + res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx); + res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy); + + if (resno == 0) { + tlcbgxstart = tlprcxstart; + tlcbgystart = tlprcystart; + brcbgxend = brprcxend; + brcbgyend = brprcyend; + cbgwidthexpn = pdx; + cbgheightexpn = pdy; + } else { + tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); + tlcbgystart = int_ceildivpow2(tlprcystart, 1); + brcbgxend = int_ceildivpow2(brprcxend, 1); + brcbgyend = int_ceildivpow2(brprcyend, 1); + cbgwidthexpn = pdx - 1; + cbgheightexpn = pdy - 1; + } + + cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); + cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); + + for (bandno = 0; bandno < res->numbands; bandno++) { + int x0b, y0b; + int gain, numbps; + opj_stepsize_t *ss = NULL; + + opj_tcd_band_t *band = &res->bands[bandno]; + band->bandno = resno == 0 ? 0 : bandno + 1; + x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; + y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; + + if (band->bandno == 0) { + /* band border (global) */ + band->x0 = int_ceildivpow2(tilec->x0, levelno); + band->y0 = int_ceildivpow2(tilec->y0, levelno); + band->x1 = int_ceildivpow2(tilec->x1, levelno); + band->y1 = int_ceildivpow2(tilec->y1, levelno); + } else { + /* band border (global) */ + band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); + band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); + band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); + band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); + } + + ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; + gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); + numbps = image->comps[compno].prec + gain; + band->stepsize = (float)(((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)) * 0.5); + band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ + + band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof(opj_tcd_precinct_t)); + + for (precno = 0; precno < res->pw * res->ph; precno++) { + int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; + int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); + int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); + int cbgxend = cbgxstart + (1 << cbgwidthexpn); + int cbgyend = cbgystart + (1 << cbgheightexpn); + + opj_tcd_precinct_t *prc = &band->precincts[precno]; + /* precinct size (global) */ + prc->x0 = int_max(cbgxstart, band->x0); + prc->y0 = int_max(cbgystart, band->y0); + prc->x1 = int_min(cbgxend, band->x1); + prc->y1 = int_min(cbgyend, band->y1); + + tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; + tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; + brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; + brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; + prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; + prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; + + prc->cblks.dec = (opj_tcd_cblk_dec_t*) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_dec_t)); + + prc->incltree = tgt_create(prc->cw, prc->ch); + prc->imsbtree = tgt_create(prc->cw, prc->ch); + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); + int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); + int cblkxend = cblkxstart + (1 << cblkwidthexpn); + int cblkyend = cblkystart + (1 << cblkheightexpn); + + opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; + cblk->data = NULL; + cblk->segs = NULL; + /* code-block size (global) */ + cblk->x0 = int_max(cblkxstart, prc->x0); + cblk->y0 = int_max(cblkystart, prc->y0); + cblk->x1 = int_min(cblkxend, prc->x1); + cblk->y1 = int_min(cblkyend, prc->y1); + cblk->numsegs = 0; + } + } /* precno */ + } /* bandno */ + } /* resno */ + } /* compno */ + /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ +} + +void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final) { + int compno, resno, bandno, precno, cblkno; + int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */ + int matrice[10][10][3]; + int i, j, k; + + opj_cp_t *cp = tcd->cp; + opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; + opj_tcp_t *tcd_tcp = tcd->tcp; + + /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */ + + for (compno = 0; compno < tcd_tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; + for (i = 0; i < tcd_tcp->numlayers; i++) { + for (j = 0; j < tilec->numresolutions; j++) { + for (k = 0; k < 3; k++) { + matrice[i][j][k] = + (int) (cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k] + * (float) (tcd->image->comps[compno].prec / 16.0)); + } + } + } + + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + for (precno = 0; precno < res->pw * res->ph; precno++) { + opj_tcd_precinct_t *prc = &band->precincts[precno]; + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; + opj_tcd_layer_t *layer = &cblk->layers[layno]; + int n; + int imsb = tcd->image->comps[compno].prec - cblk->numbps; /* number of bit-plan equal to zero */ + /* Correction of the matrix of coefficient to include the IMSB information */ + if (layno == 0) { + value = matrice[layno][resno][bandno]; + if (imsb >= value) { + value = 0; + } else { + value -= imsb; + } + } else { + value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno]; + if (imsb >= matrice[layno - 1][resno][bandno]) { + value -= (imsb - matrice[layno - 1][resno][bandno]); + if (value < 0) { + value = 0; + } + } + } + + if (layno == 0) { + cblk->numpassesinlayers = 0; + } + + n = cblk->numpassesinlayers; + if (cblk->numpassesinlayers == 0) { + if (value != 0) { + n = 3 * value - 2 + cblk->numpassesinlayers; + } else { + n = cblk->numpassesinlayers; + } + } else { + n = 3 * value + cblk->numpassesinlayers; + } + + layer->numpasses = n - cblk->numpassesinlayers; + + if (!layer->numpasses) + continue; + + if (cblk->numpassesinlayers == 0) { + layer->len = cblk->passes[n - 1].rate; + layer->data = cblk->data; + } else { + layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate; + layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; + } + if (final) + cblk->numpassesinlayers = n; + } + } + } + } + } +} + +void tcd_rateallocate_fixed(opj_tcd_t *tcd) { + int layno; + for (layno = 0; layno < tcd->tcp->numlayers; layno++) { + tcd_makelayer_fixed(tcd, layno, 1); + } +} + +void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) { + int compno, resno, bandno, precno, cblkno, passno; + + opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; + + tcd_tile->distolayer[layno] = 0; /* fixed_quality */ + + for (compno = 0; compno < tcd_tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + for (precno = 0; precno < res->pw * res->ph; precno++) { + opj_tcd_precinct_t *prc = &band->precincts[precno]; + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; + opj_tcd_layer_t *layer = &cblk->layers[layno]; + + int n; + if (layno == 0) { + cblk->numpassesinlayers = 0; + } + n = cblk->numpassesinlayers; + for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) { + int dr; + double dd; + opj_tcd_pass_t *pass = &cblk->passes[passno]; + if (n == 0) { + dr = pass->rate; + dd = pass->distortiondec; + } else { + dr = pass->rate - cblk->passes[n - 1].rate; + dd = pass->distortiondec - cblk->passes[n - 1].distortiondec; + } + if (!dr) { + if (dd != 0) + n = passno + 1; + continue; + } + if (dd / dr >= thresh) + n = passno + 1; + } + layer->numpasses = n - cblk->numpassesinlayers; + + if (!layer->numpasses) { + layer->disto = 0; + continue; + } + if (cblk->numpassesinlayers == 0) { + layer->len = cblk->passes[n - 1].rate; + layer->data = cblk->data; + layer->disto = cblk->passes[n - 1].distortiondec; + } else { + layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate; + layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; + layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec; + } + + tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */ + + if (final) + cblk->numpassesinlayers = n; + } + } + } + } + } +} + +bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) { + int compno, resno, bandno, precno, cblkno, passno, layno; + double min, max; + double cumdisto[100]; /* fixed_quality */ + const double K = 1; /* 1.1; fixed_quality */ + double maxSE = 0; + + opj_cp_t *cp = tcd->cp; + opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; + opj_tcp_t *tcd_tcp = tcd->tcp; + + min = DBL_MAX; + max = 0; + + tcd_tile->numpix = 0; /* fixed_quality */ + + for (compno = 0; compno < tcd_tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; + tilec->numpix = 0; + + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + + for (precno = 0; precno < res->pw * res->ph; precno++) { + opj_tcd_precinct_t *prc = &band->precincts[precno]; + + for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { + opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; + + for (passno = 0; passno < cblk->totalpasses; passno++) { + opj_tcd_pass_t *pass = &cblk->passes[passno]; + int dr; + double dd, rdslope; + if (passno == 0) { + dr = pass->rate; + dd = pass->distortiondec; + } else { + dr = pass->rate - cblk->passes[passno - 1].rate; + dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec; + } + if (dr == 0) { + continue; + } + rdslope = dd / dr; + if (rdslope < min) { + min = rdslope; + } + if (rdslope > max) { + max = rdslope; + } + } /* passno */ + + /* fixed_quality */ + tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); + tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); + } /* cbklno */ + } /* precno */ + } /* bandno */ + } /* resno */ + + maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0) + * ((double)(1 << tcd->image->comps[compno].prec) -1.0)) + * ((double)(tilec->numpix)); + } /* compno */ + + /* index file */ + if(cstr_info) { + opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno]; + tile_info->numpix = tcd_tile->numpix; + tile_info->distotile = tcd_tile->distotile; + tile_info->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double)); + } + + for (layno = 0; layno < tcd_tcp->numlayers; layno++) { + double lo = min; + double hi = max; + int success = 0; + int maxlen = tcd_tcp->rates[layno] ? int_min(((int) ceil(tcd_tcp->rates[layno])), len) : len; + double goodthresh = 0; + double stable_thresh = 0; + int i; + double distotarget; /* fixed_quality */ + + /* fixed_quality */ + distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, tcd_tcp->distoratio[layno] / 10)); + + /* Don't try to find an optimal threshold but rather take everything not included yet, if + -r xx,yy,zz,0 (disto_alloc == 1 and rates == 0) + -q xx,yy,zz,0 (fixed_quality == 1 and distoratio == 0) + ==> possible to have some lossy layers and the last layer for sure lossless */ + if ( ((cp->disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) { + opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp); + double thresh = 0; + + for (i = 0; i < 128; i++) { + int l = 0; + double distoachieved = 0; /* fixed_quality */ + thresh = (lo + hi) / 2; + + tcd_makelayer(tcd, layno, thresh, 0); + + if (cp->fixed_quality) { /* fixed_quality */ + if(cp->cinema){ + l = t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp); + if (l == -999) { + lo = thresh; + continue; + }else{ + distoachieved = layno == 0 ? + tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno]; + if (distoachieved < distotarget) { + hi=thresh; + stable_thresh = thresh; + continue; + }else{ + lo=thresh; + } + } + }else{ + distoachieved = (layno == 0) ? + tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); + if (distoachieved < distotarget) { + hi = thresh; + stable_thresh = thresh; + continue; + } + lo = thresh; + } + } else { + l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp); + /* TODO: what to do with l ??? seek / tell ??? */ + /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */ + if (l == -999) { + lo = thresh; + continue; + } + hi = thresh; + stable_thresh = thresh; + } + } + success = 1; + goodthresh = stable_thresh == 0? thresh : stable_thresh; + t2_destroy(t2); + } else { + success = 1; + goodthresh = min; + } + + if (!success) { + return false; + } + + if(cstr_info) { /* Threshold for Marcela Index */ + cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh; + } + tcd_makelayer(tcd, layno, goodthresh, 1); + + /* fixed_quality */ + cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); + } + + return true; +} + +int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) { + int compno; + int l, i, numpacks = 0; + opj_tcd_tile_t *tile = NULL; + opj_tcp_t *tcd_tcp = NULL; + opj_cp_t *cp = NULL; + + opj_tcp_t *tcp = &tcd->cp->tcps[0]; + opj_tccp_t *tccp = &tcp->tccps[0]; + opj_image_t *image = tcd->image; + + opj_t1_t *t1 = NULL; /* T1 component */ + opj_t2_t *t2 = NULL; /* T2 component */ + + tcd->tcd_tileno = tileno; + tcd->tcd_tile = tcd->tcd_image->tiles; + tcd->tcp = &tcd->cp->tcps[tileno]; + + tile = tcd->tcd_tile; + tcd_tcp = tcd->tcp; + cp = tcd->cp; + + if(tcd->cur_tp_num == 0){ + tcd->encoding_time = opj_clock(); /* time needed to encode a tile */ + /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */ + if(cstr_info) { + opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */ + for (i = 0; i < tilec_idx->numresolutions; i++) { + opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i]; + + cstr_info->tile[tileno].pw[i] = res_idx->pw; + cstr_info->tile[tileno].ph[i] = res_idx->ph; + + numpacks += res_idx->pw * res_idx->ph; + + cstr_info->tile[tileno].pdx[i] = tccp->prcw[i]; + cstr_info->tile[tileno].pdy[i] = tccp->prch[i]; + } + cstr_info->tile[tileno].packet = (opj_packet_info_t*) opj_calloc(cstr_info->numcomps * cstr_info->numlayers * numpacks, sizeof(opj_packet_info_t)); + } + /* << INDEX */ + + /*---------------TILE-------------------*/ + + for (compno = 0; compno < tile->numcomps; compno++) { + int x, y; + + int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1); + int offset_x = int_ceildiv(image->x0, image->comps[compno].dx); + int offset_y = int_ceildiv(image->y0, image->comps[compno].dy); + + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + int tw = tilec->x1 - tilec->x0; + int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx); + + /* extract tile data */ + + if (tcd_tcp->tccps[compno].qmfbid == 1) { + for (y = tilec->y0; y < tilec->y1; y++) { + /* start of the src tile scanline */ + int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w]; + /* start of the dst tile scanline */ + int *tile_data = &tilec->data[(y - tilec->y0) * tw]; + for (x = tilec->x0; x < tilec->x1; x++) { + *tile_data++ = *data++ - adjust; + } + } + } else if (tcd_tcp->tccps[compno].qmfbid == 0) { + for (y = tilec->y0; y < tilec->y1; y++) { + /* start of the src tile scanline */ + int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w]; + /* start of the dst tile scanline */ + int *tile_data = &tilec->data[(y - tilec->y0) * tw]; + for (x = tilec->x0; x < tilec->x1; x++) { + *tile_data++ = (*data++ - adjust) << 11; + } + + } + } + } + + /*----------------MCT-------------------*/ + if (tcd_tcp->mct) { + int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0); + if (tcd_tcp->tccps[0].qmfbid == 0) { + mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples); + } else { + mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples); + } + } + + /*----------------DWT---------------------*/ + + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + if (tcd_tcp->tccps[compno].qmfbid == 1) { + dwt_encode(tilec); + } else if (tcd_tcp->tccps[compno].qmfbid == 0) { + dwt_encode_real(tilec); + } + } + + /*------------------TIER1-----------------*/ + t1 = t1_create(tcd->cinfo); + t1_encode_cblks(t1, tile, tcd_tcp); + t1_destroy(t1); + + /*-----------RATE-ALLOCATE------------------*/ + + /* INDEX */ + if(cstr_info) { + cstr_info->index_write = 0; + } + if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */ + /* Normal Rate/distortion allocation */ + tcd_rateallocate(tcd, dest, len, cstr_info); + } else { + /* Fixed layer allocation */ + tcd_rateallocate_fixed(tcd); + } + } + /*--------------TIER2------------------*/ + + /* INDEX */ + if(cstr_info) { + cstr_info->index_write = 1; + } + + t2 = t2_create(tcd->cinfo, image, cp); + l = t2_encode_packets(t2,tileno, tile, tcd_tcp->numlayers, dest, len, cstr_info,tcd->tp_num,tcd->tp_pos,tcd->cur_pino,FINAL_PASS,tcd->cur_totnum_tp); + t2_destroy(t2); + + /*---------------CLEAN-------------------*/ + + + if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){ + tcd->encoding_time = opj_clock() - tcd->encoding_time; + opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time); + + /* cleaning memory */ + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + opj_aligned_free(tilec->data); + } + } + + return l; +} + +bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info) { + int l; + int compno; + int eof = 0; + double tile_time, t1_time, dwt_time; + opj_tcd_tile_t *tile = NULL; + + opj_t1_t *t1 = NULL; /* T1 component */ + opj_t2_t *t2 = NULL; /* T2 component */ + + tcd->tcd_tileno = tileno; + tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]); + tcd->tcp = &(tcd->cp->tcps[tileno]); + tile = tcd->tcd_tile; + + tile_time = opj_clock(); /* time needed to decode a tile */ + opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1, tcd->cp->tw * tcd->cp->th); + + /* INDEX >> */ + if(cstr_info) { + int resno, compno, numprec = 0; + for (compno = 0; compno < cstr_info->numcomps; compno++) { + opj_tcp_t *tcp = &tcd->cp->tcps[0]; + opj_tccp_t *tccp = &tcp->tccps[compno]; + opj_tcd_tilecomp_t *tilec_idx = &tile->comps[compno]; + for (resno = 0; resno < tilec_idx->numresolutions; resno++) { + opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno]; + cstr_info->tile[tileno].pw[resno] = res_idx->pw; + cstr_info->tile[tileno].ph[resno] = res_idx->ph; + numprec += res_idx->pw * res_idx->ph; + if (tccp->csty & J2K_CP_CSTY_PRT) { + cstr_info->tile[tileno].pdx[resno] = tccp->prcw[resno]; + cstr_info->tile[tileno].pdy[resno] = tccp->prch[resno]; + } + else { + cstr_info->tile[tileno].pdx[resno] = 15; + cstr_info->tile[tileno].pdx[resno] = 15; + } + } + } + cstr_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(cstr_info->numlayers * numprec * sizeof(opj_packet_info_t)); + cstr_info->packno = 0; + } + /* << INDEX */ + + /*--------------TIER2------------------*/ + + t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp); + l = t2_decode_packets(t2, src, len, tileno, tile, cstr_info); + t2_destroy(t2); + + if (l == -999) { + eof = 1; + opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bistream\n"); + } + + /*------------------TIER1-----------------*/ + + t1_time = opj_clock(); /* time needed to decode a tile */ + t1 = t1_create(tcd->cinfo); + for (compno = 0; compno < tile->numcomps; ++compno) { + opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; + /* The +3 is headroom required by the vectorized DWT */ + tilec->data = (int*) opj_aligned_malloc((((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0))+3) * sizeof(int)); + t1_decode_cblks(t1, tilec, &tcd->tcp->tccps[compno]); + } + t1_destroy(t1); + t1_time = opj_clock() - t1_time; + opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time); + + /*----------------DWT---------------------*/ + + dwt_time = opj_clock(); /* time needed to decode a tile */ + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + int numres2decode; + + if (tcd->cp->reduce != 0) { + tcd->image->comps[compno].resno_decoded = + tile->comps[compno].numresolutions - tcd->cp->reduce - 1; + if (tcd->image->comps[compno].resno_decoded < 0) { + opj_event_msg(tcd->cinfo, EVT_ERROR, "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number " + " of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", tcd->cp->reduce, tile->comps[compno].numresolutions); + return false; + } + } + + numres2decode = tcd->image->comps[compno].resno_decoded + 1; + if(numres2decode > 0){ + if (tcd->tcp->tccps[compno].qmfbid == 1) { + dwt_decode(tilec, numres2decode); + } else { + dwt_decode_real(tilec, numres2decode); + } + } + } + dwt_time = opj_clock() - dwt_time; + opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time); + + /*----------------MCT-------------------*/ + + if (tcd->tcp->mct) { + int n = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0); + if (tcd->tcp->tccps[0].qmfbid == 1) { + mct_decode( + tile->comps[0].data, + tile->comps[1].data, + tile->comps[2].data, + n); + } else { + mct_decode_real( + (float*)tile->comps[0].data, + (float*)tile->comps[1].data, + (float*)tile->comps[2].data, + n); + } + } + + /*---------------TILE-------------------*/ + + for (compno = 0; compno < tile->numcomps; ++compno) { + opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; + opj_image_comp_t* imagec = &tcd->image->comps[compno]; + opj_tcd_resolution_t* res = &tilec->resolutions[imagec->resno_decoded]; + int adjust = imagec->sgnd ? 0 : 1 << (imagec->prec - 1); + int min = imagec->sgnd ? -(1 << (imagec->prec - 1)) : 0; + int max = imagec->sgnd ? (1 << (imagec->prec - 1)) - 1 : (1 << imagec->prec) - 1; + + int tw = tilec->x1 - tilec->x0; + int w = imagec->w; + + int offset_x = int_ceildivpow2(imagec->x0, imagec->factor); + int offset_y = int_ceildivpow2(imagec->y0, imagec->factor); + + int i, j; + if(!imagec->data){ + imagec->data = (int*) opj_malloc(imagec->w * imagec->h * sizeof(int)); + } + if(tcd->tcp->tccps[compno].qmfbid == 1) { + for(j = res->y0; j < res->y1; ++j) { + for(i = res->x0; i < res->x1; ++i) { + int v = tilec->data[i - res->x0 + (j - res->y0) * tw]; + v += adjust; + imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); + } + } + }else{ + for(j = res->y0; j < res->y1; ++j) { + for(i = res->x0; i < res->x1; ++i) { + float tmp = ((float*)tilec->data)[i - res->x0 + (j - res->y0) * tw]; + int v = lrintf(tmp); + v += adjust; + imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); + } + } + } + opj_aligned_free(tilec->data); + } + + tile_time = opj_clock() - tile_time; /* time needed to decode a tile */ + opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time); + + if (eof) { + return false; + } + + return true; +} + +void tcd_free_decode(opj_tcd_t *tcd) { + opj_tcd_image_t *tcd_image = tcd->tcd_image; + opj_free(tcd_image->tiles); +} + +void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno) { + int compno,resno,bandno,precno; + + opj_tcd_image_t *tcd_image = tcd->tcd_image; + + opj_tcd_tile_t *tile = &tcd_image->tiles[tileno]; + for (compno = 0; compno < tile->numcomps; compno++) { + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + for (resno = 0; resno < tilec->numresolutions; resno++) { + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; + for (bandno = 0; bandno < res->numbands; bandno++) { + opj_tcd_band_t *band = &res->bands[bandno]; + for (precno = 0; precno < res->ph * res->pw; precno++) { + opj_tcd_precinct_t *prec = &band->precincts[precno]; + if (prec->imsbtree != NULL) tgt_destroy(prec->imsbtree); + if (prec->incltree != NULL) tgt_destroy(prec->incltree); + } + opj_free(band->precincts); + } + } + opj_free(tilec->resolutions); + } + opj_free(tile->comps); +} + + + diff --git a/contrib/media/updf_newlib/libopenjpeg/tcd.h b/contrib/media/updf_newlib/libopenjpeg/tcd.h new file mode 100755 index 000000000..a5330730f --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/tcd.h @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __TCD_H +#define __TCD_H +/** +@file tcd.h +@brief Implementation of a tile coder/decoder (TCD) + +The functions in TCD.C have for goal to encode or decode each tile independently from +each other. The functions in TCD.C are used by some function in J2K.C. +*/ + +/** @defgroup TCD TCD - Implementation of a tile coder/decoder */ +/*@{*/ + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_seg { + unsigned char** data; + int dataindex; + int numpasses; + int len; + int maxpasses; + int numnewpasses; + int newlen; +} opj_tcd_seg_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_pass { + int rate; + double distortiondec; + int term, len; +} opj_tcd_pass_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_layer { + int numpasses; /* Number of passes in the layer */ + int len; /* len of information */ + double disto; /* add for index (Cfr. Marcela) */ + unsigned char *data; /* data */ +} opj_tcd_layer_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_cblk_enc { + unsigned char* data; /* Data */ + opj_tcd_layer_t* layers; /* layer information */ + opj_tcd_pass_t* passes; /* information about the passes */ + int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ + int numbps; + int numlenbits; + int numpasses; /* number of pass already done for the code-blocks */ + int numpassesinlayers; /* number of passes in the layer */ + int totalpasses; /* total number of passes */ +} opj_tcd_cblk_enc_t; + +typedef struct opj_tcd_cblk_dec { + unsigned char* data; /* Data */ + opj_tcd_seg_t* segs; /* segments informations */ + int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ + int numbps; + int numlenbits; + int len; /* length */ + int numnewpasses; /* number of pass added to the code-blocks */ + int numsegs; /* number of segments */ +} opj_tcd_cblk_dec_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_precinct { + int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ + int cw, ch; /* number of precinct in width and heigth */ + union{ /* code-blocks informations */ + opj_tcd_cblk_enc_t* enc; + opj_tcd_cblk_dec_t* dec; + } cblks; + opj_tgt_tree_t *incltree; /* inclusion tree */ + opj_tgt_tree_t *imsbtree; /* IMSB tree */ +} opj_tcd_precinct_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_band { + int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ + int bandno; + opj_tcd_precinct_t *precincts; /* precinct information */ + int numbps; + float stepsize; +} opj_tcd_band_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_resolution { + int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */ + int pw, ph; + int numbands; /* number sub-band for the resolution level */ + opj_tcd_band_t bands[3]; /* subband information */ +} opj_tcd_resolution_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_tilecomp { + int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ + int numresolutions; /* number of resolutions level */ + opj_tcd_resolution_t *resolutions; /* resolutions information */ + int *data; /* data of the component */ + int numpix; /* add fixed_quality */ +} opj_tcd_tilecomp_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_tile { + int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */ + int numcomps; /* number of components in tile */ + opj_tcd_tilecomp_t *comps; /* Components information */ + int numpix; /* add fixed_quality */ + double distotile; /* add fixed_quality */ + double distolayer[100]; /* add fixed_quality */ + /** packet number */ + int packno; +} opj_tcd_tile_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_image { + int tw, th; /* number of tiles in width and heigth */ + opj_tcd_tile_t *tiles; /* Tiles information */ +} opj_tcd_image_t; + +/** +Tile coder/decoder +*/ +typedef struct opj_tcd { + /** Position of the tilepart flag in Progression order*/ + int tp_pos; + /** Tile part number*/ + int tp_num; + /** Current tile part number*/ + int cur_tp_num; + /** Total number of tileparts of the current tile*/ + int cur_totnum_tp; + /** Current Packet iterator number */ + int cur_pino; + /** codec context */ + opj_common_ptr cinfo; + + /** info on each image tile */ + opj_tcd_image_t *tcd_image; + /** image */ + opj_image_t *image; + /** coding parameters */ + opj_cp_t *cp; + /** pointer to the current encoded/decoded tile */ + opj_tcd_tile_t *tcd_tile; + /** coding/decoding parameters common to all tiles */ + opj_tcp_t *tcp; + /** current encoded/decoded tile */ + int tcd_tileno; + /** Time taken to encode a tile*/ + double encoding_time; +} opj_tcd_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ + +/** +Dump the content of a tcd structure +*/ +void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img); +/** +Create a new TCD handle +@param cinfo Codec context info +@return Returns a new TCD handle if successful returns NULL otherwise +*/ +opj_tcd_t* tcd_create(opj_common_ptr cinfo); +/** +Destroy a previously created TCD handle +@param tcd TCD handle to destroy +*/ +void tcd_destroy(opj_tcd_t *tcd); +/** +Initialize the tile coder (allocate the memory) +@param tcd TCD handle +@param image Raw image +@param cp Coding parameters +@param curtileno Number that identifies the tile that will be encoded +*/ +void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); +/** +Free the memory allocated for encoding +@param tcd TCD handle +*/ +void tcd_free_encode(opj_tcd_t *tcd); +/** +Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode) +@param tcd TCD handle +@param image Raw image +@param cp Coding parameters +@param curtileno Number that identifies the tile that will be encoded +*/ +void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); +/** +Initialize the tile decoder +@param tcd TCD handle +@param image Raw image +@param cp Coding parameters +*/ +void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp); +void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info); +void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final); +void tcd_rateallocate_fixed(opj_tcd_t *tcd); +void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final); +bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); +/** +Encode a tile from the raw image into a buffer +@param tcd TCD handle +@param tileno Number that identifies one of the tiles to be encoded +@param dest Destination buffer +@param len Length of destination buffer +@param cstr_info Codestream information structure +@return +*/ +int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); +/** +Decode a tile from a buffer into a raw image +@param tcd TCD handle +@param src Source buffer +@param len Length of source buffer +@param tileno Number that identifies one of the tiles to be decoded +@param cstr_info Codestream information structure +*/ +bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info); +/** +Free the memory allocated for decoding +@param tcd TCD handle +*/ +void tcd_free_decode(opj_tcd_t *tcd); +void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno); + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __TCD_H */ diff --git a/contrib/media/updf_newlib/libopenjpeg/tgt.c b/contrib/media/updf_newlib/libopenjpeg/tgt.c new file mode 100755 index 000000000..a5dbcd3ce --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/tgt.c @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" + +/* +========================================================== + Tag-tree coder interface +========================================================== +*/ + +opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) { + int nplh[32]; + int nplv[32]; + opj_tgt_node_t *node = NULL; + opj_tgt_node_t *parentnode = NULL; + opj_tgt_node_t *parentnode0 = NULL; + opj_tgt_tree_t *tree = NULL; + int i, j, k; + int numlvls; + int n; + + tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t)); + if(!tree) return NULL; + tree->numleafsh = numleafsh; + tree->numleafsv = numleafsv; + + numlvls = 0; + nplh[0] = numleafsh; + nplv[0] = numleafsv; + tree->numnodes = 0; + do { + n = nplh[numlvls] * nplv[numlvls]; + nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2; + nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2; + tree->numnodes += n; + ++numlvls; + } while (n > 1); + + /* ADD */ + if (tree->numnodes == 0) { + opj_free(tree); + return NULL; + } + + tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, sizeof(opj_tgt_node_t)); + if(!tree->nodes) { + opj_free(tree); + return NULL; + } + + node = tree->nodes; + parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv]; + parentnode0 = parentnode; + + for (i = 0; i < numlvls - 1; ++i) { + for (j = 0; j < nplv[i]; ++j) { + k = nplh[i]; + while (--k >= 0) { + node->parent = parentnode; + ++node; + if (--k >= 0) { + node->parent = parentnode; + ++node; + } + ++parentnode; + } + if ((j & 1) || j == nplv[i] - 1) { + parentnode0 = parentnode; + } else { + parentnode = parentnode0; + parentnode0 += nplh[i]; + } + } + } + node->parent = 0; + + tgt_reset(tree); + + return tree; +} + +void tgt_destroy(opj_tgt_tree_t *tree) { + opj_free(tree->nodes); + opj_free(tree); +} + +void tgt_reset(opj_tgt_tree_t *tree) { + int i; + + if (NULL == tree) + return; + + for (i = 0; i < tree->numnodes; i++) { + tree->nodes[i].value = 999; + tree->nodes[i].low = 0; + tree->nodes[i].known = 0; + } +} + +void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) { + opj_tgt_node_t *node; + node = &tree->nodes[leafno]; + while (node && node->value > value) { + node->value = value; + node = node->parent; + } +} + +void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { + opj_tgt_node_t *stk[31]; + opj_tgt_node_t **stkptr; + opj_tgt_node_t *node; + int low; + + stkptr = stk; + node = &tree->nodes[leafno]; + while (node->parent) { + *stkptr++ = node; + node = node->parent; + } + + low = 0; + for (;;) { + if (low > node->low) { + node->low = low; + } else { + low = node->low; + } + + while (low < threshold) { + if (low >= node->value) { + if (!node->known) { + bio_write(bio, 1, 1); + node->known = 1; + } + break; + } + bio_write(bio, 0, 1); + ++low; + } + + node->low = low; + if (stkptr == stk) + break; + node = *--stkptr; + } +} + +int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { + opj_tgt_node_t *stk[31]; + opj_tgt_node_t **stkptr; + opj_tgt_node_t *node; + int low; + + stkptr = stk; + node = &tree->nodes[leafno]; + while (node->parent) { + *stkptr++ = node; + node = node->parent; + } + + low = 0; + for (;;) { + if (low > node->low) { + node->low = low; + } else { + low = node->low; + } + while (low < threshold && low < node->value) { + if (bio_read(bio, 1)) { + node->value = low; + } else { + ++low; + } + } + node->low = low; + if (stkptr == stk) { + break; + } + node = *--stkptr; + } + + return (node->value < threshold) ? 1 : 0; +} diff --git a/contrib/media/updf_newlib/libopenjpeg/tgt.h b/contrib/media/updf_newlib/libopenjpeg/tgt.h new file mode 100755 index 000000000..c08c8da0a --- /dev/null +++ b/contrib/media/updf_newlib/libopenjpeg/tgt.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __TGT_H +#define __TGT_H +/** +@file tgt.h +@brief Implementation of a tag-tree coder (TGT) + +The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C +are used by some function in T2.C. +*/ + +/** @defgroup TGT TGT - Implementation of a tag-tree coder */ +/*@{*/ + +/** +Tag node +*/ +typedef struct opj_tgt_node { + struct opj_tgt_node *parent; + int value; + int low; + int known; +} opj_tgt_node_t; + +/** +Tag tree +*/ +typedef struct opj_tgt_tree { + int numleafsh; + int numleafsv; + int numnodes; + opj_tgt_node_t *nodes; +} opj_tgt_tree_t; + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Create a tag-tree +@param numleafsh Width of the array of leafs of the tree +@param numleafsv Height of the array of leafs of the tree +@return Returns a new tag-tree if successful, returns NULL otherwise +*/ +opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv); +/** +Destroy a tag-tree, liberating memory +@param tree Tag-tree to destroy +*/ +void tgt_destroy(opj_tgt_tree_t *tree); +/** +Reset a tag-tree (set all leaves to 0) +@param tree Tag-tree to reset +*/ +void tgt_reset(opj_tgt_tree_t *tree); +/** +Set the value of a leaf of a tag-tree +@param tree Tag-tree to modify +@param leafno Number that identifies the leaf to modify +@param value New value of the leaf +*/ +void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value); +/** +Encode the value of a leaf of the tag-tree up to a given threshold +@param bio Pointer to a BIO handle +@param tree Tag-tree to modify +@param leafno Number that identifies the leaf to encode +@param threshold Threshold to use when encoding value of the leaf +*/ +void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold); +/** +Decode the value of a leaf of the tag-tree up to a given threshold +@param bio Pointer to a BIO handle +@param tree Tag-tree to decode +@param leafno Number that identifies the leaf to decode +@param threshold Threshold to use when decoding value of the leaf +@return Returns 1 if the node's value < threshold, returns 0 otherwise +*/ +int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold); +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __TGT_H */ diff --git a/contrib/media/updf_newlib/pdf/Makefile b/contrib/media/updf_newlib/pdf/Makefile new file mode 100755 index 000000000..470486254 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/Makefile @@ -0,0 +1,21 @@ +CC = kos32-gcc +LD = kos32-ld + +SDK_DIR = $(abspath ../../../sdk) +LDFLAGS = -call_shared -nostdlib -T $(SDK_DIR)/sources/newlib/app-dynamic.lds --image-base 0 + +CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 + +INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I ../fitz -I $(SDK_DIR)/sources/freetype/include +LIBPATH = -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib + +PDF_SRC := $(notdir $(wildcard *.c)) +OBJECTS = $(patsubst %.c, %.o, $(PDF_SRC)) + +default: $(patsubst %.c,%.o,$(PDF_SRC)) + ar rcs libmupdf.a *.o + rm *.o + mv libmupdf.a ../lib + +%.o : %.c Makefile $(PDF_SRC) + $(CC) $(CFLAGS) $(INCLUDES) -o $@ $< diff --git a/contrib/media/updf_newlib/pdf/data_encodings.h b/contrib/media/updf_newlib/pdf/data_encodings.h new file mode 100755 index 000000000..4a86e5140 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/data_encodings.h @@ -0,0 +1,214 @@ +#define _notdef NULL + +const unsigned short pdf_doc_encoding[256] = +{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0009, 0x000A, 0x0000, 0x0000, 0x000D, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, + 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, + 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, + 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, + 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, + 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff +}; + +const char * const pdf_standard[256] = { _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", + "ampersand", "quoteright", "parenleft", "parenright", "asterisk", + "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", + "three", "four", "five", "six", "seven", "eight", "nine", "colon", + "semicolon", "less", "equal", "greater", "question", "at", "A", + "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", + "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", + "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", + "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", + "y", "z", "braceleft", "bar", "braceright", "asciitilde", _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, "exclamdown", "cent", "sterling", + "fraction", "yen", "florin", "section", "currency", "quotesingle", + "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", + "fi", "fl", _notdef, "endash", "dagger", "daggerdbl", "periodcentered", + _notdef, "paragraph", "bullet", "quotesinglbase", "quotedblbase", + "quotedblright", "guillemotright", "ellipsis", "perthousand", + _notdef, "questiondown", _notdef, "grave", "acute", "circumflex", + "tilde", "macron", "breve", "dotaccent", "dieresis", _notdef, + "ring", "cedilla", _notdef, "hungarumlaut", "ogonek", "caron", + "emdash", _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, "AE", + _notdef, "ordfeminine", _notdef, _notdef, _notdef, _notdef, + "Lslash", "Oslash", "OE", "ordmasculine", _notdef, _notdef, + _notdef, _notdef, _notdef, "ae", _notdef, _notdef, + _notdef, "dotlessi", _notdef, _notdef, "lslash", "oslash", + "oe", "germandbls", _notdef, _notdef, _notdef, _notdef +}; + +const char * const pdf_mac_roman[256] = { _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", + "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", + "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", + "three", "four", "five", "six", "seven", "eight", "nine", "colon", + "semicolon", "less", "equal", "greater", "question", "at", "A", + "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", + "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", + "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", + "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", + "y", "z", "braceleft", "bar", "braceright", "asciitilde", _notdef, + "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", + "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", + "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", + "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", + "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", + "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", + "section", "bullet", "paragraph", "germandbls", "registered", + "copyright", "trademark", "acute", "dieresis", _notdef, "AE", + "Oslash", _notdef, "plusminus", _notdef, _notdef, "yen", "mu", + _notdef, _notdef, _notdef, _notdef, _notdef, "ordfeminine", + "ordmasculine", _notdef, "ae", "oslash", "questiondown", "exclamdown", + "logicalnot", _notdef, "florin", _notdef, _notdef, "guillemotleft", + "guillemotright", "ellipsis", "space", "Agrave", "Atilde", "Otilde", + "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", + "quoteleft", "quoteright", "divide", _notdef, "ydieresis", + "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", + "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", + "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", + "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", + "Oacute", "Ocircumflex", _notdef, "Ograve", "Uacute", "Ucircumflex", + "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", + "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron" +}; + +const char * const pdf_mac_expert[256] = { _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", + "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", + "parenleftsuperior", "parenrightsuperior", "twodotenleader", + "onedotenleader", "comma", "hyphen", "period", "fraction", + "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", + "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", + "eightoldstyle", "nineoldstyle", "colon", "semicolon", _notdef, + "threequartersemdash", _notdef, "questionsmall", _notdef, + _notdef, _notdef, _notdef, "Ethsmall", _notdef, _notdef, + "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", + "fiveeighths", "seveneighths", "onethird", "twothirds", _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, "ff", "fi", + "fl", "ffi", "ffl", "parenleftinferior", _notdef, "parenrightinferior", + "Circumflexsmall", "hypheninferior", "Gravesmall", "Asmall", "Bsmall", + "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", + "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", + "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", + "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", + "Tildesmall", _notdef, _notdef, "asuperior", "centsuperior", + _notdef, _notdef, _notdef, _notdef, "Aacutesmall", + "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", + "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall", + "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", + "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", + "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", + "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall", + _notdef, "eightsuperior", "fourinferior", "threeinferior", + "sixinferior", "eightinferior", "seveninferior", "Scaronsmall", + _notdef, "centinferior", "twoinferior", _notdef, "Dieresissmall", + _notdef, "Caronsmall", "osuperior", "fiveinferior", _notdef, + "commainferior", "periodinferior", "Yacutesmall", _notdef, + "dollarinferior", _notdef, _notdef, "Thornsmall", _notdef, + "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall", + "questiondownsmall", "oneinferior", "Lslashsmall", _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, "Cedillasmall", + _notdef, _notdef, _notdef, _notdef, _notdef, "OEsmall", + "figuredash", "hyphensuperior", _notdef, _notdef, _notdef, + _notdef, "exclamdownsmall", _notdef, "Ydieresissmall", _notdef, + "onesuperior", "twosuperior", "threesuperior", "foursuperior", + "fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", + "zerosuperior", _notdef, "esuperior", "rsuperior", "tsuperior", + _notdef, _notdef, "isuperior", "ssuperior", "dsuperior", + _notdef, _notdef, _notdef, _notdef, _notdef, "lsuperior", + "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", + "msuperior", "commasuperior", "periodsuperior", "Dotaccentsmall", + "Ringsmall", _notdef, _notdef, _notdef, _notdef }; + +const char * const pdf_win_ansi[256] = { _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, _notdef, + _notdef, _notdef, _notdef, _notdef, _notdef, "space", + "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", + "quotesingle", "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", + "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", "at", "A", "B", "C", "D", + "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", + "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", "grave", + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", + "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", + "braceleft", "bar", "braceright", "asciitilde", "bullet", "Euro", + "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", + "dagger", "daggerdbl", "circumflex", "perthousand", "Scaron", + "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", + "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", + "endash", "emdash", "tilde", "trademark", "scaron", "guilsinglright", + "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", + "sterling", "currency", "yen", "brokenbar", "section", "dieresis", + "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", + "registered", "macron", "degree", "plusminus", "twosuperior", + "threesuperior", "acute", "mu", "paragraph", "periodcentered", + "cedilla", "onesuperior", "ordmasculine", "guillemotright", + "onequarter", "onehalf", "threequarters", "questiondown", "Agrave", + "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", + "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", + "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", + "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash", + "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", + "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", + "aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex", + "edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth", + "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", + "divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", + "yacute", "thorn", "ydieresis" +}; diff --git a/contrib/media/updf_newlib/pdf/data_glyphlist.h b/contrib/media/updf_newlib/pdf/data_glyphlist.h new file mode 100755 index 000000000..f14169168 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/data_glyphlist.h @@ -0,0 +1,1461 @@ +/* +# Name: Adobe Glyph List +# Table version: 2.0 +# Date: September 20, 2002 +# +# See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html +# +# Format: Semicolon-delimited fields: +# (1) glyph name +# (2) Unicode scalar value +#--end +*/ + +static const char *agl_name_list[] = { +"A","AE","AEacute","AEmacron","AEsmall","Aacute","Aacutesmall","Abreve", +"Abreveacute","Abrevecyrillic","Abrevedotbelow","Abrevegrave", +"Abrevehookabove","Abrevetilde","Acaron","Acircle","Acircumflex", +"Acircumflexacute","Acircumflexdotbelow","Acircumflexgrave", +"Acircumflexhookabove","Acircumflexsmall","Acircumflextilde","Acute", +"Acutesmall","Acyrillic","Adblgrave","Adieresis","Adieresiscyrillic", +"Adieresismacron","Adieresissmall","Adotbelow","Adotmacron","Agrave", +"Agravesmall","Ahookabove","Aiecyrillic","Ainvertedbreve","Alpha", +"Alphatonos","Amacron","Amonospace","Aogonek","Aring","Aringacute", +"Aringbelow","Aringsmall","Asmall","Atilde","Atildesmall","Aybarmenian","B", +"Bcircle","Bdotaccent","Bdotbelow","Becyrillic","Benarmenian","Beta","Bhook", +"Blinebelow","Bmonospace","Brevesmall","Bsmall","Btopbar","C","Caarmenian", +"Cacute","Caron","Caronsmall","Ccaron","Ccedilla","Ccedillaacute", +"Ccedillasmall","Ccircle","Ccircumflex","Cdot","Cdotaccent","Cedillasmall", +"Chaarmenian","Cheabkhasiancyrillic","Checyrillic", +"Chedescenderabkhasiancyrillic","Chedescendercyrillic","Chedieresiscyrillic", +"Cheharmenian","Chekhakassiancyrillic","Cheverticalstrokecyrillic","Chi", +"Chook","Circumflexsmall","Cmonospace","Coarmenian","Csmall","D","DZ", +"DZcaron","Daarmenian","Dafrican","Dcaron","Dcedilla","Dcircle", +"Dcircumflexbelow","Dcroat","Ddotaccent","Ddotbelow","Decyrillic","Deicoptic", +"Delta","Deltagreek","Dhook","Dieresis","DieresisAcute","DieresisGrave", +"Dieresissmall","Digammagreek","Djecyrillic","Dlinebelow","Dmonospace", +"Dotaccentsmall","Dslash","Dsmall","Dtopbar","Dz","Dzcaron", +"Dzeabkhasiancyrillic","Dzecyrillic","Dzhecyrillic","E","Eacute", +"Eacutesmall","Ebreve","Ecaron","Ecedillabreve","Echarmenian","Ecircle", +"Ecircumflex","Ecircumflexacute","Ecircumflexbelow","Ecircumflexdotbelow", +"Ecircumflexgrave","Ecircumflexhookabove","Ecircumflexsmall", +"Ecircumflextilde","Ecyrillic","Edblgrave","Edieresis","Edieresissmall", +"Edot","Edotaccent","Edotbelow","Efcyrillic","Egrave","Egravesmall", +"Eharmenian","Ehookabove","Eightroman","Einvertedbreve","Eiotifiedcyrillic", +"Elcyrillic","Elevenroman","Emacron","Emacronacute","Emacrongrave", +"Emcyrillic","Emonospace","Encyrillic","Endescendercyrillic","Eng", +"Enghecyrillic","Enhookcyrillic","Eogonek","Eopen","Epsilon","Epsilontonos", +"Ercyrillic","Ereversed","Ereversedcyrillic","Escyrillic", +"Esdescendercyrillic","Esh","Esmall","Eta","Etarmenian","Etatonos","Eth", +"Ethsmall","Etilde","Etildebelow","Euro","Ezh","Ezhcaron","Ezhreversed","F", +"Fcircle","Fdotaccent","Feharmenian","Feicoptic","Fhook","Fitacyrillic", +"Fiveroman","Fmonospace","Fourroman","Fsmall","G","GBsquare","Gacute","Gamma", +"Gammaafrican","Gangiacoptic","Gbreve","Gcaron","Gcedilla","Gcircle", +"Gcircumflex","Gcommaaccent","Gdot","Gdotaccent","Gecyrillic","Ghadarmenian", +"Ghemiddlehookcyrillic","Ghestrokecyrillic","Gheupturncyrillic","Ghook", +"Gimarmenian","Gjecyrillic","Gmacron","Gmonospace","Grave","Gravesmall", +"Gsmall","Gsmallhook","Gstroke","H","H18533","H18543","H18551","H22073", +"HPsquare","Haabkhasiancyrillic","Hadescendercyrillic","Hardsigncyrillic", +"Hbar","Hbrevebelow","Hcedilla","Hcircle","Hcircumflex","Hdieresis", +"Hdotaccent","Hdotbelow","Hmonospace","Hoarmenian","Horicoptic","Hsmall", +"Hungarumlaut","Hungarumlautsmall","Hzsquare","I","IAcyrillic","IJ", +"IUcyrillic","Iacute","Iacutesmall","Ibreve","Icaron","Icircle","Icircumflex", +"Icircumflexsmall","Icyrillic","Idblgrave","Idieresis","Idieresisacute", +"Idieresiscyrillic","Idieresissmall","Idot","Idotaccent","Idotbelow", +"Iebrevecyrillic","Iecyrillic","Ifraktur","Igrave","Igravesmall","Ihookabove", +"Iicyrillic","Iinvertedbreve","Iishortcyrillic","Imacron","Imacroncyrillic", +"Imonospace","Iniarmenian","Iocyrillic","Iogonek","Iota","Iotaafrican", +"Iotadieresis","Iotatonos","Ismall","Istroke","Itilde","Itildebelow", +"Izhitsacyrillic","Izhitsadblgravecyrillic","J","Jaarmenian","Jcircle", +"Jcircumflex","Jecyrillic","Jheharmenian","Jmonospace","Jsmall","K", +"KBsquare","KKsquare","Kabashkircyrillic","Kacute","Kacyrillic", +"Kadescendercyrillic","Kahookcyrillic","Kappa","Kastrokecyrillic", +"Kaverticalstrokecyrillic","Kcaron","Kcedilla","Kcircle","Kcommaaccent", +"Kdotbelow","Keharmenian","Kenarmenian","Khacyrillic","Kheicoptic","Khook", +"Kjecyrillic","Klinebelow","Kmonospace","Koppacyrillic","Koppagreek", +"Ksicyrillic","Ksmall","L","LJ","LL","Lacute","Lambda","Lcaron","Lcedilla", +"Lcircle","Lcircumflexbelow","Lcommaaccent","Ldot","Ldotaccent","Ldotbelow", +"Ldotbelowmacron","Liwnarmenian","Lj","Ljecyrillic","Llinebelow","Lmonospace", +"Lslash","Lslashsmall","Lsmall","M","MBsquare","Macron","Macronsmall", +"Macute","Mcircle","Mdotaccent","Mdotbelow","Menarmenian","Mmonospace", +"Msmall","Mturned","Mu","N","NJ","Nacute","Ncaron","Ncedilla","Ncircle", +"Ncircumflexbelow","Ncommaaccent","Ndotaccent","Ndotbelow","Nhookleft", +"Nineroman","Nj","Njecyrillic","Nlinebelow","Nmonospace","Nowarmenian", +"Nsmall","Ntilde","Ntildesmall","Nu","O","OE","OEsmall","Oacute", +"Oacutesmall","Obarredcyrillic","Obarreddieresiscyrillic","Obreve","Ocaron", +"Ocenteredtilde","Ocircle","Ocircumflex","Ocircumflexacute", +"Ocircumflexdotbelow","Ocircumflexgrave","Ocircumflexhookabove", +"Ocircumflexsmall","Ocircumflextilde","Ocyrillic","Odblacute","Odblgrave", +"Odieresis","Odieresiscyrillic","Odieresissmall","Odotbelow","Ogoneksmall", +"Ograve","Ogravesmall","Oharmenian","Ohm","Ohookabove","Ohorn","Ohornacute", +"Ohorndotbelow","Ohorngrave","Ohornhookabove","Ohorntilde","Ohungarumlaut", +"Oi","Oinvertedbreve","Omacron","Omacronacute","Omacrongrave","Omega", +"Omegacyrillic","Omegagreek","Omegaroundcyrillic","Omegatitlocyrillic", +"Omegatonos","Omicron","Omicrontonos","Omonospace","Oneroman","Oogonek", +"Oogonekmacron","Oopen","Oslash","Oslashacute","Oslashsmall","Osmall", +"Ostrokeacute","Otcyrillic","Otilde","Otildeacute","Otildedieresis", +"Otildesmall","P","Pacute","Pcircle","Pdotaccent","Pecyrillic","Peharmenian", +"Pemiddlehookcyrillic","Phi","Phook","Pi","Piwrarmenian","Pmonospace","Psi", +"Psicyrillic","Psmall","Q","Qcircle","Qmonospace","Qsmall","R","Raarmenian", +"Racute","Rcaron","Rcedilla","Rcircle","Rcommaaccent","Rdblgrave", +"Rdotaccent","Rdotbelow","Rdotbelowmacron","Reharmenian","Rfraktur","Rho", +"Ringsmall","Rinvertedbreve","Rlinebelow","Rmonospace","Rsmall", +"Rsmallinverted","Rsmallinvertedsuperior","S","SF010000","SF020000", +"SF030000","SF040000","SF050000","SF060000","SF070000","SF080000","SF090000", +"SF100000","SF110000","SF190000","SF200000","SF210000","SF220000","SF230000", +"SF240000","SF250000","SF260000","SF270000","SF280000","SF360000","SF370000", +"SF380000","SF390000","SF400000","SF410000","SF420000","SF430000","SF440000", +"SF450000","SF460000","SF470000","SF480000","SF490000","SF500000","SF510000", +"SF520000","SF530000","SF540000","Sacute","Sacutedotaccent","Sampigreek", +"Scaron","Scarondotaccent","Scaronsmall","Scedilla","Schwa","Schwacyrillic", +"Schwadieresiscyrillic","Scircle","Scircumflex","Scommaaccent","Sdotaccent", +"Sdotbelow","Sdotbelowdotaccent","Seharmenian","Sevenroman","Shaarmenian", +"Shacyrillic","Shchacyrillic","Sheicoptic","Shhacyrillic","Shimacoptic", +"Sigma","Sixroman","Smonospace","Softsigncyrillic","Ssmall","Stigmagreek","T", +"Tau","Tbar","Tcaron","Tcedilla","Tcircle","Tcircumflexbelow","Tcommaaccent", +"Tdotaccent","Tdotbelow","Tecyrillic","Tedescendercyrillic","Tenroman", +"Tetsecyrillic","Theta","Thook","Thorn","Thornsmall","Threeroman", +"Tildesmall","Tiwnarmenian","Tlinebelow","Tmonospace","Toarmenian","Tonefive", +"Tonesix","Tonetwo","Tretroflexhook","Tsecyrillic","Tshecyrillic","Tsmall", +"Twelveroman","Tworoman","U","Uacute","Uacutesmall","Ubreve","Ucaron", +"Ucircle","Ucircumflex","Ucircumflexbelow","Ucircumflexsmall","Ucyrillic", +"Udblacute","Udblgrave","Udieresis","Udieresisacute","Udieresisbelow", +"Udieresiscaron","Udieresiscyrillic","Udieresisgrave","Udieresismacron", +"Udieresissmall","Udotbelow","Ugrave","Ugravesmall","Uhookabove","Uhorn", +"Uhornacute","Uhorndotbelow","Uhorngrave","Uhornhookabove","Uhorntilde", +"Uhungarumlaut","Uhungarumlautcyrillic","Uinvertedbreve","Ukcyrillic", +"Umacron","Umacroncyrillic","Umacrondieresis","Umonospace","Uogonek", +"Upsilon","Upsilon1","Upsilonacutehooksymbolgreek","Upsilonafrican", +"Upsilondieresis","Upsilondieresishooksymbolgreek","Upsilonhooksymbol", +"Upsilontonos","Uring","Ushortcyrillic","Usmall","Ustraightcyrillic", +"Ustraightstrokecyrillic","Utilde","Utildeacute","Utildebelow","V","Vcircle", +"Vdotbelow","Vecyrillic","Vewarmenian","Vhook","Vmonospace","Voarmenian", +"Vsmall","Vtilde","W","Wacute","Wcircle","Wcircumflex","Wdieresis", +"Wdotaccent","Wdotbelow","Wgrave","Wmonospace","Wsmall","X","Xcircle", +"Xdieresis","Xdotaccent","Xeharmenian","Xi","Xmonospace","Xsmall","Y", +"Yacute","Yacutesmall","Yatcyrillic","Ycircle","Ycircumflex","Ydieresis", +"Ydieresissmall","Ydotaccent","Ydotbelow","Yericyrillic", +"Yerudieresiscyrillic","Ygrave","Yhook","Yhookabove","Yiarmenian", +"Yicyrillic","Yiwnarmenian","Ymonospace","Ysmall","Ytilde","Yusbigcyrillic", +"Yusbigiotifiedcyrillic","Yuslittlecyrillic","Yuslittleiotifiedcyrillic","Z", +"Zaarmenian","Zacute","Zcaron","Zcaronsmall","Zcircle","Zcircumflex","Zdot", +"Zdotaccent","Zdotbelow","Zecyrillic","Zedescendercyrillic", +"Zedieresiscyrillic","Zeta","Zhearmenian","Zhebrevecyrillic","Zhecyrillic", +"Zhedescendercyrillic","Zhedieresiscyrillic","Zlinebelow","Zmonospace", +"Zsmall","Zstroke","a","aabengali","aacute","aadeva","aagujarati", +"aagurmukhi","aamatragurmukhi","aarusquare","aavowelsignbengali", +"aavowelsigndeva","aavowelsigngujarati","abbreviationmarkarmenian", +"abbreviationsigndeva","abengali","abopomofo","abreve","abreveacute", +"abrevecyrillic","abrevedotbelow","abrevegrave","abrevehookabove", +"abrevetilde","acaron","acircle","acircumflex","acircumflexacute", +"acircumflexdotbelow","acircumflexgrave","acircumflexhookabove", +"acircumflextilde","acute","acutebelowcmb","acutecmb","acutecomb","acutedeva", +"acutelowmod","acutetonecmb","acyrillic","adblgrave","addakgurmukhi","adeva", +"adieresis","adieresiscyrillic","adieresismacron","adotbelow","adotmacron", +"ae","aeacute","aekorean","aemacron","afii00208","afii08941","afii10017", +"afii10018","afii10019","afii10020","afii10021","afii10022","afii10023", +"afii10024","afii10025","afii10026","afii10027","afii10028","afii10029", +"afii10030","afii10031","afii10032","afii10033","afii10034","afii10035", +"afii10036","afii10037","afii10038","afii10039","afii10040","afii10041", +"afii10042","afii10043","afii10044","afii10045","afii10046","afii10047", +"afii10048","afii10049","afii10050","afii10051","afii10052","afii10053", +"afii10054","afii10055","afii10056","afii10057","afii10058","afii10059", +"afii10060","afii10061","afii10062","afii10063","afii10064","afii10065", +"afii10066","afii10067","afii10068","afii10069","afii10070","afii10071", +"afii10072","afii10073","afii10074","afii10075","afii10076","afii10077", +"afii10078","afii10079","afii10080","afii10081","afii10082","afii10083", +"afii10084","afii10085","afii10086","afii10087","afii10088","afii10089", +"afii10090","afii10091","afii10092","afii10093","afii10094","afii10095", +"afii10096","afii10097","afii10098","afii10099","afii10100","afii10101", +"afii10102","afii10103","afii10104","afii10105","afii10106","afii10107", +"afii10108","afii10109","afii10110","afii10145","afii10146","afii10147", +"afii10148","afii10192","afii10193","afii10194","afii10195","afii10196", +"afii10831","afii10832","afii10846","afii299","afii300","afii301","afii57381", +"afii57388","afii57392","afii57393","afii57394","afii57395","afii57396", +"afii57397","afii57398","afii57399","afii57400","afii57401","afii57403", +"afii57407","afii57409","afii57410","afii57411","afii57412","afii57413", +"afii57414","afii57415","afii57416","afii57417","afii57418","afii57419", +"afii57420","afii57421","afii57422","afii57423","afii57424","afii57425", +"afii57426","afii57427","afii57428","afii57429","afii57430","afii57431", +"afii57432","afii57433","afii57434","afii57440","afii57441","afii57442", +"afii57443","afii57444","afii57445","afii57446","afii57448","afii57449", +"afii57450","afii57451","afii57452","afii57453","afii57454","afii57455", +"afii57456","afii57457","afii57458","afii57470","afii57505","afii57506", +"afii57507","afii57508","afii57509","afii57511","afii57512","afii57513", +"afii57514","afii57519","afii57534","afii57636","afii57645","afii57658", +"afii57664","afii57665","afii57666","afii57667","afii57668","afii57669", +"afii57670","afii57671","afii57672","afii57673","afii57674","afii57675", +"afii57676","afii57677","afii57678","afii57679","afii57680","afii57681", +"afii57682","afii57683","afii57684","afii57685","afii57686","afii57687", +"afii57688","afii57689","afii57690","afii57694","afii57695","afii57700", +"afii57705","afii57716","afii57717","afii57718","afii57723","afii57793", +"afii57794","afii57795","afii57796","afii57797","afii57798","afii57799", +"afii57800","afii57801","afii57802","afii57803","afii57804","afii57806", +"afii57807","afii57839","afii57841","afii57842","afii57929","afii61248", +"afii61289","afii61352","afii61573","afii61574","afii61575","afii61664", +"afii63167","afii64937","agrave","agujarati","agurmukhi","ahiragana", +"ahookabove","aibengali","aibopomofo","aideva","aiecyrillic","aigujarati", +"aigurmukhi","aimatragurmukhi","ainarabic","ainfinalarabic", +"aininitialarabic","ainmedialarabic","ainvertedbreve","aivowelsignbengali", +"aivowelsigndeva","aivowelsigngujarati","akatakana","akatakanahalfwidth", +"akorean","alef","alefarabic","alefdageshhebrew","aleffinalarabic", +"alefhamzaabovearabic","alefhamzaabovefinalarabic","alefhamzabelowarabic", +"alefhamzabelowfinalarabic","alefhebrew","aleflamedhebrew", +"alefmaddaabovearabic","alefmaddaabovefinalarabic","alefmaksuraarabic", +"alefmaksurafinalarabic","alefmaksurainitialarabic","alefmaksuramedialarabic", +"alefpatahhebrew","alefqamatshebrew","aleph","allequal","alpha","alphatonos", +"amacron","amonospace","ampersand","ampersandmonospace","ampersandsmall", +"amsquare","anbopomofo","angbopomofo","angkhankhuthai","angle", +"anglebracketleft","anglebracketleftvertical","anglebracketright", +"anglebracketrightvertical","angleleft","angleright","angstrom","anoteleia", +"anudattadeva","anusvarabengali","anusvaradeva","anusvaragujarati","aogonek", +"apaatosquare","aparen","apostrophearmenian","apostrophemod","apple", +"approaches","approxequal","approxequalorimage","approximatelyequal", +"araeaekorean","araeakorean","arc","arighthalfring","aring","aringacute", +"aringbelow","arrowboth","arrowdashdown","arrowdashleft","arrowdashright", +"arrowdashup","arrowdblboth","arrowdbldown","arrowdblleft","arrowdblright", +"arrowdblup","arrowdown","arrowdownleft","arrowdownright","arrowdownwhite", +"arrowheaddownmod","arrowheadleftmod","arrowheadrightmod","arrowheadupmod", +"arrowhorizex","arrowleft","arrowleftdbl","arrowleftdblstroke", +"arrowleftoverright","arrowleftwhite","arrowright","arrowrightdblstroke", +"arrowrightheavy","arrowrightoverleft","arrowrightwhite","arrowtableft", +"arrowtabright","arrowup","arrowupdn","arrowupdnbse","arrowupdownbase", +"arrowupleft","arrowupleftofdown","arrowupright","arrowupwhite","arrowvertex", +"asciicircum","asciicircummonospace","asciitilde","asciitildemonospace", +"ascript","ascriptturned","asmallhiragana","asmallkatakana", +"asmallkatakanahalfwidth","asterisk","asteriskaltonearabic","asteriskarabic", +"asteriskmath","asteriskmonospace","asterisksmall","asterism","asuperior", +"asymptoticallyequal","at","atilde","atmonospace","atsmall","aturned", +"aubengali","aubopomofo","audeva","augujarati","augurmukhi", +"aulengthmarkbengali","aumatragurmukhi","auvowelsignbengali", +"auvowelsigndeva","auvowelsigngujarati","avagrahadeva","aybarmenian","ayin", +"ayinaltonehebrew","ayinhebrew","b","babengali","backslash", +"backslashmonospace","badeva","bagujarati","bagurmukhi","bahiragana", +"bahtthai","bakatakana","bar","barmonospace","bbopomofo","bcircle", +"bdotaccent","bdotbelow","beamedsixteenthnotes","because","becyrillic", +"beharabic","behfinalarabic","behinitialarabic","behiragana", +"behmedialarabic","behmeeminitialarabic","behmeemisolatedarabic", +"behnoonfinalarabic","bekatakana","benarmenian","bet","beta", +"betasymbolgreek","betdagesh","betdageshhebrew","bethebrew","betrafehebrew", +"bhabengali","bhadeva","bhagujarati","bhagurmukhi","bhook","bihiragana", +"bikatakana","bilabialclick","bindigurmukhi","birusquare","blackcircle", +"blackdiamond","blackdownpointingtriangle","blackleftpointingpointer", +"blackleftpointingtriangle","blacklenticularbracketleft", +"blacklenticularbracketleftvertical","blacklenticularbracketright", +"blacklenticularbracketrightvertical","blacklowerlefttriangle", +"blacklowerrighttriangle","blackrectangle","blackrightpointingpointer", +"blackrightpointingtriangle","blacksmallsquare","blacksmilingface", +"blacksquare","blackstar","blackupperlefttriangle","blackupperrighttriangle", +"blackuppointingsmalltriangle","blackuppointingtriangle","blank","blinebelow", +"block","bmonospace","bobaimaithai","bohiragana","bokatakana","bparen", +"bqsquare","braceex","braceleft","braceleftbt","braceleftmid", +"braceleftmonospace","braceleftsmall","bracelefttp","braceleftvertical", +"braceright","bracerightbt","bracerightmid","bracerightmonospace", +"bracerightsmall","bracerighttp","bracerightvertical","bracketleft", +"bracketleftbt","bracketleftex","bracketleftmonospace","bracketlefttp", +"bracketright","bracketrightbt","bracketrightex","bracketrightmonospace", +"bracketrighttp","breve","brevebelowcmb","brevecmb","breveinvertedbelowcmb", +"breveinvertedcmb","breveinverteddoublecmb","bridgebelowcmb", +"bridgeinvertedbelowcmb","brokenbar","bstroke","bsuperior","btopbar", +"buhiragana","bukatakana","bullet","bulletinverse","bulletoperator", +"bullseye","c","caarmenian","cabengali","cacute","cadeva","cagujarati", +"cagurmukhi","calsquare","candrabindubengali","candrabinducmb", +"candrabindudeva","candrabindugujarati","capslock","careof","caron", +"caronbelowcmb","caroncmb","carriagereturn","cbopomofo","ccaron","ccedilla", +"ccedillaacute","ccircle","ccircumflex","ccurl","cdot","cdotaccent", +"cdsquare","cedilla","cedillacmb","cent","centigrade","centinferior", +"centmonospace","centoldstyle","centsuperior","chaarmenian","chabengali", +"chadeva","chagujarati","chagurmukhi","chbopomofo","cheabkhasiancyrillic", +"checkmark","checyrillic","chedescenderabkhasiancyrillic", +"chedescendercyrillic","chedieresiscyrillic","cheharmenian", +"chekhakassiancyrillic","cheverticalstrokecyrillic","chi", +"chieuchacirclekorean","chieuchaparenkorean","chieuchcirclekorean", +"chieuchkorean","chieuchparenkorean","chochangthai","chochanthai", +"chochingthai","chochoethai","chook","cieucacirclekorean","cieucaparenkorean", +"cieuccirclekorean","cieuckorean","cieucparenkorean","cieucuparenkorean", +"circle","circlemultiply","circleot","circleplus","circlepostalmark", +"circlewithlefthalfblack","circlewithrighthalfblack","circumflex", +"circumflexbelowcmb","circumflexcmb","clear","clickalveolar","clickdental", +"clicklateral","clickretroflex","club","clubsuitblack","clubsuitwhite", +"cmcubedsquare","cmonospace","cmsquaredsquare","coarmenian","colon", +"colonmonetary","colonmonospace","colonsign","colonsmall", +"colontriangularhalfmod","colontriangularmod","comma","commaabovecmb", +"commaaboverightcmb","commaaccent","commaarabic","commaarmenian", +"commainferior","commamonospace","commareversedabovecmb","commareversedmod", +"commasmall","commasuperior","commaturnedabovecmb","commaturnedmod","compass", +"congruent","contourintegral","control","controlACK","controlBEL","controlBS", +"controlCAN","controlCR","controlDC1","controlDC2","controlDC3","controlDC4", +"controlDEL","controlDLE","controlEM","controlENQ","controlEOT","controlESC", +"controlETB","controlETX","controlFF","controlFS","controlGS","controlHT", +"controlLF","controlNAK","controlRS","controlSI","controlSO","controlSOT", +"controlSTX","controlSUB","controlSYN","controlUS","controlVT","copyright", +"copyrightsans","copyrightserif","cornerbracketleft", +"cornerbracketlefthalfwidth","cornerbracketleftvertical","cornerbracketright", +"cornerbracketrighthalfwidth","cornerbracketrightvertical", +"corporationsquare","cosquare","coverkgsquare","cparen","cruzeiro", +"cstretched","curlyand","curlyor","currency","cyrBreve","cyrFlex","cyrbreve", +"cyrflex","d","daarmenian","dabengali","dadarabic","dadeva","dadfinalarabic", +"dadinitialarabic","dadmedialarabic","dagesh","dageshhebrew","dagger", +"daggerdbl","dagujarati","dagurmukhi","dahiragana","dakatakana","dalarabic", +"dalet","daletdagesh","daletdageshhebrew","dalethatafpatah", +"dalethatafpatahhebrew","dalethatafsegol","dalethatafsegolhebrew", +"dalethebrew","dalethiriq","dalethiriqhebrew","daletholam","daletholamhebrew", +"daletpatah","daletpatahhebrew","daletqamats","daletqamatshebrew", +"daletqubuts","daletqubutshebrew","daletsegol","daletsegolhebrew", +"daletsheva","daletshevahebrew","dalettsere","dalettserehebrew", +"dalfinalarabic","dammaarabic","dammalowarabic","dammatanaltonearabic", +"dammatanarabic","danda","dargahebrew","dargalefthebrew", +"dasiapneumatacyrilliccmb","dblGrave","dblanglebracketleft", +"dblanglebracketleftvertical","dblanglebracketright", +"dblanglebracketrightvertical","dblarchinvertedbelowcmb","dblarrowleft", +"dblarrowright","dbldanda","dblgrave","dblgravecmb","dblintegral", +"dbllowline","dbllowlinecmb","dbloverlinecmb","dblprimemod","dblverticalbar", +"dblverticallineabovecmb","dbopomofo","dbsquare","dcaron","dcedilla", +"dcircle","dcircumflexbelow","dcroat","ddabengali","ddadeva","ddagujarati", +"ddagurmukhi","ddalarabic","ddalfinalarabic","dddhadeva","ddhabengali", +"ddhadeva","ddhagujarati","ddhagurmukhi","ddotaccent","ddotbelow", +"decimalseparatorarabic","decimalseparatorpersian","decyrillic","degree", +"dehihebrew","dehiragana","deicoptic","dekatakana","deleteleft","deleteright", +"delta","deltaturned","denominatorminusonenumeratorbengali","dezh", +"dhabengali","dhadeva","dhagujarati","dhagurmukhi","dhook","dialytikatonos", +"dialytikatonoscmb","diamond","diamondsuitwhite","dieresis","dieresisacute", +"dieresisbelowcmb","dieresiscmb","dieresisgrave","dieresistonos","dihiragana", +"dikatakana","dittomark","divide","divides","divisionslash","djecyrillic", +"dkshade","dlinebelow","dlsquare","dmacron","dmonospace","dnblock", +"dochadathai","dodekthai","dohiragana","dokatakana","dollar","dollarinferior", +"dollarmonospace","dollaroldstyle","dollarsmall","dollarsuperior","dong", +"dorusquare","dotaccent","dotaccentcmb","dotbelowcmb","dotbelowcomb", +"dotkatakana","dotlessi","dotlessj","dotlessjstrokehook","dotmath", +"dottedcircle","doubleyodpatah","doubleyodpatahhebrew","downtackbelowcmb", +"downtackmod","dparen","dsuperior","dtail","dtopbar","duhiragana", +"dukatakana","dz","dzaltone","dzcaron","dzcurl","dzeabkhasiancyrillic", +"dzecyrillic","dzhecyrillic","e","eacute","earth","ebengali","ebopomofo", +"ebreve","ecandradeva","ecandragujarati","ecandravowelsigndeva", +"ecandravowelsigngujarati","ecaron","ecedillabreve","echarmenian", +"echyiwnarmenian","ecircle","ecircumflex","ecircumflexacute", +"ecircumflexbelow","ecircumflexdotbelow","ecircumflexgrave", +"ecircumflexhookabove","ecircumflextilde","ecyrillic","edblgrave","edeva", +"edieresis","edot","edotaccent","edotbelow","eegurmukhi","eematragurmukhi", +"efcyrillic","egrave","egujarati","eharmenian","ehbopomofo","ehiragana", +"ehookabove","eibopomofo","eight","eightarabic","eightbengali","eightcircle", +"eightcircleinversesansserif","eightdeva","eighteencircle","eighteenparen", +"eighteenperiod","eightgujarati","eightgurmukhi","eighthackarabic", +"eighthangzhou","eighthnotebeamed","eightideographicparen","eightinferior", +"eightmonospace","eightoldstyle","eightparen","eightperiod","eightpersian", +"eightroman","eightsuperior","eightthai","einvertedbreve","eiotifiedcyrillic", +"ekatakana","ekatakanahalfwidth","ekonkargurmukhi","ekorean","elcyrillic", +"element","elevencircle","elevenparen","elevenperiod","elevenroman", +"ellipsis","ellipsisvertical","emacron","emacronacute","emacrongrave", +"emcyrillic","emdash","emdashvertical","emonospace","emphasismarkarmenian", +"emptyset","enbopomofo","encyrillic","endash","endashvertical", +"endescendercyrillic","eng","engbopomofo","enghecyrillic","enhookcyrillic", +"enspace","eogonek","eokorean","eopen","eopenclosed","eopenreversed", +"eopenreversedclosed","eopenreversedhook","eparen","epsilon","epsilontonos", +"equal","equalmonospace","equalsmall","equalsuperior","equivalence", +"erbopomofo","ercyrillic","ereversed","ereversedcyrillic","escyrillic", +"esdescendercyrillic","esh","eshcurl","eshortdeva","eshortvowelsigndeva", +"eshreversedloop","eshsquatreversed","esmallhiragana","esmallkatakana", +"esmallkatakanahalfwidth","estimated","esuperior","eta","etarmenian", +"etatonos","eth","etilde","etildebelow","etnahtafoukhhebrew", +"etnahtafoukhlefthebrew","etnahtahebrew","etnahtalefthebrew","eturned", +"eukorean","euro","evowelsignbengali","evowelsigndeva","evowelsigngujarati", +"exclam","exclamarmenian","exclamdbl","exclamdown","exclamdownsmall", +"exclammonospace","exclamsmall","existential","ezh","ezhcaron","ezhcurl", +"ezhreversed","ezhtail","f","fadeva","fagurmukhi","fahrenheit","fathaarabic", +"fathalowarabic","fathatanarabic","fbopomofo","fcircle","fdotaccent", +"feharabic","feharmenian","fehfinalarabic","fehinitialarabic", +"fehmedialarabic","feicoptic","female","ff","ffi","ffl","fi","fifteencircle", +"fifteenparen","fifteenperiod","figuredash","filledbox","filledrect", +"finalkaf","finalkafdagesh","finalkafdageshhebrew","finalkafhebrew", +"finalkafqamats","finalkafqamatshebrew","finalkafsheva","finalkafshevahebrew", +"finalmem","finalmemhebrew","finalnun","finalnunhebrew","finalpe", +"finalpehebrew","finaltsadi","finaltsadihebrew","firsttonechinese","fisheye", +"fitacyrillic","five","fivearabic","fivebengali","fivecircle", +"fivecircleinversesansserif","fivedeva","fiveeighths","fivegujarati", +"fivegurmukhi","fivehackarabic","fivehangzhou","fiveideographicparen", +"fiveinferior","fivemonospace","fiveoldstyle","fiveparen","fiveperiod", +"fivepersian","fiveroman","fivesuperior","fivethai","fl","florin", +"fmonospace","fmsquare","fofanthai","fofathai","fongmanthai","forall","four", +"fourarabic","fourbengali","fourcircle","fourcircleinversesansserif", +"fourdeva","fourgujarati","fourgurmukhi","fourhackarabic","fourhangzhou", +"fourideographicparen","fourinferior","fourmonospace","fournumeratorbengali", +"fouroldstyle","fourparen","fourperiod","fourpersian","fourroman", +"foursuperior","fourteencircle","fourteenparen","fourteenperiod","fourthai", +"fourthtonechinese","fparen","fraction","franc","g","gabengali","gacute", +"gadeva","gafarabic","gaffinalarabic","gafinitialarabic","gafmedialarabic", +"gagujarati","gagurmukhi","gahiragana","gakatakana","gamma","gammalatinsmall", +"gammasuperior","gangiacoptic","gbopomofo","gbreve","gcaron","gcedilla", +"gcircle","gcircumflex","gcommaaccent","gdot","gdotaccent","gecyrillic", +"gehiragana","gekatakana","geometricallyequal","gereshaccenthebrew", +"gereshhebrew","gereshmuqdamhebrew","germandbls","gershayimaccenthebrew", +"gershayimhebrew","getamark","ghabengali","ghadarmenian","ghadeva", +"ghagujarati","ghagurmukhi","ghainarabic","ghainfinalarabic", +"ghaininitialarabic","ghainmedialarabic","ghemiddlehookcyrillic", +"ghestrokecyrillic","gheupturncyrillic","ghhadeva","ghhagurmukhi","ghook", +"ghzsquare","gihiragana","gikatakana","gimarmenian","gimel","gimeldagesh", +"gimeldageshhebrew","gimelhebrew","gjecyrillic","glottalinvertedstroke", +"glottalstop","glottalstopinverted","glottalstopmod","glottalstopreversed", +"glottalstopreversedmod","glottalstopreversedsuperior","glottalstopstroke", +"glottalstopstrokereversed","gmacron","gmonospace","gohiragana","gokatakana", +"gparen","gpasquare","gradient","grave","gravebelowcmb","gravecmb", +"gravecomb","gravedeva","gravelowmod","gravemonospace","gravetonecmb", +"greater","greaterequal","greaterequalorless","greatermonospace", +"greaterorequivalent","greaterorless","greateroverequal","greatersmall", +"gscript","gstroke","guhiragana","guillemotleft","guillemotright", +"guilsinglleft","guilsinglright","gukatakana","guramusquare","gysquare","h", +"haabkhasiancyrillic","haaltonearabic","habengali","hadescendercyrillic", +"hadeva","hagujarati","hagurmukhi","haharabic","hahfinalarabic", +"hahinitialarabic","hahiragana","hahmedialarabic","haitusquare","hakatakana", +"hakatakanahalfwidth","halantgurmukhi","hamzaarabic","hamzadammaarabic", +"hamzadammatanarabic","hamzafathaarabic","hamzafathatanarabic", +"hamzalowarabic","hamzalowkasraarabic","hamzalowkasratanarabic", +"hamzasukunarabic","hangulfiller","hardsigncyrillic","harpoonleftbarbup", +"harpoonrightbarbup","hasquare","hatafpatah","hatafpatah16","hatafpatah23", +"hatafpatah2f","hatafpatahhebrew","hatafpatahnarrowhebrew", +"hatafpatahquarterhebrew","hatafpatahwidehebrew","hatafqamats", +"hatafqamats1b","hatafqamats28","hatafqamats34","hatafqamatshebrew", +"hatafqamatsnarrowhebrew","hatafqamatsquarterhebrew","hatafqamatswidehebrew", +"hatafsegol","hatafsegol17","hatafsegol24","hatafsegol30","hatafsegolhebrew", +"hatafsegolnarrowhebrew","hatafsegolquarterhebrew","hatafsegolwidehebrew", +"hbar","hbopomofo","hbrevebelow","hcedilla","hcircle","hcircumflex", +"hdieresis","hdotaccent","hdotbelow","he","heart","heartsuitblack", +"heartsuitwhite","hedagesh","hedageshhebrew","hehaltonearabic","heharabic", +"hehebrew","hehfinalaltonearabic","hehfinalalttwoarabic","hehfinalarabic", +"hehhamzaabovefinalarabic","hehhamzaaboveisolatedarabic", +"hehinitialaltonearabic","hehinitialarabic","hehiragana", +"hehmedialaltonearabic","hehmedialarabic","heiseierasquare","hekatakana", +"hekatakanahalfwidth","hekutaarusquare","henghook","herutusquare","het", +"hethebrew","hhook","hhooksuperior","hieuhacirclekorean","hieuhaparenkorean", +"hieuhcirclekorean","hieuhkorean","hieuhparenkorean","hihiragana", +"hikatakana","hikatakanahalfwidth","hiriq","hiriq14","hiriq21","hiriq2d", +"hiriqhebrew","hiriqnarrowhebrew","hiriqquarterhebrew","hiriqwidehebrew", +"hlinebelow","hmonospace","hoarmenian","hohipthai","hohiragana","hokatakana", +"hokatakanahalfwidth","holam","holam19","holam26","holam32","holamhebrew", +"holamnarrowhebrew","holamquarterhebrew","holamwidehebrew","honokhukthai", +"hookabovecomb","hookcmb","hookpalatalizedbelowcmb","hookretroflexbelowcmb", +"hoonsquare","horicoptic","horizontalbar","horncmb","hotsprings","house", +"hparen","hsuperior","hturned","huhiragana","huiitosquare","hukatakana", +"hukatakanahalfwidth","hungarumlaut","hungarumlautcmb","hv","hyphen", +"hypheninferior","hyphenmonospace","hyphensmall","hyphensuperior","hyphentwo", +"i","iacute","iacyrillic","ibengali","ibopomofo","ibreve","icaron","icircle", +"icircumflex","icyrillic","idblgrave","ideographearthcircle", +"ideographfirecircle","ideographicallianceparen","ideographiccallparen", +"ideographiccentrecircle","ideographicclose","ideographiccomma", +"ideographiccommaleft","ideographiccongratulationparen", +"ideographiccorrectcircle","ideographicearthparen", +"ideographicenterpriseparen","ideographicexcellentcircle", +"ideographicfestivalparen","ideographicfinancialcircle", +"ideographicfinancialparen","ideographicfireparen","ideographichaveparen", +"ideographichighcircle","ideographiciterationmark","ideographiclaborcircle", +"ideographiclaborparen","ideographicleftcircle","ideographiclowcircle", +"ideographicmedicinecircle","ideographicmetalparen","ideographicmoonparen", +"ideographicnameparen","ideographicperiod","ideographicprintcircle", +"ideographicreachparen","ideographicrepresentparen", +"ideographicresourceparen","ideographicrightcircle","ideographicsecretcircle", +"ideographicselfparen","ideographicsocietyparen","ideographicspace", +"ideographicspecialparen","ideographicstockparen","ideographicstudyparen", +"ideographicsunparen","ideographicsuperviseparen","ideographicwaterparen", +"ideographicwoodparen","ideographiczero","ideographmetalcircle", +"ideographmooncircle","ideographnamecircle","ideographsuncircle", +"ideographwatercircle","ideographwoodcircle","ideva","idieresis", +"idieresisacute","idieresiscyrillic","idotbelow","iebrevecyrillic", +"iecyrillic","ieungacirclekorean","ieungaparenkorean","ieungcirclekorean", +"ieungkorean","ieungparenkorean","igrave","igujarati","igurmukhi","ihiragana", +"ihookabove","iibengali","iicyrillic","iideva","iigujarati","iigurmukhi", +"iimatragurmukhi","iinvertedbreve","iishortcyrillic","iivowelsignbengali", +"iivowelsigndeva","iivowelsigngujarati","ij","ikatakana","ikatakanahalfwidth", +"ikorean","ilde","iluyhebrew","imacron","imacroncyrillic", +"imageorapproximatelyequal","imatragurmukhi","imonospace","increment", +"infinity","iniarmenian","integral","integralbottom","integralbt", +"integralex","integraltop","integraltp","intersection","intisquare", +"invbullet","invcircle","invsmileface","iocyrillic","iogonek","iota", +"iotadieresis","iotadieresistonos","iotalatin","iotatonos","iparen", +"irigurmukhi","ismallhiragana","ismallkatakana","ismallkatakanahalfwidth", +"issharbengali","istroke","isuperior","iterationhiragana","iterationkatakana", +"itilde","itildebelow","iubopomofo","iucyrillic","ivowelsignbengali", +"ivowelsigndeva","ivowelsigngujarati","izhitsacyrillic", +"izhitsadblgravecyrillic","j","jaarmenian","jabengali","jadeva","jagujarati", +"jagurmukhi","jbopomofo","jcaron","jcircle","jcircumflex","jcrossedtail", +"jdotlessstroke","jecyrillic","jeemarabic","jeemfinalarabic", +"jeeminitialarabic","jeemmedialarabic","jeharabic","jehfinalarabic", +"jhabengali","jhadeva","jhagujarati","jhagurmukhi","jheharmenian","jis", +"jmonospace","jparen","jsuperior","k","kabashkircyrillic","kabengali", +"kacute","kacyrillic","kadescendercyrillic","kadeva","kaf","kafarabic", +"kafdagesh","kafdageshhebrew","kaffinalarabic","kafhebrew","kafinitialarabic", +"kafmedialarabic","kafrafehebrew","kagujarati","kagurmukhi","kahiragana", +"kahookcyrillic","kakatakana","kakatakanahalfwidth","kappa", +"kappasymbolgreek","kapyeounmieumkorean","kapyeounphieuphkorean", +"kapyeounpieupkorean","kapyeounssangpieupkorean","karoriisquare", +"kashidaautoarabic","kashidaautonosidebearingarabic","kasmallkatakana", +"kasquare","kasraarabic","kasratanarabic","kastrokecyrillic", +"katahiraprolongmarkhalfwidth","kaverticalstrokecyrillic","kbopomofo", +"kcalsquare","kcaron","kcedilla","kcircle","kcommaaccent","kdotbelow", +"keharmenian","kehiragana","kekatakana","kekatakanahalfwidth","kenarmenian", +"kesmallkatakana","kgreenlandic","khabengali","khacyrillic","khadeva", +"khagujarati","khagurmukhi","khaharabic","khahfinalarabic", +"khahinitialarabic","khahmedialarabic","kheicoptic","khhadeva","khhagurmukhi", +"khieukhacirclekorean","khieukhaparenkorean","khieukhcirclekorean", +"khieukhkorean","khieukhparenkorean","khokhaithai","khokhonthai", +"khokhuatthai","khokhwaithai","khomutthai","khook","khorakhangthai", +"khzsquare","kihiragana","kikatakana","kikatakanahalfwidth", +"kiroguramusquare","kiromeetorusquare","kirosquare","kiyeokacirclekorean", +"kiyeokaparenkorean","kiyeokcirclekorean","kiyeokkorean","kiyeokparenkorean", +"kiyeoksioskorean","kjecyrillic","klinebelow","klsquare","kmcubedsquare", +"kmonospace","kmsquaredsquare","kohiragana","kohmsquare","kokaithai", +"kokatakana","kokatakanahalfwidth","kooposquare","koppacyrillic", +"koreanstandardsymbol","koroniscmb","kparen","kpasquare","ksicyrillic", +"ktsquare","kturned","kuhiragana","kukatakana","kukatakanahalfwidth", +"kvsquare","kwsquare","l","labengali","lacute","ladeva","lagujarati", +"lagurmukhi","lakkhangyaothai","lamaleffinalarabic", +"lamalefhamzaabovefinalarabic","lamalefhamzaaboveisolatedarabic", +"lamalefhamzabelowfinalarabic","lamalefhamzabelowisolatedarabic", +"lamalefisolatedarabic","lamalefmaddaabovefinalarabic", +"lamalefmaddaaboveisolatedarabic","lamarabic","lambda","lambdastroke","lamed", +"lameddagesh","lameddageshhebrew","lamedhebrew","lamedholam", +"lamedholamdagesh","lamedholamdageshhebrew","lamedholamhebrew", +"lamfinalarabic","lamhahinitialarabic","laminitialarabic", +"lamjeeminitialarabic","lamkhahinitialarabic","lamlamhehisolatedarabic", +"lammedialarabic","lammeemhahinitialarabic","lammeeminitialarabic", +"lammeemjeeminitialarabic","lammeemkhahinitialarabic","largecircle","lbar", +"lbelt","lbopomofo","lcaron","lcedilla","lcircle","lcircumflexbelow", +"lcommaaccent","ldot","ldotaccent","ldotbelow","ldotbelowmacron", +"leftangleabovecmb","lefttackbelowcmb","less","lessequal", +"lessequalorgreater","lessmonospace","lessorequivalent","lessorgreater", +"lessoverequal","lesssmall","lezh","lfblock","lhookretroflex","lira", +"liwnarmenian","lj","ljecyrillic","ll","lladeva","llagujarati","llinebelow", +"llladeva","llvocalicbengali","llvocalicdeva","llvocalicvowelsignbengali", +"llvocalicvowelsigndeva","lmiddletilde","lmonospace","lmsquare","lochulathai", +"logicaland","logicalnot","logicalnotreversed","logicalor","lolingthai", +"longs","lowlinecenterline","lowlinecmb","lowlinedashed","lozenge","lparen", +"lslash","lsquare","lsuperior","ltshade","luthai","lvocalicbengali", +"lvocalicdeva","lvocalicvowelsignbengali","lvocalicvowelsigndeva","lxsquare", +"m","mabengali","macron","macronbelowcmb","macroncmb","macronlowmod", +"macronmonospace","macute","madeva","magujarati","magurmukhi", +"mahapakhhebrew","mahapakhlefthebrew","mahiragana","maichattawalowleftthai", +"maichattawalowrightthai","maichattawathai","maichattawaupperleftthai", +"maieklowleftthai","maieklowrightthai","maiekthai","maiekupperleftthai", +"maihanakatleftthai","maihanakatthai","maitaikhuleftthai","maitaikhuthai", +"maitholowleftthai","maitholowrightthai","maithothai","maithoupperleftthai", +"maitrilowleftthai","maitrilowrightthai","maitrithai","maitriupperleftthai", +"maiyamokthai","makatakana","makatakanahalfwidth","male","mansyonsquare", +"maqafhebrew","mars","masoracirclehebrew","masquare","mbopomofo","mbsquare", +"mcircle","mcubedsquare","mdotaccent","mdotbelow","meemarabic", +"meemfinalarabic","meeminitialarabic","meemmedialarabic", +"meemmeeminitialarabic","meemmeemisolatedarabic","meetorusquare","mehiragana", +"meizierasquare","mekatakana","mekatakanahalfwidth","mem","memdagesh", +"memdageshhebrew","memhebrew","menarmenian","merkhahebrew", +"merkhakefulahebrew","merkhakefulalefthebrew","merkhalefthebrew","mhook", +"mhzsquare","middledotkatakanahalfwidth","middot","mieumacirclekorean", +"mieumaparenkorean","mieumcirclekorean","mieumkorean","mieumpansioskorean", +"mieumparenkorean","mieumpieupkorean","mieumsioskorean","mihiragana", +"mikatakana","mikatakanahalfwidth","minus","minusbelowcmb","minuscircle", +"minusmod","minusplus","minute","miribaarusquare","mirisquare", +"mlonglegturned","mlsquare","mmcubedsquare","mmonospace","mmsquaredsquare", +"mohiragana","mohmsquare","mokatakana","mokatakanahalfwidth","molsquare", +"momathai","moverssquare","moverssquaredsquare","mparen","mpasquare", +"mssquare","msuperior","mturned","mu","mu1","muasquare","muchgreater", +"muchless","mufsquare","mugreek","mugsquare","muhiragana","mukatakana", +"mukatakanahalfwidth","mulsquare","multiply","mumsquare","munahhebrew", +"munahlefthebrew","musicalnote","musicalnotedbl","musicflatsign", +"musicsharpsign","mussquare","muvsquare","muwsquare","mvmegasquare", +"mvsquare","mwmegasquare","mwsquare","n","nabengali","nabla","nacute", +"nadeva","nagujarati","nagurmukhi","nahiragana","nakatakana", +"nakatakanahalfwidth","napostrophe","nasquare","nbopomofo","nbspace","ncaron", +"ncedilla","ncircle","ncircumflexbelow","ncommaaccent","ndotaccent", +"ndotbelow","nehiragana","nekatakana","nekatakanahalfwidth","newsheqelsign", +"nfsquare","ngabengali","ngadeva","ngagujarati","ngagurmukhi","ngonguthai", +"nhiragana","nhookleft","nhookretroflex","nieunacirclekorean", +"nieunaparenkorean","nieuncieuckorean","nieuncirclekorean","nieunhieuhkorean", +"nieunkorean","nieunpansioskorean","nieunparenkorean","nieunsioskorean", +"nieuntikeutkorean","nihiragana","nikatakana","nikatakanahalfwidth", +"nikhahitleftthai","nikhahitthai","nine","ninearabic","ninebengali", +"ninecircle","ninecircleinversesansserif","ninedeva","ninegujarati", +"ninegurmukhi","ninehackarabic","ninehangzhou","nineideographicparen", +"nineinferior","ninemonospace","nineoldstyle","nineparen","nineperiod", +"ninepersian","nineroman","ninesuperior","nineteencircle","nineteenparen", +"nineteenperiod","ninethai","nj","njecyrillic","nkatakana", +"nkatakanahalfwidth","nlegrightlong","nlinebelow","nmonospace","nmsquare", +"nnabengali","nnadeva","nnagujarati","nnagurmukhi","nnnadeva","nohiragana", +"nokatakana","nokatakanahalfwidth","nonbreakingspace","nonenthai","nonuthai", +"noonarabic","noonfinalarabic","noonghunnaarabic","noonghunnafinalarabic", +"noonhehinitialarabic","nooninitialarabic","noonjeeminitialarabic", +"noonjeemisolatedarabic","noonmedialarabic","noonmeeminitialarabic", +"noonmeemisolatedarabic","noonnoonfinalarabic","notcontains","notelement", +"notelementof","notequal","notgreater","notgreaternorequal", +"notgreaternorless","notidentical","notless","notlessnorequal","notparallel", +"notprecedes","notsubset","notsucceeds","notsuperset","nowarmenian","nparen", +"nssquare","nsuperior","ntilde","nu","nuhiragana","nukatakana", +"nukatakanahalfwidth","nuktabengali","nuktadeva","nuktagujarati", +"nuktagurmukhi","numbersign","numbersignmonospace","numbersignsmall", +"numeralsigngreek","numeralsignlowergreek","numero","nun","nundagesh", +"nundageshhebrew","nunhebrew","nvsquare","nwsquare","nyabengali","nyadeva", +"nyagujarati","nyagurmukhi","o","oacute","oangthai","obarred", +"obarredcyrillic","obarreddieresiscyrillic","obengali","obopomofo","obreve", +"ocandradeva","ocandragujarati","ocandravowelsigndeva", +"ocandravowelsigngujarati","ocaron","ocircle","ocircumflex", +"ocircumflexacute","ocircumflexdotbelow","ocircumflexgrave", +"ocircumflexhookabove","ocircumflextilde","ocyrillic","odblacute","odblgrave", +"odeva","odieresis","odieresiscyrillic","odotbelow","oe","oekorean","ogonek", +"ogonekcmb","ograve","ogujarati","oharmenian","ohiragana","ohookabove", +"ohorn","ohornacute","ohorndotbelow","ohorngrave","ohornhookabove", +"ohorntilde","ohungarumlaut","oi","oinvertedbreve","okatakana", +"okatakanahalfwidth","okorean","olehebrew","omacron","omacronacute", +"omacrongrave","omdeva","omega","omega1","omegacyrillic","omegalatinclosed", +"omegaroundcyrillic","omegatitlocyrillic","omegatonos","omgujarati","omicron", +"omicrontonos","omonospace","one","onearabic","onebengali","onecircle", +"onecircleinversesansserif","onedeva","onedotenleader","oneeighth", +"onefitted","onegujarati","onegurmukhi","onehackarabic","onehalf", +"onehangzhou","oneideographicparen","oneinferior","onemonospace", +"onenumeratorbengali","oneoldstyle","oneparen","oneperiod","onepersian", +"onequarter","oneroman","onesuperior","onethai","onethird","oogonek", +"oogonekmacron","oogurmukhi","oomatragurmukhi","oopen","oparen","openbullet", +"option","ordfeminine","ordmasculine","orthogonal","oshortdeva", +"oshortvowelsigndeva","oslash","oslashacute","osmallhiragana", +"osmallkatakana","osmallkatakanahalfwidth","ostrokeacute","osuperior", +"otcyrillic","otilde","otildeacute","otildedieresis","oubopomofo","overline", +"overlinecenterline","overlinecmb","overlinedashed","overlinedblwavy", +"overlinewavy","overscore","ovowelsignbengali","ovowelsigndeva", +"ovowelsigngujarati","p","paampssquare","paasentosquare","pabengali","pacute", +"padeva","pagedown","pageup","pagujarati","pagurmukhi","pahiragana", +"paiyannoithai","pakatakana","palatalizationcyrilliccmb","palochkacyrillic", +"pansioskorean","paragraph","parallel","parenleft","parenleftaltonearabic", +"parenleftbt","parenleftex","parenleftinferior","parenleftmonospace", +"parenleftsmall","parenleftsuperior","parenlefttp","parenleftvertical", +"parenright","parenrightaltonearabic","parenrightbt","parenrightex", +"parenrightinferior","parenrightmonospace","parenrightsmall", +"parenrightsuperior","parenrighttp","parenrightvertical","partialdiff", +"paseqhebrew","pashtahebrew","pasquare","patah","patah11","patah1d","patah2a", +"patahhebrew","patahnarrowhebrew","patahquarterhebrew","patahwidehebrew", +"pazerhebrew","pbopomofo","pcircle","pdotaccent","pe","pecyrillic","pedagesh", +"pedageshhebrew","peezisquare","pefinaldageshhebrew","peharabic", +"peharmenian","pehebrew","pehfinalarabic","pehinitialarabic","pehiragana", +"pehmedialarabic","pekatakana","pemiddlehookcyrillic","perafehebrew", +"percent","percentarabic","percentmonospace","percentsmall","period", +"periodarmenian","periodcentered","periodhalfwidth","periodinferior", +"periodmonospace","periodsmall","periodsuperior","perispomenigreekcmb", +"perpendicular","perthousand","peseta","pfsquare","phabengali","phadeva", +"phagujarati","phagurmukhi","phi","phi1","phieuphacirclekorean", +"phieuphaparenkorean","phieuphcirclekorean","phieuphkorean", +"phieuphparenkorean","philatin","phinthuthai","phisymbolgreek","phook", +"phophanthai","phophungthai","phosamphaothai","pi","pieupacirclekorean", +"pieupaparenkorean","pieupcieuckorean","pieupcirclekorean", +"pieupkiyeokkorean","pieupkorean","pieupparenkorean","pieupsioskiyeokkorean", +"pieupsioskorean","pieupsiostikeutkorean","pieupthieuthkorean", +"pieuptikeutkorean","pihiragana","pikatakana","pisymbolgreek","piwrarmenian", +"plus","plusbelowcmb","pluscircle","plusminus","plusmod","plusmonospace", +"plussmall","plussuperior","pmonospace","pmsquare","pohiragana", +"pointingindexdownwhite","pointingindexleftwhite","pointingindexrightwhite", +"pointingindexupwhite","pokatakana","poplathai","postalmark","postalmarkface", +"pparen","precedes","prescription","primemod","primereversed","product", +"projective","prolongedkana","propellor","propersubset","propersuperset", +"proportion","proportional","psi","psicyrillic","psilipneumatacyrilliccmb", +"pssquare","puhiragana","pukatakana","pvsquare","pwsquare","q","qadeva", +"qadmahebrew","qafarabic","qaffinalarabic","qafinitialarabic", +"qafmedialarabic","qamats","qamats10","qamats1a","qamats1c","qamats27", +"qamats29","qamats33","qamatsde","qamatshebrew","qamatsnarrowhebrew", +"qamatsqatanhebrew","qamatsqatannarrowhebrew","qamatsqatanquarterhebrew", +"qamatsqatanwidehebrew","qamatsquarterhebrew","qamatswidehebrew", +"qarneyparahebrew","qbopomofo","qcircle","qhook","qmonospace","qof", +"qofdagesh","qofdageshhebrew","qofhatafpatah","qofhatafpatahhebrew", +"qofhatafsegol","qofhatafsegolhebrew","qofhebrew","qofhiriq","qofhiriqhebrew", +"qofholam","qofholamhebrew","qofpatah","qofpatahhebrew","qofqamats", +"qofqamatshebrew","qofqubuts","qofqubutshebrew","qofsegol","qofsegolhebrew", +"qofsheva","qofshevahebrew","qoftsere","qoftserehebrew","qparen", +"quarternote","qubuts","qubuts18","qubuts25","qubuts31","qubutshebrew", +"qubutsnarrowhebrew","qubutsquarterhebrew","qubutswidehebrew","question", +"questionarabic","questionarmenian","questiondown","questiondownsmall", +"questiongreek","questionmonospace","questionsmall","quotedbl","quotedblbase", +"quotedblleft","quotedblmonospace","quotedblprime","quotedblprimereversed", +"quotedblright","quoteleft","quoteleftreversed","quotereversed","quoteright", +"quoterightn","quotesinglbase","quotesingle","quotesinglemonospace","r", +"raarmenian","rabengali","racute","radeva","radical","radicalex", +"radoverssquare","radoverssquaredsquare","radsquare","rafe","rafehebrew", +"ragujarati","ragurmukhi","rahiragana","rakatakana","rakatakanahalfwidth", +"ralowerdiagonalbengali","ramiddlediagonalbengali","ramshorn","ratio", +"rbopomofo","rcaron","rcedilla","rcircle","rcommaaccent","rdblgrave", +"rdotaccent","rdotbelow","rdotbelowmacron","referencemark","reflexsubset", +"reflexsuperset","registered","registersans","registerserif","reharabic", +"reharmenian","rehfinalarabic","rehiragana","rehyehaleflamarabic", +"rekatakana","rekatakanahalfwidth","resh","reshdageshhebrew","reshhatafpatah", +"reshhatafpatahhebrew","reshhatafsegol","reshhatafsegolhebrew","reshhebrew", +"reshhiriq","reshhiriqhebrew","reshholam","reshholamhebrew","reshpatah", +"reshpatahhebrew","reshqamats","reshqamatshebrew","reshqubuts", +"reshqubutshebrew","reshsegol","reshsegolhebrew","reshsheva", +"reshshevahebrew","reshtsere","reshtserehebrew","reversedtilde","reviahebrew", +"reviamugrashhebrew","revlogicalnot","rfishhook","rfishhookreversed", +"rhabengali","rhadeva","rho","rhook","rhookturned","rhookturnedsuperior", +"rhosymbolgreek","rhotichookmod","rieulacirclekorean","rieulaparenkorean", +"rieulcirclekorean","rieulhieuhkorean","rieulkiyeokkorean", +"rieulkiyeoksioskorean","rieulkorean","rieulmieumkorean","rieulpansioskorean", +"rieulparenkorean","rieulphieuphkorean","rieulpieupkorean", +"rieulpieupsioskorean","rieulsioskorean","rieulthieuthkorean", +"rieultikeutkorean","rieulyeorinhieuhkorean","rightangle","righttackbelowcmb", +"righttriangle","rihiragana","rikatakana","rikatakanahalfwidth","ring", +"ringbelowcmb","ringcmb","ringhalfleft","ringhalfleftarmenian", +"ringhalfleftbelowcmb","ringhalfleftcentered","ringhalfright", +"ringhalfrightbelowcmb","ringhalfrightcentered","rinvertedbreve", +"rittorusquare","rlinebelow","rlongleg","rlonglegturned","rmonospace", +"rohiragana","rokatakana","rokatakanahalfwidth","roruathai","rparen", +"rrabengali","rradeva","rragurmukhi","rreharabic","rrehfinalarabic", +"rrvocalicbengali","rrvocalicdeva","rrvocalicgujarati", +"rrvocalicvowelsignbengali","rrvocalicvowelsigndeva", +"rrvocalicvowelsigngujarati","rsuperior","rtblock","rturned", +"rturnedsuperior","ruhiragana","rukatakana","rukatakanahalfwidth", +"rupeemarkbengali","rupeesignbengali","rupiah","ruthai","rvocalicbengali", +"rvocalicdeva","rvocalicgujarati","rvocalicvowelsignbengali", +"rvocalicvowelsigndeva","rvocalicvowelsigngujarati","s","sabengali","sacute", +"sacutedotaccent","sadarabic","sadeva","sadfinalarabic","sadinitialarabic", +"sadmedialarabic","sagujarati","sagurmukhi","sahiragana","sakatakana", +"sakatakanahalfwidth","sallallahoualayhewasallamarabic","samekh", +"samekhdagesh","samekhdageshhebrew","samekhhebrew","saraaathai","saraaethai", +"saraaimaimalaithai","saraaimaimuanthai","saraamthai","saraathai","saraethai", +"saraiileftthai","saraiithai","saraileftthai","saraithai","saraothai", +"saraueeleftthai","saraueethai","saraueleftthai","sarauethai","sarauthai", +"sarauuthai","sbopomofo","scaron","scarondotaccent","scedilla","schwa", +"schwacyrillic","schwadieresiscyrillic","schwahook","scircle","scircumflex", +"scommaaccent","sdotaccent","sdotbelow","sdotbelowdotaccent", +"seagullbelowcmb","second","secondtonechinese","section","seenarabic", +"seenfinalarabic","seeninitialarabic","seenmedialarabic","segol","segol13", +"segol1f","segol2c","segolhebrew","segolnarrowhebrew","segolquarterhebrew", +"segoltahebrew","segolwidehebrew","seharmenian","sehiragana","sekatakana", +"sekatakanahalfwidth","semicolon","semicolonarabic","semicolonmonospace", +"semicolonsmall","semivoicedmarkkana","semivoicedmarkkanahalfwidth", +"sentisquare","sentosquare","seven","sevenarabic","sevenbengali", +"sevencircle","sevencircleinversesansserif","sevendeva","seveneighths", +"sevengujarati","sevengurmukhi","sevenhackarabic","sevenhangzhou", +"sevenideographicparen","seveninferior","sevenmonospace","sevenoldstyle", +"sevenparen","sevenperiod","sevenpersian","sevenroman","sevensuperior", +"seventeencircle","seventeenparen","seventeenperiod","seventhai","sfthyphen", +"shaarmenian","shabengali","shacyrillic","shaddaarabic","shaddadammaarabic", +"shaddadammatanarabic","shaddafathaarabic","shaddafathatanarabic", +"shaddakasraarabic","shaddakasratanarabic","shade","shadedark","shadelight", +"shademedium","shadeva","shagujarati","shagurmukhi","shalshelethebrew", +"shbopomofo","shchacyrillic","sheenarabic","sheenfinalarabic", +"sheeninitialarabic","sheenmedialarabic","sheicoptic","sheqel","sheqelhebrew", +"sheva","sheva115","sheva15","sheva22","sheva2e","shevahebrew", +"shevanarrowhebrew","shevaquarterhebrew","shevawidehebrew","shhacyrillic", +"shimacoptic","shin","shindagesh","shindageshhebrew","shindageshshindot", +"shindageshshindothebrew","shindageshsindot","shindageshsindothebrew", +"shindothebrew","shinhebrew","shinshindot","shinshindothebrew","shinsindot", +"shinsindothebrew","shook","sigma","sigma1","sigmafinal", +"sigmalunatesymbolgreek","sihiragana","sikatakana","sikatakanahalfwidth", +"siluqhebrew","siluqlefthebrew","similar","sindothebrew","siosacirclekorean", +"siosaparenkorean","sioscieuckorean","sioscirclekorean","sioskiyeokkorean", +"sioskorean","siosnieunkorean","siosparenkorean","siospieupkorean", +"siostikeutkorean","six","sixarabic","sixbengali","sixcircle", +"sixcircleinversesansserif","sixdeva","sixgujarati","sixgurmukhi", +"sixhackarabic","sixhangzhou","sixideographicparen","sixinferior", +"sixmonospace","sixoldstyle","sixparen","sixperiod","sixpersian","sixroman", +"sixsuperior","sixteencircle","sixteencurrencydenominatorbengali", +"sixteenparen","sixteenperiod","sixthai","slash","slashmonospace","slong", +"slongdotaccent","smileface","smonospace","sofpasuqhebrew","softhyphen", +"softsigncyrillic","sohiragana","sokatakana","sokatakanahalfwidth", +"soliduslongoverlaycmb","solidusshortoverlaycmb","sorusithai","sosalathai", +"sosothai","sosuathai","space","spacehackarabic","spade","spadesuitblack", +"spadesuitwhite","sparen","squarebelowcmb","squarecc","squarecm", +"squarediagonalcrosshatchfill","squarehorizontalfill","squarekg","squarekm", +"squarekmcapital","squareln","squarelog","squaremg","squaremil","squaremm", +"squaremsquared","squareorthogonalcrosshatchfill", +"squareupperlefttolowerrightfill","squareupperrighttolowerleftfill", +"squareverticalfill","squarewhitewithsmallblack","srsquare","ssabengali", +"ssadeva","ssagujarati","ssangcieuckorean","ssanghieuhkorean", +"ssangieungkorean","ssangkiyeokkorean","ssangnieunkorean","ssangpieupkorean", +"ssangsioskorean","ssangtikeutkorean","ssuperior","sterling", +"sterlingmonospace","strokelongoverlaycmb","strokeshortoverlaycmb","subset", +"subsetnotequal","subsetorequal","succeeds","suchthat","suhiragana", +"sukatakana","sukatakanahalfwidth","sukunarabic","summation","sun","superset", +"supersetnotequal","supersetorequal","svsquare","syouwaerasquare","t", +"tabengali","tackdown","tackleft","tadeva","tagujarati","tagurmukhi", +"taharabic","tahfinalarabic","tahinitialarabic","tahiragana", +"tahmedialarabic","taisyouerasquare","takatakana","takatakanahalfwidth", +"tatweelarabic","tau","tav","tavdages","tavdagesh","tavdageshhebrew", +"tavhebrew","tbar","tbopomofo","tcaron","tccurl","tcedilla","tcheharabic", +"tchehfinalarabic","tchehinitialarabic","tchehmedialarabic", +"tchehmeeminitialarabic","tcircle","tcircumflexbelow","tcommaaccent", +"tdieresis","tdotaccent","tdotbelow","tecyrillic","tedescendercyrillic", +"teharabic","tehfinalarabic","tehhahinitialarabic","tehhahisolatedarabic", +"tehinitialarabic","tehiragana","tehjeeminitialarabic", +"tehjeemisolatedarabic","tehmarbutaarabic","tehmarbutafinalarabic", +"tehmedialarabic","tehmeeminitialarabic","tehmeemisolatedarabic", +"tehnoonfinalarabic","tekatakana","tekatakanahalfwidth","telephone", +"telephoneblack","telishagedolahebrew","telishaqetanahebrew","tencircle", +"tenideographicparen","tenparen","tenperiod","tenroman","tesh","tet", +"tetdagesh","tetdageshhebrew","tethebrew","tetsecyrillic","tevirhebrew", +"tevirlefthebrew","thabengali","thadeva","thagujarati","thagurmukhi", +"thalarabic","thalfinalarabic","thanthakhatlowleftthai", +"thanthakhatlowrightthai","thanthakhatthai","thanthakhatupperleftthai", +"theharabic","thehfinalarabic","thehinitialarabic","thehmedialarabic", +"thereexists","therefore","theta","theta1","thetasymbolgreek", +"thieuthacirclekorean","thieuthaparenkorean","thieuthcirclekorean", +"thieuthkorean","thieuthparenkorean","thirteencircle","thirteenparen", +"thirteenperiod","thonangmonthothai","thook","thophuthaothai","thorn", +"thothahanthai","thothanthai","thothongthai","thothungthai", +"thousandcyrillic","thousandsseparatorarabic","thousandsseparatorpersian", +"three","threearabic","threebengali","threecircle", +"threecircleinversesansserif","threedeva","threeeighths","threegujarati", +"threegurmukhi","threehackarabic","threehangzhou","threeideographicparen", +"threeinferior","threemonospace","threenumeratorbengali","threeoldstyle", +"threeparen","threeperiod","threepersian","threequarters", +"threequartersemdash","threeroman","threesuperior","threethai","thzsquare", +"tihiragana","tikatakana","tikatakanahalfwidth","tikeutacirclekorean", +"tikeutaparenkorean","tikeutcirclekorean","tikeutkorean","tikeutparenkorean", +"tilde","tildebelowcmb","tildecmb","tildecomb","tildedoublecmb", +"tildeoperator","tildeoverlaycmb","tildeverticalcmb","timescircle", +"tipehahebrew","tipehalefthebrew","tippigurmukhi","titlocyrilliccmb", +"tiwnarmenian","tlinebelow","tmonospace","toarmenian","tohiragana", +"tokatakana","tokatakanahalfwidth","tonebarextrahighmod","tonebarextralowmod", +"tonebarhighmod","tonebarlowmod","tonebarmidmod","tonefive","tonesix", +"tonetwo","tonos","tonsquare","topatakthai","tortoiseshellbracketleft", +"tortoiseshellbracketleftsmall","tortoiseshellbracketleftvertical", +"tortoiseshellbracketright","tortoiseshellbracketrightsmall", +"tortoiseshellbracketrightvertical","totaothai","tpalatalhook","tparen", +"trademark","trademarksans","trademarkserif","tretroflexhook","triagdn", +"triaglf","triagrt","triagup","ts","tsadi","tsadidagesh","tsadidageshhebrew", +"tsadihebrew","tsecyrillic","tsere","tsere12","tsere1e","tsere2b", +"tserehebrew","tserenarrowhebrew","tserequarterhebrew","tserewidehebrew", +"tshecyrillic","tsuperior","ttabengali","ttadeva","ttagujarati","ttagurmukhi", +"tteharabic","ttehfinalarabic","ttehinitialarabic","ttehmedialarabic", +"tthabengali","tthadeva","tthagujarati","tthagurmukhi","tturned","tuhiragana", +"tukatakana","tukatakanahalfwidth","tusmallhiragana","tusmallkatakana", +"tusmallkatakanahalfwidth","twelvecircle","twelveparen","twelveperiod", +"twelveroman","twentycircle","twentyhangzhou","twentyparen","twentyperiod", +"two","twoarabic","twobengali","twocircle","twocircleinversesansserif", +"twodeva","twodotenleader","twodotleader","twodotleadervertical", +"twogujarati","twogurmukhi","twohackarabic","twohangzhou", +"twoideographicparen","twoinferior","twomonospace","twonumeratorbengali", +"twooldstyle","twoparen","twoperiod","twopersian","tworoman","twostroke", +"twosuperior","twothai","twothirds","u","uacute","ubar","ubengali", +"ubopomofo","ubreve","ucaron","ucircle","ucircumflex","ucircumflexbelow", +"ucyrillic","udattadeva","udblacute","udblgrave","udeva","udieresis", +"udieresisacute","udieresisbelow","udieresiscaron","udieresiscyrillic", +"udieresisgrave","udieresismacron","udotbelow","ugrave","ugujarati", +"ugurmukhi","uhiragana","uhookabove","uhorn","uhornacute","uhorndotbelow", +"uhorngrave","uhornhookabove","uhorntilde","uhungarumlaut", +"uhungarumlautcyrillic","uinvertedbreve","ukatakana","ukatakanahalfwidth", +"ukcyrillic","ukorean","umacron","umacroncyrillic","umacrondieresis", +"umatragurmukhi","umonospace","underscore","underscoredbl", +"underscoremonospace","underscorevertical","underscorewavy","union", +"universal","uogonek","uparen","upblock","upperdothebrew","upsilon", +"upsilondieresis","upsilondieresistonos","upsilonlatin","upsilontonos", +"uptackbelowcmb","uptackmod","uragurmukhi","uring","ushortcyrillic", +"usmallhiragana","usmallkatakana","usmallkatakanahalfwidth", +"ustraightcyrillic","ustraightstrokecyrillic","utilde","utildeacute", +"utildebelow","uubengali","uudeva","uugujarati","uugurmukhi", +"uumatragurmukhi","uuvowelsignbengali","uuvowelsigndeva", +"uuvowelsigngujarati","uvowelsignbengali","uvowelsigndeva", +"uvowelsigngujarati","v","vadeva","vagujarati","vagurmukhi","vakatakana", +"vav","vavdagesh","vavdagesh65","vavdageshhebrew","vavhebrew","vavholam", +"vavholamhebrew","vavvavhebrew","vavyodhebrew","vcircle","vdotbelow", +"vecyrillic","veharabic","vehfinalarabic","vehinitialarabic", +"vehmedialarabic","vekatakana","venus","verticalbar","verticallineabovecmb", +"verticallinebelowcmb","verticallinelowmod","verticallinemod","vewarmenian", +"vhook","vikatakana","viramabengali","viramadeva","viramagujarati", +"visargabengali","visargadeva","visargagujarati","vmonospace","voarmenian", +"voicediterationhiragana","voicediterationkatakana","voicedmarkkana", +"voicedmarkkanahalfwidth","vokatakana","vparen","vtilde","vturned", +"vuhiragana","vukatakana","w","wacute","waekorean","wahiragana","wakatakana", +"wakatakanahalfwidth","wakorean","wasmallhiragana","wasmallkatakana", +"wattosquare","wavedash","wavyunderscorevertical","wawarabic", +"wawfinalarabic","wawhamzaabovearabic","wawhamzaabovefinalarabic","wbsquare", +"wcircle","wcircumflex","wdieresis","wdotaccent","wdotbelow","wehiragana", +"weierstrass","wekatakana","wekorean","weokorean","wgrave","whitebullet", +"whitecircle","whitecircleinverse","whitecornerbracketleft", +"whitecornerbracketleftvertical","whitecornerbracketright", +"whitecornerbracketrightvertical","whitediamond", +"whitediamondcontainingblacksmalldiamond","whitedownpointingsmalltriangle", +"whitedownpointingtriangle","whiteleftpointingsmalltriangle", +"whiteleftpointingtriangle","whitelenticularbracketleft", +"whitelenticularbracketright","whiterightpointingsmalltriangle", +"whiterightpointingtriangle","whitesmallsquare","whitesmilingface", +"whitesquare","whitestar","whitetelephone","whitetortoiseshellbracketleft", +"whitetortoiseshellbracketright","whiteuppointingsmalltriangle", +"whiteuppointingtriangle","wihiragana","wikatakana","wikorean","wmonospace", +"wohiragana","wokatakana","wokatakanahalfwidth","won","wonmonospace", +"wowaenthai","wparen","wring","wsuperior","wturned","wynn","x","xabovecmb", +"xbopomofo","xcircle","xdieresis","xdotaccent","xeharmenian","xi", +"xmonospace","xparen","xsuperior","y","yaadosquare","yabengali","yacute", +"yadeva","yaekorean","yagujarati","yagurmukhi","yahiragana","yakatakana", +"yakatakanahalfwidth","yakorean","yamakkanthai","yasmallhiragana", +"yasmallkatakana","yasmallkatakanahalfwidth","yatcyrillic","ycircle", +"ycircumflex","ydieresis","ydotaccent","ydotbelow","yeharabic", +"yehbarreearabic","yehbarreefinalarabic","yehfinalarabic", +"yehhamzaabovearabic","yehhamzaabovefinalarabic","yehhamzaaboveinitialarabic", +"yehhamzaabovemedialarabic","yehinitialarabic","yehmedialarabic", +"yehmeeminitialarabic","yehmeemisolatedarabic","yehnoonfinalarabic", +"yehthreedotsbelowarabic","yekorean","yen","yenmonospace","yeokorean", +"yeorinhieuhkorean","yerahbenyomohebrew","yerahbenyomolefthebrew", +"yericyrillic","yerudieresiscyrillic","yesieungkorean", +"yesieungpansioskorean","yesieungsioskorean","yetivhebrew","ygrave","yhook", +"yhookabove","yiarmenian","yicyrillic","yikorean","yinyang","yiwnarmenian", +"ymonospace","yod","yoddagesh","yoddageshhebrew","yodhebrew","yodyodhebrew", +"yodyodpatahhebrew","yohiragana","yoikorean","yokatakana", +"yokatakanahalfwidth","yokorean","yosmallhiragana","yosmallkatakana", +"yosmallkatakanahalfwidth","yotgreek","yoyaekorean","yoyakorean","yoyakthai", +"yoyingthai","yparen","ypogegrammeni","ypogegrammenigreekcmb","yr","yring", +"ysuperior","ytilde","yturned","yuhiragana","yuikorean","yukatakana", +"yukatakanahalfwidth","yukorean","yusbigcyrillic","yusbigiotifiedcyrillic", +"yuslittlecyrillic","yuslittleiotifiedcyrillic","yusmallhiragana", +"yusmallkatakana","yusmallkatakanahalfwidth","yuyekorean","yuyeokorean", +"yyabengali","yyadeva","z","zaarmenian","zacute","zadeva","zagurmukhi", +"zaharabic","zahfinalarabic","zahinitialarabic","zahiragana", +"zahmedialarabic","zainarabic","zainfinalarabic","zakatakana", +"zaqefgadolhebrew","zaqefqatanhebrew","zarqahebrew","zayin","zayindagesh", +"zayindageshhebrew","zayinhebrew","zbopomofo","zcaron","zcircle", +"zcircumflex","zcurl","zdot","zdotaccent","zdotbelow","zecyrillic", +"zedescendercyrillic","zedieresiscyrillic","zehiragana","zekatakana","zero", +"zeroarabic","zerobengali","zerodeva","zerogujarati","zerogurmukhi", +"zerohackarabic","zeroinferior","zeromonospace","zerooldstyle","zeropersian", +"zerosuperior","zerothai","zerowidthjoiner","zerowidthnonjoiner", +"zerowidthspace","zeta","zhbopomofo","zhearmenian","zhebrevecyrillic", +"zhecyrillic","zhedescendercyrillic","zhedieresiscyrillic","zihiragana", +"zikatakana","zinorhebrew","zlinebelow","zmonospace","zohiragana", +"zokatakana","zparen","zretroflexhook","zstroke","zuhiragana","zukatakana", +}; + +static const unsigned short agl_code_list[] = { +65,198,508,482,63462,193,63457,258,7854,1232,7862,7856,7858,7860,461,9398,194, +7844,7852,7846,7848,63458,7850,63177,63412,1040,512,196,1234,478,63460,7840, +480,192,63456,7842,1236,514,913,902,256,65313,260,197,506,7680,63461,63329, +195,63459,1329,66,9399,7682,7684,1041,1330,914,385,7686,65314,63220,63330,386, +67,1342,262,63178,63221,268,199,7688,63463,9400,264,266,266,63416,1353,1212, +1063,1214,1206,1268,1347,1227,1208,935,391,63222,65315,1361,63331,68,497,452, +1332,393,270,7696,9401,7698,272,7690,7692,1044,1006,8710,916,394,63179,63180, +63181,63400,988,1026,7694,65316,63223,272,63332,395,498,453,1248,1029,1039,69, +201,63465,276,282,7708,1333,9402,202,7870,7704,7878,7872,7874,63466,7876,1028, +516,203,63467,278,278,7864,1060,200,63464,1335,7866,8551,518,1124,1051,8554, +274,7702,7700,1052,65317,1053,1186,330,1188,1223,280,400,917,904,1056,398, +1069,1057,1194,425,63333,919,1336,905,208,63472,7868,7706,8364,439,494,440,70, +9403,7710,1366,996,401,1138,8548,65318,8547,63334,71,13191,500,915,404,1002, +286,486,290,9404,284,290,288,288,1043,1346,1172,1170,1168,403,1331,1027,7712, +65319,63182,63328,63335,667,484,72,9679,9642,9643,9633,13259,1192,1202,1066, +294,7722,7720,9405,292,7718,7714,7716,65320,1344,1000,63336,63183,63224,13200, +73,1071,306,1070,205,63469,300,463,9406,206,63470,1030,520,207,7726,1252, +63471,304,304,7882,1238,1045,8465,204,63468,7880,1048,522,1049,298,1250,65321, +1339,1025,302,921,406,938,906,63337,407,296,7724,1140,1142,74,1345,9407,308, +1032,1355,65322,63338,75,13189,13261,1184,7728,1050,1178,1219,922,1182,1180, +488,310,9408,310,7730,1364,1343,1061,998,408,1036,7732,65323,1152,990,1134, +63339,76,455,63167,313,923,317,315,9409,7740,315,319,319,7734,7736,1340,456, +1033,7738,65324,321,63225,63340,77,13190,63184,63407,7742,9410,7744,7746,1348, +65325,63341,412,924,78,458,323,327,325,9411,7754,325,7748,7750,413,8552,459, +1034,7752,65326,1350,63342,209,63473,925,79,338,63226,211,63475,1256,1258,334, +465,415,9412,212,7888,7896,7890,7892,63476,7894,1054,336,524,214,1254,63478, +7884,63227,210,63474,1365,8486,7886,416,7898,7906,7900,7902,7904,336,418,526, +332,7762,7760,8486,1120,937,1146,1148,911,927,908,65327,8544,490,492,390,216, +510,63480,63343,510,1150,213,7756,7758,63477,80,7764,9413,7766,1055,1354,1190, +934,420,928,1363,65328,936,1136,63344,81,9414,65329,63345,82,1356,340,344,342, +9415,342,528,7768,7770,7772,1360,8476,929,63228,530,7774,65330,63346,641,694, +83,9484,9492,9488,9496,9532,9516,9524,9500,9508,9472,9474,9569,9570,9558,9557, +9571,9553,9559,9565,9564,9563,9566,9567,9562,9556,9577,9574,9568,9552,9580, +9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,346,7780,992,352,7782,63229, +350,399,1240,1242,9416,348,536,7776,7778,7784,1357,8550,1351,1064,1065,994, +1210,1004,931,8549,65331,1068,63347,986,84,932,358,356,354,9417,7792,354,7786, +7788,1058,1196,8553,1204,920,428,222,63486,8546,63230,1359,7790,65332,1337, +444,388,423,430,1062,1035,63348,8555,8545,85,218,63482,364,467,9418,219,7798, +63483,1059,368,532,220,471,7794,473,1264,475,469,63484,7908,217,63481,7910, +431,7912,7920,7914,7916,7918,368,1266,534,1144,362,1262,7802,65333,370,933, +978,979,433,939,980,978,910,366,1038,63349,1198,1200,360,7800,7796,86,9419, +7806,1042,1358,434,65334,1352,63350,7804,87,7810,9420,372,7812,7814,7816,7808, +65335,63351,88,9421,7820,7818,1341,926,65336,63352,89,221,63485,1122,9422,374, +376,63487,7822,7924,1067,1272,7922,435,7926,1349,1031,1362,65337,63353,7928, +1130,1132,1126,1128,90,1334,377,381,63231,9423,7824,379,379,7826,1047,1176, +1246,918,1338,1217,1046,1174,1244,7828,65338,63354,437,97,2438,225,2310,2694, +2566,2622,13059,2494,2366,2750,1375,2416,2437,12570,259,7855,1233,7863,7857, +7859,7861,462,9424,226,7845,7853,7847,7849,7851,180,791,769,769,2388,719,833, +1072,513,2673,2309,228,1235,479,7841,481,230,509,12624,483,8213,8356,1040, +1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054, +1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069, +1070,1071,1168,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038, +63172,63173,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083, +1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098, +1099,1100,1101,1102,1103,1169,1106,1107,1108,1109,1110,1111,1112,1113,1114, +1115,1116,1118,1039,1122,1138,1140,63174,1119,1123,1139,1141,63175,63176,1241, +8206,8207,8205,1642,1548,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641, +1563,1567,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581, +1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1600,1601, +1602,1603,1604,1605,1606,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617, +1618,1607,1700,1662,1670,1688,1711,1657,1672,1681,1722,1746,1749,8362,1470, +1475,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501, +1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,64298,64299, +64331,64287,1520,1521,1522,64309,1460,1461,1462,1467,1464,1463,1456,1458,1457, +1459,1474,1473,1465,1468,1469,1471,1472,700,8453,8467,8470,8236,8237,8238, +8204,1645,701,224,2693,2565,12354,7843,2448,12574,2320,1237,2704,2576,2632, +1593,65226,65227,65228,515,2504,2376,2760,12450,65393,12623,1488,1575,64304, +65166,1571,65156,1573,65160,1488,64335,1570,65154,1609,65264,65267,65268, +64302,64303,8501,8780,945,940,257,65345,38,65286,63270,13250,12578,12580,3674, +8736,12296,65087,12297,65088,9001,9002,8491,903,2386,2434,2306,2690,261,13056, +9372,1370,700,63743,8784,8776,8786,8773,12686,12685,8978,7834,229,507,7681, +8596,8675,8672,8674,8673,8660,8659,8656,8658,8657,8595,8601,8600,8681,709,706, +707,708,63719,8592,8656,8653,8646,8678,8594,8655,10142,8644,8680,8676,8677, +8593,8597,8616,8616,8598,8645,8599,8679,63718,94,65342,126,65374,593,594, +12353,12449,65383,42,1645,1645,8727,65290,65121,8258,63209,8771,64,227,65312, +65131,592,2452,12576,2324,2708,2580,2519,2636,2508,2380,2764,2365,1377,1506, +64288,1506,98,2476,92,65340,2348,2732,2604,12400,3647,12496,124,65372,12549, +9425,7683,7685,9836,8757,1073,1576,65168,65169,12409,65170,64671,64520,64621, +12505,1378,1489,946,976,64305,64305,1489,64332,2477,2349,2733,2605,595,12403, +12499,664,2562,13105,9679,9670,9660,9668,9664,12304,65083,12305,65084,9699, +9698,9644,9658,9654,9642,9787,9632,9733,9700,9701,9652,9650,9251,7687,9608, +65346,3610,12412,12508,9373,13251,63732,123,63731,63730,65371,65115,63729, +65079,125,63742,63741,65373,65116,63740,65080,91,63728,63727,65339,63726,93, +63739,63738,65341,63737,728,814,774,815,785,865,810,826,166,384,63210,387, +12406,12502,8226,9688,8729,9678,99,1390,2458,263,2330,2714,2586,13192,2433, +784,2305,2689,8682,8453,711,812,780,8629,12568,269,231,7689,9426,265,597,267, +267,13253,184,807,162,8451,63199,65504,63394,63200,1401,2459,2331,2715,2587, +12564,1213,10003,1095,1215,1207,1269,1395,1228,1209,967,12919,12823,12905, +12618,12809,3594,3592,3593,3596,392,12918,12822,12904,12616,12808,12828,9675, +8855,8857,8853,12342,9680,9681,710,813,770,8999,450,448,449,451,9827,9827, +9831,13220,65347,13216,1409,58,8353,65306,8353,65109,721,720,44,787,789,63171, +1548,1373,63201,65292,788,701,65104,63202,786,699,9788,8773,8750,8963,6,7,8, +24,13,17,18,19,20,127,16,25,5,4,27,23,3,12,28,29,9,10,21,30,15,14,2,1,26,22, +31,11,169,63721,63193,12300,65378,65089,12301,65379,65090,13183,13255,13254, +9374,8354,663,8911,8910,164,63185,63186,63188,63189,100,1380,2470,1590,2342, +65214,65215,65216,1468,1468,8224,8225,2726,2598,12384,12480,1583,1491,64307, +64307,1491,1491,1491,1491,1491,1491,1491,1491,1491,1491,1491,1491,1491,1491, +1491,1491,1491,1491,1491,1491,1491,65194,1615,1615,1612,1612,2404,1447,1447, +1157,63187,12298,65085,12299,65086,811,8660,8658,2405,63190,783,8748,8215,819, +831,698,8214,782,12553,13256,271,7697,9427,7699,273,2465,2337,2721,2593,1672, +64393,2396,2466,2338,2722,2594,7691,7693,1643,1643,1076,176,1453,12391,1007, +12487,9003,8998,948,397,2552,676,2471,2343,2727,2599,599,901,836,9830,9826, +168,63191,804,776,63192,901,12386,12482,12291,247,8739,8725,1106,9619,7695, +13207,273,65348,9604,3598,3604,12393,12489,36,63203,65284,63268,65129,63204, +8363,13094,729,775,803,803,12539,305,63166,644,8901,9676,64287,64287,798,725, +9375,63211,598,396,12389,12485,499,675,454,677,1249,1109,1119,101,233,9793, +2447,12572,277,2317,2701,2373,2757,283,7709,1381,1415,9428,234,7871,7705,7879, +7873,7875,7877,1108,517,2319,235,279,279,7865,2575,2631,1092,232,2703,1383, +12573,12360,7867,12575,56,1640,2542,9319,10129,2414,9329,9349,9369,2798,2670, +1640,12328,9835,12839,8328,65304,63288,9339,9359,1784,8567,8312,3672,519,1125, +12456,65396,2676,12628,1083,8712,9322,9342,9362,8570,8230,8942,275,7703,7701, +1084,8212,65073,65349,1371,8709,12579,1085,8211,65074,1187,331,12581,1189, +1224,8194,281,12627,603,666,604,606,605,9376,949,941,61,65309,65126,8316,8801, +12582,1088,600,1101,1089,1195,643,646,2318,2374,426,645,12359,12455,65386, +8494,63212,951,1384,942,240,7869,7707,1425,1425,1425,1425,477,12641,8364,2503, +2375,2759,33,1372,8252,161,63393,65281,63265,8707,658,495,659,441,442,102, +2398,2654,8457,1614,1614,1611,12552,9429,7711,1601,1414,65234,65235,65236,997, +9792,64256,64259,64260,64257,9326,9346,9366,8210,9632,9644,1498,64314,64314, +1498,1498,1498,1498,1498,1501,1501,1503,1503,1507,1507,1509,1509,713,9673, +1139,53,1637,2539,9316,10126,2411,8541,2795,2667,1637,12325,12836,8325,65301, +63285,9336,9356,1781,8564,8309,3669,64258,402,65350,13209,3615,3613,3663,8704, +52,1636,2538,9315,10125,2410,2794,2666,1636,12324,12835,8324,65300,2551,63284, +9335,9355,1780,8563,8308,9325,9345,9365,3668,715,9377,8260,8355,103,2455,501, +2327,1711,64403,64404,64405,2711,2583,12364,12460,947,611,736,1003,12557,287, +487,291,9430,285,291,289,289,1075,12370,12466,8785,1436,1523,1437,223,1438, +1524,12307,2456,1394,2328,2712,2584,1594,65230,65231,65232,1173,1171,1169, +2394,2650,608,13203,12366,12462,1379,1490,64306,64306,1490,1107,446,660,662, +704,661,705,740,673,674,7713,65351,12372,12468,9378,13228,8711,96,790,768,768, +2387,718,65344,832,62,8805,8923,65310,8819,8823,8807,65125,609,485,12368,171, +187,8249,8250,12464,13080,13257,104,1193,1729,2489,1203,2361,2745,2617,1581, +65186,65187,12399,65188,13098,12495,65418,2637,1569,1569,1569,1569,1569,1569, +1569,1569,1569,12644,1098,8636,8640,13258,1458,1458,1458,1458,1458,1458,1458, +1458,1459,1459,1459,1459,1459,1459,1459,1459,1457,1457,1457,1457,1457,1457, +1457,1457,295,12559,7723,7721,9431,293,7719,7715,7717,1492,9829,9829,9825, +64308,64308,1729,1607,1492,64423,65258,65258,64421,64420,64424,65259,12408, +64425,65260,13179,12504,65421,13110,615,13113,1495,1495,614,689,12923,12827, +12909,12622,12813,12402,12498,65419,1460,1460,1460,1460,1460,1460,1460,1460, +7830,65352,1392,3627,12411,12507,65422,1465,1465,1465,1465,1465,1465,1465, +1465,3630,777,777,801,802,13122,1001,8213,795,9832,8962,9379,688,613,12405, +13107,12501,65420,733,779,405,45,63205,65293,65123,63206,8208,105,237,1103, +2439,12583,301,464,9432,238,1110,521,12943,12939,12863,12858,12965,12294, +12289,65380,12855,12963,12847,12861,12957,12864,12950,12854,12843,12850,12964, +12293,12952,12856,12967,12966,12969,12846,12842,12852,12290,12958,12867,12857, +12862,12968,12953,12866,12851,12288,12853,12849,12859,12848,12860,12844,12845, +12295,12942,12938,12948,12944,12940,12941,2311,239,7727,1253,7883,1239,1077, +12917,12821,12903,12615,12807,236,2695,2567,12356,7881,2440,1080,2312,2696, +2568,2624,523,1081,2496,2368,2752,307,12452,65394,12643,732,1452,299,1251, +8787,2623,65353,8710,8734,1387,8747,8993,8993,63733,8992,8992,8745,13061,9688, +9689,9787,1105,303,953,970,912,617,943,9380,2674,12355,12451,65384,2554,616, +63213,12445,12541,297,7725,12585,1102,2495,2367,2751,1141,1143,106,1393,2460, +2332,2716,2588,12560,496,9433,309,669,607,1112,1580,65182,65183,65184,1688, +64395,2461,2333,2717,2589,1403,12292,65354,9381,690,107,1185,2453,7729,1082, +1179,2325,1499,1603,64315,64315,65242,1499,65243,65244,64333,2709,2581,12363, +1220,12459,65398,954,1008,12657,12676,12664,12665,13069,1600,1600,12533,13188, +1616,1613,1183,65392,1181,12558,13193,489,311,9434,311,7731,1412,12369,12465, +65401,1391,12534,312,2454,1093,2326,2710,2582,1582,65190,65191,65192,999,2393, +2649,12920,12824,12906,12619,12810,3586,3589,3587,3588,3675,409,3590,13201, +12365,12461,65399,13077,13078,13076,12910,12814,12896,12593,12800,12595,1116, +7733,13208,13222,65355,13218,12371,13248,3585,12467,65402,13086,1153,12927, +835,9382,13226,1135,13263,670,12367,12463,65400,13240,13246,108,2482,314,2354, +2738,2610,3653,65276,65272,65271,65274,65273,65275,65270,65269,1604,955,411, +1500,64316,64316,1500,1500,1500,1500,1500,65246,64714,65247,64713,64715,65010, +65248,64904,64716,65247,65247,9711,410,620,12556,318,316,9435,7741,316,320, +320,7735,7737,794,792,60,8804,8922,65308,8818,8822,8806,65124,622,9612,621, +8356,1388,457,1113,63168,2355,2739,7739,2356,2529,2401,2531,2403,619,65356, +13264,3628,8743,172,8976,8744,3621,383,65102,818,65101,9674,9383,322,8467, +63214,9617,3622,2444,2316,2530,2402,13267,109,2478,175,817,772,717,65507,7743, +2350,2734,2606,1444,1444,12414,63637,63636,3659,63635,63628,63627,3656,63626, +63620,3633,63625,3655,63631,63630,3657,63629,63634,63633,3658,63632,3654, +12510,65423,9794,13127,1470,9794,1455,13187,12551,13268,9436,13221,7745,7747, +1605,65250,65251,65252,64721,64584,13133,12417,13182,12513,65426,1502,64318, +64318,1502,1396,1445,1446,1446,1445,625,13202,65381,183,12914,12818,12900, +12609,12656,12804,12654,12655,12415,12511,65424,8722,800,8854,727,8723,8242, +13130,13129,624,13206,13219,65357,13215,12418,13249,12514,65427,13270,3617, +13223,13224,9384,13227,13235,63215,623,181,181,13186,8811,8810,13196,956, +13197,12416,12512,65425,13205,215,13211,1443,1443,9834,9835,9837,9839,13234, +13238,13244,13241,13239,13247,13245,110,2472,8711,324,2344,2728,2600,12394, +12490,65413,329,13185,12555,160,328,326,9437,7755,326,7749,7751,12397,12493, +65416,8362,13195,2457,2329,2713,2585,3591,12435,626,627,12911,12815,12597, +12897,12598,12596,12648,12801,12647,12646,12395,12491,65414,63641,3661,57, +1641,2543,9320,10130,2415,2799,2671,1641,12329,12840,8329,65305,63289,9340, +9360,1785,8568,8313,9330,9350,9370,3673,460,1114,12531,65437,414,7753,65358, +13210,2467,2339,2723,2595,2345,12398,12494,65417,160,3603,3609,1606,65254, +1722,64415,65255,65255,64722,64587,65256,64725,64590,64653,8716,8713,8713, +8800,8815,8817,8825,8802,8814,8816,8742,8832,8836,8833,8837,1398,9385,13233, +8319,241,957,12396,12492,65415,2492,2364,2748,2620,35,65283,65119,884,885, +8470,1504,64320,64320,1504,13237,13243,2462,2334,2718,2590,111,243,3629,629, +1257,1259,2451,12571,335,2321,2705,2377,2761,466,9438,244,7889,7897,7891,7893, +7895,1086,337,525,2323,246,1255,7885,339,12634,731,808,242,2707,1413,12362, +7887,417,7899,7907,7901,7903,7905,337,419,527,12458,65397,12631,1451,333,7763, +7761,2384,969,982,1121,631,1147,1149,974,2768,959,972,65359,49,1633,2535,9312, +10122,2407,8228,8539,63196,2791,2663,1633,189,12321,12832,8321,65297,2548, +63281,9332,9352,1777,188,8560,185,3665,8531,491,493,2579,2635,596,9386,9702, +8997,170,186,8735,2322,2378,248,511,12361,12457,65387,511,63216,1151,245,7757, +7759,12577,8254,65098,773,65097,65100,65099,175,2507,2379,2763,112,13184, +13099,2474,7765,2346,8671,8670,2730,2602,12401,3631,12497,1156,1216,12671,182, +8741,40,64830,63725,63724,8333,65288,65113,8317,63723,65077,41,64831,63736, +63735,8334,65289,65114,8318,63734,65078,8706,1472,1433,13225,1463,1463,1463, +1463,1463,1463,1463,1463,1441,12550,9439,7767,1508,1087,64324,64324,13115, +64323,1662,1402,1508,64343,64344,12410,64345,12506,1191,64334,37,1642,65285, +65130,46,1417,183,65377,63207,65294,65106,63208,834,8869,8240,8359,13194,2475, +2347,2731,2603,966,981,12922,12826,12908,12621,12812,632,3642,981,421,3614, +3612,3616,960,12915,12819,12662,12901,12658,12610,12805,12660,12612,12661, +12663,12659,12404,12500,982,1411,43,799,8853,177,726,65291,65122,8314,65360, +13272,12413,9759,9756,9758,9757,12509,3611,12306,12320,9387,8826,8478,697, +8245,8719,8965,12540,8984,8834,8835,8759,8733,968,1137,1158,13232,12407,12503, +13236,13242,113,2392,1448,1602,65238,65239,65240,1464,1464,1464,1464,1464, +1464,1464,1464,1464,1464,1464,1464,1464,1464,1464,1464,1439,12561,9440,672, +65361,1511,64327,64327,1511,1511,1511,1511,1511,1511,1511,1511,1511,1511,1511, +1511,1511,1511,1511,1511,1511,1511,1511,1511,1511,9388,9833,1467,1467,1467, +1467,1467,1467,1467,1467,63,1567,1374,191,63423,894,65311,63295,34,8222,8220, +65282,12318,12317,8221,8216,8219,8219,8217,329,8218,39,65287,114,1404,2480, +341,2352,8730,63717,13230,13231,13229,1471,1471,2736,2608,12425,12521,65431, +2545,2544,612,8758,12566,345,343,9441,343,529,7769,7771,7773,8251,8838,8839, +174,63720,63194,1585,1408,65198,12428,1585,12524,65434,1512,64328,1512,1512, +1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,1512,1512, +1512,1512,1512,1512,8765,1431,1431,8976,638,639,2525,2397,961,637,635,693, +1009,734,12913,12817,12899,12608,12602,12649,12601,12603,12652,12803,12607, +12604,12651,12605,12606,12650,12653,8735,793,8895,12426,12522,65432,730,805, +778,703,1369,796,723,702,825,722,531,13137,7775,636,634,65362,12429,12525, +65435,3619,9389,2524,2353,2652,1681,64397,2528,2400,2784,2500,2372,2756,63217, +9616,633,692,12427,12523,65433,2546,2547,63197,3620,2443,2315,2699,2499,2371, +2755,115,2488,347,7781,1589,2360,65210,65211,65212,2744,2616,12373,12469, +65403,65018,1505,64321,64321,1505,3634,3649,3652,3651,3635,3632,3648,63622, +3637,63621,3636,3650,63624,3639,63623,3638,3640,3641,12569,353,7783,351,601, +1241,1243,602,9442,349,537,7777,7779,7785,828,8243,714,167,1587,65202,65203, +65204,1462,1462,1462,1462,1462,1462,1462,1426,1462,1405,12379,12475,65406,59, +1563,65307,65108,12444,65439,13090,13091,55,1639,2541,9318,10128,2413,8542, +2797,2669,1639,12327,12838,8327,65303,63287,9338,9358,1783,8566,8311,9328, +9348,9368,3671,173,1399,2486,1096,1617,64609,64606,64608,1617,64610,64607, +9618,9619,9617,9618,2358,2742,2614,1427,12565,1097,1588,65206,65207,65208,995, +8362,8362,1456,1456,1456,1456,1456,1456,1456,1456,1456,1211,1005,1513,64329, +64329,64300,64300,64301,64301,1473,1513,64298,64298,64299,64299,642,963,962, +962,1010,12375,12471,65404,1469,1469,8764,1474,12916,12820,12670,12902,12666, +12613,12667,12806,12669,12668,54,1638,2540,9317,10127,2412,2796,2668,1638, +12326,12837,8326,65302,63286,9337,9357,1782,8565,8310,9327,2553,9347,9367, +3670,47,65295,383,7835,9786,65363,1475,173,1100,12381,12477,65407,824,823, +3625,3624,3595,3626,32,32,9824,9824,9828,9390,827,13252,13213,9641,9636,13199, +13214,13262,13265,13266,13198,13269,13212,13217,9638,9639,9640,9637,9635, +13275,2487,2359,2743,12617,12677,12672,12594,12645,12611,12614,12600,63218, +163,65505,822,821,8834,8842,8838,8827,8715,12377,12473,65405,1618,8721,9788, +8835,8843,8839,13276,13180,116,2468,8868,8867,2340,2724,2596,1591,65218,65219, +12383,65220,13181,12479,65408,1600,964,1514,64330,64330,64330,1514,359,12554, +357,680,355,1670,64379,64380,64381,64380,9443,7793,355,7831,7787,7789,1090, +1197,1578,65174,64674,64524,65175,12390,64673,64523,1577,65172,65176,64676, +64526,64627,12486,65411,8481,9742,1440,1449,9321,12841,9341,9361,8569,679, +1496,64312,64312,1496,1205,1435,1435,2469,2341,2725,2597,1584,65196,63640, +63639,3660,63638,1579,65178,65179,65180,8707,8756,952,977,977,12921,12825, +12907,12620,12811,9324,9344,9364,3601,429,3602,254,3607,3600,3608,3606,1154, +1644,1644,51,1635,2537,9314,10124,2409,8540,2793,2665,1635,12323,12834,8323, +65299,2550,63283,9334,9354,1779,190,63198,8562,179,3667,13204,12385,12481, +65409,12912,12816,12898,12599,12802,732,816,771,771,864,8764,820,830,8855, +1430,1430,2672,1155,1407,7791,65364,1385,12392,12488,65412,741,745,742,744, +743,445,389,424,900,13095,3599,12308,65117,65081,12309,65118,65082,3605,427, +9391,8482,63722,63195,648,9660,9668,9658,9650,678,1510,64326,64326,1510,1094, +1461,1461,1461,1461,1461,1461,1461,1461,1115,63219,2463,2335,2719,2591,1657, +64359,64360,64361,2464,2336,2720,2592,647,12388,12484,65410,12387,12483,65391, +9323,9343,9363,8571,9331,21316,9351,9371,50,1634,2536,9313,10123,2408,8229, +8229,65072,2792,2664,1634,12322,12833,8322,65298,2549,63282,9333,9353,1778, +8561,443,178,3666,8532,117,250,649,2441,12584,365,468,9444,251,7799,1091,2385, +369,533,2313,252,472,7795,474,1265,476,470,7909,249,2697,2569,12358,7911,432, +7913,7921,7915,7917,7919,369,1267,535,12454,65395,1145,12636,363,1263,7803, +2625,65365,95,8215,65343,65075,65103,8746,8704,371,9392,9600,1476,965,971,944, +650,973,797,724,2675,367,1118,12357,12453,65385,1199,1201,361,7801,7797,2442, +2314,2698,2570,2626,2498,2370,2754,2497,2369,2753,118,2357,2741,2613,12535, +1493,64309,64309,64309,1493,64331,64331,1520,1521,9445,7807,1074,1700,64363, +64364,64365,12537,9792,124,781,809,716,712,1406,651,12536,2509,2381,2765,2435, +2307,2691,65366,1400,12446,12542,12443,65438,12538,9393,7805,652,12436,12532, +119,7811,12633,12431,12527,65436,12632,12430,12526,13143,12316,65076,1608, +65262,1572,65158,13277,9446,373,7813,7815,7817,12433,8472,12529,12638,12637, +7809,9702,9675,9689,12302,65091,12303,65092,9671,9672,9663,9661,9667,9665, +12310,12311,9657,9655,9643,9786,9633,9734,9743,12312,12313,9653,9651,12432, +12528,12639,65367,12434,12530,65382,8361,65510,3623,9394,7832,695,653,447,120, +829,12562,9447,7821,7819,1389,958,65368,9395,739,121,13134,2479,253,2351, +12626,2735,2607,12420,12516,65428,12625,3662,12419,12515,65388,1123,9448,375, +255,7823,7925,1610,1746,64431,65266,1574,65162,65163,65164,65267,65268,64733, +64600,64660,1745,12630,165,65509,12629,12678,1450,1450,1099,1273,12673,12675, +12674,1434,7923,436,7927,1397,1111,12642,9775,1410,65369,1497,64313,64313, +1497,1522,64287,12424,12681,12520,65430,12635,12423,12519,65390,1011,12680, +12679,3618,3597,9396,890,837,422,7833,696,7929,654,12422,12684,12518,65429, +12640,1131,1133,1127,1129,12421,12517,65389,12683,12682,2527,2399,122,1382, +378,2395,2651,1592,65222,65223,12374,65224,1586,65200,12470,1429,1428,1432, +1494,64310,64310,1494,12567,382,9449,7825,657,380,380,7827,1079,1177,1247, +12380,12476,48,1632,2534,2406,2790,2662,1632,8320,65296,63280,1776,8304,3664, +65279,8204,8203,950,12563,1386,1218,1078,1175,1245,12376,12472,1454,7829, +65370,12382,12478,9397,656,438,12378,12474, +}; + +static const unsigned short agl_dup_offsets[] = { +32,0,124,3,160,6,173,9,175,12,181,15,183,18,266,21,267,24,272,27,273,30, +278,33,279,36,288,39,289,42,290,45,291,48,304,51,310,54,311,57,315,60,316,63, +319,66,320,69,325,72,326,75,329,78,336,81,337,84,342,87,343,90,354,93,355,96, +368,99,369,102,379,105,380,108,383,111,510,114,511,117,700,120,701,123, +732,126,768,129,769,132,771,135,777,138,803,141,901,144,962,147,977,150, +978,153,981,156,982,159,1025,162,1026,165,1027,168,1028,171,1029,174,1030,177, +1031,180,1032,183,1033,186,1034,189,1035,192,1036,195,1038,198,1039,201, +1040,204,1041,207,1042,210,1043,213,1044,216,1045,219,1046,222,1047,225, +1048,228,1049,231,1050,234,1051,237,1052,240,1053,243,1054,246,1055,249, +1056,252,1057,255,1058,258,1059,261,1060,264,1061,267,1062,270,1063,273, +1064,276,1065,279,1066,282,1067,285,1068,288,1069,291,1070,294,1071,297, +1072,300,1073,303,1074,306,1075,309,1076,312,1077,315,1078,318,1079,321, +1080,324,1081,327,1082,330,1083,333,1084,336,1085,339,1086,342,1087,345, +1088,348,1089,351,1090,354,1091,357,1092,360,1093,363,1094,366,1095,369, +1096,372,1097,375,1098,378,1099,381,1100,384,1101,387,1102,390,1103,393, +1105,396,1106,399,1107,402,1108,405,1109,408,1110,411,1111,414,1112,417, +1113,420,1114,423,1115,426,1116,429,1118,432,1119,435,1122,438,1123,441, +1138,444,1139,447,1140,450,1141,453,1168,456,1169,459,1241,462,1425,465, +1430,470,1431,473,1435,476,1443,479,1444,482,1445,485,1446,488,1447,491, +1450,494,1456,497,1457,508,1458,518,1459,528,1460,538,1461,548,1462,558, +1463,568,1464,578,1465,596,1467,606,1468,616,1469,620,1470,624,1471,627, +1472,631,1473,634,1474,637,1475,640,1488,643,1489,647,1490,651,1491,655, +1492,679,1493,683,1494,687,1495,691,1496,695,1497,699,1498,703,1499,711, +1500,715,1501,723,1502,727,1503,731,1504,735,1505,739,1506,743,1507,747, +1508,751,1509,755,1510,759,1511,763,1512,787,1513,811,1514,815,1520,819, +1521,822,1522,825,1548,828,1563,831,1567,834,1569,837,1570,848,1571,851, +1572,854,1573,857,1574,860,1575,863,1576,866,1577,869,1578,872,1579,875, +1580,878,1581,881,1582,884,1583,887,1584,890,1585,893,1586,897,1587,900, +1588,903,1589,906,1590,909,1591,912,1592,915,1593,918,1594,921,1600,924, +1601,929,1602,932,1603,935,1604,938,1605,941,1606,944,1607,947,1608,950, +1609,953,1610,956,1611,959,1612,962,1613,966,1614,969,1615,973,1616,977, +1617,980,1618,984,1632,987,1633,991,1634,995,1635,999,1636,1003,1637,1007, +1638,1011,1639,1015,1640,1019,1641,1023,1642,1027,1643,1030,1644,1033, +1645,1036,1657,1040,1662,1043,1670,1046,1672,1049,1681,1052,1688,1055, +1700,1058,1711,1061,1722,1064,1729,1067,1746,1070,8204,1073,8213,1076, +8215,1079,8219,1082,8229,1085,8353,1088,8356,1091,8362,1094,8364,1099, +8453,1102,8467,1105,8470,1108,8486,1111,8616,1114,8656,1117,8658,1120, +8660,1123,8704,1126,8707,1129,8710,1132,8711,1135,8713,1138,8735,1141, +8764,1144,8773,1147,8834,1150,8835,1153,8838,1156,8839,1159,8853,1162, +8855,1165,8976,1168,8992,1171,8993,1174,9617,1177,9618,1180,9619,1183, +9632,1186,9633,1189,9642,1192,9643,1195,9644,1198,9650,1201,9658,1204, +9660,1207,9668,1210,9675,1213,9679,1216,9688,1219,9689,1222,9702,1225, +9786,1228,9787,1231,9788,1234,9792,1237,9794,1240,9824,1243,9827,1246, +9829,1249,9835,1252,64287,1255,64298,1260,64299,1264,64300,1268,64301,1271, +64305,1274,64306,1277,64307,1280,64308,1283,64309,1286,64310,1291,64312,1294, +64313,1297,64314,1300,64315,1303,64316,1306,64318,1309,64320,1312,64321,1315, +64324,1318,64326,1321,64327,1324,64329,1327,64330,1330,64331,1334,64380,1338, +65247,1341,65255,1345,65258,1348,65267,1351,65268,1354, +}; + +static const char *agl_dup_names[] = { +"space","spacehackarabic",0,"bar","verticalbar",0,"nbspace", +"nonbreakingspace",0,"sfthyphen","softhyphen",0,"macron","overscore",0,"mu", +"mu1",0,"middot","periodcentered",0,"Cdot","Cdotaccent",0,"cdot","cdotaccent", +0,"Dcroat","Dslash",0,"dcroat","dmacron",0,"Edot","Edotaccent",0,"edot", +"edotaccent",0,"Gdot","Gdotaccent",0,"gdot","gdotaccent",0,"Gcedilla", +"Gcommaaccent",0,"gcedilla","gcommaaccent",0,"Idot","Idotaccent",0,"Kcedilla", +"Kcommaaccent",0,"kcedilla","kcommaaccent",0,"Lcedilla","Lcommaaccent",0, +"lcedilla","lcommaaccent",0,"Ldot","Ldotaccent",0,"ldot","ldotaccent",0, +"Ncedilla","Ncommaaccent",0,"ncedilla","ncommaaccent",0,"napostrophe", +"quoterightn",0,"Odblacute","Ohungarumlaut",0,"odblacute","ohungarumlaut",0, +"Rcedilla","Rcommaaccent",0,"rcedilla","rcommaaccent",0,"Tcedilla", +"Tcommaaccent",0,"tcedilla","tcommaaccent",0,"Udblacute","Uhungarumlaut",0, +"udblacute","uhungarumlaut",0,"Zdot","Zdotaccent",0,"zdot","zdotaccent",0, +"longs","slong",0,"Oslashacute","Ostrokeacute",0,"oslashacute","ostrokeacute", +0,"afii57929","apostrophemod",0,"afii64937","commareversedmod",0,"ilde", +"tilde",0,"gravecmb","gravecomb",0,"acutecmb","acutecomb",0,"tildecmb", +"tildecomb",0,"hookabovecomb","hookcmb",0,"dotbelowcmb","dotbelowcomb",0, +"dialytikatonos","dieresistonos",0,"sigma1","sigmafinal",0,"theta1", +"thetasymbolgreek",0,"Upsilon1","Upsilonhooksymbol",0,"phi1","phisymbolgreek", +0,"omega1","pisymbolgreek",0,"Iocyrillic","afii10023",0,"Djecyrillic", +"afii10051",0,"Gjecyrillic","afii10052",0,"Ecyrillic","afii10053",0, +"Dzecyrillic","afii10054",0,"Icyrillic","afii10055",0,"Yicyrillic", +"afii10056",0,"Jecyrillic","afii10057",0,"Ljecyrillic","afii10058",0, +"Njecyrillic","afii10059",0,"Tshecyrillic","afii10060",0,"Kjecyrillic", +"afii10061",0,"Ushortcyrillic","afii10062",0,"Dzhecyrillic","afii10145",0, +"Acyrillic","afii10017",0,"Becyrillic","afii10018",0,"Vecyrillic","afii10019", +0,"Gecyrillic","afii10020",0,"Decyrillic","afii10021",0,"Iecyrillic", +"afii10022",0,"Zhecyrillic","afii10024",0,"Zecyrillic","afii10025",0, +"Iicyrillic","afii10026",0,"Iishortcyrillic","afii10027",0,"Kacyrillic", +"afii10028",0,"Elcyrillic","afii10029",0,"Emcyrillic","afii10030",0, +"Encyrillic","afii10031",0,"Ocyrillic","afii10032",0,"Pecyrillic","afii10033", +0,"Ercyrillic","afii10034",0,"Escyrillic","afii10035",0,"Tecyrillic", +"afii10036",0,"Ucyrillic","afii10037",0,"Efcyrillic","afii10038",0, +"Khacyrillic","afii10039",0,"Tsecyrillic","afii10040",0,"Checyrillic", +"afii10041",0,"Shacyrillic","afii10042",0,"Shchacyrillic","afii10043",0, +"Hardsigncyrillic","afii10044",0,"Yericyrillic","afii10045",0, +"Softsigncyrillic","afii10046",0,"Ereversedcyrillic","afii10047",0, +"IUcyrillic","afii10048",0,"IAcyrillic","afii10049",0,"acyrillic","afii10065", +0,"afii10066","becyrillic",0,"afii10067","vecyrillic",0,"afii10068", +"gecyrillic",0,"afii10069","decyrillic",0,"afii10070","iecyrillic",0, +"afii10072","zhecyrillic",0,"afii10073","zecyrillic",0,"afii10074", +"iicyrillic",0,"afii10075","iishortcyrillic",0,"afii10076","kacyrillic",0, +"afii10077","elcyrillic",0,"afii10078","emcyrillic",0,"afii10079", +"encyrillic",0,"afii10080","ocyrillic",0,"afii10081","pecyrillic",0, +"afii10082","ercyrillic",0,"afii10083","escyrillic",0,"afii10084", +"tecyrillic",0,"afii10085","ucyrillic",0,"afii10086","efcyrillic",0, +"afii10087","khacyrillic",0,"afii10088","tsecyrillic",0,"afii10089", +"checyrillic",0,"afii10090","shacyrillic",0,"afii10091","shchacyrillic",0, +"afii10092","hardsigncyrillic",0,"afii10093","yericyrillic",0,"afii10094", +"softsigncyrillic",0,"afii10095","ereversedcyrillic",0,"afii10096", +"iucyrillic",0,"afii10097","iacyrillic",0,"afii10071","iocyrillic",0, +"afii10099","djecyrillic",0,"afii10100","gjecyrillic",0,"afii10101", +"ecyrillic",0,"afii10102","dzecyrillic",0,"afii10103","icyrillic",0, +"afii10104","yicyrillic",0,"afii10105","jecyrillic",0,"afii10106", +"ljecyrillic",0,"afii10107","njecyrillic",0,"afii10108","tshecyrillic",0, +"afii10109","kjecyrillic",0,"afii10110","ushortcyrillic",0,"afii10193", +"dzhecyrillic",0,"Yatcyrillic","afii10146",0,"afii10194","yatcyrillic",0, +"Fitacyrillic","afii10147",0,"afii10195","fitacyrillic",0,"Izhitsacyrillic", +"afii10148",0,"afii10196","izhitsacyrillic",0,"Gheupturncyrillic","afii10050", +0,"afii10098","gheupturncyrillic",0,"afii10846","schwacyrillic",0, +"etnahtafoukhhebrew","etnahtafoukhlefthebrew","etnahtahebrew", +"etnahtalefthebrew",0,"tipehahebrew","tipehalefthebrew",0,"reviahebrew", +"reviamugrashhebrew",0,"tevirhebrew","tevirlefthebrew",0,"munahhebrew", +"munahlefthebrew",0,"mahapakhhebrew","mahapakhlefthebrew",0,"merkhahebrew", +"merkhalefthebrew",0,"merkhakefulahebrew","merkhakefulalefthebrew",0, +"dargahebrew","dargalefthebrew",0,"yerahbenyomohebrew", +"yerahbenyomolefthebrew",0,"afii57799","sheva","sheva115","sheva15","sheva22", +"sheva2e","shevahebrew","shevanarrowhebrew","shevaquarterhebrew", +"shevawidehebrew",0,"afii57801","hatafsegol","hatafsegol17","hatafsegol24", +"hatafsegol30","hatafsegolhebrew","hatafsegolnarrowhebrew", +"hatafsegolquarterhebrew","hatafsegolwidehebrew",0,"afii57800","hatafpatah", +"hatafpatah16","hatafpatah23","hatafpatah2f","hatafpatahhebrew", +"hatafpatahnarrowhebrew","hatafpatahquarterhebrew","hatafpatahwidehebrew",0, +"afii57802","hatafqamats","hatafqamats1b","hatafqamats28","hatafqamats34", +"hatafqamatshebrew","hatafqamatsnarrowhebrew","hatafqamatsquarterhebrew", +"hatafqamatswidehebrew",0,"afii57793","hiriq","hiriq14","hiriq21","hiriq2d", +"hiriqhebrew","hiriqnarrowhebrew","hiriqquarterhebrew","hiriqwidehebrew",0, +"afii57794","tsere","tsere12","tsere1e","tsere2b","tserehebrew", +"tserenarrowhebrew","tserequarterhebrew","tserewidehebrew",0,"afii57795", +"segol","segol13","segol1f","segol2c","segolhebrew","segolnarrowhebrew", +"segolquarterhebrew","segolwidehebrew",0,"afii57798","patah","patah11", +"patah1d","patah2a","patahhebrew","patahnarrowhebrew","patahquarterhebrew", +"patahwidehebrew",0,"afii57797","qamats","qamats10","qamats1a","qamats1c", +"qamats27","qamats29","qamats33","qamatsde","qamatshebrew", +"qamatsnarrowhebrew","qamatsqatanhebrew","qamatsqatannarrowhebrew", +"qamatsqatanquarterhebrew","qamatsqatanwidehebrew","qamatsquarterhebrew", +"qamatswidehebrew",0,"afii57806","holam","holam19","holam26","holam32", +"holamhebrew","holamnarrowhebrew","holamquarterhebrew","holamwidehebrew",0, +"afii57796","qubuts","qubuts18","qubuts25","qubuts31","qubutshebrew", +"qubutsnarrowhebrew","qubutsquarterhebrew","qubutswidehebrew",0,"afii57807", +"dagesh","dageshhebrew",0,"afii57839","siluqhebrew","siluqlefthebrew",0, +"afii57645","maqafhebrew",0,"afii57841","rafe","rafehebrew",0,"afii57842", +"paseqhebrew",0,"afii57804","shindothebrew",0,"afii57803","sindothebrew",0, +"afii57658","sofpasuqhebrew",0,"afii57664","alef","alefhebrew",0,"afii57665", +"bet","bethebrew",0,"afii57666","gimel","gimelhebrew",0,"afii57667","dalet", +"dalethatafpatah","dalethatafpatahhebrew","dalethatafsegol", +"dalethatafsegolhebrew","dalethebrew","dalethiriq","dalethiriqhebrew", +"daletholam","daletholamhebrew","daletpatah","daletpatahhebrew","daletqamats", +"daletqamatshebrew","daletqubuts","daletqubutshebrew","daletsegol", +"daletsegolhebrew","daletsheva","daletshevahebrew","dalettsere", +"dalettserehebrew",0,"afii57668","he","hehebrew",0,"afii57669","vav", +"vavhebrew",0,"afii57670","zayin","zayinhebrew",0,"afii57671","het", +"hethebrew",0,"afii57672","tet","tethebrew",0,"afii57673","yod","yodhebrew",0, +"afii57674","finalkaf","finalkafhebrew","finalkafqamats", +"finalkafqamatshebrew","finalkafsheva","finalkafshevahebrew",0,"afii57675", +"kaf","kafhebrew",0,"afii57676","lamed","lamedhebrew","lamedholam", +"lamedholamdagesh","lamedholamdageshhebrew","lamedholamhebrew",0,"afii57677", +"finalmem","finalmemhebrew",0,"afii57678","mem","memhebrew",0,"afii57679", +"finalnun","finalnunhebrew",0,"afii57680","nun","nunhebrew",0,"afii57681", +"samekh","samekhhebrew",0,"afii57682","ayin","ayinhebrew",0,"afii57683", +"finalpe","finalpehebrew",0,"afii57684","pe","pehebrew",0,"afii57685", +"finaltsadi","finaltsadihebrew",0,"afii57686","tsadi","tsadihebrew",0, +"afii57687","qof","qofhatafpatah","qofhatafpatahhebrew","qofhatafsegol", +"qofhatafsegolhebrew","qofhebrew","qofhiriq","qofhiriqhebrew","qofholam", +"qofholamhebrew","qofpatah","qofpatahhebrew","qofqamats","qofqamatshebrew", +"qofqubuts","qofqubutshebrew","qofsegol","qofsegolhebrew","qofsheva", +"qofshevahebrew","qoftsere","qoftserehebrew",0,"afii57688","resh", +"reshhatafpatah","reshhatafpatahhebrew","reshhatafsegol", +"reshhatafsegolhebrew","reshhebrew","reshhiriq","reshhiriqhebrew","reshholam", +"reshholamhebrew","reshpatah","reshpatahhebrew","reshqamats", +"reshqamatshebrew","reshqubuts","reshqubutshebrew","reshsegol", +"reshsegolhebrew","reshsheva","reshshevahebrew","reshtsere","reshtserehebrew", +0,"afii57689","shin","shinhebrew",0,"afii57690","tav","tavhebrew",0, +"afii57716","vavvavhebrew",0,"afii57717","vavyodhebrew",0,"afii57718", +"yodyodhebrew",0,"afii57388","commaarabic",0,"afii57403","semicolonarabic",0, +"afii57407","questionarabic",0,"afii57409","hamzaarabic","hamzadammaarabic", +"hamzadammatanarabic","hamzafathaarabic","hamzafathatanarabic", +"hamzalowarabic","hamzalowkasraarabic","hamzalowkasratanarabic", +"hamzasukunarabic",0,"afii57410","alefmaddaabovearabic",0,"afii57411", +"alefhamzaabovearabic",0,"afii57412","wawhamzaabovearabic",0,"afii57413", +"alefhamzabelowarabic",0,"afii57414","yehhamzaabovearabic",0,"afii57415", +"alefarabic",0,"afii57416","beharabic",0,"afii57417","tehmarbutaarabic",0, +"afii57418","teharabic",0,"afii57419","theharabic",0,"afii57420","jeemarabic", +0,"afii57421","haharabic",0,"afii57422","khaharabic",0,"afii57423", +"dalarabic",0,"afii57424","thalarabic",0,"afii57425","reharabic", +"rehyehaleflamarabic",0,"afii57426","zainarabic",0,"afii57427","seenarabic",0, +"afii57428","sheenarabic",0,"afii57429","sadarabic",0,"afii57430","dadarabic", +0,"afii57431","taharabic",0,"afii57432","zaharabic",0,"afii57433","ainarabic", +0,"afii57434","ghainarabic",0,"afii57440","kashidaautoarabic", +"kashidaautonosidebearingarabic","tatweelarabic",0,"afii57441","feharabic",0, +"afii57442","qafarabic",0,"afii57443","kafarabic",0,"afii57444","lamarabic",0, +"afii57445","meemarabic",0,"afii57446","noonarabic",0,"afii57470","heharabic", +0,"afii57448","wawarabic",0,"afii57449","alefmaksuraarabic",0,"afii57450", +"yeharabic",0,"afii57451","fathatanarabic",0,"afii57452", +"dammatanaltonearabic","dammatanarabic",0,"afii57453","kasratanarabic",0, +"afii57454","fathaarabic","fathalowarabic",0,"afii57455","dammaarabic", +"dammalowarabic",0,"afii57456","kasraarabic",0,"afii57457","shaddaarabic", +"shaddafathatanarabic",0,"afii57458","sukunarabic",0,"afii57392","zeroarabic", +"zerohackarabic",0,"afii57393","onearabic","onehackarabic",0,"afii57394", +"twoarabic","twohackarabic",0,"afii57395","threearabic","threehackarabic",0, +"afii57396","fourarabic","fourhackarabic",0,"afii57397","fivearabic", +"fivehackarabic",0,"afii57398","sixarabic","sixhackarabic",0,"afii57399", +"sevenarabic","sevenhackarabic",0,"afii57400","eightarabic","eighthackarabic", +0,"afii57401","ninearabic","ninehackarabic",0,"afii57381","percentarabic",0, +"decimalseparatorarabic","decimalseparatorpersian",0, +"thousandsseparatorarabic","thousandsseparatorpersian",0,"afii63167", +"asteriskaltonearabic","asteriskarabic",0,"afii57511","tteharabic",0, +"afii57506","peharabic",0,"afii57507","tcheharabic",0,"afii57512", +"ddalarabic",0,"afii57513","rreharabic",0,"afii57508","jeharabic",0, +"afii57505","veharabic",0,"afii57509","gafarabic",0,"afii57514", +"noonghunnaarabic",0,"haaltonearabic","hehaltonearabic",0,"afii57519", +"yehbarreearabic",0,"afii61664","zerowidthnonjoiner",0,"afii00208", +"horizontalbar",0,"dbllowline","underscoredbl",0,"quoteleftreversed", +"quotereversed",0,"twodotenleader","twodotleader",0,"colonmonetary", +"colonsign",0,"afii08941","lira",0,"afii57636","newsheqelsign","sheqel", +"sheqelhebrew",0,"Euro","euro",0,"afii61248","careof",0,"afii61289","lsquare", +0,"afii61352","numero",0,"Ohm","Omega",0,"arrowupdnbse","arrowupdownbase",0, +"arrowdblleft","arrowleftdbl",0,"arrowdblright","dblarrowright",0, +"arrowdblboth","dblarrowleft",0,"forall","universal",0,"existential", +"thereexists",0,"Delta","increment",0,"gradient","nabla",0,"notelement", +"notelementof",0,"orthogonal","rightangle",0,"similar","tildeoperator",0, +"approximatelyequal","congruent",0,"propersubset","subset",0,"propersuperset", +"superset",0,"reflexsubset","subsetorequal",0,"reflexsuperset", +"supersetorequal",0,"circleplus","pluscircle",0,"circlemultiply", +"timescircle",0,"logicalnotreversed","revlogicalnot",0,"integraltop", +"integraltp",0,"integralbottom","integralbt",0,"ltshade","shadelight",0, +"shade","shademedium",0,"dkshade","shadedark",0,"blacksquare","filledbox",0, +"H22073","whitesquare",0,"H18543","blacksmallsquare",0,"H18551", +"whitesmallsquare",0,"blackrectangle","filledrect",0, +"blackuppointingtriangle","triagup",0,"blackrightpointingpointer","triagrt",0, +"blackdownpointingtriangle","triagdn",0,"blackleftpointingpointer","triaglf", +0,"circle","whitecircle",0,"H18533","blackcircle",0,"bulletinverse", +"invbullet",0,"invcircle","whitecircleinverse",0,"openbullet","whitebullet",0, +"smileface","whitesmilingface",0,"blacksmilingface","invsmileface",0, +"compass","sun",0,"female","venus",0,"male","mars",0,"spade","spadesuitblack", +0,"club","clubsuitblack",0,"heart","heartsuitblack",0,"eighthnotebeamed", +"musicalnotedbl",0,"afii57705","doubleyodpatah","doubleyodpatahhebrew", +"yodyodpatahhebrew",0,"afii57694","shinshindot","shinshindothebrew",0, +"afii57695","shinsindot","shinsindothebrew",0,"shindageshshindot", +"shindageshshindothebrew",0,"shindageshsindot","shindageshsindothebrew",0, +"betdagesh","betdageshhebrew",0,"gimeldagesh","gimeldageshhebrew",0, +"daletdagesh","daletdageshhebrew",0,"hedagesh","hedageshhebrew",0,"afii57723", +"vavdagesh","vavdagesh65","vavdageshhebrew",0,"zayindagesh", +"zayindageshhebrew",0,"tetdagesh","tetdageshhebrew",0,"yoddagesh", +"yoddageshhebrew",0,"finalkafdagesh","finalkafdageshhebrew",0,"kafdagesh", +"kafdageshhebrew",0,"lameddagesh","lameddageshhebrew",0,"memdagesh", +"memdageshhebrew",0,"nundagesh","nundageshhebrew",0,"samekhdagesh", +"samekhdageshhebrew",0,"pedagesh","pedageshhebrew",0,"tsadidagesh", +"tsadidageshhebrew",0,"qofdagesh","qofdageshhebrew",0,"shindagesh", +"shindageshhebrew",0,"tavdages","tavdagesh","tavdageshhebrew",0,"afii57700", +"vavholam","vavholamhebrew",0,"tchehinitialarabic","tchehmeeminitialarabic",0, +"laminitialarabic","lammeemjeeminitialarabic","lammeemkhahinitialarabic",0, +"noonhehinitialarabic","nooninitialarabic",0,"hehfinalalttwoarabic", +"hehfinalarabic",0,"alefmaksurainitialarabic","yehinitialarabic",0, +"alefmaksuramedialarabic","yehmedialarabic",0, +}; diff --git a/contrib/media/updf_newlib/pdf/mupdf.h b/contrib/media/updf_newlib/pdf/mupdf.h new file mode 100755 index 000000000..6870edfc6 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/mupdf.h @@ -0,0 +1,493 @@ +#ifndef _MUPDF_H_ +#define _MUPDF_H_ + +#ifndef _FITZ_H_ +#error "fitz.h must be included before mupdf.h" +#endif + +typedef struct pdf_xref_s pdf_xref; + +/* + * tokenizer and low-level object parser + */ + +enum +{ + PDF_TOK_ERROR, PDF_TOK_EOF, + PDF_TOK_OPEN_ARRAY, PDF_TOK_CLOSE_ARRAY, + PDF_TOK_OPEN_DICT, PDF_TOK_CLOSE_DICT, + PDF_TOK_OPEN_BRACE, PDF_TOK_CLOSE_BRACE, + PDF_TOK_NAME, PDF_TOK_INT, PDF_TOK_REAL, PDF_TOK_STRING, PDF_TOK_KEYWORD, + PDF_TOK_R, PDF_TOK_TRUE, PDF_TOK_FALSE, PDF_TOK_NULL, + PDF_TOK_OBJ, PDF_TOK_ENDOBJ, + PDF_TOK_STREAM, PDF_TOK_ENDSTREAM, + PDF_TOK_XREF, PDF_TOK_TRAILER, PDF_TOK_STARTXREF, + PDF_NUM_TOKENS +}; + +fz_error pdf_lex(int *tok, fz_stream *f, char *buf, int n, int *len); + +fz_error pdf_parse_array(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap); +fz_error pdf_parse_dict(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap); +fz_error pdf_parse_stm_obj(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap); +fz_error pdf_parse_ind_obj(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap, int *num, int *gen, int *stm_ofs); + +fz_rect pdf_to_rect(fz_obj *array); +fz_matrix pdf_to_matrix(fz_obj *array); +char *pdf_to_utf8(fz_obj *src); +unsigned short *pdf_to_ucs2(fz_obj *src); +fz_obj *pdf_to_utf8_name(fz_obj *src); +char *pdf_from_ucs2(unsigned short *str); + +/* + * xref and object / stream api + */ + +typedef struct pdf_xref_entry_s pdf_xref_entry; +typedef struct pdf_crypt_s pdf_crypt; + +struct pdf_xref_entry_s +{ + int ofs; /* file offset / objstm object number */ + int gen; /* generation / objstm index */ + int stm_ofs; /* on-disk stream */ + fz_obj *obj; /* stored/cached object */ + int type; /* 0=unset (f)ree i(n)use (o)bjstm */ +}; + +struct pdf_xref_s +{ + fz_stream *file; + int version; + int startxref; + int file_size; + pdf_crypt *crypt; + fz_obj *trailer; + + int len; + pdf_xref_entry *table; + + int page_len; + int page_cap; + fz_obj **page_objs; + fz_obj **page_refs; + + struct pdf_store_s *store; + + char scratch[65536]; +}; + +fz_obj *pdf_resolve_indirect(fz_obj *ref); +fz_error pdf_cache_object(pdf_xref *, int num, int gen); +fz_error pdf_load_object(fz_obj **objp, pdf_xref *, int num, int gen); +void pdf_update_object( pdf_xref *xref, int num, int gen, fz_obj *newobj); + +int pdf_is_stream(pdf_xref *xref, int num, int gen); +fz_stream *pdf_open_inline_stream(fz_stream *chain, pdf_xref *xref, fz_obj *stmobj, int length); +fz_error pdf_load_raw_stream(fz_buffer **bufp, pdf_xref *xref, int num, int gen); +fz_error pdf_load_stream(fz_buffer **bufp, pdf_xref *xref, int num, int gen); +fz_error pdf_open_raw_stream(fz_stream **stmp, pdf_xref *, int num, int gen); +fz_error pdf_open_stream(fz_stream **stmp, pdf_xref *, int num, int gen); +fz_error pdf_open_stream_at(fz_stream **stmp, pdf_xref *xref, int num, int gen, fz_obj *dict, int stm_ofs); + +fz_error pdf_open_xref_with_stream(pdf_xref **xrefp, fz_stream *file, char *password); +fz_error pdf_open_xref(pdf_xref **xrefp, const char *filename, char *password); +void pdf_free_xref(pdf_xref *); + +/* private */ +fz_error pdf_repair_xref(pdf_xref *xref, char *buf, int bufsize); +fz_error pdf_repair_obj_stms(pdf_xref *xref); +void pdf_debug_xref(pdf_xref *); +void pdf_resize_xref(pdf_xref *xref, int newcap); + +/* + * Encryption + */ + +enum +{ + PDF_PERM_PRINT = 1 << 2, + PDF_PERM_CHANGE = 1 << 3, + PDF_PERM_COPY = 1 << 4, + PDF_PERM_NOTES = 1 << 5, + PDF_PERM_FILL_FORM = 1 << 8, + PDF_PERM_ACCESSIBILITY = 1 << 9, + PDF_PERM_ASSEMBLE = 1 << 10, + PDF_PERM_HIGH_RES_PRINT = 1 << 11, + PDF_DEFAULT_PERM_FLAGS = 0xfffc +}; + +fz_error pdf_new_crypt(pdf_crypt **cp, fz_obj *enc, fz_obj *id); +void pdf_free_crypt(pdf_crypt *crypt); + +void pdf_crypt_obj(pdf_crypt *crypt, fz_obj *obj, int num, int gen); +fz_stream *pdf_open_crypt(fz_stream *chain, pdf_crypt *crypt, int num, int gen); +fz_stream *pdf_open_crypt_with_filter(fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen); + +int pdf_needs_password(pdf_xref *xref); +int pdf_authenticate_password(pdf_xref *xref, char *pw); +int pdf_has_permission(pdf_xref *xref, int p); + +int pdf_get_crypt_revision(pdf_xref *xref); +char *pdf_get_crypt_method(pdf_xref *xref); +int pdf_get_crypt_length(pdf_xref *xref); +unsigned char *pdf_get_crypt_key(pdf_xref *xref); + +void pdf_debug_crypt(pdf_crypt *crypt); + +/* + * Resource store + */ + +typedef struct pdf_store_s pdf_store; + +pdf_store *pdf_new_store(void); +void pdf_free_store(pdf_store *store); +void pdf_debug_store(pdf_store *store); + +void pdf_store_item(pdf_store *store, void *keepfn, void *dropfn, fz_obj *key, void *val); +void *pdf_find_item(pdf_store *store, void *dropfn, fz_obj *key); +void pdf_remove_item(pdf_store *store, void *dropfn, fz_obj *key); +void pdf_age_store(pdf_store *store, int maxage); + +/* + * Functions, Colorspaces, Shadings and Images + */ + +typedef struct pdf_function_s pdf_function; + +fz_error pdf_load_function(pdf_function **func, pdf_xref *xref, fz_obj *ref); +void pdf_eval_function(pdf_function *func, float *in, int inlen, float *out, int outlen); +pdf_function *pdf_keep_function(pdf_function *func); +void pdf_drop_function(pdf_function *func); + +fz_error pdf_load_colorspace(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj); +fz_pixmap *pdf_expand_indexed_pixmap(fz_pixmap *src); + +fz_error pdf_load_shading(fz_shade **shadep, pdf_xref *xref, fz_obj *obj); + +fz_error pdf_load_inline_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, fz_stream *file); +fz_error pdf_load_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *obj); +int pdf_is_jpx_image(fz_obj *dict); + +/* + * Pattern + */ + +typedef struct pdf_pattern_s pdf_pattern; + +struct pdf_pattern_s +{ + int refs; + int ismask; + float xstep; + float ystep; + fz_matrix matrix; + fz_rect bbox; + fz_obj *resources; + fz_buffer *contents; +}; + +fz_error pdf_load_pattern(pdf_pattern **patp, pdf_xref *xref, fz_obj *obj); +pdf_pattern *pdf_keep_pattern(pdf_pattern *pat); +void pdf_drop_pattern(pdf_pattern *pat); + +/* + * XObject + */ + +typedef struct pdf_xobject_s pdf_xobject; + +struct pdf_xobject_s +{ + int refs; + fz_matrix matrix; + fz_rect bbox; + int isolated; + int knockout; + int transparency; + fz_colorspace *colorspace; + fz_obj *resources; + fz_buffer *contents; +}; + +fz_error pdf_load_xobject(pdf_xobject **xobjp, pdf_xref *xref, fz_obj *obj); +pdf_xobject *pdf_keep_xobject(pdf_xobject *xobj); +void pdf_drop_xobject(pdf_xobject *xobj); + +/* + * CMap + */ + +typedef struct pdf_cmap_s pdf_cmap; +typedef struct pdf_range_s pdf_range; + +enum { PDF_CMAP_SINGLE, PDF_CMAP_RANGE, PDF_CMAP_TABLE, PDF_CMAP_MULTI }; + +struct pdf_range_s +{ + unsigned short low; + /* Next, we pack 2 fields into the same unsigned short. Top 14 bits + * are the extent, bottom 2 bits are flags: single, range, table, + * multi */ + unsigned short extent_flags; + unsigned short offset; /* range-delta or table-index */ +}; + +struct pdf_cmap_s +{ + int refs; + char cmap_name[32]; + + char usecmap_name[32]; + pdf_cmap *usecmap; + + int wmode; + + int codespace_len; + struct + { + unsigned short n; + unsigned short low; + unsigned short high; + } codespace[40]; + + int rlen, rcap; + pdf_range *ranges; + + int tlen, tcap; + unsigned short *table; +}; + +pdf_cmap *pdf_new_cmap(void); +pdf_cmap *pdf_keep_cmap(pdf_cmap *cmap); +void pdf_drop_cmap(pdf_cmap *cmap); + +void pdf_debug_cmap(pdf_cmap *cmap); +int pdf_get_wmode(pdf_cmap *cmap); +void pdf_set_wmode(pdf_cmap *cmap, int wmode); +void pdf_set_usecmap(pdf_cmap *cmap, pdf_cmap *usecmap); + +void pdf_add_codespace(pdf_cmap *cmap, int low, int high, int n); +void pdf_map_range_to_table(pdf_cmap *cmap, int low, int *map, int len); +void pdf_map_range_to_range(pdf_cmap *cmap, int srclo, int srchi, int dstlo); +void pdf_map_one_to_many(pdf_cmap *cmap, int one, int *many, int len); +void pdf_sort_cmap(pdf_cmap *cmap); + +int pdf_lookup_cmap(pdf_cmap *cmap, int cpt); +int pdf_lookup_cmap_full(pdf_cmap *cmap, int cpt, int *out); +unsigned char *pdf_decode_cmap(pdf_cmap *cmap, unsigned char *s, int *cpt); + +pdf_cmap *pdf_new_identity_cmap(int wmode, int bytes); +fz_error pdf_parse_cmap(pdf_cmap **cmapp, fz_stream *file); +fz_error pdf_load_embedded_cmap(pdf_cmap **cmapp, pdf_xref *xref, fz_obj *ref); +fz_error pdf_load_system_cmap(pdf_cmap **cmapp, char *name); +pdf_cmap *pdf_find_builtin_cmap(char *cmap_name); + +/* + * Font + */ + +enum +{ + PDF_FD_FIXED_PITCH = 1 << 0, + PDF_FD_SERIF = 1 << 1, + PDF_FD_SYMBOLIC = 1 << 2, + PDF_FD_SCRIPT = 1 << 3, + PDF_FD_NONSYMBOLIC = 1 << 5, + PDF_FD_ITALIC = 1 << 6, + PDF_FD_ALL_CAP = 1 << 16, + PDF_FD_SMALL_CAP = 1 << 17, + PDF_FD_FORCE_BOLD = 1 << 18 +}; + +enum { PDF_ROS_CNS, PDF_ROS_GB, PDF_ROS_JAPAN, PDF_ROS_KOREA }; + +void pdf_load_encoding(char **estrings, char *encoding); +int pdf_lookup_agl(char *name); +const char **pdf_lookup_agl_duplicates(int ucs); + +extern const unsigned short pdf_doc_encoding[256]; +extern const char * const pdf_mac_roman[256]; +extern const char * const pdf_mac_expert[256]; +extern const char * const pdf_win_ansi[256]; +extern const char * const pdf_standard[256]; + +typedef struct pdf_font_desc_s pdf_font_desc; +typedef struct pdf_hmtx_s pdf_hmtx; +typedef struct pdf_vmtx_s pdf_vmtx; + +struct pdf_hmtx_s +{ + unsigned short lo; + unsigned short hi; + int w; /* type3 fonts can be big! */ +}; + +struct pdf_vmtx_s +{ + unsigned short lo; + unsigned short hi; + short x; + short y; + short w; +}; + +struct pdf_font_desc_s +{ + int refs; + + fz_font *font; + + /* FontDescriptor */ + int flags; + float italic_angle; + float ascent; + float descent; + float cap_height; + float x_height; + float missing_width; + + /* Encoding (CMap) */ + pdf_cmap *encoding; + pdf_cmap *to_ttf_cmap; + int cid_to_gid_len; + unsigned short *cid_to_gid; + + /* ToUnicode */ + pdf_cmap *to_unicode; + int cid_to_ucs_len; + unsigned short *cid_to_ucs; + + /* Metrics (given in the PDF file) */ + int wmode; + + int hmtx_len, hmtx_cap; + pdf_hmtx dhmtx; + pdf_hmtx *hmtx; + + int vmtx_len, vmtx_cap; + pdf_vmtx dvmtx; + pdf_vmtx *vmtx; + + int is_embedded; +}; + +void pdf_set_font_wmode(pdf_font_desc *font, int wmode); +void pdf_set_default_hmtx(pdf_font_desc *font, int w); +void pdf_set_default_vmtx(pdf_font_desc *font, int y, int w); +void pdf_add_hmtx(pdf_font_desc *font, int lo, int hi, int w); +void pdf_add_vmtx(pdf_font_desc *font, int lo, int hi, int x, int y, int w); +void pdf_end_hmtx(pdf_font_desc *font); +void pdf_end_vmtx(pdf_font_desc *font); +pdf_hmtx pdf_get_hmtx(pdf_font_desc *font, int cid); +pdf_vmtx pdf_get_vmtx(pdf_font_desc *font, int cid); + +fz_error pdf_load_to_unicode(pdf_font_desc *font, pdf_xref *xref, char **strings, char *collection, fz_obj *cmapstm); + +int pdf_font_cid_to_gid(pdf_font_desc *fontdesc, int cid); + +unsigned char *pdf_find_builtin_font(char *name, unsigned int *len); +unsigned char *pdf_find_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len); +unsigned char *pdf_find_substitute_cjk_font(int ros, int serif, unsigned int *len); + +fz_error pdf_load_type3_font(pdf_font_desc **fontp, pdf_xref *xref, fz_obj *rdb, fz_obj *obj); +fz_error pdf_load_font(pdf_font_desc **fontp, pdf_xref *xref, fz_obj *rdb, fz_obj *obj); + +pdf_font_desc *pdf_new_font_desc(void); +pdf_font_desc *pdf_keep_font(pdf_font_desc *fontdesc); +void pdf_drop_font(pdf_font_desc *font); + +void pdf_debug_font(pdf_font_desc *fontdesc); + +/* + * Interactive features + */ + +typedef struct pdf_link_s pdf_link; +typedef struct pdf_annot_s pdf_annot; +typedef struct pdf_outline_s pdf_outline; + +typedef enum pdf_link_kind_e +{ + PDF_LINK_GOTO = 0, + PDF_LINK_URI, + PDF_LINK_LAUNCH, + PDF_LINK_NAMED, + PDF_LINK_ACTION, +} pdf_link_kind; + +struct pdf_link_s +{ + pdf_link_kind kind; + fz_rect rect; + fz_obj *dest; + pdf_link *next; +}; + +struct pdf_annot_s +{ + fz_obj *obj; + fz_rect rect; + pdf_xobject *ap; + fz_matrix matrix; + pdf_annot *next; +}; + +struct pdf_outline_s +{ + char *title; + pdf_link *link; + int count; + pdf_outline *child; + pdf_outline *next; +}; + +fz_obj *pdf_lookup_dest(pdf_xref *xref, fz_obj *needle); +fz_obj *pdf_lookup_name(pdf_xref *xref, char *which, fz_obj *needle); +fz_obj *pdf_load_name_tree(pdf_xref *xref, char *which); + +pdf_outline *pdf_load_outline(pdf_xref *xref); +void pdf_debug_outline(pdf_outline *outline, int level); +void pdf_free_outline(pdf_outline *outline); + +pdf_link *pdf_load_link(pdf_xref *xref, fz_obj *dict); +void pdf_load_links(pdf_link **, pdf_xref *, fz_obj *annots); +void pdf_free_link(pdf_link *link); + +void pdf_load_annots(pdf_annot **, pdf_xref *, fz_obj *annots); +void pdf_free_annot(pdf_annot *link); + +/* + * Page tree, pages and related objects + */ + +typedef struct pdf_page_s pdf_page; + +struct pdf_page_s +{ + fz_rect mediabox; + int rotate; + int transparency; + fz_obj *resources; + fz_buffer *contents; + pdf_link *links; + pdf_annot *annots; +}; + +fz_error pdf_load_page_tree(pdf_xref *xref); +int pdf_find_page_number(pdf_xref *xref, fz_obj *pageobj); +int pdf_count_pages(pdf_xref *xref); + +fz_error pdf_load_page(pdf_page **pagep, pdf_xref *xref, int number); +void pdf_free_page(pdf_page *page); + +/* + * Content stream parsing + */ + +fz_error pdf_run_page_with_usage(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matrix ctm, char *target); +fz_error pdf_run_page(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matrix ctm); +fz_error pdf_run_glyph(pdf_xref *xref, fz_obj *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm); + +#endif diff --git a/contrib/media/updf_newlib/pdf/pdf_annot.c b/contrib/media/updf_newlib/pdf/pdf_annot.c new file mode 100755 index 000000000..2fc9d7bb9 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_annot.c @@ -0,0 +1,234 @@ +#include "fitz.h" +#include "mupdf.h" + +void +pdf_free_link(pdf_link *link) +{ + if (link->next) + pdf_free_link(link->next); + if (link->dest) + fz_drop_obj(link->dest); + fz_free(link); +} + +static fz_obj * +resolve_dest(pdf_xref *xref, fz_obj *dest) +{ + if (fz_is_name(dest) || fz_is_string(dest)) + { + dest = pdf_lookup_dest(xref, dest); + return resolve_dest(xref, dest); + } + + else if (fz_is_array(dest)) + { + return dest; + } + + else if (fz_is_dict(dest)) + { + dest = fz_dict_gets(dest, "D"); + return resolve_dest(xref, dest); + } + + else if (fz_is_indirect(dest)) + return dest; + + return NULL; +} + +pdf_link * +pdf_load_link(pdf_xref *xref, fz_obj *dict) +{ + fz_obj *dest; + fz_obj *action; + fz_obj *obj; + fz_rect bbox; + pdf_link_kind kind; + + dest = NULL; + + obj = fz_dict_gets(dict, "Rect"); + if (obj) + bbox = pdf_to_rect(obj); + else + bbox = fz_empty_rect; + + obj = fz_dict_gets(dict, "Dest"); + if (obj) + { + kind = PDF_LINK_GOTO; + dest = resolve_dest(xref, obj); + } + + action = fz_dict_gets(dict, "A"); + + /* fall back to additional action button's down/up action */ + if (!action) + action = fz_dict_getsa(fz_dict_gets(dict, "AA"), "U", "D"); + + if (action) + { + obj = fz_dict_gets(action, "S"); + if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "GoTo")) + { + kind = PDF_LINK_GOTO; + dest = resolve_dest(xref, fz_dict_gets(action, "D")); + } + else if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "URI")) + { + kind = PDF_LINK_URI; + dest = fz_dict_gets(action, "URI"); + } + else if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "Launch")) + { + kind = PDF_LINK_LAUNCH; + dest = fz_dict_gets(action, "F"); + } + else if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "Named")) + { + kind = PDF_LINK_NAMED; + dest = fz_dict_gets(action, "N"); + } + else if (fz_is_name(obj) && (!strcmp(fz_to_name(obj), "GoToR"))) + { + kind = PDF_LINK_ACTION; + dest = action; + } + else + { + dest = NULL; + } + } + + if (dest) + { + pdf_link *link = fz_malloc(sizeof(pdf_link)); + link->kind = kind; + link->rect = bbox; + link->dest = fz_keep_obj(dest); + link->next = NULL; + return link; + } + + return NULL; +} + +void +pdf_load_links(pdf_link **linkp, pdf_xref *xref, fz_obj *annots) +{ + pdf_link *link, *head, *tail; + fz_obj *obj; + int i; + + head = tail = NULL; + link = NULL; + + for (i = 0; i < fz_array_len(annots); i++) + { + obj = fz_array_get(annots, i); + link = pdf_load_link(xref, obj); + if (link) + { + if (!head) + head = tail = link; + else + { + tail->next = link; + tail = link; + } + } + } + + *linkp = head; +} + +void +pdf_free_annot(pdf_annot *annot) +{ + if (annot->next) + pdf_free_annot(annot->next); + if (annot->ap) + pdf_drop_xobject(annot->ap); + if (annot->obj) + fz_drop_obj(annot->obj); + fz_free(annot); +} + +static void +pdf_transform_annot(pdf_annot *annot) +{ + fz_matrix matrix = annot->ap->matrix; + fz_rect bbox = annot->ap->bbox; + fz_rect rect = annot->rect; + float w, h, x, y; + + bbox = fz_transform_rect(matrix, bbox); + w = (rect.x1 - rect.x0) / (bbox.x1 - bbox.x0); + h = (rect.y1 - rect.y0) / (bbox.y1 - bbox.y0); + x = rect.x0 - bbox.x0; + y = rect.y0 - bbox.y0; + + annot->matrix = fz_concat(fz_scale(w, h), fz_translate(x, y)); +} + +void +pdf_load_annots(pdf_annot **annotp, pdf_xref *xref, fz_obj *annots) +{ + pdf_annot *annot, *head, *tail; + fz_obj *obj, *ap, *as, *n, *rect; + pdf_xobject *form; + fz_error error; + int i; + + head = tail = NULL; + annot = NULL; + + for (i = 0; i < fz_array_len(annots); i++) + { + obj = fz_array_get(annots, i); + + rect = fz_dict_gets(obj, "Rect"); + ap = fz_dict_gets(obj, "AP"); + as = fz_dict_gets(obj, "AS"); + if (fz_is_dict(ap)) + { + n = fz_dict_gets(ap, "N"); /* normal state */ + + /* lookup current state in sub-dictionary */ + if (!pdf_is_stream(xref, fz_to_num(n), fz_to_gen(n))) + n = fz_dict_get(n, as); + + if (pdf_is_stream(xref, fz_to_num(n), fz_to_gen(n))) + { + error = pdf_load_xobject(&form, xref, n); + if (error) + { + fz_catch(error, "ignoring broken annotation"); + continue; + } + + annot = fz_malloc(sizeof(pdf_annot)); + annot->obj = fz_keep_obj(obj); + annot->rect = pdf_to_rect(rect); + annot->ap = form; + annot->next = NULL; + + pdf_transform_annot(annot); + + if (annot) + { + if (!head) + head = tail = annot; + else + { + tail->next = annot; + tail = annot; + } + } + } + } + } + + *annotp = head; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_cmap.c b/contrib/media/updf_newlib/pdf/pdf_cmap.c new file mode 100755 index 000000000..2c5048aee --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_cmap.c @@ -0,0 +1,510 @@ +/* + * The CMap data structure here is constructed on the fly by + * adding simple range-to-range mappings. Then the data structure + * is optimized to contain both range-to-range and range-to-table + * lookups. + * + * Any one-to-many mappings are inserted as one-to-table + * lookups in the beginning, and are not affected by the optimization + * stage. + * + * There is a special function to add a 256-length range-to-table mapping. + * The ranges do not have to be added in order. + * + * This code can be a lot simpler if we don't care about wasting memory, + * or can trust the parser to give us optimal mappings. + */ + +#include "fitz.h" +#include "mupdf.h" + +/* Macros for accessing the combined extent_flags field */ +#define pdf_range_high(r) ((r)->low + ((r)->extent_flags >> 2)) +#define pdf_range_flags(r) ((r)->extent_flags & 3) +#define pdf_range_set_high(r, h) \ + ((r)->extent_flags = (((r)->extent_flags & 3) | ((h - (r)->low) << 2))) +#define pdf_range_set_flags(r, f) \ + ((r)->extent_flags = (((r)->extent_flags & ~3) | f)) + +/* + * Allocate, destroy and simple parameters. + */ + +pdf_cmap * +pdf_new_cmap(void) +{ + pdf_cmap *cmap; + + cmap = fz_malloc(sizeof(pdf_cmap)); + cmap->refs = 1; + + strcpy(cmap->cmap_name, ""); + strcpy(cmap->usecmap_name, ""); + cmap->usecmap = NULL; + cmap->wmode = 0; + cmap->codespace_len = 0; + + cmap->rlen = 0; + cmap->rcap = 0; + cmap->ranges = NULL; + + cmap->tlen = 0; + cmap->tcap = 0; + cmap->table = NULL; + + return cmap; +} + +pdf_cmap * +pdf_keep_cmap(pdf_cmap *cmap) +{ + if (cmap->refs >= 0) + cmap->refs ++; + return cmap; +} + +void +pdf_drop_cmap(pdf_cmap *cmap) +{ + if (cmap->refs >= 0) + { + if (--cmap->refs == 0) + { + if (cmap->usecmap) + pdf_drop_cmap(cmap->usecmap); + fz_free(cmap->ranges); + fz_free(cmap->table); + fz_free(cmap); + } + } +} + +void +pdf_set_usecmap(pdf_cmap *cmap, pdf_cmap *usecmap) +{ + int i; + + if (cmap->usecmap) + pdf_drop_cmap(cmap->usecmap); + cmap->usecmap = pdf_keep_cmap(usecmap); + + if (cmap->codespace_len == 0) + { + cmap->codespace_len = usecmap->codespace_len; + for (i = 0; i < usecmap->codespace_len; i++) + cmap->codespace[i] = usecmap->codespace[i]; + } +} + +int +pdf_get_wmode(pdf_cmap *cmap) +{ + return cmap->wmode; +} + +void +pdf_set_wmode(pdf_cmap *cmap, int wmode) +{ + cmap->wmode = wmode; +} + +void +pdf_debug_cmap(pdf_cmap *cmap) +{ + int i, k, n; + + printf("cmap $%p /%s {\n", (void *) cmap, cmap->cmap_name); + + if (cmap->usecmap_name[0]) + printf("\tusecmap /%s\n", cmap->usecmap_name); + if (cmap->usecmap) + printf("\tusecmap $%p\n", (void *) cmap->usecmap); + + printf("\twmode %d\n", cmap->wmode); + + printf("\tcodespaces {\n"); + for (i = 0; i < cmap->codespace_len; i++) + { + printf("\t\t<%x> <%x>\n", cmap->codespace[i].low, cmap->codespace[i].high); + } + printf("\t}\n"); + + printf("\tranges (%d,%d) {\n", cmap->rlen, cmap->tlen); + for (i = 0; i < cmap->rlen; i++) + { + pdf_range *r = &cmap->ranges[i]; + printf("\t\t<%04x> <%04x> ", r->low, pdf_range_high(r)); + if (pdf_range_flags(r) == PDF_CMAP_TABLE) + { + printf("[ "); + for (k = 0; k < pdf_range_high(r) - r->low + 1; k++) + printf("%d ", cmap->table[r->offset + k]); + printf("]\n"); + } + else if (pdf_range_flags(r) == PDF_CMAP_MULTI) + { + printf("< "); + n = cmap->table[r->offset]; + for (k = 0; k < n; k++) + printf("%04x ", cmap->table[r->offset + 1 + k]); + printf(">\n"); + } + else + printf("%d\n", r->offset); + } + printf("\t}\n}\n"); +} + +/* + * Add a codespacerange section. + * These ranges are used by pdf_decode_cmap to decode + * multi-byte encoded strings. + */ +void +pdf_add_codespace(pdf_cmap *cmap, int low, int high, int n) +{ + if (cmap->codespace_len + 1 == nelem(cmap->codespace)) + { + fz_warn("assert: too many code space ranges"); + return; + } + + cmap->codespace[cmap->codespace_len].n = n; + cmap->codespace[cmap->codespace_len].low = low; + cmap->codespace[cmap->codespace_len].high = high; + cmap->codespace_len ++; +} + +/* + * Add an integer to the table. + */ +static void +add_table(pdf_cmap *cmap, int value) +{ + if (cmap->tlen == USHRT_MAX) + { + fz_warn("cmap table is full; ignoring additional entries"); + return; + } + if (cmap->tlen + 1 > cmap->tcap) + { + cmap->tcap = cmap->tcap > 1 ? (cmap->tcap * 3) / 2 : 256; + cmap->table = fz_realloc(cmap->table, cmap->tcap, sizeof(unsigned short)); + } + cmap->table[cmap->tlen++] = value; +} + +/* + * Add a range. + */ +static void +add_range(pdf_cmap *cmap, int low, int high, int flag, int offset) +{ + /* If the range is too large to be represented, split it */ + if (high - low > 0x3fff) + { + add_range(cmap, low, low+0x3fff, flag, offset); + add_range(cmap, low+0x3fff, high, flag, offset+0x3fff); + return; + } + if (cmap->rlen + 1 > cmap->rcap) + { + cmap->rcap = cmap->rcap > 1 ? (cmap->rcap * 3) / 2 : 256; + cmap->ranges = fz_realloc(cmap->ranges, cmap->rcap, sizeof(pdf_range)); + } + cmap->ranges[cmap->rlen].low = low; + pdf_range_set_high(&cmap->ranges[cmap->rlen], high); + pdf_range_set_flags(&cmap->ranges[cmap->rlen], flag); + cmap->ranges[cmap->rlen].offset = offset; + cmap->rlen ++; +} + +/* + * Add a range-to-table mapping. + */ +void +pdf_map_range_to_table(pdf_cmap *cmap, int low, int *table, int len) +{ + int i; + int high = low + len; + int offset = cmap->tlen; + if (cmap->tlen + len >= USHRT_MAX) + fz_warn("cannot map range to table; table is full"); + else + { + for (i = 0; i < len; i++) + add_table(cmap, table[i]); + add_range(cmap, low, high, PDF_CMAP_TABLE, offset); + } +} + +/* + * Add a range of contiguous one-to-one mappings (ie 1..5 maps to 21..25) + */ +void +pdf_map_range_to_range(pdf_cmap *cmap, int low, int high, int offset) +{ + add_range(cmap, low, high, high - low == 0 ? PDF_CMAP_SINGLE : PDF_CMAP_RANGE, offset); +} + +/* + * Add a single one-to-many mapping. + */ +void +pdf_map_one_to_many(pdf_cmap *cmap, int low, int *values, int len) +{ + int offset, i; + + if (len == 1) + { + add_range(cmap, low, low, PDF_CMAP_SINGLE, values[0]); + return; + } + + if (len > 8) + { + fz_warn("one to many mapping is too large (%d); truncating", len); + len = 8; + } + + if (len == 2 && + values[0] >= 0xD800 && values[0] <= 0xDBFF && + values[1] >= 0xDC00 && values[1] <= 0xDFFF) + { + fz_warn("ignoring surrogate pair mapping in cmap"); + return; + } + + if (cmap->tlen + len + 1 >= USHRT_MAX) + fz_warn("cannot map one to many; table is full"); + else + { + offset = cmap->tlen; + add_table(cmap, len); + for (i = 0; i < len; i++) + add_table(cmap, values[i]); + add_range(cmap, low, low, PDF_CMAP_MULTI, offset); + } +} + +/* + * Sort the input ranges. + * Merge contiguous input ranges to range-to-range if the output is contiguous. + * Merge contiguous input ranges to range-to-table if the output is random. + */ + +static int cmprange(const void *va, const void *vb) +{ + return ((const pdf_range*)va)->low - ((const pdf_range*)vb)->low; +} + +void +pdf_sort_cmap(pdf_cmap *cmap) +{ + pdf_range *a; /* last written range on output */ + pdf_range *b; /* current range examined on input */ + + if (cmap->rlen == 0) + return; + + qsort(cmap->ranges, cmap->rlen, sizeof(pdf_range), cmprange); + + if (cmap->tlen == USHRT_MAX) + { + fz_warn("cmap table is full; will not combine ranges"); + return; + } + + a = cmap->ranges; + b = cmap->ranges + 1; + + while (b < cmap->ranges + cmap->rlen) + { + /* ignore one-to-many mappings */ + if (pdf_range_flags(b) == PDF_CMAP_MULTI) + { + *(++a) = *b; + } + + /* input contiguous */ + else if (pdf_range_high(a) + 1 == b->low) + { + /* output contiguous */ + if (pdf_range_high(a) - a->low + a->offset + 1 == b->offset) + { + /* SR -> R and SS -> R and RR -> R and RS -> R */ + if ((pdf_range_flags(a) == PDF_CMAP_SINGLE || pdf_range_flags(a) == PDF_CMAP_RANGE) && (pdf_range_high(b) - a->low <= 0x3fff)) + { + pdf_range_set_flags(a, PDF_CMAP_RANGE); + pdf_range_set_high(a, pdf_range_high(b)); + } + + /* LS -> L */ + else if (pdf_range_flags(a) == PDF_CMAP_TABLE && pdf_range_flags(b) == PDF_CMAP_SINGLE && (pdf_range_high(b) - a->low <= 0x3fff)) + { + pdf_range_set_high(a, pdf_range_high(b)); + add_table(cmap, b->offset); + } + + /* LR -> LR */ + else if (pdf_range_flags(a) == PDF_CMAP_TABLE && pdf_range_flags(b) == PDF_CMAP_RANGE) + { + *(++a) = *b; + } + + /* XX -> XX */ + else + { + *(++a) = *b; + } + } + + /* output separated */ + else + { + /* SS -> L */ + if (pdf_range_flags(a) == PDF_CMAP_SINGLE && pdf_range_flags(b) == PDF_CMAP_SINGLE) + { + pdf_range_set_flags(a, PDF_CMAP_TABLE); + pdf_range_set_high(a, pdf_range_high(b)); + add_table(cmap, a->offset); + add_table(cmap, b->offset); + a->offset = cmap->tlen - 2; + } + + /* LS -> L */ + else if (pdf_range_flags(a) == PDF_CMAP_TABLE && pdf_range_flags(b) == PDF_CMAP_SINGLE && (pdf_range_high(b) - a->low <= 0x3fff)) + { + pdf_range_set_high(a, pdf_range_high(b)); + add_table(cmap, b->offset); + } + + /* XX -> XX */ + else + { + *(++a) = *b; + } + } + } + + /* input separated: XX -> XX */ + else + { + *(++a) = *b; + } + + b ++; + } + + cmap->rlen = a - cmap->ranges + 1; + + fz_flush_warnings(); +} + +/* + * Lookup the mapping of a codepoint. + */ +int +pdf_lookup_cmap(pdf_cmap *cmap, int cpt) +{ + int l = 0; + int r = cmap->rlen - 1; + int m; + + while (l <= r) + { + m = (l + r) >> 1; + if (cpt < cmap->ranges[m].low) + r = m - 1; + else if (cpt > pdf_range_high(&cmap->ranges[m])) + l = m + 1; + else + { + int i = cpt - cmap->ranges[m].low + cmap->ranges[m].offset; + if (pdf_range_flags(&cmap->ranges[m]) == PDF_CMAP_TABLE) + return cmap->table[i]; + if (pdf_range_flags(&cmap->ranges[m]) == PDF_CMAP_MULTI) + return -1; /* should use lookup_cmap_full */ + return i; + } + } + + if (cmap->usecmap) + return pdf_lookup_cmap(cmap->usecmap, cpt); + + return -1; +} + +int +pdf_lookup_cmap_full(pdf_cmap *cmap, int cpt, int *out) +{ + int i, k, n; + int l = 0; + int r = cmap->rlen - 1; + int m; + + while (l <= r) + { + m = (l + r) >> 1; + if (cpt < cmap->ranges[m].low) + r = m - 1; + else if (cpt > pdf_range_high(&cmap->ranges[m])) + l = m + 1; + else + { + k = cpt - cmap->ranges[m].low + cmap->ranges[m].offset; + if (pdf_range_flags(&cmap->ranges[m]) == PDF_CMAP_TABLE) + { + out[0] = cmap->table[k]; + return 1; + } + else if (pdf_range_flags(&cmap->ranges[m]) == PDF_CMAP_MULTI) + { + n = cmap->ranges[m].offset; + for (i = 0; i < cmap->table[n]; i++) + out[i] = cmap->table[n + i + 1]; + return cmap->table[n]; + } + else + { + out[0] = k; + return 1; + } + } + } + + if (cmap->usecmap) + return pdf_lookup_cmap_full(cmap->usecmap, cpt, out); + + return 0; +} + +/* + * Use the codespace ranges to extract a codepoint from a + * multi-byte encoded string. + */ +unsigned char * +pdf_decode_cmap(pdf_cmap *cmap, unsigned char *buf, int *cpt) +{ + int k, n, c; + + c = 0; + for (n = 0; n < 4; n++) + { + c = (c << 8) | buf[n]; + for (k = 0; k < cmap->codespace_len; k++) + { + if (cmap->codespace[k].n == n + 1) + { + if (c >= cmap->codespace[k].low && c <= cmap->codespace[k].high) + { + *cpt = c; + return buf + n + 1; + } + } + } + } + + *cpt = 0; + return buf + 1; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_cmap_load.c b/contrib/media/updf_newlib/pdf/pdf_cmap_load.c new file mode 100755 index 000000000..12adeb40d --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_cmap_load.c @@ -0,0 +1,118 @@ +#include "fitz.h" +#include "mupdf.h" + +/* + * Load CMap stream in PDF file + */ +fz_error +pdf_load_embedded_cmap(pdf_cmap **cmapp, pdf_xref *xref, fz_obj *stmobj) +{ + fz_error error = fz_okay; + fz_stream *file = NULL; + pdf_cmap *cmap = NULL; + pdf_cmap *usecmap; + fz_obj *wmode; + fz_obj *obj; + + if ((*cmapp = pdf_find_item(xref->store, pdf_drop_cmap, stmobj))) + { + pdf_keep_cmap(*cmapp); + return fz_okay; + } + + error = pdf_open_stream(&file, xref, fz_to_num(stmobj), fz_to_gen(stmobj)); + if (error) + { + error = fz_rethrow(error, "cannot open cmap stream (%d %d R)", fz_to_num(stmobj), fz_to_gen(stmobj)); + goto cleanup; + } + + error = pdf_parse_cmap(&cmap, file); + if (error) + { + error = fz_rethrow(error, "cannot parse cmap stream (%d %d R)", fz_to_num(stmobj), fz_to_gen(stmobj)); + goto cleanup; + } + + fz_close(file); + + wmode = fz_dict_gets(stmobj, "WMode"); + if (fz_is_int(wmode)) + pdf_set_wmode(cmap, fz_to_int(wmode)); + + obj = fz_dict_gets(stmobj, "UseCMap"); + if (fz_is_name(obj)) + { + error = pdf_load_system_cmap(&usecmap, fz_to_name(obj)); + if (error) + { + error = fz_rethrow(error, "cannot load system usecmap '%s'", fz_to_name(obj)); + goto cleanup; + } + pdf_set_usecmap(cmap, usecmap); + pdf_drop_cmap(usecmap); + } + else if (fz_is_indirect(obj)) + { + error = pdf_load_embedded_cmap(&usecmap, xref, obj); + if (error) + { + error = fz_rethrow(error, "cannot load embedded usecmap (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + goto cleanup; + } + pdf_set_usecmap(cmap, usecmap); + pdf_drop_cmap(usecmap); + } + + pdf_store_item(xref->store, pdf_keep_cmap, pdf_drop_cmap, stmobj, cmap); + + *cmapp = cmap; + return fz_okay; + +cleanup: + if (file) + fz_close(file); + if (cmap) + pdf_drop_cmap(cmap); + return error; /* already rethrown */ +} + +/* + * Create an Identity-* CMap (for both 1 and 2-byte encodings) + */ +pdf_cmap * +pdf_new_identity_cmap(int wmode, int bytes) +{ + pdf_cmap *cmap = pdf_new_cmap(); + sprintf(cmap->cmap_name, "Identity-%c", wmode ? 'V' : 'H'); + pdf_add_codespace(cmap, 0x0000, 0xffff, bytes); + pdf_map_range_to_range(cmap, 0x0000, 0xffff, 0); + pdf_sort_cmap(cmap); + pdf_set_wmode(cmap, wmode); + return cmap; +} + +/* + * Load predefined CMap from system. + */ +fz_error +pdf_load_system_cmap(pdf_cmap **cmapp, char *cmap_name) +{ + pdf_cmap *usecmap; + pdf_cmap *cmap; + + cmap = pdf_find_builtin_cmap(cmap_name); + if (!cmap) + return fz_throw("no builtin cmap file: %s", cmap_name); + + if (cmap->usecmap_name[0] && !cmap->usecmap) + { + usecmap = pdf_find_builtin_cmap(cmap->usecmap_name); + if (!usecmap) + return fz_throw("nu builtin cmap file: %s", cmap->usecmap_name); + pdf_set_usecmap(cmap, usecmap); + } + + *cmapp = cmap; + return fz_okay; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_cmap_parse.c b/contrib/media/updf_newlib/pdf/pdf_cmap_parse.c new file mode 100755 index 000000000..edd97de81 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_cmap_parse.c @@ -0,0 +1,490 @@ +#include "fitz.h" +#include "mupdf.h" + +/* + * CMap parser + */ + +enum +{ + TOK_USECMAP = PDF_NUM_TOKENS, + TOK_BEGIN_CODESPACE_RANGE, + TOK_END_CODESPACE_RANGE, + TOK_BEGIN_BF_CHAR, + TOK_END_BF_CHAR, + TOK_BEGIN_BF_RANGE, + TOK_END_BF_RANGE, + TOK_BEGIN_CID_CHAR, + TOK_END_CID_CHAR, + TOK_BEGIN_CID_RANGE, + TOK_END_CID_RANGE, + TOK_END_CMAP +}; + +static int +pdf_cmap_token_from_keyword(char *key) +{ + if (!strcmp(key, "usecmap")) return TOK_USECMAP; + if (!strcmp(key, "begincodespacerange")) return TOK_BEGIN_CODESPACE_RANGE; + if (!strcmp(key, "endcodespacerange")) return TOK_END_CODESPACE_RANGE; + if (!strcmp(key, "beginbfchar")) return TOK_BEGIN_BF_CHAR; + if (!strcmp(key, "endbfchar")) return TOK_END_BF_CHAR; + if (!strcmp(key, "beginbfrange")) return TOK_BEGIN_BF_RANGE; + if (!strcmp(key, "endbfrange")) return TOK_END_BF_RANGE; + if (!strcmp(key, "begincidchar")) return TOK_BEGIN_CID_CHAR; + if (!strcmp(key, "endcidchar")) return TOK_END_CID_CHAR; + if (!strcmp(key, "begincidrange")) return TOK_BEGIN_CID_RANGE; + if (!strcmp(key, "endcidrange")) return TOK_END_CID_RANGE; + if (!strcmp(key, "endcmap")) return TOK_END_CMAP; + return PDF_TOK_KEYWORD; +} + +static int +pdf_code_from_string(char *buf, int len) +{ + int a = 0; + while (len--) + a = (a << 8) | *(unsigned char *)buf++; + return a; +} + +static fz_error +pdf_lex_cmap(int *tok, fz_stream *file, char *buf, int n, int *sl) +{ + fz_error error; + + error = pdf_lex(tok, file, buf, n, sl); + if (error) + return fz_rethrow(error, "cannot parse cmap token"); + + if (*tok == PDF_TOK_KEYWORD) + *tok = pdf_cmap_token_from_keyword(buf); + + return fz_okay; +} + +static fz_error +pdf_parse_cmap_name(pdf_cmap *cmap, fz_stream *file) +{ + fz_error error; + char buf[256]; + int tok; + int len; + + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + + if (tok == PDF_TOK_NAME) + fz_strlcpy(cmap->cmap_name, buf, sizeof(cmap->cmap_name)); + else + fz_warn("expected name after CMapName in cmap"); + + return fz_okay; +} + +static fz_error +pdf_parse_wmode(pdf_cmap *cmap, fz_stream *file) +{ + fz_error error; + char buf[256]; + int tok; + int len; + + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + + if (tok == PDF_TOK_INT) + pdf_set_wmode(cmap, atoi(buf)); + else + fz_warn("expected integer after WMode in cmap"); + + return fz_okay; +} + +static fz_error +pdf_parse_codespace_range(pdf_cmap *cmap, fz_stream *file) +{ + fz_error error; + char buf[256]; + int tok; + int len; + int lo, hi; + + while (1) + { + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + + if (tok == TOK_END_CODESPACE_RANGE) + return fz_okay; + + else if (tok == PDF_TOK_STRING) + { + lo = pdf_code_from_string(buf, len); + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + if (tok == PDF_TOK_STRING) + { + hi = pdf_code_from_string(buf, len); + pdf_add_codespace(cmap, lo, hi, len); + } + else break; + } + + else break; + } + + return fz_throw("expected string or endcodespacerange"); +} + +static fz_error +pdf_parse_cid_range(pdf_cmap *cmap, fz_stream *file) +{ + fz_error error; + char buf[256]; + int tok; + int len; + int lo, hi, dst; + + while (1) + { + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + + if (tok == TOK_END_CID_RANGE) + return fz_okay; + + else if (tok != PDF_TOK_STRING) + return fz_throw("expected string or endcidrange"); + + lo = pdf_code_from_string(buf, len); + + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + if (tok != PDF_TOK_STRING) + return fz_throw("expected string"); + + hi = pdf_code_from_string(buf, len); + + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + if (tok != PDF_TOK_INT) + return fz_throw("expected integer"); + + dst = atoi(buf); + + pdf_map_range_to_range(cmap, lo, hi, dst); + } +} + +static fz_error +pdf_parse_cid_char(pdf_cmap *cmap, fz_stream *file) +{ + fz_error error; + char buf[256]; + int tok; + int len; + int src, dst; + + while (1) + { + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + + if (tok == TOK_END_CID_CHAR) + return fz_okay; + + else if (tok != PDF_TOK_STRING) + return fz_throw("expected string or endcidchar"); + + src = pdf_code_from_string(buf, len); + + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + if (tok != PDF_TOK_INT) + return fz_throw("expected integer"); + + dst = atoi(buf); + + pdf_map_range_to_range(cmap, src, src, dst); + } +} + +static fz_error +pdf_parse_bf_range_array(pdf_cmap *cmap, fz_stream *file, int lo, int hi) +{ + fz_error error; + char buf[256]; + int tok; + int len; + int dst[256]; + int i; + + while (1) + { + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + + if (tok == PDF_TOK_CLOSE_ARRAY) + return fz_okay; + + /* Note: does not handle [ /Name /Name ... ] */ + else if (tok != PDF_TOK_STRING) + return fz_throw("expected string or ]"); + + if (len / 2) + { + for (i = 0; i < len / 2; i++) + dst[i] = pdf_code_from_string(buf + i * 2, 2); + + pdf_map_one_to_many(cmap, lo, dst, len / 2); + } + + lo ++; + } +} + +static fz_error +pdf_parse_bf_range(pdf_cmap *cmap, fz_stream *file) +{ + fz_error error; + char buf[256]; + int tok; + int len; + int lo, hi, dst; + + while (1) + { + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + + if (tok == TOK_END_BF_RANGE) + return fz_okay; + + else if (tok != PDF_TOK_STRING) + return fz_throw("expected string or endbfrange"); + + lo = pdf_code_from_string(buf, len); + + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + if (tok != PDF_TOK_STRING) + return fz_throw("expected string"); + + hi = pdf_code_from_string(buf, len); + + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + + if (tok == PDF_TOK_STRING) + { + if (len == 2) + { + dst = pdf_code_from_string(buf, len); + pdf_map_range_to_range(cmap, lo, hi, dst); + } + else + { + int dststr[256]; + int i; + + if (len / 2) + { + for (i = 0; i < len / 2; i++) + dststr[i] = pdf_code_from_string(buf + i * 2, 2); + + while (lo <= hi) + { + dststr[i-1] ++; + pdf_map_one_to_many(cmap, lo, dststr, i); + lo ++; + } + } + } + } + + else if (tok == PDF_TOK_OPEN_ARRAY) + { + error = pdf_parse_bf_range_array(cmap, file, lo, hi); + if (error) + return fz_rethrow(error, "cannot map bfrange"); + } + + else + { + return fz_throw("expected string or array or endbfrange"); + } + } +} + +static fz_error +pdf_parse_bf_char(pdf_cmap *cmap, fz_stream *file) +{ + fz_error error; + char buf[256]; + int tok; + int len; + int dst[256]; + int src; + int i; + + while (1) + { + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + + if (tok == TOK_END_BF_CHAR) + return fz_okay; + + else if (tok != PDF_TOK_STRING) + return fz_throw("expected string or endbfchar"); + + src = pdf_code_from_string(buf, len); + + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "syntaxerror in cmap"); + /* Note: does not handle /dstName */ + if (tok != PDF_TOK_STRING) + return fz_throw("expected string"); + + if (len / 2) + { + for (i = 0; i < len / 2; i++) + dst[i] = pdf_code_from_string(buf + i * 2, 2); + pdf_map_one_to_many(cmap, src, dst, i); + } + } +} + +fz_error +pdf_parse_cmap(pdf_cmap **cmapp, fz_stream *file) +{ + fz_error error; + pdf_cmap *cmap; + char key[64]; + char buf[256]; + int tok; + int len; + + cmap = pdf_new_cmap(); + + strcpy(key, ".notdef"); + + while (1) + { + error = pdf_lex_cmap(&tok, file, buf, sizeof buf, &len); + if (error) + { + error = fz_rethrow(error, "syntaxerror in cmap"); + goto cleanup; + } + + if (tok == PDF_TOK_EOF || tok == TOK_END_CMAP) + break; + + else if (tok == PDF_TOK_NAME) + { + if (!strcmp(buf, "CMapName")) + { + error = pdf_parse_cmap_name(cmap, file); + if (error) + { + error = fz_rethrow(error, "syntaxerror in cmap after CMapName"); + goto cleanup; + } + } + else if (!strcmp(buf, "WMode")) + { + error = pdf_parse_wmode(cmap, file); + if (error) + { + error = fz_rethrow(error, "syntaxerror in cmap after WMode"); + goto cleanup; + } + } + else + fz_strlcpy(key, buf, sizeof key); + } + + else if (tok == TOK_USECMAP) + { + fz_strlcpy(cmap->usecmap_name, key, sizeof(cmap->usecmap_name)); + } + + else if (tok == TOK_BEGIN_CODESPACE_RANGE) + { + error = pdf_parse_codespace_range(cmap, file); + if (error) + { + error = fz_rethrow(error, "syntaxerror in cmap codespacerange"); + goto cleanup; + } + } + + else if (tok == TOK_BEGIN_BF_CHAR) + { + error = pdf_parse_bf_char(cmap, file); + if (error) + { + error = fz_rethrow(error, "syntaxerror in cmap bfchar"); + goto cleanup; + } + } + + else if (tok == TOK_BEGIN_CID_CHAR) + { + error = pdf_parse_cid_char(cmap, file); + if (error) + { + error = fz_rethrow(error, "syntaxerror in cmap cidchar"); + goto cleanup; + } + } + + else if (tok == TOK_BEGIN_BF_RANGE) + { + error = pdf_parse_bf_range(cmap, file); + if (error) + { + error = fz_rethrow(error, "syntaxerror in cmap bfrange"); + goto cleanup; + } + } + + else if (tok == TOK_BEGIN_CID_RANGE) + { + error = pdf_parse_cid_range(cmap, file); + if (error) + { + error = fz_rethrow(error, "syntaxerror in cmap cidrange"); + goto cleanup; + } + } + + /* ignore everything else */ + } + + pdf_sort_cmap(cmap); + + *cmapp = cmap; + return fz_okay; + +cleanup: + pdf_drop_cmap(cmap); + return error; /* already rethrown */ +} diff --git a/contrib/media/updf_newlib/pdf/pdf_cmap_table.c b/contrib/media/updf_newlib/pdf/pdf_cmap_table.c new file mode 100755 index 000000000..daf81ed45 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_cmap_table.c @@ -0,0 +1,184 @@ +#include "fitz.h" +#include "mupdf.h" + +#ifndef NOCJK +#include "../generated/cmap_cns.h" +#include "../generated/cmap_gb.h" +#include "../generated/cmap_japan.h" +#include "../generated/cmap_korea.h" +#endif + +static const struct { char *name; pdf_cmap *cmap; } cmap_table[] = +{ +#ifndef NOCJK + {"78-EUC-H",&cmap_78_EUC_H}, + {"78-EUC-V",&cmap_78_EUC_V}, + {"78-H",&cmap_78_H}, + {"78-RKSJ-H",&cmap_78_RKSJ_H}, + {"78-RKSJ-V",&cmap_78_RKSJ_V}, + {"78-V",&cmap_78_V}, + {"78ms-RKSJ-H",&cmap_78ms_RKSJ_H}, + {"78ms-RKSJ-V",&cmap_78ms_RKSJ_V}, + {"83pv-RKSJ-H",&cmap_83pv_RKSJ_H}, + {"90ms-RKSJ-H",&cmap_90ms_RKSJ_H}, + {"90ms-RKSJ-V",&cmap_90ms_RKSJ_V}, + {"90msp-RKSJ-H",&cmap_90msp_RKSJ_H}, + {"90msp-RKSJ-V",&cmap_90msp_RKSJ_V}, + {"90pv-RKSJ-H",&cmap_90pv_RKSJ_H}, + {"90pv-RKSJ-V",&cmap_90pv_RKSJ_V}, + {"Add-H",&cmap_Add_H}, + {"Add-RKSJ-H",&cmap_Add_RKSJ_H}, + {"Add-RKSJ-V",&cmap_Add_RKSJ_V}, + {"Add-V",&cmap_Add_V}, + {"Adobe-CNS1-0",&cmap_Adobe_CNS1_0}, + {"Adobe-CNS1-1",&cmap_Adobe_CNS1_1}, + {"Adobe-CNS1-2",&cmap_Adobe_CNS1_2}, + {"Adobe-CNS1-3",&cmap_Adobe_CNS1_3}, + {"Adobe-CNS1-4",&cmap_Adobe_CNS1_4}, + {"Adobe-CNS1-5",&cmap_Adobe_CNS1_5}, + {"Adobe-CNS1-6",&cmap_Adobe_CNS1_6}, + {"Adobe-CNS1-UCS2",&cmap_Adobe_CNS1_UCS2}, + {"Adobe-GB1-0",&cmap_Adobe_GB1_0}, + {"Adobe-GB1-1",&cmap_Adobe_GB1_1}, + {"Adobe-GB1-2",&cmap_Adobe_GB1_2}, + {"Adobe-GB1-3",&cmap_Adobe_GB1_3}, + {"Adobe-GB1-4",&cmap_Adobe_GB1_4}, + {"Adobe-GB1-5",&cmap_Adobe_GB1_5}, + {"Adobe-GB1-UCS2",&cmap_Adobe_GB1_UCS2}, + {"Adobe-Japan1-0",&cmap_Adobe_Japan1_0}, + {"Adobe-Japan1-1",&cmap_Adobe_Japan1_1}, + {"Adobe-Japan1-2",&cmap_Adobe_Japan1_2}, + {"Adobe-Japan1-3",&cmap_Adobe_Japan1_3}, + {"Adobe-Japan1-4",&cmap_Adobe_Japan1_4}, + {"Adobe-Japan1-5",&cmap_Adobe_Japan1_5}, + {"Adobe-Japan1-6",&cmap_Adobe_Japan1_6}, + {"Adobe-Japan1-UCS2",&cmap_Adobe_Japan1_UCS2}, + {"Adobe-Japan2-0",&cmap_Adobe_Japan2_0}, + {"Adobe-Korea1-0",&cmap_Adobe_Korea1_0}, + {"Adobe-Korea1-1",&cmap_Adobe_Korea1_1}, + {"Adobe-Korea1-2",&cmap_Adobe_Korea1_2}, + {"Adobe-Korea1-UCS2",&cmap_Adobe_Korea1_UCS2}, + {"B5-H",&cmap_B5_H}, + {"B5-V",&cmap_B5_V}, + {"B5pc-H",&cmap_B5pc_H}, + {"B5pc-V",&cmap_B5pc_V}, + {"CNS-EUC-H",&cmap_CNS_EUC_H}, + {"CNS-EUC-V",&cmap_CNS_EUC_V}, + {"CNS1-H",&cmap_CNS1_H}, + {"CNS1-V",&cmap_CNS1_V}, + {"CNS2-H",&cmap_CNS2_H}, + {"CNS2-V",&cmap_CNS2_V}, + {"ETHK-B5-H",&cmap_ETHK_B5_H}, + {"ETHK-B5-V",&cmap_ETHK_B5_V}, + {"ETen-B5-H",&cmap_ETen_B5_H}, + {"ETen-B5-V",&cmap_ETen_B5_V}, + {"ETenms-B5-H",&cmap_ETenms_B5_H}, + {"ETenms-B5-V",&cmap_ETenms_B5_V}, + {"EUC-H",&cmap_EUC_H}, + {"EUC-V",&cmap_EUC_V}, + {"Ext-H",&cmap_Ext_H}, + {"Ext-RKSJ-H",&cmap_Ext_RKSJ_H}, + {"Ext-RKSJ-V",&cmap_Ext_RKSJ_V}, + {"Ext-V",&cmap_Ext_V}, + {"GB-EUC-H",&cmap_GB_EUC_H}, + {"GB-EUC-V",&cmap_GB_EUC_V}, + {"GB-H",&cmap_GB_H}, + {"GB-V",&cmap_GB_V}, + {"GBK-EUC-H",&cmap_GBK_EUC_H}, + {"GBK-EUC-V",&cmap_GBK_EUC_V}, + {"GBK2K-H",&cmap_GBK2K_H}, + {"GBK2K-V",&cmap_GBK2K_V}, + {"GBKp-EUC-H",&cmap_GBKp_EUC_H}, + {"GBKp-EUC-V",&cmap_GBKp_EUC_V}, + {"GBT-EUC-H",&cmap_GBT_EUC_H}, + {"GBT-EUC-V",&cmap_GBT_EUC_V}, + {"GBT-H",&cmap_GBT_H}, + {"GBT-V",&cmap_GBT_V}, + {"GBTpc-EUC-H",&cmap_GBTpc_EUC_H}, + {"GBTpc-EUC-V",&cmap_GBTpc_EUC_V}, + {"GBpc-EUC-H",&cmap_GBpc_EUC_H}, + {"GBpc-EUC-V",&cmap_GBpc_EUC_V}, + {"H",&cmap_H}, + {"HKdla-B5-H",&cmap_HKdla_B5_H}, + {"HKdla-B5-V",&cmap_HKdla_B5_V}, + {"HKdlb-B5-H",&cmap_HKdlb_B5_H}, + {"HKdlb-B5-V",&cmap_HKdlb_B5_V}, + {"HKgccs-B5-H",&cmap_HKgccs_B5_H}, + {"HKgccs-B5-V",&cmap_HKgccs_B5_V}, + {"HKm314-B5-H",&cmap_HKm314_B5_H}, + {"HKm314-B5-V",&cmap_HKm314_B5_V}, + {"HKm471-B5-H",&cmap_HKm471_B5_H}, + {"HKm471-B5-V",&cmap_HKm471_B5_V}, + {"HKscs-B5-H",&cmap_HKscs_B5_H}, + {"HKscs-B5-V",&cmap_HKscs_B5_V}, + {"Hankaku",&cmap_Hankaku}, + {"Hiragana",&cmap_Hiragana}, + {"Hojo-EUC-H",&cmap_Hojo_EUC_H}, + {"Hojo-EUC-V",&cmap_Hojo_EUC_V}, + {"Hojo-H",&cmap_Hojo_H}, + {"Hojo-V",&cmap_Hojo_V}, + {"KSC-EUC-H",&cmap_KSC_EUC_H}, + {"KSC-EUC-V",&cmap_KSC_EUC_V}, + {"KSC-H",&cmap_KSC_H}, + {"KSC-Johab-H",&cmap_KSC_Johab_H}, + {"KSC-Johab-V",&cmap_KSC_Johab_V}, + {"KSC-V",&cmap_KSC_V}, + {"KSCms-UHC-H",&cmap_KSCms_UHC_H}, + {"KSCms-UHC-HW-H",&cmap_KSCms_UHC_HW_H}, + {"KSCms-UHC-HW-V",&cmap_KSCms_UHC_HW_V}, + {"KSCms-UHC-V",&cmap_KSCms_UHC_V}, + {"KSCpc-EUC-H",&cmap_KSCpc_EUC_H}, + {"KSCpc-EUC-V",&cmap_KSCpc_EUC_V}, + {"Katakana",&cmap_Katakana}, + {"NWP-H",&cmap_NWP_H}, + {"NWP-V",&cmap_NWP_V}, + {"RKSJ-H",&cmap_RKSJ_H}, + {"RKSJ-V",&cmap_RKSJ_V}, + {"Roman",&cmap_Roman}, + {"UniCNS-UCS2-H",&cmap_UniCNS_UCS2_H}, + {"UniCNS-UCS2-V",&cmap_UniCNS_UCS2_V}, + {"UniCNS-UTF16-H",&cmap_UniCNS_UTF16_H}, + {"UniCNS-UTF16-V",&cmap_UniCNS_UTF16_V}, + {"UniGB-UCS2-H",&cmap_UniGB_UCS2_H}, + {"UniGB-UCS2-V",&cmap_UniGB_UCS2_V}, + {"UniGB-UTF16-H",&cmap_UniGB_UTF16_H}, + {"UniGB-UTF16-V",&cmap_UniGB_UTF16_V}, + {"UniHojo-UCS2-H",&cmap_UniHojo_UCS2_H}, + {"UniHojo-UCS2-V",&cmap_UniHojo_UCS2_V}, + {"UniHojo-UTF16-H",&cmap_UniHojo_UTF16_H}, + {"UniHojo-UTF16-V",&cmap_UniHojo_UTF16_V}, + {"UniJIS-UCS2-H",&cmap_UniJIS_UCS2_H}, + {"UniJIS-UCS2-HW-H",&cmap_UniJIS_UCS2_HW_H}, + {"UniJIS-UCS2-HW-V",&cmap_UniJIS_UCS2_HW_V}, + {"UniJIS-UCS2-V",&cmap_UniJIS_UCS2_V}, + {"UniJIS-UTF16-H",&cmap_UniJIS_UTF16_H}, + {"UniJIS-UTF16-V",&cmap_UniJIS_UTF16_V}, + {"UniJISPro-UCS2-HW-V",&cmap_UniJISPro_UCS2_HW_V}, + {"UniJISPro-UCS2-V",&cmap_UniJISPro_UCS2_V}, + {"UniKS-UCS2-H",&cmap_UniKS_UCS2_H}, + {"UniKS-UCS2-V",&cmap_UniKS_UCS2_V}, + {"UniKS-UTF16-H",&cmap_UniKS_UTF16_H}, + {"UniKS-UTF16-V",&cmap_UniKS_UTF16_V}, + {"V",&cmap_V}, + {"WP-Symbol",&cmap_WP_Symbol}, +#endif +}; + +pdf_cmap * +pdf_find_builtin_cmap(char *cmap_name) +{ + int l = 0; + int r = nelem(cmap_table) - 1; + while (l <= r) + { + int m = (l + r) >> 1; + int c = strcmp(cmap_name, cmap_table[m].name); + if (c < 0) + r = m - 1; + else if (c > 0) + l = m + 1; + else + return cmap_table[m].cmap; + } + return NULL; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_colorspace.c b/contrib/media/updf_newlib/pdf/pdf_colorspace.c new file mode 100755 index 000000000..b7ea51a32 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_colorspace.c @@ -0,0 +1,387 @@ +#include "fitz.h" +#include "mupdf.h" + +/* ICCBased */ + +static fz_error +load_icc_based(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict) +{ + int n; + + n = fz_to_int(fz_dict_gets(dict, "N")); + + switch (n) + { + case 1: *csp = fz_device_gray; return fz_okay; + case 3: *csp = fz_device_rgb; return fz_okay; + case 4: *csp = fz_device_cmyk; return fz_okay; + } + + return fz_throw("syntaxerror: ICCBased must have 1, 3 or 4 components"); +} + +/* Lab */ + +static inline float fung(float x) +{ + if (x >= 6.0f / 29.0f) + return x * x * x; + return (108.0f / 841.0f) * (x - (4.0f / 29.0f)); +} + +static void +lab_to_rgb(fz_colorspace *cs, float *lab, float *rgb) +{ + /* input is in range (0..100, -128..127, -128..127) not (0..1, 0..1, 0..1) */ + float lstar, astar, bstar, l, m, n, x, y, z, r, g, b; + lstar = lab[0]; + astar = lab[1]; + bstar = lab[2]; + m = (lstar + 16) / 116; + l = m + astar / 500; + n = m - bstar / 200; + x = fung(l); + y = fung(m); + z = fung(n); + r = (3.240449f * x + -1.537136f * y + -0.498531f * z) * 0.830026f; + g = (-0.969265f * x + 1.876011f * y + 0.041556f * z) * 1.05452f; + b = (0.055643f * x + -0.204026f * y + 1.057229f * z) * 1.1003f; + rgb[0] = sqrtf(CLAMP(r, 0, 1)); + rgb[1] = sqrtf(CLAMP(g, 0, 1)); + rgb[2] = sqrtf(CLAMP(b, 0, 1)); +} + +static void +rgb_to_lab(fz_colorspace *cs, float *rgb, float *lab) +{ + fz_warn("cannot convert into L*a*b colorspace"); + lab[0] = rgb[0]; + lab[1] = rgb[1]; + lab[2] = rgb[2]; +} + +static fz_colorspace k_device_lab = { -1, "Lab", 3, lab_to_rgb, rgb_to_lab }; +static fz_colorspace *fz_device_lab = &k_device_lab; + +/* Separation and DeviceN */ + +struct separation +{ + fz_colorspace *base; + pdf_function *tint; +}; + +static void +separation_to_rgb(fz_colorspace *cs, float *color, float *rgb) +{ + struct separation *sep = cs->data; + float alt[FZ_MAX_COLORS]; + pdf_eval_function(sep->tint, color, cs->n, alt, sep->base->n); + sep->base->to_rgb(sep->base, alt, rgb); +} + +static void +free_separation(fz_colorspace *cs) +{ + struct separation *sep = cs->data; + fz_drop_colorspace(sep->base); + pdf_drop_function(sep->tint); + fz_free(sep); +} + +static fz_error +load_separation(fz_colorspace **csp, pdf_xref *xref, fz_obj *array) +{ + fz_error error; + fz_colorspace *cs; + struct separation *sep; + fz_obj *nameobj = fz_array_get(array, 1); + fz_obj *baseobj = fz_array_get(array, 2); + fz_obj *tintobj = fz_array_get(array, 3); + fz_colorspace *base; + pdf_function *tint; + int n; + + if (fz_is_array(nameobj)) + n = fz_array_len(nameobj); + else + n = 1; + + if (n > FZ_MAX_COLORS) + return fz_throw("too many components in colorspace"); + + error = pdf_load_colorspace(&base, xref, baseobj); + if (error) + return fz_rethrow(error, "cannot load base colorspace (%d %d R)", fz_to_num(baseobj), fz_to_gen(baseobj)); + + error = pdf_load_function(&tint, xref, tintobj); + if (error) + { + fz_drop_colorspace(base); + return fz_rethrow(error, "cannot load tint function (%d %d R)", fz_to_num(tintobj), fz_to_gen(tintobj)); + } + + sep = fz_malloc(sizeof(struct separation)); + sep->base = base; + sep->tint = tint; + + cs = fz_new_colorspace(n == 1 ? "Separation" : "DeviceN", n); + cs->to_rgb = separation_to_rgb; + cs->free_data = free_separation; + cs->data = sep; + + *csp = cs; + return fz_okay; +} + +/* Indexed */ + +struct indexed +{ + fz_colorspace *base; + int high; + unsigned char *lookup; +}; + +static void +indexed_to_rgb(fz_colorspace *cs, float *color, float *rgb) +{ + struct indexed *idx = cs->data; + float alt[FZ_MAX_COLORS]; + int i, k; + i = color[0] * 255; + i = CLAMP(i, 0, idx->high); + for (k = 0; k < idx->base->n; k++) + alt[k] = idx->lookup[i * idx->base->n + k] / 255.0f; + idx->base->to_rgb(idx->base, alt, rgb); +} + +static void +free_indexed(fz_colorspace *cs) +{ + struct indexed *idx = cs->data; + if (idx->base) + fz_drop_colorspace(idx->base); + fz_free(idx->lookup); + fz_free(idx); +} + +fz_pixmap * +pdf_expand_indexed_pixmap(fz_pixmap *src) +{ + struct indexed *idx; + fz_pixmap *dst; + unsigned char *s, *d; + int y, x, k, n, high; + unsigned char *lookup; + + assert(src->colorspace->to_rgb == indexed_to_rgb); + assert(src->n == 2); + + idx = src->colorspace->data; + high = idx->high; + lookup = idx->lookup; + n = idx->base->n; + + dst = fz_new_pixmap_with_rect(idx->base, fz_bound_pixmap(src)); + s = src->samples; + d = dst->samples; + + for (y = 0; y < src->h; y++) + { + for (x = 0; x < src->w; x++) + { + int v = *s++; + int a = *s++; + v = MIN(v, high); + for (k = 0; k < n; k++) + *d++ = fz_mul255(lookup[v * n + k], a); + *d++ = a; + } + } + + if (src->mask) + dst->mask = fz_keep_pixmap(src->mask); + dst->interpolate = src->interpolate; + + return dst; +} + +static fz_error +load_indexed(fz_colorspace **csp, pdf_xref *xref, fz_obj *array) +{ + fz_error error; + fz_colorspace *cs; + struct indexed *idx; + fz_obj *baseobj = fz_array_get(array, 1); + fz_obj *highobj = fz_array_get(array, 2); + fz_obj *lookup = fz_array_get(array, 3); + fz_colorspace *base; + int i, n; + + error = pdf_load_colorspace(&base, xref, baseobj); + if (error) + return fz_rethrow(error, "cannot load base colorspace (%d %d R)", fz_to_num(baseobj), fz_to_gen(baseobj)); + + idx = fz_malloc(sizeof(struct indexed)); + idx->base = base; + idx->high = fz_to_int(highobj); + idx->high = CLAMP(idx->high, 0, 255); + n = base->n * (idx->high + 1); + idx->lookup = fz_malloc(n); + memset(idx->lookup, 0, n); + + cs = fz_new_colorspace("Indexed", 1); + cs->to_rgb = indexed_to_rgb; + cs->free_data = free_indexed; + cs->data = idx; + + if (fz_is_string(lookup) && fz_to_str_len(lookup) == n) + { + unsigned char *buf = (unsigned char *) fz_to_str_buf(lookup); + for (i = 0; i < n; i++) + idx->lookup[i] = buf[i]; + } + else if (fz_is_indirect(lookup)) + { + fz_stream *file; + + error = pdf_open_stream(&file, xref, fz_to_num(lookup), fz_to_gen(lookup)); + if (error) + { + fz_drop_colorspace(cs); + return fz_rethrow(error, "cannot open colorspace lookup table (%d 0 R)", fz_to_num(lookup)); + } + + i = fz_read(file, idx->lookup, n); + if (i < 0) + { + fz_drop_colorspace(cs); + return fz_throw("cannot read colorspace lookup table (%d 0 R)", fz_to_num(lookup)); + } + + fz_close(file); + } + else + { + fz_drop_colorspace(cs); + return fz_throw("cannot parse colorspace lookup table"); + } + + *csp = cs; + return fz_okay; +} + +/* Parse and create colorspace from PDF object */ + +static fz_error +pdf_load_colorspace_imp(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj) +{ + if (fz_is_name(obj)) + { + if (!strcmp(fz_to_name(obj), "Pattern")) + *csp = fz_device_gray; + else if (!strcmp(fz_to_name(obj), "G")) + *csp = fz_device_gray; + else if (!strcmp(fz_to_name(obj), "RGB")) + *csp = fz_device_rgb; + else if (!strcmp(fz_to_name(obj), "CMYK")) + *csp = fz_device_cmyk; + else if (!strcmp(fz_to_name(obj), "DeviceGray")) + *csp = fz_device_gray; + else if (!strcmp(fz_to_name(obj), "DeviceRGB")) + *csp = fz_device_rgb; + else if (!strcmp(fz_to_name(obj), "DeviceCMYK")) + *csp = fz_device_cmyk; + else + return fz_throw("unknown colorspace: %s", fz_to_name(obj)); + return fz_okay; + } + + else if (fz_is_array(obj)) + { + fz_obj *name = fz_array_get(obj, 0); + + if (fz_is_name(name)) + { + /* load base colorspace instead */ + if (!strcmp(fz_to_name(name), "Pattern")) + { + fz_error error; + + obj = fz_array_get(obj, 1); + if (!obj) + { + *csp = fz_device_gray; + return fz_okay; + } + + error = pdf_load_colorspace(csp, xref, obj); + if (error) + return fz_rethrow(error, "cannot load pattern (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + } + + else if (!strcmp(fz_to_name(name), "G")) + *csp = fz_device_gray; + else if (!strcmp(fz_to_name(name), "RGB")) + *csp = fz_device_rgb; + else if (!strcmp(fz_to_name(name), "CMYK")) + *csp = fz_device_cmyk; + else if (!strcmp(fz_to_name(name), "DeviceGray")) + *csp = fz_device_gray; + else if (!strcmp(fz_to_name(name), "DeviceRGB")) + *csp = fz_device_rgb; + else if (!strcmp(fz_to_name(name), "DeviceCMYK")) + *csp = fz_device_cmyk; + else if (!strcmp(fz_to_name(name), "CalGray")) + *csp = fz_device_gray; + else if (!strcmp(fz_to_name(name), "CalRGB")) + *csp = fz_device_rgb; + else if (!strcmp(fz_to_name(name), "CalCMYK")) + *csp = fz_device_cmyk; + else if (!strcmp(fz_to_name(name), "Lab")) + *csp = fz_device_lab; + + else if (!strcmp(fz_to_name(name), "ICCBased")) + return load_icc_based(csp, xref, fz_array_get(obj, 1)); + + else if (!strcmp(fz_to_name(name), "Indexed")) + return load_indexed(csp, xref, obj); + else if (!strcmp(fz_to_name(name), "I")) + return load_indexed(csp, xref, obj); + + else if (!strcmp(fz_to_name(name), "Separation")) + return load_separation(csp, xref, obj); + + else if (!strcmp(fz_to_name(name), "DeviceN")) + return load_separation(csp, xref, obj); + + else + return fz_throw("syntaxerror: unknown colorspace %s", fz_to_name(name)); + + return fz_okay; + } + } + + return fz_throw("syntaxerror: could not parse color space (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); +} + +fz_error +pdf_load_colorspace(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj) +{ + fz_error error; + + if ((*csp = pdf_find_item(xref->store, fz_drop_colorspace, obj))) + { + fz_keep_colorspace(*csp); + return fz_okay; + } + + error = pdf_load_colorspace_imp(csp, xref, obj); + if (error) + return fz_rethrow(error, "cannot load colorspace (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + + pdf_store_item(xref->store, fz_keep_colorspace, fz_drop_colorspace, obj, *csp); + + return fz_okay; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_crypt.c b/contrib/media/updf_newlib/pdf/pdf_crypt.c new file mode 100755 index 000000000..4dd4c4e17 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_crypt.c @@ -0,0 +1,847 @@ +#include "fitz.h" +#include "mupdf.h" + +enum +{ + PDF_CRYPT_NONE, + PDF_CRYPT_RC4, + PDF_CRYPT_AESV2, + PDF_CRYPT_AESV3, + PDF_CRYPT_UNKNOWN, +}; + +typedef struct pdf_crypt_filter_s pdf_crypt_filter; + +struct pdf_crypt_filter_s +{ + int method; + int length; +}; + +struct pdf_crypt_s +{ + fz_obj *id; + + int v; + int length; + fz_obj *cf; + pdf_crypt_filter stmf; + pdf_crypt_filter strf; + + int r; + unsigned char o[48]; + unsigned char u[48]; + unsigned char oe[32]; + unsigned char ue[32]; + int p; + int encrypt_metadata; + + unsigned char key[32]; /* decryption key generated from password */ +}; + +static fz_error pdf_parse_crypt_filter(pdf_crypt_filter *cf, fz_obj *dict, char *name, int defaultlength); + +/* + * Create crypt object for decrypting strings and streams + * given the Encryption and ID objects. + */ + +fz_error +pdf_new_crypt(pdf_crypt **cryptp, fz_obj *dict, fz_obj *id) +{ + pdf_crypt *crypt; + fz_error error; + fz_obj *obj; + + crypt = fz_malloc(sizeof(pdf_crypt)); + memset(crypt, 0x00, sizeof(pdf_crypt)); + + /* Common to all security handlers (PDF 1.7 table 3.18) */ + + obj = fz_dict_gets(dict, "Filter"); + if (!fz_is_name(obj)) + { + pdf_free_crypt(crypt); + return fz_throw("unspecified encryption handler"); + } + if (strcmp(fz_to_name(obj), "Standard") != 0) + { + pdf_free_crypt(crypt); + return fz_throw("unknown encryption handler: '%s'", fz_to_name(obj)); + } + + crypt->v = 0; + obj = fz_dict_gets(dict, "V"); + if (fz_is_int(obj)) + crypt->v = fz_to_int(obj); + if (crypt->v != 1 && crypt->v != 2 && crypt->v != 4 && crypt->v != 5) + { + pdf_free_crypt(crypt); + return fz_throw("unknown encryption version"); + } + + crypt->length = 40; + if (crypt->v == 2 || crypt->v == 4) + { + obj = fz_dict_gets(dict, "Length"); + if (fz_is_int(obj)) + crypt->length = fz_to_int(obj); + + /* work-around for pdf generators that assume length is in bytes */ + if (crypt->length < 40) + crypt->length = crypt->length * 8; + + if (crypt->length % 8 != 0) + { + pdf_free_crypt(crypt); + return fz_throw("invalid encryption key length"); + } + if (crypt->length > 256) + { + pdf_free_crypt(crypt); + return fz_throw("invalid encryption key length"); + } + } + + if (crypt->v == 5) + crypt->length = 256; + + if (crypt->v == 1 || crypt->v == 2) + { + crypt->stmf.method = PDF_CRYPT_RC4; + crypt->stmf.length = crypt->length; + + crypt->strf.method = PDF_CRYPT_RC4; + crypt->strf.length = crypt->length; + } + + if (crypt->v == 4 || crypt->v == 5) + { + crypt->stmf.method = PDF_CRYPT_NONE; + crypt->stmf.length = crypt->length; + + crypt->strf.method = PDF_CRYPT_NONE; + crypt->strf.length = crypt->length; + + obj = fz_dict_gets(dict, "CF"); + if (fz_is_dict(obj)) + { + crypt->cf = fz_keep_obj(obj); + } + else + { + crypt->cf = NULL; + } + + obj = fz_dict_gets(dict, "StmF"); + if (fz_is_name(obj)) + { + error = pdf_parse_crypt_filter(&crypt->stmf, crypt->cf, fz_to_name(obj), crypt->length); + if (error) + { + pdf_free_crypt(crypt); + return fz_rethrow(error, "cannot parse stream crypt filter (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + } + } + + obj = fz_dict_gets(dict, "StrF"); + if (fz_is_name(obj)) + { + error = pdf_parse_crypt_filter(&crypt->strf, crypt->cf, fz_to_name(obj), crypt->length); + if (error) + { + pdf_free_crypt(crypt); + return fz_rethrow(error, "cannot parse string crypt filter (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + } + } + + /* in crypt revision 4, the crypt filter determines the key length */ + if (crypt->strf.method != PDF_CRYPT_NONE) + crypt->length = crypt->stmf.length; + } + + /* Standard security handler (PDF 1.7 table 3.19) */ + + obj = fz_dict_gets(dict, "R"); + if (fz_is_int(obj)) + crypt->r = fz_to_int(obj); + else + { + pdf_free_crypt(crypt); + return fz_throw("encryption dictionary missing revision value"); + } + + obj = fz_dict_gets(dict, "O"); + if (fz_is_string(obj) && fz_to_str_len(obj) == 32) + memcpy(crypt->o, fz_to_str_buf(obj), 32); + /* /O and /U are supposed to be 48 bytes long for revision 5, they're often longer, though */ + else if (crypt->r == 5 && fz_is_string(obj) && fz_to_str_len(obj) >= 48) + memcpy(crypt->o, fz_to_str_buf(obj), 48); + else + { + pdf_free_crypt(crypt); + return fz_throw("encryption dictionary missing owner password"); + } + + obj = fz_dict_gets(dict, "U"); + if (fz_is_string(obj) && fz_to_str_len(obj) == 32) + memcpy(crypt->u, fz_to_str_buf(obj), 32); + else if (fz_is_string(obj) && fz_to_str_len(obj) >= 48 && crypt->r == 5) + memcpy(crypt->u, fz_to_str_buf(obj), 48); + else if (fz_is_string(obj) && fz_to_str_len(obj) < 32) + { + fz_warn("encryption password key too short (%d)", fz_to_str_len(obj)); + memcpy(crypt->u, fz_to_str_buf(obj), fz_to_str_len(obj)); + } + else + { + pdf_free_crypt(crypt); + return fz_throw("encryption dictionary missing user password"); + } + + obj = fz_dict_gets(dict, "P"); + if (fz_is_int(obj)) + crypt->p = fz_to_int(obj); + else + { + pdf_free_crypt(crypt); + return fz_throw("encryption dictionary missing permissions value"); + } + + if (crypt->r == 5) + { + obj = fz_dict_gets(dict, "OE"); + if (!fz_is_string(obj) || fz_to_str_len(obj) != 32) + { + pdf_free_crypt(crypt); + return fz_throw("encryption dictionary missing owner encryption key"); + } + memcpy(crypt->oe, fz_to_str_buf(obj), 32); + + obj = fz_dict_gets(dict, "UE"); + if (!fz_is_string(obj) || fz_to_str_len(obj) != 32) + { + pdf_free_crypt(crypt); + return fz_throw("encryption dictionary missing user encryption key"); + } + memcpy(crypt->ue, fz_to_str_buf(obj), 32); + } + + crypt->encrypt_metadata = 1; + obj = fz_dict_gets(dict, "EncryptMetadata"); + if (fz_is_bool(obj)) + crypt->encrypt_metadata = fz_to_bool(obj); + + /* Extract file identifier string */ + + if (fz_is_array(id) && fz_array_len(id) == 2) + { + obj = fz_array_get(id, 0); + if (fz_is_string(obj)) + crypt->id = fz_keep_obj(obj); + } + else + fz_warn("missing file identifier, may not be able to do decryption"); + + *cryptp = crypt; + return fz_okay; +} + +void +pdf_free_crypt(pdf_crypt *crypt) +{ + if (crypt->id) fz_drop_obj(crypt->id); + if (crypt->cf) fz_drop_obj(crypt->cf); + fz_free(crypt); +} + +/* + * Parse a CF dictionary entry (PDF 1.7 table 3.22) + */ + +static fz_error +pdf_parse_crypt_filter(pdf_crypt_filter *cf, fz_obj *cf_obj, char *name, int defaultlength) +{ + fz_obj *obj; + fz_obj *dict; + int is_identity = (strcmp(name, "Identity") == 0); + int is_stdcf = (!is_identity && (strcmp(name, "StdCF") == 0)); + + if (!is_identity && !is_stdcf) + { + return fz_throw("Crypt Filter not Identity or StdCF (%d %d R)", fz_to_num(cf_obj), fz_to_gen(cf_obj)); + } + cf->method = PDF_CRYPT_NONE; + cf->length = defaultlength; + + if (cf_obj == NULL) + { + cf->method = (is_identity ? PDF_CRYPT_NONE : PDF_CRYPT_RC4); + return fz_okay; + } + + dict = fz_dict_gets(cf_obj, name); + if (!fz_is_dict(dict)) + { + return fz_throw("cannot parse crypt filter (%d %d R)", fz_to_num(cf_obj), fz_to_gen(cf_obj)); + } + obj = fz_dict_gets(dict, "CFM"); + if (fz_is_name(obj)) + { + if (!strcmp(fz_to_name(obj), "None")) + cf->method = PDF_CRYPT_NONE; + else if (!strcmp(fz_to_name(obj), "V2")) + cf->method = PDF_CRYPT_RC4; + else if (!strcmp(fz_to_name(obj), "AESV2")) + cf->method = PDF_CRYPT_AESV2; + else if (!strcmp(fz_to_name(obj), "AESV3")) + cf->method = PDF_CRYPT_AESV3; + else + fz_throw("unknown encryption method: %s", fz_to_name(obj)); + } + + obj = fz_dict_gets(dict, "Length"); + if (fz_is_int(obj)) + cf->length = fz_to_int(obj); + + /* the length for crypt filters is supposed to be in bytes not bits */ + if (cf->length < 40) + cf->length = cf->length * 8; + + if ((cf->length % 8) != 0) + return fz_throw("invalid key length: %d", cf->length); + + return fz_okay; +} + +/* + * Compute an encryption key (PDF 1.7 algorithm 3.2) + */ + +static const unsigned char padding[32] = +{ + 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, + 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, + 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, + 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a +}; + +static void +pdf_compute_encryption_key(pdf_crypt *crypt, unsigned char *password, int pwlen, unsigned char *key) +{ + unsigned char buf[32]; + unsigned int p; + int i, n; + fz_md5 md5; + + n = crypt->length / 8; + + /* Step 1 - copy and pad password string */ + if (pwlen > 32) + pwlen = 32; + memcpy(buf, password, pwlen); + memcpy(buf + pwlen, padding, 32 - pwlen); + + /* Step 2 - init md5 and pass value of step 1 */ + fz_md5_init(&md5); + fz_md5_update(&md5, buf, 32); + + /* Step 3 - pass O value */ + fz_md5_update(&md5, crypt->o, 32); + + /* Step 4 - pass P value as unsigned int, low-order byte first */ + p = (unsigned int) crypt->p; + buf[0] = (p) & 0xFF; + buf[1] = (p >> 8) & 0xFF; + buf[2] = (p >> 16) & 0xFF; + buf[3] = (p >> 24) & 0xFF; + fz_md5_update(&md5, buf, 4); + + /* Step 5 - pass first element of ID array */ + fz_md5_update(&md5, (unsigned char *)fz_to_str_buf(crypt->id), fz_to_str_len(crypt->id)); + + /* Step 6 (revision 4 or greater) - if metadata is not encrypted pass 0xFFFFFFFF */ + if (crypt->r >= 4) + { + if (!crypt->encrypt_metadata) + { + buf[0] = 0xFF; + buf[1] = 0xFF; + buf[2] = 0xFF; + buf[3] = 0xFF; + fz_md5_update(&md5, buf, 4); + } + } + + /* Step 7 - finish the hash */ + fz_md5_final(&md5, buf); + + /* Step 8 (revision 3 or greater) - do some voodoo 50 times */ + if (crypt->r >= 3) + { + for (i = 0; i < 50; i++) + { + fz_md5_init(&md5); + fz_md5_update(&md5, buf, n); + fz_md5_final(&md5, buf); + } + } + + /* Step 9 - the key is the first 'n' bytes of the result */ + memcpy(key, buf, n); +} + +/* + * Compute an encryption key (PDF 1.7 ExtensionLevel 3 algorithm 3.2a) + */ + +static void +pdf_compute_encryption_key_r5(pdf_crypt *crypt, unsigned char *password, int pwlen, int ownerkey, unsigned char *validationkey) +{ + unsigned char buffer[128 + 8 + 48]; + fz_sha256 sha256; + fz_aes aes; + + /* Step 2 - truncate UTF-8 password to 127 characters */ + + if (pwlen > 127) + pwlen = 127; + + /* Step 3/4 - test password against owner/user key and compute encryption key */ + + memcpy(buffer, password, pwlen); + if (ownerkey) + { + memcpy(buffer + pwlen, crypt->o + 32, 8); + memcpy(buffer + pwlen + 8, crypt->u, 48); + } + else + memcpy(buffer + pwlen, crypt->u + 32, 8); + + fz_sha256_init(&sha256); + fz_sha256_update(&sha256, buffer, pwlen + 8 + (ownerkey ? 48 : 0)); + fz_sha256_final(&sha256, validationkey); + + /* Step 3.5/4.5 - compute file encryption key from OE/UE */ + + memcpy(buffer + pwlen, crypt->u + 40, 8); + + fz_sha256_init(&sha256); + fz_sha256_update(&sha256, buffer, pwlen + 8); + fz_sha256_final(&sha256, buffer); + + // clear password buffer and use it as iv + memset(buffer + 32, 0, sizeof(buffer) - 32); + aes_setkey_dec(&aes, buffer, crypt->length); + aes_crypt_cbc(&aes, AES_DECRYPT, 32, buffer + 32, ownerkey ? crypt->oe : crypt->ue, crypt->key); +} + +/* + * Computing the user password (PDF 1.7 algorithm 3.4 and 3.5) + * Also save the generated key for decrypting objects and streams in crypt->key. + */ + +static void +pdf_compute_user_password(pdf_crypt *crypt, unsigned char *password, int pwlen, unsigned char *output) +{ + if (crypt->r == 2) + { + fz_arc4 arc4; + + pdf_compute_encryption_key(crypt, password, pwlen, crypt->key); + fz_arc4_init(&arc4, crypt->key, crypt->length / 8); + fz_arc4_encrypt(&arc4, output, padding, 32); + } + + if (crypt->r == 3 || crypt->r == 4) + { + unsigned char xor[32]; + unsigned char digest[16]; + fz_md5 md5; + fz_arc4 arc4; + int i, x, n; + + n = crypt->length / 8; + + pdf_compute_encryption_key(crypt, password, pwlen, crypt->key); + + fz_md5_init(&md5); + fz_md5_update(&md5, padding, 32); + fz_md5_update(&md5, (unsigned char*)fz_to_str_buf(crypt->id), fz_to_str_len(crypt->id)); + fz_md5_final(&md5, digest); + + fz_arc4_init(&arc4, crypt->key, n); + fz_arc4_encrypt(&arc4, output, digest, 16); + + for (x = 1; x <= 19; x++) + { + for (i = 0; i < n; i++) + xor[i] = crypt->key[i] ^ x; + fz_arc4_init(&arc4, xor, n); + fz_arc4_encrypt(&arc4, output, output, 16); + } + + memcpy(output + 16, padding, 16); + } + + if (crypt->r == 5) + { + pdf_compute_encryption_key_r5(crypt, password, pwlen, 0, output); + } +} + +/* + * Authenticating the user password (PDF 1.7 algorithm 3.6 + * and ExtensionLevel 3 algorithm 3.11) + * This also has the side effect of saving a key generated + * from the password for decrypting objects and streams. + */ + +static int +pdf_authenticate_user_password(pdf_crypt *crypt, unsigned char *password, int pwlen) +{ + unsigned char output[32]; + pdf_compute_user_password(crypt, password, pwlen, output); + if (crypt->r == 2 || crypt->r == 5) + return memcmp(output, crypt->u, 32) == 0; + if (crypt->r == 3 || crypt->r == 4) + return memcmp(output, crypt->u, 16) == 0; + return 0; +} + +/* + * Authenticating the owner password (PDF 1.7 algorithm 3.7 + * and ExtensionLevel 3 algorithm 3.12) + * Generates the user password from the owner password + * and calls pdf_authenticate_user_password. + */ + +static int +pdf_authenticate_owner_password(pdf_crypt *crypt, unsigned char *ownerpass, int pwlen) +{ + unsigned char pwbuf[32]; + unsigned char key[32]; + unsigned char xor[32]; + unsigned char userpass[32]; + int i, n, x; + fz_md5 md5; + fz_arc4 arc4; + + if (crypt->r == 5) + { + /* PDF 1.7 ExtensionLevel 3 algorithm 3.12 */ + + pdf_compute_encryption_key_r5(crypt, ownerpass, pwlen, 1, key); + + return !memcmp(key, crypt->o, 32); + } + + n = crypt->length / 8; + + /* Step 1 -- steps 1 to 4 of PDF 1.7 algorithm 3.3 */ + + /* copy and pad password string */ + if (pwlen > 32) + pwlen = 32; + memcpy(pwbuf, ownerpass, pwlen); + memcpy(pwbuf + pwlen, padding, 32 - pwlen); + + /* take md5 hash of padded password */ + fz_md5_init(&md5); + fz_md5_update(&md5, pwbuf, 32); + fz_md5_final(&md5, key); + + /* do some voodoo 50 times (Revision 3 or greater) */ + if (crypt->r >= 3) + { + for (i = 0; i < 50; i++) + { + fz_md5_init(&md5); + fz_md5_update(&md5, key, 16); + fz_md5_final(&md5, key); + } + } + + /* Step 2 (Revision 2) */ + if (crypt->r == 2) + { + fz_arc4_init(&arc4, key, n); + fz_arc4_encrypt(&arc4, userpass, crypt->o, 32); + } + + /* Step 2 (Revision 3 or greater) */ + if (crypt->r >= 3) + { + memcpy(userpass, crypt->o, 32); + for (x = 0; x < 20; x++) + { + for (i = 0; i < n; i++) + xor[i] = key[i] ^ (19 - x); + fz_arc4_init(&arc4, xor, n); + fz_arc4_encrypt(&arc4, userpass, userpass, 32); + } + } + + return pdf_authenticate_user_password(crypt, userpass, 32); +} + +int +pdf_authenticate_password(pdf_xref *xref, char *password) +{ + if (xref->crypt) + { + if (pdf_authenticate_user_password(xref->crypt, (unsigned char *)password, strlen(password))) + return 1; + if (pdf_authenticate_owner_password(xref->crypt, (unsigned char *)password, strlen(password))) + return 1; + return 0; + } + return 1; +} + +int +pdf_needs_password(pdf_xref *xref) +{ + if (!xref->crypt) + return 0; + if (pdf_authenticate_password(xref, "")) + return 0; + return 1; +} + +int +pdf_has_permission(pdf_xref *xref, int p) +{ + if (!xref->crypt) + return 1; + return xref->crypt->p & p; +} + +unsigned char * +pdf_get_crypt_key(pdf_xref *xref) +{ + if (xref->crypt) + return xref->crypt->key; + return NULL; +} + +int +pdf_get_crypt_revision(pdf_xref *xref) +{ + if (xref->crypt) + return xref->crypt->v; + return 0; +} + +char * +pdf_get_crypt_method(pdf_xref *xref) +{ + if (xref->crypt) + { + switch (xref->crypt->strf.method) + { + case PDF_CRYPT_NONE: return "None"; + case PDF_CRYPT_RC4: return "RC4"; + case PDF_CRYPT_AESV2: return "AES"; + case PDF_CRYPT_AESV3: return "AES"; + case PDF_CRYPT_UNKNOWN: return "Unknown"; + } + } + return "None"; +} + +int +pdf_get_crypt_length(pdf_xref *xref) +{ + if (xref->crypt) + return xref->crypt->length; + return 0; +} + +/* + * PDF 1.7 algorithm 3.1 and ExtensionLevel 3 algorithm 3.1a + * + * Using the global encryption key that was generated from the + * password, create a new key that is used to decrypt indivual + * objects and streams. This key is based on the object and + * generation numbers. + */ + +static int +pdf_compute_object_key(pdf_crypt *crypt, pdf_crypt_filter *cf, int num, int gen, unsigned char *key) +{ + fz_md5 md5; + unsigned char message[5]; + + if (cf->method == PDF_CRYPT_AESV3) + { + memcpy(key, crypt->key, crypt->length / 8); + return crypt->length / 8; + } + + fz_md5_init(&md5); + fz_md5_update(&md5, crypt->key, crypt->length / 8); + message[0] = (num) & 0xFF; + message[1] = (num >> 8) & 0xFF; + message[2] = (num >> 16) & 0xFF; + message[3] = (gen) & 0xFF; + message[4] = (gen >> 8) & 0xFF; + fz_md5_update(&md5, message, 5); + + if (cf->method == PDF_CRYPT_AESV2) + fz_md5_update(&md5, (unsigned char *)"sAlT", 4); + + fz_md5_final(&md5, key); + + if (crypt->length / 8 + 5 > 16) + return 16; + return crypt->length / 8 + 5; +} + +/* + * PDF 1.7 algorithm 3.1 and ExtensionLevel 3 algorithm 3.1a + * + * Decrypt all strings in obj modifying the data in-place. + * Recurse through arrays and dictionaries, but do not follow + * indirect references. + */ + +static void +pdf_crypt_obj_imp(pdf_crypt *crypt, fz_obj *obj, unsigned char *key, int keylen) +{ + unsigned char *s; + int i, n; + + if (fz_is_indirect(obj)) + return; + + if (fz_is_string(obj)) + { + s = (unsigned char *) fz_to_str_buf(obj); + n = fz_to_str_len(obj); + + if (crypt->strf.method == PDF_CRYPT_RC4) + { + fz_arc4 arc4; + fz_arc4_init(&arc4, key, keylen); + fz_arc4_encrypt(&arc4, s, s, n); + } + + if (crypt->strf.method == PDF_CRYPT_AESV2 || crypt->strf.method == PDF_CRYPT_AESV3) + { + if (n & 15 || n < 32) + fz_warn("invalid string length for aes encryption"); + else + { + unsigned char iv[16]; + fz_aes aes; + memcpy(iv, s, 16); + aes_setkey_dec(&aes, key, keylen * 8); + aes_crypt_cbc(&aes, AES_DECRYPT, n - 16, iv, s + 16, s); + /* delete space used for iv and padding bytes at end */ + if (s[n - 17] < 1 || s[n - 17] > 16) + fz_warn("aes padding out of range"); + else + fz_set_str_len(obj, n - 16 - s[n - 17]); + } + } + } + + else if (fz_is_array(obj)) + { + n = fz_array_len(obj); + for (i = 0; i < n; i++) + { + pdf_crypt_obj_imp(crypt, fz_array_get(obj, i), key, keylen); + } + } + + else if (fz_is_dict(obj)) + { + n = fz_dict_len(obj); + for (i = 0; i < n; i++) + { + pdf_crypt_obj_imp(crypt, fz_dict_get_val(obj, i), key, keylen); + } + } +} + +void +pdf_crypt_obj(pdf_crypt *crypt, fz_obj *obj, int num, int gen) +{ + unsigned char key[32]; + int len; + + len = pdf_compute_object_key(crypt, &crypt->strf, num, gen, key); + + pdf_crypt_obj_imp(crypt, obj, key, len); +} + +/* + * PDF 1.7 algorithm 3.1 and ExtensionLevel 3 algorithm 3.1a + * + * Create filter suitable for de/encrypting a stream. + */ +static fz_stream * +pdf_open_crypt_imp(fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, int num, int gen) +{ + unsigned char key[32]; + int len; + + len = pdf_compute_object_key(crypt, stmf, num, gen, key); + + if (stmf->method == PDF_CRYPT_RC4) + return fz_open_arc4(chain, key, len); + + if (stmf->method == PDF_CRYPT_AESV2 || stmf->method == PDF_CRYPT_AESV3) + return fz_open_aesd(chain, key, len); + + return fz_open_copy(chain); +} + +fz_stream * +pdf_open_crypt(fz_stream *chain, pdf_crypt *crypt, int num, int gen) +{ + return pdf_open_crypt_imp(chain, crypt, &crypt->stmf, num, gen); +} + +fz_stream * +pdf_open_crypt_with_filter(fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen) +{ + fz_error error; + pdf_crypt_filter cf; + + if (strcmp(name, "Identity")) + { + error = pdf_parse_crypt_filter(&cf, crypt->cf, name, crypt->length); + if (error) + fz_catch(error, "cannot parse crypt filter (%d %d R)", num, gen); + else + return pdf_open_crypt_imp(chain, crypt, &cf, num, gen); + } + return chain; +} + +void pdf_debug_crypt(pdf_crypt *crypt) +{ + int i; + + printf("crypt {\n"); + + printf("\tv=%d length=%d\n", crypt->v, crypt->length); + printf("\tstmf method=%d length=%d\n", crypt->stmf.method, crypt->stmf.length); + printf("\tstrf method=%d length=%d\n", crypt->strf.method, crypt->strf.length); + printf("\tr=%d\n", crypt->r); + + printf("\to=<"); + for (i = 0; i < 32; i++) + printf("%02X", crypt->o[i]); + printf(">\n"); + + printf("\tu=<"); + for (i = 0; i < 32; i++) + printf("%02X", crypt->u[i]); + printf(">\n"); + + printf("}\n"); +} diff --git a/contrib/media/updf_newlib/pdf/pdf_encoding.c b/contrib/media/updf_newlib/pdf/pdf_encoding.c new file mode 100755 index 000000000..9a42a1c1d --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_encoding.c @@ -0,0 +1,83 @@ +#include "fitz.h" +#include "mupdf.h" + +#include "data_encodings.h" +#include "data_glyphlist.h" + +void +pdf_load_encoding(char **estrings, char *encoding) +{ + char **bstrings = NULL; + int i; + + if (!strcmp(encoding, "StandardEncoding")) + bstrings = (char**) pdf_standard; + if (!strcmp(encoding, "MacRomanEncoding")) + bstrings = (char**) pdf_mac_roman; + if (!strcmp(encoding, "MacExpertEncoding")) + bstrings = (char**) pdf_mac_expert; + if (!strcmp(encoding, "WinAnsiEncoding")) + bstrings = (char**) pdf_win_ansi; + + if (bstrings) + for (i = 0; i < 256; i++) + estrings[i] = bstrings[i]; +} + +int +pdf_lookup_agl(char *name) +{ + char buf[64]; + char *p; + int l = 0; + int r = nelem(agl_name_list) - 1; + + fz_strlcpy(buf, name, sizeof buf); + + /* kill anything after first period and underscore */ + p = strchr(buf, '.'); + if (p) p[0] = 0; + p = strchr(buf, '_'); + if (p) p[0] = 0; + + while (l <= r) + { + int m = (l + r) >> 1; + int c = strcmp(buf, agl_name_list[m]); + if (c < 0) + r = m - 1; + else if (c > 0) + l = m + 1; + else + return agl_code_list[m]; + } + + if (strstr(buf, "uni") == buf) + return strtol(buf + 3, NULL, 16); + else if (strstr(buf, "u") == buf) + return strtol(buf + 1, NULL, 16); + else if (strstr(buf, "a") == buf && strlen(buf) >= 3) + return strtol(buf + 1, NULL, 10); + + return 0; +} + +static const char *empty_dup_list[] = { 0 }; + +const char ** +pdf_lookup_agl_duplicates(int ucs) +{ + int l = 0; + int r = nelem(agl_dup_offsets) / 2 - 1; + while (l <= r) + { + int m = (l + r) >> 1; + if (ucs < agl_dup_offsets[m << 1]) + r = m - 1; + else if (ucs > agl_dup_offsets[m << 1]) + l = m + 1; + else + return agl_dup_names + agl_dup_offsets[(m << 1) + 1]; + } + return empty_dup_list; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_font.c b/contrib/media/updf_newlib/pdf/pdf_font.c new file mode 100755 index 000000000..6b9168216 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_font.c @@ -0,0 +1,1165 @@ +#include "fitz.h" +#include "mupdf.h" + +#include +#include FT_FREETYPE_H +#include FT_XFREE86_H + +static fz_error pdf_load_font_descriptor(pdf_font_desc *fontdesc, pdf_xref *xref, fz_obj *dict, char *collection, char *basefont); + +static char *base_font_names[14][7] = +{ + { "Courier", "CourierNew", "CourierNewPSMT", NULL }, + { "Courier-Bold", "CourierNew,Bold", "Courier,Bold", + "CourierNewPS-BoldMT", "CourierNew-Bold", NULL }, + { "Courier-Oblique", "CourierNew,Italic", "Courier,Italic", + "CourierNewPS-ItalicMT", "CourierNew-Italic", NULL }, + { "Courier-BoldOblique", "CourierNew,BoldItalic", "Courier,BoldItalic", + "CourierNewPS-BoldItalicMT", "CourierNew-BoldItalic", NULL }, + { "Helvetica", "ArialMT", "Arial", NULL }, + { "Helvetica-Bold", "Arial-BoldMT", "Arial,Bold", "Arial-Bold", + "Helvetica,Bold", NULL }, + { "Helvetica-Oblique", "Arial-ItalicMT", "Arial,Italic", "Arial-Italic", + "Helvetica,Italic", "Helvetica-Italic", NULL }, + { "Helvetica-BoldOblique", "Arial-BoldItalicMT", + "Arial,BoldItalic", "Arial-BoldItalic", + "Helvetica,BoldItalic", "Helvetica-BoldItalic", NULL }, + { "Times-Roman", "TimesNewRomanPSMT", "TimesNewRoman", + "TimesNewRomanPS", NULL }, + { "Times-Bold", "TimesNewRomanPS-BoldMT", "TimesNewRoman,Bold", + "TimesNewRomanPS-Bold", "TimesNewRoman-Bold", NULL }, + { "Times-Italic", "TimesNewRomanPS-ItalicMT", "TimesNewRoman,Italic", + "TimesNewRomanPS-Italic", "TimesNewRoman-Italic", NULL }, + { "Times-BoldItalic", "TimesNewRomanPS-BoldItalicMT", + "TimesNewRoman,BoldItalic", "TimesNewRomanPS-BoldItalic", + "TimesNewRoman-BoldItalic", NULL }, + { "Symbol", NULL }, + { "ZapfDingbats", NULL } +}; + +static int is_dynalab(char *name) +{ + if (strstr(name, "HuaTian")) + return 1; + if (strstr(name, "MingLi")) + return 1; + if ((strstr(name, "DF") == name) || strstr(name, "+DF")) + return 1; + if ((strstr(name, "DLC") == name) || strstr(name, "+DLC")) + return 1; + return 0; +} + +static int strcmp_ignore_space(char *a, char *b) +{ + while (1) + { + while (*a == ' ') + a++; + while (*b == ' ') + b++; + if (*a != *b) + return 1; + if (*a == 0) + return *a != *b; + if (*b == 0) + return *a != *b; + a++; + b++; + } +} + +static char *clean_font_name(char *fontname) +{ + int i, k; + for (i = 0; i < 14; i++) + for (k = 0; base_font_names[i][k]; k++) + if (!strcmp_ignore_space(base_font_names[i][k], fontname)) + return base_font_names[i][0]; + return fontname; +} + +/* + * FreeType and Rendering glue + */ + +enum { UNKNOWN, TYPE1, TRUETYPE }; + +static int ft_kind(FT_Face face) +{ + /// ZAGLUSHKA /// + //const char *kind = FT_Get_X11_Font_Format(face); + const char *kind = "TrueType"; + + if (!strcmp(kind, "TrueType")) + return TRUETYPE; + if (!strcmp(kind, "Type 1")) + return TYPE1; + if (!strcmp(kind, "CFF")) + return TYPE1; + if (!strcmp(kind, "CID Type 1")) + return TYPE1; + return UNKNOWN; +} + +static int ft_is_bold(FT_Face face) +{ + return face->style_flags & FT_STYLE_FLAG_BOLD; +} + +static int ft_is_italic(FT_Face face) +{ + return face->style_flags & FT_STYLE_FLAG_ITALIC; +} + +static int ft_char_index(FT_Face face, int cid) +{ + int gid = FT_Get_Char_Index(face, cid); + if (gid == 0) + gid = FT_Get_Char_Index(face, 0xf000 + cid); + + /* some chinese fonts only ship the similarly looking 0x2026 */ + if (gid == 0 && cid == 0x22ef) + gid = FT_Get_Char_Index(face, 0x2026); + + return gid; +} + +static int ft_cid_to_gid(pdf_font_desc *fontdesc, int cid) +{ + if (fontdesc->to_ttf_cmap) + { + cid = pdf_lookup_cmap(fontdesc->to_ttf_cmap, cid); + return ft_char_index(fontdesc->font->ft_face, cid); + } + + if (fontdesc->cid_to_gid) + return fontdesc->cid_to_gid[cid]; + + return cid; +} + +int +pdf_font_cid_to_gid(pdf_font_desc *fontdesc, int cid) +{ + if (fontdesc->font->ft_face) + return ft_cid_to_gid(fontdesc, cid); + return cid; +} + +static int ft_width(pdf_font_desc *fontdesc, int cid) +{ + int gid = ft_cid_to_gid(fontdesc, cid); + int fterr = FT_Load_Glyph(fontdesc->font->ft_face, gid, + FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM); + if (fterr) + { + fz_warn("freetype load glyph (gid %d): %s", gid, ft_error_string(fterr)); + return 0; + } + return ((FT_Face)fontdesc->font->ft_face)->glyph->advance.x; +} + +static int lookup_mre_code(char *name) +{ + int i; + for (i = 0; i < 256; i++) + if (pdf_mac_roman[i] && !strcmp(name, pdf_mac_roman[i])) + return i; + return -1; +} + +/* + * Load font files. + */ + +static fz_error +pdf_load_builtin_font(pdf_font_desc *fontdesc, char *fontname) +{ + fz_error error; + unsigned char *data; + unsigned int len; + + data = pdf_find_builtin_font(fontname, &len); + if (!data) + return fz_throw("cannot find builtin font: '%s'", fontname); + + error = fz_new_font_from_memory(&fontdesc->font, data, len, 0); + if (error) + return fz_rethrow(error, "cannot load freetype font from memory"); + + if (!strcmp(fontname, "Symbol") || !strcmp(fontname, "ZapfDingbats")) + fontdesc->flags |= PDF_FD_SYMBOLIC; + + return fz_okay; +} + +static fz_error +pdf_load_substitute_font(pdf_font_desc *fontdesc, int mono, int serif, int bold, int italic) +{ + fz_error error; + unsigned char *data; + unsigned int len; + + data = pdf_find_substitute_font(mono, serif, bold, italic, &len); + if (!data) + return fz_throw("cannot find substitute font"); + + error = fz_new_font_from_memory(&fontdesc->font, data, len, 0); + if (error) + return fz_rethrow(error, "cannot load freetype font from memory"); + + fontdesc->font->ft_substitute = 1; + fontdesc->font->ft_bold = bold && !ft_is_bold(fontdesc->font->ft_face); + fontdesc->font->ft_italic = italic && !ft_is_italic(fontdesc->font->ft_face); + return fz_okay; +} + +static fz_error +pdf_load_substitute_cjk_font(pdf_font_desc *fontdesc, int ros, int serif) +{ + fz_error error; + unsigned char *data; + unsigned int len; + + data = pdf_find_substitute_cjk_font(ros, serif, &len); + if (!data) + return fz_throw("cannot find builtin CJK font"); + + error = fz_new_font_from_memory(&fontdesc->font, data, len, 0); + if (error) + return fz_rethrow(error, "cannot load builtin CJK font"); + + fontdesc->font->ft_substitute = 1; + return fz_okay; +} + +static fz_error +pdf_load_system_font(pdf_font_desc *fontdesc, char *fontname, char *collection) +{ + fz_error error; + int bold = 0; + int italic = 0; + int serif = 0; + int mono = 0; + + if (strstr(fontname, "Bold")) + bold = 1; + if (strstr(fontname, "Italic")) + italic = 1; + if (strstr(fontname, "Oblique")) + italic = 1; + + if (fontdesc->flags & PDF_FD_FIXED_PITCH) + mono = 1; + if (fontdesc->flags & PDF_FD_SERIF) + serif = 1; + if (fontdesc->flags & PDF_FD_ITALIC) + italic = 1; + if (fontdesc->flags & PDF_FD_FORCE_BOLD) + bold = 1; + + if (collection) + { + if (!strcmp(collection, "Adobe-CNS1")) + return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_CNS, serif); + else if (!strcmp(collection, "Adobe-GB1")) + return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_GB, serif); + else if (!strcmp(collection, "Adobe-Japan1")) + return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_JAPAN, serif); + else if (!strcmp(collection, "Adobe-Korea1")) + return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_KOREA, serif); + return fz_throw("unknown cid collection: %s", collection); + } + + error = pdf_load_substitute_font(fontdesc, mono, serif, bold, italic); + if (error) + return fz_rethrow(error, "cannot load substitute font"); + + return fz_okay; +} + +static fz_error +pdf_load_embedded_font(pdf_font_desc *fontdesc, pdf_xref *xref, fz_obj *stmref) +{ + fz_error error; + fz_buffer *buf; + + error = pdf_load_stream(&buf, xref, fz_to_num(stmref), fz_to_gen(stmref)); + if (error) + return fz_rethrow(error, "cannot load font stream (%d %d R)", fz_to_num(stmref), fz_to_gen(stmref)); + + error = fz_new_font_from_memory(&fontdesc->font, buf->data, buf->len, 0); + if (error) + { + fz_drop_buffer(buf); + return fz_rethrow(error, "cannot load embedded font (%d %d R)", fz_to_num(stmref), fz_to_gen(stmref)); + } + + /* save the buffer so we can free it later */ + fontdesc->font->ft_data = buf->data; + fontdesc->font->ft_size = buf->len; + fz_free(buf); /* only free the fz_buffer struct, not the contained data */ + + fontdesc->is_embedded = 1; + + return fz_okay; +} + +/* + * Create and destroy + */ + +pdf_font_desc * +pdf_keep_font(pdf_font_desc *fontdesc) +{ + fontdesc->refs ++; + return fontdesc; +} + +void +pdf_drop_font(pdf_font_desc *fontdesc) +{ + if (fontdesc && --fontdesc->refs == 0) + { + if (fontdesc->font) + fz_drop_font(fontdesc->font); + if (fontdesc->encoding) + pdf_drop_cmap(fontdesc->encoding); + if (fontdesc->to_ttf_cmap) + pdf_drop_cmap(fontdesc->to_ttf_cmap); + if (fontdesc->to_unicode) + pdf_drop_cmap(fontdesc->to_unicode); + fz_free(fontdesc->cid_to_gid); + fz_free(fontdesc->cid_to_ucs); + fz_free(fontdesc->hmtx); + fz_free(fontdesc->vmtx); + fz_free(fontdesc); + } +} + +pdf_font_desc * +pdf_new_font_desc(void) +{ + pdf_font_desc *fontdesc; + + fontdesc = fz_malloc(sizeof(pdf_font_desc)); + fontdesc->refs = 1; + + fontdesc->font = NULL; + + fontdesc->flags = 0; + fontdesc->italic_angle = 0; + fontdesc->ascent = 0; + fontdesc->descent = 0; + fontdesc->cap_height = 0; + fontdesc->x_height = 0; + fontdesc->missing_width = 0; + + fontdesc->encoding = NULL; + fontdesc->to_ttf_cmap = NULL; + fontdesc->cid_to_gid_len = 0; + fontdesc->cid_to_gid = NULL; + + fontdesc->to_unicode = NULL; + fontdesc->cid_to_ucs_len = 0; + fontdesc->cid_to_ucs = NULL; + + fontdesc->wmode = 0; + + fontdesc->hmtx_cap = 0; + fontdesc->vmtx_cap = 0; + fontdesc->hmtx_len = 0; + fontdesc->vmtx_len = 0; + fontdesc->hmtx = NULL; + fontdesc->vmtx = NULL; + + fontdesc->dhmtx.lo = 0x0000; + fontdesc->dhmtx.hi = 0xFFFF; + fontdesc->dhmtx.w = 1000; + + fontdesc->dvmtx.lo = 0x0000; + fontdesc->dvmtx.hi = 0xFFFF; + fontdesc->dvmtx.x = 0; + fontdesc->dvmtx.y = 880; + fontdesc->dvmtx.w = -1000; + + fontdesc->is_embedded = 0; + + return fontdesc; +} + +/* + * Simple fonts (Type1 and TrueType) + */ + +static fz_error +pdf_load_simple_font(pdf_font_desc **fontdescp, pdf_xref *xref, fz_obj *dict) +{ + fz_error error; + fz_obj *descriptor; + fz_obj *encoding; + fz_obj *widths; + unsigned short *etable = NULL; + pdf_font_desc *fontdesc; + FT_Face face; + FT_CharMap cmap; + int symbolic; + int kind; + + char *basefont; + char *fontname; + char *estrings[256]; + char ebuffer[256][32]; + int i, k, n; + int fterr; + + basefont = fz_to_name(fz_dict_gets(dict, "BaseFont")); + fontname = clean_font_name(basefont); + + /* Load font file */ + + fontdesc = pdf_new_font_desc(); + + descriptor = fz_dict_gets(dict, "FontDescriptor"); + if (descriptor) + error = pdf_load_font_descriptor(fontdesc, xref, descriptor, NULL, basefont); + else + error = pdf_load_builtin_font(fontdesc, fontname); + if (error) + goto cleanup; + + /* Some chinese documents mistakenly consider WinAnsiEncoding to be codepage 936 */ + if (!*fontdesc->font->name && + !fz_dict_gets(dict, "ToUnicode") && + !strcmp(fz_to_name(fz_dict_gets(dict, "Encoding")), "WinAnsiEncoding") && + fz_to_int(fz_dict_gets(descriptor, "Flags")) == 4) + { + /* note: without the comma, pdf_load_font_descriptor would prefer /FontName over /BaseFont */ + char *cp936fonts[] = { + "\xCB\xCE\xCC\xE5", "SimSun,Regular", + "\xBA\xDA\xCC\xE5", "SimHei,Regular", + "\xBF\xAC\xCC\xE5_GB2312", "SimKai,Regular", + "\xB7\xC2\xCB\xCE_GB2312", "SimFang,Regular", + "\xC1\xA5\xCA\xE9", "SimLi,Regular", + NULL + }; + for (i = 0; cp936fonts[i]; i += 2) + if (!strcmp(basefont, cp936fonts[i])) + break; + if (cp936fonts[i]) + { + fz_warn("workaround for S22PDF lying about chinese font encodings"); + pdf_drop_font(fontdesc); + fontdesc = pdf_new_font_desc(); + error = pdf_load_font_descriptor(fontdesc, xref, descriptor, "Adobe-GB1", cp936fonts[i+1]); + error |= pdf_load_system_cmap(&fontdesc->encoding, "GBK-EUC-H"); + error |= pdf_load_system_cmap(&fontdesc->to_unicode, "Adobe-GB1-UCS2"); + error |= pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-GB1-UCS2"); + if (error) + return fz_rethrow(error, "cannot load font"); + + face = fontdesc->font->ft_face; + kind = ft_kind(face); + goto skip_encoding; + } + } + + face = fontdesc->font->ft_face; + kind = ft_kind(face); + + /* Encoding */ + + symbolic = fontdesc->flags & 4; + + if (face->num_charmaps > 0) + cmap = face->charmaps[0]; + else + cmap = NULL; + + for (i = 0; i < face->num_charmaps; i++) + { + FT_CharMap test = face->charmaps[i]; + + if (kind == TYPE1) + { + if (test->platform_id == 7) + cmap = test; + } + + if (kind == TRUETYPE) + { + if (test->platform_id == 1 && test->encoding_id == 0) + cmap = test; + if (test->platform_id == 3 && test->encoding_id == 1) + cmap = test; + } + } + + if (cmap) + { + fterr = FT_Set_Charmap(face, cmap); + if (fterr) + fz_warn("freetype could not set cmap: %s", ft_error_string(fterr)); + } + else + fz_warn("freetype could not find any cmaps"); + + etable = fz_calloc(256, sizeof(unsigned short)); + for (i = 0; i < 256; i++) + { + estrings[i] = NULL; + etable[i] = 0; + } + + encoding = fz_dict_gets(dict, "Encoding"); + if (encoding) + { + if (fz_is_name(encoding)) + pdf_load_encoding(estrings, fz_to_name(encoding)); + + if (fz_is_dict(encoding)) + { + fz_obj *base, *diff, *item; + + base = fz_dict_gets(encoding, "BaseEncoding"); + if (fz_is_name(base)) + pdf_load_encoding(estrings, fz_to_name(base)); + else if (!fontdesc->is_embedded && !symbolic) + pdf_load_encoding(estrings, "StandardEncoding"); + + diff = fz_dict_gets(encoding, "Differences"); + if (fz_is_array(diff)) + { + n = fz_array_len(diff); + k = 0; + for (i = 0; i < n; i++) + { + item = fz_array_get(diff, i); + if (fz_is_int(item)) + k = fz_to_int(item); + if (fz_is_name(item)) + estrings[k++] = fz_to_name(item); + if (k < 0) k = 0; + if (k > 255) k = 255; + } + } + } + } + + /* start with the builtin encoding */ + for (i = 0; i < 256; i++) + etable[i] = ft_char_index(face, i); + + /* encode by glyph name where we can */ + if (kind == TYPE1) + { + for (i = 0; i < 256; i++) + { + if (estrings[i]) + { + etable[i] = FT_Get_Name_Index(face, estrings[i]); + if (etable[i] == 0) + { + int aglcode = pdf_lookup_agl(estrings[i]); + const char **dupnames = pdf_lookup_agl_duplicates(aglcode); + while (*dupnames) + { + etable[i] = FT_Get_Name_Index(face, (char*)*dupnames); + if (etable[i]) + break; + dupnames++; + } + } + } + } + } + + /* encode by glyph name where we can */ + if (kind == TRUETYPE) + { + /* Unicode cmap */ + if (!symbolic && face->charmap && face->charmap->platform_id == 3) + { + for (i = 0; i < 256; i++) + { + if (estrings[i]) + { + int aglcode = pdf_lookup_agl(estrings[i]); + if (!aglcode) + etable[i] = FT_Get_Name_Index(face, estrings[i]); + else + etable[i] = ft_char_index(face, aglcode); + } + } + } + + /* MacRoman cmap */ + else if (!symbolic && face->charmap && face->charmap->platform_id == 1) + { + for (i = 0; i < 256; i++) + { + if (estrings[i]) + { + k = lookup_mre_code(estrings[i]); + if (k <= 0) + etable[i] = FT_Get_Name_Index(face, estrings[i]); + else + etable[i] = ft_char_index(face, k); + } + } + } + + /* Symbolic cmap */ + else + { + for (i = 0; i < 256; i++) + { + if (estrings[i]) + { + etable[i] = FT_Get_Name_Index(face, estrings[i]); + if (etable[i] == 0) + etable[i] = ft_char_index(face, i); + } + } + } + } + + /* try to reverse the glyph names from the builtin encoding */ + for (i = 0; i < 256; i++) + { + if (etable[i] && !estrings[i]) + { + if (FT_HAS_GLYPH_NAMES(face)) + { + fterr = FT_Get_Glyph_Name(face, etable[i], ebuffer[i], 32); + if (fterr) + fz_warn("freetype get glyph name (gid %d): %s", etable[i], ft_error_string(fterr)); + if (ebuffer[i][0]) + estrings[i] = ebuffer[i]; + } + else + { + estrings[i] = (char*) pdf_win_ansi[i]; /* discard const */ + } + } + } + + fontdesc->encoding = pdf_new_identity_cmap(0, 1); + fontdesc->cid_to_gid_len = 256; + fontdesc->cid_to_gid = etable; + + error = pdf_load_to_unicode(fontdesc, xref, estrings, NULL, fz_dict_gets(dict, "ToUnicode")); + if (error) + fz_catch(error, "cannot load to_unicode"); + +skip_encoding: + + /* Widths */ + + pdf_set_default_hmtx(fontdesc, fontdesc->missing_width); + + widths = fz_dict_gets(dict, "Widths"); + if (widths) + { + int first, last; + + first = fz_to_int(fz_dict_gets(dict, "FirstChar")); + last = fz_to_int(fz_dict_gets(dict, "LastChar")); + + if (first < 0 || last > 255 || first > last) + first = last = 0; + + for (i = 0; i < last - first + 1; i++) + { + int wid = fz_to_int(fz_array_get(widths, i)); + pdf_add_hmtx(fontdesc, i + first, i + first, wid); + } + } + else + { + fterr = FT_Set_Char_Size(face, 1000, 1000, 72, 72); + if (fterr) + fz_warn("freetype set character size: %s", ft_error_string(fterr)); + for (i = 0; i < 256; i++) + { + pdf_add_hmtx(fontdesc, i, i, ft_width(fontdesc, i)); + } + } + + pdf_end_hmtx(fontdesc); + + *fontdescp = fontdesc; + return fz_okay; + +cleanup: + if (etable != fontdesc->cid_to_gid) + fz_free(etable); + pdf_drop_font(fontdesc); + return fz_rethrow(error, "cannot load simple font (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); +} + +/* + * CID Fonts + */ + +static fz_error +load_cid_font(pdf_font_desc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *encoding, fz_obj *to_unicode) +{ + fz_error error; + fz_obj *widths; + fz_obj *descriptor; + pdf_font_desc *fontdesc; + FT_Face face; + int kind; + char collection[256]; + char *basefont; + int i, k, fterr; + fz_obj *obj; + int dw; + + /* Get font name and CID collection */ + + basefont = fz_to_name(fz_dict_gets(dict, "BaseFont")); + + { + fz_obj *cidinfo; + char tmpstr[64]; + int tmplen; + + cidinfo = fz_dict_gets(dict, "CIDSystemInfo"); + if (!cidinfo) + return fz_throw("cid font is missing info"); + + obj = fz_dict_gets(cidinfo, "Registry"); + tmplen = MIN(sizeof tmpstr - 1, fz_to_str_len(obj)); + memcpy(tmpstr, fz_to_str_buf(obj), tmplen); + tmpstr[tmplen] = '\0'; + fz_strlcpy(collection, tmpstr, sizeof collection); + + fz_strlcat(collection, "-", sizeof collection); + + obj = fz_dict_gets(cidinfo, "Ordering"); + tmplen = MIN(sizeof tmpstr - 1, fz_to_str_len(obj)); + memcpy(tmpstr, fz_to_str_buf(obj), tmplen); + tmpstr[tmplen] = '\0'; + fz_strlcat(collection, tmpstr, sizeof collection); + } + + /* Load font file */ + + fontdesc = pdf_new_font_desc(); + + descriptor = fz_dict_gets(dict, "FontDescriptor"); + if (descriptor) + error = pdf_load_font_descriptor(fontdesc, xref, descriptor, collection, basefont); + else + error = fz_throw("syntaxerror: missing font descriptor"); + if (error) + goto cleanup; + + face = fontdesc->font->ft_face; + kind = ft_kind(face); + + /* Encoding */ + + error = fz_okay; + if (fz_is_name(encoding)) + { + if (!strcmp(fz_to_name(encoding), "Identity-H")) + fontdesc->encoding = pdf_new_identity_cmap(0, 2); + else if (!strcmp(fz_to_name(encoding), "Identity-V")) + fontdesc->encoding = pdf_new_identity_cmap(1, 2); + else + error = pdf_load_system_cmap(&fontdesc->encoding, fz_to_name(encoding)); + } + else if (fz_is_indirect(encoding)) + { + error = pdf_load_embedded_cmap(&fontdesc->encoding, xref, encoding); + } + else + { + error = fz_throw("syntaxerror: font missing encoding"); + } + if (error) + goto cleanup; + + pdf_set_font_wmode(fontdesc, pdf_get_wmode(fontdesc->encoding)); + + if (kind == TRUETYPE) + { + fz_obj *cidtogidmap; + + cidtogidmap = fz_dict_gets(dict, "CIDToGIDMap"); + if (fz_is_indirect(cidtogidmap)) + { + fz_buffer *buf; + + error = pdf_load_stream(&buf, xref, fz_to_num(cidtogidmap), fz_to_gen(cidtogidmap)); + if (error) + goto cleanup; + + fontdesc->cid_to_gid_len = (buf->len) / 2; + fontdesc->cid_to_gid = fz_calloc(fontdesc->cid_to_gid_len, sizeof(unsigned short)); + for (i = 0; i < fontdesc->cid_to_gid_len; i++) + fontdesc->cid_to_gid[i] = (buf->data[i * 2] << 8) + buf->data[i * 2 + 1]; + + fz_drop_buffer(buf); + } + + /* if truetype font is external, cidtogidmap should not be identity */ + /* so we map from cid to unicode and then map that through the (3 1) */ + /* unicode cmap to get a glyph id */ + else if (fontdesc->font->ft_substitute) + { + fterr = FT_Select_Charmap(face, ft_encoding_unicode); + if (fterr) + { + error = fz_throw("fonterror: no unicode cmap when emulating CID font: %s", ft_error_string(fterr)); + goto cleanup; + } + + if (!strcmp(collection, "Adobe-CNS1")) + error = pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-CNS1-UCS2"); + else if (!strcmp(collection, "Adobe-GB1")) + error = pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-GB1-UCS2"); + else if (!strcmp(collection, "Adobe-Japan1")) + error = pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-Japan1-UCS2"); + else if (!strcmp(collection, "Adobe-Japan2")) + error = pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-Japan2-UCS2"); + else if (!strcmp(collection, "Adobe-Korea1")) + error = pdf_load_system_cmap(&fontdesc->to_ttf_cmap, "Adobe-Korea1-UCS2"); + else + error = fz_okay; + + if (error) + { + error = fz_rethrow(error, "cannot load system cmap %s", collection); + goto cleanup; + } + } + } + + error = pdf_load_to_unicode(fontdesc, xref, NULL, collection, to_unicode); + if (error) + fz_catch(error, "cannot load to_unicode"); + + /* Horizontal */ + + dw = 1000; + obj = fz_dict_gets(dict, "DW"); + if (obj) + dw = fz_to_int(obj); + pdf_set_default_hmtx(fontdesc, dw); + + widths = fz_dict_gets(dict, "W"); + if (widths) + { + int c0, c1, w; + + for (i = 0; i < fz_array_len(widths); ) + { + c0 = fz_to_int(fz_array_get(widths, i)); + obj = fz_array_get(widths, i + 1); + if (fz_is_array(obj)) + { + for (k = 0; k < fz_array_len(obj); k++) + { + w = fz_to_int(fz_array_get(obj, k)); + pdf_add_hmtx(fontdesc, c0 + k, c0 + k, w); + } + i += 2; + } + else + { + c1 = fz_to_int(obj); + w = fz_to_int(fz_array_get(widths, i + 2)); + pdf_add_hmtx(fontdesc, c0, c1, w); + i += 3; + } + } + } + + pdf_end_hmtx(fontdesc); + + /* Vertical */ + + if (pdf_get_wmode(fontdesc->encoding) == 1) + { + int dw2y = 880; + int dw2w = -1000; + + obj = fz_dict_gets(dict, "DW2"); + if (obj) + { + dw2y = fz_to_int(fz_array_get(obj, 0)); + dw2w = fz_to_int(fz_array_get(obj, 1)); + } + + pdf_set_default_vmtx(fontdesc, dw2y, dw2w); + + widths = fz_dict_gets(dict, "W2"); + if (widths) + { + int c0, c1, w, x, y; + + for (i = 0; i < fz_array_len(widths); ) + { + c0 = fz_to_int(fz_array_get(widths, i)); + obj = fz_array_get(widths, i + 1); + if (fz_is_array(obj)) + { + for (k = 0; k * 3 < fz_array_len(obj); k ++) + { + w = fz_to_int(fz_array_get(obj, k * 3 + 0)); + x = fz_to_int(fz_array_get(obj, k * 3 + 1)); + y = fz_to_int(fz_array_get(obj, k * 3 + 2)); + pdf_add_vmtx(fontdesc, c0 + k, c0 + k, x, y, w); + } + i += 2; + } + else + { + c1 = fz_to_int(obj); + w = fz_to_int(fz_array_get(widths, i + 2)); + x = fz_to_int(fz_array_get(widths, i + 3)); + y = fz_to_int(fz_array_get(widths, i + 4)); + pdf_add_vmtx(fontdesc, c0, c1, x, y, w); + i += 5; + } + } + } + + pdf_end_vmtx(fontdesc); + } + + *fontdescp = fontdesc; + return fz_okay; + +cleanup: + pdf_drop_font(fontdesc); + return fz_rethrow(error, "cannot load cid font (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); +} + +static fz_error +pdf_load_type0_font(pdf_font_desc **fontdescp, pdf_xref *xref, fz_obj *dict) +{ + fz_error error; + fz_obj *dfonts; + fz_obj *dfont; + fz_obj *subtype; + fz_obj *encoding; + fz_obj *to_unicode; + + dfonts = fz_dict_gets(dict, "DescendantFonts"); + if (!dfonts) + return fz_throw("cid font is missing descendant fonts"); + + dfont = fz_array_get(dfonts, 0); + + subtype = fz_dict_gets(dfont, "Subtype"); + encoding = fz_dict_gets(dict, "Encoding"); + to_unicode = fz_dict_gets(dict, "ToUnicode"); + + if (fz_is_name(subtype) && !strcmp(fz_to_name(subtype), "CIDFontType0")) + error = load_cid_font(fontdescp, xref, dfont, encoding, to_unicode); + else if (fz_is_name(subtype) && !strcmp(fz_to_name(subtype), "CIDFontType2")) + error = load_cid_font(fontdescp, xref, dfont, encoding, to_unicode); + else + error = fz_throw("syntaxerror: unknown cid font type"); + if (error) + return fz_rethrow(error, "cannot load descendant font (%d %d R)", fz_to_num(dfont), fz_to_gen(dfont)); + + return fz_okay; +} + +/* + * FontDescriptor + */ + +static fz_error +pdf_load_font_descriptor(pdf_font_desc *fontdesc, pdf_xref *xref, fz_obj *dict, char *collection, char *basefont) +{ + fz_error error; + fz_obj *obj1, *obj2, *obj3, *obj; + char *fontname; + char *origname; + FT_Face face; + + if (!strchr(basefont, ',') || strchr(basefont, '+')) + origname = fz_to_name(fz_dict_gets(dict, "FontName")); + else + origname = basefont; + fontname = clean_font_name(origname); + + fontdesc->flags = fz_to_int(fz_dict_gets(dict, "Flags")); + fontdesc->italic_angle = fz_to_real(fz_dict_gets(dict, "ItalicAngle")); + fontdesc->ascent = fz_to_real(fz_dict_gets(dict, "Ascent")); + fontdesc->descent = fz_to_real(fz_dict_gets(dict, "Descent")); + fontdesc->cap_height = fz_to_real(fz_dict_gets(dict, "CapHeight")); + fontdesc->x_height = fz_to_real(fz_dict_gets(dict, "XHeight")); + fontdesc->missing_width = fz_to_real(fz_dict_gets(dict, "MissingWidth")); + + obj1 = fz_dict_gets(dict, "FontFile"); + obj2 = fz_dict_gets(dict, "FontFile2"); + obj3 = fz_dict_gets(dict, "FontFile3"); + obj = obj1 ? obj1 : obj2 ? obj2 : obj3; + + if (fz_is_indirect(obj)) + { + error = pdf_load_embedded_font(fontdesc, xref, obj); + if (error) + { + fz_catch(error, "ignored error when loading embedded font, attempting to load system font"); + if (origname != fontname) + error = pdf_load_builtin_font(fontdesc, fontname); + else + error = pdf_load_system_font(fontdesc, fontname, collection); + if (error) + return fz_rethrow(error, "cannot load font descriptor (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + } + } + else + { + if (origname != fontname) + error = pdf_load_builtin_font(fontdesc, fontname); + else + error = pdf_load_system_font(fontdesc, fontname, collection); + if (error) + return fz_rethrow(error, "cannot load font descriptor (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + } + + fz_strlcpy(fontdesc->font->name, fontname, sizeof fontdesc->font->name); + + /* Check for DynaLab fonts that must use hinting */ + face = fontdesc->font->ft_face; + if (ft_kind(face) == TRUETYPE) + { + if (FT_IS_TRICKY(face) || is_dynalab(fontdesc->font->name)) + fontdesc->font->ft_hint = 1; + } + + return fz_okay; + +} + +static void +pdf_make_width_table(pdf_font_desc *fontdesc) +{ + fz_font *font = fontdesc->font; + int i, k, cid, gid; + + font->width_count = 0; + for (i = 0; i < fontdesc->hmtx_len; i++) + { + for (k = fontdesc->hmtx[i].lo; k <= fontdesc->hmtx[i].hi; k++) + { + cid = pdf_lookup_cmap(fontdesc->encoding, k); + gid = pdf_font_cid_to_gid(fontdesc, cid); + if (gid > font->width_count) + font->width_count = gid; + } + } + font->width_count ++; + + font->width_table = fz_calloc(font->width_count, sizeof(int)); + memset(font->width_table, 0, sizeof(int) * font->width_count); + + for (i = 0; i < fontdesc->hmtx_len; i++) + { + for (k = fontdesc->hmtx[i].lo; k <= fontdesc->hmtx[i].hi; k++) + { + cid = pdf_lookup_cmap(fontdesc->encoding, k); + gid = pdf_font_cid_to_gid(fontdesc, cid); + if (gid >= 0 && gid < font->width_count) + font->width_table[gid] = fontdesc->hmtx[i].w; + } + } +} + +fz_error +pdf_load_font(pdf_font_desc **fontdescp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict) +{ + fz_error error; + char *subtype; + fz_obj *dfonts; + fz_obj *charprocs; + + if ((*fontdescp = pdf_find_item(xref->store, pdf_drop_font, dict))) + { + pdf_keep_font(*fontdescp); + return fz_okay; + } + + subtype = fz_to_name(fz_dict_gets(dict, "Subtype")); + dfonts = fz_dict_gets(dict, "DescendantFonts"); + charprocs = fz_dict_gets(dict, "CharProcs"); + + if (subtype && !strcmp(subtype, "Type0")) + error = pdf_load_type0_font(fontdescp, xref, dict); + else if (subtype && !strcmp(subtype, "Type1")) + error = pdf_load_simple_font(fontdescp, xref, dict); + else if (subtype && !strcmp(subtype, "MMType1")) + error = pdf_load_simple_font(fontdescp, xref, dict); + else if (subtype && !strcmp(subtype, "TrueType")) + error = pdf_load_simple_font(fontdescp, xref, dict); + else if (subtype && !strcmp(subtype, "Type3")) + error = pdf_load_type3_font(fontdescp, xref, rdb, dict); + else if (charprocs) + { + fz_warn("unknown font format, guessing type3."); + error = pdf_load_type3_font(fontdescp, xref, rdb, dict); + } + else if (dfonts) + { + fz_warn("unknown font format, guessing type0."); + error = pdf_load_type0_font(fontdescp, xref, dict); + } + else + { + fz_warn("unknown font format, guessing type1 or truetype."); + error = pdf_load_simple_font(fontdescp, xref, dict); + } + if (error) + return fz_rethrow(error, "cannot load font (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + + /* Save the widths to stretch non-CJK substitute fonts */ + if ((*fontdescp)->font->ft_substitute && !(*fontdescp)->to_ttf_cmap) + pdf_make_width_table(*fontdescp); + + pdf_store_item(xref->store, pdf_keep_font, pdf_drop_font, dict, *fontdescp); + + return fz_okay; +} + +void +pdf_debug_font(pdf_font_desc *fontdesc) +{ + int i; + + printf("fontdesc {\n"); + + if (fontdesc->font->ft_face) + printf("\tfreetype font\n"); + if (fontdesc->font->t3procs) + printf("\ttype3 font\n"); + + printf("\twmode %d\n", fontdesc->wmode); + printf("\tDW %d\n", fontdesc->dhmtx.w); + + printf("\tW {\n"); + for (i = 0; i < fontdesc->hmtx_len; i++) + printf("\t\t<%04x> <%04x> %d\n", + fontdesc->hmtx[i].lo, fontdesc->hmtx[i].hi, fontdesc->hmtx[i].w); + printf("\t}\n"); + + if (fontdesc->wmode) + { + printf("\tDW2 [%d %d]\n", fontdesc->dvmtx.y, fontdesc->dvmtx.w); + printf("\tW2 {\n"); + for (i = 0; i < fontdesc->vmtx_len; i++) + printf("\t\t<%04x> <%04x> %d %d %d\n", fontdesc->vmtx[i].lo, fontdesc->vmtx[i].hi, + fontdesc->vmtx[i].x, fontdesc->vmtx[i].y, fontdesc->vmtx[i].w); + printf("\t}\n"); + } +} diff --git a/contrib/media/updf_newlib/pdf/pdf_fontfile.c b/contrib/media/updf_newlib/pdf/pdf_fontfile.c new file mode 100755 index 000000000..fb85bee40 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_fontfile.c @@ -0,0 +1,139 @@ +#include "fitz.h" +#include "mupdf.h" + +#ifdef NOCJK +#define NOCJKFONT +#endif + +#include "../generated/font_base14.h" + +#ifndef NODROIDFONT +#include "../generated/font_droid.h" +#endif + +#ifndef NOCJKFONT +#include "../generated/font_cjk.h" +#endif + +unsigned char * +pdf_find_builtin_font(char *name, unsigned int *len) +{ + if (!strcmp("Courier", name)) { + *len = sizeof pdf_font_NimbusMonL_Regu; + return (unsigned char*) pdf_font_NimbusMonL_Regu; + } + if (!strcmp("Courier-Bold", name)) { + *len = sizeof pdf_font_NimbusMonL_Bold; + return (unsigned char*) pdf_font_NimbusMonL_Bold; + } + if (!strcmp("Courier", name)) { + *len = sizeof pdf_font_NimbusMonL_Regu; + return (unsigned char*) pdf_font_NimbusMonL_Regu; + } + if (!strcmp("Courier-Bold", name)) { + *len = sizeof pdf_font_NimbusMonL_Bold; + return (unsigned char*) pdf_font_NimbusMonL_Bold; + } + if (!strcmp("Courier-Oblique", name)) { + *len = sizeof pdf_font_NimbusMonL_ReguObli; + return (unsigned char*) pdf_font_NimbusMonL_ReguObli; + } + if (!strcmp("Courier-BoldOblique", name)) { + *len = sizeof pdf_font_NimbusMonL_BoldObli; + return (unsigned char*) pdf_font_NimbusMonL_BoldObli; + } + if (!strcmp("Helvetica", name)) { + *len = sizeof pdf_font_NimbusSanL_Regu; + return (unsigned char*) pdf_font_NimbusSanL_Regu; + } + if (!strcmp("Helvetica-Bold", name)) { + *len = sizeof pdf_font_NimbusSanL_Bold; + return (unsigned char*) pdf_font_NimbusSanL_Bold; + } + if (!strcmp("Helvetica-Oblique", name)) { + *len = sizeof pdf_font_NimbusSanL_ReguItal; + return (unsigned char*) pdf_font_NimbusSanL_ReguItal; + } + if (!strcmp("Helvetica-BoldOblique", name)) { + *len = sizeof pdf_font_NimbusSanL_BoldItal; + return (unsigned char*) pdf_font_NimbusSanL_BoldItal; + } + if (!strcmp("Times-Roman", name)) { + *len = sizeof pdf_font_NimbusRomNo9L_Regu; + return (unsigned char*) pdf_font_NimbusRomNo9L_Regu; + } + if (!strcmp("Times-Bold", name)) { + *len = sizeof pdf_font_NimbusRomNo9L_Medi; + return (unsigned char*) pdf_font_NimbusRomNo9L_Medi; + } + if (!strcmp("Times-Italic", name)) { + *len = sizeof pdf_font_NimbusRomNo9L_ReguItal; + return (unsigned char*) pdf_font_NimbusRomNo9L_ReguItal; + } + if (!strcmp("Times-BoldItalic", name)) { + *len = sizeof pdf_font_NimbusRomNo9L_MediItal; + return (unsigned char*) pdf_font_NimbusRomNo9L_MediItal; + } + if (!strcmp("Symbol", name)) { + *len = sizeof pdf_font_StandardSymL; + return (unsigned char*) pdf_font_StandardSymL; + } + if (!strcmp("ZapfDingbats", name)) { + *len = sizeof pdf_font_Dingbats; + return (unsigned char*) pdf_font_Dingbats; + } + *len = 0; + return NULL; +} + +unsigned char * +pdf_find_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len) +{ +#ifdef NODROIDFONT + if (mono) { + if (bold) { + if (italic) return pdf_find_builtin_font("Courier-BoldOblique", len); + else return pdf_find_builtin_font("Courier-Bold", len); + } else { + if (italic) return pdf_find_builtin_font("Courier-Oblique", len); + else return pdf_find_builtin_font("Courier", len); + } + } else if (serif) { + if (bold) { + if (italic) return pdf_find_builtin_font("Times-BoldItalic", len); + else return pdf_find_builtin_font("Times-Bold", len); + } else { + if (italic) return pdf_find_builtin_font("Times-Italic", len); + else return pdf_find_builtin_font("Times-Roman", len); + } + } else { + if (bold) { + if (italic) return pdf_find_builtin_font("Helvetica-BoldOblique", len); + else return pdf_find_builtin_font("Helvetica-Bold", len); + } else { + if (italic) return pdf_find_builtin_font("Helvetica-Oblique", len); + else return pdf_find_builtin_font("Helvetica", len); + } + } +#else + if (mono) { + *len = sizeof pdf_font_DroidSansMono; + return (unsigned char*) pdf_font_DroidSansMono; + } else { + *len = sizeof pdf_font_DroidSans; + return (unsigned char*) pdf_font_DroidSans; + } +#endif +} + +unsigned char * +pdf_find_substitute_cjk_font(int ros, int serif, unsigned int *len) +{ +#ifndef NOCJKFONT + *len = sizeof pdf_font_DroidSansFallback; + return (unsigned char*) pdf_font_DroidSansFallback; +#else + *len = 0; + return NULL; +#endif +} diff --git a/contrib/media/updf_newlib/pdf/pdf_function.c b/contrib/media/updf_newlib/pdf/pdf_function.c new file mode 100755 index 000000000..c11323656 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_function.c @@ -0,0 +1,1694 @@ +#include "fitz.h" +#include "mupdf.h" + +enum +{ + MAXN = FZ_MAX_COLORS, + MAXM = FZ_MAX_COLORS, +}; + +typedef struct psobj_s psobj; + +enum +{ + SAMPLE = 0, + EXPONENTIAL = 2, + STITCHING = 3, + POSTSCRIPT = 4 +}; + +struct pdf_function_s +{ + int refs; + int type; /* 0=sample 2=exponential 3=stitching 4=postscript */ + int m; /* number of input values */ + int n; /* number of output values */ + float domain[MAXM][2]; /* even index : min value, odd index : max value */ + float range[MAXN][2]; /* even index : min value, odd index : max value */ + int has_range; + + union + { + struct { + unsigned short bps; + int size[MAXM]; + float encode[MAXM][2]; + float decode[MAXN][2]; + float *samples; + } sa; + + struct { + float n; + float c0[MAXN]; + float c1[MAXN]; + } e; + + struct { + int k; + pdf_function **funcs; /* k */ + float *bounds; /* k - 1 */ + float *encode; /* k * 2 */ + } st; + + struct { + psobj *code; + int cap; + } p; + } u; +}; + +#define RADIAN 57.2957795 + +static inline float lerp(float x, float xmin, float xmax, float ymin, float ymax) +{ + if (xmin == xmax) + return ymin; + if (ymin == ymax) + return ymin; + return ymin + (x - xmin) * (ymax - ymin) / (xmax - xmin); +} + +/* + * PostScript calculator + */ + +enum { PS_BOOL, PS_INT, PS_REAL, PS_OPERATOR, PS_BLOCK }; + +enum +{ + PS_OP_ABS, PS_OP_ADD, PS_OP_AND, PS_OP_ATAN, PS_OP_BITSHIFT, + PS_OP_CEILING, PS_OP_COPY, PS_OP_COS, PS_OP_CVI, PS_OP_CVR, + PS_OP_DIV, PS_OP_DUP, PS_OP_EQ, PS_OP_EXCH, PS_OP_EXP, + PS_OP_FALSE, PS_OP_FLOOR, PS_OP_GE, PS_OP_GT, PS_OP_IDIV, + PS_OP_INDEX, PS_OP_LE, PS_OP_LN, PS_OP_LOG, PS_OP_LT, PS_OP_MOD, + PS_OP_MUL, PS_OP_NE, PS_OP_NEG, PS_OP_NOT, PS_OP_OR, PS_OP_POP, + PS_OP_ROLL, PS_OP_ROUND, PS_OP_SIN, PS_OP_SQRT, PS_OP_SUB, + PS_OP_TRUE, PS_OP_TRUNCATE, PS_OP_XOR, PS_OP_IF, PS_OP_IFELSE, + PS_OP_RETURN +}; + +static char *ps_op_names[] = +{ + "abs", "add", "and", "atan", "bitshift", "ceiling", "copy", + "cos", "cvi", "cvr", "div", "dup", "eq", "exch", "exp", + "false", "floor", "ge", "gt", "idiv", "index", "le", "ln", + "log", "lt", "mod", "mul", "ne", "neg", "not", "or", "pop", + "roll", "round", "sin", "sqrt", "sub", "true", "truncate", + "xor", "if", "ifelse", "return" +}; + +struct psobj_s +{ + int type; + union + { + int b; /* boolean (stack only) */ + int i; /* integer (stack and code) */ + float f; /* real (stack and code) */ + int op; /* operator (code only) */ + int block; /* if/ifelse block pointer (code only) */ + } u; +}; + +typedef struct ps_stack_s ps_stack; + +struct ps_stack_s +{ + psobj stack[100]; + int sp; +}; + +void +pdf_debug_ps_stack(ps_stack *st) +{ + int i; + + printf("stack: "); + + for (i = 0; i < st->sp; i++) + { + switch (st->stack[i].type) + { + case PS_BOOL: + if (st->stack[i].u.b) + printf("true "); + else + printf("false "); + break; + + case PS_INT: + printf("%d ", st->stack[i].u.i); + break; + + case PS_REAL: + printf("%g ", st->stack[i].u.f); + break; + } + } + printf("\n"); + +} + +static void +ps_init_stack(ps_stack *st) +{ + memset(st->stack, 0, sizeof(st->stack)); + st->sp = 0; +} + +static inline int ps_overflow(ps_stack *st, int n) +{ + return n < 0 || st->sp + n >= nelem(st->stack); +} + +static inline int ps_underflow(ps_stack *st, int n) +{ + return n < 0 || st->sp - n < 0; +} + +static inline int ps_is_type(ps_stack *st, int t) +{ + return !ps_underflow(st, 1) && st->stack[st->sp - 1].type == t; +} + +static inline int ps_is_type2(ps_stack *st, int t) +{ + return !ps_underflow(st, 2) && st->stack[st->sp - 1].type == t && st->stack[st->sp - 2].type == t; +} + +static void +ps_push_bool(ps_stack *st, int b) +{ + if (!ps_overflow(st, 1)) + { + st->stack[st->sp].type = PS_BOOL; + st->stack[st->sp].u.b = b; + st->sp++; + } +} + +static void +ps_push_int(ps_stack *st, int n) +{ + if (!ps_overflow(st, 1)) + { + st->stack[st->sp].type = PS_INT; + st->stack[st->sp].u.i = n; + st->sp++; + } +} + +static void +ps_push_real(ps_stack *st, float n) +{ + if (!ps_overflow(st, 1)) + { + st->stack[st->sp].type = PS_REAL; + st->stack[st->sp].u.f = n; + st->sp++; + } +} + +static int +ps_pop_bool(ps_stack *st) +{ + if (!ps_underflow(st, 1)) + { + if (ps_is_type(st, PS_BOOL)) + return st->stack[--st->sp].u.b; + } + return 0; +} + +static int +ps_pop_int(ps_stack *st) +{ + if (!ps_underflow(st, 1)) + { + if (ps_is_type(st, PS_INT)) + return st->stack[--st->sp].u.i; + if (ps_is_type(st, PS_REAL)) + return st->stack[--st->sp].u.f; + } + return 0; +} + +static float +ps_pop_real(ps_stack *st) +{ + if (!ps_underflow(st, 1)) + { + if (ps_is_type(st, PS_INT)) + return st->stack[--st->sp].u.i; + if (ps_is_type(st, PS_REAL)) + return st->stack[--st->sp].u.f; + } + return 0; +} + +static void +ps_copy(ps_stack *st, int n) +{ + if (!ps_underflow(st, n) && !ps_overflow(st, n)) + { + memcpy(st->stack + st->sp, st->stack + st->sp - n, n * sizeof(psobj)); + st->sp += n; + } +} + +static void +ps_roll(ps_stack *st, int n, int j) +{ + psobj tmp; + int i; + + if (ps_underflow(st, n) || j == 0 || n == 0) + return; + + if (j >= 0) + { + j %= n; + } + else + { + j = -j % n; + if (j != 0) + j = n - j; + } + + for (i = 0; i < j; i++) + { + tmp = st->stack[st->sp - 1]; + memmove(st->stack + st->sp - n + 1, st->stack + st->sp - n, n * sizeof(psobj)); + st->stack[st->sp - n] = tmp; + } +} + +static void +ps_index(ps_stack *st, int n) +{ + if (!ps_overflow(st, 1) && !ps_underflow(st, n)) + { + st->stack[st->sp] = st->stack[st->sp - n - 1]; + st->sp++; + } +} + +static void +ps_run(psobj *code, ps_stack *st, int pc) +{ + int i1, i2; + float r1, r2; + int b1, b2; + + while (1) + { + switch (code[pc].type) + { + case PS_INT: + ps_push_int(st, code[pc++].u.i); + break; + + case PS_REAL: + ps_push_real(st, code[pc++].u.f); + break; + + case PS_OPERATOR: + switch (code[pc++].u.op) + { + case PS_OP_ABS: + if (ps_is_type(st, PS_INT)) + ps_push_int(st, abs(ps_pop_int(st))); + else + ps_push_real(st, fabsf(ps_pop_real(st))); + break; + + case PS_OP_ADD: + if (ps_is_type2(st, PS_INT)) { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_int(st, i1 + i2); + } + else { + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_real(st, r1 + r2); + } + break; + + case PS_OP_AND: + if (ps_is_type2(st, PS_INT)) { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_int(st, i1 & i2); + } + else { + b2 = ps_pop_bool(st); + b1 = ps_pop_bool(st); + ps_push_bool(st, b1 && b2); + } + break; + + case PS_OP_ATAN: + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + r1 = atan2f(r1, r2) * RADIAN; + if (r1 < 0) + r1 += 360; + ps_push_real(st, r1); + break; + + case PS_OP_BITSHIFT: + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + if (i2 > 0) + ps_push_int(st, i1 << i2); + else if (i2 < 0) + ps_push_int(st, (int)((unsigned int)i1 >> i2)); + else + ps_push_int(st, i1); + break; + + case PS_OP_CEILING: + r1 = ps_pop_real(st); + ps_push_real(st, ceilf(r1)); + break; + + case PS_OP_COPY: + ps_copy(st, ps_pop_int(st)); + break; + + case PS_OP_COS: + r1 = ps_pop_real(st); + ps_push_real(st, cosf(r1/RADIAN)); + break; + + case PS_OP_CVI: + ps_push_int(st, ps_pop_int(st)); + break; + + case PS_OP_CVR: + ps_push_real(st, ps_pop_real(st)); + break; + + case PS_OP_DIV: + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_real(st, r1 / r2); + break; + + case PS_OP_DUP: + ps_copy(st, 1); + break; + + case PS_OP_EQ: + if (ps_is_type2(st, PS_BOOL)) { + b2 = ps_pop_bool(st); + b1 = ps_pop_bool(st); + ps_push_bool(st, b1 == b2); + } + else if (ps_is_type2(st, PS_INT)) { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_bool(st, i1 == i2); + } + else { + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_bool(st, r1 == r2); + } + break; + + case PS_OP_EXCH: + ps_roll(st, 2, 1); + break; + + case PS_OP_EXP: + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_real(st, powf(r1, r2)); + break; + + case PS_OP_FALSE: + ps_push_bool(st, 0); + break; + + case PS_OP_FLOOR: + r1 = ps_pop_real(st); + ps_push_real(st, floorf(r1)); + break; + + case PS_OP_GE: + if (ps_is_type2(st, PS_INT)) { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_bool(st, i1 >= i2); + } + else { + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_bool(st, r1 >= r2); + } + break; + + case PS_OP_GT: + if (ps_is_type2(st, PS_INT)) { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_bool(st, i1 > i2); + } + else { + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_bool(st, r1 > r2); + } + break; + + case PS_OP_IDIV: + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_int(st, i1 / i2); + break; + + case PS_OP_INDEX: + ps_index(st, ps_pop_int(st)); + break; + + case PS_OP_LE: + if (ps_is_type2(st, PS_INT)) { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_bool(st, i1 <= i2); + } + else { + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_bool(st, r1 <= r2); + } + break; + + case PS_OP_LN: + r1 = ps_pop_real(st); + ps_push_real(st, logf(r1)); + break; + + case PS_OP_LOG: + r1 = ps_pop_real(st); + ps_push_real(st, log10f(r1)); + break; + + case PS_OP_LT: + if (ps_is_type2(st, PS_INT)) { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_bool(st, i1 < i2); + } + else { + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_bool(st, r1 < r2); + } + break; + + case PS_OP_MOD: + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_int(st, i1 % i2); + break; + + case PS_OP_MUL: + if (ps_is_type2(st, PS_INT)) { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_int(st, i1 * i2); + } + else { + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_real(st, r1 * r2); + } + break; + + case PS_OP_NE: + if (ps_is_type2(st, PS_BOOL)) { + b2 = ps_pop_bool(st); + b1 = ps_pop_bool(st); + ps_push_bool(st, b1 != b2); + } + else if (ps_is_type2(st, PS_INT)) { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_bool(st, i1 != i2); + } + else { + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_bool(st, r1 != r2); + } + break; + + case PS_OP_NEG: + if (ps_is_type(st, PS_INT)) + ps_push_int(st, -ps_pop_int(st)); + else + ps_push_real(st, -ps_pop_real(st)); + break; + + case PS_OP_NOT: + if (ps_is_type(st, PS_BOOL)) + ps_push_bool(st, !ps_pop_bool(st)); + else + ps_push_int(st, ~ps_pop_int(st)); + break; + + case PS_OP_OR: + if (ps_is_type2(st, PS_BOOL)) { + b2 = ps_pop_bool(st); + b1 = ps_pop_bool(st); + ps_push_bool(st, b1 || b2); + } + else { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_int(st, i1 | i2); + } + break; + + case PS_OP_POP: + if (!ps_underflow(st, 1)) + st->sp--; + break; + + case PS_OP_ROLL: + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_roll(st, i1, i2); + break; + + case PS_OP_ROUND: + if (!ps_is_type(st, PS_INT)) { + r1 = ps_pop_real(st); + ps_push_real(st, (r1 >= 0) ? floorf(r1 + 0.5f) : ceilf(r1 - 0.5f)); + } + break; + + case PS_OP_SIN: + r1 = ps_pop_real(st); + ps_push_real(st, sinf(r1/RADIAN)); + break; + + case PS_OP_SQRT: + r1 = ps_pop_real(st); + ps_push_real(st, sqrtf(r1)); + break; + + case PS_OP_SUB: + if (ps_is_type2(st, PS_INT)) { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_int(st, i1 - i2); + } + else { + r2 = ps_pop_real(st); + r1 = ps_pop_real(st); + ps_push_real(st, r1 - r2); + } + break; + + case PS_OP_TRUE: + ps_push_bool(st, 1); + break; + + case PS_OP_TRUNCATE: + if (!ps_is_type(st, PS_INT)) { + r1 = ps_pop_real(st); + ps_push_real(st, (r1 >= 0) ? floorf(r1) : ceilf(r1)); + } + break; + + case PS_OP_XOR: + if (ps_is_type2(st, PS_BOOL)) { + b2 = ps_pop_bool(st); + b1 = ps_pop_bool(st); + ps_push_bool(st, b1 ^ b2); + } + else { + i2 = ps_pop_int(st); + i1 = ps_pop_int(st); + ps_push_int(st, i1 ^ i2); + } + break; + + case PS_OP_IF: + b1 = ps_pop_bool(st); + if (b1) + ps_run(code, st, code[pc + 1].u.block); + pc = code[pc + 2].u.block; + break; + + case PS_OP_IFELSE: + b1 = ps_pop_bool(st); + if (b1) + ps_run(code, st, code[pc + 1].u.block); + else + ps_run(code, st, code[pc + 0].u.block); + pc = code[pc + 2].u.block; + break; + + case PS_OP_RETURN: + return; + + default: + fz_warn("foreign operator in calculator function"); + return; + } + break; + + default: + fz_warn("foreign object in calculator function"); + return; + } + } +} + +static void +resize_code(pdf_function *func, int newsize) +{ + if (newsize >= func->u.p.cap) + { + func->u.p.cap = func->u.p.cap + 64; + func->u.p.code = fz_realloc(func->u.p.code, func->u.p.cap, sizeof(psobj)); + } +} + +static fz_error +parse_code(pdf_function *func, fz_stream *stream, int *codeptr) +{ + fz_error error; + char buf[64]; + int len; + int tok; + int opptr, elseptr, ifptr; + int a, b, mid, cmp; + + memset(buf, 0, sizeof(buf)); + + while (1) + { + error = pdf_lex(&tok, stream, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "calculator function lexical error"); + + switch(tok) + { + case PDF_TOK_EOF: + return fz_throw("truncated calculator function"); + + case PDF_TOK_INT: + resize_code(func, *codeptr); + func->u.p.code[*codeptr].type = PS_INT; + func->u.p.code[*codeptr].u.i = atoi(buf); + ++*codeptr; + break; + + case PDF_TOK_REAL: + resize_code(func, *codeptr); + func->u.p.code[*codeptr].type = PS_REAL; + func->u.p.code[*codeptr].u.f = fz_atof(buf); + ++*codeptr; + break; + + case PDF_TOK_OPEN_BRACE: + opptr = *codeptr; + *codeptr += 4; + + resize_code(func, *codeptr); + + ifptr = *codeptr; + error = parse_code(func, stream, codeptr); + if (error) + return fz_rethrow(error, "error in 'if' branch"); + + error = pdf_lex(&tok, stream, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "calculator function syntax error"); + + if (tok == PDF_TOK_OPEN_BRACE) + { + elseptr = *codeptr; + error = parse_code(func, stream, codeptr); + if (error) + return fz_rethrow(error, "error in 'else' branch"); + + error = pdf_lex(&tok, stream, buf, sizeof buf, &len); + if (error) + return fz_rethrow(error, "calculator function syntax error"); + } + else + { + elseptr = -1; + } + + if (tok == PDF_TOK_KEYWORD) + { + if (!strcmp(buf, "if")) + { + if (elseptr >= 0) + return fz_throw("too many branches for 'if'"); + func->u.p.code[opptr].type = PS_OPERATOR; + func->u.p.code[opptr].u.op = PS_OP_IF; + func->u.p.code[opptr+2].type = PS_BLOCK; + func->u.p.code[opptr+2].u.block = ifptr; + func->u.p.code[opptr+3].type = PS_BLOCK; + func->u.p.code[opptr+3].u.block = *codeptr; + } + else if (!strcmp(buf, "ifelse")) + { + if (elseptr < 0) + return fz_throw("not enough branches for 'ifelse'"); + func->u.p.code[opptr].type = PS_OPERATOR; + func->u.p.code[opptr].u.op = PS_OP_IFELSE; + func->u.p.code[opptr+1].type = PS_BLOCK; + func->u.p.code[opptr+1].u.block = elseptr; + func->u.p.code[opptr+2].type = PS_BLOCK; + func->u.p.code[opptr+2].u.block = ifptr; + func->u.p.code[opptr+3].type = PS_BLOCK; + func->u.p.code[opptr+3].u.block = *codeptr; + } + else + { + return fz_throw("unknown keyword in 'if-else' context: '%s'", buf); + } + } + else + { + return fz_throw("missing keyword in 'if-else' context"); + } + break; + + case PDF_TOK_CLOSE_BRACE: + resize_code(func, *codeptr); + func->u.p.code[*codeptr].type = PS_OPERATOR; + func->u.p.code[*codeptr].u.op = PS_OP_RETURN; + ++*codeptr; + return fz_okay; + + case PDF_TOK_KEYWORD: + cmp = -1; + a = -1; + b = nelem(ps_op_names); + while (b - a > 1) + { + mid = (a + b) / 2; + cmp = strcmp(buf, ps_op_names[mid]); + if (cmp > 0) + a = mid; + else if (cmp < 0) + b = mid; + else + a = b = mid; + } + if (cmp != 0) + return fz_throw("unknown operator: '%s'", buf); + + resize_code(func, *codeptr); + func->u.p.code[*codeptr].type = PS_OPERATOR; + func->u.p.code[*codeptr].u.op = a; + ++*codeptr; + break; + + default: + return fz_throw("calculator function syntax error"); + } + } +} + +static fz_error +load_postscript_func(pdf_function *func, pdf_xref *xref, fz_obj *dict, int num, int gen) +{ + fz_error error; + fz_stream *stream; + int codeptr; + char buf[64]; + int tok; + int len; + + error = pdf_open_stream(&stream, xref, num, gen); + if (error) + return fz_rethrow(error, "cannot open calculator function stream"); + + error = pdf_lex(&tok, stream, buf, sizeof buf, &len); + if (error) + { + fz_close(stream); + return fz_rethrow(error, "stream is not a calculator function"); + } + + if (tok != PDF_TOK_OPEN_BRACE) + { + fz_close(stream); + return fz_throw("stream is not a calculator function"); + } + + func->u.p.code = NULL; + func->u.p.cap = 0; + + codeptr = 0; + error = parse_code(func, stream, &codeptr); + if (error) + { + fz_close(stream); + return fz_rethrow(error, "cannot parse calculator function (%d %d R)", num, gen); + } + + fz_close(stream); + return fz_okay; +} + +static void +eval_postscript_func(pdf_function *func, float *in, float *out) +{ + ps_stack st; + float x; + int i; + + ps_init_stack(&st); + + for (i = 0; i < func->m; i++) + { + x = CLAMP(in[i], func->domain[i][0], func->domain[i][1]); + ps_push_real(&st, x); + } + + ps_run(func->u.p.code, &st, 0); + + for (i = func->n - 1; i >= 0; i--) + { + x = ps_pop_real(&st); + out[i] = CLAMP(x, func->range[i][0], func->range[i][1]); + } +} + +/* + * Sample function + */ + +static fz_error +load_sample_func(pdf_function *func, pdf_xref *xref, fz_obj *dict, int num, int gen) +{ + fz_error error; + fz_stream *stream; + fz_obj *obj; + int samplecount; + int bps; + int i; + + func->u.sa.samples = NULL; + + obj = fz_dict_gets(dict, "Size"); + if (!fz_is_array(obj) || fz_array_len(obj) != func->m) + return fz_throw("malformed /Size"); + for (i = 0; i < func->m; i++) + func->u.sa.size[i] = fz_to_int(fz_array_get(obj, i)); + + obj = fz_dict_gets(dict, "BitsPerSample"); + if (!fz_is_int(obj)) + return fz_throw("malformed /BitsPerSample"); + func->u.sa.bps = bps = fz_to_int(obj); + + obj = fz_dict_gets(dict, "Encode"); + if (fz_is_array(obj)) + { + if (fz_array_len(obj) != func->m * 2) + return fz_throw("malformed /Encode"); + for (i = 0; i < func->m; i++) + { + func->u.sa.encode[i][0] = fz_to_real(fz_array_get(obj, i*2+0)); + func->u.sa.encode[i][1] = fz_to_real(fz_array_get(obj, i*2+1)); + } + } + else + { + for (i = 0; i < func->m; i++) + { + func->u.sa.encode[i][0] = 0; + func->u.sa.encode[i][1] = func->u.sa.size[i] - 1; + } + } + + obj = fz_dict_gets(dict, "Decode"); + if (fz_is_array(obj)) + { + if (fz_array_len(obj) != func->n * 2) + return fz_throw("malformed /Decode"); + for (i = 0; i < func->n; i++) + { + func->u.sa.decode[i][0] = fz_to_real(fz_array_get(obj, i*2+0)); + func->u.sa.decode[i][1] = fz_to_real(fz_array_get(obj, i*2+1)); + } + } + else + { + for (i = 0; i < func->n; i++) + { + func->u.sa.decode[i][0] = func->range[i][0]; + func->u.sa.decode[i][1] = func->range[i][1]; + } + } + + for (i = 0, samplecount = func->n; i < func->m; i++) + samplecount *= func->u.sa.size[i]; + + func->u.sa.samples = fz_calloc(samplecount, sizeof(float)); + + error = pdf_open_stream(&stream, xref, num, gen); + if (error) + return fz_rethrow(error, "cannot open samples stream (%d %d R)", num, gen); + + /* read samples */ + for (i = 0; i < samplecount; i++) + { + unsigned int x; + float s; + + if (fz_is_eof_bits(stream)) + { + fz_close(stream); + return fz_throw("truncated sample stream"); + } + + switch (bps) + { + case 1: s = fz_read_bits(stream, 1); break; + case 2: s = fz_read_bits(stream, 2) / 3.0f; break; + case 4: s = fz_read_bits(stream, 4) / 15.0f; break; + case 8: s = fz_read_byte(stream) / 255.0f; break; + case 12: s = fz_read_bits(stream, 12) / 4095.0f; break; + case 16: + x = fz_read_byte(stream) << 8; + x |= fz_read_byte(stream); + s = x / 65535.0f; + break; + case 24: + x = fz_read_byte(stream) << 16; + x |= fz_read_byte(stream) << 8; + x |= fz_read_byte(stream); + s = x / 16777215.0f; + break; + case 32: + x = fz_read_byte(stream) << 24; + x |= fz_read_byte(stream) << 16; + x |= fz_read_byte(stream) << 8; + x |= fz_read_byte(stream); + s = x / 4294967295.0f; + break; + default: + fz_close(stream); + return fz_throw("sample stream bit depth %d unsupported", bps); + } + + func->u.sa.samples[i] = s; + } + + fz_close(stream); + + return fz_okay; +} + +static float +interpolate_sample(pdf_function *func, int *scale, int *e0, int *e1, float *efrac, int dim, int idx) +{ + float a, b; + int idx0, idx1; + + idx0 = e0[dim] * scale[dim] + idx; + idx1 = e1[dim] * scale[dim] + idx; + + if (dim == 0) + { + a = func->u.sa.samples[idx0]; + b = func->u.sa.samples[idx1]; + } + else + { + a = interpolate_sample(func, scale, e0, e1, efrac, dim - 1, idx0); + b = interpolate_sample(func, scale, e0, e1, efrac, dim - 1, idx1); + } + + return a + (b - a) * efrac[dim]; +} + +static void +eval_sample_func(pdf_function *func, float *in, float *out) +{ + int e0[MAXM], e1[MAXM], scale[MAXM]; + float efrac[MAXM]; + float x; + int i; + + /* encode input coordinates */ + for (i = 0; i < func->m; i++) + { + x = CLAMP(in[i], func->domain[i][0], func->domain[i][1]); + x = lerp(x, func->domain[i][0], func->domain[i][1], + func->u.sa.encode[i][0], func->u.sa.encode[i][1]); + x = CLAMP(x, 0, func->u.sa.size[i] - 1); + e0[i] = floorf(x); + e1[i] = ceilf(x); + efrac[i] = x - floorf(x); + } + + scale[0] = func->n; + for (i = 1; i < func->m; i++) + scale[i] = scale[i - 1] * func->u.sa.size[i]; + + for (i = 0; i < func->n; i++) + { + if (func->m == 1) + { + float a = func->u.sa.samples[e0[0] * func->n + i]; + float b = func->u.sa.samples[e1[0] * func->n + i]; + + float ab = a + (b - a) * efrac[0]; + + out[i] = lerp(ab, 0, 1, func->u.sa.decode[i][0], func->u.sa.decode[i][1]); + out[i] = CLAMP(out[i], func->range[i][0], func->range[i][1]); + } + + else if (func->m == 2) + { + int s0 = func->n; + int s1 = s0 * func->u.sa.size[0]; + + float a = func->u.sa.samples[e0[0] * s0 + e0[1] * s1 + i]; + float b = func->u.sa.samples[e1[0] * s0 + e0[1] * s1 + i]; + float c = func->u.sa.samples[e0[0] * s0 + e1[1] * s1 + i]; + float d = func->u.sa.samples[e1[0] * s0 + e1[1] * s1 + i]; + + float ab = a + (b - a) * efrac[0]; + float cd = c + (d - c) * efrac[0]; + float abcd = ab + (cd - ab) * efrac[1]; + + out[i] = lerp(abcd, 0, 1, func->u.sa.decode[i][0], func->u.sa.decode[i][1]); + out[i] = CLAMP(out[i], func->range[i][0], func->range[i][1]); + } + + else + { + float x = interpolate_sample(func, scale, e0, e1, efrac, func->m - 1, i); + out[i] = lerp(x, 0, 1, func->u.sa.decode[i][0], func->u.sa.decode[i][1]); + out[i] = CLAMP(out[i], func->range[i][0], func->range[i][1]); + } + } +} + +/* + * Exponential function + */ + +static fz_error +load_exponential_func(pdf_function *func, fz_obj *dict) +{ + fz_obj *obj; + int i; + + if (func->m != 1) + return fz_throw("/Domain must be one dimension (%d)", func->m); + + obj = fz_dict_gets(dict, "N"); + if (!fz_is_int(obj) && !fz_is_real(obj)) + return fz_throw("malformed /N"); + func->u.e.n = fz_to_real(obj); + + obj = fz_dict_gets(dict, "C0"); + if (fz_is_array(obj)) + { + func->n = fz_array_len(obj); + if (func->n >= MAXN) + return fz_throw("exponential function result array out of range"); + for (i = 0; i < func->n; i++) + func->u.e.c0[i] = fz_to_real(fz_array_get(obj, i)); + } + else + { + func->n = 1; + func->u.e.c0[0] = 0; + } + + obj = fz_dict_gets(dict, "C1"); + if (fz_is_array(obj)) + { + if (fz_array_len(obj) != func->n) + return fz_throw("/C1 must match /C0 length"); + for (i = 0; i < func->n; i++) + func->u.e.c1[i] = fz_to_real(fz_array_get(obj, i)); + } + else + { + if (func->n != 1) + return fz_throw("/C1 must match /C0 length"); + func->u.e.c1[0] = 1; + } + + return fz_okay; +} + +static void +eval_exponential_func(pdf_function *func, float in, float *out) +{ + float x = in; + float tmp; + int i; + + x = CLAMP(x, func->domain[0][0], func->domain[0][1]); + + /* constraint */ + if ((func->u.e.n != (int)func->u.e.n && x < 0) || (func->u.e.n < 0 && x == 0)) + { + fz_warn("constraint error"); + return; + } + + tmp = powf(x, func->u.e.n); + for (i = 0; i < func->n; i++) + { + out[i] = func->u.e.c0[i] + tmp * (func->u.e.c1[i] - func->u.e.c0[i]); + if (func->has_range) + out[i] = CLAMP(out[i], func->range[i][0], func->range[i][1]); + } +} + +/* + * Stitching function + */ + +static fz_error +load_stitching_func(pdf_function *func, pdf_xref *xref, fz_obj *dict) +{ + pdf_function **funcs; + fz_error error; + fz_obj *obj; + fz_obj *sub; + fz_obj *num; + int k; + int i; + + func->u.st.k = 0; + + if (func->m != 1) + return fz_throw("/Domain must be one dimension (%d)", func->m); + + obj = fz_dict_gets(dict, "Functions"); + if (!fz_is_array(obj)) + return fz_throw("stitching function has no input functions"); + { + k = fz_array_len(obj); + + func->u.st.funcs = fz_calloc(k, sizeof(pdf_function*)); + func->u.st.bounds = fz_calloc(k - 1, sizeof(float)); + func->u.st.encode = fz_calloc(k * 2, sizeof(float)); + funcs = func->u.st.funcs; + + for (i = 0; i < k; i++) + { + sub = fz_array_get(obj, i); + error = pdf_load_function(&funcs[i], xref, sub); + if (error) + return fz_rethrow(error, "cannot load sub function %d (%d %d R)", i, fz_to_num(sub), fz_to_gen(sub)); + if (funcs[i]->m != 1 || funcs[i]->n != funcs[0]->n) + return fz_throw("sub function %d /Domain or /Range mismatch", i); + func->u.st.k ++; + } + + if (!func->n) + func->n = funcs[0]->n; + else if (func->n != funcs[0]->n) + return fz_throw("sub function /Domain or /Range mismatch"); + } + + obj = fz_dict_gets(dict, "Bounds"); + if (!fz_is_array(obj)) + return fz_throw("stitching function has no bounds"); + { + if (!fz_is_array(obj) || fz_array_len(obj) != k - 1) + return fz_throw("malformed /Bounds (not array or wrong length)"); + + for (i = 0; i < k-1; i++) + { + num = fz_array_get(obj, i); + if (!fz_is_int(num) && !fz_is_real(num)) + return fz_throw("malformed /Bounds (item not real)"); + func->u.st.bounds[i] = fz_to_real(num); + if (i && func->u.st.bounds[i-1] > func->u.st.bounds[i]) + return fz_throw("malformed /Bounds (item not monotonic)"); + } + + if (k != 1 && (func->domain[0][0] > func->u.st.bounds[0] || + func->domain[0][1] < func->u.st.bounds[k-2])) + fz_warn("malformed shading function bounds (domain mismatch), proceeding anyway."); + } + + obj = fz_dict_gets(dict, "Encode"); + if (!fz_is_array(obj)) + return fz_throw("stitching function is missing encoding"); + { + if (!fz_is_array(obj) || fz_array_len(obj) != k * 2) + return fz_throw("malformed /Encode"); + for (i = 0; i < k; i++) + { + func->u.st.encode[i*2+0] = fz_to_real(fz_array_get(obj, i*2+0)); + func->u.st.encode[i*2+1] = fz_to_real(fz_array_get(obj, i*2+1)); + } + } + + return fz_okay; +} + +static void +eval_stitching_func(pdf_function *func, float in, float *out) +{ + float low, high; + int k = func->u.st.k; + float *bounds = func->u.st.bounds; + int i; + + in = CLAMP(in, func->domain[0][0], func->domain[0][1]); + + for (i = 0; i < k - 1; i++) + { + if (in < bounds[i]) + break; + } + + if (i == 0 && k == 1) + { + low = func->domain[0][0]; + high = func->domain[0][1]; + } + else if (i == 0) + { + low = func->domain[0][0]; + high = bounds[0]; + } + else if (i == k - 1) + { + low = bounds[k-2]; + high = func->domain[0][1]; + } + else + { + low = bounds[i-1]; + high = bounds[i]; + } + + in = lerp(in, low, high, func->u.st.encode[i*2+0], func->u.st.encode[i*2+1]); + + pdf_eval_function(func->u.st.funcs[i], &in, 1, out, func->n); +} + +/* + * Common + */ + +pdf_function * +pdf_keep_function(pdf_function *func) +{ + func->refs ++; + return func; +} + +void +pdf_drop_function(pdf_function *func) +{ + int i; + if (--func->refs == 0) + { + switch(func->type) + { + case SAMPLE: + fz_free(func->u.sa.samples); + break; + case EXPONENTIAL: + break; + case STITCHING: + for (i = 0; i < func->u.st.k; i++) + pdf_drop_function(func->u.st.funcs[i]); + fz_free(func->u.st.funcs); + fz_free(func->u.st.bounds); + fz_free(func->u.st.encode); + break; + case POSTSCRIPT: + fz_free(func->u.p.code); + break; + } + fz_free(func); + } +} + +fz_error +pdf_load_function(pdf_function **funcp, pdf_xref *xref, fz_obj *dict) +{ + fz_error error; + pdf_function *func; + fz_obj *obj; + int i; + + if ((*funcp = pdf_find_item(xref->store, pdf_drop_function, dict))) + { + pdf_keep_function(*funcp); + return fz_okay; + } + + func = fz_malloc(sizeof(pdf_function)); + memset(func, 0, sizeof(pdf_function)); + func->refs = 1; + + obj = fz_dict_gets(dict, "FunctionType"); + func->type = fz_to_int(obj); + + /* required for all */ + obj = fz_dict_gets(dict, "Domain"); + func->m = fz_array_len(obj) / 2; + for (i = 0; i < func->m; i++) + { + func->domain[i][0] = fz_to_real(fz_array_get(obj, i * 2 + 0)); + func->domain[i][1] = fz_to_real(fz_array_get(obj, i * 2 + 1)); + } + + /* required for type0 and type4, optional otherwise */ + obj = fz_dict_gets(dict, "Range"); + if (fz_is_array(obj)) + { + func->has_range = 1; + func->n = fz_array_len(obj) / 2; + for (i = 0; i < func->n; i++) + { + func->range[i][0] = fz_to_real(fz_array_get(obj, i * 2 + 0)); + func->range[i][1] = fz_to_real(fz_array_get(obj, i * 2 + 1)); + } + } + else + { + func->has_range = 0; + func->n = 0; + } + + if (func->m >= MAXM || func->n >= MAXN) + { + fz_free(func); + return fz_throw("assert: /Domain or /Range too big"); + } + + switch(func->type) + { + case SAMPLE: + error = load_sample_func(func, xref, dict, fz_to_num(dict), fz_to_gen(dict)); + if (error) + { + pdf_drop_function(func); + return fz_rethrow(error, "cannot load sampled function (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + } + break; + + case EXPONENTIAL: + error = load_exponential_func(func, dict); + if (error) + { + pdf_drop_function(func); + return fz_rethrow(error, "cannot load exponential function (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + } + break; + + case STITCHING: + error = load_stitching_func(func, xref, dict); + if (error) + { + pdf_drop_function(func); + return fz_rethrow(error, "cannot load stitching function (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + } + break; + + case POSTSCRIPT: + error = load_postscript_func(func, xref, dict, fz_to_num(dict), fz_to_gen(dict)); + if (error) + { + pdf_drop_function(func); + return fz_rethrow(error, "cannot load calculator function (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + } + break; + + default: + fz_free(func); + return fz_throw("unknown function type (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + } + + pdf_store_item(xref->store, pdf_keep_function, pdf_drop_function, dict, func); + + *funcp = func; + return fz_okay; +} + +void +pdf_eval_function(pdf_function *func, float *in, int inlen, float *out, int outlen) +{ + memset(out, 0, sizeof(float) * outlen); + + if (inlen != func->m) + { + fz_warn("tried to evaluate function with wrong number of inputs"); + return; + } + if (func->n != outlen) + { + fz_warn("tried to evaluate function with wrong number of outputs"); + return; + } + + switch(func->type) + { + case SAMPLE: eval_sample_func(func, in, out); break; + case EXPONENTIAL: eval_exponential_func(func, *in, out); break; + case STITCHING: eval_stitching_func(func, *in, out); break; + case POSTSCRIPT: eval_postscript_func(func, in, out); break; + } +} + +/* + * Debugging prints + */ + +static void +pdf_debug_indent(char *prefix, int level, char *suffix) +{ + int i; + + printf("%s", prefix); + + for (i = 0; i < level; i++) + printf("\t"); + + printf("%s", suffix); +} + +static void +pdf_debug_ps_func_code(psobj *funccode, psobj *code, int level) +{ + int eof, wasop; + + pdf_debug_indent("", level, "{"); + + /* Print empty blocks as { }, instead of separating braces on different lines. */ + if (code->type == PS_OPERATOR && code->u.op == PS_OP_RETURN) + { + printf(" } "); + return; + } + + pdf_debug_indent("\n", ++level, ""); + + eof = 0; + wasop = 0; + while (!eof) + { + switch (code->type) + { + case PS_INT: + if (wasop) + pdf_debug_indent("\n", level, ""); + + printf("%d ", code->u.i); + wasop = 0; + code++; + break; + + case PS_REAL: + if (wasop) + pdf_debug_indent("\n", level, ""); + + printf("%g ", code->u.f); + wasop = 0; + code++; + break; + + case PS_OPERATOR: + if (code->u.op == PS_OP_RETURN) + { + printf("\n"); + eof = 1; + } + else if (code->u.op == PS_OP_IF) + { + printf("\n"); + pdf_debug_ps_func_code(funccode, &funccode[(code + 2)->u.block], level); + + printf("%s", ps_op_names[code->u.op]); + code = &funccode[(code + 3)->u.block]; + if (code->type != PS_OPERATOR || code->u.op != PS_OP_RETURN) + pdf_debug_indent("\n", level, ""); + + wasop = 0; + } + else if (code->u.op == PS_OP_IFELSE) + { + printf("\n"); + pdf_debug_ps_func_code(funccode, &funccode[(code + 2)->u.block], level); + + printf("\n"); + pdf_debug_ps_func_code(funccode, &funccode[(code + 1)->u.block], level); + + printf("%s", ps_op_names[code->u.op]); + code = &funccode[(code + 3)->u.block]; + if (code->type != PS_OPERATOR || code->u.op != PS_OP_RETURN) + pdf_debug_indent("\n", level, ""); + + wasop = 0; + } + else + { + printf("%s ", ps_op_names[code->u.op]); + code++; + wasop = 1; + } + break; + } + } + + pdf_debug_indent("", --level, "} "); +} + +static void +pdf_debug_function_imp(pdf_function *func, int level) +{ + int i; + + pdf_debug_indent("", level, "function {\n"); + + pdf_debug_indent("", ++level, ""); + switch (func->type) + { + case SAMPLE: + printf("sampled"); + break; + case EXPONENTIAL: + printf("exponential"); + break; + case STITCHING: + printf("stitching"); + break; + case POSTSCRIPT: + printf("postscript"); + break; + } + + pdf_debug_indent("\n", level, ""); + printf("%d input -> %d output\n", func->m, func->n); + + pdf_debug_indent("", level, "domain "); + for (i = 0; i < func->m; i++) + printf("%g %g ", func->domain[i][0], func->domain[i][1]); + printf("\n"); + + if (func->has_range) + { + pdf_debug_indent("", level, "range "); + for (i = 0; i < func->n; i++) + printf("%g %g ", func->range[i][0], func->range[i][1]); + printf("\n"); + } + + switch (func->type) + { + case SAMPLE: + pdf_debug_indent("", level, ""); + printf("bps: %d\n", func->u.sa.bps); + + pdf_debug_indent("", level, ""); + printf("size: [ "); + for (i = 0; i < func->m; i++) + printf("%d ", func->u.sa.size[i]); + printf("]\n"); + + pdf_debug_indent("", level, ""); + printf("encode: [ "); + for (i = 0; i < func->m; i++) + printf("%g %g ", func->u.sa.encode[i][0], func->u.sa.encode[i][1]); + printf("]\n"); + + pdf_debug_indent("", level, ""); + printf("decode: [ "); + for (i = 0; i < func->m; i++) + printf("%g %g ", func->u.sa.decode[i][0], func->u.sa.decode[i][1]); + printf("]\n"); + break; + + case EXPONENTIAL: + pdf_debug_indent("", level, ""); + printf("n: %g\n", func->u.e.n); + + pdf_debug_indent("", level, ""); + printf("c0: [ "); + for (i = 0; i < func->n; i++) + printf("%g ", func->u.e.c0[i]); + printf("]\n"); + + pdf_debug_indent("", level, ""); + printf("c1: [ "); + for (i = 0; i < func->n; i++) + printf("%g ", func->u.e.c1[i]); + printf("]\n"); + break; + + case STITCHING: + pdf_debug_indent("", level, ""); + printf("%d functions\n", func->u.st.k); + + pdf_debug_indent("", level, ""); + printf("bounds: [ "); + for (i = 0; i < func->u.st.k - 1; i++) + printf("%g ", func->u.st.bounds[i]); + printf("]\n"); + + pdf_debug_indent("", level, ""); + printf("encode: [ "); + for (i = 0; i < func->u.st.k * 2; i++) + printf("%g ", func->u.st.encode[i]); + printf("]\n"); + + for (i = 0; i < func->u.st.k; i++) + pdf_debug_function_imp(func->u.st.funcs[i], level); + break; + + case POSTSCRIPT: + pdf_debug_ps_func_code(func->u.p.code, func->u.p.code, level); + printf("\n"); + break; + } + + pdf_debug_indent("", --level, "}\n"); +} + +void +pdf_debug_function(pdf_function *func) +{ + pdf_debug_function_imp(func, 0); +} diff --git a/contrib/media/updf_newlib/pdf/pdf_image.c b/contrib/media/updf_newlib/pdf/pdf_image.c new file mode 100755 index 000000000..e19011005 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_image.c @@ -0,0 +1,354 @@ +#include "fitz.h" +#include "mupdf.h" + +/* TODO: store JPEG compressed samples */ +/* TODO: store flate compressed samples */ + +static fz_error pdf_load_jpx_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *dict); + +static void +pdf_mask_color_key(fz_pixmap *pix, int n, int *colorkey) +{ + unsigned char *p = pix->samples; + int len = pix->w * pix->h; + int k, t; + while (len--) + { + t = 1; + for (k = 0; k < n; k++) + if (p[k] < colorkey[k * 2] || p[k] > colorkey[k * 2 + 1]) + t = 0; + if (t) + for (k = 0; k < pix->n; k++) + p[k] = 0; + p += pix->n; + } +} + +static fz_error +pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, fz_stream *cstm, int forcemask) +{ + fz_stream *stm; + fz_pixmap *tile; + fz_obj *obj, *res; + fz_error error; + + int w, h, bpc, n; + int imagemask; + int interpolate; + int indexed; + fz_colorspace *colorspace; + fz_pixmap *mask; /* explicit mask/softmask image */ + int usecolorkey; + int colorkey[FZ_MAX_COLORS * 2]; + float decode[FZ_MAX_COLORS * 2]; + + int stride; + unsigned char *samples; + int i, len; + + /* special case for JPEG2000 images */ + if (pdf_is_jpx_image(dict)) + { + tile = NULL; + error = pdf_load_jpx_image(&tile, xref, dict); + if (error) + return fz_rethrow(error, "cannot load jpx image"); + if (forcemask) + { + if (tile->n != 2) + { + fz_drop_pixmap(tile); + return fz_throw("softmask must be grayscale"); + } + mask = fz_alpha_from_gray(tile, 1); + fz_drop_pixmap(tile); + *imgp = mask; + return fz_okay; + } + *imgp = tile; + return fz_okay; + } + + w = fz_to_int(fz_dict_getsa(dict, "Width", "W")); + h = fz_to_int(fz_dict_getsa(dict, "Height", "H")); + bpc = fz_to_int(fz_dict_getsa(dict, "BitsPerComponent", "BPC")); + imagemask = fz_to_bool(fz_dict_getsa(dict, "ImageMask", "IM")); + interpolate = fz_to_bool(fz_dict_getsa(dict, "Interpolate", "I")); + + indexed = 0; + usecolorkey = 0; + colorspace = NULL; + mask = NULL; + + if (imagemask) + bpc = 1; + + if (w == 0) + return fz_throw("image width is zero"); + if (h == 0) + return fz_throw("image height is zero"); + if (bpc == 0) + return fz_throw("image depth is zero"); + if (bpc > 16) + return fz_throw("image depth is too large: %d", bpc); + if (w > (1 << 16)) + return fz_throw("image is too wide"); + if (h > (1 << 16)) + return fz_throw("image is too high"); + + obj = fz_dict_getsa(dict, "ColorSpace", "CS"); + if (obj && !imagemask && !forcemask) + { + /* colorspace resource lookup is only done for inline images */ + if (fz_is_name(obj)) + { + res = fz_dict_get(fz_dict_gets(rdb, "ColorSpace"), obj); + if (res) + obj = res; + } + + error = pdf_load_colorspace(&colorspace, xref, obj); + if (error) + return fz_rethrow(error, "cannot load image colorspace"); + + if (!strcmp(colorspace->name, "Indexed")) + indexed = 1; + + n = colorspace->n; + } + else + { + n = 1; + } + + obj = fz_dict_getsa(dict, "Decode", "D"); + if (obj) + { + for (i = 0; i < n * 2; i++) + decode[i] = fz_to_real(fz_array_get(obj, i)); + } + else + { + float maxval = indexed ? (1 << bpc) - 1 : 1; + for (i = 0; i < n * 2; i++) + decode[i] = i & 1 ? maxval : 0; + } + + obj = fz_dict_getsa(dict, "SMask", "Mask"); + if (fz_is_dict(obj)) + { + /* Not allowed for inline images */ + if (!cstm) + { + error = pdf_load_image_imp(&mask, xref, rdb, obj, NULL, 1); + if (error) + { + if (colorspace) + fz_drop_colorspace(colorspace); + return fz_rethrow(error, "cannot load image mask/softmask"); + } + } + } + else if (fz_is_array(obj)) + { + usecolorkey = 1; + for (i = 0; i < n * 2; i++) + colorkey[i] = fz_to_int(fz_array_get(obj, i)); + } + + /* Allocate now, to fail early if we run out of memory */ + tile = fz_new_pixmap_with_limit(colorspace, w, h); + if (!tile) + { + if (colorspace) + fz_drop_colorspace(colorspace); + if (mask) + fz_drop_pixmap(mask); + return fz_throw("out of memory"); + } + + if (colorspace) + fz_drop_colorspace(colorspace); + + tile->mask = mask; + tile->interpolate = interpolate; + + stride = (w * n * bpc + 7) / 8; + + if (cstm) + { + stm = pdf_open_inline_stream(cstm, xref, dict, stride * h); + } + else + { + error = pdf_open_stream(&stm, xref, fz_to_num(dict), fz_to_gen(dict)); + if (error) + { + fz_drop_pixmap(tile); + return fz_rethrow(error, "cannot open image data stream (%d 0 R)", fz_to_num(dict)); + } + } + + samples = fz_calloc(h, stride); + + len = fz_read(stm, samples, h * stride); + if (len < 0) + { + fz_close(stm); + fz_free(samples); + fz_drop_pixmap(tile); + return fz_rethrow(len, "cannot read image data"); + } + + /* Make sure we read the EOF marker (for inline images only) */ + if (cstm) + { + unsigned char tbuf[512]; + int tlen = fz_read(stm, tbuf, sizeof tbuf); + if (tlen < 0) + fz_catch(tlen, "ignoring error at end of image"); + if (tlen > 0) + fz_warn("ignoring garbage at end of image"); + } + + fz_close(stm); + + /* Pad truncated images */ + if (len < stride * h) + { + fz_warn("padding truncated image (%d 0 R)", fz_to_num(dict)); + memset(samples + len, 0, stride * h - len); + } + + /* Invert 1-bit image masks */ + if (imagemask) + { + /* 0=opaque and 1=transparent so we need to invert */ + unsigned char *p = samples; + len = h * stride; + for (i = 0; i < len; i++) + p[i] = ~p[i]; + } + + fz_unpack_tile(tile, samples, n, bpc, stride, indexed); + + fz_free(samples); + + if (usecolorkey) + pdf_mask_color_key(tile, n, colorkey); + + if (indexed) + { + fz_pixmap *conv; + fz_decode_indexed_tile(tile, decode, (1 << bpc) - 1); + conv = pdf_expand_indexed_pixmap(tile); + fz_drop_pixmap(tile); + tile = conv; + } + else + { + fz_decode_tile(tile, decode); + } + + *imgp = tile; + return fz_okay; +} + +fz_error +pdf_load_inline_image(fz_pixmap **pixp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, fz_stream *file) +{ + fz_error error; + + error = pdf_load_image_imp(pixp, xref, rdb, dict, file, 0); + if (error) + return fz_rethrow(error, "cannot load inline image"); + + return fz_okay; +} + +int +pdf_is_jpx_image(fz_obj *dict) +{ + fz_obj *filter; + int i; + + filter = fz_dict_gets(dict, "Filter"); + if (!strcmp(fz_to_name(filter), "JPXDecode")) + return 1; + for (i = 0; i < fz_array_len(filter); i++) + if (!strcmp(fz_to_name(fz_array_get(filter, i)), "JPXDecode")) + return 1; + return 0; +} + +static fz_error +pdf_load_jpx_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *dict) +{ + fz_error error; + fz_buffer *buf; + fz_colorspace *colorspace; + fz_pixmap *img; + fz_obj *obj; + + colorspace = NULL; + + error = pdf_load_stream(&buf, xref, fz_to_num(dict), fz_to_gen(dict)); + if (error) + return fz_rethrow(error, "cannot load jpx image data"); + + obj = fz_dict_gets(dict, "ColorSpace"); + if (obj) + { + error = pdf_load_colorspace(&colorspace, xref, obj); + if (error) + fz_catch(error, "cannot load image colorspace"); + } + + error = fz_load_jpx_image(&img, buf->data, buf->len, colorspace); + if (error) + { + if (colorspace) + fz_drop_colorspace(colorspace); + fz_drop_buffer(buf); + return fz_rethrow(error, "cannot load jpx image"); + } + + if (colorspace) + fz_drop_colorspace(colorspace); + fz_drop_buffer(buf); + + obj = fz_dict_getsa(dict, "SMask", "Mask"); + if (fz_is_dict(obj)) + { + error = pdf_load_image_imp(&img->mask, xref, NULL, obj, NULL, 1); + if (error) + { + fz_drop_pixmap(img); + return fz_rethrow(error, "cannot load image mask/softmask"); + } + } + + *imgp = img; + return fz_okay; +} + +fz_error +pdf_load_image(fz_pixmap **pixp, pdf_xref *xref, fz_obj *dict) +{ + fz_error error; + + if ((*pixp = pdf_find_item(xref->store, fz_drop_pixmap, dict))) + { + fz_keep_pixmap(*pixp); + return fz_okay; + } + + error = pdf_load_image_imp(pixp, xref, NULL, dict, NULL, 0); + if (error) + return fz_rethrow(error, "cannot load image (%d 0 R)", fz_to_num(dict)); + + pdf_store_item(xref->store, fz_keep_pixmap, fz_drop_pixmap, dict, *pixp); + + return fz_okay; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_interpret.c b/contrib/media/updf_newlib/pdf/pdf_interpret.c new file mode 100755 index 000000000..1682f79a8 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_interpret.c @@ -0,0 +1,2304 @@ +#include "fitz.h" +#include "mupdf.h" + +#define TILE + +typedef struct pdf_material_s pdf_material; +typedef struct pdf_gstate_s pdf_gstate; +typedef struct pdf_csi_s pdf_csi; + +enum +{ + PDF_FILL, + PDF_STROKE, +}; + +enum +{ + PDF_MAT_NONE, + PDF_MAT_COLOR, + PDF_MAT_PATTERN, + PDF_MAT_SHADE, +}; + +struct pdf_material_s +{ + int kind; + fz_colorspace *colorspace; + pdf_pattern *pattern; + fz_shade *shade; + float alpha; + float v[32]; +}; + +struct pdf_gstate_s +{ + fz_matrix ctm; + int clip_depth; + + /* path stroking */ + fz_stroke_state stroke_state; + + /* materials */ + pdf_material stroke; + pdf_material fill; + + /* text state */ + float char_space; + float word_space; + float scale; + float leading; + pdf_font_desc *font; + float size; + int render; + float rise; + + /* transparency */ + int blendmode; + pdf_xobject *softmask; + fz_matrix softmask_ctm; + float softmask_bc[FZ_MAX_COLORS]; + int luminosity; +}; + +struct pdf_csi_s +{ + fz_device *dev; + pdf_xref *xref; + + /* usage mode for optional content groups */ + char *target; /* "View", "Print", "Export" */ + + /* interpreter stack */ + fz_obj *obj; + char name[256]; + unsigned char string[256]; + int string_len; + float stack[32]; + int top; + + int xbalance; + int in_text; + + /* path object state */ + fz_path *path; + + /* text object state */ + fz_text *text; + fz_matrix tlm; + fz_matrix tm; + int text_mode; + int accumulate; + + /* graphics state */ + fz_matrix top_ctm; + pdf_gstate gstate[64]; + int gtop; +}; + +static fz_error pdf_run_buffer(pdf_csi *csi, fz_obj *rdb, fz_buffer *contents); +static fz_error pdf_run_xobject(pdf_csi *csi, fz_obj *resources, pdf_xobject *xobj, fz_matrix transform); +static void pdf_show_pattern(pdf_csi *csi, pdf_pattern *pat, fz_rect area, int what); + + +static int +pdf_is_hidden_ocg(fz_obj *xobj, char *target) +{ + char target_state[16]; + fz_obj *obj; + + fz_strlcpy(target_state, target, sizeof target_state); + fz_strlcat(target_state, "State", sizeof target_state); + + obj = fz_dict_gets(xobj, "OC"); + obj = fz_dict_gets(obj, "OCGs"); + if (fz_is_array(obj)) + obj = fz_array_get(obj, 0); + obj = fz_dict_gets(obj, "Usage"); + obj = fz_dict_gets(obj, target); + obj = fz_dict_gets(obj, target_state); + return !strcmp(fz_to_name(obj), "OFF"); +} + +/* + * Emit graphics calls to device. + */ + +static void +pdf_begin_group(pdf_csi *csi, fz_rect bbox) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_error error; + + if (gstate->softmask) + { + pdf_xobject *softmask = gstate->softmask; + fz_rect bbox = fz_transform_rect(gstate->softmask_ctm, softmask->bbox); + fz_matrix save_ctm = gstate->ctm; + + gstate->softmask = NULL; + gstate->ctm = gstate->softmask_ctm; + + fz_begin_mask(csi->dev, bbox, gstate->luminosity, + softmask->colorspace, gstate->softmask_bc); + error = pdf_run_xobject(csi, NULL, softmask, fz_identity); + if (error) + fz_catch(error, "cannot run softmask"); + fz_end_mask(csi->dev); + + gstate->softmask = softmask; + gstate->ctm = save_ctm; + } + + if (gstate->blendmode) + fz_begin_group(csi->dev, bbox, 1, 0, gstate->blendmode, 1); +} + +static void +pdf_end_group(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + + if (gstate->blendmode) + fz_end_group(csi->dev); + + if (gstate->softmask) + fz_pop_clip(csi->dev); +} + +static void +pdf_show_shade(pdf_csi *csi, fz_shade *shd) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_rect bbox; + + bbox = fz_bound_shade(shd, gstate->ctm); + + pdf_begin_group(csi, bbox); + + fz_fill_shade(csi->dev, shd, gstate->ctm, gstate->fill.alpha); + + pdf_end_group(csi); +} + +static void +pdf_show_image(pdf_csi *csi, fz_pixmap *image) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_rect bbox; + + bbox = fz_transform_rect(gstate->ctm, fz_unit_rect); + + if (image->mask) + { + /* apply blend group even though we skip the softmask */ + if (gstate->blendmode) + fz_begin_group(csi->dev, bbox, 0, 0, gstate->blendmode, 1); + fz_clip_image_mask(csi->dev, image->mask, &bbox, gstate->ctm); + } + else + pdf_begin_group(csi, bbox); + + if (!image->colorspace) + { + + switch (gstate->fill.kind) + { + case PDF_MAT_NONE: + break; + case PDF_MAT_COLOR: + fz_fill_image_mask(csi->dev, image, gstate->ctm, + gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha); + break; + case PDF_MAT_PATTERN: + if (gstate->fill.pattern) + { + fz_clip_image_mask(csi->dev, image, &bbox, gstate->ctm); + pdf_show_pattern(csi, gstate->fill.pattern, bbox, PDF_FILL); + fz_pop_clip(csi->dev); + } + break; + case PDF_MAT_SHADE: + if (gstate->fill.shade) + { + fz_clip_image_mask(csi->dev, image, &bbox, gstate->ctm); + fz_fill_shade(csi->dev, gstate->fill.shade, gstate->ctm, gstate->fill.alpha); + fz_pop_clip(csi->dev); + } + break; + } + } + else + { + fz_fill_image(csi->dev, image, gstate->ctm, gstate->fill.alpha); + } + + if (image->mask) + { + fz_pop_clip(csi->dev); + if (gstate->blendmode) + fz_end_group(csi->dev); + } + else + pdf_end_group(csi); +} + +static void pdf_show_clip(pdf_csi *csi, int even_odd) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + + gstate->clip_depth++; + fz_clip_path(csi->dev, csi->path, NULL, even_odd, gstate->ctm); +} + +static void +pdf_show_path(pdf_csi *csi, int doclose, int dofill, int dostroke, int even_odd) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_path *path; + fz_rect bbox; + + path = csi->path; + csi->path = fz_new_path(); + + if (doclose) + fz_closepath(path); + + if (dostroke) + bbox = fz_bound_path(path, &gstate->stroke_state, gstate->ctm); + else + bbox = fz_bound_path(path, NULL, gstate->ctm); + + if (dofill || dostroke) + pdf_begin_group(csi, bbox); + + if (dofill) + { + switch (gstate->fill.kind) + { + case PDF_MAT_NONE: + break; + case PDF_MAT_COLOR: + fz_fill_path(csi->dev, path, even_odd, gstate->ctm, + gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha); + break; + case PDF_MAT_PATTERN: + if (gstate->fill.pattern) + { + fz_clip_path(csi->dev, path, NULL, even_odd, gstate->ctm); + pdf_show_pattern(csi, gstate->fill.pattern, bbox, PDF_FILL); + fz_pop_clip(csi->dev); + } + break; + case PDF_MAT_SHADE: + if (gstate->fill.shade) + { + fz_clip_path(csi->dev, path, NULL, even_odd, gstate->ctm); + fz_fill_shade(csi->dev, gstate->fill.shade, csi->top_ctm, gstate->fill.alpha); + fz_pop_clip(csi->dev); + } + break; + } + } + + if (dostroke) + { + switch (gstate->stroke.kind) + { + case PDF_MAT_NONE: + break; + case PDF_MAT_COLOR: + fz_stroke_path(csi->dev, path, &gstate->stroke_state, gstate->ctm, + gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha); + break; + case PDF_MAT_PATTERN: + if (gstate->stroke.pattern) + { + fz_clip_stroke_path(csi->dev, path, &bbox, &gstate->stroke_state, gstate->ctm); + pdf_show_pattern(csi, gstate->stroke.pattern, bbox, PDF_FILL); + fz_pop_clip(csi->dev); + } + break; + case PDF_MAT_SHADE: + if (gstate->stroke.shade) + { + fz_clip_stroke_path(csi->dev, path, &bbox, &gstate->stroke_state, gstate->ctm); + fz_fill_shade(csi->dev, gstate->stroke.shade, csi->top_ctm, gstate->stroke.alpha); + fz_pop_clip(csi->dev); + } + break; + } + } + + if (dofill || dostroke) + pdf_end_group(csi); + + fz_free_path(path); +} + +/* + * Assemble and emit text + */ + +static void +pdf_flush_text(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_text *text; + int dofill = 0; + int dostroke = 0; + int doclip = 0; + int doinvisible = 0; + fz_rect bbox; + + if (!csi->text) + return; + text = csi->text; + csi->text = NULL; + + dofill = dostroke = doclip = doinvisible = 0; + switch (csi->text_mode) + { + case 0: dofill = 1; break; + case 1: dostroke = 1; break; + case 2: dofill = dostroke = 1; break; + case 3: doinvisible = 1; break; + case 4: dofill = doclip = 1; break; + case 5: dostroke = doclip = 1; break; + case 6: dofill = dostroke = doclip = 1; break; + case 7: doclip = 1; break; + } + + bbox = fz_bound_text(text, gstate->ctm); + + pdf_begin_group(csi, bbox); + + if (doinvisible) + fz_ignore_text(csi->dev, text, gstate->ctm); + + if (doclip) + { + if (csi->accumulate < 2) + gstate->clip_depth++; + fz_clip_text(csi->dev, text, gstate->ctm, csi->accumulate); + csi->accumulate = 2; + } + + if (dofill) + { + switch (gstate->fill.kind) + { + case PDF_MAT_NONE: + break; + case PDF_MAT_COLOR: + fz_fill_text(csi->dev, text, gstate->ctm, + gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha); + break; + case PDF_MAT_PATTERN: + if (gstate->fill.pattern) + { + fz_clip_text(csi->dev, text, gstate->ctm, 0); + pdf_show_pattern(csi, gstate->fill.pattern, bbox, PDF_FILL); + fz_pop_clip(csi->dev); + } + break; + case PDF_MAT_SHADE: + if (gstate->fill.shade) + { + fz_clip_text(csi->dev, text, gstate->ctm, 0); + fz_fill_shade(csi->dev, gstate->fill.shade, csi->top_ctm, gstate->fill.alpha); + fz_pop_clip(csi->dev); + } + break; + } + } + + if (dostroke) + { + switch (gstate->stroke.kind) + { + case PDF_MAT_NONE: + break; + case PDF_MAT_COLOR: + fz_stroke_text(csi->dev, text, &gstate->stroke_state, gstate->ctm, + gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha); + break; + case PDF_MAT_PATTERN: + if (gstate->stroke.pattern) + { + fz_clip_stroke_text(csi->dev, text, &gstate->stroke_state, gstate->ctm); + pdf_show_pattern(csi, gstate->stroke.pattern, bbox, PDF_FILL); + fz_pop_clip(csi->dev); + } + break; + case PDF_MAT_SHADE: + if (gstate->stroke.shade) + { + fz_clip_stroke_text(csi->dev, text, &gstate->stroke_state, gstate->ctm); + fz_fill_shade(csi->dev, gstate->stroke.shade, csi->top_ctm, gstate->stroke.alpha); + fz_pop_clip(csi->dev); + } + break; + } + } + + pdf_end_group(csi); + + fz_free_text(text); +} + +static void +pdf_show_char(pdf_csi *csi, int cid) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + pdf_font_desc *fontdesc = gstate->font; + fz_matrix tsm, trm; + float w0, w1, tx, ty; + pdf_hmtx h; + pdf_vmtx v; + int gid; + int ucsbuf[8]; + int ucslen; + int i; + + tsm.a = gstate->size * gstate->scale; + tsm.b = 0; + tsm.c = 0; + tsm.d = gstate->size; + tsm.e = 0; + tsm.f = gstate->rise; + + ucslen = 0; + if (fontdesc->to_unicode) + ucslen = pdf_lookup_cmap_full(fontdesc->to_unicode, cid, ucsbuf); + if (ucslen == 0 && cid < fontdesc->cid_to_ucs_len) + { + ucsbuf[0] = fontdesc->cid_to_ucs[cid]; + ucslen = 1; + } + if (ucslen == 0 || (ucslen == 1 && ucsbuf[0] == 0)) + { + ucsbuf[0] = '?'; + ucslen = 1; + } + + gid = pdf_font_cid_to_gid(fontdesc, cid); + + if (fontdesc->wmode == 1) + { + v = pdf_get_vmtx(fontdesc, cid); + tsm.e -= v.x * gstate->size * 0.001f; + tsm.f -= v.y * gstate->size * 0.001f; + } + + trm = fz_concat(tsm, csi->tm); + + /* flush buffered text if face or matrix or rendermode has changed */ + if (!csi->text || + fontdesc->font != csi->text->font || + fontdesc->wmode != csi->text->wmode || + fabsf(trm.a - csi->text->trm.a) > FLT_EPSILON || + fabsf(trm.b - csi->text->trm.b) > FLT_EPSILON || + fabsf(trm.c - csi->text->trm.c) > FLT_EPSILON || + fabsf(trm.d - csi->text->trm.d) > FLT_EPSILON || + gstate->render != csi->text_mode) + { + pdf_flush_text(csi); + + csi->text = fz_new_text(fontdesc->font, trm, fontdesc->wmode); + csi->text->trm.e = 0; + csi->text->trm.f = 0; + csi->text_mode = gstate->render; + } + + /* add glyph to textobject */ + fz_add_text(csi->text, gid, ucsbuf[0], trm.e, trm.f); + + /* add filler glyphs for one-to-many unicode mapping */ + for (i = 1; i < ucslen; i++) + fz_add_text(csi->text, -1, ucsbuf[i], trm.e, trm.f); + + if (fontdesc->wmode == 0) + { + h = pdf_get_hmtx(fontdesc, cid); + w0 = h.w * 0.001f; + tx = (w0 * gstate->size + gstate->char_space) * gstate->scale; + csi->tm = fz_concat(fz_translate(tx, 0), csi->tm); + } + + if (fontdesc->wmode == 1) + { + w1 = v.w * 0.001f; + ty = w1 * gstate->size + gstate->char_space; + csi->tm = fz_concat(fz_translate(0, ty), csi->tm); + } +} + +static void +pdf_show_space(pdf_csi *csi, float tadj) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + pdf_font_desc *fontdesc = gstate->font; + + if (!fontdesc) + { + fz_warn("cannot draw text since font and size not set"); + return; + } + + if (fontdesc->wmode == 0) + csi->tm = fz_concat(fz_translate(tadj * gstate->scale, 0), csi->tm); + else + csi->tm = fz_concat(fz_translate(0, tadj), csi->tm); +} + +static void +pdf_show_string(pdf_csi *csi, unsigned char *buf, int len) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + pdf_font_desc *fontdesc = gstate->font; + unsigned char *end = buf + len; + int cpt, cid; + + if (!fontdesc) + { + fz_warn("cannot draw text since font and size not set"); + return; + } + + while (buf < end) + { + buf = pdf_decode_cmap(fontdesc->encoding, buf, &cpt); + cid = pdf_lookup_cmap(fontdesc->encoding, cpt); + if (cid >= 0) + pdf_show_char(csi, cid); + else + fz_warn("cannot encode character with code point %#x", cpt); + if (cpt == 32) + pdf_show_space(csi, gstate->word_space); + } +} + +static void +pdf_show_text(pdf_csi *csi, fz_obj *text) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + int i; + + if (fz_is_array(text)) + { + for (i = 0; i < fz_array_len(text); i++) + { + fz_obj *item = fz_array_get(text, i); + if (fz_is_string(item)) + pdf_show_string(csi, (unsigned char *)fz_to_str_buf(item), fz_to_str_len(item)); + else + pdf_show_space(csi, - fz_to_real(item) * gstate->size * 0.001f); + } + } + else if (fz_is_string(text)) + { + pdf_show_string(csi, (unsigned char *)fz_to_str_buf(text), fz_to_str_len(text)); + } +} + +/* + * Interpreter and graphics state stack. + */ + +static void +pdf_init_gstate(pdf_gstate *gs, fz_matrix ctm) +{ + gs->ctm = ctm; + gs->clip_depth = 0; + + gs->stroke_state.start_cap = 0; + gs->stroke_state.dash_cap = 0; + gs->stroke_state.end_cap = 0; + gs->stroke_state.linejoin = 0; + gs->stroke_state.linewidth = 1; + gs->stroke_state.miterlimit = 10; + gs->stroke_state.dash_phase = 0; + gs->stroke_state.dash_len = 0; + memset(gs->stroke_state.dash_list, 0, sizeof(gs->stroke_state.dash_list)); + + gs->stroke.kind = PDF_MAT_COLOR; + gs->stroke.colorspace = fz_keep_colorspace(fz_device_gray); + gs->stroke.v[0] = 0; + gs->stroke.pattern = NULL; + gs->stroke.shade = NULL; + gs->stroke.alpha = 1; + + gs->fill.kind = PDF_MAT_COLOR; + gs->fill.colorspace = fz_keep_colorspace(fz_device_gray); + gs->fill.v[0] = 0; + gs->fill.pattern = NULL; + gs->fill.shade = NULL; + gs->fill.alpha = 1; + + gs->char_space = 0; + gs->word_space = 0; + gs->scale = 1; + gs->leading = 0; + gs->font = NULL; + gs->size = -1; + gs->render = 0; + gs->rise = 0; + + gs->blendmode = 0; + gs->softmask = NULL; + gs->softmask_ctm = fz_identity; + gs->luminosity = 0; +} + +static pdf_csi * +pdf_new_csi(pdf_xref *xref, fz_device *dev, fz_matrix ctm, char *target) +{ + pdf_csi *csi; + + csi = fz_malloc(sizeof(pdf_csi)); + csi->xref = xref; + csi->dev = dev; + csi->target = target; + + csi->top = 0; + csi->obj = NULL; + csi->name[0] = 0; + csi->string_len = 0; + memset(csi->stack, 0, sizeof csi->stack); + + csi->xbalance = 0; + csi->in_text = 0; + + csi->path = fz_new_path(); + + csi->text = NULL; + csi->tlm = fz_identity; + csi->tm = fz_identity; + csi->text_mode = 0; + csi->accumulate = 1; + + csi->top_ctm = ctm; + pdf_init_gstate(&csi->gstate[0], ctm); + csi->gtop = 0; + + return csi; +} + +static void +pdf_clear_stack(pdf_csi *csi) +{ + int i; + + if (csi->obj) + fz_drop_obj(csi->obj); + csi->obj = NULL; + + csi->name[0] = 0; + csi->string_len = 0; + for (i = 0; i < csi->top; i++) + csi->stack[i] = 0; + + csi->top = 0; +} + +static pdf_material * +pdf_keep_material(pdf_material *mat) +{ + if (mat->colorspace) + fz_keep_colorspace(mat->colorspace); + if (mat->pattern) + pdf_keep_pattern(mat->pattern); + if (mat->shade) + fz_keep_shade(mat->shade); + return mat; +} + +static pdf_material * +pdf_drop_material(pdf_material *mat) +{ + if (mat->colorspace) + fz_drop_colorspace(mat->colorspace); + if (mat->pattern) + pdf_drop_pattern(mat->pattern); + if (mat->shade) + fz_drop_shade(mat->shade); + return mat; +} + +static void +pdf_gsave(pdf_csi *csi) +{ + pdf_gstate *gs = csi->gstate + csi->gtop; + + if (csi->gtop == nelem(csi->gstate) - 1) + { + fz_warn("gstate overflow in content stream"); + return; + } + + memcpy(&csi->gstate[csi->gtop + 1], &csi->gstate[csi->gtop], sizeof(pdf_gstate)); + + csi->gtop ++; + + pdf_keep_material(&gs->stroke); + pdf_keep_material(&gs->fill); + if (gs->font) + pdf_keep_font(gs->font); + if (gs->softmask) + pdf_keep_xobject(gs->softmask); +} + +static void +pdf_grestore(pdf_csi *csi) +{ + pdf_gstate *gs = csi->gstate + csi->gtop; + int clip_depth = gs->clip_depth; + + if (csi->gtop == 0) + { + fz_warn("gstate underflow in content stream"); + return; + } + + pdf_drop_material(&gs->stroke); + pdf_drop_material(&gs->fill); + if (gs->font) + pdf_drop_font(gs->font); + if (gs->softmask) + pdf_drop_xobject(gs->softmask); + + csi->gtop --; + + gs = csi->gstate + csi->gtop; + while (clip_depth > gs->clip_depth) + { + fz_pop_clip(csi->dev); + clip_depth--; + } +} + +static void +pdf_free_csi(pdf_csi *csi) +{ + while (csi->gtop) + pdf_grestore(csi); + + pdf_drop_material(&csi->gstate[0].fill); + pdf_drop_material(&csi->gstate[0].stroke); + if (csi->gstate[0].font) + pdf_drop_font(csi->gstate[0].font); + if (csi->gstate[0].softmask) + pdf_drop_xobject(csi->gstate[0].softmask); + + while (csi->gstate[0].clip_depth--) + fz_pop_clip(csi->dev); + + if (csi->path) fz_free_path(csi->path); + if (csi->text) fz_free_text(csi->text); + + pdf_clear_stack(csi); + + fz_free(csi); +} + +/* + * Material state + */ + +static void +pdf_set_colorspace(pdf_csi *csi, int what, fz_colorspace *colorspace) +{ + pdf_gstate *gs = csi->gstate + csi->gtop; + pdf_material *mat; + + pdf_flush_text(csi); + + mat = what == PDF_FILL ? &gs->fill : &gs->stroke; + + fz_drop_colorspace(mat->colorspace); + + mat->kind = PDF_MAT_COLOR; + mat->colorspace = fz_keep_colorspace(colorspace); + + mat->v[0] = 0; + mat->v[1] = 0; + mat->v[2] = 0; + mat->v[3] = 1; +} + +static void +pdf_set_color(pdf_csi *csi, int what, float *v) +{ + pdf_gstate *gs = csi->gstate + csi->gtop; + pdf_material *mat; + int i; + + pdf_flush_text(csi); + + mat = what == PDF_FILL ? &gs->fill : &gs->stroke; + + switch (mat->kind) + { + case PDF_MAT_PATTERN: + case PDF_MAT_COLOR: + if (!strcmp(mat->colorspace->name, "Lab")) + { + mat->v[0] = v[0] / 100; + mat->v[1] = (v[1] + 100) / 200; + mat->v[2] = (v[2] + 100) / 200; + } + for (i = 0; i < mat->colorspace->n; i++) + mat->v[i] = v[i]; + break; + default: + fz_warn("color incompatible with material"); + } +} + +static void +pdf_set_shade(pdf_csi *csi, int what, fz_shade *shade) +{ + pdf_gstate *gs = csi->gstate + csi->gtop; + pdf_material *mat; + + pdf_flush_text(csi); + + mat = what == PDF_FILL ? &gs->fill : &gs->stroke; + + if (mat->shade) + fz_drop_shade(mat->shade); + + mat->kind = PDF_MAT_SHADE; + mat->shade = fz_keep_shade(shade); +} + +static void +pdf_set_pattern(pdf_csi *csi, int what, pdf_pattern *pat, float *v) +{ + pdf_gstate *gs = csi->gstate + csi->gtop; + pdf_material *mat; + + pdf_flush_text(csi); + + mat = what == PDF_FILL ? &gs->fill : &gs->stroke; + + if (mat->pattern) + pdf_drop_pattern(mat->pattern); + + mat->kind = PDF_MAT_PATTERN; + if (pat) + mat->pattern = pdf_keep_pattern(pat); + else + mat->pattern = NULL; + + if (v) + pdf_set_color(csi, what, v); +} + +static void +pdf_unset_pattern(pdf_csi *csi, int what) +{ + pdf_gstate *gs = csi->gstate + csi->gtop; + pdf_material *mat; + mat = what == PDF_FILL ? &gs->fill : &gs->stroke; + if (mat->kind == PDF_MAT_PATTERN) + { + if (mat->pattern) + pdf_drop_pattern(mat->pattern); + mat->pattern = NULL; + mat->kind = PDF_MAT_COLOR; + } +} + +/* + * Patterns, XObjects and ExtGState + */ + +static void +pdf_show_pattern(pdf_csi *csi, pdf_pattern *pat, fz_rect area, int what) +{ + pdf_gstate *gstate; + fz_matrix ptm, invptm; + fz_matrix oldtopctm; + fz_error error; + int x0, y0, x1, y1; + int oldtop; + + pdf_gsave(csi); + gstate = csi->gstate + csi->gtop; + + if (pat->ismask) + { + pdf_unset_pattern(csi, PDF_FILL); + pdf_unset_pattern(csi, PDF_STROKE); + if (what == PDF_FILL) + { + pdf_drop_material(&gstate->stroke); + pdf_keep_material(&gstate->fill); + gstate->stroke = gstate->fill; + } + if (what == PDF_STROKE) + { + pdf_drop_material(&gstate->fill); + pdf_keep_material(&gstate->stroke); + gstate->fill = gstate->stroke; + } + } + else + { + // TODO: unset only the current fill/stroke or both? + pdf_unset_pattern(csi, what); + } + + /* don't apply softmasks to objects in the pattern as well */ + if (gstate->softmask) + { + pdf_drop_xobject(gstate->softmask); + gstate->softmask = NULL; + } + + ptm = fz_concat(pat->matrix, csi->top_ctm); + invptm = fz_invert_matrix(ptm); + + /* patterns are painted using the ctm in effect at the beginning of the content stream */ + /* get bbox of shape in pattern space for stamping */ + area = fz_transform_rect(invptm, area); + x0 = floorf(area.x0 / pat->xstep); + y0 = floorf(area.y0 / pat->ystep); + x1 = ceilf(area.x1 / pat->xstep); + y1 = ceilf(area.y1 / pat->ystep); + + oldtopctm = csi->top_ctm; + oldtop = csi->gtop; + +#ifdef TILE + if ((x1 - x0) * (y1 - y0) > 0) + { + fz_begin_tile(csi->dev, area, pat->bbox, pat->xstep, pat->ystep, ptm); + gstate->ctm = ptm; + csi->top_ctm = gstate->ctm; + pdf_gsave(csi); + error = pdf_run_buffer(csi, pat->resources, pat->contents); + if (error) + fz_catch(error, "cannot render pattern tile"); + pdf_grestore(csi); + while (oldtop < csi->gtop) + pdf_grestore(csi); + fz_end_tile(csi->dev); + } +#else + { + int x, y; + for (y = y0; y < y1; y++) + { + for (x = x0; x < x1; x++) + { + gstate->ctm = fz_concat(fz_translate(x * pat->xstep, y * pat->ystep), ptm); + csi->top_ctm = gstate->ctm; + error = pdf_run_csi_buffer(csi, pat->resources, pat->contents); + while (oldtop < csi->gtop) + pdf_grestore(csi); + if (error) + { + fz_catch(error, "cannot render pattern tile"); + goto cleanup; + } + } + } + } +cleanup: +#endif + + csi->top_ctm = oldtopctm; + + pdf_grestore(csi); +} + +static fz_error +pdf_run_xobject(pdf_csi *csi, fz_obj *resources, pdf_xobject *xobj, fz_matrix transform) +{ + fz_error error; + pdf_gstate *gstate; + fz_matrix oldtopctm; + int oldtop; + int popmask; + + pdf_gsave(csi); + + gstate = csi->gstate + csi->gtop; + oldtop = csi->gtop; + popmask = 0; + + /* apply xobject's transform matrix */ + transform = fz_concat(xobj->matrix, transform); + gstate->ctm = fz_concat(transform, gstate->ctm); + + /* apply soft mask, create transparency group and reset state */ + if (xobj->transparency) + { + if (gstate->softmask) + { + pdf_xobject *softmask = gstate->softmask; + fz_rect bbox = fz_transform_rect(gstate->ctm, xobj->bbox); + + gstate->softmask = NULL; + popmask = 1; + + fz_begin_mask(csi->dev, bbox, gstate->luminosity, + softmask->colorspace, gstate->softmask_bc); + error = pdf_run_xobject(csi, resources, softmask, fz_identity); + if (error) + return fz_rethrow(error, "cannot run softmask"); + fz_end_mask(csi->dev); + + pdf_drop_xobject(softmask); + } + + fz_begin_group(csi->dev, + fz_transform_rect(gstate->ctm, xobj->bbox), + xobj->isolated, xobj->knockout, gstate->blendmode, gstate->fill.alpha); + + gstate->blendmode = 0; + gstate->stroke.alpha = 1; + gstate->fill.alpha = 1; + } + + /* clip to the bounds */ + + fz_moveto(csi->path, xobj->bbox.x0, xobj->bbox.y0); + fz_lineto(csi->path, xobj->bbox.x1, xobj->bbox.y0); + fz_lineto(csi->path, xobj->bbox.x1, xobj->bbox.y1); + fz_lineto(csi->path, xobj->bbox.x0, xobj->bbox.y1); + fz_closepath(csi->path); + pdf_show_clip(csi, 0); + pdf_show_path(csi, 0, 0, 0, 0); + + /* run contents */ + + oldtopctm = csi->top_ctm; + csi->top_ctm = gstate->ctm; + + if (xobj->resources) + resources = xobj->resources; + + error = pdf_run_buffer(csi, resources, xobj->contents); + if (error) + fz_catch(error, "cannot interpret XObject stream"); + + csi->top_ctm = oldtopctm; + + while (oldtop < csi->gtop) + pdf_grestore(csi); + + pdf_grestore(csi); + + /* wrap up transparency stacks */ + + if (xobj->transparency) + { + fz_end_group(csi->dev); + if (popmask) + fz_pop_clip(csi->dev); + } + + return fz_okay; +} + +static fz_error +pdf_run_extgstate(pdf_csi *csi, fz_obj *rdb, fz_obj *extgstate) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_colorspace *colorspace; + int i, k; + + pdf_flush_text(csi); + + for (i = 0; i < fz_dict_len(extgstate); i++) + { + fz_obj *key = fz_dict_get_key(extgstate, i); + fz_obj *val = fz_dict_get_val(extgstate, i); + char *s = fz_to_name(key); + + if (!strcmp(s, "Font")) + { + if (fz_is_array(val) && fz_array_len(val) == 2) + { + fz_error error; + fz_obj *font = fz_array_get(val, 0); + + if (gstate->font) + { + pdf_drop_font(gstate->font); + gstate->font = NULL; + } + + error = pdf_load_font(&gstate->font, csi->xref, rdb, font); + if (error) + return fz_rethrow(error, "cannot load font (%d %d R)", fz_to_num(font), fz_to_gen(font)); + if (!gstate->font) + return fz_throw("cannot find font in store"); + gstate->size = fz_to_real(fz_array_get(val, 1)); + } + else + return fz_throw("malformed /Font dictionary"); + } + + else if (!strcmp(s, "LC")) + { + gstate->stroke_state.start_cap = fz_to_int(val); + gstate->stroke_state.dash_cap = fz_to_int(val); + gstate->stroke_state.end_cap = fz_to_int(val); + } + else if (!strcmp(s, "LW")) + gstate->stroke_state.linewidth = fz_to_real(val); + else if (!strcmp(s, "LJ")) + gstate->stroke_state.linejoin = fz_to_int(val); + else if (!strcmp(s, "ML")) + gstate->stroke_state.miterlimit = fz_to_real(val); + + else if (!strcmp(s, "D")) + { + if (fz_is_array(val) && fz_array_len(val) == 2) + { + fz_obj *dashes = fz_array_get(val, 0); + gstate->stroke_state.dash_len = MAX(fz_array_len(dashes), 32); + for (k = 0; k < gstate->stroke_state.dash_len; k++) + gstate->stroke_state.dash_list[k] = fz_to_real(fz_array_get(dashes, k)); + gstate->stroke_state.dash_phase = fz_to_real(fz_array_get(val, 1)); + } + else + return fz_throw("malformed /D"); + } + + else if (!strcmp(s, "CA")) + gstate->stroke.alpha = fz_to_real(val); + + else if (!strcmp(s, "ca")) + gstate->fill.alpha = fz_to_real(val); + + else if (!strcmp(s, "BM")) + { + if (fz_is_array(val)) + val = fz_array_get(val, 0); + gstate->blendmode = fz_find_blendmode(fz_to_name(val)); + } + + else if (!strcmp(s, "SMask")) + { + if (fz_is_dict(val)) + { + fz_error error; + pdf_xobject *xobj; + fz_obj *group, *luminosity, *bc; + + if (gstate->softmask) + { + pdf_drop_xobject(gstate->softmask); + gstate->softmask = NULL; + } + + group = fz_dict_gets(val, "G"); + if (!group) + return fz_throw("cannot load softmask xobject (%d %d R)", fz_to_num(val), fz_to_gen(val)); + error = pdf_load_xobject(&xobj, csi->xref, group); + if (error) + return fz_rethrow(error, "cannot load xobject (%d %d R)", fz_to_num(val), fz_to_gen(val)); + + colorspace = xobj->colorspace; + if (!colorspace) + colorspace = fz_device_gray; + + gstate->softmask_ctm = fz_concat(xobj->matrix, gstate->ctm); + gstate->softmask = xobj; + for (k = 0; k < colorspace->n; k++) + gstate->softmask_bc[k] = 0; + + bc = fz_dict_gets(val, "BC"); + if (fz_is_array(bc)) + { + for (k = 0; k < colorspace->n; k++) + gstate->softmask_bc[k] = fz_to_real(fz_array_get(bc, k)); + } + + luminosity = fz_dict_gets(val, "S"); + if (fz_is_name(luminosity) && !strcmp(fz_to_name(luminosity), "Luminosity")) + gstate->luminosity = 1; + else + gstate->luminosity = 0; + } + else if (fz_is_name(val) && !strcmp(fz_to_name(val), "None")) + { + if (gstate->softmask) + { + pdf_drop_xobject(gstate->softmask); + gstate->softmask = NULL; + } + } + } + + else if (!strcmp(s, "TR")) + { + if (fz_is_name(val) && strcmp(fz_to_name(val), "Identity")) + fz_warn("ignoring transfer function"); + } + } + + return fz_okay; +} + +/* + * Operators + */ + +static void pdf_run_BDC(pdf_csi *csi) +{ +} + +static fz_error pdf_run_BI(pdf_csi *csi, fz_obj *rdb, fz_stream *file) +{ + int ch; + fz_error error; + char *buf = csi->xref->scratch; + int buflen = sizeof(csi->xref->scratch); + fz_pixmap *img; + fz_obj *obj; + + error = pdf_parse_dict(&obj, csi->xref, file, buf, buflen); + if (error) + return fz_rethrow(error, "cannot parse inline image dictionary"); + + /* read whitespace after ID keyword */ + ch = fz_read_byte(file); + if (ch == '\r') + if (fz_peek_byte(file) == '\n') + fz_read_byte(file); + + error = pdf_load_inline_image(&img, csi->xref, rdb, obj, file); + fz_drop_obj(obj); + if (error) + return fz_rethrow(error, "cannot load inline image"); + + pdf_show_image(csi, img); + + fz_drop_pixmap(img); + + /* find EI */ + ch = fz_read_byte(file); + while (ch != 'E' && ch != EOF) + ch = fz_read_byte(file); + ch = fz_read_byte(file); + if (ch != 'I') + return fz_rethrow(error, "syntax error after inline image"); + + return fz_okay; +} + +static void pdf_run_B(pdf_csi *csi) +{ + pdf_show_path(csi, 0, 1, 1, 0); +} + +static void pdf_run_BMC(pdf_csi *csi) +{ +} + +static void pdf_run_BT(pdf_csi *csi) +{ + csi->in_text = 1; + csi->tm = fz_identity; + csi->tlm = fz_identity; +} + +static void pdf_run_BX(pdf_csi *csi) +{ + csi->xbalance ++; +} + +static void pdf_run_Bstar(pdf_csi *csi) +{ + pdf_show_path(csi, 0, 1, 1, 1); +} + +static fz_error pdf_run_cs_imp(pdf_csi *csi, fz_obj *rdb, int what) +{ + fz_colorspace *colorspace; + fz_obj *obj, *dict; + fz_error error; + + if (!strcmp(csi->name, "Pattern")) + { + pdf_set_pattern(csi, what, NULL, NULL); + } + else + { + if (!strcmp(csi->name, "DeviceGray")) + colorspace = fz_keep_colorspace(fz_device_gray); + else if (!strcmp(csi->name, "DeviceRGB")) + colorspace = fz_keep_colorspace(fz_device_rgb); + else if (!strcmp(csi->name, "DeviceCMYK")) + colorspace = fz_keep_colorspace(fz_device_cmyk); + else + { + dict = fz_dict_gets(rdb, "ColorSpace"); + if (!dict) + return fz_throw("cannot find ColorSpace dictionary"); + obj = fz_dict_gets(dict, csi->name); + if (!obj) + return fz_throw("cannot find colorspace resource '%s'", csi->name); + error = pdf_load_colorspace(&colorspace, csi->xref, obj); + if (error) + return fz_rethrow(error, "cannot load colorspace (%d 0 R)", fz_to_num(obj)); + } + + pdf_set_colorspace(csi, what, colorspace); + + fz_drop_colorspace(colorspace); + } + return fz_okay; +} + +static void pdf_run_CS(pdf_csi *csi, fz_obj *rdb) +{ + fz_error error; + error = pdf_run_cs_imp(csi, rdb, PDF_STROKE); + if (error) + fz_catch(error, "cannot set colorspace"); +} + +static void pdf_run_cs(pdf_csi *csi, fz_obj *rdb) +{ + fz_error error; + error = pdf_run_cs_imp(csi, rdb, PDF_FILL); + if (error) + fz_catch(error, "cannot set colorspace"); +} + +static void pdf_run_DP(pdf_csi *csi) +{ +} + +static fz_error pdf_run_Do(pdf_csi *csi, fz_obj *rdb) +{ + fz_obj *dict; + fz_obj *obj; + fz_obj *subtype; + fz_error error; + + dict = fz_dict_gets(rdb, "XObject"); + if (!dict) + return fz_throw("cannot find XObject dictionary when looking for: '%s'", csi->name); + + obj = fz_dict_gets(dict, csi->name); + if (!obj) + return fz_throw("cannot find xobject resource: '%s'", csi->name); + + subtype = fz_dict_gets(obj, "Subtype"); + if (!fz_is_name(subtype)) + return fz_throw("no XObject subtype specified"); + + if (pdf_is_hidden_ocg(obj, csi->target)) + return fz_okay; + + if (!strcmp(fz_to_name(subtype), "Form") && fz_dict_gets(obj, "Subtype2")) + subtype = fz_dict_gets(obj, "Subtype2"); + + if (!strcmp(fz_to_name(subtype), "Form")) + { + pdf_xobject *xobj; + + error = pdf_load_xobject(&xobj, csi->xref, obj); + if (error) + return fz_rethrow(error, "cannot load xobject (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + + /* Inherit parent resources, in case this one was empty XXX check where it's loaded */ + if (!xobj->resources) + xobj->resources = fz_keep_obj(rdb); + + error = pdf_run_xobject(csi, xobj->resources, xobj, fz_identity); + if (error) + return fz_rethrow(error, "cannot draw xobject (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + + pdf_drop_xobject(xobj); + } + + else if (!strcmp(fz_to_name(subtype), "Image")) + { + if ((csi->dev->hints & FZ_IGNORE_IMAGE) == 0) + { + fz_pixmap *img; + error = pdf_load_image(&img, csi->xref, obj); + if (error) + return fz_rethrow(error, "cannot load image (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + pdf_show_image(csi, img); + fz_drop_pixmap(img); + } + } + + else if (!strcmp(fz_to_name(subtype), "PS")) + { + fz_warn("ignoring XObject with subtype PS"); + } + + else + { + return fz_throw("unknown XObject subtype: '%s'", fz_to_name(subtype)); + } + + return fz_okay; +} + +static void pdf_run_EMC(pdf_csi *csi) +{ +} + +static void pdf_run_ET(pdf_csi *csi) +{ + pdf_flush_text(csi); + csi->accumulate = 1; + csi->in_text = 0; +} + +static void pdf_run_EX(pdf_csi *csi) +{ + csi->xbalance --; +} + +static void pdf_run_F(pdf_csi *csi) +{ + pdf_show_path(csi, 0, 1, 0, 0); +} + +static void pdf_run_G(pdf_csi *csi) +{ + pdf_set_colorspace(csi, PDF_STROKE, fz_device_gray); + pdf_set_color(csi, PDF_STROKE, csi->stack); +} + +static void pdf_run_J(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + gstate->stroke_state.start_cap = csi->stack[0]; + gstate->stroke_state.dash_cap = csi->stack[0]; + gstate->stroke_state.end_cap = csi->stack[0]; +} + +static void pdf_run_K(pdf_csi *csi) +{ + pdf_set_colorspace(csi, PDF_STROKE, fz_device_cmyk); + pdf_set_color(csi, PDF_STROKE, csi->stack); +} + +static void pdf_run_M(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + gstate->stroke_state.miterlimit = csi->stack[0]; +} + +static void pdf_run_MP(pdf_csi *csi) +{ +} + +static void pdf_run_Q(pdf_csi *csi) +{ + pdf_grestore(csi); +} + +static void pdf_run_RG(pdf_csi *csi) +{ + pdf_set_colorspace(csi, PDF_STROKE, fz_device_rgb); + pdf_set_color(csi, PDF_STROKE, csi->stack); +} + +static void pdf_run_S(pdf_csi *csi) +{ + pdf_show_path(csi, 0, 0, 1, 0); +} + +static fz_error pdf_run_SC_imp(pdf_csi *csi, fz_obj *rdb, int what, pdf_material *mat) +{ + fz_error error; + fz_obj *patterntype; + fz_obj *dict; + fz_obj *obj; + int kind; + + kind = mat->kind; + if (csi->name[0]) + kind = PDF_MAT_PATTERN; + + switch (kind) + { + case PDF_MAT_NONE: + return fz_throw("cannot set color in mask objects"); + + case PDF_MAT_COLOR: + pdf_set_color(csi, what, csi->stack); + break; + + case PDF_MAT_PATTERN: + dict = fz_dict_gets(rdb, "Pattern"); + if (!dict) + return fz_throw("cannot find Pattern dictionary"); + + obj = fz_dict_gets(dict, csi->name); + if (!obj) + return fz_throw("cannot find pattern resource '%s'", csi->name); + + patterntype = fz_dict_gets(obj, "PatternType"); + + if (fz_to_int(patterntype) == 1) + { + pdf_pattern *pat; + error = pdf_load_pattern(&pat, csi->xref, obj); + if (error) + return fz_rethrow(error, "cannot load pattern (%d 0 R)", fz_to_num(obj)); + pdf_set_pattern(csi, what, pat, csi->top > 0 ? csi->stack : NULL); + pdf_drop_pattern(pat); + } + else if (fz_to_int(patterntype) == 2) + { + fz_shade *shd; + error = pdf_load_shading(&shd, csi->xref, obj); + if (error) + return fz_rethrow(error, "cannot load shading (%d 0 R)", fz_to_num(obj)); + pdf_set_shade(csi, what, shd); + fz_drop_shade(shd); + } + else + { + return fz_throw("unknown pattern type: %d", fz_to_int(patterntype)); + } + break; + + case PDF_MAT_SHADE: + return fz_throw("cannot set color in shade objects"); + } + + return fz_okay; +} + +static void pdf_run_SC(pdf_csi *csi, fz_obj *rdb) +{ + fz_error error; + pdf_gstate *gstate = csi->gstate + csi->gtop; + error = pdf_run_SC_imp(csi, rdb, PDF_STROKE, &gstate->stroke); + if (error) + fz_catch(error, "cannot set color and colorspace"); +} + +static void pdf_run_sc(pdf_csi *csi, fz_obj *rdb) +{ + fz_error error; + pdf_gstate *gstate = csi->gstate + csi->gtop; + error = pdf_run_SC_imp(csi, rdb, PDF_FILL, &gstate->fill); + if (error) + fz_catch(error, "cannot set color and colorspace"); +} + +static void pdf_run_Tc(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + gstate->char_space = csi->stack[0]; +} + +static void pdf_run_Tw(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + gstate->word_space = csi->stack[0]; +} + +static void pdf_run_Tz(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + float a = csi->stack[0] / 100; + pdf_flush_text(csi); + gstate->scale = a; +} + +static void pdf_run_TL(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + gstate->leading = csi->stack[0]; +} + +static fz_error pdf_run_Tf(pdf_csi *csi, fz_obj *rdb) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_error error; + fz_obj *dict; + fz_obj *obj; + + gstate->size = csi->stack[0]; + if (gstate->font) + pdf_drop_font(gstate->font); + gstate->font = NULL; + + dict = fz_dict_gets(rdb, "Font"); + if (!dict) + return fz_throw("cannot find Font dictionary"); + + obj = fz_dict_gets(dict, csi->name); + if (!obj) + return fz_throw("cannot find font resource: '%s'", csi->name); + + error = pdf_load_font(&gstate->font, csi->xref, rdb, obj); + if (error) + return fz_rethrow(error, "cannot load font (%d 0 R)", fz_to_num(obj)); + + return fz_okay; +} + +static void pdf_run_Tr(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + gstate->render = csi->stack[0]; +} + +static void pdf_run_Ts(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + gstate->rise = csi->stack[0]; +} + +static void pdf_run_Td(pdf_csi *csi) +{ + fz_matrix m = fz_translate(csi->stack[0], csi->stack[1]); + csi->tlm = fz_concat(m, csi->tlm); + csi->tm = csi->tlm; +} + +static void pdf_run_TD(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_matrix m; + + gstate->leading = -csi->stack[1]; + m = fz_translate(csi->stack[0], csi->stack[1]); + csi->tlm = fz_concat(m, csi->tlm); + csi->tm = csi->tlm; +} + +static void pdf_run_Tm(pdf_csi *csi) +{ + csi->tm.a = csi->stack[0]; + csi->tm.b = csi->stack[1]; + csi->tm.c = csi->stack[2]; + csi->tm.d = csi->stack[3]; + csi->tm.e = csi->stack[4]; + csi->tm.f = csi->stack[5]; + csi->tlm = csi->tm; +} + +static void pdf_run_Tstar(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_matrix m = fz_translate(0, -gstate->leading); + csi->tlm = fz_concat(m, csi->tlm); + csi->tm = csi->tlm; +} + +static void pdf_run_Tj(pdf_csi *csi) +{ + if (csi->string_len) + pdf_show_string(csi, csi->string, csi->string_len); + else + pdf_show_text(csi, csi->obj); +} + +static void pdf_run_TJ(pdf_csi *csi) +{ + if (csi->string_len) + pdf_show_string(csi, csi->string, csi->string_len); + else + pdf_show_text(csi, csi->obj); +} + +static void pdf_run_W(pdf_csi *csi) +{ + pdf_show_clip(csi, 0); +} + +static void pdf_run_Wstar(pdf_csi *csi) +{ + pdf_show_clip(csi, 1); +} + +static void pdf_run_b(pdf_csi *csi) +{ + pdf_show_path(csi, 1, 1, 1, 0); +} + +static void pdf_run_bstar(pdf_csi *csi) +{ + pdf_show_path(csi, 1, 1, 1, 1); +} + +static void pdf_run_c(pdf_csi *csi) +{ + float a, b, c, d, e, f; + a = csi->stack[0]; + b = csi->stack[1]; + c = csi->stack[2]; + d = csi->stack[3]; + e = csi->stack[4]; + f = csi->stack[5]; + fz_curveto(csi->path, a, b, c, d, e, f); +} + +static void pdf_run_cm(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_matrix m; + + m.a = csi->stack[0]; + m.b = csi->stack[1]; + m.c = csi->stack[2]; + m.d = csi->stack[3]; + m.e = csi->stack[4]; + m.f = csi->stack[5]; + + gstate->ctm = fz_concat(m, gstate->ctm); +} + +static void pdf_run_d(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + fz_obj *array; + int i; + + array = csi->obj; + gstate->stroke_state.dash_len = MIN(fz_array_len(array), nelem(gstate->stroke_state.dash_list)); + for (i = 0; i < gstate->stroke_state.dash_len; i++) + gstate->stroke_state.dash_list[i] = fz_to_real(fz_array_get(array, i)); + gstate->stroke_state.dash_phase = csi->stack[0]; +} + +static void pdf_run_d0(pdf_csi *csi) +{ + csi->dev->flags |= FZ_CHARPROC_COLOR; +} + +static void pdf_run_d1(pdf_csi *csi) +{ + csi->dev->flags |= FZ_CHARPROC_MASK; +} + +static void pdf_run_f(pdf_csi *csi) +{ + pdf_show_path(csi, 0, 1, 0, 0); +} + +static void pdf_run_fstar(pdf_csi *csi) +{ + pdf_show_path(csi, 0, 1, 0, 1); +} + +static void pdf_run_g(pdf_csi *csi) +{ + pdf_set_colorspace(csi, PDF_FILL, fz_device_gray); + pdf_set_color(csi, PDF_FILL, csi->stack); +} + +static fz_error pdf_run_gs(pdf_csi *csi, fz_obj *rdb) +{ + fz_error error; + fz_obj *dict; + fz_obj *obj; + + dict = fz_dict_gets(rdb, "ExtGState"); + if (!dict) + return fz_throw("cannot find ExtGState dictionary"); + + obj = fz_dict_gets(dict, csi->name); + if (!obj) + return fz_throw("cannot find extgstate resource '%s'", csi->name); + + error = pdf_run_extgstate(csi, rdb, obj); + if (error) + return fz_rethrow(error, "cannot set ExtGState (%d 0 R)", fz_to_num(obj)); + return fz_okay; +} + +static void pdf_run_h(pdf_csi *csi) +{ + fz_closepath(csi->path); +} + +static void pdf_run_i(pdf_csi *csi) +{ +} + +static void pdf_run_j(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + gstate->stroke_state.linejoin = csi->stack[0]; +} + +static void pdf_run_k(pdf_csi *csi) +{ + pdf_set_colorspace(csi, PDF_FILL, fz_device_cmyk); + pdf_set_color(csi, PDF_FILL, csi->stack); +} + +static void pdf_run_l(pdf_csi *csi) +{ + float a, b; + a = csi->stack[0]; + b = csi->stack[1]; + fz_lineto(csi->path, a, b); +} + +static void pdf_run_m(pdf_csi *csi) +{ + float a, b; + a = csi->stack[0]; + b = csi->stack[1]; + fz_moveto(csi->path, a, b); +} + +static void pdf_run_n(pdf_csi *csi) +{ + pdf_show_path(csi, 0, 0, 0, 0); +} + +static void pdf_run_q(pdf_csi *csi) +{ + pdf_gsave(csi); +} + +static void pdf_run_re(pdf_csi *csi) +{ + float x, y, w, h; + + x = csi->stack[0]; + y = csi->stack[1]; + w = csi->stack[2]; + h = csi->stack[3]; + + fz_moveto(csi->path, x, y); + fz_lineto(csi->path, x + w, y); + fz_lineto(csi->path, x + w, y + h); + fz_lineto(csi->path, x, y + h); + fz_closepath(csi->path); +} + +static void pdf_run_rg(pdf_csi *csi) +{ + pdf_set_colorspace(csi, PDF_FILL, fz_device_rgb); + pdf_set_color(csi, PDF_FILL, csi->stack); +} + +static void pdf_run_ri(pdf_csi *csi) +{ +} + +static void pdf_run(pdf_csi *csi) +{ + pdf_show_path(csi, 1, 0, 1, 0); +} + +static fz_error pdf_run_sh(pdf_csi *csi, fz_obj *rdb) +{ + fz_obj *dict; + fz_obj *obj; + fz_shade *shd; + fz_error error; + + dict = fz_dict_gets(rdb, "Shading"); + if (!dict) + return fz_throw("cannot find shading dictionary"); + + obj = fz_dict_gets(dict, csi->name); + if (!obj) + return fz_throw("cannot find shading resource: '%s'", csi->name); + + if ((csi->dev->hints & FZ_IGNORE_SHADE) == 0) + { + error = pdf_load_shading(&shd, csi->xref, obj); + if (error) + return fz_rethrow(error, "cannot load shading (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + pdf_show_shade(csi, shd); + fz_drop_shade(shd); + } + return fz_okay; +} + +static void pdf_run_v(pdf_csi *csi) +{ + float a, b, c, d; + a = csi->stack[0]; + b = csi->stack[1]; + c = csi->stack[2]; + d = csi->stack[3]; + fz_curvetov(csi->path, a, b, c, d); +} + +static void pdf_run_w(pdf_csi *csi) +{ + pdf_gstate *gstate = csi->gstate + csi->gtop; + pdf_flush_text(csi); /* linewidth affects stroked text rendering mode */ + gstate->stroke_state.linewidth = csi->stack[0]; +} + +static void pdf_run_y(pdf_csi *csi) +{ + float a, b, c, d; + a = csi->stack[0]; + b = csi->stack[1]; + c = csi->stack[2]; + d = csi->stack[3]; + fz_curvetoy(csi->path, a, b, c, d); +} + +static void pdf_run_squote(pdf_csi *csi) +{ + fz_matrix m; + pdf_gstate *gstate = csi->gstate + csi->gtop; + + m = fz_translate(0, -gstate->leading); + csi->tlm = fz_concat(m, csi->tlm); + csi->tm = csi->tlm; + + if (csi->string_len) + pdf_show_string(csi, csi->string, csi->string_len); + else + pdf_show_text(csi, csi->obj); +} + +static void pdf_run_dquote(pdf_csi *csi) +{ + fz_matrix m; + pdf_gstate *gstate = csi->gstate + csi->gtop; + + gstate->word_space = csi->stack[0]; + gstate->char_space = csi->stack[1]; + + m = fz_translate(0, -gstate->leading); + csi->tlm = fz_concat(m, csi->tlm); + csi->tm = csi->tlm; + + if (csi->string_len) + pdf_show_string(csi, csi->string, csi->string_len); + else + pdf_show_text(csi, csi->obj); +} + +#define A(a) (a) +#define B(a,b) (a | b << 8) +#define C(a,b,c) (a | b << 8 | c << 16) + +static fz_error +pdf_run_keyword(pdf_csi *csi, fz_obj *rdb, fz_stream *file, char *buf) +{ + fz_error error; + int key; + + key = buf[0]; + if (buf[1]) + { + key |= buf[1] << 8; + if (buf[2]) + { + key |= buf[2] << 16; + if (buf[3]) + key = 0; + } + } + + switch (key) + { + case A('"'): pdf_run_dquote(csi); break; + case A('\''): pdf_run_squote(csi); break; + case A('B'): pdf_run_B(csi); break; + case B('B','*'): pdf_run_Bstar(csi); break; + case C('B','D','C'): pdf_run_BDC(csi); break; + case B('B','I'): + error = pdf_run_BI(csi, rdb, file); + if (error) + return fz_rethrow(error, "cannot draw inline image"); + break; + case C('B','M','C'): pdf_run_BMC(csi); break; + case B('B','T'): pdf_run_BT(csi); break; + case B('B','X'): pdf_run_BX(csi); break; + case B('C','S'): pdf_run_CS(csi, rdb); break; + case B('D','P'): pdf_run_DP(csi); break; + case B('D','o'): + error = pdf_run_Do(csi, rdb); + if (error) + fz_catch(error, "cannot draw xobject/image"); + break; + case C('E','M','C'): pdf_run_EMC(csi); break; + case B('E','T'): pdf_run_ET(csi); break; + case B('E','X'): pdf_run_EX(csi); break; + case A('F'): pdf_run_F(csi); break; + case A('G'): pdf_run_G(csi); break; + case A('J'): pdf_run_J(csi); break; + case A('K'): pdf_run_K(csi); break; + case A('M'): pdf_run_M(csi); break; + case B('M','P'): pdf_run_MP(csi); break; + case A('Q'): pdf_run_Q(csi); break; + case B('R','G'): pdf_run_RG(csi); break; + case A('S'): pdf_run_S(csi); break; + case B('S','C'): pdf_run_SC(csi, rdb); break; + case C('S','C','N'): pdf_run_SC(csi, rdb); break; + case B('T','*'): pdf_run_Tstar(csi); break; + case B('T','D'): pdf_run_TD(csi); break; + case B('T','J'): pdf_run_TJ(csi); break; + case B('T','L'): pdf_run_TL(csi); break; + case B('T','c'): pdf_run_Tc(csi); break; + case B('T','d'): pdf_run_Td(csi); break; + case B('T','f'): + error = pdf_run_Tf(csi, rdb); + if (error) + fz_catch(error, "cannot set font"); + break; + case B('T','j'): pdf_run_Tj(csi); break; + case B('T','m'): pdf_run_Tm(csi); break; + case B('T','r'): pdf_run_Tr(csi); break; + case B('T','s'): pdf_run_Ts(csi); break; + case B('T','w'): pdf_run_Tw(csi); break; + case B('T','z'): pdf_run_Tz(csi); break; + case A('W'): pdf_run_W(csi); break; + case B('W','*'): pdf_run_Wstar(csi); break; + case A('b'): pdf_run_b(csi); break; + case B('b','*'): pdf_run_bstar(csi); break; + case A('c'): pdf_run_c(csi); break; + case B('c','m'): pdf_run_cm(csi); break; + case B('c','s'): pdf_run_cs(csi, rdb); break; + case A('d'): pdf_run_d(csi); break; + case B('d','0'): pdf_run_d0(csi); break; + case B('d','1'): pdf_run_d1(csi); break; + case A('f'): pdf_run_f(csi); break; + case B('f','*'): pdf_run_fstar(csi); break; + case A('g'): pdf_run_g(csi); break; + case B('g','s'): + error = pdf_run_gs(csi, rdb); + if (error) + fz_catch(error, "cannot set graphics state"); + break; + case A('h'): pdf_run_h(csi); break; + case A('i'): pdf_run_i(csi); break; + case A('j'): pdf_run_j(csi); break; + case A('k'): pdf_run_k(csi); break; + case A('l'): pdf_run_l(csi); break; + case A('m'): pdf_run_m(csi); break; + case A('n'): pdf_run_n(csi); break; + case A('q'): pdf_run_q(csi); break; + case B('r','e'): pdf_run_re(csi); break; + case B('r','g'): pdf_run_rg(csi); break; + case B('r','i'): pdf_run_ri(csi); break; + case A('s'): pdf_run(csi); break; + case B('s','c'): pdf_run_sc(csi, rdb); break; + case C('s','c','n'): pdf_run_sc(csi, rdb); break; + case B('s','h'): + error = pdf_run_sh(csi, rdb); + if (error) + fz_catch(error, "cannot draw shading"); + break; + case A('v'): pdf_run_v(csi); break; + case A('w'): pdf_run_w(csi); break; + case A('y'): pdf_run_y(csi); break; + default: + if (!csi->xbalance) + fz_warn("unknown keyword: '%s'", buf); + break; + } + + return fz_okay; +} + +static fz_error +pdf_run_stream(pdf_csi *csi, fz_obj *rdb, fz_stream *file, char *buf, int buflen) +{ + fz_error error; + int tok, len, in_array; + + /* make sure we have a clean slate if we come here from flush_text */ + pdf_clear_stack(csi); + in_array = 0; + + while (1) + { + if (csi->top == nelem(csi->stack) - 1) + return fz_throw("stack overflow"); + + error = pdf_lex(&tok, file, buf, buflen, &len); + if (error) + return fz_rethrow(error, "lexical error in content stream"); + + if (in_array) + { + if (tok == PDF_TOK_CLOSE_ARRAY) + { + in_array = 0; + } + else if (tok == PDF_TOK_INT || tok == PDF_TOK_REAL) + { + pdf_gstate *gstate = csi->gstate + csi->gtop; + pdf_show_space(csi, -fz_atof(buf) * gstate->size * 0.001f); + } + else if (tok == PDF_TOK_STRING) + { + pdf_show_string(csi, (unsigned char *)buf, len); + } + else if (tok == PDF_TOK_KEYWORD) + { + if (!strcmp(buf, "Tw") || !strcmp(buf, "Tc")) + fz_warn("ignoring keyword '%s' inside array", buf); + else + return fz_throw("syntax error in array"); + } + else if (tok == PDF_TOK_EOF) + return fz_okay; + else + return fz_throw("syntax error in array"); + } + + else switch (tok) + { + case PDF_TOK_ENDSTREAM: + case PDF_TOK_EOF: + return fz_okay; + + case PDF_TOK_OPEN_ARRAY: + if (!csi->in_text) + { + error = pdf_parse_array(&csi->obj, csi->xref, file, buf, buflen); + if (error) + return fz_rethrow(error, "cannot parse array"); + } + else + { + in_array = 1; + } + break; + + case PDF_TOK_OPEN_DICT: + error = pdf_parse_dict(&csi->obj, csi->xref, file, buf, buflen); + if (error) + return fz_rethrow(error, "cannot parse dictionary"); + break; + + case PDF_TOK_NAME: + fz_strlcpy(csi->name, buf, sizeof(csi->name)); + break; + + case PDF_TOK_INT: + csi->stack[csi->top] = atoi(buf); + csi->top ++; + break; + + case PDF_TOK_REAL: + csi->stack[csi->top] = fz_atof(buf); + csi->top ++; + break; + + case PDF_TOK_STRING: + if (len <= sizeof(csi->string)) + { + memcpy(csi->string, buf, len); + csi->string_len = len; + } + else + { + csi->obj = fz_new_string(buf, len); + } + break; + + case PDF_TOK_KEYWORD: + error = pdf_run_keyword(csi, rdb, file, buf); + if (error) + return fz_rethrow(error, "cannot run keyword"); + pdf_clear_stack(csi); + break; + + default: + return fz_throw("syntax error in content stream"); + } + } +} + +/* + * Entry points + */ + +static fz_error +pdf_run_buffer(pdf_csi *csi, fz_obj *rdb, fz_buffer *contents) +{ + fz_error error; + int len = sizeof csi->xref->scratch; + char *buf = fz_malloc(len); /* we must be re-entrant for type3 fonts */ + fz_stream *file = fz_open_buffer(contents); + int save_in_text = csi->in_text; + csi->in_text = 0; + error = pdf_run_stream(csi, rdb, file, buf, len); + csi->in_text = save_in_text; + fz_close(file); + fz_free(buf); + if (error) + return fz_rethrow(error, "cannot parse content stream"); + return fz_okay; +} + +fz_error +pdf_run_page_with_usage(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matrix ctm, char *target) +{ + pdf_csi *csi; + fz_error error; + pdf_annot *annot; + int flags; + + if (page->transparency) + fz_begin_group(dev, fz_transform_rect(ctm, page->mediabox), 1, 0, 0, 1); + + csi = pdf_new_csi(xref, dev, ctm, target); + error = pdf_run_buffer(csi, page->resources, page->contents); + pdf_free_csi(csi); + if (error) + return fz_rethrow(error, "cannot parse page content stream"); + + for (annot = page->annots; annot; annot = annot->next) + { + flags = fz_to_int(fz_dict_gets(annot->obj, "F")); + + /* TODO: NoZoom and NoRotate */ + if (flags & (1 << 0)) /* Invisible */ + continue; + if (flags & (1 << 1)) /* Hidden */ + continue; + if (flags & (1 << 5)) /* NoView */ + continue; + + if (pdf_is_hidden_ocg(annot->obj, target)) + continue; + + csi = pdf_new_csi(xref, dev, ctm, target); + error = pdf_run_xobject(csi, page->resources, annot->ap, annot->matrix); + pdf_free_csi(csi); + if (error) + return fz_rethrow(error, "cannot parse annotation appearance stream"); + } + + if (page->transparency) + fz_end_group(dev); + + return fz_okay; +} + +fz_error +pdf_run_page(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matrix ctm) +{ + return pdf_run_page_with_usage(xref, page, dev, ctm, "View"); +} + +fz_error +pdf_run_glyph(pdf_xref *xref, fz_obj *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm) +{ + pdf_csi *csi = pdf_new_csi(xref, dev, ctm, "View"); + fz_error error = pdf_run_buffer(csi, resources, contents); + pdf_free_csi(csi); + if (error) + return fz_rethrow(error, "cannot parse glyph content stream"); + return fz_okay; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_lex.c b/contrib/media/updf_newlib/pdf/pdf_lex.c new file mode 100755 index 000000000..23a5781f6 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_lex.c @@ -0,0 +1,461 @@ +#include "fitz.h" +#include "mupdf.h" + +#define IS_NUMBER \ + '+':case'-':case'.':case'0':case'1':case'2':case'3':\ + case'4':case'5':case'6':case'7':case'8':case'9' +#define IS_WHITE \ + '\000':case'\011':case'\012':case'\014':case'\015':case'\040' +#define IS_HEX \ + '0':case'1':case'2':case'3':case'4':case'5':case'6':\ + case'7':case'8':case'9':case'A':case'B':case'C':\ + case'D':case'E':case'F':case'a':case'b':case'c':\ + case'd':case'e':case'f' +#define IS_DELIM \ + '(':case')':case'<':case'>':case'[':case']':case'{':\ + case'}':case'/':case'%' + +#define RANGE_0_9 \ + '0':case'1':case'2':case'3':case'4':case'5':\ + case'6':case'7':case'8':case'9' +#define RANGE_a_f \ + 'a':case'b':case'c':case'd':case'e':case'f' +#define RANGE_A_F \ + 'A':case'B':case'C':case'D':case'E':case'F' + +static inline int iswhite(int ch) +{ + return + ch == '\000' || + ch == '\011' || + ch == '\012' || + ch == '\014' || + ch == '\015' || + ch == '\040'; +} + +static inline int unhex(int ch) +{ + if (ch >= '0' && ch <= '9') return ch - '0'; + if (ch >= 'A' && ch <= 'F') return ch - 'A' + 0xA; + if (ch >= 'a' && ch <= 'f') return ch - 'a' + 0xA; + return 0; +} + +static void +lex_white(fz_stream *f) +{ + int c; + do { + c = fz_read_byte(f); + } while ((c <= 32) && (iswhite(c))); + if (c != EOF) + fz_unread_byte(f); +} + +static void +lex_comment(fz_stream *f) +{ + int c; + do { + c = fz_read_byte(f); + } while ((c != '\012') && (c != '\015') && (c != EOF)); +} + +static int +lex_number(fz_stream *f, char *s, int n, int *tok) +{ + char *buf = s; + *tok = PDF_TOK_INT; + + /* Initially we might have +, -, . or a digit */ + if (n > 1) + { + int c = fz_read_byte(f); + switch (c) + { + case '.': + *tok = PDF_TOK_REAL; + *s++ = c; + n--; + goto loop_after_dot; + case '+': + case '-': + case RANGE_0_9: + *s++ = c; + n--; + goto loop_after_sign; + default: + fz_unread_byte(f); + goto end; + case EOF: + goto end; + } + } + + /* We can't accept a sign from here on in, just . or a digit */ +loop_after_sign: + while (n > 1) + { + int c = fz_read_byte(f); + switch (c) + { + case '.': + *tok = PDF_TOK_REAL; + *s++ = c; + n--; + goto loop_after_dot; + case RANGE_0_9: + *s++ = c; + break; + default: + fz_unread_byte(f); + goto end; + case EOF: + goto end; + } + n--; + } + + /* In here, we've seen a dot, so can accept just digits */ +loop_after_dot: + while (n > 1) + { + int c = fz_read_byte(f); + switch (c) + { + case RANGE_0_9: + *s++ = c; + break; + default: + fz_unread_byte(f); + goto end; + case EOF: + goto end; + } + n--; + } + +end: + *s = '\0'; + return s-buf; +} + +static void +lex_name(fz_stream *f, char *s, int n) +{ + while (n > 1) + { + int c = fz_read_byte(f); + switch (c) + { + case IS_WHITE: + case IS_DELIM: + fz_unread_byte(f); + goto end; + case EOF: + goto end; + case '#': + { + int d; + c = fz_read_byte(f); + switch (c) + { + case RANGE_0_9: + d = (c - '0') << 4; + break; + case RANGE_a_f: + d = (c - 'a' + 10) << 4; + break; + case RANGE_A_F: + d = (c - 'A' + 10) << 4; + break; + default: + fz_unread_byte(f); + /* fallthrough */ + case EOF: + goto end; + } + c = fz_read_byte(f); + switch (c) + { + case RANGE_0_9: + c -= '0'; + break; + case RANGE_a_f: + c -= 'a' - 10; + break; + case RANGE_A_F: + c -= 'A' - 10; + break; + default: + fz_unread_byte(f); + /* fallthrough */ + case EOF: + *s++ = d; + n--; + goto end; + } + *s++ = d + c; + n--; + break; + } + default: + *s++ = c; + n--; + break; + } + } +end: + *s = '\0'; +} + +static int +lex_string(fz_stream *f, char *buf, int n) +{ + char *s = buf; + char *e = buf + n; + int bal = 1; + int oct; + int c; + + while (s < e) + { + c = fz_read_byte(f); + switch (c) + { + case EOF: + goto end; + case '(': + bal++; + *s++ = c; + break; + case ')': + bal --; + if (bal == 0) + goto end; + *s++ = c; + break; + case '\\': + c = fz_read_byte(f); + switch (c) + { + case EOF: + goto end; + case 'n': + *s++ = '\n'; + break; + case 'r': + *s++ = '\r'; + break; + case 't': + *s++ = '\t'; + break; + case 'b': + *s++ = '\b'; + break; + case 'f': + *s++ = '\f'; + break; + case '(': + *s++ = '('; + break; + case ')': + *s++ = ')'; + break; + case '\\': + *s++ = '\\'; + break; + case RANGE_0_9: + oct = c - '0'; + c = fz_read_byte(f); + if (c >= '0' && c <= '9') + { + oct = oct * 8 + (c - '0'); + c = fz_read_byte(f); + if (c >= '0' && c <= '9') + oct = oct * 8 + (c - '0'); + else if (c != EOF) + fz_unread_byte(f); + } + else if (c != EOF) + fz_unread_byte(f); + *s++ = oct; + break; + case '\n': + break; + case '\r': + c = fz_read_byte(f); + if ((c != '\n') && (c != EOF)) + fz_unread_byte(f); + break; + default: + *s++ = c; + } + break; + default: + *s++ = c; + break; + } + } +end: + return s - buf; +} + +static int +lex_hex_string(fz_stream *f, char *buf, int n) +{ + char *s = buf; + char *e = buf + n; + int a = 0, x = 0; + int c; + + while (s < e) + { + c = fz_read_byte(f); + switch (c) + { + case IS_WHITE: + break; + case IS_HEX: + if (x) + { + *s++ = a * 16 + unhex(c); + x = !x; + } + else + { + a = unhex(c); + x = !x; + } + break; + case '>': + case EOF: + goto end; + default: + fz_warn("ignoring invalid character in hex string: '%c'", c); + } + } +end: + return s - buf; +} + +static int +pdf_token_from_keyword(char *key) +{ + switch (*key) + { + case 'R': + if (!strcmp(key, "R")) return PDF_TOK_R; + break; + case 't': + if (!strcmp(key, "true")) return PDF_TOK_TRUE; + if (!strcmp(key, "trailer")) return PDF_TOK_TRAILER; + break; + case 'f': + if (!strcmp(key, "false")) return PDF_TOK_FALSE; + break; + case 'n': + if (!strcmp(key, "null")) return PDF_TOK_NULL; + break; + case 'o': + if (!strcmp(key, "obj")) return PDF_TOK_OBJ; + break; + case 'e': + if (!strcmp(key, "endobj")) return PDF_TOK_ENDOBJ; + if (!strcmp(key, "endstream")) return PDF_TOK_ENDSTREAM; + break; + case 's': + if (!strcmp(key, "stream")) return PDF_TOK_STREAM; + if (!strcmp(key, "startxref")) return PDF_TOK_STARTXREF; + break; + case 'x': + if (!strcmp(key, "xref")) return PDF_TOK_XREF; + break; + default: + break; + } + + return PDF_TOK_KEYWORD; +} + +fz_error +pdf_lex(int *tok, fz_stream *f, char *buf, int n, int *sl) +{ + while (1) + { + int c = fz_read_byte(f); + switch (c) + { + case EOF: + *tok = PDF_TOK_EOF; + return fz_okay; + case IS_WHITE: + lex_white(f); + break; + case '%': + lex_comment(f); + break; + case '/': + lex_name(f, buf, n); + *sl = strlen(buf); + *tok = PDF_TOK_NAME; + return fz_okay; + case '(': + *sl = lex_string(f, buf, n); + *tok = PDF_TOK_STRING; + return fz_okay; + case ')': + *tok = PDF_TOK_ERROR; + goto cleanuperror; + case '<': + c = fz_read_byte(f); + if (c == '<') + { + *tok = PDF_TOK_OPEN_DICT; + } + else + { + fz_unread_byte(f); + *sl = lex_hex_string(f, buf, n); + *tok = PDF_TOK_STRING; + } + return fz_okay; + case '>': + c = fz_read_byte(f); + if (c == '>') + { + *tok = PDF_TOK_CLOSE_DICT; + return fz_okay; + } + *tok = PDF_TOK_ERROR; + goto cleanuperror; + case '[': + *tok = PDF_TOK_OPEN_ARRAY; + return fz_okay; + case ']': + *tok = PDF_TOK_CLOSE_ARRAY; + return fz_okay; + case '{': + *tok = PDF_TOK_OPEN_BRACE; + return fz_okay; + case '}': + *tok = PDF_TOK_CLOSE_BRACE; + return fz_okay; + case IS_NUMBER: + fz_unread_byte(f); + *sl = lex_number(f, buf, n, tok); + return fz_okay; + default: /* isregular: !isdelim && !iswhite && c != EOF */ + fz_unread_byte(f); + lex_name(f, buf, n); + *sl = strlen(buf); + *tok = pdf_token_from_keyword(buf); + return fz_okay; + } + } + +cleanuperror: + *tok = PDF_TOK_ERROR; + return fz_throw("lexical error"); +} diff --git a/contrib/media/updf_newlib/pdf/pdf_metrics.c b/contrib/media/updf_newlib/pdf/pdf_metrics.c new file mode 100755 index 000000000..2fc085dee --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_metrics.c @@ -0,0 +1,138 @@ +#include "fitz.h" +#include "mupdf.h" + +void +pdf_set_font_wmode(pdf_font_desc *font, int wmode) +{ + font->wmode = wmode; +} + +void +pdf_set_default_hmtx(pdf_font_desc *font, int w) +{ + font->dhmtx.w = w; +} + +void +pdf_set_default_vmtx(pdf_font_desc *font, int y, int w) +{ + font->dvmtx.y = y; + font->dvmtx.w = w; +} + +void +pdf_add_hmtx(pdf_font_desc *font, int lo, int hi, int w) +{ + if (font->hmtx_len + 1 >= font->hmtx_cap) + { + font->hmtx_cap = font->hmtx_cap + 16; + font->hmtx = fz_realloc(font->hmtx, font->hmtx_cap, sizeof(pdf_hmtx)); + } + + font->hmtx[font->hmtx_len].lo = lo; + font->hmtx[font->hmtx_len].hi = hi; + font->hmtx[font->hmtx_len].w = w; + font->hmtx_len++; +} + +void +pdf_add_vmtx(pdf_font_desc *font, int lo, int hi, int x, int y, int w) +{ + if (font->vmtx_len + 1 >= font->vmtx_cap) + { + font->vmtx_cap = font->vmtx_cap + 16; + font->vmtx = fz_realloc(font->vmtx, font->vmtx_cap, sizeof(pdf_vmtx)); + } + + font->vmtx[font->vmtx_len].lo = lo; + font->vmtx[font->vmtx_len].hi = hi; + font->vmtx[font->vmtx_len].x = x; + font->vmtx[font->vmtx_len].y = y; + font->vmtx[font->vmtx_len].w = w; + font->vmtx_len++; +} + +static int cmph(const void *a0, const void *b0) +{ + pdf_hmtx *a = (pdf_hmtx*)a0; + pdf_hmtx *b = (pdf_hmtx*)b0; + return a->lo - b->lo; +} + +static int cmpv(const void *a0, const void *b0) +{ + pdf_vmtx *a = (pdf_vmtx*)a0; + pdf_vmtx *b = (pdf_vmtx*)b0; + return a->lo - b->lo; +} + +void +pdf_end_hmtx(pdf_font_desc *font) +{ + if (!font->hmtx) + return; + qsort(font->hmtx, font->hmtx_len, sizeof(pdf_hmtx), cmph); +} + +void +pdf_end_vmtx(pdf_font_desc *font) +{ + if (!font->vmtx) + return; + qsort(font->vmtx, font->vmtx_len, sizeof(pdf_vmtx), cmpv); +} + +pdf_hmtx +pdf_get_hmtx(pdf_font_desc *font, int cid) +{ + int l = 0; + int r = font->hmtx_len - 1; + int m; + + if (!font->hmtx) + goto notfound; + + while (l <= r) + { + m = (l + r) >> 1; + if (cid < font->hmtx[m].lo) + r = m - 1; + else if (cid > font->hmtx[m].hi) + l = m + 1; + else + return font->hmtx[m]; + } + +notfound: + return font->dhmtx; +} + +pdf_vmtx +pdf_get_vmtx(pdf_font_desc *font, int cid) +{ + pdf_hmtx h; + pdf_vmtx v; + int l = 0; + int r = font->vmtx_len - 1; + int m; + + if (!font->vmtx) + goto notfound; + + while (l <= r) + { + m = (l + r) >> 1; + if (cid < font->vmtx[m].lo) + r = m - 1; + else if (cid > font->vmtx[m].hi) + l = m + 1; + else + return font->vmtx[m]; + } + +notfound: + h = pdf_get_hmtx(font, cid); + v = font->dvmtx; + v.x = h.w / 2; + return v; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_nametree.c b/contrib/media/updf_newlib/pdf/pdf_nametree.c new file mode 100755 index 000000000..e2b3e160a --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_nametree.c @@ -0,0 +1,139 @@ +#include "fitz.h" +#include "mupdf.h" + +static fz_obj * +pdf_lookup_name_imp(fz_obj *node, fz_obj *needle) +{ + fz_obj *kids = fz_dict_gets(node, "Kids"); + fz_obj *names = fz_dict_gets(node, "Names"); + + if (fz_is_array(kids)) + { + int l = 0; + int r = fz_array_len(kids) - 1; + + while (l <= r) + { + int m = (l + r) >> 1; + fz_obj *kid = fz_array_get(kids, m); + fz_obj *limits = fz_dict_gets(kid, "Limits"); + fz_obj *first = fz_array_get(limits, 0); + fz_obj *last = fz_array_get(limits, 1); + + if (fz_objcmp(needle, first) < 0) + r = m - 1; + else if (fz_objcmp(needle, last) > 0) + l = m + 1; + else + return pdf_lookup_name_imp(kid, needle); + } + } + + if (fz_is_array(names)) + { + int l = 0; + int r = (fz_array_len(names) / 2) - 1; + + while (l <= r) + { + int m = (l + r) >> 1; + int c; + fz_obj *key = fz_array_get(names, m * 2); + fz_obj *val = fz_array_get(names, m * 2 + 1); + + c = fz_objcmp(needle, key); + if (c < 0) + r = m - 1; + else if (c > 0) + l = m + 1; + else + return val; + } + } + + return NULL; +} + +fz_obj * +pdf_lookup_name(pdf_xref *xref, char *which, fz_obj *needle) +{ + fz_obj *root = fz_dict_gets(xref->trailer, "Root"); + fz_obj *names = fz_dict_gets(root, "Names"); + fz_obj *tree = fz_dict_gets(names, which); + return pdf_lookup_name_imp(tree, needle); +} + +fz_obj * +pdf_lookup_dest(pdf_xref *xref, fz_obj *needle) +{ + fz_obj *root = fz_dict_gets(xref->trailer, "Root"); + fz_obj *dests = fz_dict_gets(root, "Dests"); + fz_obj *names = fz_dict_gets(root, "Names"); + fz_obj *dest = NULL; + + /* PDF 1.1 has destinations in a dictionary */ + if (dests) + { + if (fz_is_name(needle)) + return fz_dict_get(dests, needle); + else + return fz_dict_gets(dests, fz_to_str_buf(needle)); + } + + /* PDF 1.2 has destinations in a name tree */ + if (names && !dest) + { + fz_obj *tree = fz_dict_gets(names, "Dests"); + return pdf_lookup_name_imp(tree, needle); + } + + return NULL; +} + +static void +pdf_load_name_tree_imp(fz_obj *dict, pdf_xref *xref, fz_obj *node) +{ + fz_obj *kids = fz_dict_gets(node, "Kids"); + fz_obj *names = fz_dict_gets(node, "Names"); + int i; + + if (kids) + { + for (i = 0; i < fz_array_len(kids); i++) + pdf_load_name_tree_imp(dict, xref, fz_array_get(kids, i)); + } + + if (names) + { + for (i = 0; i + 1 < fz_array_len(names); i += 2) + { + fz_obj *key = fz_array_get(names, i); + fz_obj *val = fz_array_get(names, i + 1); + if (fz_is_string(key)) + { + key = pdf_to_utf8_name(key); + fz_dict_put(dict, key, val); + fz_drop_obj(key); + } + else if (fz_is_name(key)) + { + fz_dict_put(dict, key, val); + } + } + } +} + +fz_obj * +pdf_load_name_tree(pdf_xref *xref, char *which) +{ + fz_obj *root = fz_dict_gets(xref->trailer, "Root"); + fz_obj *names = fz_dict_gets(root, "Names"); + fz_obj *tree = fz_dict_gets(names, which); + if (fz_is_dict(tree)) + { + fz_obj *dict = fz_new_dict(100); + pdf_load_name_tree_imp(dict, xref, tree); + return dict; + } + return NULL; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_outline.c b/contrib/media/updf_newlib/pdf/pdf_outline.c new file mode 100755 index 000000000..4f81bb9b3 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_outline.c @@ -0,0 +1,93 @@ +#include "fitz.h" +#include "mupdf.h" + +static pdf_outline * +pdf_load_outline_imp(pdf_xref *xref, fz_obj *dict) +{ + pdf_outline *node; + fz_obj *obj; + + if (fz_is_null(dict)) + return NULL; + + node = fz_malloc(sizeof(pdf_outline)); + node->title = NULL; + node->link = NULL; + node->child = NULL; + node->next = NULL; + node->count = 0; + + obj = fz_dict_gets(dict, "Title"); + if (obj) + node->title = pdf_to_utf8(obj); + + obj = fz_dict_gets(dict, "Count"); + if (obj) + node->count = fz_to_int(obj); + + if (fz_dict_gets(dict, "Dest") || fz_dict_gets(dict, "A")) + node->link = pdf_load_link(xref, dict); + + obj = fz_dict_gets(dict, "First"); + if (obj) + node->child = pdf_load_outline_imp(xref, obj); + + obj = fz_dict_gets(dict, "Next"); + if (obj) + node->next = pdf_load_outline_imp(xref, obj); + + return node; +} + +pdf_outline * +pdf_load_outline(pdf_xref *xref) +{ + fz_obj *root, *obj, *first; + + root = fz_dict_gets(xref->trailer, "Root"); + obj = fz_dict_gets(root, "Outlines"); + first = fz_dict_gets(obj, "First"); + if (first) + return pdf_load_outline_imp(xref, first); + + return NULL; +} + +void +pdf_free_outline(pdf_outline *outline) +{ + if (outline->child) + pdf_free_outline(outline->child); + if (outline->next) + pdf_free_outline(outline->next); + if (outline->link) + pdf_free_link(outline->link); + fz_free(outline->title); + fz_free(outline); +} + +void +pdf_debug_outline(pdf_outline *outline, int level) +{ + int i; + while (outline) + { + for (i = 0; i < level; i++) + putchar(' '); + + if (outline->title) + printf("%s ", outline->title); + else + printf(" "); + + if (outline->link) + fz_debug_obj(outline->link->dest); + else + printf("\n"); + + if (outline->child) + pdf_debug_outline(outline->child, level + 2); + + outline = outline->next; + } +} diff --git a/contrib/media/updf_newlib/pdf/pdf_page.c b/contrib/media/updf_newlib/pdf/pdf_page.c new file mode 100755 index 000000000..7837c4cf3 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_page.c @@ -0,0 +1,370 @@ +#include "fitz.h" +#include "mupdf.h" + +struct info +{ + fz_obj *resources; + fz_obj *mediabox; + fz_obj *cropbox; + fz_obj *rotate; +}; + +int +pdf_count_pages(pdf_xref *xref) +{ + return xref->page_len; +} + +int +pdf_find_page_number(pdf_xref *xref, fz_obj *page) +{ + int i, num = fz_to_num(page); + for (i = 0; i < xref->page_len; i++) + if (num == fz_to_num(xref->page_refs[i])) + return i; + return -1; +} + +static void +pdf_load_page_tree_node(pdf_xref *xref, fz_obj *node, struct info info) +{ + fz_obj *dict, *kids, *count; + fz_obj *obj, *tmp; + int i, n; + + /* prevent infinite recursion */ + if (fz_dict_gets(node, ".seen")) + return; + + kids = fz_dict_gets(node, "Kids"); + count = fz_dict_gets(node, "Count"); + + if (fz_is_array(kids) && fz_is_int(count)) + { + obj = fz_dict_gets(node, "Resources"); + if (obj) + info.resources = obj; + obj = fz_dict_gets(node, "MediaBox"); + if (obj) + info.mediabox = obj; + obj = fz_dict_gets(node, "CropBox"); + if (obj) + info.cropbox = obj; + obj = fz_dict_gets(node, "Rotate"); + if (obj) + info.rotate = obj; + + tmp = fz_new_null(); + fz_dict_puts(node, ".seen", tmp); + fz_drop_obj(tmp); + + n = fz_array_len(kids); + for (i = 0; i < n; i++) + { + obj = fz_array_get(kids, i); + pdf_load_page_tree_node(xref, obj, info); + } + + fz_dict_dels(node, ".seen"); + } + else + { + dict = fz_resolve_indirect(node); + + if (info.resources && !fz_dict_gets(dict, "Resources")) + fz_dict_puts(dict, "Resources", info.resources); + if (info.mediabox && !fz_dict_gets(dict, "MediaBox")) + fz_dict_puts(dict, "MediaBox", info.mediabox); + if (info.cropbox && !fz_dict_gets(dict, "CropBox")) + fz_dict_puts(dict, "CropBox", info.cropbox); + if (info.rotate && !fz_dict_gets(dict, "Rotate")) + fz_dict_puts(dict, "Rotate", info.rotate); + + if (xref->page_len == xref->page_cap) + { + fz_warn("found more pages than expected"); + xref->page_cap ++; + xref->page_refs = fz_realloc(xref->page_refs, xref->page_cap, sizeof(fz_obj*)); + xref->page_objs = fz_realloc(xref->page_objs, xref->page_cap, sizeof(fz_obj*)); + } + + xref->page_refs[xref->page_len] = fz_keep_obj(node); + xref->page_objs[xref->page_len] = fz_keep_obj(dict); + xref->page_len ++; + } +} + +fz_error +pdf_load_page_tree(pdf_xref *xref) +{ + struct info info; + fz_obj *catalog = fz_dict_gets(xref->trailer, "Root"); + fz_obj *pages = fz_dict_gets(catalog, "Pages"); + fz_obj *count = fz_dict_gets(pages, "Count"); + + if (!fz_is_dict(pages)) + return fz_throw("missing page tree"); + if (!fz_is_int(count)) + return fz_throw("missing page count"); + + xref->page_cap = fz_to_int(count); + xref->page_len = 0; + xref->page_refs = fz_calloc(xref->page_cap, sizeof(fz_obj*)); + xref->page_objs = fz_calloc(xref->page_cap, sizeof(fz_obj*)); + + info.resources = NULL; + info.mediabox = NULL; + info.cropbox = NULL; + info.rotate = NULL; + + pdf_load_page_tree_node(xref, pages, info); + + return fz_okay; +} + +/* We need to know whether to install a page-level transparency group */ + +static int pdf_resources_use_blending(fz_obj *rdb); + +static int +pdf_extgstate_uses_blending(fz_obj *dict) +{ + fz_obj *obj = fz_dict_gets(dict, "BM"); + if (fz_is_name(obj) && strcmp(fz_to_name(obj), "Normal")) + return 1; + return 0; +} + +static int +pdf_pattern_uses_blending(fz_obj *dict) +{ + fz_obj *obj; + obj = fz_dict_gets(dict, "Resources"); + if (pdf_resources_use_blending(obj)) + return 1; + obj = fz_dict_gets(dict, "ExtGState"); + if (pdf_extgstate_uses_blending(obj)) + return 1; + return 0; +} + +static int +pdf_xobject_uses_blending(fz_obj *dict) +{ + fz_obj *obj = fz_dict_gets(dict, "Resources"); + if (pdf_resources_use_blending(obj)) + return 1; + return 0; +} + +static int +pdf_resources_use_blending(fz_obj *rdb) +{ + fz_obj *dict; + fz_obj *tmp; + int i; + + if (!rdb) + return 0; + + /* stop on cyclic resource dependencies */ + if (fz_dict_gets(rdb, ".useBM")) + return fz_to_bool(fz_dict_gets(rdb, ".useBM")); + + tmp = fz_new_bool(0); + fz_dict_puts(rdb, ".useBM", tmp); + fz_drop_obj(tmp); + + dict = fz_dict_gets(rdb, "ExtGState"); + for (i = 0; i < fz_dict_len(dict); i++) + if (pdf_extgstate_uses_blending(fz_dict_get_val(dict, i))) + goto found; + + dict = fz_dict_gets(rdb, "Pattern"); + for (i = 0; i < fz_dict_len(dict); i++) + if (pdf_pattern_uses_blending(fz_dict_get_val(dict, i))) + goto found; + + dict = fz_dict_gets(rdb, "XObject"); + for (i = 0; i < fz_dict_len(dict); i++) + if (pdf_xobject_uses_blending(fz_dict_get_val(dict, i))) + goto found; + + return 0; + +found: + tmp = fz_new_bool(1); + fz_dict_puts(rdb, ".useBM", tmp); + fz_drop_obj(tmp); + return 1; +} + +/* we need to combine all sub-streams into one for the content stream interpreter */ + +static fz_error +pdf_load_page_contents_array(fz_buffer **bigbufp, pdf_xref *xref, fz_obj *list) +{ + fz_error error; + fz_buffer *big; + fz_buffer *one; + int i, n; + + big = fz_new_buffer(32 * 1024); + + n = fz_array_len(list); + for (i = 0; i < n; i++) + { + fz_obj *stm = fz_array_get(list, i); + error = pdf_load_stream(&one, xref, fz_to_num(stm), fz_to_gen(stm)); + if (error) + { + fz_catch(error, "cannot load content stream part %d/%d", i + 1, n); + continue; + } + + if (big->len + one->len + 1 > big->cap) + fz_resize_buffer(big, big->len + one->len + 1); + memcpy(big->data + big->len, one->data, one->len); + big->data[big->len + one->len] = ' '; + big->len += one->len + 1; + + fz_drop_buffer(one); + } + + if (n > 0 && big->len == 0) + { + fz_drop_buffer(big); + return fz_throw("cannot load content stream"); + } + + *bigbufp = big; + return fz_okay; +} + +static fz_error +pdf_load_page_contents(fz_buffer **bufp, pdf_xref *xref, fz_obj *obj) +{ + fz_error error; + + if (fz_is_array(obj)) + { + error = pdf_load_page_contents_array(bufp, xref, obj); + if (error) + return fz_rethrow(error, "cannot load content stream array"); + } + else if (pdf_is_stream(xref, fz_to_num(obj), fz_to_gen(obj))) + { + error = pdf_load_stream(bufp, xref, fz_to_num(obj), fz_to_gen(obj)); + if (error) + return fz_rethrow(error, "cannot load content stream (%d 0 R)", fz_to_num(obj)); + } + else + { + fz_warn("page contents missing, leaving page blank"); + *bufp = fz_new_buffer(0); + } + + return fz_okay; +} + +fz_error +pdf_load_page(pdf_page **pagep, pdf_xref *xref, int number) +{ + fz_error error; + pdf_page *page; + pdf_annot *annot; + fz_obj *pageobj, *pageref; + fz_obj *obj; + fz_bbox bbox; + + if (number < 0 || number >= xref->page_len) + return fz_throw("cannot find page %d", number + 1); + + /* Ensure that we have a store for resource objects */ + if (!xref->store) + xref->store = pdf_new_store(); + + pageobj = xref->page_objs[number]; + pageref = xref->page_refs[number]; + + page = fz_malloc(sizeof(pdf_page)); + page->resources = NULL; + page->contents = NULL; + page->transparency = 0; + page->links = NULL; + page->annots = NULL; + + obj = fz_dict_gets(pageobj, "MediaBox"); + bbox = fz_round_rect(pdf_to_rect(obj)); + if (fz_is_empty_rect(pdf_to_rect(obj))) + { + fz_warn("cannot find page size for page %d", number + 1); + bbox.x0 = 0; + bbox.y0 = 0; + bbox.x1 = 612; + bbox.y1 = 792; + } + + obj = fz_dict_gets(pageobj, "CropBox"); + if (fz_is_array(obj)) + { + fz_bbox cropbox = fz_round_rect(pdf_to_rect(obj)); + bbox = fz_intersect_bbox(bbox, cropbox); + } + + page->mediabox.x0 = MIN(bbox.x0, bbox.x1); + page->mediabox.y0 = MIN(bbox.y0, bbox.y1); + page->mediabox.x1 = MAX(bbox.x0, bbox.x1); + page->mediabox.y1 = MAX(bbox.y0, bbox.y1); + + if (page->mediabox.x1 - page->mediabox.x0 < 1 || page->mediabox.y1 - page->mediabox.y0 < 1) + { + fz_warn("invalid page size in page %d", number + 1); + page->mediabox = fz_unit_rect; + } + + page->rotate = fz_to_int(fz_dict_gets(pageobj, "Rotate")); + + obj = fz_dict_gets(pageobj, "Annots"); + if (obj) + { + pdf_load_links(&page->links, xref, obj); + pdf_load_annots(&page->annots, xref, obj); + } + + page->resources = fz_dict_gets(pageobj, "Resources"); + if (page->resources) + fz_keep_obj(page->resources); + + obj = fz_dict_gets(pageobj, "Contents"); + error = pdf_load_page_contents(&page->contents, xref, obj); + if (error) + { + pdf_free_page(page); + return fz_rethrow(error, "cannot load page %d contents (%d 0 R)", number + 1, fz_to_num(pageref)); + } + + if (pdf_resources_use_blending(page->resources)) + page->transparency = 1; + + for (annot = page->annots; annot && !page->transparency; annot = annot->next) + if (pdf_resources_use_blending(annot->ap->resources)) + page->transparency = 1; + + *pagep = page; + return fz_okay; +} + +void +pdf_free_page(pdf_page *page) +{ + if (page->resources) + fz_drop_obj(page->resources); + if (page->contents) + fz_drop_buffer(page->contents); + if (page->links) + pdf_free_link(page->links); + if (page->annots) + pdf_free_annot(page->annots); + fz_free(page); +} diff --git a/contrib/media/updf_newlib/pdf/pdf_parse.c b/contrib/media/updf_newlib/pdf/pdf_parse.c new file mode 100755 index 000000000..d6497bc41 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_parse.c @@ -0,0 +1,581 @@ +#include "fitz.h" +#include "mupdf.h" + +fz_rect +pdf_to_rect(fz_obj *array) +{ + fz_rect r; + float a = fz_to_real(fz_array_get(array, 0)); + float b = fz_to_real(fz_array_get(array, 1)); + float c = fz_to_real(fz_array_get(array, 2)); + float d = fz_to_real(fz_array_get(array, 3)); + r.x0 = MIN(a, c); + r.y0 = MIN(b, d); + r.x1 = MAX(a, c); + r.y1 = MAX(b, d); + return r; +} + +fz_matrix +pdf_to_matrix(fz_obj *array) +{ + fz_matrix m; + m.a = fz_to_real(fz_array_get(array, 0)); + m.b = fz_to_real(fz_array_get(array, 1)); + m.c = fz_to_real(fz_array_get(array, 2)); + m.d = fz_to_real(fz_array_get(array, 3)); + m.e = fz_to_real(fz_array_get(array, 4)); + m.f = fz_to_real(fz_array_get(array, 5)); + return m; +} + +/* Convert Unicode/PdfDocEncoding string into utf-8 */ +char * +pdf_to_utf8(fz_obj *src) +{ + unsigned char *srcptr = (unsigned char *) fz_to_str_buf(src); + char *dstptr, *dst; + int srclen = fz_to_str_len(src); + int dstlen = 0; + int ucs; + int i; + + if (srclen > 2 && srcptr[0] == 254 && srcptr[1] == 255) + { + for (i = 2; i < srclen; i += 2) + { + ucs = (srcptr[i] << 8) | srcptr[i+1]; + dstlen += runelen(ucs); + } + + dstptr = dst = fz_malloc(dstlen + 1); + + for (i = 2; i < srclen; i += 2) + { + ucs = (srcptr[i] << 8) | srcptr[i+1]; + dstptr += runetochar(dstptr, &ucs); + } + } + + else + { + for (i = 0; i < srclen; i++) + dstlen += runelen(pdf_doc_encoding[srcptr[i]]); + + dstptr = dst = fz_malloc(dstlen + 1); + + for (i = 0; i < srclen; i++) + { + ucs = pdf_doc_encoding[srcptr[i]]; + dstptr += runetochar(dstptr, &ucs); + } + } + + *dstptr = '\0'; + return dst; +} + +/* Convert Unicode/PdfDocEncoding string into ucs-2 */ +unsigned short * +pdf_to_ucs2(fz_obj *src) +{ + unsigned char *srcptr = (unsigned char *) fz_to_str_buf(src); + unsigned short *dstptr, *dst; + int srclen = fz_to_str_len(src); + int i; + + if (srclen > 2 && srcptr[0] == 254 && srcptr[1] == 255) + { + dstptr = dst = fz_calloc((srclen - 2) / 2 + 1, sizeof(short)); + for (i = 2; i < srclen; i += 2) + *dstptr++ = (srcptr[i] << 8) | srcptr[i+1]; + } + + else + { + dstptr = dst = fz_calloc(srclen + 1, sizeof(short)); + for (i = 0; i < srclen; i++) + *dstptr++ = pdf_doc_encoding[srcptr[i]]; + } + + *dstptr = '\0'; + return dst; +} + +/* Convert UCS-2 string into PdfDocEncoding for authentication */ +char * +pdf_from_ucs2(unsigned short *src) +{ + int i, j, len; + char *docstr; + + len = 0; + while (src[len]) + len++; + + docstr = fz_malloc(len + 1); + + for (i = 0; i < len; i++) + { + /* shortcut: check if the character has the same code point in both encodings */ + if (0 < src[i] && src[i] < 256 && pdf_doc_encoding[src[i]] == src[i]) { + docstr[i] = src[i]; + continue; + } + + /* search through pdf_docencoding for the character's code point */ + for (j = 0; j < 256; j++) + if (pdf_doc_encoding[j] == src[i]) + break; + docstr[i] = j; + + /* fail, if a character can't be encoded */ + if (!docstr[i]) + { + fz_free(docstr); + return NULL; + } + } + docstr[len] = '\0'; + + return docstr; +} + +fz_obj * +pdf_to_utf8_name(fz_obj *src) +{ + char *buf = pdf_to_utf8(src); + fz_obj *dst = fz_new_name(buf); + fz_free(buf); + return dst; +} + +fz_error +pdf_parse_array(fz_obj **op, pdf_xref *xref, fz_stream *file, char *buf, int cap) +{ + fz_error error = fz_okay; + fz_obj *ary = NULL; + fz_obj *obj = NULL; + int a = 0, b = 0, n = 0; + int tok; + int len; + + ary = fz_new_array(4); + + while (1) + { + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + { + fz_drop_obj(ary); + return fz_rethrow(error, "cannot parse array"); + } + + if (tok != PDF_TOK_INT && tok != PDF_TOK_R) + { + if (n > 0) + { + obj = fz_new_int(a); + fz_array_push(ary, obj); + fz_drop_obj(obj); + } + if (n > 1) + { + obj = fz_new_int(b); + fz_array_push(ary, obj); + fz_drop_obj(obj); + } + n = 0; + } + + if (tok == PDF_TOK_INT && n == 2) + { + obj = fz_new_int(a); + fz_array_push(ary, obj); + fz_drop_obj(obj); + a = b; + n --; + } + + switch (tok) + { + case PDF_TOK_CLOSE_ARRAY: + *op = ary; + return fz_okay; + + case PDF_TOK_INT: + if (n == 0) + a = atoi(buf); + if (n == 1) + b = atoi(buf); + n ++; + break; + + case PDF_TOK_R: + if (n != 2) + { + fz_drop_obj(ary); + return fz_throw("cannot parse indirect reference in array"); + } + obj = fz_new_indirect(a, b, xref); + fz_array_push(ary, obj); + fz_drop_obj(obj); + n = 0; + break; + + case PDF_TOK_OPEN_ARRAY: + error = pdf_parse_array(&obj, xref, file, buf, cap); + if (error) + { + fz_drop_obj(ary); + return fz_rethrow(error, "cannot parse array"); + } + fz_array_push(ary, obj); + fz_drop_obj(obj); + break; + + case PDF_TOK_OPEN_DICT: + error = pdf_parse_dict(&obj, xref, file, buf, cap); + if (error) + { + fz_drop_obj(ary); + return fz_rethrow(error, "cannot parse array"); + } + fz_array_push(ary, obj); + fz_drop_obj(obj); + break; + + case PDF_TOK_NAME: + obj = fz_new_name(buf); + fz_array_push(ary, obj); + fz_drop_obj(obj); + break; + case PDF_TOK_REAL: + obj = fz_new_real(fz_atof(buf)); + fz_array_push(ary, obj); + fz_drop_obj(obj); + break; + case PDF_TOK_STRING: + obj = fz_new_string(buf, len); + fz_array_push(ary, obj); + fz_drop_obj(obj); + break; + case PDF_TOK_TRUE: + obj = fz_new_bool(1); + fz_array_push(ary, obj); + fz_drop_obj(obj); + break; + case PDF_TOK_FALSE: + obj = fz_new_bool(0); + fz_array_push(ary, obj); + fz_drop_obj(obj); + break; + case PDF_TOK_NULL: + obj = fz_new_null(); + fz_array_push(ary, obj); + fz_drop_obj(obj); + break; + + default: + fz_drop_obj(ary); + return fz_throw("cannot parse token in array"); + } + } +} + +fz_error +pdf_parse_dict(fz_obj **op, pdf_xref *xref, fz_stream *file, char *buf, int cap) +{ + fz_error error = fz_okay; + fz_obj *dict = NULL; + fz_obj *key = NULL; + fz_obj *val = NULL; + int tok; + int len; + int a, b; + + dict = fz_new_dict(8); + + while (1) + { + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + { + fz_drop_obj(dict); + return fz_rethrow(error, "cannot parse dict"); + } + +skip: + if (tok == PDF_TOK_CLOSE_DICT) + { + *op = dict; + return fz_okay; + } + + /* for BI .. ID .. EI in content streams */ + if (tok == PDF_TOK_KEYWORD && !strcmp(buf, "ID")) + { + *op = dict; + return fz_okay; + } + + if (tok != PDF_TOK_NAME) + { + fz_drop_obj(dict); + return fz_throw("invalid key in dict"); + } + + key = fz_new_name(buf); + + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + { + fz_drop_obj(key); + fz_drop_obj(dict); + return fz_rethrow(error, "cannot parse dict"); + } + + switch (tok) + { + case PDF_TOK_OPEN_ARRAY: + error = pdf_parse_array(&val, xref, file, buf, cap); + if (error) + { + fz_drop_obj(key); + fz_drop_obj(dict); + return fz_rethrow(error, "cannot parse dict"); + } + break; + + case PDF_TOK_OPEN_DICT: + error = pdf_parse_dict(&val, xref, file, buf, cap); + if (error) + { + fz_drop_obj(key); + fz_drop_obj(dict); + return fz_rethrow(error, "cannot parse dict"); + } + break; + + case PDF_TOK_NAME: val = fz_new_name(buf); break; + case PDF_TOK_REAL: val = fz_new_real(fz_atof(buf)); break; + case PDF_TOK_STRING: val = fz_new_string(buf, len); break; + case PDF_TOK_TRUE: val = fz_new_bool(1); break; + case PDF_TOK_FALSE: val = fz_new_bool(0); break; + case PDF_TOK_NULL: val = fz_new_null(); break; + + case PDF_TOK_INT: + /* 64-bit to allow for numbers > INT_MAX and overflow */ + a = (int) strtoll(buf, 0, 10); + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + { + fz_drop_obj(key); + fz_drop_obj(dict); + return fz_rethrow(error, "cannot parse dict"); + } + if (tok == PDF_TOK_CLOSE_DICT || tok == PDF_TOK_NAME || + (tok == PDF_TOK_KEYWORD && !strcmp(buf, "ID"))) + { + val = fz_new_int(a); + fz_dict_put(dict, key, val); + fz_drop_obj(val); + fz_drop_obj(key); + goto skip; + } + if (tok == PDF_TOK_INT) + { + b = atoi(buf); + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + { + fz_drop_obj(key); + fz_drop_obj(dict); + return fz_rethrow(error, "cannot parse dict"); + } + if (tok == PDF_TOK_R) + { + val = fz_new_indirect(a, b, xref); + break; + } + } + fz_drop_obj(key); + fz_drop_obj(dict); + return fz_throw("invalid indirect reference in dict"); + + default: + fz_drop_obj(key); + fz_drop_obj(dict); + return fz_throw("unknown token in dict"); + } + + fz_dict_put(dict, key, val); + fz_drop_obj(val); + fz_drop_obj(key); + } +} + +fz_error +pdf_parse_stm_obj(fz_obj **op, pdf_xref *xref, fz_stream *file, char *buf, int cap) +{ + fz_error error; + int tok; + int len; + + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + return fz_rethrow(error, "cannot parse token in object stream"); + + switch (tok) + { + case PDF_TOK_OPEN_ARRAY: + error = pdf_parse_array(op, xref, file, buf, cap); + if (error) + return fz_rethrow(error, "cannot parse object stream"); + break; + case PDF_TOK_OPEN_DICT: + error = pdf_parse_dict(op, xref, file, buf, cap); + if (error) + return fz_rethrow(error, "cannot parse object stream"); + break; + case PDF_TOK_NAME: *op = fz_new_name(buf); break; + case PDF_TOK_REAL: *op = fz_new_real(fz_atof(buf)); break; + case PDF_TOK_STRING: *op = fz_new_string(buf, len); break; + case PDF_TOK_TRUE: *op = fz_new_bool(1); break; + case PDF_TOK_FALSE: *op = fz_new_bool(0); break; + case PDF_TOK_NULL: *op = fz_new_null(); break; + case PDF_TOK_INT: *op = fz_new_int(atoi(buf)); break; + default: return fz_throw("unknown token in object stream"); + } + + return fz_okay; +} + +fz_error +pdf_parse_ind_obj(fz_obj **op, pdf_xref *xref, + fz_stream *file, char *buf, int cap, + int *onum, int *ogen, int *ostmofs) +{ + fz_error error = fz_okay; + fz_obj *obj = NULL; + int num = 0, gen = 0, stm_ofs; + int tok; + int len; + int a, b; + + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen); + if (tok != PDF_TOK_INT) + return fz_throw("expected object number (%d %d R)", num, gen); + num = atoi(buf); + + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen); + if (tok != PDF_TOK_INT) + return fz_throw("expected generation number (%d %d R)", num, gen); + gen = atoi(buf); + + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen); + if (tok != PDF_TOK_OBJ) + return fz_throw("expected 'obj' keyword (%d %d R)", num, gen); + + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen); + + switch (tok) + { + case PDF_TOK_OPEN_ARRAY: + error = pdf_parse_array(&obj, xref, file, buf, cap); + if (error) + return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen); + break; + + case PDF_TOK_OPEN_DICT: + error = pdf_parse_dict(&obj, xref, file, buf, cap); + if (error) + return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen); + break; + + case PDF_TOK_NAME: obj = fz_new_name(buf); break; + case PDF_TOK_REAL: obj = fz_new_real(fz_atof(buf)); break; + case PDF_TOK_STRING: obj = fz_new_string(buf, len); break; + case PDF_TOK_TRUE: obj = fz_new_bool(1); break; + case PDF_TOK_FALSE: obj = fz_new_bool(0); break; + case PDF_TOK_NULL: obj = fz_new_null(); break; + + case PDF_TOK_INT: + a = atoi(buf); + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen); + if (tok == PDF_TOK_STREAM || tok == PDF_TOK_ENDOBJ) + { + obj = fz_new_int(a); + goto skip; + } + if (tok == PDF_TOK_INT) + { + b = atoi(buf); + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen); + if (tok == PDF_TOK_R) + { + obj = fz_new_indirect(a, b, xref); + break; + } + } + return fz_throw("expected 'R' keyword (%d %d R)", num, gen); + + case PDF_TOK_ENDOBJ: + obj = fz_new_null(); + goto skip; + + default: + return fz_throw("syntax error in object (%d %d R)", num, gen); + } + + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + { + fz_drop_obj(obj); + return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen); + } + +skip: + if (tok == PDF_TOK_STREAM) + { + int c = fz_read_byte(file); + while (c == ' ') + c = fz_read_byte(file); + if (c == '\r') + { + c = fz_peek_byte(file); + if (c != '\n') + fz_warn("line feed missing after stream begin marker (%d %d R)", num, gen); + else + fz_read_byte(file); + } + stm_ofs = fz_tell(file); + } + else if (tok == PDF_TOK_ENDOBJ) + { + stm_ofs = 0; + } + else + { + fz_warn("expected 'endobj' or 'stream' keyword (%d %d R)", num, gen); + stm_ofs = 0; + } + + if (onum) *onum = num; + if (ogen) *ogen = gen; + if (ostmofs) *ostmofs = stm_ofs; + *op = obj; + return fz_okay; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_pattern.c b/contrib/media/updf_newlib/pdf/pdf_pattern.c new file mode 100755 index 000000000..33d84c99c --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_pattern.c @@ -0,0 +1,72 @@ +#include "fitz.h" +#include "mupdf.h" + +fz_error +pdf_load_pattern(pdf_pattern **patp, pdf_xref *xref, fz_obj *dict) +{ + fz_error error; + pdf_pattern *pat; + fz_obj *obj; + + if ((*patp = pdf_find_item(xref->store, pdf_drop_pattern, dict))) + { + pdf_keep_pattern(*patp); + return fz_okay; + } + + pat = fz_malloc(sizeof(pdf_pattern)); + pat->refs = 1; + pat->resources = NULL; + pat->contents = NULL; + + /* Store pattern now, to avoid possible recursion if objects refer back to this one */ + pdf_store_item(xref->store, pdf_keep_pattern, pdf_drop_pattern, dict, pat); + + pat->ismask = fz_to_int(fz_dict_gets(dict, "PaintType")) == 2; + pat->xstep = fz_to_real(fz_dict_gets(dict, "XStep")); + pat->ystep = fz_to_real(fz_dict_gets(dict, "YStep")); + + obj = fz_dict_gets(dict, "BBox"); + pat->bbox = pdf_to_rect(obj); + + obj = fz_dict_gets(dict, "Matrix"); + if (obj) + pat->matrix = pdf_to_matrix(obj); + else + pat->matrix = fz_identity; + + pat->resources = fz_dict_gets(dict, "Resources"); + if (pat->resources) + fz_keep_obj(pat->resources); + + error = pdf_load_stream(&pat->contents, xref, fz_to_num(dict), fz_to_gen(dict)); + if (error) + { + pdf_remove_item(xref->store, pdf_drop_pattern, dict); + pdf_drop_pattern(pat); + return fz_rethrow(error, "cannot load pattern stream (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + } + + *patp = pat; + return fz_okay; +} + +pdf_pattern * +pdf_keep_pattern(pdf_pattern *pat) +{ + pat->refs ++; + return pat; +} + +void +pdf_drop_pattern(pdf_pattern *pat) +{ + if (pat && --pat->refs == 0) + { + if (pat->resources) + fz_drop_obj(pat->resources); + if (pat->contents) + fz_drop_buffer(pat->contents); + fz_free(pat); + } +} diff --git a/contrib/media/updf_newlib/pdf/pdf_repair.c b/contrib/media/updf_newlib/pdf/pdf_repair.c new file mode 100755 index 000000000..067fe2cf7 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_repair.c @@ -0,0 +1,463 @@ +#include "fitz.h" +#include "mupdf.h" + +/* Scan file for objects and reconstruct xref table */ + +struct entry +{ + int num; + int gen; + int ofs; + int stm_ofs; + int stm_len; +}; + +static fz_error +pdf_repair_obj(fz_stream *file, char *buf, int cap, int *stmofsp, int *stmlenp, fz_obj **encrypt, fz_obj **id) +{ + fz_error error; + int tok; + int stm_len; + int len; + int n; + + *stmofsp = 0; + *stmlenp = -1; + + stm_len = 0; + + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + return fz_rethrow(error, "cannot parse object"); + if (tok == PDF_TOK_OPEN_DICT) + { + fz_obj *dict, *obj; + + /* Send NULL xref so we don't try to resolve references */ + error = pdf_parse_dict(&dict, NULL, file, buf, cap); + if (error) + return fz_rethrow(error, "cannot parse object"); + + obj = fz_dict_gets(dict, "Type"); + if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "XRef")) + { + obj = fz_dict_gets(dict, "Encrypt"); + if (obj) + { + if (*encrypt) + fz_drop_obj(*encrypt); + *encrypt = fz_keep_obj(obj); + } + + obj = fz_dict_gets(dict, "ID"); + if (obj) + { + if (*id) + fz_drop_obj(*id); + *id = fz_keep_obj(obj); + } + } + + obj = fz_dict_gets(dict, "Length"); + if (fz_is_int(obj)) + stm_len = fz_to_int(obj); + + fz_drop_obj(dict); + } + + while ( tok != PDF_TOK_STREAM && + tok != PDF_TOK_ENDOBJ && + tok != PDF_TOK_ERROR && + tok != PDF_TOK_EOF ) + { + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + return fz_rethrow(error, "cannot scan for endobj or stream token"); + } + + if (tok == PDF_TOK_STREAM) + { + int c = fz_read_byte(file); + if (c == '\r') { + c = fz_peek_byte(file); + if (c == '\n') + fz_read_byte(file); + } + + *stmofsp = fz_tell(file); + if (*stmofsp < 0) + return fz_throw("cannot seek in file"); + + if (stm_len > 0) + { + fz_seek(file, *stmofsp + stm_len, 0); + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + fz_catch(error, "cannot find endstream token, falling back to scanning"); + if (tok == PDF_TOK_ENDSTREAM) + goto atobjend; + fz_seek(file, *stmofsp, 0); + } + + n = fz_read(file, (unsigned char *) buf, 9); + if (n < 0) + return fz_rethrow(n, "cannot read from file"); + + while (memcmp(buf, "endstream", 9) != 0) + { + c = fz_read_byte(file); + if (c == EOF) + break; + memmove(buf, buf + 1, 8); + buf[8] = c; + } + + *stmlenp = fz_tell(file) - *stmofsp - 9; + +atobjend: + error = pdf_lex(&tok, file, buf, cap, &len); + if (error) + return fz_rethrow(error, "cannot scan for endobj token"); + if (tok != PDF_TOK_ENDOBJ) + fz_warn("object missing 'endobj' token"); + } + + return fz_okay; +} + +static fz_error +pdf_repair_obj_stm(pdf_xref *xref, int num, int gen) +{ + fz_error error; + fz_obj *obj; + fz_stream *stm; + int tok; + int i, n, count; + char buf[256]; + + error = pdf_load_object(&obj, xref, num, gen); + if (error) + return fz_rethrow(error, "cannot load object stream object (%d %d R)", num, gen); + + count = fz_to_int(fz_dict_gets(obj, "N")); + + fz_drop_obj(obj); + + error = pdf_open_stream(&stm, xref, num, gen); + if (error) + return fz_rethrow(error, "cannot open object stream object (%d %d R)", num, gen); + + for (i = 0; i < count; i++) + { + error = pdf_lex(&tok, stm, buf, sizeof buf, &n); + if (error || tok != PDF_TOK_INT) + { + fz_close(stm); + return fz_rethrow(error, "corrupt object stream (%d %d R)", num, gen); + } + + n = atoi(buf); + if (n >= xref->len) + pdf_resize_xref(xref, n + 1); + + xref->table[n].ofs = num; + xref->table[n].gen = i; + xref->table[n].stm_ofs = 0; + xref->table[n].obj = NULL; + xref->table[n].type = 'o'; + + error = pdf_lex(&tok, stm, buf, sizeof buf, &n); + if (error || tok != PDF_TOK_INT) + { + fz_close(stm); + return fz_rethrow(error, "corrupt object stream (%d %d R)", num, gen); + } + } + + fz_close(stm); + return fz_okay; +} + +fz_error +pdf_repair_xref(pdf_xref *xref, char *buf, int bufsize) +{ + fz_error error; + fz_obj *dict, *obj; + fz_obj *length; + + fz_obj *encrypt = NULL; + fz_obj *id = NULL; + fz_obj *root = NULL; + fz_obj *info = NULL; + + struct entry *list = NULL; + int listlen; + int listcap; + int maxnum = 0; + + int num = 0; + int gen = 0; + int tmpofs, numofs = 0, genofs = 0; + int stm_len, stm_ofs = 0; + int tok; + int next; + int i, n, c; + + fz_seek(xref->file, 0, 0); + + listlen = 0; + listcap = 1024; + list = fz_calloc(listcap, sizeof(struct entry)); + + /* look for '%PDF' version marker within first kilobyte of file */ + n = fz_read(xref->file, (unsigned char *)buf, MAX(bufsize, 1024)); + if (n < 0) + { + error = fz_rethrow(n, "cannot read from file"); + goto cleanup; + } + + fz_seek(xref->file, 0, 0); + for (i = 0; i < n - 4; i++) + { + if (memcmp(buf + i, "%PDF", 4) == 0) + { + fz_seek(xref->file, i + 8, 0); /* skip "%PDF-X.Y" */ + break; + } + } + + /* skip comment line after version marker since some generators + * forget to terminate the comment with a newline */ + c = fz_read_byte(xref->file); + while (c >= 0 && (c == ' ' || c == '%')) + c = fz_read_byte(xref->file); + fz_unread_byte(xref->file); + + while (1) + { + tmpofs = fz_tell(xref->file); + if (tmpofs < 0) + { + error = fz_throw("cannot tell in file"); + goto cleanup; + } + + error = pdf_lex(&tok, xref->file, buf, bufsize, &n); + if (error) + { + fz_catch(error, "ignoring the rest of the file"); + break; + } + + if (tok == PDF_TOK_INT) + { + numofs = genofs; + num = gen; + genofs = tmpofs; + gen = atoi(buf); + } + + else if (tok == PDF_TOK_OBJ) + { + error = pdf_repair_obj(xref->file, buf, bufsize, &stm_ofs, &stm_len, &encrypt, &id); + if (error) + { + error = fz_rethrow(error, "cannot parse object (%d %d R)", num, gen); + goto cleanup; + } + + if (listlen + 1 == listcap) + { + listcap = (listcap * 3) / 2; + list = fz_realloc(list, listcap, sizeof(struct entry)); + } + + list[listlen].num = num; + list[listlen].gen = gen; + list[listlen].ofs = numofs; + list[listlen].stm_ofs = stm_ofs; + list[listlen].stm_len = stm_len; + listlen ++; + + if (num > maxnum) + maxnum = num; + } + + /* trailer dictionary */ + else if (tok == PDF_TOK_OPEN_DICT) + { + error = pdf_parse_dict(&dict, xref, xref->file, buf, bufsize); + if (error) + { + error = fz_rethrow(error, "cannot parse object"); + goto cleanup; + } + + obj = fz_dict_gets(dict, "Encrypt"); + if (obj) + { + if (encrypt) + fz_drop_obj(encrypt); + encrypt = fz_keep_obj(obj); + } + + obj = fz_dict_gets(dict, "ID"); + if (obj) + { + if (id) + fz_drop_obj(id); + id = fz_keep_obj(obj); + } + + obj = fz_dict_gets(dict, "Root"); + if (obj) + { + if (root) + fz_drop_obj(root); + root = fz_keep_obj(obj); + } + + obj = fz_dict_gets(dict, "Info"); + if (obj) + { + if (info) + fz_drop_obj(info); + info = fz_keep_obj(obj); + } + + fz_drop_obj(dict); + } + + else if (tok == PDF_TOK_ERROR) + fz_read_byte(xref->file); + + else if (tok == PDF_TOK_EOF) + break; + } + + /* make xref reasonable */ + + pdf_resize_xref(xref, maxnum + 1); + + for (i = 0; i < listlen; i++) + { + xref->table[list[i].num].type = 'n'; + xref->table[list[i].num].ofs = list[i].ofs; + xref->table[list[i].num].gen = list[i].gen; + + xref->table[list[i].num].stm_ofs = list[i].stm_ofs; + + /* corrected stream length */ + if (list[i].stm_len >= 0) + { + error = pdf_load_object(&dict, xref, list[i].num, list[i].gen); + if (error) + { + error = fz_rethrow(error, "cannot load stream object (%d %d R)", list[i].num, list[i].gen); + goto cleanup; + } + + length = fz_new_int(list[i].stm_len); + fz_dict_puts(dict, "Length", length); + fz_drop_obj(length); + + fz_drop_obj(dict); + } + + } + + xref->table[0].type = 'f'; + xref->table[0].ofs = 0; + xref->table[0].gen = 65535; + xref->table[0].stm_ofs = 0; + xref->table[0].obj = NULL; + + next = 0; + for (i = xref->len - 1; i >= 0; i--) + { + if (xref->table[i].type == 'f') + { + xref->table[i].ofs = next; + if (xref->table[i].gen < 65535) + xref->table[i].gen ++; + next = i; + } + } + + /* create a repaired trailer, Root will be added later */ + + xref->trailer = fz_new_dict(5); + + obj = fz_new_int(maxnum + 1); + fz_dict_puts(xref->trailer, "Size", obj); + fz_drop_obj(obj); + + if (root) + { + fz_dict_puts(xref->trailer, "Root", root); + fz_drop_obj(root); + } + if (info) + { + fz_dict_puts(xref->trailer, "Info", info); + fz_drop_obj(info); + } + + if (encrypt) + { + if (fz_is_indirect(encrypt)) + { + /* create new reference with non-NULL xref pointer */ + obj = fz_new_indirect(fz_to_num(encrypt), fz_to_gen(encrypt), xref); + fz_drop_obj(encrypt); + encrypt = obj; + } + fz_dict_puts(xref->trailer, "Encrypt", encrypt); + fz_drop_obj(encrypt); + } + + if (id) + { + if (fz_is_indirect(id)) + { + /* create new reference with non-NULL xref pointer */ + obj = fz_new_indirect(fz_to_num(id), fz_to_gen(id), xref); + fz_drop_obj(id); + id = obj; + } + fz_dict_puts(xref->trailer, "ID", id); + fz_drop_obj(id); + } + + fz_free(list); + return fz_okay; + +cleanup: + if (encrypt) fz_drop_obj(encrypt); + if (id) fz_drop_obj(id); + if (root) fz_drop_obj(root); + if (info) fz_drop_obj(info); + fz_free(list); + return error; /* already rethrown */ +} + +fz_error +pdf_repair_obj_stms(pdf_xref *xref) +{ + fz_obj *dict; + int i; + + for (i = 0; i < xref->len; i++) + { + if (xref->table[i].stm_ofs) + { + pdf_load_object(&dict, xref, i, 0); + if (!strcmp(fz_to_name(fz_dict_gets(dict, "Type")), "ObjStm")) + pdf_repair_obj_stm(xref, i, 0); + fz_drop_obj(dict); + } + } + + return fz_okay; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_shade.c b/contrib/media/updf_newlib/pdf/pdf_shade.c new file mode 100755 index 000000000..1e0bf5fff --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_shade.c @@ -0,0 +1,1140 @@ +#include "fitz.h" +#include "mupdf.h" + +#define HUGENUM 32000 /* how far to extend axial/radial shadings */ +#define FUNSEGS 32 /* size of sampled mesh for function-based shadings */ +#define RADSEGS 32 /* how many segments to generate for radial meshes */ +#define SUBDIV 3 /* how many levels to subdivide patches */ + +struct vertex +{ + float x, y; + float c[FZ_MAX_COLORS]; +}; + +static void +pdf_grow_mesh(fz_shade *shade, int amount) +{ + if (shade->mesh_len + amount < shade->mesh_cap) + return; + + if (shade->mesh_cap == 0) + shade->mesh_cap = 1024; + + while (shade->mesh_len + amount > shade->mesh_cap) + shade->mesh_cap = (shade->mesh_cap * 3) / 2; + + shade->mesh = fz_realloc(shade->mesh, shade->mesh_cap, sizeof(float)); +} + +static void +pdf_add_vertex(fz_shade *shade, struct vertex *v) +{ + int ncomp = shade->use_function ? 1 : shade->colorspace->n; + int i; + pdf_grow_mesh(shade, 2 + ncomp); + shade->mesh[shade->mesh_len++] = v->x; + shade->mesh[shade->mesh_len++] = v->y; + for (i = 0; i < ncomp; i++) + shade->mesh[shade->mesh_len++] = v->c[i]; +} + +static void +pdf_add_triangle(fz_shade *shade, + struct vertex *v0, + struct vertex *v1, + struct vertex *v2) +{ + pdf_add_vertex(shade, v0); + pdf_add_vertex(shade, v1); + pdf_add_vertex(shade, v2); +} + +static void +pdf_add_quad(fz_shade *shade, + struct vertex *v0, + struct vertex *v1, + struct vertex *v2, + struct vertex *v3) +{ + pdf_add_triangle(shade, v0, v1, v3); + pdf_add_triangle(shade, v1, v3, v2); +} + +/* Subdivide and tesselate tensor-patches */ + +typedef struct pdf_tensor_patch_s pdf_tensor_patch; + +struct pdf_tensor_patch_s +{ + fz_point pole[4][4]; + float color[4][FZ_MAX_COLORS]; +}; + +static void +triangulate_patch(pdf_tensor_patch p, fz_shade *shade) +{ + struct vertex v0, v1, v2, v3; + + v0.x = p.pole[0][0].x; + v0.y = p.pole[0][0].y; + memcpy(v0.c, p.color[0], sizeof(v0.c)); + + v1.x = p.pole[0][3].x; + v1.y = p.pole[0][3].y; + memcpy(v1.c, p.color[1], sizeof(v1.c)); + + v2.x = p.pole[3][3].x; + v2.y = p.pole[3][3].y; + memcpy(v2.c, p.color[2], sizeof(v2.c)); + + v3.x = p.pole[3][0].x; + v3.y = p.pole[3][0].y; + memcpy(v3.c, p.color[3], sizeof(v3.c)); + + pdf_add_quad(shade, &v0, &v1, &v2, &v3); +} + +static inline void midcolor(float *c, float *c1, float *c2) +{ + int i; + for (i = 0; i < FZ_MAX_COLORS; i++) + c[i] = (c1[i] + c2[i]) * 0.5f; +} + +static void +split_curve(fz_point *pole, fz_point *q0, fz_point *q1, int polestep) +{ + /* + split bezier curve given by control points pole[0]..pole[3] + using de casteljau algo at midpoint and build two new + bezier curves q0[0]..q0[3] and q1[0]..q1[3]. all indices + should be multiplies by polestep == 1 for vertical bezier + curves in patch and == 4 for horizontal bezier curves due + to C's multi-dimensional matrix memory layout. + */ + + float x12 = (pole[1 * polestep].x + pole[2 * polestep].x) * 0.5f; + float y12 = (pole[1 * polestep].y + pole[2 * polestep].y) * 0.5f; + + q0[1 * polestep].x = (pole[0 * polestep].x + pole[1 * polestep].x) * 0.5f; + q0[1 * polestep].y = (pole[0 * polestep].y + pole[1 * polestep].y) * 0.5f; + q1[2 * polestep].x = (pole[2 * polestep].x + pole[3 * polestep].x) * 0.5f; + q1[2 * polestep].y = (pole[2 * polestep].y + pole[3 * polestep].y) * 0.5f; + + q0[2 * polestep].x = (q0[1 * polestep].x + x12) * 0.5f; + q0[2 * polestep].y = (q0[1 * polestep].y + y12) * 0.5f; + q1[1 * polestep].x = (x12 + q1[2 * polestep].x) * 0.5f; + q1[1 * polestep].y = (y12 + q1[2 * polestep].y) * 0.5f; + + q0[3 * polestep].x = (q0[2 * polestep].x + q1[1 * polestep].x) * 0.5f; + q0[3 * polestep].y = (q0[2 * polestep].y + q1[1 * polestep].y) * 0.5f; + q1[0 * polestep].x = (q0[2 * polestep].x + q1[1 * polestep].x) * 0.5f; + q1[0 * polestep].y = (q0[2 * polestep].y + q1[1 * polestep].y) * 0.5f; + + q0[0 * polestep].x = pole[0 * polestep].x; + q0[0 * polestep].y = pole[0 * polestep].y; + q1[3 * polestep].x = pole[3 * polestep].x; + q1[3 * polestep].y = pole[3 * polestep].y; +} + +static void +split_stripe(pdf_tensor_patch *p, pdf_tensor_patch *s0, pdf_tensor_patch *s1) +{ + /* + split all horizontal bezier curves in patch, + creating two new patches with half the width. + */ + split_curve(&p->pole[0][0], &s0->pole[0][0], &s1->pole[0][0], 4); + split_curve(&p->pole[0][1], &s0->pole[0][1], &s1->pole[0][1], 4); + split_curve(&p->pole[0][2], &s0->pole[0][2], &s1->pole[0][2], 4); + split_curve(&p->pole[0][3], &s0->pole[0][3], &s1->pole[0][3], 4); + + /* interpolate the colors for the two new patches. */ + memcpy(s0->color[0], p->color[0], sizeof(s0->color[0])); + memcpy(s0->color[1], p->color[1], sizeof(s0->color[1])); + midcolor(s0->color[2], p->color[1], p->color[2]); + midcolor(s0->color[3], p->color[0], p->color[3]); + + memcpy(s1->color[0], s0->color[3], sizeof(s1->color[0])); + memcpy(s1->color[1], s0->color[2], sizeof(s1->color[1])); + memcpy(s1->color[2], p->color[2], sizeof(s1->color[2])); + memcpy(s1->color[3], p->color[3], sizeof(s1->color[3])); +} + +static void +draw_stripe(pdf_tensor_patch *p, fz_shade *shade, int depth) +{ + pdf_tensor_patch s0, s1; + + /* split patch into two half-height patches */ + split_stripe(p, &s0, &s1); + + depth--; + if (depth == 0) + { + /* if no more subdividing, draw two new patches... */ + triangulate_patch(s0, shade); + triangulate_patch(s1, shade); + } + else + { + /* ...otherwise, continue subdividing. */ + draw_stripe(&s0, shade, depth); + draw_stripe(&s1, shade, depth); + } +} + +static void +split_patch(pdf_tensor_patch *p, pdf_tensor_patch *s0, pdf_tensor_patch *s1) +{ + /* + split all vertical bezier curves in patch, + creating two new patches with half the height. + */ + split_curve(p->pole[0], s0->pole[0], s1->pole[0], 1); + split_curve(p->pole[1], s0->pole[1], s1->pole[1], 1); + split_curve(p->pole[2], s0->pole[2], s1->pole[2], 1); + split_curve(p->pole[3], s0->pole[3], s1->pole[3], 1); + + /* interpolate the colors for the two new patches. */ + memcpy(s0->color[0], p->color[0], sizeof(s0->color[0])); + midcolor(s0->color[1], p->color[0], p->color[1]); + midcolor(s0->color[2], p->color[2], p->color[3]); + memcpy(s0->color[3], p->color[3], sizeof(s0->color[3])); + + memcpy(s1->color[0], s0->color[1], sizeof(s1->color[0])); + memcpy(s1->color[1], p->color[1], sizeof(s1->color[1])); + memcpy(s1->color[2], p->color[2], sizeof(s1->color[2])); + memcpy(s1->color[3], s0->color[2], sizeof(s1->color[3])); +} + +static void +draw_patch(fz_shade *shade, pdf_tensor_patch *p, int depth, int origdepth) +{ + pdf_tensor_patch s0, s1; + + /* split patch into two half-width patches */ + split_patch(p, &s0, &s1); + + depth--; + if (depth == 0) + { + /* if no more subdividing, draw two new patches... */ + draw_stripe(&s0, shade, origdepth); + draw_stripe(&s1, shade, origdepth); + } + else + { + /* ...otherwise, continue subdividing. */ + draw_patch(shade, &s0, depth, origdepth); + draw_patch(shade, &s1, depth, origdepth); + } +} + +static fz_point +pdf_compute_tensor_interior( + fz_point a, fz_point b, fz_point c, fz_point d, + fz_point e, fz_point f, fz_point g, fz_point h) +{ + fz_point pt; + + /* see equations at page 330 in pdf 1.7 */ + + pt.x = -4 * a.x; + pt.x += 6 * (b.x + c.x); + pt.x += -2 * (d.x + e.x); + pt.x += 3 * (f.x + g.x); + pt.x += -1 * h.x; + pt.x /= 9; + + pt.y = -4 * a.y; + pt.y += 6 * (b.y + c.y); + pt.y += -2 * (d.y + e.y); + pt.y += 3 * (f.y + g.y); + pt.y += -1 * h.y; + pt.y /= 9; + + return pt; +} + +static void +pdf_make_tensor_patch(pdf_tensor_patch *p, int type, fz_point *pt) +{ + if (type == 6) + { + /* see control point stream order at page 325 in pdf 1.7 */ + + p->pole[0][0] = pt[0]; + p->pole[0][1] = pt[1]; + p->pole[0][2] = pt[2]; + p->pole[0][3] = pt[3]; + p->pole[1][3] = pt[4]; + p->pole[2][3] = pt[5]; + p->pole[3][3] = pt[6]; + p->pole[3][2] = pt[7]; + p->pole[3][1] = pt[8]; + p->pole[3][0] = pt[9]; + p->pole[2][0] = pt[10]; + p->pole[1][0] = pt[11]; + + /* see equations at page 330 in pdf 1.7 */ + + p->pole[1][1] = pdf_compute_tensor_interior( + p->pole[0][0], p->pole[0][1], p->pole[1][0], p->pole[0][3], + p->pole[3][0], p->pole[3][1], p->pole[1][3], p->pole[3][3]); + + p->pole[1][2] = pdf_compute_tensor_interior( + p->pole[0][3], p->pole[0][2], p->pole[1][3], p->pole[0][0], + p->pole[3][3], p->pole[3][2], p->pole[1][0], p->pole[3][0]); + + p->pole[2][1] = pdf_compute_tensor_interior( + p->pole[3][0], p->pole[3][1], p->pole[2][0], p->pole[3][3], + p->pole[0][0], p->pole[0][1], p->pole[2][3], p->pole[0][3]); + + p->pole[2][2] = pdf_compute_tensor_interior( + p->pole[3][3], p->pole[3][2], p->pole[2][3], p->pole[3][0], + p->pole[0][3], p->pole[0][2], p->pole[2][0], p->pole[0][0]); + } + else if (type == 7) + { + /* see control point stream order at page 330 in pdf 1.7 */ + + p->pole[0][0] = pt[0]; + p->pole[0][1] = pt[1]; + p->pole[0][2] = pt[2]; + p->pole[0][3] = pt[3]; + p->pole[1][3] = pt[4]; + p->pole[2][3] = pt[5]; + p->pole[3][3] = pt[6]; + p->pole[3][2] = pt[7]; + p->pole[3][1] = pt[8]; + p->pole[3][0] = pt[9]; + p->pole[2][0] = pt[10]; + p->pole[1][0] = pt[11]; + p->pole[1][1] = pt[12]; + p->pole[1][2] = pt[13]; + p->pole[2][2] = pt[14]; + p->pole[2][1] = pt[15]; + } +} + +/* Sample various functions into lookup tables */ + +static void +pdf_sample_composite_shade_function(fz_shade *shade, pdf_function *func, float t0, float t1) +{ + int i; + float t; + + for (i = 0; i < 256; i++) + { + t = t0 + (i / 255.0f) * (t1 - t0); + pdf_eval_function(func, &t, 1, shade->function[i], shade->colorspace->n); + shade->function[i][shade->colorspace->n] = 1; + } +} + +static void +pdf_sample_component_shade_function(fz_shade *shade, int funcs, pdf_function **func, float t0, float t1) +{ + int i, k; + float t; + + for (i = 0; i < 256; i++) + { + t = t0 + (i / 255.0f) * (t1 - t0); + for (k = 0; k < funcs; k++) + pdf_eval_function(func[k], &t, 1, &shade->function[i][k], 1); + shade->function[i][k] = 1; + } +} + +static void +pdf_sample_shade_function(fz_shade *shade, int funcs, pdf_function **func, float t0, float t1) +{ + shade->use_function = 1; + if (funcs == 1) + pdf_sample_composite_shade_function(shade, func[0], t0, t1); + else + pdf_sample_component_shade_function(shade, funcs, func, t0, t1); +} + +/* Type 1-3 -- Function-based, axial and radial shadings */ + +static void +pdf_load_function_based_shading(fz_shade *shade, pdf_xref *xref, fz_obj *dict, pdf_function *func) +{ + fz_obj *obj; + float x0, y0, x1, y1; + fz_matrix matrix; + struct vertex v[4]; + int xx, yy; + float x, y; + float xn, yn; + int i; + + x0 = y0 = 0; + x1 = y1 = 1; + obj = fz_dict_gets(dict, "Domain"); + if (fz_array_len(obj) == 4) + { + x0 = fz_to_real(fz_array_get(obj, 0)); + x1 = fz_to_real(fz_array_get(obj, 1)); + y0 = fz_to_real(fz_array_get(obj, 2)); + y1 = fz_to_real(fz_array_get(obj, 3)); + } + + matrix = fz_identity; + obj = fz_dict_gets(dict, "Matrix"); + if (fz_array_len(obj) == 6) + matrix = pdf_to_matrix(obj); + + for (yy = 0; yy < FUNSEGS; yy++) + { + y = y0 + (y1 - y0) * yy / FUNSEGS; + yn = y0 + (y1 - y0) * (yy + 1) / FUNSEGS; + + for (xx = 0; xx < FUNSEGS; xx++) + { + x = x0 + (x1 - x0) * xx / FUNSEGS; + xn = x0 + (x1 - x0) * (xx + 1) / FUNSEGS; + + v[0].x = x; v[0].y = y; + v[1].x = xn; v[1].y = y; + v[2].x = xn; v[2].y = yn; + v[3].x = x; v[3].y = yn; + + for (i = 0; i < 4; i++) + { + fz_point pt; + float fv[2]; + + fv[0] = v[i].x; + fv[1] = v[i].y; + pdf_eval_function(func, fv, 2, v[i].c, shade->colorspace->n); + + pt.x = v[i].x; + pt.y = v[i].y; + pt = fz_transform_point(matrix, pt); + v[i].x = pt.x; + v[i].y = pt.y; + } + + pdf_add_quad(shade, &v[0], &v[1], &v[2], &v[3]); + } + } +} + +static void +pdf_load_axial_shading(fz_shade *shade, pdf_xref *xref, fz_obj *dict, int funcs, pdf_function **func) +{ + fz_obj *obj; + float d0, d1; + int e0, e1; + float x0, y0, x1, y1; + struct vertex p1, p2; + + obj = fz_dict_gets(dict, "Coords"); + x0 = fz_to_real(fz_array_get(obj, 0)); + y0 = fz_to_real(fz_array_get(obj, 1)); + x1 = fz_to_real(fz_array_get(obj, 2)); + y1 = fz_to_real(fz_array_get(obj, 3)); + + d0 = 0; + d1 = 1; + obj = fz_dict_gets(dict, "Domain"); + if (fz_array_len(obj) == 2) + { + d0 = fz_to_real(fz_array_get(obj, 0)); + d1 = fz_to_real(fz_array_get(obj, 1)); + } + + e0 = e1 = 0; + obj = fz_dict_gets(dict, "Extend"); + if (fz_array_len(obj) == 2) + { + e0 = fz_to_bool(fz_array_get(obj, 0)); + e1 = fz_to_bool(fz_array_get(obj, 1)); + } + + pdf_sample_shade_function(shade, funcs, func, d0, d1); + + shade->type = FZ_LINEAR; + + shade->extend[0] = e0; + shade->extend[1] = e1; + + p1.x = x0; + p1.y = y0; + p1.c[0] = 0; + pdf_add_vertex(shade, &p1); + + p2.x = x1; + p2.y = y1; + p2.c[0] = 0; + pdf_add_vertex(shade, &p2); +} + +static void +pdf_load_radial_shading(fz_shade *shade, pdf_xref *xref, fz_obj *dict, int funcs, pdf_function **func) +{ + fz_obj *obj; + float d0, d1; + int e0, e1; + float x0, y0, r0, x1, y1, r1; + struct vertex p1, p2; + + obj = fz_dict_gets(dict, "Coords"); + x0 = fz_to_real(fz_array_get(obj, 0)); + y0 = fz_to_real(fz_array_get(obj, 1)); + r0 = fz_to_real(fz_array_get(obj, 2)); + x1 = fz_to_real(fz_array_get(obj, 3)); + y1 = fz_to_real(fz_array_get(obj, 4)); + r1 = fz_to_real(fz_array_get(obj, 5)); + + d0 = 0; + d1 = 1; + obj = fz_dict_gets(dict, "Domain"); + if (fz_array_len(obj) == 2) + { + d0 = fz_to_real(fz_array_get(obj, 0)); + d1 = fz_to_real(fz_array_get(obj, 1)); + } + + e0 = e1 = 0; + obj = fz_dict_gets(dict, "Extend"); + if (fz_array_len(obj) == 2) + { + e0 = fz_to_bool(fz_array_get(obj, 0)); + e1 = fz_to_bool(fz_array_get(obj, 1)); + } + + pdf_sample_shade_function(shade, funcs, func, d0, d1); + + shade->type = FZ_RADIAL; + + shade->extend[0] = e0; + shade->extend[1] = e1; + + p1.x = x0; + p1.y = y0; + p1.c[0] = r0; + pdf_add_vertex(shade, &p1); + + p2.x = x1; + p2.y = y1; + p2.c[0] = r1; + pdf_add_vertex(shade, &p2); +} + +/* Type 4-7 -- Triangle and patch mesh shadings */ + +static inline float read_sample(fz_stream *stream, int bits, float min, float max) +{ + /* we use pow(2,x) because (1<x0 = p->y0 = 0; + p->x1 = p->y1 = 1; + for (i = 0; i < FZ_MAX_COLORS; i++) + { + p->c0[i] = 0; + p->c1[i] = 1; + } + + p->vprow = fz_to_int(fz_dict_gets(dict, "VerticesPerRow")); + p->bpflag = fz_to_int(fz_dict_gets(dict, "BitsPerFlag")); + p->bpcoord = fz_to_int(fz_dict_gets(dict, "BitsPerCoordinate")); + p->bpcomp = fz_to_int(fz_dict_gets(dict, "BitsPerComponent")); + + obj = fz_dict_gets(dict, "Decode"); + if (fz_array_len(obj) >= 6) + { + n = (fz_array_len(obj) - 4) / 2; + p->x0 = fz_to_real(fz_array_get(obj, 0)); + p->x1 = fz_to_real(fz_array_get(obj, 1)); + p->y0 = fz_to_real(fz_array_get(obj, 2)); + p->y1 = fz_to_real(fz_array_get(obj, 3)); + for (i = 0; i < n; i++) + { + p->c0[i] = fz_to_real(fz_array_get(obj, 4 + i * 2)); + p->c1[i] = fz_to_real(fz_array_get(obj, 5 + i * 2)); + } + } + + if (p->vprow < 2) + p->vprow = 2; + + if (p->bpflag != 2 && p->bpflag != 4 && p->bpflag != 8) + p->bpflag = 8; + + if (p->bpcoord != 1 && p->bpcoord != 2 && p->bpcoord != 4 && + p->bpcoord != 8 && p->bpcoord != 12 && p->bpcoord != 16 && + p->bpcoord != 24 && p->bpcoord != 32) + p->bpcoord = 8; + + if (p->bpcomp != 1 && p->bpcomp != 2 && p->bpcomp != 4 && + p->bpcomp != 8 && p->bpcomp != 12 && p->bpcomp != 16) + p->bpcomp = 8; +} + +static void +pdf_load_type4_shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict, + int funcs, pdf_function **func, fz_stream *stream) +{ + struct mesh_params p; + struct vertex va, vb, vc, vd; + int ncomp; + int flag; + int i; + + pdf_load_mesh_params(xref, dict, &p); + + if (funcs > 0) + { + ncomp = 1; + pdf_sample_shade_function(shade, funcs, func, p.c0[0], p.c1[0]); + } + else + ncomp = shade->colorspace->n; + + while (!fz_is_eof_bits(stream)) + { + flag = fz_read_bits(stream, p.bpflag); + vd.x = read_sample(stream, p.bpcoord, p.x0, p.x1); + vd.y = read_sample(stream, p.bpcoord, p.y0, p.y1); + for (i = 0; i < ncomp; i++) + vd.c[i] = read_sample(stream, p.bpcomp, p.c0[i], p.c1[i]); + + switch (flag) + { + case 0: /* start new triangle */ + va = vd; + + fz_read_bits(stream, p.bpflag); + vb.x = read_sample(stream, p.bpcoord, p.x0, p.x1); + vb.y = read_sample(stream, p.bpcoord, p.y0, p.y1); + for (i = 0; i < ncomp; i++) + vb.c[i] = read_sample(stream, p.bpcomp, p.c0[i], p.c1[i]); + + fz_read_bits(stream, p.bpflag); + vc.x = read_sample(stream, p.bpcoord, p.x0, p.x1); + vc.y = read_sample(stream, p.bpcoord, p.y0, p.y1); + for (i = 0; i < ncomp; i++) + vc.c[i] = read_sample(stream, p.bpcomp, p.c0[i], p.c1[i]); + + pdf_add_triangle(shade, &va, &vb, &vc); + break; + + case 1: /* Vb, Vc, Vd */ + va = vb; + vb = vc; + vc = vd; + pdf_add_triangle(shade, &va, &vb, &vc); + break; + + case 2: /* Va, Vc, Vd */ + vb = vc; + vc = vd; + pdf_add_triangle(shade, &va, &vb, &vc); + break; + } + } +} + +static void +pdf_load_type5_shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict, + int funcs, pdf_function **func, fz_stream *stream) +{ + struct mesh_params p; + struct vertex *buf, *ref; + int first; + int ncomp; + int i, k; + + pdf_load_mesh_params(xref, dict, &p); + + if (funcs > 0) + { + ncomp = 1; + pdf_sample_shade_function(shade, funcs, func, p.c0[0], p.c1[0]); + } + else + ncomp = shade->colorspace->n; + + ref = fz_calloc(p.vprow, sizeof(struct vertex)); + buf = fz_calloc(p.vprow, sizeof(struct vertex)); + first = 1; + + while (!fz_is_eof_bits(stream)) + { + for (i = 0; i < p.vprow; i++) + { + buf[i].x = read_sample(stream, p.bpcoord, p.x0, p.x1); + buf[i].y = read_sample(stream, p.bpcoord, p.y0, p.y1); + for (k = 0; k < ncomp; k++) + buf[i].c[k] = read_sample(stream, p.bpcomp, p.c0[k], p.c1[k]); + } + + if (!first) + for (i = 0; i < p.vprow - 1; i++) + pdf_add_quad(shade, + &ref[i], &ref[i+1], &buf[i+1], &buf[i]); + + memcpy(ref, buf, p.vprow * sizeof(struct vertex)); + first = 0; + } + + free(ref); + free(buf); +} + +/* Type 6 & 7 -- Patch mesh shadings */ + +static void +pdf_load_type6_shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict, + int funcs, pdf_function **func, fz_stream *stream) +{ + struct mesh_params p; + int haspatch, hasprevpatch; + float prevc[4][FZ_MAX_COLORS]; + fz_point prevp[12]; + int ncomp; + int i, k; + + pdf_load_mesh_params(xref, dict, &p); + + if (funcs > 0) + { + ncomp = 1; + pdf_sample_shade_function(shade, funcs, func, p.c0[0], p.c1[0]); + } + else + ncomp = shade->colorspace->n; + + hasprevpatch = 0; + + while (!fz_is_eof_bits(stream)) + { + float c[4][FZ_MAX_COLORS]; + fz_point v[12]; + int startcolor; + int startpt; + int flag; + + flag = fz_read_bits(stream, p.bpflag); + + if (flag == 0) + { + startpt = 0; + startcolor = 0; + } + else + { + startpt = 4; + startcolor = 2; + } + + for (i = startpt; i < 12; i++) + { + v[i].x = read_sample(stream, p.bpcoord, p.x0, p.x1); + v[i].y = read_sample(stream, p.bpcoord, p.y0, p.y1); + } + + for (i = startcolor; i < 4; i++) + { + for (k = 0; k < ncomp; k++) + c[i][k] = read_sample(stream, p.bpcomp, p.c0[k], p.c1[k]); + } + + haspatch = 0; + + if (flag == 0) + { + haspatch = 1; + } + else if (flag == 1 && hasprevpatch) + { + v[0] = prevp[3]; + v[1] = prevp[4]; + v[2] = prevp[5]; + v[3] = prevp[6]; + memcpy(c[0], prevc[1], ncomp * sizeof(float)); + memcpy(c[1], prevc[2], ncomp * sizeof(float)); + + haspatch = 1; + } + else if (flag == 2 && hasprevpatch) + { + v[0] = prevp[6]; + v[1] = prevp[7]; + v[2] = prevp[8]; + v[3] = prevp[9]; + memcpy(c[0], prevc[2], ncomp * sizeof(float)); + memcpy(c[1], prevc[3], ncomp * sizeof(float)); + + haspatch = 1; + } + else if (flag == 3 && hasprevpatch) + { + v[0] = prevp[ 9]; + v[1] = prevp[10]; + v[2] = prevp[11]; + v[3] = prevp[ 0]; + memcpy(c[0], prevc[3], ncomp * sizeof(float)); + memcpy(c[1], prevc[0], ncomp * sizeof(float)); + + haspatch = 1; + } + + if (haspatch) + { + pdf_tensor_patch patch; + + pdf_make_tensor_patch(&patch, 6, v); + + for (i = 0; i < 4; i++) + memcpy(patch.color[i], c[i], ncomp * sizeof(float)); + + draw_patch(shade, &patch, SUBDIV, SUBDIV); + + for (i = 0; i < 12; i++) + prevp[i] = v[i]; + + for (i = 0; i < 4; i++) + memcpy(prevc[i], c[i], ncomp * sizeof(float)); + + hasprevpatch = 1; + } + } +} + +static void +pdf_load_type7_shade(fz_shade *shade, pdf_xref *xref, fz_obj *dict, + int funcs, pdf_function **func, fz_stream *stream) +{ + struct mesh_params p; + int haspatch, hasprevpatch; + float prevc[4][FZ_MAX_COLORS]; + fz_point prevp[16]; + int ncomp; + int i, k; + + pdf_load_mesh_params(xref, dict, &p); + + if (funcs > 0) + { + ncomp = 1; + pdf_sample_shade_function(shade, funcs, func, p.c0[0], p.c1[0]); + } + else + ncomp = shade->colorspace->n; + + hasprevpatch = 0; + + while (!fz_is_eof_bits(stream)) + { + float c[4][FZ_MAX_COLORS]; + fz_point v[16]; + int startcolor; + int startpt; + int flag; + + flag = fz_read_bits(stream, p.bpflag); + + if (flag == 0) + { + startpt = 0; + startcolor = 0; + } + else + { + startpt = 4; + startcolor = 2; + } + + for (i = startpt; i < 16; i++) + { + v[i].x = read_sample(stream, p.bpcoord, p.x0, p.x1); + v[i].y = read_sample(stream, p.bpcoord, p.y0, p.y1); + } + + for (i = startcolor; i < 4; i++) + { + for (k = 0; k < ncomp; k++) + c[i][k] = read_sample(stream, p.bpcomp, p.c0[k], p.c1[k]); + } + + haspatch = 0; + + if (flag == 0) + { + haspatch = 1; + } + else if (flag == 1 && hasprevpatch) + { + v[0] = prevp[3]; + v[1] = prevp[4]; + v[2] = prevp[5]; + v[3] = prevp[6]; + memcpy(c[0], prevc[1], ncomp * sizeof(float)); + memcpy(c[1], prevc[2], ncomp * sizeof(float)); + + haspatch = 1; + } + else if (flag == 2 && hasprevpatch) + { + v[0] = prevp[6]; + v[1] = prevp[7]; + v[2] = prevp[8]; + v[3] = prevp[9]; + memcpy(c[0], prevc[2], ncomp * sizeof(float)); + memcpy(c[1], prevc[3], ncomp * sizeof(float)); + + haspatch = 1; + } + else if (flag == 3 && hasprevpatch) + { + v[0] = prevp[ 9]; + v[1] = prevp[10]; + v[2] = prevp[11]; + v[3] = prevp[ 0]; + memcpy(c[0], prevc[3], ncomp * sizeof(float)); + memcpy(c[1], prevc[0], ncomp * sizeof(float)); + + haspatch = 1; + } + + if (haspatch) + { + pdf_tensor_patch patch; + + pdf_make_tensor_patch(&patch, 7, v); + + for (i = 0; i < 4; i++) + memcpy(patch.color[i], c[i], ncomp * sizeof(float)); + + draw_patch(shade, &patch, SUBDIV, SUBDIV); + + for (i = 0; i < 16; i++) + prevp[i] = v[i]; + + for (i = 0; i < 4; i++) + memcpy(prevc[i], c[i], FZ_MAX_COLORS * sizeof(float)); + + hasprevpatch = 1; + } + } +} + +/* Load all of the shading dictionary parameters, then switch on the shading type. */ + +static fz_error +pdf_load_shading_dict(fz_shade **shadep, pdf_xref *xref, fz_obj *dict, fz_matrix transform) +{ + fz_error error; + fz_shade *shade; + pdf_function *func[FZ_MAX_COLORS] = { NULL }; + fz_stream *stream = NULL; + fz_obj *obj; + int funcs; + int type; + int i; + + shade = fz_malloc(sizeof(fz_shade)); + shade->refs = 1; + shade->type = FZ_MESH; + shade->use_background = 0; + shade->use_function = 0; + shade->matrix = transform; + shade->bbox = fz_infinite_rect; + shade->extend[0] = 0; + shade->extend[1] = 0; + + shade->mesh_len = 0; + shade->mesh_cap = 0; + shade->mesh = NULL; + + shade->colorspace = NULL; + + funcs = 0; + + obj = fz_dict_gets(dict, "ShadingType"); + type = fz_to_int(obj); + + obj = fz_dict_gets(dict, "ColorSpace"); + if (!obj) + { + fz_drop_shade(shade); + return fz_throw("shading colorspace is missing"); + } + error = pdf_load_colorspace(&shade->colorspace, xref, obj); + if (error) + { + fz_drop_shade(shade); + return fz_rethrow(error, "cannot load colorspace (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + } + + obj = fz_dict_gets(dict, "Background"); + if (obj) + { + shade->use_background = 1; + for (i = 0; i < shade->colorspace->n; i++) + shade->background[i] = fz_to_real(fz_array_get(obj, i)); + } + + obj = fz_dict_gets(dict, "BBox"); + if (fz_is_array(obj)) + { + shade->bbox = pdf_to_rect(obj); + } + + obj = fz_dict_gets(dict, "Function"); + if (fz_is_dict(obj)) + { + funcs = 1; + + error = pdf_load_function(&func[0], xref, obj); + if (error) + { + error = fz_rethrow(error, "cannot load shading function (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + goto cleanup; + } + } + else if (fz_is_array(obj)) + { + funcs = fz_array_len(obj); + if (funcs != 1 && funcs != shade->colorspace->n) + { + error = fz_throw("incorrect number of shading functions"); + goto cleanup; + } + + for (i = 0; i < funcs; i++) + { + error = pdf_load_function(&func[i], xref, fz_array_get(obj, i)); + if (error) + { + error = fz_rethrow(error, "cannot load shading function (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + goto cleanup; + } + } + } + + if (type >= 4 && type <= 7) + { + error = pdf_open_stream(&stream, xref, fz_to_num(dict), fz_to_gen(dict)); + if (error) + { + error = fz_rethrow(error, "cannot open shading stream (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + goto cleanup; + } + } + + switch (type) + { + case 1: pdf_load_function_based_shading(shade, xref, dict, func[0]); break; + case 2: pdf_load_axial_shading(shade, xref, dict, funcs, func); break; + case 3: pdf_load_radial_shading(shade, xref, dict, funcs, func); break; + case 4: pdf_load_type4_shade(shade, xref, dict, funcs, func, stream); break; + case 5: pdf_load_type5_shade(shade, xref, dict, funcs, func, stream); break; + case 6: pdf_load_type6_shade(shade, xref, dict, funcs, func, stream); break; + case 7: pdf_load_type7_shade(shade, xref, dict, funcs, func, stream); break; + default: + error = fz_throw("unknown shading type: %d", type); + goto cleanup; + } + + if (stream) + fz_close(stream); + for (i = 0; i < funcs; i++) + if (func[i]) + pdf_drop_function(func[i]); + + *shadep = shade; + return fz_okay; + +cleanup: + if (stream) + fz_close(stream); + for (i = 0; i < funcs; i++) + if (func[i]) + pdf_drop_function(func[i]); + fz_drop_shade(shade); + + return fz_rethrow(error, "cannot load shading type %d (%d %d R)", type, fz_to_num(dict), fz_to_gen(dict)); +} + +fz_error +pdf_load_shading(fz_shade **shadep, pdf_xref *xref, fz_obj *dict) +{ + fz_error error; + fz_matrix mat; + fz_obj *obj; + + if ((*shadep = pdf_find_item(xref->store, fz_drop_shade, dict))) + { + fz_keep_shade(*shadep); + return fz_okay; + } + + /* Type 2 pattern dictionary */ + if (fz_dict_gets(dict, "PatternType")) + { + obj = fz_dict_gets(dict, "Matrix"); + if (obj) + mat = pdf_to_matrix(obj); + else + mat = fz_identity; + + obj = fz_dict_gets(dict, "ExtGState"); + if (obj) + { + if (fz_dict_gets(obj, "CA") || fz_dict_gets(obj, "ca")) + { + fz_warn("shading with alpha not supported"); + } + } + + obj = fz_dict_gets(dict, "Shading"); + if (!obj) + return fz_throw("syntaxerror: missing shading dictionary"); + + error = pdf_load_shading_dict(shadep, xref, obj, mat); + if (error) + return fz_rethrow(error, "cannot load shading dictionary (%d %d R)", fz_to_num(obj), fz_to_gen(obj)); + } + + /* Naked shading dictionary */ + else + { + error = pdf_load_shading_dict(shadep, xref, dict, fz_identity); + if (error) + return fz_rethrow(error, "cannot load shading dictionary (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + } + + pdf_store_item(xref->store, fz_keep_shade, fz_drop_shade, dict, *shadep); + + return fz_okay; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_store.c b/contrib/media/updf_newlib/pdf/pdf_store.c new file mode 100755 index 000000000..a57f839a8 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_store.c @@ -0,0 +1,222 @@ +#include "fitz.h" +#include "mupdf.h" + +typedef struct pdf_item_s pdf_item; + +struct pdf_item_s +{ + void *drop_func; + fz_obj *key; + void *val; + int age; + pdf_item *next; +}; + +struct refkey +{ + void *drop_func; + int num; + int gen; +}; + +struct pdf_store_s +{ + fz_hash_table *hash; /* hash for num/gen keys */ + pdf_item *root; /* linked list for everything else */ +}; + +pdf_store * +pdf_new_store(void) +{ + pdf_store *store; + store = fz_malloc(sizeof(pdf_store)); + store->hash = fz_new_hash_table(4096, sizeof(struct refkey)); + store->root = NULL; + return store; +} + +void +pdf_store_item(pdf_store *store, void *keepfunc, void *drop_func, fz_obj *key, void *val) +{ + pdf_item *item; + + if (!store) + return; + + item = fz_malloc(sizeof(pdf_item)); + item->drop_func = drop_func; + item->key = fz_keep_obj(key); + item->val = ((void*(*)(void*))keepfunc)(val); + item->age = 0; + item->next = NULL; + + if (fz_is_indirect(key)) + { + struct refkey refkey; + refkey.drop_func = drop_func; + refkey.num = fz_to_num(key); + refkey.gen = fz_to_gen(key); + fz_hash_insert(store->hash, &refkey, item); + } + else + { + item->next = store->root; + store->root = item; + } +} + +void * +pdf_find_item(pdf_store *store, void *drop_func, fz_obj *key) +{ + struct refkey refkey; + pdf_item *item; + + if (!store) + return NULL; + + if (key == NULL) + return NULL; + + if (fz_is_indirect(key)) + { + refkey.drop_func = drop_func; + refkey.num = fz_to_num(key); + refkey.gen = fz_to_gen(key); + item = fz_hash_find(store->hash, &refkey); + if (item) + { + item->age = 0; + return item->val; + } + } + else + { + for (item = store->root; item; item = item->next) + { + if (item->drop_func == drop_func && !fz_objcmp(item->key, key)) + { + item->age = 0; + return item->val; + } + } + } + + return NULL; +} + +void +pdf_remove_item(pdf_store *store, void *drop_func, fz_obj *key) +{ + struct refkey refkey; + pdf_item *item, *prev, *next; + + if (fz_is_indirect(key)) + { + refkey.drop_func = drop_func; + refkey.num = fz_to_num(key); + refkey.gen = fz_to_gen(key); + item = fz_hash_find(store->hash, &refkey); + if (item) + { + fz_hash_remove(store->hash, &refkey); + ((void(*)(void*))item->drop_func)(item->val); + fz_drop_obj(item->key); + fz_free(item); + } + } + else + { + prev = NULL; + for (item = store->root; item; item = next) + { + next = item->next; + if (item->drop_func == drop_func && !fz_objcmp(item->key, key)) + { + if (!prev) + store->root = next; + else + prev->next = next; + ((void(*)(void*))item->drop_func)(item->val); + fz_drop_obj(item->key); + fz_free(item); + } + else + prev = item; + } + } +} + +void +pdf_age_store(pdf_store *store, int maxage) +{ + struct refkey *refkey; + pdf_item *item, *prev, *next; + int i; + + for (i = 0; i < fz_hash_len(store->hash); i++) + { + refkey = fz_hash_get_key(store->hash, i); + item = fz_hash_get_val(store->hash, i); + if (item && ++item->age > maxage) + { + fz_hash_remove(store->hash, refkey); + ((void(*)(void*))item->drop_func)(item->val); + fz_drop_obj(item->key); + fz_free(item); + i--; /* items with same hash may move into place */ + } + } + + prev = NULL; + for (item = store->root; item; item = next) + { + next = item->next; + if (++item->age > maxage) + { + if (!prev) + store->root = next; + else + prev->next = next; + ((void(*)(void*))item->drop_func)(item->val); + fz_drop_obj(item->key); + fz_free(item); + } + else + prev = item; + } +} + +void +pdf_free_store(pdf_store *store) +{ + pdf_age_store(store, 0); + fz_free_hash(store->hash); + fz_free(store); +} + +void +pdf_debug_store(pdf_store *store) +{ + pdf_item *item; + pdf_item *next; + struct refkey *refkey; + int i; + + printf("-- resource store contents --\n"); + + for (i = 0; i < fz_hash_len(store->hash); i++) + { + refkey = fz_hash_get_key(store->hash, i); + item = fz_hash_get_val(store->hash, i); + if (item) + printf("store[%d] (%d %d R) = %p\n", i, refkey->num, refkey->gen, item->val); + } + + for (item = store->root; item; item = next) + { + next = item->next; + printf("store[*] "); + fz_debug_obj(item->key); + printf(" = %p\n", item->val); + } +} diff --git a/contrib/media/updf_newlib/pdf/pdf_stream.c b/contrib/media/updf_newlib/pdf/pdf_stream.c new file mode 100755 index 000000000..c2dd85783 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_stream.c @@ -0,0 +1,385 @@ +#include "fitz.h" +#include "mupdf.h" + +/* + * Check if an object is a stream or not. + */ +int +pdf_is_stream(pdf_xref *xref, int num, int gen) +{ + fz_error error; + + if (num < 0 || num >= xref->len) + return 0; + + error = pdf_cache_object(xref, num, gen); + if (error) + { + fz_catch(error, "cannot load object, ignoring error"); + return 0; + } + + return xref->table[num].stm_ofs > 0; +} + +/* + * Scan stream dictionary for an explicit /Crypt filter + */ +static int +pdf_stream_has_crypt(fz_obj *stm) +{ + fz_obj *filters; + fz_obj *obj; + int i; + + filters = fz_dict_getsa(stm, "Filter", "F"); + if (filters) + { + if (!strcmp(fz_to_name(filters), "Crypt")) + return 1; + if (fz_is_array(filters)) + { + for (i = 0; i < fz_array_len(filters); i++) + { + obj = fz_array_get(filters, i); + if (!strcmp(fz_to_name(obj), "Crypt")) + return 1; + } + } + } + return 0; +} + +/* + * Create a filter given a name and param dictionary. + */ +static fz_stream * +build_filter(fz_stream *chain, pdf_xref * xref, fz_obj * f, fz_obj * p, int num, int gen) +{ + fz_error error; + char *s; + + s = fz_to_name(f); + + if (!strcmp(s, "ASCIIHexDecode") || !strcmp(s, "AHx")) + return fz_open_ahxd(chain); + + else if (!strcmp(s, "ASCII85Decode") || !strcmp(s, "A85")) + return fz_open_a85d(chain); + + else if (!strcmp(s, "CCITTFaxDecode") || !strcmp(s, "CCF")) + return fz_open_faxd(chain, p); + + else if (!strcmp(s, "DCTDecode") || !strcmp(s, "DCT")) + return fz_open_dctd(chain, p); + + else if (!strcmp(s, "RunLengthDecode") || !strcmp(s, "RL")) + return fz_open_rld(chain); + + else if (!strcmp(s, "FlateDecode") || !strcmp(s, "Fl")) + { + fz_obj *obj = fz_dict_gets(p, "Predictor"); + if (fz_to_int(obj) > 1) + return fz_open_predict(fz_open_flated(chain), p); + return fz_open_flated(chain); + } + + else if (!strcmp(s, "LZWDecode") || !strcmp(s, "LZW")) + { + fz_obj *obj = fz_dict_gets(p, "Predictor"); + if (fz_to_int(obj) > 1) + return fz_open_predict(fz_open_lzwd(chain, p), p); + return fz_open_lzwd(chain, p); + } + + else if (!strcmp(s, "JBIG2Decode")) + { + fz_obj *obj = fz_dict_gets(p, "JBIG2Globals"); + if (obj) + { + fz_buffer *globals; + error = pdf_load_stream(&globals, xref, fz_to_num(obj), fz_to_gen(obj)); + if (error) + fz_catch(error, "cannot load jbig2 global segments"); + chain = fz_open_jbig2d(chain, globals); + fz_drop_buffer(globals); + return chain; + } + return fz_open_jbig2d(chain, NULL); + } + + else if (!strcmp(s, "JPXDecode")) + return chain; /* JPX decoding is special cased in the image loading code */ + + else if (!strcmp(s, "Crypt")) + { + fz_obj *name; + + if (!xref->crypt) + { + fz_warn("crypt filter in unencrypted document"); + return chain; + } + + name = fz_dict_gets(p, "Name"); + if (fz_is_name(name)) + return pdf_open_crypt_with_filter(chain, xref->crypt, fz_to_name(name), num, gen); + + return chain; + } + + fz_warn("unknown filter name (%s)", s); + return chain; +} + +/* + * Build a chain of filters given filter names and param dicts. + * If head is given, start filter chain with it. + * Assume ownership of head. + */ +static fz_stream * +build_filter_chain(fz_stream *chain, pdf_xref *xref, fz_obj *fs, fz_obj *ps, int num, int gen) +{ + fz_obj *f; + fz_obj *p; + int i; + + for (i = 0; i < fz_array_len(fs); i++) + { + f = fz_array_get(fs, i); + p = fz_array_get(ps, i); + chain = build_filter(chain, xref, f, p, num, gen); + } + + return chain; +} + +/* + * Build a filter for reading raw stream data. + * This is a null filter to constrain reading to the + * stream length, followed by a decryption filter. + */ +static fz_stream * +pdf_open_raw_filter(fz_stream *chain, pdf_xref *xref, fz_obj *stmobj, int num, int gen) +{ + int hascrypt; + int len; + + /* don't close chain when we close this filter */ + fz_keep_stream(chain); + + len = fz_to_int(fz_dict_gets(stmobj, "Length")); + chain = fz_open_null(chain, len); + + hascrypt = pdf_stream_has_crypt(stmobj); + if (xref->crypt && !hascrypt) + chain = pdf_open_crypt(chain, xref->crypt, num, gen); + + return chain; +} + +/* + * Construct a filter to decode a stream, constraining + * to stream length and decrypting. + */ +static fz_stream * +pdf_open_filter(fz_stream *chain, pdf_xref *xref, fz_obj *stmobj, int num, int gen) +{ + fz_obj *filters; + fz_obj *params; + + filters = fz_dict_getsa(stmobj, "Filter", "F"); + params = fz_dict_getsa(stmobj, "DecodeParms", "DP"); + + chain = pdf_open_raw_filter(chain, xref, stmobj, num, gen); + + if (fz_is_name(filters)) + return build_filter(chain, xref, filters, params, num, gen); + if (fz_array_len(filters) > 0) + return build_filter_chain(chain, xref, filters, params, num, gen); + + return chain; +} + +/* + * Construct a filter to decode a stream, without + * constraining to stream length, and without decryption. + */ +fz_stream * +pdf_open_inline_stream(fz_stream *chain, pdf_xref *xref, fz_obj *stmobj, int length) +{ + fz_obj *filters; + fz_obj *params; + + filters = fz_dict_getsa(stmobj, "Filter", "F"); + params = fz_dict_getsa(stmobj, "DecodeParms", "DP"); + + /* don't close chain when we close this filter */ + fz_keep_stream(chain); + + if (fz_is_name(filters)) + return build_filter(chain, xref, filters, params, 0, 0); + if (fz_array_len(filters) > 0) + return build_filter_chain(chain, xref, filters, params, 0, 0); + + return fz_open_null(chain, length); +} + +/* + * Open a stream for reading the raw (compressed but decrypted) data. + * Using xref->file while this is open is a bad idea. + */ +fz_error +pdf_open_raw_stream(fz_stream **stmp, pdf_xref *xref, int num, int gen) +{ + pdf_xref_entry *x; + fz_error error; + + if (num < 0 || num >= xref->len) + return fz_throw("object id out of range (%d %d R)", num, gen); + + x = xref->table + num; + + error = pdf_cache_object(xref, num, gen); + if (error) + return fz_rethrow(error, "cannot load stream object (%d %d R)", num, gen); + + if (x->stm_ofs) + { + *stmp = pdf_open_raw_filter(xref->file, xref, x->obj, num, gen); + fz_seek(xref->file, x->stm_ofs, 0); + return fz_okay; + } + + return fz_throw("object is not a stream"); +} + +/* + * Open a stream for reading uncompressed data. + * Put the opened file in xref->stream. + * Using xref->file while a stream is open is a Bad idea. + */ +fz_error +pdf_open_stream(fz_stream **stmp, pdf_xref *xref, int num, int gen) +{ + pdf_xref_entry *x; + fz_error error; + + if (num < 0 || num >= xref->len) + return fz_throw("object id out of range (%d %d R)", num, gen); + + x = xref->table + num; + + error = pdf_cache_object(xref, num, gen); + if (error) + return fz_rethrow(error, "cannot load stream object (%d %d R)", num, gen); + + if (x->stm_ofs) + { + *stmp = pdf_open_filter(xref->file, xref, x->obj, num, gen); + fz_seek(xref->file, x->stm_ofs, 0); + return fz_okay; + } + + return fz_throw("object is not a stream"); +} + +fz_error +pdf_open_stream_at(fz_stream **stmp, pdf_xref *xref, int num, int gen, fz_obj *dict, int stm_ofs) +{ + if (stm_ofs) + { + *stmp = pdf_open_filter(xref->file, xref, dict, num, gen); + fz_seek(xref->file, stm_ofs, 0); + return fz_okay; + } + return fz_throw("object is not a stream"); +} + +/* + * Load raw (compressed but decrypted) contents of a stream into buf. + */ +fz_error +pdf_load_raw_stream(fz_buffer **bufp, pdf_xref *xref, int num, int gen) +{ + fz_error error; + fz_stream *stm; + fz_obj *dict; + int len; + + error = pdf_load_object(&dict, xref, num, gen); + if (error) + return fz_rethrow(error, "cannot load stream dictionary (%d %d R)", num, gen); + + len = fz_to_int(fz_dict_gets(dict, "Length")); + + fz_drop_obj(dict); + + error = pdf_open_raw_stream(&stm, xref, num, gen); + if (error) + return fz_rethrow(error, "cannot open raw stream (%d %d R)", num, gen); + + error = fz_read_all(bufp, stm, len); + if (error) + { + fz_close(stm); + return fz_rethrow(error, "cannot read raw stream (%d %d R)", num, gen); + } + + fz_close(stm); + return fz_okay; +} + +static int +pdf_guess_filter_length(int len, char *filter) +{ + if (!strcmp(filter, "ASCIIHexDecode")) + return len / 2; + if (!strcmp(filter, "ASCII85Decode")) + return len * 4 / 5; + if (!strcmp(filter, "FlateDecode")) + return len * 3; + if (!strcmp(filter, "RunLengthDecode")) + return len * 3; + if (!strcmp(filter, "LZWDecode")) + return len * 2; + return len; +} + +/* + * Load uncompressed contents of a stream into buf. + */ +fz_error +pdf_load_stream(fz_buffer **bufp, pdf_xref *xref, int num, int gen) +{ + fz_error error; + fz_stream *stm; + fz_obj *dict, *obj; + int i, len; + + error = pdf_open_stream(&stm, xref, num, gen); + if (error) + return fz_rethrow(error, "cannot open stream (%d %d R)", num, gen); + + error = pdf_load_object(&dict, xref, num, gen); + if (error) + return fz_rethrow(error, "cannot load stream dictionary (%d %d R)", num, gen); + + len = fz_to_int(fz_dict_gets(dict, "Length")); + obj = fz_dict_gets(dict, "Filter"); + len = pdf_guess_filter_length(len, fz_to_name(obj)); + for (i = 0; i < fz_array_len(obj); i++) + len = pdf_guess_filter_length(len, fz_to_name(fz_array_get(obj, i))); + + fz_drop_obj(dict); + + error = fz_read_all(bufp, stm, len); + if (error) + { + fz_close(stm); + return fz_rethrow(error, "cannot read raw stream (%d %d R)", num, gen); + } + + fz_close(stm); + return fz_okay; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_type3.c b/contrib/media/updf_newlib/pdf/pdf_type3.c new file mode 100755 index 000000000..1d851ebe6 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_type3.c @@ -0,0 +1,158 @@ +#include "fitz.h" +#include "mupdf.h" + +static fz_error +pdf_run_glyph_func(void *xref, fz_obj *rdb, fz_buffer *contents, fz_device *dev, fz_matrix ctm) +{ + return pdf_run_glyph(xref, rdb, contents, dev, ctm); +} + +fz_error +pdf_load_type3_font(pdf_font_desc **fontdescp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict) +{ + fz_error error; + char buf[256]; + char *estrings[256]; + pdf_font_desc *fontdesc; + fz_obj *encoding; + fz_obj *widths; + fz_obj *charprocs; + fz_obj *obj; + int first, last; + int i, k, n; + fz_rect bbox; + fz_matrix matrix; + + obj = fz_dict_gets(dict, "Name"); + if (fz_is_name(obj)) + fz_strlcpy(buf, fz_to_name(obj), sizeof buf); + else + sprintf(buf, "Unnamed-T3"); + + fontdesc = pdf_new_font_desc(); + + obj = fz_dict_gets(dict, "FontMatrix"); + matrix = pdf_to_matrix(obj); + + obj = fz_dict_gets(dict, "FontBBox"); + bbox = pdf_to_rect(obj); + + fontdesc->font = fz_new_type3_font(buf, matrix); + + fz_set_font_bbox(fontdesc->font, bbox.x0, bbox.y0, bbox.x1, bbox.y1); + + /* Encoding */ + + for (i = 0; i < 256; i++) + estrings[i] = NULL; + + encoding = fz_dict_gets(dict, "Encoding"); + if (!encoding) + { + error = fz_throw("syntaxerror: Type3 font missing Encoding"); + goto cleanup; + } + + if (fz_is_name(encoding)) + pdf_load_encoding(estrings, fz_to_name(encoding)); + + if (fz_is_dict(encoding)) + { + fz_obj *base, *diff, *item; + + base = fz_dict_gets(encoding, "BaseEncoding"); + if (fz_is_name(base)) + pdf_load_encoding(estrings, fz_to_name(base)); + + diff = fz_dict_gets(encoding, "Differences"); + if (fz_is_array(diff)) + { + n = fz_array_len(diff); + k = 0; + for (i = 0; i < n; i++) + { + item = fz_array_get(diff, i); + if (fz_is_int(item)) + k = fz_to_int(item); + if (fz_is_name(item)) + estrings[k++] = fz_to_name(item); + if (k < 0) k = 0; + if (k > 255) k = 255; + } + } + } + + fontdesc->encoding = pdf_new_identity_cmap(0, 1); + + error = pdf_load_to_unicode(fontdesc, xref, estrings, NULL, fz_dict_gets(dict, "ToUnicode")); + if (error) + goto cleanup; + + /* Widths */ + + pdf_set_default_hmtx(fontdesc, 0); + + first = fz_to_int(fz_dict_gets(dict, "FirstChar")); + last = fz_to_int(fz_dict_gets(dict, "LastChar")); + + widths = fz_dict_gets(dict, "Widths"); + if (!widths) + { + error = fz_throw("syntaxerror: Type3 font missing Widths"); + goto cleanup; + } + + for (i = first; i <= last; i++) + { + float w = fz_to_real(fz_array_get(widths, i - first)); + w = fontdesc->font->t3matrix.a * w * 1000; + fontdesc->font->t3widths[i] = w * 0.001f; + pdf_add_hmtx(fontdesc, i, i, w); + } + + pdf_end_hmtx(fontdesc); + + /* Resources -- inherit page resources if the font doesn't have its own */ + + fontdesc->font->t3resources = fz_dict_gets(dict, "Resources"); + if (!fontdesc->font->t3resources) + fontdesc->font->t3resources = rdb; + if (fontdesc->font->t3resources) + fz_keep_obj(fontdesc->font->t3resources); + if (!fontdesc->font->t3resources) + fz_warn("no resource dictionary for type 3 font!"); + + fontdesc->font->t3xref = xref; + fontdesc->font->t3run = pdf_run_glyph_func; + + /* CharProcs */ + + charprocs = fz_dict_gets(dict, "CharProcs"); + if (!charprocs) + { + error = fz_throw("syntaxerror: Type3 font missing CharProcs"); + goto cleanup; + } + + for (i = 0; i < 256; i++) + { + if (estrings[i]) + { + obj = fz_dict_gets(charprocs, estrings[i]); + if (pdf_is_stream(xref, fz_to_num(obj), fz_to_gen(obj))) + { + error = pdf_load_stream(&fontdesc->font->t3procs[i], xref, fz_to_num(obj), fz_to_gen(obj)); + if (error) + goto cleanup; + } + } + } + + *fontdescp = fontdesc; + return fz_okay; + +cleanup: + fz_drop_font(fontdesc->font); + fz_free(fontdesc); + return fz_rethrow(error, "cannot load type3 font (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); +} diff --git a/contrib/media/updf_newlib/pdf/pdf_unicode.c b/contrib/media/updf_newlib/pdf/pdf_unicode.c new file mode 100755 index 000000000..2b28b608c --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_unicode.c @@ -0,0 +1,83 @@ +#include "fitz.h" +#include "mupdf.h" + +/* Load or synthesize ToUnicode map for fonts */ + +fz_error +pdf_load_to_unicode(pdf_font_desc *font, pdf_xref *xref, + char **strings, char *collection, fz_obj *cmapstm) +{ + fz_error error = fz_okay; + pdf_cmap *cmap; + int cid; + int ucsbuf[8]; + int ucslen; + int i; + + if (pdf_is_stream(xref, fz_to_num(cmapstm), fz_to_gen(cmapstm))) + { + error = pdf_load_embedded_cmap(&cmap, xref, cmapstm); + if (error) + return fz_rethrow(error, "cannot load embedded cmap (%d %d R)", fz_to_num(cmapstm), fz_to_gen(cmapstm)); + + font->to_unicode = pdf_new_cmap(); + + for (i = 0; i < (strings ? 256 : 65536); i++) + { + cid = pdf_lookup_cmap(font->encoding, i); + if (cid >= 0) + { + ucslen = pdf_lookup_cmap_full(cmap, i, ucsbuf); + if (ucslen == 1) + pdf_map_range_to_range(font->to_unicode, cid, cid, ucsbuf[0]); + if (ucslen > 1) + pdf_map_one_to_many(font->to_unicode, cid, ucsbuf, ucslen); + } + } + + pdf_sort_cmap(font->to_unicode); + + pdf_drop_cmap(cmap); + } + + else if (collection) + { + error = fz_okay; + + if (!strcmp(collection, "Adobe-CNS1")) + error = pdf_load_system_cmap(&font->to_unicode, "Adobe-CNS1-UCS2"); + else if (!strcmp(collection, "Adobe-GB1")) + error = pdf_load_system_cmap(&font->to_unicode, "Adobe-GB1-UCS2"); + else if (!strcmp(collection, "Adobe-Japan1")) + error = pdf_load_system_cmap(&font->to_unicode, "Adobe-Japan1-UCS2"); + else if (!strcmp(collection, "Adobe-Korea1")) + error = pdf_load_system_cmap(&font->to_unicode, "Adobe-Korea1-UCS2"); + + if (error) + return fz_rethrow(error, "cannot load ToUnicode system cmap %s-UCS2", collection); + } + + if (strings) + { + /* TODO one-to-many mappings */ + + font->cid_to_ucs_len = 256; + font->cid_to_ucs = fz_calloc(256, sizeof(unsigned short)); + + for (i = 0; i < 256; i++) + { + if (strings[i]) + font->cid_to_ucs[i] = pdf_lookup_agl(strings[i]); + else + font->cid_to_ucs[i] = '?'; + } + } + + if (!font->to_unicode && !font->cid_to_ucs) + { + /* TODO: synthesize a ToUnicode if it's a freetype font with + * cmap and/or post tables or if it has glyph names. */ + } + + return fz_okay; +} diff --git a/contrib/media/updf_newlib/pdf/pdf_xobject.c b/contrib/media/updf_newlib/pdf/pdf_xobject.c new file mode 100755 index 000000000..6228377f5 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_xobject.c @@ -0,0 +1,96 @@ +#include "fitz.h" +#include "mupdf.h" + +fz_error +pdf_load_xobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict) +{ + fz_error error; + pdf_xobject *form; + fz_obj *obj; + + if ((*formp = pdf_find_item(xref->store, pdf_drop_xobject, dict))) + { + pdf_keep_xobject(*formp); + return fz_okay; + } + + form = fz_malloc(sizeof(pdf_xobject)); + form->refs = 1; + form->resources = NULL; + form->contents = NULL; + form->colorspace = NULL; + + /* Store item immediately, to avoid possible recursion if objects refer back to this one */ + pdf_store_item(xref->store, pdf_keep_xobject, pdf_drop_xobject, dict, form); + + obj = fz_dict_gets(dict, "BBox"); + form->bbox = pdf_to_rect(obj); + + obj = fz_dict_gets(dict, "Matrix"); + if (obj) + form->matrix = pdf_to_matrix(obj); + else + form->matrix = fz_identity; + + form->isolated = 0; + form->knockout = 0; + form->transparency = 0; + + obj = fz_dict_gets(dict, "Group"); + if (obj) + { + fz_obj *attrs = obj; + + form->isolated = fz_to_bool(fz_dict_gets(attrs, "I")); + form->knockout = fz_to_bool(fz_dict_gets(attrs, "K")); + + obj = fz_dict_gets(attrs, "S"); + if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "Transparency")) + form->transparency = 1; + + obj = fz_dict_gets(attrs, "CS"); + if (obj) + { + error = pdf_load_colorspace(&form->colorspace, xref, obj); + if (error) + fz_catch(error, "cannot load xobject colorspace"); + } + } + + form->resources = fz_dict_gets(dict, "Resources"); + if (form->resources) + fz_keep_obj(form->resources); + + error = pdf_load_stream(&form->contents, xref, fz_to_num(dict), fz_to_gen(dict)); + if (error) + { + pdf_remove_item(xref->store, pdf_drop_xobject, dict); + pdf_drop_xobject(form); + return fz_rethrow(error, "cannot load xobject content stream (%d %d R)", fz_to_num(dict), fz_to_gen(dict)); + } + + *formp = form; + return fz_okay; +} + +pdf_xobject * +pdf_keep_xobject(pdf_xobject *xobj) +{ + xobj->refs ++; + return xobj; +} + +void +pdf_drop_xobject(pdf_xobject *xobj) +{ + if (xobj && --xobj->refs == 0) + { + if (xobj->colorspace) + fz_drop_colorspace(xobj->colorspace); + if (xobj->resources) + fz_drop_obj(xobj->resources); + if (xobj->contents) + fz_drop_buffer(xobj->contents); + fz_free(xobj); + } +} diff --git a/contrib/media/updf_newlib/pdf/pdf_xref.c b/contrib/media/updf_newlib/pdf/pdf_xref.c new file mode 100755 index 000000000..bd25004ec --- /dev/null +++ b/contrib/media/updf_newlib/pdf/pdf_xref.c @@ -0,0 +1,940 @@ +#include "fitz.h" +#include "mupdf.h" + +static inline int iswhite(int ch) +{ + return + ch == '\000' || ch == '\011' || ch == '\012' || + ch == '\014' || ch == '\015' || ch == '\040'; +} + +/* + * magic version tag and startxref + */ + +static fz_error +pdf_load_version(pdf_xref *xref) +{ + char buf[20]; + + fz_seek(xref->file, 0, 0); + fz_read_line(xref->file, buf, sizeof buf); + if (memcmp(buf, "%PDF-", 5) != 0) + return fz_throw("cannot recognize version marker"); + + xref->version = atoi(buf + 5) * 10 + atoi(buf + 7); + + return fz_okay; +} + +static fz_error +pdf_read_start_xref(pdf_xref *xref) +{ + unsigned char buf[1024]; + int t, n; + int i; + + fz_seek(xref->file, 0, 2); + + xref->file_size = fz_tell(xref->file); + + t = MAX(0, xref->file_size - (int)sizeof buf); + fz_seek(xref->file, t, 0); + + n = fz_read(xref->file, buf, sizeof buf); + if (n < 0) + return fz_rethrow(n, "cannot read from file"); + + for (i = n - 9; i >= 0; i--) + { + if (memcmp(buf + i, "startxref", 9) == 0) + { + i += 9; + while (iswhite(buf[i]) && i < n) + i ++; + xref->startxref = atoi((char*)(buf + i)); + return fz_okay; + } + } + + return fz_throw("cannot find startxref"); +} + +/* + * trailer dictionary + */ + +static fz_error +pdf_read_old_trailer(pdf_xref *xref, char *buf, int cap) +{ + fz_error error; + int len; + char *s; + int n; + int t; + int tok; + int c; + + fz_read_line(xref->file, buf, cap); + if (strncmp(buf, "xref", 4) != 0) + return fz_throw("cannot find xref marker"); + + while (1) + { + c = fz_peek_byte(xref->file); + if (!(c >= '0' && c <= '9')) + break; + + fz_read_line(xref->file, buf, cap); + s = buf; + fz_strsep(&s, " "); /* ignore ofs */ + if (!s) + return fz_throw("invalid range marker in xref"); + len = atoi(fz_strsep(&s, " ")); + + /* broken pdfs where the section is not on a separate line */ + if (s && *s != '\0') + fz_seek(xref->file, -(2 + (int)strlen(s)), 1); + + t = fz_tell(xref->file); + if (t < 0) + return fz_throw("cannot tell in file"); + + fz_seek(xref->file, t + 20 * len, 0); + } + + error = pdf_lex(&tok, xref->file, buf, cap, &n); + if (error) + return fz_rethrow(error, "cannot parse trailer"); + if (tok != PDF_TOK_TRAILER) + return fz_throw("expected trailer marker"); + + error = pdf_lex(&tok, xref->file, buf, cap, &n); + if (error) + return fz_rethrow(error, "cannot parse trailer"); + if (tok != PDF_TOK_OPEN_DICT) + return fz_throw("expected trailer dictionary"); + + error = pdf_parse_dict(&xref->trailer, xref, xref->file, buf, cap); + if (error) + return fz_rethrow(error, "cannot parse trailer"); + return fz_okay; +} + +static fz_error +pdf_read_new_trailer(pdf_xref *xref, char *buf, int cap) +{ + fz_error error; + error = pdf_parse_ind_obj(&xref->trailer, xref, xref->file, buf, cap, NULL, NULL, NULL); + if (error) + return fz_rethrow(error, "cannot parse trailer (compressed)"); + return fz_okay; +} + +static fz_error +pdf_read_trailer(pdf_xref *xref, char *buf, int cap) +{ + fz_error error; + int c; + + fz_seek(xref->file, xref->startxref, 0); + + while (iswhite(fz_peek_byte(xref->file))) + fz_read_byte(xref->file); + + c = fz_peek_byte(xref->file); + if (c == 'x') + { + error = pdf_read_old_trailer(xref, buf, cap); + if (error) + return fz_rethrow(error, "cannot read trailer"); + } + else if (c >= '0' && c <= '9') + { + error = pdf_read_new_trailer(xref, buf, cap); + if (error) + return fz_rethrow(error, "cannot read trailer"); + } + else + { + return fz_throw("cannot recognize xref format: '%c'", c); + } + + return fz_okay; +} + +/* + * xref tables + */ + +void +pdf_resize_xref(pdf_xref *xref, int newlen) +{ + int i; + + xref->table = fz_realloc(xref->table, newlen, sizeof(pdf_xref_entry)); + for (i = xref->len; i < newlen; i++) + { + xref->table[i].type = 0; + xref->table[i].ofs = 0; + xref->table[i].gen = 0; + xref->table[i].stm_ofs = 0; + xref->table[i].obj = NULL; + } + xref->len = newlen; +} + +static fz_error +pdf_read_old_xref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap) +{ + fz_error error; + int ofs, len; + char *s; + int n; + int tok; + int i; + int c; + + fz_read_line(xref->file, buf, cap); + if (strncmp(buf, "xref", 4) != 0) + return fz_throw("cannot find xref marker"); + + while (1) + { + c = fz_peek_byte(xref->file); + if (!(c >= '0' && c <= '9')) + break; + + fz_read_line(xref->file, buf, cap); + s = buf; + ofs = atoi(fz_strsep(&s, " ")); + len = atoi(fz_strsep(&s, " ")); + + /* broken pdfs where the section is not on a separate line */ + if (s && *s != '\0') + { + fz_warn("broken xref section. proceeding anyway."); + fz_seek(xref->file, -(2 + (int)strlen(s)), 1); + } + + /* broken pdfs where size in trailer undershoots entries in xref sections */ + if (ofs + len > xref->len) + { + fz_warn("broken xref section, proceeding anyway."); + pdf_resize_xref(xref, ofs + len); + } + + for (i = ofs; i < ofs + len; i++) + { + n = fz_read(xref->file, (unsigned char *) buf, 20); + if (n < 0) + return fz_rethrow(n, "cannot read xref table"); + if (!xref->table[i].type) + { + s = buf; + + /* broken pdfs where line start with white space */ + while (*s != '\0' && iswhite(*s)) + s++; + + xref->table[i].ofs = atoi(s); + xref->table[i].gen = atoi(s + 11); + xref->table[i].type = s[17]; + if (s[17] != 'f' && s[17] != 'n' && s[17] != 'o') + return fz_throw("unexpected xref type: %#x (%d %d R)", s[17], i, xref->table[i].gen); + } + } + } + + error = pdf_lex(&tok, xref->file, buf, cap, &n); + if (error) + return fz_rethrow(error, "cannot parse trailer"); + if (tok != PDF_TOK_TRAILER) + return fz_throw("expected trailer marker"); + + error = pdf_lex(&tok, xref->file, buf, cap, &n); + if (error) + return fz_rethrow(error, "cannot parse trailer"); + if (tok != PDF_TOK_OPEN_DICT) + return fz_throw("expected trailer dictionary"); + + error = pdf_parse_dict(trailerp, xref, xref->file, buf, cap); + if (error) + return fz_rethrow(error, "cannot parse trailer"); + return fz_okay; +} + +static fz_error +pdf_read_new_xref_section(pdf_xref *xref, fz_stream *stm, int i0, int i1, int w0, int w1, int w2) +{ + int i, n; + + if (i0 < 0 || i0 + i1 > xref->len) + return fz_throw("xref stream has too many entries"); + + for (i = i0; i < i0 + i1; i++) + { + int a = 0; + int b = 0; + int c = 0; + + if (fz_is_eof(stm)) + return fz_throw("truncated xref stream"); + + for (n = 0; n < w0; n++) + a = (a << 8) + fz_read_byte(stm); + for (n = 0; n < w1; n++) + b = (b << 8) + fz_read_byte(stm); + for (n = 0; n < w2; n++) + c = (c << 8) + fz_read_byte(stm); + + if (!xref->table[i].type) + { + int t = w0 ? a : 1; + xref->table[i].type = t == 0 ? 'f' : t == 1 ? 'n' : t == 2 ? 'o' : 0; + xref->table[i].ofs = w1 ? b : 0; + xref->table[i].gen = w2 ? c : 0; + } + } + + return fz_okay; +} + +static fz_error +pdf_read_new_xref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap) +{ + fz_error error; + fz_stream *stm; + fz_obj *trailer; + fz_obj *index; + fz_obj *obj; + int num, gen, stm_ofs; + int size, w0, w1, w2; + int t; + + error = pdf_parse_ind_obj(&trailer, xref, xref->file, buf, cap, &num, &gen, &stm_ofs); + if (error) + return fz_rethrow(error, "cannot parse compressed xref stream object"); + + obj = fz_dict_gets(trailer, "Size"); + if (!obj) + { + fz_drop_obj(trailer); + return fz_throw("xref stream missing Size entry (%d %d R)", num, gen); + } + size = fz_to_int(obj); + + if (size > xref->len) + { + pdf_resize_xref(xref, size); + } + + if (num < 0 || num >= xref->len) + { + fz_drop_obj(trailer); + return fz_throw("object id (%d %d R) out of range (0..%d)", num, gen, xref->len - 1); + } + + obj = fz_dict_gets(trailer, "W"); + if (!obj) { + fz_drop_obj(trailer); + return fz_throw("xref stream missing W entry (%d %d R)", num, gen); + } + w0 = fz_to_int(fz_array_get(obj, 0)); + w1 = fz_to_int(fz_array_get(obj, 1)); + w2 = fz_to_int(fz_array_get(obj, 2)); + + index = fz_dict_gets(trailer, "Index"); + + error = pdf_open_stream_at(&stm, xref, num, gen, trailer, stm_ofs); + if (error) + { + fz_drop_obj(trailer); + return fz_rethrow(error, "cannot open compressed xref stream (%d %d R)", num, gen); + } + + if (!index) + { + error = pdf_read_new_xref_section(xref, stm, 0, size, w0, w1, w2); + if (error) + { + fz_close(stm); + fz_drop_obj(trailer); + return fz_rethrow(error, "cannot read xref stream (%d %d R)", num, gen); + } + } + else + { + for (t = 0; t < fz_array_len(index); t += 2) + { + int i0 = fz_to_int(fz_array_get(index, t + 0)); + int i1 = fz_to_int(fz_array_get(index, t + 1)); + error = pdf_read_new_xref_section(xref, stm, i0, i1, w0, w1, w2); + if (error) + { + fz_close(stm); + fz_drop_obj(trailer); + return fz_rethrow(error, "cannot read xref stream section (%d %d R)", num, gen); + } + } + } + + fz_close(stm); + + *trailerp = trailer; + + return fz_okay; +} + +static fz_error +pdf_read_xref(fz_obj **trailerp, pdf_xref *xref, int ofs, char *buf, int cap) +{ + fz_error error; + int c; + + fz_seek(xref->file, ofs, 0); + + while (iswhite(fz_peek_byte(xref->file))) + fz_read_byte(xref->file); + + c = fz_peek_byte(xref->file); + if (c == 'x') + { + error = pdf_read_old_xref(trailerp, xref, buf, cap); + if (error) + return fz_rethrow(error, "cannot read xref (ofs=%d)", ofs); + } + else if (c >= '0' && c <= '9') + { + error = pdf_read_new_xref(trailerp, xref, buf, cap); + if (error) + return fz_rethrow(error, "cannot read xref (ofs=%d)", ofs); + } + else + { + return fz_throw("cannot recognize xref format"); + } + + return fz_okay; +} + +static fz_error +pdf_read_xref_sections(pdf_xref *xref, int ofs, char *buf, int cap) +{ + fz_error error; + fz_obj *trailer; + fz_obj *prev; + fz_obj *xrefstm; + + error = pdf_read_xref(&trailer, xref, ofs, buf, cap); + if (error) + return fz_rethrow(error, "cannot read xref section"); + + /* FIXME: do we overwrite free entries properly? */ + xrefstm = fz_dict_gets(trailer, "XRefStm"); + if (xrefstm) + { + error = pdf_read_xref_sections(xref, fz_to_int(xrefstm), buf, cap); + if (error) + { + fz_drop_obj(trailer); + return fz_rethrow(error, "cannot read /XRefStm xref section"); + } + } + + prev = fz_dict_gets(trailer, "Prev"); + if (prev) + { + error = pdf_read_xref_sections(xref, fz_to_int(prev), buf, cap); + if (error) + { + fz_drop_obj(trailer); + return fz_rethrow(error, "cannot read /Prev xref section"); + } + } + + fz_drop_obj(trailer); + return fz_okay; +} + +/* + * load xref tables from pdf + */ + +static fz_error +pdf_load_xref(pdf_xref *xref, char *buf, int bufsize) +{ + fz_error error; + fz_obj *size; + int i; + + error = pdf_load_version(xref); + if (error) + return fz_rethrow(error, "cannot read version marker"); + + error = pdf_read_start_xref(xref); + if (error) + return fz_rethrow(error, "cannot read startxref"); + + error = pdf_read_trailer(xref, buf, bufsize); + if (error) + return fz_rethrow(error, "cannot read trailer"); + + size = fz_dict_gets(xref->trailer, "Size"); + if (!size) + return fz_throw("trailer missing Size entry"); + + pdf_resize_xref(xref, fz_to_int(size)); + + error = pdf_read_xref_sections(xref, xref->startxref, buf, bufsize); + if (error) + return fz_rethrow(error, "cannot read xref"); + + /* broken pdfs where first object is not free */ + if (xref->table[0].type != 'f') + return fz_throw("first object in xref is not free"); + + /* broken pdfs where object offsets are out of range */ + for (i = 0; i < xref->len; i++) + { + if (xref->table[i].type == 'n') + if (xref->table[i].ofs <= 0 || xref->table[i].ofs >= xref->file_size) + return fz_throw("object offset out of range: %d (%d 0 R)", xref->table[i].ofs, i); + if (xref->table[i].type == 'o') + if (xref->table[i].ofs <= 0 || xref->table[i].ofs >= xref->len || xref->table[xref->table[i].ofs].type != 'n') + return fz_throw("invalid reference to an objstm that does not exist: %d (%d 0 R)", xref->table[i].ofs, i); + } + + return fz_okay; +} + +/* + * Initialize and load xref tables. + * If password is not null, try to decrypt. + */ + +fz_error +pdf_open_xref_with_stream(pdf_xref **xrefp, fz_stream *file, char *password) +{ + pdf_xref *xref; + fz_error error; + fz_obj *encrypt, *id; + fz_obj *dict, *obj; + int i, repaired = 0; + + /* install pdf specific callback */ + fz_resolve_indirect = pdf_resolve_indirect; + + xref = fz_malloc(sizeof(pdf_xref)); + + memset(xref, 0, sizeof(pdf_xref)); + + xref->file = fz_keep_stream(file); + + error = pdf_load_xref(xref, xref->scratch, sizeof xref->scratch); + if (error) + { + fz_catch(error, "trying to repair"); + if (xref->table) + { + fz_free(xref->table); + xref->table = NULL; + xref->len = 0; + } + if (xref->trailer) + { + fz_drop_obj(xref->trailer); + xref->trailer = NULL; + } + error = pdf_repair_xref(xref, xref->scratch, sizeof xref->scratch); + if (error) + { + pdf_free_xref(xref); + return fz_rethrow(error, "cannot repair document"); + } + repaired = 1; + } + + encrypt = fz_dict_gets(xref->trailer, "Encrypt"); + id = fz_dict_gets(xref->trailer, "ID"); + if (fz_is_dict(encrypt)) + { + error = pdf_new_crypt(&xref->crypt, encrypt, id); + if (error) + { + pdf_free_xref(xref); + return fz_rethrow(error, "cannot decrypt document"); + } + } + + if (pdf_needs_password(xref)) + { + /* Only care if we have a password */ + if (password) + { + int okay = pdf_authenticate_password(xref, password); + if (!okay) + { + pdf_free_xref(xref); + return fz_throw("invalid password"); + } + } + } + + if (repaired) + { + int hasroot, hasinfo; + + error = pdf_repair_obj_stms(xref); + if (error) + { + pdf_free_xref(xref); + return fz_rethrow(error, "cannot repair document"); + } + + hasroot = fz_dict_gets(xref->trailer, "Root") != NULL; + hasinfo = fz_dict_gets(xref->trailer, "Info") != NULL; + + for (i = 1; i < xref->len; i++) + { + if (xref->table[i].type == 0 || xref->table[i].type == 'f') + continue; + + error = pdf_load_object(&dict, xref, i, 0); + if (error) + { + fz_catch(error, "ignoring broken object (%d 0 R)", i); + continue; + } + + if (!hasroot) + { + obj = fz_dict_gets(dict, "Type"); + if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "Catalog")) + { + obj = fz_new_indirect(i, 0, xref); + fz_dict_puts(xref->trailer, "Root", obj); + fz_drop_obj(obj); + } + } + + if (!hasinfo) + { + if (fz_dict_gets(dict, "Creator") || fz_dict_gets(dict, "Producer")) + { + obj = fz_new_indirect(i, 0, xref); + fz_dict_puts(xref->trailer, "Info", obj); + fz_drop_obj(obj); + } + } + + fz_drop_obj(dict); + } + } + + *xrefp = xref; + return fz_okay; +} + +void +pdf_free_xref(pdf_xref *xref) +{ + int i; + + if (xref->store) + pdf_free_store(xref->store); + + if (xref->table) + { + for (i = 0; i < xref->len; i++) + { + if (xref->table[i].obj) + { + fz_drop_obj(xref->table[i].obj); + xref->table[i].obj = NULL; + } + } + fz_free(xref->table); + } + + if (xref->page_objs) + { + for (i = 0; i < xref->page_len; i++) + fz_drop_obj(xref->page_objs[i]); + fz_free(xref->page_objs); + } + + if (xref->page_refs) + { + for (i = 0; i < xref->page_len; i++) + fz_drop_obj(xref->page_refs[i]); + fz_free(xref->page_refs); + } + + if (xref->file) + fz_close(xref->file); + if (xref->trailer) + fz_drop_obj(xref->trailer); + if (xref->crypt) + pdf_free_crypt(xref->crypt); + + fz_free(xref); +} + +void +pdf_debug_xref(pdf_xref *xref) +{ + int i; + printf("xref\n0 %d\n", xref->len); + for (i = 0; i < xref->len; i++) + { + printf("%05d: %010d %05d %c (stm_ofs=%d)\n", i, + xref->table[i].ofs, + xref->table[i].gen, + xref->table[i].type ? xref->table[i].type : '-', + xref->table[i].stm_ofs); + } +} + +/* + * compressed object streams + */ + +static fz_error +pdf_load_obj_stm(pdf_xref *xref, int num, int gen, char *buf, int cap) +{ + fz_error error; + fz_stream *stm; + fz_obj *objstm; + int *numbuf; + int *ofsbuf; + + fz_obj *obj; + int first; + int count; + int i, n; + int tok; + + error = pdf_load_object(&objstm, xref, num, gen); + if (error) + return fz_rethrow(error, "cannot load object stream object (%d %d R)", num, gen); + + count = fz_to_int(fz_dict_gets(objstm, "N")); + first = fz_to_int(fz_dict_gets(objstm, "First")); + + numbuf = fz_calloc(count, sizeof(int)); + ofsbuf = fz_calloc(count, sizeof(int)); + + error = pdf_open_stream(&stm, xref, num, gen); + if (error) + { + error = fz_rethrow(error, "cannot open object stream (%d %d R)", num, gen); + goto cleanupbuf; + } + + for (i = 0; i < count; i++) + { + error = pdf_lex(&tok, stm, buf, cap, &n); + if (error || tok != PDF_TOK_INT) + { + error = fz_rethrow(error, "corrupt object stream (%d %d R)", num, gen); + goto cleanupstm; + } + numbuf[i] = atoi(buf); + + error = pdf_lex(&tok, stm, buf, cap, &n); + if (error || tok != PDF_TOK_INT) + { + error = fz_rethrow(error, "corrupt object stream (%d %d R)", num, gen); + goto cleanupstm; + } + ofsbuf[i] = atoi(buf); + } + + fz_seek(stm, first, 0); + + for (i = 0; i < count; i++) + { + fz_seek(stm, first + ofsbuf[i], 0); + + error = pdf_parse_stm_obj(&obj, xref, stm, buf, cap); + if (error) + { + error = fz_rethrow(error, "cannot parse object %d in stream (%d %d R)", i, num, gen); + goto cleanupstm; + } + + if (numbuf[i] < 1 || numbuf[i] >= xref->len) + { + fz_drop_obj(obj); + error = fz_throw("object id (%d 0 R) out of range (0..%d)", numbuf[i], xref->len - 1); + goto cleanupstm; + } + + if (xref->table[numbuf[i]].type == 'o' && xref->table[numbuf[i]].ofs == num) + { + if (xref->table[numbuf[i]].obj) + fz_drop_obj(xref->table[numbuf[i]].obj); + xref->table[numbuf[i]].obj = obj; + } + else + { + fz_drop_obj(obj); + } + } + + fz_close(stm); + fz_free(ofsbuf); + fz_free(numbuf); + fz_drop_obj(objstm); + return fz_okay; + +cleanupstm: + fz_close(stm); +cleanupbuf: + fz_free(ofsbuf); + fz_free(numbuf); + fz_drop_obj(objstm); + return error; /* already rethrown */ +} + +/* + * object loading + */ + +fz_error +pdf_cache_object(pdf_xref *xref, int num, int gen) +{ + fz_error error; + pdf_xref_entry *x; + int rnum, rgen; + + if (num < 0 || num >= xref->len) + return fz_throw("object out of range (%d %d R); xref size %d", num, gen, xref->len); + + x = &xref->table[num]; + + if (x->obj) + return fz_okay; + + if (x->type == 'f') + { + x->obj = fz_new_null(); + return fz_okay; + } + else if (x->type == 'n') + { + fz_seek(xref->file, x->ofs, 0); + + error = pdf_parse_ind_obj(&x->obj, xref, xref->file, xref->scratch, sizeof xref->scratch, + &rnum, &rgen, &x->stm_ofs); + if (error) + return fz_rethrow(error, "cannot parse object (%d %d R)", num, gen); + + if (rnum != num) + return fz_throw("found object (%d %d R) instead of (%d %d R)", rnum, rgen, num, gen); + + if (xref->crypt) + pdf_crypt_obj(xref->crypt, x->obj, num, gen); + } + else if (x->type == 'o') + { + if (!x->obj) + { + error = pdf_load_obj_stm(xref, x->ofs, 0, xref->scratch, sizeof xref->scratch); + if (error) + return fz_rethrow(error, "cannot load object stream containing object (%d %d R)", num, gen); + if (!x->obj) + return fz_throw("object (%d %d R) was not found in its object stream", num, gen); + } + } + else + { + return fz_throw("assert: corrupt xref struct"); + } + + return fz_okay; +} + +fz_error +pdf_load_object(fz_obj **objp, pdf_xref *xref, int num, int gen) +{ + fz_error error; + + error = pdf_cache_object(xref, num, gen); + if (error) + return fz_rethrow(error, "cannot load object (%d %d R) into cache", num, gen); + + assert(xref->table[num].obj); + + *objp = fz_keep_obj(xref->table[num].obj); + + return fz_okay; +} + +fz_obj * +pdf_resolve_indirect(fz_obj *ref) +{ + if (fz_is_indirect(ref)) + { + pdf_xref *xref = fz_get_indirect_xref(ref); + int num = fz_to_num(ref); + int gen = fz_to_gen(ref); + if (xref) + { + fz_error error = pdf_cache_object(xref, num, gen); + if (error) + { + fz_catch(error, "cannot load object (%d %d R) into cache", num, gen); + return ref; + } + if (xref->table[num].obj) + return xref->table[num].obj; + } + } + return ref; +} + +/* Replace numbered object -- for use by pdfclean and similar tools */ +void +pdf_update_object(pdf_xref *xref, int num, int gen, fz_obj *newobj) +{ + pdf_xref_entry *x; + + if (num < 0 || num >= xref->len) + { + fz_warn("object out of range (%d %d R); xref size %d", num, gen, xref->len); + return; + } + + x = &xref->table[num]; + + if (x->obj) + fz_drop_obj(x->obj); + + x->obj = fz_keep_obj(newobj); + x->type = 'n'; + x->ofs = 0; +} + +/* + * Convenience function to open a file then call pdf_open_xref_with_stream. + */ + +fz_error +pdf_open_xref(pdf_xref **xrefp, const char *filename, char *password) +{ + fz_error error; + fz_stream *file; + + file = fz_open_file(filename); + if (!file) + return fz_throw("cannot open file '%s': %s", filename, strerror(errno)); + + error = pdf_open_xref_with_stream(xrefp, file, password); + if (error) + return fz_rethrow(error, "cannot load document '%s'", filename); + + fz_close(file); + return fz_okay; +} diff --git a/contrib/media/updf_newlib/pdf/snprintf.c b/contrib/media/updf_newlib/pdf/snprintf.c new file mode 100755 index 000000000..86f42e90d --- /dev/null +++ b/contrib/media/updf_newlib/pdf/snprintf.c @@ -0,0 +1,1025 @@ +/* + * snprintf.c - a portable implementation of snprintf + * + * AUTHOR + * Mark Martinec , April 1999. + * + * Copyright 1999, Mark Martinec. All rights reserved. + * + * TERMS AND CONDITIONS + * This program is free software; you can redistribute it and/or modify + * it under the terms of the "Frontier Artistic License" which comes + * with this Kit. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Frontier Artistic License for more details. + * + * You should have received a copy of the Frontier Artistic License + * with this Kit in the file named LICENSE.txt . + * If not, I'll be glad to provide one. + * + * FEATURES + * - careful adherence to specs regarding flags, field width and precision; + * - good performance for large string handling (large format, large + * argument or large paddings). Performance is similar to system's sprintf + * and in several cases significantly better (make sure you compile with + * optimizations turned on, tell the compiler the code is strict ANSI + * if necessary to give it more freedom for optimizations); + * - return value semantics per ISO/IEC 9899:1999 ("ISO C99"); + * - written in standard ISO/ANSI C - requires an ANSI C compiler. + * + * SUPPORTED CONVERSION SPECIFIERS AND DATA TYPES + * + * This snprintf only supports the following conversion specifiers: + * s, c, d, u, o, x, X, p (and synonyms: i, D, U, O - see below) + * with flags: '-', '+', ' ', '0' and '#'. + * An asterisk is supported for field width as well as precision. + * + * Length modifiers 'h' (short int), 'l' (long int), + * and 'll' (long long int) are supported. + * NOTE: + * If macro SNPRINTF_LONGLONG_SUPPORT is not defined (default) the + * length modifier 'll' is recognized but treated the same as 'l', + * which may cause argument value truncation! Defining + * SNPRINTF_LONGLONG_SUPPORT requires that your system's sprintf also + * handles length modifier 'll'. long long int is a language extension + * which may not be portable. + * + * Conversion of numeric data (conversion specifiers d, u, o, x, X, p) + * with length modifiers (none or h, l, ll) is left to the system routine + * sprintf, but all handling of flags, field width and precision as well as + * c and s conversions is done very carefully by this portable routine. + * If a string precision (truncation) is specified (e.g. %.8s) it is + * guaranteed the string beyond the specified precision will not be referenced. + * + * Length modifiers h, l and ll are ignored for c and s conversions (data + * types wint_t and wchar_t are not supported). + * + * The following common synonyms for conversion characters are supported: + * - i is a synonym for d + * - D is a synonym for ld, explicit length modifiers are ignored + * - U is a synonym for lu, explicit length modifiers are ignored + * - O is a synonym for lo, explicit length modifiers are ignored + * The D, O and U conversion characters are nonstandard, they are supported + * for backward compatibility only, and should not be used for new code. + * + * The following is specifically NOT supported: + * - flag ' (thousands' grouping character) is recognized but ignored + * - numeric conversion specifiers: f, e, E, g, G and synonym F, + * as well as the new a and A conversion specifiers + * - length modifier 'L' (long double) and 'q' (quad - use 'll' instead) + * - wide character/string conversions: lc, ls, and nonstandard + * synonyms C and S + * - writeback of converted string length: conversion character n + * - the n$ specification for direct reference to n-th argument + * - locales + * + * It is permitted for str_m to be zero, and it is permitted to specify NULL + * pointer for resulting string argument if str_m is zero (as per ISO C99). + * + * The return value is the number of characters which would be generated + * for the given input, excluding the trailing null. If this value + * is greater or equal to str_m, not all characters from the result + * have been stored in str, output bytes beyond the (str_m-1) -th character + * are discarded. If str_m is greater than zero it is guaranteed + * the resulting string will be null-terminated. + * + * NOTE that this matches the ISO C99, OpenBSD, and GNU C library 2.1, + * but is different from some older and vendor implementations, + * and is also different from XPG, XSH5, SUSv2 specifications. + * For historical discussion on changes in the semantics and standards + * of snprintf see printf(3) man page in the Linux programmers manual. + * + * Routines asprintf and vasprintf return a pointer (in the ptr argument) + * to a buffer sufficiently large to hold the resulting string. This pointer + * should be passed to free(3) to release the allocated storage when it is + * no longer needed. If sufficient space cannot be allocated, these functions + * will return -1 and set ptr to be a NULL pointer. These two routines are a + * GNU C library extensions (glibc). + * + * Routines asnprintf and vasnprintf are similar to asprintf and vasprintf, + * yet, like snprintf and vsnprintf counterparts, will write at most str_m-1 + * characters into the allocated output string, the last character in the + * allocated buffer then gets the terminating null. If the formatted string + * length (the return value) is greater than or equal to the str_m argument, + * the resulting string was truncated and some of the formatted characters + * were discarded. These routines present a handy way to limit the amount + * of allocated memory to some sane value. + * + * AVAILABILITY + * http://www.ijs.si/software/snprintf/ + * + * REVISION HISTORY + * 1999-04 V0.9 Mark Martinec + * - initial version, some modifications after comparing printf + * man pages for Digital Unix 4.0, Solaris 2.6 and HPUX 10, + * and checking how Perl handles sprintf (differently!); + * 1999-04-09 V1.0 Mark Martinec + * - added main test program, fixed remaining inconsistencies, + * added optional (long long int) support; + * 1999-04-12 V1.1 Mark Martinec + * - support the 'p' conversion (pointer to void); + * - if a string precision is specified + * make sure the string beyond the specified precision + * will not be referenced (e.g. by strlen); + * 1999-04-13 V1.2 Mark Martinec + * - support synonyms %D=%ld, %U=%lu, %O=%lo; + * - speed up the case of long format string with few conversions; + * 1999-06-30 V1.3 Mark Martinec + * - fixed runaway loop (eventually crashing when str_l wraps + * beyond 2^31) while copying format string without + * conversion specifiers to a buffer that is too short + * (thanks to Edwin Young for + * spotting the problem); + * - added macros PORTABLE_SNPRINTF_VERSION_(MAJOR|MINOR) + * to snprintf.h + * 2000-02-14 V2.0 (never released) Mark Martinec + * - relaxed license terms: The Artistic License now applies. + * You may still apply the GNU GENERAL PUBLIC LICENSE + * as was distributed with previous versions, if you prefer; + * - changed REVISION HISTORY dates to use ISO 8601 date format; + * - added vsnprintf (patch also independently proposed by + * Caolan McNamara 2000-05-04, and Keith M Willenson 2000-06-01) + * 2000-06-27 V2.1 Mark Martinec + * - removed POSIX check for str_m<1; value 0 for str_m is + * allowed by ISO C99 (and GNU C library 2.1) - (pointed out + * on 2000-05-04 by Caolan McNamara, caolan@ csn dot ul dot ie). + * Besides relaxed license this change in standards adherence + * is the main reason to bump up the major version number; + * - added nonstandard routines asnprintf, vasnprintf, asprintf, + * vasprintf that dynamically allocate storage for the + * resulting string; these routines are not compiled by default, + * see comments where NEED_V?ASN?PRINTF macros are defined; + * - autoconf contributed by Caolan McNamara + * 2000-10-06 V2.2 Mark Martinec + * - BUG FIX: the %c conversion used a temporary variable + * that was no longer in scope when referenced, + * possibly causing incorrect resulting character; + * - BUG FIX: make precision and minimal field width unsigned + * to handle huge values (2^31 <= n < 2^32) correctly; + * also be more careful in the use of signed/unsigned/size_t + * internal variables - probably more careful than many + * vendor implementations, but there may still be a case + * where huge values of str_m, precision or minimal field + * could cause incorrect behaviour; + * - use separate variables for signed/unsigned arguments, + * and for short/int, long, and long long argument lengths + * to avoid possible incompatibilities on certain + * computer architectures. Also use separate variable + * arg_sign to hold sign of a numeric argument, + * to make code more transparent; + * - some fiddling with zero padding and "0x" to make it + * Linux compatible; + * - systematically use macros fast_memcpy and fast_memset + * instead of case-by-case hand optimization; determine some + * breakeven string lengths for different architectures; + * - terminology change: 'format' -> 'conversion specifier', + * 'C9x' -> 'ISO/IEC 9899:1999 ("ISO C99")', + * 'alternative form' -> 'alternate form', + * 'data type modifier' -> 'length modifier'; + * - several comments rephrased and new ones added; + * - make compiler not complain about 'credits' defined but + * not used; + */ + + +/* Define HAVE_SNPRINTF if your system already has snprintf and vsnprintf. + * + * If HAVE_SNPRINTF is defined this module will not produce code for + * snprintf and vsnprintf, unless PREFER_PORTABLE_SNPRINTF is defined as well, + * causing this portable version of snprintf to be called portable_snprintf + * (and portable_vsnprintf). + */ +/* #define HAVE_SNPRINTF */ + +/* Define PREFER_PORTABLE_SNPRINTF if your system does have snprintf and + * vsnprintf but you would prefer to use the portable routine(s) instead. + * In this case the portable routine is declared as portable_snprintf + * (and portable_vsnprintf) and a macro 'snprintf' (and 'vsnprintf') + * is defined to expand to 'portable_v?snprintf' - see file snprintf.h . + * Defining this macro is only useful if HAVE_SNPRINTF is also defined, + * but does does no harm if defined nevertheless. + */ +/* #define PREFER_PORTABLE_SNPRINTF */ + +/* Define SNPRINTF_LONGLONG_SUPPORT if you want to support + * data type (long long int) and length modifier 'll' (e.g. %lld). + * If undefined, 'll' is recognized but treated as a single 'l'. + * + * If the system's sprintf does not handle 'll' + * the SNPRINTF_LONGLONG_SUPPORT must not be defined! + * + * This is off by default as (long long int) is a language extension. + */ +/* #define SNPRINTF_LONGLONG_SUPPORT */ + +/* Define NEED_SNPRINTF_ONLY if you only need snprintf, and not vsnprintf. + * If NEED_SNPRINTF_ONLY is defined, the snprintf will be defined directly, + * otherwise both snprintf and vsnprintf routines will be defined + * and snprintf will be a simple wrapper around vsnprintf, at the expense + * of an extra procedure call. + */ +/* #define NEED_SNPRINTF_ONLY */ + +/* Define NEED_V?ASN?PRINTF macros if you need library extension + * routines asprintf, vasprintf, asnprintf, vasnprintf respectively, + * and your system library does not provide them. They are all small + * wrapper routines around portable_vsnprintf. Defining any of the four + * NEED_V?ASN?PRINTF macros automatically turns off NEED_SNPRINTF_ONLY + * and turns on PREFER_PORTABLE_SNPRINTF. + * + * Watch for name conflicts with the system library if these routines + * are already present there. + * + * NOTE: vasprintf and vasnprintf routines need va_copy() from stdarg.h, as + * specified by C99, to be able to traverse the same list of arguments twice. + * I don't know of any other standard and portable way of achieving the same. + * With some versions of gcc you may use __va_copy(). You might even get away + * with "ap2 = ap", in this case you must not call va_end(ap2) ! + * #define va_copy(ap2,ap) ap2 = ap + */ +/* #define NEED_ASPRINTF */ +/* #define NEED_ASNPRINTF */ +/* #define NEED_VASPRINTF */ +/* #define NEED_VASNPRINTF */ + + +/* Define the following macros if desired: + * SOLARIS_COMPATIBLE, SOLARIS_BUG_COMPATIBLE, + * HPUX_COMPATIBLE, HPUX_BUG_COMPATIBLE, LINUX_COMPATIBLE, + * DIGITAL_UNIX_COMPATIBLE, DIGITAL_UNIX_BUG_COMPATIBLE, + * PERL_COMPATIBLE, PERL_BUG_COMPATIBLE, + * + * - For portable applications it is best not to rely on peculiarities + * of a given implementation so it may be best not to define any + * of the macros that select compatibility and to avoid features + * that vary among the systems. + * + * - Selecting compatibility with more than one operating system + * is not strictly forbidden but is not recommended. + * + * - 'x'_BUG_COMPATIBLE implies 'x'_COMPATIBLE . + * + * - 'x'_COMPATIBLE refers to (and enables) a behaviour that is + * documented in a sprintf man page on a given operating system + * and actually adhered to by the system's sprintf (but not on + * most other operating systems). It may also refer to and enable + * a behaviour that is declared 'undefined' or 'implementation specific' + * in the man page but a given implementation behaves predictably + * in a certain way. + * + * - 'x'_BUG_COMPATIBLE refers to (and enables) a behaviour of system's sprintf + * that contradicts the sprintf man page on the same operating system. + * + * - I do not claim that the 'x'_COMPATIBLE and 'x'_BUG_COMPATIBLE + * conditionals take into account all idiosyncrasies of a particular + * implementation, there may be other incompatibilities. + */ + + + +/* ============================================= */ +/* NO USER SERVICABLE PARTS FOLLOWING THIS POINT */ +/* ============================================= */ + +#define PORTABLE_SNPRINTF_VERSION_MAJOR 2 +#define PORTABLE_SNPRINTF_VERSION_MINOR 2 + +#if defined(NEED_ASPRINTF) || defined(NEED_ASNPRINTF) || defined(NEED_VASPRINTF) || defined(NEED_VASNPRINTF) +# if defined(NEED_SNPRINTF_ONLY) +# undef NEED_SNPRINTF_ONLY +# endif +# if !defined(PREFER_PORTABLE_SNPRINTF) +# define PREFER_PORTABLE_SNPRINTF +# endif +#endif + +#if defined(SOLARIS_BUG_COMPATIBLE) && !defined(SOLARIS_COMPATIBLE) +#define SOLARIS_COMPATIBLE +#endif + +#if defined(HPUX_BUG_COMPATIBLE) && !defined(HPUX_COMPATIBLE) +#define HPUX_COMPATIBLE +#endif + +#if defined(DIGITAL_UNIX_BUG_COMPATIBLE) && !defined(DIGITAL_UNIX_COMPATIBLE) +#define DIGITAL_UNIX_COMPATIBLE +#endif + +#if defined(PERL_BUG_COMPATIBLE) && !defined(PERL_COMPATIBLE) +#define PERL_COMPATIBLE +#endif + +#if defined(LINUX_BUG_COMPATIBLE) && !defined(LINUX_COMPATIBLE) +#define LINUX_COMPATIBLE +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef isdigit +#undef isdigit +#endif +#define isdigit(c) ((c) >= '0' && (c) <= '9') + +/* For copying strings longer or equal to 'breakeven_point' + * it is more efficient to call memcpy() than to do it inline. + * The value depends mostly on the processor architecture, + * but also on the compiler and its optimization capabilities. + * The value is not critical, some small value greater than zero + * will be just fine if you don't care to squeeze every drop + * of performance out of the code. + * + * Small values favor memcpy, large values favor inline code. + */ +#if defined(__alpha__) || defined(__alpha) +# define breakeven_point 2 /* AXP (DEC Alpha) - gcc or cc or egcs */ +#endif +#if defined(__i386__) || defined(__i386) +# define breakeven_point 12 /* Intel Pentium/Linux - gcc 2.96 */ +#endif +#if defined(__hppa) +# define breakeven_point 10 /* HP-PA - gcc */ +#endif +#if defined(__sparc__) || defined(__sparc) +# define breakeven_point 33 /* Sun Sparc 5 - gcc 2.8.1 */ +#endif + +/* some other values of possible interest: */ +/* #define breakeven_point 8 */ /* VAX 4000 - vaxc */ +/* #define breakeven_point 19 */ /* VAX 4000 - gcc 2.7.0 */ + +#ifndef breakeven_point +# define breakeven_point 6 /* some reasonable one-size-fits-all value */ +#endif + +#define fast_memcpy(d,s,n) \ + { register size_t nn = (size_t)(n); \ + if (nn >= breakeven_point) memcpy((d), (s), nn); \ + else if (nn > 0) { /* proc call overhead is worth only for large strings*/\ + register char *dd; register const char *ss; \ + for (ss=(s), dd=(d); nn>0; nn--) *dd++ = *ss++; } } + +#define fast_memset(d,c,n) \ + { register size_t nn = (size_t)(n); \ + if (nn >= breakeven_point) memset((d), (int)(c), nn); \ + else if (nn > 0) { /* proc call overhead is worth only for large strings*/\ + register char *dd; register const int cc=(int)(c); \ + for (dd=(d); nn>0; nn--) *dd++ = cc; } } + +/* prototypes */ + +#if defined(NEED_ASPRINTF) +int asprintf (char **ptr, const char *fmt, /*args*/ ...); +#endif +#if defined(NEED_VASPRINTF) +int vasprintf (char **ptr, const char *fmt, va_list ap); +#endif +#if defined(NEED_ASNPRINTF) +int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...); +#endif +#if defined(NEED_VASNPRINTF) +int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap); +#endif + +#if defined(HAVE_SNPRINTF) +/* declare our portable snprintf routine under name portable_snprintf */ +/* declare our portable vsnprintf routine under name portable_vsnprintf */ +#else +/* declare our portable routines under names snprintf and vsnprintf */ +#define portable_snprintf snprintf +#if !defined(NEED_SNPRINTF_ONLY) +#define portable_vsnprintf vsnprintf +#endif +#endif + +#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) +int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...); +#if !defined(NEED_SNPRINTF_ONLY) +int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap); +#endif +#endif + +/* declarations */ + +static char credits[] = "\n\ +@(#)snprintf.c, v2.2: Mark Martinec, \n\ +@(#)snprintf.c, v2.2: Copyright 1999, Mark Martinec. Frontier Artistic License applies.\n\ +@(#)snprintf.c, v2.2: http://www.ijs.si/software/snprintf/\n"; + +#if defined(NEED_ASPRINTF) +int asprintf(char **ptr, const char *fmt, /*args*/ ...) { + va_list ap; + size_t str_m; + int str_l; + + *ptr = NULL; + va_start(ap, fmt); /* measure the required size */ + str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap); + va_end(ap); + assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */ + *ptr = (char *) malloc(str_m = (size_t)str_l + 1); + if (*ptr == NULL) { errno = ENOMEM; str_l = -1; } + else { + int str_l2; + va_start(ap, fmt); + str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap); + va_end(ap); + assert(str_l2 == str_l); + } + return str_l; +} +#endif + +#if defined(NEED_VASPRINTF) +int vasprintf(char **ptr, const char *fmt, va_list ap) { + size_t str_m; + int str_l; + + *ptr = NULL; + { va_list ap2; + va_copy(ap2, ap); /* don't consume the original ap, we'll need it again */ + str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap2);/*get required size*/ + va_end(ap2); + } + assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */ + *ptr = (char *) malloc(str_m = (size_t)str_l + 1); + if (*ptr == NULL) { errno = ENOMEM; str_l = -1; } + else { + int str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap); + assert(str_l2 == str_l); + } + return str_l; +} +#endif + +#if defined(NEED_ASNPRINTF) +int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...) { + va_list ap; + int str_l; + + *ptr = NULL; + va_start(ap, fmt); /* measure the required size */ + str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap); + va_end(ap); + assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */ + if ((size_t)str_l + 1 < str_m) str_m = (size_t)str_l + 1; /* truncate */ + /* if str_m is 0, no buffer is allocated, just set *ptr to NULL */ + if (str_m == 0) { /* not interested in resulting string, just return size */ + } else { + *ptr = (char *) malloc(str_m); + if (*ptr == NULL) { errno = ENOMEM; str_l = -1; } + else { + int str_l2; + va_start(ap, fmt); + str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap); + va_end(ap); + assert(str_l2 == str_l); + } + } + return str_l; +} +#endif + +#if defined(NEED_VASNPRINTF) +int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap) { + int str_l; + + *ptr = NULL; + { va_list ap2; + va_copy(ap2, ap); /* don't consume the original ap, we'll need it again */ + str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap2);/*get required size*/ + va_end(ap2); + } + assert(str_l >= 0); /* possible integer overflow if str_m > INT_MAX */ + if ((size_t)str_l + 1 < str_m) str_m = (size_t)str_l + 1; /* truncate */ + /* if str_m is 0, no buffer is allocated, just set *ptr to NULL */ + if (str_m == 0) { /* not interested in resulting string, just return size */ + } else { + *ptr = (char *) malloc(str_m); + if (*ptr == NULL) { errno = ENOMEM; str_l = -1; } + else { + int str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap); + assert(str_l2 == str_l); + } + } + return str_l; +} +#endif + +/* + * If the system does have snprintf and the portable routine is not + * specifically required, this module produces no code for snprintf/vsnprintf. + */ +#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) + +#if !defined(NEED_SNPRINTF_ONLY) +int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...) { + va_list ap; + int str_l; + + va_start(ap, fmt); + str_l = portable_vsnprintf(str, str_m, fmt, ap); + va_end(ap); + return str_l; +} +#endif + +#if defined(NEED_SNPRINTF_ONLY) +int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...) { +#else +int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap) { +#endif + +#if defined(NEED_SNPRINTF_ONLY) + va_list ap; +#endif + size_t str_l = 0; + const char *p = fmt; + +/* In contrast with POSIX, the ISO C99 now says + * that str can be NULL and str_m can be 0. + * This is more useful than the old: if (str_m < 1) return -1; */ + +#if defined(NEED_SNPRINTF_ONLY) + va_start(ap, fmt); +#endif + if (!p) p = ""; + while (*p) { + if (*p != '%') { + /* if (str_l < str_m) str[str_l++] = *p++; -- this would be sufficient */ + /* but the following code achieves better performance for cases + * where format string is long and contains few conversions */ + const char *q = strchr(p+1,'%'); + size_t n = !q ? strlen(p) : (q-p); + if (str_l < str_m) { + size_t avail = str_m-str_l; + fast_memcpy(str+str_l, p, (n>avail?avail:n)); + } + p += n; str_l += n; + } else { + const char *starting_p; + size_t min_field_width = 0, precision = 0; + int zero_padding = 0, precision_specified = 0, justify_left = 0; + int alternate_form = 0, force_sign = 0; + int space_for_positive = 1; /* If both the ' ' and '+' flags appear, + the ' ' flag should be ignored. */ + char length_modifier = '\0'; /* allowed values: \0, h, l, L */ + char tmp[32];/* temporary buffer for simple numeric->string conversion */ + + const char *str_arg; /* string address in case of string argument */ + size_t str_arg_l; /* natural field width of arg without padding + and sign */ + unsigned char uchar_arg; + /* unsigned char argument value - only defined for c conversion. + N.B. standard explicitly states the char argument for + the c conversion is unsigned */ + + size_t number_of_zeros_to_pad = 0; + /* number of zeros to be inserted for numeric conversions + as required by the precision or minimal field width */ + + size_t zero_padding_insertion_ind = 0; + /* index into tmp where zero padding is to be inserted */ + + char fmt_spec = '\0'; + /* current conversion specifier character */ + + str_arg = credits;/* just to make compiler happy (defined but not used)*/ + str_arg = NULL; + starting_p = p; p++; /* skip '%' */ + /* parse flags */ + while (*p == '0' || *p == '-' || *p == '+' || + *p == ' ' || *p == '#' || *p == '\'') { + switch (*p) { + case '0': zero_padding = 1; break; + case '-': justify_left = 1; break; + case '+': force_sign = 1; space_for_positive = 0; break; + case ' ': force_sign = 1; + /* If both the ' ' and '+' flags appear, the ' ' flag should be ignored */ +#ifdef PERL_COMPATIBLE + /* ... but in Perl the last of ' ' and '+' applies */ + space_for_positive = 1; +#endif + break; + case '#': alternate_form = 1; break; + case '\'': break; + } + p++; + } + /* If the '0' and '-' flags both appear, the '0' flag should be ignored. */ + + /* parse field width */ + if (*p == '*') { + int j; + p++; j = va_arg(ap, int); + if (j >= 0) min_field_width = j; + else { min_field_width = -j; justify_left = 1; } + } else if (isdigit((int)(*p))) { + /* size_t could be wider than unsigned int; + make sure we treat argument like common implementations do */ + unsigned int uj = *p++ - '0'; + while (isdigit((int)(*p))) uj = 10*uj + (unsigned int)(*p++ - '0'); + min_field_width = uj; + } + /* parse precision */ + if (*p == '.') { + p++; precision_specified = 1; + if (*p == '*') { + int j = va_arg(ap, int); + p++; + if (j >= 0) precision = j; + else { + precision_specified = 0; precision = 0; + /* NOTE: + * Solaris 2.6 man page claims that in this case the precision + * should be set to 0. Digital Unix 4.0, HPUX 10 and BSD man page + * claim that this case should be treated as unspecified precision, + * which is what we do here. + */ + } + } else if (isdigit((int)(*p))) { + /* size_t could be wider than unsigned int; + make sure we treat argument like common implementations do */ + unsigned int uj = *p++ - '0'; + while (isdigit((int)(*p))) uj = 10*uj + (unsigned int)(*p++ - '0'); + precision = uj; + } + } + /* parse 'h', 'l' and 'll' length modifiers */ + if (*p == 'h' || *p == 'l') { + length_modifier = *p; p++; + if (length_modifier == 'l' && *p == 'l') { /* double l = long long */ +#ifdef SNPRINTF_LONGLONG_SUPPORT + length_modifier = '2'; /* double l encoded as '2' */ +#else + length_modifier = 'l'; /* treat it as a single 'l' */ +#endif + p++; + } + } + fmt_spec = *p; + /* common synonyms: */ + switch (fmt_spec) { + case 'i': fmt_spec = 'd'; break; + case 'D': fmt_spec = 'd'; length_modifier = 'l'; break; + case 'U': fmt_spec = 'u'; length_modifier = 'l'; break; + case 'O': fmt_spec = 'o'; length_modifier = 'l'; break; + default: break; + } + /* get parameter value, do initial processing */ + switch (fmt_spec) { + case '%': /* % behaves similar to 's' regarding flags and field widths */ + case 'c': /* c behaves similar to 's' regarding flags and field widths */ + case 's': + length_modifier = '\0'; /* wint_t and wchar_t not supported */ + /* the result of zero padding flag with non-numeric conversion specifier*/ + /* is undefined. Solaris and HPUX 10 does zero padding in this case, */ + /* Digital Unix and Linux does not. */ +#if !defined(SOLARIS_COMPATIBLE) && !defined(HPUX_COMPATIBLE) + zero_padding = 0; /* turn zero padding off for string conversions */ +#endif + str_arg_l = 1; + switch (fmt_spec) { + case '%': + str_arg = p; break; + case 'c': { + int j = va_arg(ap, int); + uchar_arg = (unsigned char) j; /* standard demands unsigned char */ + str_arg = (const char *) &uchar_arg; + break; + } + case 's': + str_arg = va_arg(ap, const char *); + if (!str_arg) str_arg_l = 0; + /* make sure not to address string beyond the specified precision !!! */ + else if (!precision_specified) str_arg_l = strlen(str_arg); + /* truncate string if necessary as requested by precision */ + else if (precision == 0) str_arg_l = 0; + else { + /* memchr on HP does not like n > 2^31 !!! */ + const char *q = memchr(str_arg, '\0', + precision <= 0x7fffffff ? precision : 0x7fffffff); + str_arg_l = !q ? precision : (q-str_arg); + } + break; + default: break; + } + break; + case 'd': case 'u': case 'o': case 'x': case 'X': case 'p': { + /* NOTE: the u, o, x, X and p conversion specifiers imply + the value is unsigned; d implies a signed value */ + + int arg_sign = 0; + /* 0 if numeric argument is zero (or if pointer is NULL for 'p'), + +1 if greater than zero (or nonzero for unsigned arguments), + -1 if negative (unsigned argument is never negative) */ + + int int_arg = 0; unsigned int uint_arg = 0; + /* only defined for length modifier h, or for no length modifiers */ + + long int long_arg = 0; unsigned long int ulong_arg = 0; + /* only defined for length modifier l */ + + void *ptr_arg = NULL; + /* pointer argument value -only defined for p conversion */ + +#ifdef SNPRINTF_LONGLONG_SUPPORT + long long int long_long_arg = 0; + unsigned long long int ulong_long_arg = 0; + /* only defined for length modifier ll */ +#endif + if (fmt_spec == 'p') { + /* HPUX 10: An l, h, ll or L before any other conversion character + * (other than d, i, u, o, x, or X) is ignored. + * Digital Unix: + * not specified, but seems to behave as HPUX does. + * Solaris: If an h, l, or L appears before any other conversion + * specifier (other than d, i, u, o, x, or X), the behavior + * is undefined. (Actually %hp converts only 16-bits of address + * and %llp treats address as 64-bit data which is incompatible + * with (void *) argument on a 32-bit system). + */ +#ifdef SOLARIS_COMPATIBLE +# ifdef SOLARIS_BUG_COMPATIBLE + /* keep length modifiers even if it represents 'll' */ +# else + if (length_modifier == '2') length_modifier = '\0'; +# endif +#else + length_modifier = '\0'; +#endif + ptr_arg = va_arg(ap, void *); + if (ptr_arg != NULL) arg_sign = 1; + } else if (fmt_spec == 'd') { /* signed */ + switch (length_modifier) { + case '\0': + case 'h': + /* It is non-portable to specify a second argument of char or short + * to va_arg, because arguments seen by the called function + * are not char or short. C converts char and short arguments + * to int before passing them to a function. + */ + int_arg = va_arg(ap, int); + if (int_arg > 0) arg_sign = 1; + else if (int_arg < 0) arg_sign = -1; + break; + case 'l': + long_arg = va_arg(ap, long int); + if (long_arg > 0) arg_sign = 1; + else if (long_arg < 0) arg_sign = -1; + break; +#ifdef SNPRINTF_LONGLONG_SUPPORT + case '2': + long_long_arg = va_arg(ap, long long int); + if (long_long_arg > 0) arg_sign = 1; + else if (long_long_arg < 0) arg_sign = -1; + break; +#endif + } + } else { /* unsigned */ + switch (length_modifier) { + case '\0': + case 'h': + uint_arg = va_arg(ap, unsigned int); + if (uint_arg) arg_sign = 1; + break; + case 'l': + ulong_arg = va_arg(ap, unsigned long int); + if (ulong_arg) arg_sign = 1; + break; +#ifdef SNPRINTF_LONGLONG_SUPPORT + case '2': + ulong_long_arg = va_arg(ap, unsigned long long int); + if (ulong_long_arg) arg_sign = 1; + break; +#endif + } + } + str_arg = tmp; str_arg_l = 0; + /* NOTE: + * For d, i, u, o, x, and X conversions, if precision is specified, + * the '0' flag should be ignored. This is so with Solaris 2.6, + * Digital UNIX 4.0, HPUX 10, Linux, FreeBSD, NetBSD; but not with Perl. + */ +#ifndef PERL_COMPATIBLE + if (precision_specified) zero_padding = 0; +#endif + if (fmt_spec == 'd') { + if (force_sign && arg_sign >= 0) + tmp[str_arg_l++] = space_for_positive ? ' ' : '+'; + /* leave negative numbers for sprintf to handle, + to avoid handling tricky cases like (short int)(-32768) */ +#ifdef LINUX_COMPATIBLE + } else if (fmt_spec == 'p' && force_sign && arg_sign > 0) { + tmp[str_arg_l++] = space_for_positive ? ' ' : '+'; +#endif + } else if (alternate_form) { + if (arg_sign != 0 && (fmt_spec == 'x' || fmt_spec == 'X') ) + { tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = fmt_spec; } + /* alternate form should have no effect for p conversion, but ... */ +#ifdef HPUX_COMPATIBLE + else if (fmt_spec == 'p' + /* HPUX 10: for an alternate form of p conversion, + * a nonzero result is prefixed by 0x. */ +#ifndef HPUX_BUG_COMPATIBLE + /* Actually it uses 0x prefix even for a zero value. */ + && arg_sign != 0 +#endif + ) { tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = 'x'; } +#endif + } + zero_padding_insertion_ind = str_arg_l; + if (!precision_specified) precision = 1; /* default precision is 1 */ + if (precision == 0 && arg_sign == 0 +#if defined(HPUX_BUG_COMPATIBLE) || defined(LINUX_COMPATIBLE) + && fmt_spec != 'p' + /* HPUX 10 man page claims: With conversion character p the result of + * converting a zero value with a precision of zero is a null string. + * Actually HP returns all zeroes, and Linux returns "(nil)". */ +#endif + ) { + /* converted to null string */ + /* When zero value is formatted with an explicit precision 0, + the resulting formatted string is empty (d, i, u, o, x, X, p). */ + } else { + char f[5]; int f_l = 0; + f[f_l++] = '%'; /* construct a simple format string for sprintf */ + if (!length_modifier) { } + else if (length_modifier=='2') { f[f_l++] = 'l'; f[f_l++] = 'l'; } + else f[f_l++] = length_modifier; + f[f_l++] = fmt_spec; f[f_l++] = '\0'; + if (fmt_spec == 'p') str_arg_l += sprintf(tmp+str_arg_l, f, ptr_arg); + else if (fmt_spec == 'd') { /* signed */ + switch (length_modifier) { + case '\0': + case 'h': str_arg_l+=sprintf(tmp+str_arg_l, f, int_arg); break; + case 'l': str_arg_l+=sprintf(tmp+str_arg_l, f, long_arg); break; +#ifdef SNPRINTF_LONGLONG_SUPPORT + case '2': str_arg_l+=sprintf(tmp+str_arg_l,f,long_long_arg); break; +#endif + } + } else { /* unsigned */ + switch (length_modifier) { + case '\0': + case 'h': str_arg_l+=sprintf(tmp+str_arg_l, f, uint_arg); break; + case 'l': str_arg_l+=sprintf(tmp+str_arg_l, f, ulong_arg); break; +#ifdef SNPRINTF_LONGLONG_SUPPORT + case '2': str_arg_l+=sprintf(tmp+str_arg_l,f,ulong_long_arg);break; +#endif + } + } + /* include the optional minus sign and possible "0x" + in the region before the zero padding insertion point */ + if (zero_padding_insertion_ind < str_arg_l && + tmp[zero_padding_insertion_ind] == '-') { + zero_padding_insertion_ind++; + } + if (zero_padding_insertion_ind+1 < str_arg_l && + tmp[zero_padding_insertion_ind] == '0' && + (tmp[zero_padding_insertion_ind+1] == 'x' || + tmp[zero_padding_insertion_ind+1] == 'X') ) { + zero_padding_insertion_ind += 2; + } + } + { size_t num_of_digits = str_arg_l - zero_padding_insertion_ind; + if (alternate_form && fmt_spec == 'o' +#ifdef HPUX_COMPATIBLE /* ("%#.o",0) -> "" */ + && (str_arg_l > 0) +#endif +#ifdef DIGITAL_UNIX_BUG_COMPATIBLE /* ("%#o",0) -> "00" */ +#else + /* unless zero is already the first character */ + && !(zero_padding_insertion_ind < str_arg_l + && tmp[zero_padding_insertion_ind] == '0') +#endif + ) { /* assure leading zero for alternate-form octal numbers */ + if (!precision_specified || precision < num_of_digits+1) { + /* precision is increased to force the first character to be zero, + except if a zero value is formatted with an explicit precision + of zero */ + precision = num_of_digits+1; precision_specified = 1; + } + } + /* zero padding to specified precision? */ + if (num_of_digits < precision) + number_of_zeros_to_pad = precision - num_of_digits; + } + /* zero padding to specified minimal field width? */ + if (!justify_left && zero_padding) { + int n = min_field_width - (str_arg_l+number_of_zeros_to_pad); + if (n > 0) number_of_zeros_to_pad += n; + } + break; + } + default: /* unrecognized conversion specifier, keep format string as-is*/ + zero_padding = 0; /* turn zero padding off for non-numeric convers. */ +#ifndef DIGITAL_UNIX_COMPATIBLE + justify_left = 1; min_field_width = 0; /* reset flags */ +#endif +#if defined(PERL_COMPATIBLE) || defined(LINUX_COMPATIBLE) + /* keep the entire format string unchanged */ + str_arg = starting_p; str_arg_l = p - starting_p; + /* well, not exactly so for Linux, which does something inbetween, + * and I don't feel an urge to imitate it: "%+++++hy" -> "%+y" */ +#else + /* discard the unrecognized conversion, just keep * + * the unrecognized conversion character */ + str_arg = p; str_arg_l = 0; +#endif + if (*p) str_arg_l++; /* include invalid conversion specifier unchanged + if not at end-of-string */ + break; + } + if (*p) p++; /* step over the just processed conversion specifier */ + /* insert padding to the left as requested by min_field_width; + this does not include the zero padding in case of numerical conversions*/ + if (!justify_left) { /* left padding with blank or zero */ + int n = min_field_width - (str_arg_l+number_of_zeros_to_pad); + if (n > 0) { + if (str_l < str_m) { + size_t avail = str_m-str_l; + fast_memset(str+str_l, (zero_padding?'0':' '), (n>avail?avail:n)); + } + str_l += n; + } + } + /* zero padding as requested by the precision or by the minimal field width + * for numeric conversions required? */ + if (number_of_zeros_to_pad <= 0) { + /* will not copy first part of numeric right now, * + * force it to be copied later in its entirety */ + zero_padding_insertion_ind = 0; + } else { + /* insert first part of numerics (sign or '0x') before zero padding */ + int n = zero_padding_insertion_ind; + if (n > 0) { + if (str_l < str_m) { + size_t avail = str_m-str_l; + fast_memcpy(str+str_l, str_arg, (n>avail?avail:n)); + } + str_l += n; + } + /* insert zero padding as requested by the precision or min field width */ + n = number_of_zeros_to_pad; + if (n > 0) { + if (str_l < str_m) { + size_t avail = str_m-str_l; + fast_memset(str+str_l, '0', (n>avail?avail:n)); + } + str_l += n; + } + } + /* insert formatted string + * (or as-is conversion specifier for unknown conversions) */ + { int n = str_arg_l - zero_padding_insertion_ind; + if (n > 0) { + if (str_l < str_m) { + size_t avail = str_m-str_l; + fast_memcpy(str+str_l, str_arg+zero_padding_insertion_ind, + (n>avail?avail:n)); + } + str_l += n; + } + } + /* insert right padding */ + if (justify_left) { /* right blank padding to the field width */ + int n = min_field_width - (str_arg_l+number_of_zeros_to_pad); + if (n > 0) { + if (str_l < str_m) { + size_t avail = str_m-str_l; + fast_memset(str+str_l, ' ', (n>avail?avail:n)); + } + str_l += n; + } + } + } + } +#if defined(NEED_SNPRINTF_ONLY) + va_end(ap); +#endif + if (str_m > 0) { /* make sure the string is null-terminated + even at the expense of overwriting the last character + (shouldn't happen, but just in case) */ + str[str_l <= str_m-1 ? str_l : str_m-1] = '\0'; + } + /* Return the number of characters formatted (excluding trailing null + * character), that is, the number of characters that would have been + * written to the buffer if it were large enough. + * + * The value of str_l should be returned, but str_l is of unsigned type + * size_t, and snprintf is int, possibly leading to an undetected + * integer overflow, resulting in a negative return value, which is illegal. + * Both XSH5 and ISO C99 (at least the draft) are silent on this issue. + * Should errno be set to EOVERFLOW and EOF returned in this case??? + */ + return (int) str_l; +} +#endif diff --git a/contrib/media/updf_newlib/pdf/snprintf.h b/contrib/media/updf_newlib/pdf/snprintf.h new file mode 100755 index 000000000..70ec84157 --- /dev/null +++ b/contrib/media/updf_newlib/pdf/snprintf.h @@ -0,0 +1,26 @@ +#ifndef _PORTABLE_SNPRINTF_H_ +#define _PORTABLE_SNPRINTF_H_ + +#define PORTABLE_SNPRINTF_VERSION_MAJOR 2 +#define PORTABLE_SNPRINTF_VERSION_MINOR 2 + +#ifdef HAVE_SNPRINTF +#include +#else +extern int snprintf(char *, size_t, const char *, /*args*/ ...); +extern int vsnprintf(char *, size_t, const char *, va_list); +#endif + +#if defined(HAVE_SNPRINTF) && defined(PREFER_PORTABLE_SNPRINTF) +extern int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...); +extern int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap); +#define snprintf portable_snprintf +#define vsnprintf portable_vsnprintf +#endif + +extern int asprintf (char **ptr, const char *fmt, /*args*/ ...); +extern int vasprintf (char **ptr, const char *fmt, va_list ap); +extern int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...); +extern int vasnprintf(char **ptr, size_t str_m, const char *fmt, va_list ap); + +#endif