[xiph-commits] r18325 - branches/spectrum-gtk3

xiphmont at svn.xiph.org xiphmont at svn.xiph.org
Fri May 25 10:35:00 PDT 2012


Author: xiphmont
Date: 2012-05-25 10:35:00 -0700 (Fri, 25 May 2012)
New Revision: 18325

Modified:
   branches/spectrum-gtk3/Makefile
   branches/spectrum-gtk3/fisharray.h
   branches/spectrum-gtk3/spec_panel.c
   branches/spectrum-gtk3/spec_plot.c
   branches/spectrum-gtk3/spec_plot.h
   branches/spectrum-gtk3/spec_process.c
   branches/spectrum-gtk3/version.h
Log:
In-progress gtk3 migration initial commit to branch



Modified: branches/spectrum-gtk3/Makefile
===================================================================
--- branches/spectrum-gtk3/Makefile	2012-05-25 17:30:34 UTC (rev 18324)
+++ branches/spectrum-gtk3/Makefile	2012-05-25 17:35:00 UTC (rev 18325)
@@ -30,7 +30,7 @@
 WAVEFORM_OBJ = waveform.o wave_process.o wave_panel.o wave_plot.o io.o
 OBJ = $(SPECTRUM_OBJ) $(WAVEFORM_OBJ)
 
-GCF = -DETCDIR=\\\"$(ETCDIR)\\\" `pkg-config --cflags gtk+-2.0` -DGTK_DISABLE_SINGLE_INCLUDES
+GCF = `pkg-config --cflags gtk+-3.0` -DETCDIR=$(ETCDIR) -DGTK_DISABLE_SINGLE_INCLUDES -DGSEAL_ENABLE #-DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE
 
 CFLAGS := ${CFLAGS} $(GCF) $(ADD_DEF)
 
@@ -41,7 +41,7 @@
 	$(MAKE) target CFLAGS="${CFLAGS} -g -Wall -W -Wno-unused-parameter -D__NO_MATH_INLINES"
 
 profile:
-	$(MAKE) target CFLAGS="${CFLAGS} -pg -g -O3 -ffast-math" LIBS="-lgprof-helper "
+	$(MAKE) target CFLAGS="${CFLAGS} -pg -g -O3 -ffast-math"
 
 clean:
 	rm -f $(OBJ) *.d *.d.* gmon.out spectrum
@@ -62,13 +62,13 @@
 
 spectrum:  $(SPECTRUM_OBJ) spectrum-wisdomrc
 	./touch-version
-	$(LD) $(SPECTRUM_OBJ) -o spectrum $(LIBS) $(CFLAGS) `pkg-config --libs gtk+-2.0` -lpthread -lfftw3f -lm 
+	$(LD) $(SPECTRUM_OBJ) -o spectrum $(LIBS) $(CFLAGS) `pkg-config --libs gtk+-3.0` -lpthread -lfftw3f -lm 
 
 waveform:  $(WAVEFORM_OBJ) 
 	./touch-version
-	$(LD) $(WAVEFORM_OBJ) -o waveform $(LIBS) $(CFLAGS) `pkg-config --libs gtk+-2.0` -lpthread -lm 
+	$(LD) $(WAVEFORM_OBJ) -o waveform $(LIBS) $(CFLAGS) `pkg-config --libs gtk+-3.0` -lpthread -lm 
 
-target:  spectrum waveform
+target:  spectrum # waveform
 
 install: target
 	$(INSTALL) -d -m 0755 $(BINDIR)

Modified: branches/spectrum-gtk3/fisharray.h
===================================================================
--- branches/spectrum-gtk3/fisharray.h	2012-05-25 17:30:34 UTC (rev 18324)
+++ branches/spectrum-gtk3/fisharray.h	2012-05-25 17:35:00 UTC (rev 18325)
@@ -1,276 +1,1160 @@
-/* XPM */
-static char * fisharray_xpm[] = {
-"532 25 248 2",
-"  	c None",
-". 	c #546392",
-"+ 	c #3B417D",
-"@ 	c #002174",
-"# 	c #65658D",
-"$ 	c #001A6E",
-"% 	c #002F7E",
-"& 	c #5E6990",
-"* 	c #47497F",
-"= 	c #002578",
-"- 	c #002878",
-"; 	c #003A88",
-"> 	c #005794",
-", 	c #006BA2",
-"' 	c #00629A",
-") 	c #005298",
-"! 	c #00508E",
-"~ 	c #005D9E",
-"{ 	c #00458C",
-"] 	c #004A88",
-"^ 	c #00348A",
-"/ 	c #485388",
-"( 	c #0B7FB5",
-"_ 	c #42E6E8",
-": 	c #58F2DA",
-"< 	c #69F9DC",
-"[ 	c #5DEFE3",
-"} 	c #35D4E3",
-"| 	c #0063A8",
-"1 	c #2EC1CE",
-"2 	c #67EFD7",
-"3 	c #58E4DF",
-"4 	c #21A2B9",
-"5 	c #004E9E",
-"6 	c #4BD9C3",
-"7 	c #53F3D3",
-"8 	c #41D7CB",
-"9 	c #3ECCC7",
-"0 	c #00709E",
-"a 	c #5CEED1",
-"b 	c #59F9D9",
-"c 	c #14B1C8",
-"d 	c #39C2C7",
-"e 	c #015F8F",
-"f 	c #11B4C3",
-"g 	c #8D898D",
-"h 	c #003E78",
-"i 	c #54FEE4",
-"j 	c #60FEDF",
-"k 	c #68FED9",
-"l 	c #63FBE3",
-"m 	c #006EB4",
-"n 	c #00146A",
-"o 	c #17497D",
-"p 	c #297383",
-"q 	c #3EA898",
-"r 	c #67EFC4",
-"s 	c #004592",
-"t 	c #002060",
-"u 	c #365C64",
-"v 	c #24495A",
-"w 	c #94D989",
-"x 	c #78F2BA",
-"y 	c #29CBC5",
-"z 	c #9ED2B4",
-"A 	c #8ADE92",
-"B 	c #6FF9D3",
-"C 	c #00246E",
-"D 	c #24C6C8",
-"E 	c #0790AD",
-"F 	c #00387E",
-"G 	c #F0DEAC",
-"H 	c #EFE1C5",
-"I 	c #D4AE54",
-"J 	c #EF9117",
-"K 	c #F3A715",
-"L 	c #F3AB11",
-"M 	c #B9C050",
-"N 	c #4AFCEA",
-"O 	c #38F2E2",
-"P 	c #0589B5",
-"Q 	c #575C8B",
-"R 	c #EBD29B",
-"S 	c #DEC89E",
-"T 	c #F5ECD3",
-"U 	c #E8B230",
-"V 	c #F29F1C",
-"W 	c #F3A817",
-"X 	c #C1BD4D",
-"Y 	c #4AFCF2",
-"Z 	c #A5A083",
-"` 	c #F8F4E6",
-" .	c #DEAB4A",
-"..	c #D4B24A",
-"+.	c #547792",
-"@.	c #F8F7EE",
-"#.	c #F5F9F5",
-"$.	c #32B9BE",
-"%.	c #D2BE38",
-"&.	c #E5B81B",
-"*.	c #DAB534",
-"=.	c #CDB477",
-"-.	c #A3D177",
-";.	c #CFB96D",
-">.	c #EAEBE7",
-",.	c #D0D4D0",
-"'.	c #4FE3C9",
-").	c #DBDDD9",
-"!.	c #E6B84A",
-"~.	c #E0A934",
-"{.	c #F4B520",
-"].	c #F2A020",
-"^.	c #F09520",
-"/.	c #79E1A0",
-"(.	c #16C1DA",
-"_.	c #73BEC3",
-":.	c #EFDBB5",
-"<.	c #EBCE8F",
-"[.	c #F3B51F",
-"}.	c #F3A61F",
-"|.	c #B0C76B",
-"1.	c #C7C7C1",
-"2.	c #C6C6B6",
-"3.	c #C9C43D",
-"4.	c #79FDD0",
-"5.	c #0C82A0",
-"6.	c #819295",
-"7.	c #4F5620",
-"8.	c #8CC0C2",
-"9.	c #9BC3C5",
-"0.	c #10A0C4",
-"a.	c #55F7F5",
-"b.	c #F19B1F",
-"c.	c #F4AC22",
-"d.	c #EDC371",
-"e.	c #878397",
-"f.	c #33D3CD",
-"g.	c #35D7D9",
-"h.	c #45EFD9",
-"i.	c #CBAB5F",
-"j.	c #E9C453",
-"k.	c #ECD070",
-"l.	c #E8C266",
-"m.	c #000000",
-"n.	c #E9C881",
-"o.	c #F4C73C",
-"p.	c #F19B21",
-"q.	c #5DFDEC",
-"r.	c #44FCE4",
-"s.	c #D7BE89",
-"t.	c #F1C141",
-"u.	c #747773",
-"v.	c #475253",
-"w.	c #E6B738",
-"x.	c #F0CC3C",
-"y.	c #928D84",
-"z.	c #A49F50",
-"A.	c #858363",
-"B.	c #686C40",
-"C.	c #F0B70C",
-"D.	c #8D8A49",
-"E.	c #32D6C9",
-"F.	c #03A0B3",
-"G.	c #F1CB47",
-"H.	c #94D474",
-"I.	c #F3A317",
-"J.	c #EBC233",
-"K.	c #917B2D",
-"L.	c #85A2B7",
-"M.	c #D79B0B",
-"N.	c #F2AE0C",
-"O.	c #CCC4AA",
-"P.	c #B8CAA4",
-"Q.	c #F2BE30",
-"R.	c #F2C62E",
-"S.	c #6DDDA7",
-"T.	c #0CB7C2",
-"U.	c #1CD0C9",
-"V.	c #AAC587",
-"W.	c #ADC064",
-"X.	c #DDCA4F",
-"Y.	c #88EEA3",
-"Z.	c #C9B141",
-"`.	c #63E5AC",
-" +	c #193649",
-".+	c #064C74",
-"++	c #86915D",
-"@+	c #5BB579",
-"#+	c #F5CA45",
-"$+	c #D9C019",
-"%+	c #C0CB63",
-"&+	c #F2CC32",
-"*+	c #7FF3B0",
-"=+	c #717495",
-"-+	c #AFD175",
-";+	c #F2BD1A",
-">+	c #7FC77D",
-",+	c #EED382",
-"'+	c #6DC387",
-")+	c #8BCA64",
-"!+	c #88D379",
-"~+	c #7ADE92",
-"{+	c #E3CA3F",
-"]+	c #DFB715",
-"^+	c #000050",
-"/+	c #8ECA74",
-"(+	c #1888A0",
-"_+	c #64D8AE",
-":+	c #BCC73D",
-"<+	c #D1CD53",
-"[+	c #9DEA8E",
-"}+	c #16BCBE",
-"|+	c #002828",
-"1+	c #E2C53C",
-"2+	c #B8D270",
-"3+	c #8EE892",
-"4+	c #6C7EA4",
-"5+	c #001416",
-"6+	c #4CBC93",
-"7+	c #AAC575",
-"8+	c #A8B64A",
-"9+	c #A8E785",
-"0+	c #002D78",
-"a+	c #57D3C0",
-"b+	c #EF901F",
-"c+	c #45BFA1",
-"d+	c #34B2AA",
-"e+	c #73924A",
-"f+	c #779C4C",
-"g+	c #7DBDC5",
-"h+	c #F4C024",
-"i+	c #639D68",
-"j+	c #3C5244",
-"k+	c #538F71",
-"l+	c #BCB42E",
-"m+	c #577D5C",
-"n+	c #D5900B",
-"o+	c #B49972",
-"p+	c #A95E0D",
-"q+	c #C8870A",
-"r+	c #B8810A",
-"s+	c #8FA458",
-"t+	c #3FE3D5",
-"u+	c #C2960E",
-"v+	c #A29830",
-"w+	c #B0AC4C",
-"x+	c #5E684A",
-"y+	c #134663",
-"                          . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .       
                                               . .                           ",
-"                        + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +     
                                             + @ @ +                         ",
-"                      # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             & $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ &                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #   
                                           # $ % % $ #                       ",
-"                    * = % % % % = *                                         * = - % % % = *                                         * = % - % % = *                                         * = % % % % = *                                         * = % % - % = *                                         * = % % % - = *                                         * = % % % % = *                                         * - % % % % = *                                         * = % % - % = *                                         * = % % % % = *                                         * = % - % % = *                                         * = % % % % - *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = * 
                                         * = % % % % = *                     ",
-"                  & $ ; > , ' ) % $ &                                     & $ % ; ! ~ { % $ &                                     & $ % > ' ' % % $ &                                     & $ % % ] ] % % $ &                                     & $ % % ' ' > % $ &                                     & $ % { ~ ! ; % $ &                                     & $ % ) ' , > ; $ &                                     & $ ; ) ' ' ] % $ &                                     & $ % % { > ; ^ $ &                                     & $ % % { { % % $ &                                     & $ ^ ; > { % % $ &                                     & $ % ] ' ' ) ; $ &                                     & $ ; > , ' ) % $ &                                     & $ ; > , ' ) % $ &                                     & $ ; > , ' ) % $ &                                     & $ ; > , ' ) % $ &                                     & $ ; > , ' ) % $ &                                     & $ ; > , ' ) % $ 
 &                                     & $ ; > , ' ) % $ &                   ",
-"                / = ( _ : < < [ } ( = /                                 / = ^ | 1 2 [ 3 4 5 = /                                 / = % ' 6 7 7 8 ] % = /                                 / = % % ! 9 9 ! % % = /                                 / = % ] 8 7 7 6 ' % = /                                 / = 5 4 3 [ 2 1 | ^ = /                                 / = ( } [ < < : _ ( = /                                 / = 0 1 a b b 2 c ; = /                                 / = % % 0 d : 6 e % = /                                 / = % % % f f % % % = /                                 / = % e 6 : d 0 % % = /                                 / = ; c 2 b b a 1 0 = /                                 / = ( _ : < < [ } ( = /                                 / = ( _ : < < [ } ( = /                                 / = ( _ : < < [ } ( = /                                 / = ( _ : < < [ } ( = /                                 / = ( _ : < < [ } ( = /                                 / = ( _ : < < [ } ( 
 = /                                 / = ( _ : < < [ } ( = /                 ",
-"              g h 9 < b i j k k k l m n &                             g o p q r 2 l i j < 3 s n &                             & t u v q w w x k y ! % n &                             & n % % u z A A z u % % n &                             & n % ! y k x w w q v u t &                             & n s 3 < j i l 2 r q p o g                             & n m l k k k j i b < 9 h g                             & n ' 9 B k j i l l 1 e C #                             & n % % { D j j < a E o n &                             & n % % F p 8 8 p F % % n &                             & n o E a < j j D { % % n &                             # C e 1 l l i j k B 9 ' n &                             g h 9 < b i j k k k l m n &                             g h 9 < b i j k k k l m n &                             g h 9 < b i j k k k l m n &                             g h 9 < b i j k k k l m n &                             g h 9 < b i j k k k l m n &                             g h 9 < b i j k k k l 
 m n &                             g h 9 < b i j k k k l m n &               ",
-"            G H I J K L M x N j k k O P = Q                         R S T T U V W X x Y j k c ^ - Q                         Q - Z ` G  .T T ..k k D ; % = Q                         Q = % % +. at .#.T T #. at .+.% % = Q                         Q = % ; D k k ..T T  .G ` Z - Q                         Q - ^ c k j Y x X W V U T T S R                         Q = P O k k j N x M L K J I H G                         Q = { $.i j Y N r %.&.&.*.=.S Z                         Q { { % > d < k j -.%.;.>.+.= Q                         Q = % % % ,.;.'.'.;.).% % % = Q                         Q = +.>.;.%.-.j k < d > % { { Q                         Z S =.*.&.&.%.r N Y j i $.{ = Q                         !.~.~.J K L M x N j k k O P = Q                         !.~.~.J K L M x N j k k O P = Q                         !.~.~.J K L M x N j k k O P = Q                         !.~.~.J K L M x N j k k O P = Q                         !.~.~.J K L M x N j k k O P = Q                         !.~.~.J K L M x N j k k 
 O P = Q                         !.~.~.J K L M x N j k k O P = Q             ",
-"          H #.,. at .~.{.].^.V %./.i k k j (.n #     _._.            :.<. at .,.).:.[.}.^.K |.l i j 4 % n & _._.                # n % :.1.).:.).2.T 3.4.7 5., , n #                     # n % % % 6.,.7.T T 7.,.6.% % % n #                     # n , , 5.7 4.3.T 2.).:.).1.:.% n #                 _._.& n % 4 j i l |.K ^.}.[.:.).,. at .<.:.            _._.    # n (.j k k i /.%.V ^.].{.~. at .,.#.H               8.D 9.# n % 0.a.N Y /.X b.^.b.c.d. at .).2.e.                    # k f.f.; 5.g.j A X V }.T >.>.% n #                     # n % % % 6.` }.h.h.}.` 6.% % % n #                     # n % >.>.T }.V X A j g.5.; f.f.k #                     e.2.). at .d.c.b.^.b.X /.Y N a.0.% n # 9.D 8.              i.....I ~.{.].^.V %./.i k k j (.n #     _._.            ~.j.k.l.~.{.].^.V %./.i k k j (.n #     _._.            j.k.k.k.~.{.].^.V %./.i k k j (.n #     _._.            j.k.k.k.~.{.].^.V %./.i k k j (.n #     _._.            j.k.k.k.~.{.].^.V %./.i k k j (.n #     _._.            ~.j.k.l.~.{.].^.V %./.i k 
 k j (.n #     _._.            i.....I ~.{.].^.V %./.i k k j (.n #     _._.  ",
-"        [. at .1.m.>.n.o.o.].].p.V -.q.j j l ) = e Y r.k y         s.t.!.#.u.v.T w.x.}.V ^.%.q.i : ) { P k k y             # = % % T y.z.H A.B.#.C.&./.6 k k 0 = #                 # = % % % % D.#.#.G G #.#.D.% % % % = #                 # = 0 k k 6 /.&.C.#.B.A.H z.y.T % % = #             y k k P { ) : i q.%.^.V }.x.w.T v.u.#.!.t.s.        y k r.Y e = ) l j j q.-.V p.].].o.o.n.>.m.1. at .[.            $.k E.F.{ m g.N Y A V p.b.V [.G.n.).m.).s.#                 # = 8 k i f.D N H.I.b.b.J.i.m.>.K.% = #                 # = % % % % L.n.p.h.h.p.d.L.% % % % = #                 # = % K.>.m.i.J.b.b.I.H.N D f.i k 8 = #                 # s.).m.).n.G.[.V b.p.V A Y N g.m { F.E.k $.            [. at .1.m.>.n.o.o.].].p.V -.q.j j l ) = e Y r.k y         [.` M.M.s.n.o.o.].].p.V -.q.j j l ) = e Y r.k y         N.k.k.k.k.M.o.o.].].p.V -.q.j j l ) = e Y r.k y         [.k.k.k.k.n.o.o.].].p.V -.q.j j l ) = e Y r.k y         N.k.k.k.k.M.o.o.].].p.V -.q.j j l ) = e Y r.k y         [.` M.M.s.n.o.o.].].p.V -.q.
 j j l ) = e Y r.k y         [. at .1.m.>.n.o.o.].].p.V -.q.j j l ) = e Y r.k y ",
-"    O.{.J.:.#.). at .!.x.G.[.b.].].b.%.A b N (.} i k k k y       P.{.Q.t.T #.>.R R.G.Q.b.].^.%.S.: c T.j k k U.          # n % ! 0 V.W.X.l. at .#.:.J.].W N.Y.k 0 % n #             # n % % % % F Z.j.V.V.V.V.j.Z.F % % % % n #             # n % 0 k Y.N.W ].J.:.#. at .l.X.W.V.0 ! % n #           U.k k j T.c : S.%.^.].b.Q.G.R.R >.#.T t.Q.{.P.      y k k k i } (.N b A %.b.].].b.[.G.x.!. at .).#.:.J.{.O.        y < b : g.y N `.%.V p.V b.}.o.G.j.H ).#.!. +#             # n % f j i i S.|.I.V V V {.G.=.T *..+% n #             # n % % % % % ++Q.p././.p.o.++% % % % % n #             # n % .+*.T =.G.{.V V V I.|.S.i i j f % n #             #  +!.#.).H j.G.o.}.b.V p.V %.`.N y g.: b < y         O.{.J.:.#.). at .!.x.G.[.b.].].b.%.A b N (.} i k k k y     O.{.J.:.T G @.!.x.G.[.b.].].b.%.A b N (.} i k k k y     O.{.J.I ....I !.x.G.[.b.].].b.%.A b N (.} i k k k y     O.{.w.d.k.k.k. .x.G.[.b.].].b.%.A b N (.} i k k k y     O.{.J.I ....I !.x.G.[.b.].].b.%.A b N (.} i k k k y     O.{.J.:.T G @.!.x.G.[.b.].].b.%.
 A b N (.} i k k k y     O.{.J.:.#.). at .!.x.G.[.b.].].b.%.A b N (.} i k k k y ",
-"8.T. at +R.x.U R H l.R.x.#+o.p.].].].].].V $+3.H.j k k 7 8.    T.T.%+&+R.w.R <.t.x.G.o.b.p.I.b.b.&.W.*+k k b 8.        =+= % % 0 k k k S.#+l.d.#+#+Q.c.&.-+k 0 % % = =+        =+= % % % % % h *.X.r 4.4.r X.*.h % % % % % = =+        =+= % % 0 k -+&.c.Q.#+#+d.l.#+S.k k k 0 % % = =+        8.b k k *+W.&.b.b.I.p.b.o.G.x.t.<.R w.R.&+%+T.T.    8.7 k k j H.3.$+V ].].].].].p.o.#+x.R.l.H R U x.R. at +T.8.    _.B k N S.;+C.V b.b.I.].V }.G.o.G.#+H R C.>+E =+        =+= % % 0 k i %+].^.V V V V b.G.,+j.G.5.% % = =+        =+= % % % % % % z.o.p.A A p.o.z.% % % % % % = =+        =+= % % 5.G.j.,+G.b.V V V V ^.].%+i k 0 % % = =+        =+E >+C.R H #+G.o.G.}.V ].I.b.b.V C.;+S.N k B _.    8.T. at +R.x.U R H l.R.x.#+o.p.].].].].].V $+3.H.j k k 7 8.8.T. at +R.x.U R H l.R.x.#+o.p.].].].].].V $+3.H.j k k 7 8.8.T. at +R.x.U R H l.R.x.#+o.p.].].].].].V $+3.H.j k k 7 8.8.T. at +R.x.M.l.k.I R.x.#+o.p.].].].].].V $+3.H.j k k 7 8.8.T. at +R.x.U R H l.R.x.#+o.p.].].].].].V $+3.H.j k k 7 8.8.T. at +R.x.U R H l.R.x.#+o.p.].].].].
 ].V $+3.H.j k k 7 8.8.T. at +R.x.U R H l.R.x.#+o.p.].].].].].V $+3.H.j k k 7 8.",
-"y 4.O '+x.x.R.J.&+x.#+o.X.)+!+~+`.W ].].b.^.H.j k k 8     $.4.i E.%+R.x.J.R.x.G.o.{+H.A `.]+].b.V /.k k y o         ^+% % % E.k E.E.7 S.j.w.%.%+w /+K %+k 5.% % % ^+        ^+% % % % 5.(+5.%._+'.E.E.'._+%.5.(+5.% % % % ^+        ^+% % % 5.k %+K /+w %+%.w.j.S.7 E.E.k E.% % % ^+        o y k k /.V b.].]+`.A H.{+o.G.x.R.J.x.R.%+E.i 4.$.    8 k k j H.^.b.].].W `.~+!+)+X.o.#+x.&+J.R.x.x.'+O 4.y       f.k j x K V V V b.W !+S.A X.x.o.x.J.x.-.B '.C         ^+% % % % f.j A ].].V V V I.%.x A G.A 6 % % % ^+        ^+% % % % % 9 9 >+o.].A A ].o.>+$.9 % % % % % ^+        ^+% % % 6 A G.A x %.I.V V V ].].A j f.% % % % ^+        C '.B -.x.J.x.o.x.X.A S.!+W b.V V V K x j k f.      y 4.O '+x.x.R.J.&+x.#+o.X.)+!+~+`.W ].].b.^.H.j k k 8   y 4.O '+x.x.R.J.&+x.#+o.X.)+!+~+`.W ].].b.^.H.j k k 8   y 4.O '+x.x.R.J.&+x.#+o.X.)+!+~+`.W ].].b.^.H.j k k 8   y 4.O '+x.x.&.&.J.x.#+o.X.)+!+~+`.W ].].b.^.H.j k k 8   y 4.O '+x.x.R.J.&+x.#+o.X.)+!+~+`.W ].].b.^.H.j k k 8   y 4.O '+x.x.R.J.&+x.#+o.X.)+!+~+`.W 
 ].].b.^.H.j k k 8   y 4.O '+x.x.R.J.&+x.#+o.X.)+!+~+`.W ].].b.^.H.j k k 8   ",
-"8.T.j Y '+o.o.#+#+#+o.x.*+l l i :+b.].].].I.k j k U.        T.h.i T.<+o.G.G.G.o.R.[+q.a.~+V ].b.L r k E.= =+        =+= % % E.k m.m.m.}+_+G.x k k : L %+8 % % % = =+        =+= % % % 4.4.x X.B |+m.m.|+B 1+x 4.4.% % % = =+        =+= % % % 8 %+L : k k x G._+}+m.m.m.k E.% % = =+        =+= E.k r L b.].V ~+a.q.[+R.o.G.G.G.o.<+T.i h.T.        U.k j k I.].].].b.:+i l l *+x.o.#+#+#+o.o.'+Y j T.8.        f.k B C.V ].p.b.I.%.q.Y Y.x.#+o.o.-.4.8 = =+        =+= % % % T.k Y &.].].b.b.I.M.k Y <+4.0 % % = =+        =+= % % % % 8 k [+o.].A A ].o.[+k 8 % % % % = =+        =+= % % 0 4.<+Y k M.I.b.b.].].&.Y k T.% % % = =+        =+= 8 4.-.o.o.#+x.Y.Y q.%.I.b.p.].V C.B k f.        8.T.j Y '+o.o.#+#+#+o.x.*+l l i :+b.].].].I.k j k U.    8.T.j Y '+o.o.#+#+#+o.x.*+l l i :+b.].].].I.k j k U.    8.T.j Y '+o.o.#+#+#+o.x.*+l l i :+b.].].].I.k j k U.    8.T.j Y '+o.o.#+#+#+o.x.*+l l i :+b.].].].I.k j k U.    8.T.j Y '+o.o.#+#+#+o.x.*+l l i :+b.].].].I.k j k U.    8.T.j Y '+o.o.#+#+#+o.x.*+l l i :+b.
 ].].].I.k j k U.    8.T.j Y '+o.o.#+#+#+o.x.*+l l i :+b.].].].I.k j k U.    ",
-"      f.O 2+o.#+#+#+x.3+i r.r 3.V V ].].b.X q.k k U.          4+5.N _+{+o.G.o.o.2+i < w I.b.b.V |.k k E.#             # n % ! E.5+m.m.5+6+X.r 7 7 /+C.|.y - % n #             # n % % f 4.x 7+F.m.m.m.m.F.7+x 4.f % % n #             # n % - y |.C./+7 7 r X.6+5+m.m.5+E.! % n #             # E.k k |.V b.b.I.w < i 2+o.o.G.o.{+_+N 5.4+          U.k k q.X b.].].V V 3.r r.i 3+x.#+#+#+o.2+O f.              f.k j A C.V ].b.V b.8+N q.9+#+o.o.[+y 0+#             # n % % T.k B |.].V b.b.V M.w Y X.a+% % n #             # n % % % (+4 u Q.p.A A p.Q.u 4 (+% % % n #             # n % % a+X.Y w M.V b.b.V ].|.B k T.% % n #             # 0+y [+o.o.#+9+q.N 8+b.V b.].V C.A j k f.              f.O 2+o.#+#+#+x.3+i r.r 3.V V ].].b.X q.k k U.          f.O 2+o.#+#+#+x.3+i r.r 3.V V ].].b.X q.k k U.          f.O 2+o.#+#+#+x.3+i r.r 3.V V ].].b.X q.k k U.          f.O 2+o.#+#+#+x.3+i r.r 3.V V ].].b.X q.k k U.          f.O 2+o.#+#+#+x.3+i r.r 3.V V ].].b.X q.k k U.          f.O 2+o.#+#+#+x.3+i r.r 3.V V 
 ].].b.X q.k k U.          f.O 2+o.#+#+#+x.3+i r.r 3.V V ].].b.X q.k k U.    ",
-"    T.T.j Y.o.#+#+#+x.1+N.L V p.p.p.p.b.W r j k k U.            T.b N 2+o.G.G.G.X.C.L b+].].V &.B k k E.                # = % % T.6 6 T.c+#+G.A /.].|.k T.% = #                 # = % % 5.c+7+B '.6 6 '.4.7+c+5.% % = #                 # = % T.k |.]./.A G.#+c+T.6 6 T.% % = #                 E.k k B &.V ].].b+L C.X.G.G.G.o.2+N b T.            U.k k j r W b.p.p.p.p.V L N.1+x.#+#+#+o.Y.j T.T.            f.k k Y w I.p.p.].].V K L {.o.o.o.Y.4.d+                # = % T.k B /.}.].p.V V V c.Q.2+4.5.= #                 # = % % % % % {.p.A A p.{.% % % % % = #                 # = 5.4.2+Q.c.V V V p.].}./.B k T.% = #                 d+4.Y.o.o.o.{.L K V ].].p.p.I.w Y k k f.            T.T.j Y.o.#+#+#+x.1+N.L V p.p.p.p.b.W r j k k U.        T.T.j Y.o.#+#+#+x.1+N.L V p.p.p.p.b.W r j k k U.        T.T.j Y.o.#+#+#+x.1+N.L V p.p.p.p.b.W r j k k U.        T.T.j Y.o.#+#+#+x.1+N.L V p.p.p.p.b.W r j k k U.        T.T.j Y.o.#+#+#+x.1+N.L V p.p.p.p.b.W r j k k U.        T.T.j Y.o.#+#+#+x.1+N.L V p.p.p.
 p.b.W r j k k U.        T.T.j Y.o.#+#+#+x.1+N.L V p.p.p.p.b.W r j k k U.    ",
-"  8.E.E.'.2+R.&+&+R.{.].^.K %.W.e+f+)+-.r j k k k U.          g+U.U.6 X.&+&+&+h+].].&.|.i+j+k+6+i k k D                   # n % q a a '+X.Q.[.K L -+4.h., n #                     # n % % F z.|.'.a a '.|.z.F % % n #                     # n , h.4.-+L K [.Q.X.'+a a q % n #                   D k k i 6+k+j+i+|.&.].].h+&+&+&+X.6 U.U.g+          U.k k k j r -.)+f+e+W.%.K ^.].{.R.&+&+R.2+'.E.E.8.          f.k k k B H.M l+X X w *.V I.L ;+Q.-.E._.                  # n T.k B N H.X %.%.7+N.K C.m+0 @ #                     # n % % % % n+K A A K n+% % % % n #                     # @ 0 m+C.K N.7+%.%.X H.N B k T.n #                   _.E.-.Q.;+L I.V *.w X X l+M H.B k k k f.          8.E.E.'.2+R.&+&+R.{.].^.K %.W.e+f+)+-.r j k k k U.      8.E.E.'.2+R.&+&+R.{.].^.K %.W.e+f+)+-.r j k k k U.      8.E.E.'.2+R.&+&+R.{.].^.K %.W.e+f+)+-.r j k k k U.      8.E.E.'.2+R.&+&+R.{.].^.K %.W.e+f+)+-.r j k k k U.      8.E.E.'.2+R.&+&+R.{.].^.K %.W.e+f+)+-.r j k k k U.      8.E.E.'.2+R.&+&+R.{.].^.K %.W.e+f+
 )+-.r j k k k U.      8.E.E.'.2+R.&+&+R.{.].^.K %.W.e+f+)+-.r j k k k U.    ",
-"            o+p+q+q+r+s+/.a.a.} s % ^ | f t+b b 7 D                 6.j+q+M.u+r+D._+_ } | % % | t+t+t+g+                    Q = .+v+v+u+V n+q+8+7 5.F.F.- Q                         Q = % % % w+*.U U *.w+% % % = Q                         Q - F.F.5.7 8+q+n+V u+v+v+.+= Q                     g+t+t+t+| % % | } _ _+D.r+u+M.q+j+6.                D 7 b b t+f | ^ % s } a.a./.s+r+q+q+p+o+                    y : : '.T.F.5 m 1 ( _ a.D v+K.B.x+y.                        Q F.B B a 2 d 0.0.a.8 B.F % = Q                         Q = % % % h S.~+~+S.h % % % = Q                         Q = % F B.8 a.0.0.d 2 a B B F.Q                         y.x+B.K.v+D a._ ( 1 m 5 F.T.'.: : y                     o+p+q+q+r+s+/.a.a.} s % ^ | f t+b b 7 D                 o+p+q+q+r+s+/.a.a.} s % ^ | f t+b b 7 D                 o+p+q+q+r+s+/.a.a.} s % ^ | f t+b b 7 D                 o+p+q+q+r+s+/.a.a.} s % ^ | f t+b b 7 D                 o+p+q+q+r+s+/.a.a.} s % ^ | f t+b b 7 D                 o+p+q+q+r+s+/.a.a.} s % 
 ^ | f t+b b 7 D                 o+p+q+q+r+s+/.a.a.} s % ^ | f t+b b 7 D     ",
-"              & n % % % 5 | ~ s % % % n & 9.9.9.9.                    # C % 0+% ^ ^ 5 s % % % n &                             & n % v j+j+y+> > > ; % n &                             & n % % ! e v v.e ! % % n &                             & n % ; > > > y+j+j+v % n &                             & n % % % s 5 ^ ^ % 0+% C #                     9.9.9.9.& n % % % s ~ | 5 % % % n &                         g+g+g+F % % % { ; > ~ ; % % n &                             & (+D > % { % ) ' ) % % n &                             & n % % F 0 }+}+0 F % % n &                             & n % % ) ' ) % { % > D (+&                             & n % % ; ~ > ; { % % % F g+g+g+                        & n % % % 5 | ~ s % % % n & 9.9.9.9.                    & n % % % 5 | ~ s % % % n & 9.9.9.9.                    & n % % % 5 | ~ s % % % n & 9.9.9.9.                    & n % % % 5 | ~ s % % % n & 9.9.9.9.                    & n % % % 5 | ~ s % % % n & 9.9.9.9.                    & n % % % 5 | ~ s % % 
 % n & 9.9.9.9.                    & n % % % 5 | ~ s % % % n & 9.9.9.9.      ",
-"                / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % ] ] % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % = /                                 / = % % % % % % % % 
 = /                                 / = % % % % % % % % = /                 ",
-"                  & $ % % % % % % $ &                                     & n % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % n &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ &                                     & $ % % % % % % $ 
 &                                     & $ % % % % % % $ &                   ",
-"                    * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = *                                         * = % % % % = * 
                                         * = % % % % = *                     ",
-"                      # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #                                             # $ % % $ #   
                                           # $ % % $ #                       ",
-"                        + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +                                                 + @ @ +     
                                             + @ @ +                         ",
-"                          . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .                                                     . .       
                                               . .                           "};
+static unsigned char fisharray[] = {
+  137,  80,  78,  71,  13,  10,  26,  10, 
+    0,   0,   0,  13,  73,  72,  68,  82, 
+    0,   0,   2,  20,   0,   0,   0,  25, 
+    8,   6,   0,   0,   0, 105, 123, 183, 
+   18,   0,   0,   0,   6,  98,  75,  71, 
+   68,   0, 255,   0, 255,   0, 255, 160, 
+  189, 167, 147,   0,   0,   0,   9, 112, 
+   72,  89, 115,   0,   0,  11,  19,   0, 
+    0,  11,  19,   1,   0, 154, 156,  24, 
+    0,   0,   0,   7, 116,  73,  77,  69, 
+    7, 220,   5,  18,  11,  31,   5,  42, 
+  189, 115,  96,   0,   0,  32,   0,  73, 
+   68,  65,  84, 120, 218, 237, 157, 119, 
+  120,  84, 101, 214, 192, 127, 119, 106, 
+  166, 164, 207, 164,  67,  18,  66,  26, 
+   37,   4,  18, 122, 111,  75,  87,  20, 
+  212,  21,  88, 208, 117, 249,  20, 203, 
+  174, 216, 176, 177, 118, 215,   2, 226, 
+  138, 138,  44, 187, 186,  42, 226,  90, 
+   80,  17,  16,  16, 233, 134,  22,  18, 
+   32, 148,  36, 132, 132,  80,   2, 233, 
+  117,  74,  50, 237, 126, 127, 220, 100, 
+   66, 164, 152,  64,  64, 215, 157, 247, 
+  121, 120, 200, 204, 157, 123, 127, 247, 
+  188, 231, 188, 231, 158, 243, 182,  11, 
+   87,  80, 166, 222, 245, 150,  56, 245, 
+  174, 183,  68, 174,  83, 241, 240,  60, 
+   60,  15, 207, 195, 243, 240,  60,  60, 
+   15, 239, 215, 205,  19, 218, 122, 194, 
+  192, 225, 243, 197, 180,  66, 171, 244, 
+  119, 148, 134, 180,  45,  47,   8, 215, 
+   82,  56,  15, 207, 195, 243, 240,  60, 
+   60,  15, 207, 195, 243, 240, 126, 253, 
+   60,  89,  91, 126,  60, 123, 246,  66, 
+   49,  45, 183,   6, 124, 180, 224, 163, 
+   37,  45, 183, 134, 217, 179,  23,  94, 
+  179, 200, 201, 195, 243, 240, 126, 205, 
+  188, 153, 115, 222, 244, 212, 231, 111, 
+  140,  55, 115, 206, 155, 158, 250, 244, 
+  240,  60, 188,  43, 228, 181,  58, 250, 
+   24,  51, 238,  25, 113, 195, 241,   6, 
+  208, 170,  90,  30, 176, 216,  24, 211, 
+   89, 205, 134, 117, 207, 181, 107, 228, 
+  228, 230, 201,   1, 181, 234, 250, 241, 
+  180,  42, 104, 176,  53,  51, 175,   7, 
+  239, 122, 214, 103,  19, 175,  73, 198, 
+  235,  41,  95, 131,  13, 156, 252, 118, 
+  234, 243,  68,  67,  75, 219, 252, 173, 
+  235, 239, 127, 161, 253,  53, 216,  24, 
+   19, 253,  27, 108, 239,  30, 158, 135, 
+  119,  29, 120, 173, 234, 161, 152,  57, 
+  231,  77, 113, 195, 193,  42,  48, 250, 
+   65,  66,  16,  12, 234,  12,  41,  17, 
+   16,  19,   6,  90,  21,  27,  14,  86, 
+  181, 107, 100, 239, 230, 105,  85,  16, 
+  224,   7, 209, 126, 144,  20,   5,  65, 
+   62, 215, 158, 151,  16,   4,   3,  58, 
+   73, 242, 193, 181, 231,   1, 132, 107, 
+  165, 127, 215, 139, 151,  18,  33, 201, 
+  152,  16, 116, 237, 121,  65,  62, 146, 
+  238, 162, 253,  36,  93,  94, 107,  94, 
+   76, 152,  36, 223, 160, 206, 146, 124, 
+   70, 191, 107, 199,  11, 240, 107, 230, 
+  165,  68,  72,  58, 188,  30, 250,  11, 
+  242, 129,  30,  17, 160, 211, 130, 111, 
+  192, 245, 225,   5, 249,  92, 123, 251, 
+  244,  13, 144, 100, 234,  17, 113, 125, 
+  120,  90, 149, 164, 179,  38, 253, 197, 
+  132,  65, 192,  53, 180, 151, 235, 237, 
+   63,  61,  60,  15, 239,  58, 243, 126, 
+   54, 234,  24,  59, 229,  21, 113, 125, 
+   86,  53, 186, 105, 131, 233, 123, 119, 
+   10,  65, 250,  90, 252, 213,  82,  28, 
+   98, 178, 168, 201,  41, 130, 163,  95, 
+  100,  97,  94, 177, 131, 177,  73, 126, 
+  172,  95, 249, 248,  85,  69,  78,  77, 
+   60, 124,   3, 160,  71,  71, 146, 102, 
+  198, 209,  63,  73, 131,   5,  61, 118, 
+  179, 131,  61, 155, 143, 113, 226, 203, 
+   34, 200,  62, 214, 190,  60, 173,  10, 
+   82,  34, 152,  48,  47,  17, 175,  48, 
+   63,   0,  42, 207, 212, 179, 229, 225, 
+   77,  80, 100,   1, 139, 173, 253, 121, 
+    0, 209, 126,  12, 121, 186,  63,   0, 
+  219,  95, 220,   5,  39, 170, 221, 145, 
+   97, 187, 243, 194, 181,  12,  95,  56, 
+  146, 128,   8,  47,   0, 234, 207,  86, 
+  179, 246, 213, 108, 200,  56, 211, 254, 
+  188, 196,  56, 162, 167, 134, 211, 119, 
+   68,  28,  74, 157,   2,  45,  38, 118, 
+  101,  89, 201, 250, 232,  24,  28,  60, 
+    5,  53, 149, 237, 202, 211,  77,  27, 
+   76, 151,  91, 146,  72,   8,   7, 189, 
+  182,   1, 128, 170,   6,  23, 165,  38, 
+   31, 246,  44, 205, 104, 127, 251, 156, 
+   16,  71, 210,  77, 201,  36, 117, 151, 
+  227, 212,  73, 245, 233,  99, 113, 177, 
+  114, 123,  13, 229, 175, 110, 133, 178, 
+  234, 107,  99,  47, 195, 163, 232, 127, 
+  115,  34, 145, 201, 129, 212, 157,  43, 
+  225, 187, 151, 247,  33,  30, 168, 186, 
+  118, 246,   9, 248, 191,  52,  90, 170, 
+  207, 167,  54, 182, 200,  92, 218, 155, 
+   39,  36, 251,  51, 254, 201,  84, 188, 
+   67, 131,  57, 121, 160, 130,  93,  95, 
+  101, 195, 150, 194, 107, 195,  51, 250, 
+   97, 152,  55, 140,  41,  67, 124, 169, 
+  213,  74, 254,  76, 110, 174,  39, 235, 
+  144, 147, 172, 175,  15, 192, 218,  99, 
+  237, 110, 159, 215, 211, 127, 122, 120, 
+   30, 222,  47, 193, 187, 236, 193, 133, 
+  175,  46,  20,  31,  94,  91, 198, 144, 
+   55, 110, 164, 107, 119,  35, 213,  56, 
+  177,  43, 117, 232, 177, 227, 133, 205, 
+  253,  59, 187,  83, 203, 191,  30,  62, 
+    8,  43, 190,  99, 230,  45, 113, 124, 
+  180, 228, 193,  43,  18, 114, 225, 171, 
+   11, 197, 215, 182,  86,  19, 208,  69, 
+  133, 177, 183, 145, 196,  49, 221, 128, 
+   64,  28, 122,  61,  53, 114,   1,  61, 
+  118,  52, 118,  39,  85, 101, 114, 254, 
+  115, 231, 106, 216, 159, 115,  85, 188, 
+  153, 115, 222,  20,  63,  90, 119, 128, 
+   62, 131,  20,  84,  86,  88,   8, 155, 
+   53, 132,  91, 123, 214,   0, 112,  38, 
+  180,  39, 213, 250,  72, 182, 101, 148, 
+  147, 253, 210,  30, 233,  65,  95,  84, 
+  126, 245, 188,  47, 142,  65, 184,   1, 
+  128,  62, 221, 207, 114, 207,  99, 147, 
+   41, 215,  23,   0,  96,  48, 117, 226, 
+  189, 215, 190,  97, 239, 161,  48, 233, 
+  132, 246, 228,  69, 251, 145, 248,  84, 
+   95, 134, 166,  24, 240,  51, 157,  36, 
+  226, 220, 126,   0,  62, 223, 239, 203, 
+  217,  15, 183,  19,  16, 168, 101, 239, 
+  143,  14, 102, 142,  75, 190, 122,  94, 
+  207,   4, 126, 255, 193,  36, 252, 141, 
+   78, 172,  74,  57,  38, 148, 248,  58, 
+   69,  20,  38,  19,  80,  65, 246, 134, 
+  195, 148, 165, 151,  81, 121, 212, 198, 
+   99, 195, 252, 120, 120, 222, 195,  87, 
+  199, 155,  54, 158, 187,  22, 246,  64, 
+   41, 183, 184, 143, 213, 163, 194, 132, 
+   18, 165, 221, 140,  31, 114, 142,  28, 
+   42,  99, 251,  67, 171,  88,  56, 193, 
+  120, 245, 188,  27, 146,  25, 114, 111, 
+  119, 122, 118, 215, 211, 160,  84, 185, 
+   89, 190,  78,  41, 136,  79, 223,  89, 
+  198, 161, 247, 183,  33, 166, 157,  96, 
+  246, 240,  72, 150,  45, 123, 184,  93, 
+  236, 133,  32,  31,  58,  63,  55, 136, 
+   65, 253, 130,   1, 208, 216, 157, 212, 
+  153, 205, 124, 241, 209, 113, 252,  54, 
+   28, 160,  36, 189, 162,  93, 237,  19, 
+   13,  36,  14,  84,  18, 242, 167, 177, 
+    0,  20, 255, 115,  61, 217, 105, 118, 
+  176, 210, 174, 246,  25, 220,  59, 144, 
+  234,  49, 201, 220,  50, 179,  51, 222, 
+   58,  29,  86, 165,  28, 128,  31, 119, 
+  151, 112, 252, 153,  31, 161, 180, 182, 
+   93, 120, 179, 103,  47,  20, 151, 109, 
+   57, 137,  48,  48, 154, 238, 127,  28, 
+   74, 239,   1,  70,   0, 183, 111, 241, 
+  194, 134, 218, 110,  99, 255,  33,  19, 
+  219, 223,  61,   4, 223,  30, 184, 106, 
+  127, 118, 189, 253, 167, 135, 231, 225, 
+  253, 146, 188,  75,  30, 168,  46, 248, 
+   82,  20, 229, 161,  20, 101,  44,  34, 
+  252, 244,  14,  20,  65,  46,  80,  56, 
+  216, 105,  28, 202, 150,  94, 247, 146, 
+  165,  77,  38,  72, 102, 118, 131,  15, 
+  152,  52, 100,  44,  57, 132, 253, 159, 
+   59, 184, 173, 111,  32, 159,  45, 127, 
+  180,  77,  66, 150, 101,  45,  19, 235, 
+   44, 114, 130,  59, 247,   6, 160, 110, 
+  231,  31, 208,  86, 148,  35, 104, 236, 
+  100,  26, 251, 176, 174, 247,   3, 100, 
+  105, 251,  17,  36, 171, 192,  11,  27, 
+   95, 174, 174, 162, 252, 133, 237,  96, 
+  170, 228, 182, 212, 182, 243, 110, 155, 
+  241, 186, 248, 217, 190,  10,  62, 121, 
+   92, 199, 148, 169, 119,  81,  95, 186, 
+  147, 202, 140, 247,   9,  30, 254,  42, 
+    0,  39, 118, 206, 227, 237, 137, 139, 
+    0, 248,  97, 119,  21, 199,  31, 217, 
+   10, 102, 169, 167, 226,  74, 228, 187, 
+  109, 198, 235, 226, 103, 123,  42, 220, 
+  153, 223, 212, 177,   6, 150,  63,  59, 
+    3, 167,  76,  13, 117,  82,  64, 129, 
+  119,  39, 228, 174,   6, 102,  60, 187, 
+  156,  47, 215, 151, 187,  51, 179, 171, 
+  230, 233, 180, 116,  94,  48, 140,  81, 
+  253, 252,   1, 184, 127, 205,  92, 162, 
+    7,  72, 114, 150, 108, 153,  71,  64, 
+  202,  31, 241,  10,  26, 192, 202,  47, 
+  255, 197, 244,  87, 204,  87,  85, 159, 
+  232,   3,  48, 204,  31, 194, 212,  73, 
+  254, 212, 163, 162, 212,  21,  72, 146, 
+  101,  55, 227, 210,  23, 211, 171, 108, 
+   47, 162,  85, 137,  37, 208, 128, 247, 
+  128, 143,  37, 254, 241, 116, 188, 181, 
+   78, 140,  73, 179, 175,  72,  62, 229, 
+  159,   6, 147,  50, 167,  59, 201, 122, 
+  171,  59, 144,  40, 117, 233,  72, 178, 
+   28,  96, 120, 230, 187,  12,  40, 219, 
+    6,  14,   5, 142,  82,  25,  69,  29, 
+    6,  19, 158,  50,  23, 193, 121,  14, 
+  191,  78,  83, 175, 172,  62, 163,  12, 
+  244, 122, 164,  23, 157,  70, 199, 161, 
+  199,  78, 169,  43,  16, 168, 167,  67, 
+  221,  49, 238, 219, 255,   8, 129, 182, 
+  211,   0, 152, 157, 161, 212, 137,  35, 
+  241,  55, 196, 179,  43, 167, 136, 233, 
+  119, 204, 111,  59, 175, 164, 241, 148, 
+  210,  90,  72,   8, 162, 255, 125,  41, 
+   36, 247,  53,  34,  42, 157, 212, 163, 
+   98, 228, 161, 247, 232,  81, 177,  13, 
+  167, 189,  55, 225, 189, 158, 228, 222, 
+    5,  95, 240, 229,  87, 103, 219, 197, 
+   62,   1,  14, 124, 114,  51,  98, 209, 
+  191, 120, 182, 203,  12,   0, 158,  61, 
+  186,  28, 125, 231, 251, 137, 189, 249, 
+  147,  22,  61,  21,  87, 195, 155, 122, 
+  115,  24, 239,  62, 114,  11,  69, 153, 
+   47,  35,  87, 166, 115,  48, 112,  40, 
+  155, 186, 223, 131,  23,  54,   4, 187, 
+  156,   3, 123, 202, 216, 245,  78,   6, 
+  228, 148, 186, 135,  65, 110,  11,  22, 
+  219, 204, 251, 228, 223,  47, 136, 253, 
+   19, 194, 169,  42, 207, 197,  91, 216, 
+  132,  78, 126,  14, 128,  10,  85,   7, 
+  222, 233, 185, 128, 211, 222, 113, 128, 
+   23,  65, 178,  10,  76,  40,  41, 216, 
+  120, 140, 204,   5, 153,  80,  88, 126, 
+   69, 242, 157,  93,  63,  94, 180, 213, 
+  148,   2, 224,  91, 124, 250, 154, 251, 
+   79,  15, 207, 195, 251,  53, 240,  46, 
+  250, 101, 213, 201,  52,  81,  21, 146, 
+   76,  94,  94,  30,   9,  49,  29,  41, 
+  254, 246, 119,  24, 244, 229, 184, 202, 
+  192, 101,   6, 153, 214,  65,  97, 100, 
+    4, 159, 198, 220,  67,  94, 135,  81, 
+   24,  48, 187, 157, 249, 119,  59, 236, 
+  148,  78, 121, 147, 217,  55, 197, 184, 
+   51, 179, 135,  55, 239,  16,   1,  22, 
+  142,  24, 124, 113,  94, 222,  90, 209, 
+   81, 119,  12, 239, 196,  89, 228, 228, 
+  159,  66, 167, 209,  96, 112,  29,  71, 
+  113, 236,  94, 168,   1, 103, 149, 128, 
+   60, 192, 204, 166, 168,  91,  89, 157, 
+  250, 184,  59, 163, 216, 182, 252,  24, 
+   39,  22, 166, 185,  51,  23, 227,  45, 
+   41,  92, 142, 211,  34,  83, 249,  58, 
+   31, 194,  13,  84, 125, 217, 151, 156, 
+  114,  61, 134, 160,  16,  12, 174, 227, 
+  148, 203,  58,  83,  86, 146,  79, 143, 
+  184,  14,  28, 206, 185, 151, 111, 250, 
+   47, 230, 152,  69, 206, 134,  69,  25, 
+  152,  74,  26, 167, 156, 124, 182, 187, 
+  133, 124, 173, 202, 140,  26, 121,  77, 
+  229, 185, 187, 130, 185, 113, 196,  64, 
+  158, 121, 126,  50,  43, 222,  93,  13, 
+  192, 180, 123,  39, 241, 220,  95, 191, 
+   97, 213, 230,  52, 158, 249,  87,  73, 
+  243,   5, 138, 202, 175, 140, 119,  91, 
+   63,   0, 244, 193,  46, 198, 204,  77, 
+   33,  78, 235, 100, 242, 174,   7, 232, 
+  150, 240,  46,   7, 143, 157, 198,  24, 
+   28, 227, 150, 185, 188, 180, 152,   4, 
+  131,   9, 255, 169, 123,  90, 205, 107, 
+  210, 107, 217,  23,  25,  52, 101, 182, 
+  209,  15,  15, 100, 232, 140,  56, 119, 
+  198,  62, 105, 223,  43, 140,  44, 252, 
+   28, 103, 165,  14, 185, 191,   8, 190, 
+  224, 136, 123, 151, 114,  89, 103, 204, 
+   86,  43,   9,  49,  29, 169, 203, 254, 
+   16, 133, 119,  28, 254, 177,  19, 132, 
+  203, 113, 154, 244, 218,  36,  95, 208, 
+  202,   7,  25,  63,  88, 233,  54, 250, 
+  114, 116, 196, 158, 254, 129, 219, 243, 
+  223,  35, 234, 228,  25,  92,  22,   5, 
+   50,  29, 200, 140,  80, 110,  50,  16, 
+  114, 195, 247, 228, 228, 159,  34,  54, 
+   54,  22,  91, 241,   1, 252,  35,   7, 
+   94,  82, 190,   5,  91, 183, 139, 239, 
+  169,  84, 204, 115,  58, 217, 251, 209, 
+  110, 154, 244, 231,  55, 247, 119, 140, 
+  190, 173,  39, 102, 165,  25, 240, 162, 
+   71, 209,  87, 140,  61, 190, 146, 228, 
+  130,  44,  68, 155, 128, 160,  18, 145, 
+  251, 203, 105,   8, 190,  17,  93, 234, 
+  124,  78, 159,  45, 163, 172,  36, 159, 
+  109, 155,  78, 242, 196, 252,  57, 173, 
+  214, 159, 124, 233,  68, 210, 143, 152, 
+    0, 200, 184, 123,  35, 250, 177,  33, 
+   36, 222, 210, 159, 174, 241,  42, 186, 
+   20, 174, 166, 239, 137, 141, 244,  60, 
+  181,  31,  65,  45,  71, 246, 187,  53, 
+  152,  69, 201, 182, 130,  70,  45, 185, 
+  114, 123, 249, 137, 125, 206, 251, 227, 
+   77, 216, 191, 237, 207, 205, 227, 190, 
+    7, 224, 171, 117, 191,  67, 121, 195, 
+   46,  94, 125, 255, 235, 246, 177, 207, 
+  112,   3, 165,  63, 204,   1,  64,  39, 
+  148, 227, 250, 126,  34,  98, 131, 147, 
+  253,  29, 123, 178,  39, 122,  52,  71, 
+  163,  38, 113,  36, 215,  70, 246,  23, 
+  187,  48, 173,  47,  38, 101, 169,  52, 
+  244, 210, 187, 171,  30, 231, 221, 107, 
+   90, 205, 251, 219,  11,  75, 196, 161, 
+   35,  35,  49,   6, 199, 208,  33, 204, 
+  136, 121, 223,  11, 168,  75,  86, 225, 
+  172, 114, 186, 117, 118, 160,  83,  18, 
+  235,  59,  79, 225,  96, 248, 205,  64, 
+   61,  58, 187, 142, 141, 159, 237, 167, 
+  122, 209, 247, 110, 249, 250, 204, 236, 
+  199, 171, 114,  57, 247, 216, 108,  60, 
+   50, 108, 200,  37, 217, 233,  95, 204, 
+   18,  53, 234,  50, 233, 131,  67, 139, 
+  222,  94, 120,  77, 253, 103, 225, 103, 
+  169, 162,  38,  60,  18, 185, 190,   3, 
+  142,  90,  11, 245, 231,  50, 175,  41, 
+  175, 228, 199,  41, 162,  92, 223, 193, 
+  253, 217, 148, 251, 163, 135, 247,  95, 
+  164, 191, 107, 105, 159,  23,  76, 202, 
+  172,  91,  27,  41, 106, 130,  18, 201, 
+  202, 220,  71, 114, 183, 100, 106,  77, 
+   13, 104,  34,  39,  65,  64,   4, 178, 
+  248,   8, 100,  58,  64,  80,  16, 153, 
+   95, 194,  19, 155, 159, 230, 198,  67, 
+  139,  49, 139, 129, 212,  35, 101,  54, 
+  147,   6, 104,  96,  72,  18, 203, 182, 
+  150,  33, 204,  90,  36, 142, 119, 212, 
+  138,   7, 135,  68,  99,  30,  22,  68, 
+   98, 122, 218,   5,  19,  59, 178,  55, 
+  191,  42, 202, 206,  46, 192,  94, 186, 
+   17, 167,  76, 205, 242, 143,  63, 230, 
+  254,  71, 159,  68, 229, 223, 145,  58, 
+   89,  40, 206, 184,  14, 200, 253,  69, 
+  196, 122,  53, 195,  50, 215, 242, 151, 
+   29, 183, 160,  17, 189,  48, 161, 164, 
+  239, 228, 104, 105, 226,  72, 207,  78, 
+  124,  26,  21, 139, 121,  88, 208,  37, 
+   57,  45, 156, 217, 214,  50, 183, 243, 
+   84, 249, 119,  36, 125, 231,  14, 246, 
+  108, 159,   7,  42,  63,  62,  95, 241, 
+   26,  31, 173, 120,  13, 188,  59,  17, 
+   95, 183, 159, 251,  55,  78,  32, 174, 
+   50, 131, 161, 183, 197, 112, 207, 226, 
+  190, 220, 179, 184,  47, 204,  72, 101, 
+  217, 214, 178,  86,  45, 169, 249,  41, 
+  175, 169, 232, 235, 215,  16,  27,  27, 
+  203, 138, 143, 143,  96, 175, 205, 197, 
+   94, 155, 203, 138, 143, 143,  16,  27, 
+   27, 139, 190, 126,  77, 203, 139, 132, 
+   27, 218, 206, 155, 145, 234, 190, 223, 
+  161, 183, 197,  16,  87, 153, 193, 253, 
+   27,  39,  16,  95, 183,  31, 188,  59, 
+  241, 209, 138, 215, 248, 124, 197, 107, 
+  160, 242,  99, 207, 246, 121, 164, 239, 
+  220, 129, 202, 191,  99, 171, 121, 137, 
+  233, 105,  98,  83, 125, 127,  26,  21, 
+   11,  61,  59,  65,  76,  24, 125,  39, 
+   71,  99,  66, 137,  70, 244, 226,  47, 
+   59, 110,  97,  88, 230,  90, 196, 122, 
+   53, 114, 127,  17, 103,  92,   7, 234, 
+  100, 161, 168, 252,  59, 114, 255, 163, 
+   79, 178, 252, 227, 143, 113, 202, 212, 
+  216,  75,  55,  34,  59, 187, 128, 236, 
+  205, 175, 138, 151, 226,  28,  28,  18, 
+  205, 120,  71, 173,  40, 204,  90,  36, 
+  201,  55,  36,  73, 178, 181,  70,  67, 
+   55, 139, 129, 220, 120, 104,  49,  79, 
+  108, 126, 154, 200, 252,  18,  16,  26, 
+  131, 137, 248,   8,   8, 136,  64,  19, 
+   57, 137,  90,  83,   3, 201, 221, 146, 
+  201, 202, 220, 135,  38,  40, 145, 186, 
+  181, 145, 151, 148, 111,  69, 131, 131, 
+   81, 253, 252,  89,  18, 168, 224, 253, 
+  129, 113, 146, 124,  67, 251,  16, 219, 
+  215, 232,  14,  38, 134, 157, 250,  55, 
+   79, 108, 126, 154, 228, 130, 195, 128, 
+  212,  16, 101,  97, 224, 140, 140, 197, 
+  161, 244, 227, 244, 217,  50,  98,  99, 
+  226,  49,   6, 199,  48, 121,  96, 109, 
+  155, 244, 151, 155,  91,  75, 239, 174, 
+  122, 162, 187,   6, 147, 178, 116,  52, 
+   33, 163,  18,  48, 198, 250, 147, 122, 
+  244,  29, 230, 164, 189,  36,   5,  48, 
+   14,  57, 245,  17,   6, 142, 110,  89, 
+   64, 144,  49,  20, 128, 191,  79, 252, 
+  250, 202, 236, 229,  39, 246, 169, 240, 
+  235,  68, 205, 225, 101, 184, 204, 205, 
+   46, 194, 101, 150,  97, 222, 255,  58, 
+   10, 191,  78,  87, 111, 159, 225,   6, 
+  233,  94, 129,  32,  99,  40,  71, 183, 
+   44, 160,  62, 194, 128, 232, 144, 147, 
+   92, 144, 197, 156, 180, 151,  72,  61, 
+  250,  14, 198,  88, 127,  66,  70,  37, 
+  144, 178, 116,  52, 209,  93, 131, 233, 
+  221,  85,  79, 110, 110, 109, 155, 120, 
+  147,   7, 214,  98,  12, 142,  33,  54, 
+   38, 158, 211, 103, 203, 112,  40, 253, 
+  112,  70, 198,  34,  11, 147, 116,   6, 
+  144,  92, 112, 152,  39,  54,  63, 205, 
+  176,  83, 255,   6, 188,  48,  43, 205, 
+  196, 246,  53, 194, 208,  62, 208, 179, 
+   19, 239,  15, 140,  99,  73, 160, 130, 
+   81, 253, 252,  89, 209, 224, 184,  36, 
+  175, 110, 109, 164, 216, 125, 226,  34, 
+  234, 140, 243, 232, 118, 195, 119,   4, 
+   13,  94, 124,  77, 253, 103, 221, 218, 
+   72,  49, 100, 194, 183,  84, 102, 175, 
+  167,  44, 125,  25,  85, 142, 152, 107, 
+  202, 171, 253,  74, 223, 226,  97,  11, 
+   96, 173, 205, 190, 166, 242, 253, 148, 
+  247,  91, 147, 239, 122, 234, 239,  90, 
+  219, 167, 162,   9, 180, 239, 199, 207, 
+  197, 132, 154, 199, 176, 122,   7, 226, 
+   56, 179, 139, 164,  94, 195, 200, 203, 
+  207, 197,  71, 175, 166, 178, 122,  15, 
+   14,   3,   8, 162,  14, 153,  81, 196, 
+  117,  22,   4,  37, 128, 130,  27, 246, 
+  254, 135,  30,  21, 219,  88,  31,  53, 
+  141, 253, 225,  99, 168, 145, 235,   8, 
+  250, 203,   8,  34,   3,  53,  68, 118, 
+   17,  48, 112, 238, 146, 141, 111, 253, 
+  222, 229,  98, 135, 178, 167, 113, 105, 
+  252, 208, 105, 128, 186,   2, 158, 123, 
+  254, 121, 204, 181, 181,  88, 206, 174, 
+   65, 239, 107,  65,  20,  67,  17,  67, 
+  252,  17, 243, 171, 144, 233, 160,  99, 
+  118,  49, 143,  50, 145, 101, 145, 127, 
+  161, 204, 152, 130,  97,  86,  50, 245, 
+   42,  27,  83, 199, 116, 128, 198,  76, 
+  181,  78, 169, 248, 249,  76,  44, 218, 
+   15, 162, 252,  88, 155, 187, 134, 240, 
+  148,  66, 146, 181,  34,  13,  39,  63, 
+  228, 225,  71,  94, 199,  41,  83,  99, 
+   59, 181,  21, 135,  46,  30, 239, 130, 
+   10, 158, 172, 158, 135, 168,  50, 243, 
+  174, 113,   9, 133, 126, 125, 164, 139, 
+  105,  85,  44, 251,  58,  95, 186, 230, 
+   37,  50, 165, 139, 101, 126,  77,  99, 
+  211, 131, 226, 235,  49, 165, 207, 100, 
+  155, 144, 218, 252, 253, 185,  60, 134, 
+  138, 251,  24,  20,  95,  15,  26, 154, 
+  199, 170, 175, 130,  23,  85, 189, 151, 
+  215, 142, 204,  65, 176, 233,  16, 235, 
+   53,  52, 116, 138,  71,  60, 181, 149, 
+  133,  11, 215,  34, 119,  53,  80, 157, 
+  254,  56, 253, 187, 138,  28, 176,  20, 
+  178,  54, 119,  13,  12, 143, 130, 194, 
+  106,  56,  81, 125,  89, 222, 249, 117, 
+   60, 253, 209,  46, 124, 153, 228, 141, 
+  151,  77,  50, 186, 208,  19,  59, 152, 
+  125, 242, 239, 116, 204,  46,  70, 166, 
+    3, 209,  46, 135,  72, 127,   4,  81, 
+  135, 222, 247,  28, 150, 179, 187, 249, 
+  120, 233, 219, 232, 124, 124, 160, 174, 
+    0, 157, 198, 138, 224, 172, 162, 131, 
+  117,   9, 235, 247,  46,  23, 199, 246, 
+  153, 113,   1, 175, 179, 204,  12, 152, 
+  153, 242, 193,  45, 156,  60,  42, 114, 
+  178, 194, 202,  57,  65, 141, 175, 221, 
+   66, 207, 162,  13, 140,  45,  92,  65, 
+  100, 254,  57,  80,  42,  16, 148,  34, 
+  162,  93, 148,  30, 238,  10,  29, 162, 
+   96, 198,  89, 190, 135,   0, 253,   3, 
+  228, 229, 231,  18,  22,  17, 129, 245, 
+  212,  86,  28, 222,   6,  76, 107,   5, 
+   49, 199, 247,  53,  82,   7, 221, 218, 
+  130, 105,  13,  80,  35, 216, 229, 196, 
+  199, 248,  17,  23, 225,  79, 126, 223, 
+   56,  76, 166, 114, 140, 177, 254, 132, 
+  150, 108, 231,  47, 185,  11, 136,  58, 
+  121,   6, 209, 161,  68,  80, 216,  17, 
+   29, 114,   4, 181,  28,  33, 160, 209, 
+   25,  57, 178,  48,  40,  70, 185, 121, 
+   53, 121, 219,  88, 115,  80, 108, 181, 
+  254,  14, 228, 215,  19,  25,  47, 233, 
+   49, 186, 107,  48, 161,  39, 118,  48, 
+   50, 253,  99,  70,  30, 255, 178, 145, 
+  233, 148,  76, 169, 174, 130, 184, 168, 
+   98,  50, 214, 204,  67,  39, 148,  51, 
+  110, 128, 154,  71,  15,  90, 176, 157, 
+  214,  94, 185, 125,   2,  66, 213,  10, 
+   52, 150,  67, 136,  64, 106, 237,  46, 
+  247, 247, 106,  69,  58,  66,  85,  57, 
+   16, 221, 242, 132,  54, 218, 167, 170, 
+  131, 133, 113,   3, 212, 232, 132, 114, 
+   50, 214, 204, 163, 115, 240,   1, 228, 
+  165,  21, 184,  26, 229,  18,  29,  74, 
+  102, 237, 255, 152, 136,  58,  43, 155, 
+  130,   7, 113,  46, 122, 176,  59, 120, 
+   60, 144,  95, 223, 106, 222, 154, 131, 
+   63, 240, 220,  20,   1, 223, 136, 251, 
+  201, 203, 207, 197, 160,  40, 199, 230, 
+  200,   2,  57, 146, 174, 106,  78,  35, 
+   58, 104, 212, 161, 146, 123, 182, 189, 
+  198, 216, 200,  21, 252,  61, 254,  17, 
+  136,  29,  66, 226,  31, 252, 209, 235, 
+   39,  17,  19,  46,  32, 168,  69,   4, 
+  187,  28, 107, 128, 250,   2, 214, 245, 
+  246, 159,  45, 120, 231, 246, 211, 241, 
+  166, 221, 216, 107, 115, 241,  10,  29, 
+   65, 229, 182,  25, 215, 148,  87,  82, 
+  112,   6,  20,  22, 119, 134,  27, 208, 
+   97,  40,  14, 101, 237,  53, 225, 213, 
+  202,  66,  80, 215,   9, 136, 222, 205, 
+  207,  70, 243, 233,  61, 168, 163, 127, 
+   27, 242, 253,  18, 250, 187, 150, 246, 
+   41,  44, 216, 186,  93, 124, 214,  10, 
+   55, 186, 214, 177, 196, 127,  45,  46, 
+  149,  15, 245, 103,  77, 200, 163, 238, 
+   67, 225, 219, 133, 134, 147,  31, 162, 
+   85, 236, 198, 165, 242,  65, 233, 210, 
+   32,  58, 173,  56,  15,  23,  33,  40, 
+   47, 146,  28, 136,  14, 206,  69,  59, 
+  169,  86, 116,  38, 221, 175,  47, 251, 
+  186, 220, 231, 238, 142,  46,  51, 219, 
+  232, 159,  81, 229, 238,  42, 212, 175, 
+  219,  46,   2, 172,  49, 124,  72,  47, 
+   97,  63, 216,  28, 152, 106, 180,  40, 
+  195, 239,   2, 135,   9,  85, 221, 183, 
+  136,  58,  59, 130, 168,  67, 238,  48, 
+  227,  60, 124,  26, 144,  33, 243, 178, 
+  224, 170, 151, 102, 213, 155,  58,  56, 
+  216, 237,  53, 142, 172, 148, 137, 148, 
+  232,  18, 165,   9,  86, 118,  72, 217, 
+   85, 114,  65, 151, 228, 220,  71, 222, 
+   17,  23, 173,  58, 221,  98, 182, 252, 
+   61, 111,  12, 116,  31,  87, 158, 200, 
+  228, 149, 138, 247, 169, 171, 143,  70, 
+   41, 232, 240,  82,  75,  89, 167, 211, 
+   84, 134, 172, 178, 150,  26, 125,   3, 
+  123,  67, 167, 177, 161, 251, 159, 120, 
+  239, 161, 180,  22, 179, 207, 231, 222, 
+  216, 129,  69,  11, 238, 187,  60, 239, 
+  252, 226, 107, 227, 216, 188,  31, 144, 
+   27, 195, 121,  45, 246,  81,   2, 124, 
+  244,   0,  84, 214, 154, 120,  44, 239, 
+  117, 156, 101,  69, 196, 189,  58,  10, 
+  106,  46, 114, 110, 107, 121, 141, 242, 
+  141,  57, 244,  79, 250, 156,  91, 129, 
+  175,  73, 141,  43, 192,   7, 185,  94, 
+  154, 136,  86, 223, 208,  13, 187, 104, 
+  198, 219, 235,   4, 143,   7, 254,  17, 
+  123, 116,  47, 247, 181,  90,  35, 223, 
+  130, 173, 219, 197, 140, 254, 193, 248, 
+   42, 165, 207, 193, 230, 108, 146,  50, 
+  214, 208, 175, 126,  29, 250, 211,  82, 
+  176,  33, 243, 170, 199,  85, 175,   5, 
+   92, 200, 187, 117, 112,  63, 220,   5, 
+  179,  18, 155, 247,  13, 160, 208,  99, 
+   47, 250,  23, 122,  95,  11, 168,  20, 
+  100, 138,  61, 153,  88,  62,  75, 210, 
+  237,  56,  73, 127,  11, 182, 110,  23, 
+  119, 165, 248,  99, 212, 169, 220,  15, 
+  148, 212, 163, 239, 208, 187, 122,  15, 
+  126, 142, 227, 132, 158, 144, 131, 112, 
+   97,   0,  41, 218,   5, 228, 221, 194, 
+   17, 228,  26, 236,  50,  43,  50,  91, 
+   45,  22,  71,  63, 212, 145, 179, 112, 
+  212,  28, 197,  89, 248,  14,  94,  97, 
+  122, 100, 182,  90, 230,  84,  77,  96, 
+  149, 108,  28, 207, 106, 112, 219, 205, 
+  195, 155, 119, 136, 142, 129, 126,  52, 
+   40,  85, 156, 114, 249,  19, 115, 114, 
+   19,  47,  21,  62, 140, 203,  86, 139, 
+  172, 216,  15, 209,  33, 119, 203,  40, 
+   58,  53,  32,  58,  16, 212, 114,  92, 
+  177,   9, 146, 189,  42, 116,  40,  68, 
+   23, 182, 224, 103, 113, 212,  28,  69, 
+   89,  52, 151,  69, 126, 115, 121, 101, 
+   79,  50, 247, 158,  41, 110, 181, 254, 
+  202, 209, 113, 127, 198,  51, 244,  58, 
+  178, 201, 221,  29, 217, 178, 201, 201, 
+   33,  57,   1, 167, 215,  64, 236,  53, 
+    7, 241,  82, 155,   8,  95, 119,  59, 
+  166, 149,   5,  87, 110, 159, 192, 242, 
+    7, 179, 152, 156,  80, 142, 243, 112, 
+   17,  75,  71, 206,   5, 224, 238,  77, 
+  139, 144, 119,  11, 231, 155,  28,   3, 
+   51, 222,  76, 186, 120, 150, 208,  74, 
+  158, 126,  74,  39, 138, 198, 125,  74, 
+  125, 131,  30, 165, 111,  15, 228, 245, 
+  105, 112,  32, 199,  29,  40, 185, 123, 
+   69,  26, 135, 173,  50, 187, 142, 228, 
+  237, 148, 231,  48,  96, 110, 117, 251, 
+  123,  55,  34, 132, 199, 251,  30,  96, 
+  110, 245,  34, 236, 225, 139,  80, 248, 
+  118,  65,  85, 242,  44,  14,  65, 230, 
+  214, 145,  44,  47,   7, 177, 193,   9, 
+  130,   2,  65, 110, 117, 251,  22,  65, 
+  225, 196,  21,  82, 141,  76, 229, 195, 
+   83,  81,  11, 201, 143,  28,  73,  71, 
+   89,  21, 106, 187,  13,  69,  90, 181, 
+  187,  59, 249, 122, 251,  79, 128, 255, 
+   53, 222, 185, 253, 251, 241, 143, 159, 
+  142, 194,  71,  75, 113, 193,  25,  58, 
+  134,  28, 243, 212, 231, 175, 148,  39, 
+   36, 166, 167, 137, 147, 123, 233, 216, 
+   98,  14, 160, 247, 193,  79, 120,  65, 
+  179,  86, 114, 148, 182,  90,  26,  28, 
+   74, 212,  90,  17,  23,  90,  55, 172, 
+   68,  30, 200,  87,  24, 113, 106, 140, 
+  212, 234,  66,  41,  81, 135, 241, 230, 
+  142, 251,  16, 235,  53, 141, 142,  92, 
+   68, 180,   9,  44,  31,  58, 181,   5, 
+   48,  55, 183, 150,  45, 137, 189,   5, 
+  128,  94,  27,  54, 139,  99,  70,   5, 
+  144,  39,  24,  40, 200,  41, 226,  13, 
+  243,  63, 232, 101,  79, 199, 165, 242, 
+  193, 110, 177, 162,  86, 216, 113, 169, 
+  124, 220, 193,  68, 149,  92, 206,  42, 
+  109, 111,  44, 218, 142, 228, 170, 195, 
+  120,  58, 107,  14, 129,  37,  58,  68, 
+  187, 136, 160, 112, 242, 183,  17,  47, 
+   82, 213,  65,  90, 122, 185,  45, 163, 
+  156, 202, 191, 174, 167, 100, 221,  79, 
+  183,  12, 157,  44, 210, 163, 217,   9, 
+  246, 250, 116,   2, 125,  18, 252, 216, 
+  155,  35,  45, 211, 140, 238, 160,  37, 
+  172, 244,  48,  79, 159, 251,  18, 103, 
+   93,  17, 229, 106, 168, 244, 238, 202, 
+   97, 159,  56, 108,  53, 101, 204, 206, 
+  255, 144, 140, 206,  55, 240, 159, 148, 
+  199,  88, 254, 226, 174, 102, 135,  13, 
+  112,  48,  11, 248, 230, 178, 188,  38, 
+   39, 170,  87, 129, 201,   6,  59,   7, 
+  189, 199,  91,  97, 143,  81, 166,  11, 
+  231, 116, 157, 116, 188, 131,  55,  24, 
+  205,  69, 252, 249, 236, 107,  12, 248, 
+  241,  30, 247, 111,  91, 176,  90, 201, 
+  211,  79, 233, 196, 140, 167, 251, 243, 
+  251, 140, 215,  72,  57, 254,  45, 203, 
+   98, 102, 161, 242,  53, 210, 173, 246, 
+   24,   1, 117,  71,  48,  52, 128, 220, 
+   59, 156,  23,  67, 167, 114,  54, 168, 
+   27,  39,  78,  75,  17, 121,  83, 157, 
+  100, 222, 190, 246, 178, 188, 224, 113, 
+  243, 197, 128, 231, 199,  50,  52,  69, 
+  202, 110, 253,  79, 239, 226, 137, 205, 
+   79,  75, 153, 186,  82, 160,  34, 216, 
+  204, 139,  73,  75, 136, 111,  56, 139, 
+  214, 114, 138,  27,  45, 233, 248,  59, 
+  157, 238, 160, 162, 201, 190, 148,  90, 
+   13,  50,  91,  45, 153, 202, 222,  60, 
+  164, 251,  63,  58,  37, 132,  19,  43, 
+  150, 179, 225, 135,  74,  50, 199, 140, 
+   16,   0, 134, 103, 167, 139, 241, 241, 
+   62,  45,   2, 138,  25, 219, 190,  68, 
+   80, 137,   8,  74, 233, 182,   4,  47, 
+   43,  15,  14, 126, 135, 224, 134, 179, 
+  248, 152, 207,  33, 183, 150, 113,  51, 
+  101,   4,  59,  43, 154, 131,  10,  44, 
+   52,  88,   4, 183, 125,   1, 204, 183, 
+   78,  32, 189, 199, 116, 134, 235,  42, 
+  249,  38, 211,  76, 118, 239, 230, 121, 
+   21,  41, 135,  50, 196, 222,  93, 245, 
+  212, 163,  34, 196, 148, 199,  83, 107, 
+  167,  35, 214, 171,  91,  60, 204, 101, 
+  222, 245, 188, 211, 245, 143,  20, 105, 
+  147, 232,  32, 148,  49, 165, 124,  19, 
+  129, 178,  10,  20, 118, 112,  40, 193, 
+  110, 177, 162, 212, 106,  88, 173,  28, 
+  200, 190, 132,  25,  20, 150,  90,  88, 
+   53, 252,  19,  56, 254, 214, 207, 218, 
+   75, 202, 242,  27, 233, 222,  53, 128, 
+   46, 133, 171, 185, 103, 251,  27, 238, 
+   70, 237, 206,   6,  20, 118,  78, 132, 
+   71, 179,  34, 245, 121,   2, 202, 115, 
+  184, 187,  98,  45,  75,   3,  39, 176, 
+  205, 222, 147, 181, 183, 110, 108, 179, 
+  125,   2,  12, 249, 215,  56,  41, 158, 
+  177, 127, 199, 163, 108, 193, 149, 123, 
+  134, 247, 134,  60,   4, 192,  61, 219, 
+  223,  64,  22,  31, 193, 235,  12, 103, 
+  117, 237, 112, 244, 129,  26, 182, 223, 
+  181, 238,  66, 199, 211,  10, 222, 132, 
+  207,  71,  51,  84, 185, 223, 125, 207, 
+  149, 134,   4, 166, 237, 251,  43, 209, 
+   69,  39,  16,  29, 202, 243,  82,  30, 
+   41,  88, 124, 111, 200,  67,  28, 141, 
+  154, 196, 161,  35, 149, 100, 204,  88, 
+  245, 243, 188, 206, 127,  22, 111, 220, 
+   50, 157, 168,  32,  45, 169,  57, 203, 
+  153, 100,  79, 115, 235, 162,  73,  55, 
+   21, 174,  64,  86,  26,  70, 114,  90, 
+   52,  18, 110, 201, 226, 190,  35, 239, 
+  227, 170, 243, 106,  17, 212,   8,  94, 
+   13, 188,  52, 225,  19, 138, 245, 177, 
+  120,  97,  35, 253, 136, 137, 140, 238, 
+   41, 194, 249,  67, 114, 215, 211, 127, 
+  254, 175, 242, 204, 229,  39, 164,  33, 
+  106, 109,   8,  74, 173, 198,  83, 159, 
+  191,  82, 158, 236,  46, 179, 147, 197, 
+  223, 215, 146, 160, 119, 146, 223, 255, 
+   62, 230,  91,  39, 160, 176, 131,  76, 
+  240,  65, 235,  21, 128, 220,  21, 232, 
+  134,  57, 148, 240,  81, 226, 157, 228, 
+  244, 124, 134, 188, 132, 123,  57,  22, 
+  117,  51, 183, 159, 250,  59, 174,  58, 
+  175, 230,   6, 168,  20, 144, 251,  88, 
+   57, 220, 101, 182, 251, 187,  53,  89, 
+  213, 238,  96,   2,  32, 115, 204,   8, 
+   97, 241, 247, 181, 212, 212, 152, 233, 
+  148,  16, 206, 196, 242,  89, 156,  80, 
+  199, 162, 176, 131,  74,  99,  64,  84, 
+  134, 186, 131,   9, 151,  88, 203, 247, 
+   81,  55, 178,  39, 241, 113, 210,  67, 
+  239,  34, 184, 225,  44, 129, 197, 205, 
+   78,  93, 208, 155, 169, 244, 233,  12, 
+  192, 222, 156, 106, 178, 167, 173, 102, 
+   90, 215, 144,  11, 124, 220, 220,  71, 
+   70, 131, 197, 118, 193, 247, 153,  93, 
+  250, 146, 217, 165,  47,  43, 189, 187, 
+  243, 217, 137,  96, 158,  50,  76,  71, 
+  103, 240, 101,  69, 234, 243, 252,  39, 
+  229,  49,  14, 199,  78, 102, 111, 194, 
+  255, 129, 194, 225, 174, 184,  22,  15, 
+  120, 139,  77, 186, 118,  43, 120,  15, 
+   60, 149, 204, 157, 143,  38, 115, 255, 
+  131,  97, 232, 244, 193, 232, 162,  99, 
+   89,  53, 122, 150, 251,  30,  86, 141, 
+  158, 133,  46,  58,  22,  63, 181, 130, 
+  251,  31,  12, 227, 206,  71, 147, 121, 
+  224, 169, 228,  11,  51, 192,  86, 240, 
+   76,  43,  11, 200, 205, 109,  92, 110, 
+  167, 112, 176,  55, 225, 255,  56,  28, 
+   59, 153, 255, 164,  60, 198, 138, 212, 
+  231, 209,  25, 124, 121, 202,  48, 157, 
+  207,  78,   4, 179, 210, 187, 187, 251, 
+   30,  46, 154, 113,  94, 132,  55, 173, 
+  107,   8, 217, 211,  86, 187,   3, 178, 
+   74, 159, 206,   8, 122, 179, 251, 120, 
+   96, 177, 154, 224, 134, 179, 164, 135, 
+  222, 197, 158, 196, 199, 249,  62, 234, 
+   70,  92,  98,  45, 114, 135,  25,  65, 
+  212,  33,  42,  67,  81, 105,  12,  40, 
+  236, 112,  66,  29, 203, 196, 242,  89, 
+  116,  74,   8, 167, 166, 198, 204, 226, 
+  239, 107, 221, 193,   4, 192, 150, 196, 
+  222, 194, 154, 172, 106, 247, 181,  15, 
+  119, 153, 141, 220, 199, 234,  14,  38, 
+    0,  92, 117,  94, 220, 126, 234, 239, 
+   28, 139, 186, 153, 188, 132, 123, 201, 
+  233, 249,  12,  31,  37, 222, 137,  67, 
+    9, 162, 211, 138, 210, 165,  65, 238, 
+   10,  68, 235,  21, 128,  76, 240,  65, 
+   97, 151, 130, 137, 252, 254, 247, 145, 
+  160, 151, 218, 192,  93, 230, 150, 217, 
+  113,  70, 247,  20,  33, 253, 136,   9, 
+   47, 108,  88, 213, 161,  56, 253, 172, 
+  238, 135, 156, 251, 161, 103, 135, 241, 
+  101,  91, 168, 142,  26, 205, 214, 142, 
+  119, 240,  69, 231, 169, 210,  79, 228, 
+  210, 131,  75, 163, 148, 130, 137, 163, 
+  221, 110,  39, 171, 160, 158,  85,  35, 
+  190, 102, 238, 228, 248,  86, 217,  75, 
+  238,  25, 105, 150, 245, 214, 142, 119, 
+   80,  23,  98,  63, 143,  45, 119, 247, 
+  144,  40, 243,  15,  81, 173, 143, 100, 
+  107, 199,  59,  40, 148, 233, 169, 138, 
+   28, 194, 218,  37, 121,  87, 100, 159, 
+    0, 114, 157, 130,  46, 189,   2, 232, 
+   24, 227, 127, 201, 161, 202, 142,  49, 
+  254, 244,  25,  29, 142,  92, 167, 104, 
+  181, 189, 252, 148, 183, 118,  73,  30, 
+   85, 145,  67,  40, 148, 233, 217, 218, 
+  241,  14, 170, 245, 145,  40, 243,  15, 
+  185,   3,  53, 209, 209, 220, 243,  84, 
+   23,  98, 103, 107, 199,  59, 240, 194, 
+   70, 238,  25, 115, 235, 120, 147, 227, 
+   89,  53, 226, 107, 178,  10, 234,  57, 
+  218, 237, 118,  86,  43,   7, 162,  81, 
+   74,  58,  17, 228, 146, 115, 252, 162, 
+  243,  84, 137,  29,  53, 154, 241, 101, 
+   91, 192, 142, 123, 184, 165, 137, 237, 
+  244, 179,  98,  85, 135,  94,  52, 152, 
+    0, 184, 222, 254, 243, 127, 149, 231, 
+  235,  27, 141,  95,  64,  23, 180,  94, 
+    1, 158, 250, 252,  21, 243, 100, 143, 
+   12,  27,  34, 152, 198,  13,  17, 254, 
+   45, 139,  22,  74, 178, 243,  72, 239, 
+   49, 157,  31, 117, 169,  23,  52,  80, 
+  135,  18, 222, 143, 184, 149,  35, 186, 
+   84,  78,  10,   2,  10, 211,  73,  30, 
+  221, 121,  59, 125, 114,  78, 180, 136, 
+  232,  69, 187,  72, 102,  88,  31, 204, 
+   98,  96, 139, 181, 172,  63,  45, 166, 
+  113,  67, 132, 248,  69, 233, 172, 127, 
+  241,   7, 134, 140,  78,  96, 177, 110, 
+   58,  85, 114,  57, 114, 135, 228,  48, 
+  154, 254, 223, 169,  31, 193,  58, 195, 
+  173, 232,  29, 213,  12,  61, 245,  54, 
+   79, 164, 189,  36,  57, 156, 198, 222, 
+  137,  77,  17, 211,  16, 124, 141, 205, 
+  227, 166, 195, 140,  23, 116, 127,   2, 
+   44,  90, 112, 159,  48, 123, 152,  17, 
+  138, 164, 229, 152, 153,  79, 166,  73, 
+   15,  67,  67, 144, 251,  55, 165, 191, 
+  255,  61, 197, 103, 138,  40,  23, 189, 
+  168, 114, 106,  41,  51, 219,  40,  51, 
+  219, 232, 147, 243,  15, 156, 122,  59, 
+  213,  14,  47, 138,  77,  54, 105, 107, 
+  224, 166, 217, 237, 173, 228,   1, 188, 
+  183, 174, 174, 249,  97, 101, 143, 227, 
+  237,  79,  11,  33,  39, 167, 249, 164, 
+  156,  28, 222, 254, 180, 144, 221, 244, 
+  191, 232,  57, 109, 226,  53, 216,  40, 
+   54, 217, 168, 118, 120, 225, 212, 219, 
+  233, 147, 243,  15, 183,  60,  85,  78, 
+   45, 229, 162,  23, 197, 103, 138,  40, 
+  253, 253, 239, 155,  47,  98,   8, 146, 
+  122,  39, 158,  76, 107,  61, 175, 201, 
+  208, 124, 141, 146,  46,  20,  78,  41, 
+  138, 117, 200, 121,  34, 237,  37, 134, 
+  158, 122,  27, 189, 163, 154, 117, 134, 
+   91, 217, 169,  31, 209,  66, 183,  77, 
+  189,  79, 139, 117, 211,  25,  50,  58, 
+  129, 245,  47, 254,  64, 252, 162, 116, 
+  247, 112, 199, 197, 138,  23,  54, 204, 
+   98,  32, 153,  97, 125,  16, 237, 226, 
+  121, 137, 172, 147,  62,  57,  39, 120, 
+  116, 231, 237,  40,  76,  39,  57,  41, 
+    8,  28, 209, 165, 242, 126, 196, 173, 
+  156, 159, 240,  54, 149,  31, 117, 169, 
+  164, 247, 152,  78,  73, 118,  30, 255, 
+  150,  69,  11, 166, 113,  67, 132, 203, 
+  205, 220, 175,  81, 234, 249,  71, 252, 
+  203, 184,  66, 170, 165, 225, 141, 198, 
+   46,  65, 209, 161,  36,  50, 255,  28, 
+   19,  54, 204,   4, 234,  57, 226,  59, 
+  142, 245, 225, 227,  90, 156, 107,  11, 
+   13, 230, 155,  76,  51,  91, 110,  93, 
+  217,  38, 123, 105,  42, 177, 206, 147, 
+  164, 251,  78, 190, 160, 135, 162,  41, 
+  168, 233, 150, 247, 141, 212,  43, 229, 
+  116,  80, 112, 180, 186, 121,  56, 160, 
+  141, 246,   9, 144, 189, 234,   8,  27, 
+  150,  23, 178, 244, 161, 163, 184, 172, 
+   38,  68, 187, 208,  98,  24, 201, 101, 
+   53, 177, 244, 161, 163, 108,  88,  94, 
+   72, 246, 170,  35,  45,  47, 218,  22, 
+  222, 150,  66,  10, 142,  86, 163, 119, 
+   58,  90, 200, 208, 162, 119, 162,  81, 
+  214, 116, 223, 201, 196,  58,  79,  94, 
+  168, 148,  86, 240, 182, 220, 186, 146, 
+  111,  50, 205, 216,  66, 131,  91, 206, 
+  223,  10,  31, 199,  17, 223, 113,  64, 
+   61,  19,  54, 204,  36,  50, 255, 156, 
+  155,  45,  40,  69,  16,  29, 184,  66, 
+  170, 249,  71, 252, 203, 212,  40, 245, 
+  151, 244,  99, 215, 219, 127, 122, 120, 
+   30, 222, 175, 153, 231, 110, 136,  77, 
+  115,  26, 166, 142, 233,  64,  66, 245, 
+  143, 220, 159, 187, 212,  29, 201,   3, 
+  216, 101,  86, 106,  27, 192, 175, 228, 
+    0, 130,  83, 137, 104, 210, 181, 108, 
+  252,  82, 158, 136, 204, 187, 158,  71, 
+  198, 172, 164, 193,  55, 220,  13,  92, 
+  147,  85, 205, 153, 228, 190,  23, 117, 
+  214, 250, 117, 219, 197,  73,  35, 130, 
+  169, 145, 251, 243, 231, 163,  47,  51, 
+  200, 188,  15, 167,  66, 231,  62,  94, 
+   46, 122,  17,  88, 177,   9, 185,  73, 
+  137, 163, 200,   7, 185, 159, 224, 118, 
+   54, 117, 161,  34, 175,  13,  95,  79, 
+  131,  82, 229, 238, 161, 200, 236, 210, 
+  247, 231, 151, 140, 110,  45, 107,  30, 
+  203, 125, 101,  20,  67,  59,  73, 167, 
+  108,  43,  16, 233, 239, 117, 130, 111, 
+  116, 203, 113,   8,  50, 150,   6,  78, 
+  160,  74, 238, 195,  19,  91, 158, 101, 
+  115, 252,   4, 214, 247, 253,  51, 203, 
+   55, 148,  96, 122, 252,   7, 176, 216, 
+  152,  61, 204, 248, 179,  75, 215,  46, 
+  224,  77, 233,  68, 255, 193,   2, 179, 
+   85, 135,  73,  75, 157,  73,  97, 169, 
+    5,  71,  99, 230, 166, 208, 170, 232, 
+   18, 166, 166, 231, 238,  79,  88, 102, 
+  235, 198, 174,  29,  98, 139, 177, 240, 
+  182, 242, 244, 175, 140,  98, 198, 152, 
+   96, 198, 238, 121, 139,  17, 185, 107, 
+  249, 219, 240, 103, 241, 119, 214, 114, 
+  119, 197,  90,  20, 162, 139, 201, 230, 
+   25, 236, 170, 143, 110,  33, 191, 233, 
+  241,  31, 218, 196, 235, 117, 116, 143, 
+  216,  39,  65, 218,  89,  84, 109, 183, 
+  241, 216, 150, 177, 120, 159,  19, 154, 
+   51, 188, 106,  17,  69, 120,  45,  78, 
+  189, 157, 138, 192, 145,  24, 132, 250, 
+  230, 108, 216,  97, 230,  71,  93,  42, 
+  111, 117, 121,  18,  95, 103,  21, 171, 
+   55, 151,  92,  50, 152, 136,  56, 176, 
+   71, 156, 152, 228, 231,  30, 246,  80, 
+  215,  20, 177,  96, 195, 148, 198, 232, 
+  185, 229,  98,  37,  65,  97,  71, 208, 
+  155,  17, 229, 118, 170, 131, 147, 241, 
+   81, 131, 210, 213, 108, 203, 162, 211, 
+  202, 219, 241, 119, 147, 227,  55, 136, 
+   47,  55, 156, 110,  49, 103, 227, 167, 
+  165, 105, 216,   3, 224, 148,  43, 148, 
+  241, 249,  75, 152, 181, 247, 141, 198, 
+  185,  33,  52, 143,  53, 138,  14,   4, 
+  175,   6,  80,  56,  16, 180, 190,  16, 
+   16, 225, 190, 198, 219, 241, 119,  83, 
+  227, 219, 157, 141, 107, 143, 177, 239, 
+  134,  91, 219, 172,  63, 181, 221, 134, 
+  182,  56, 131,  39, 211, 158,  65, 180, 
+    9, 136, 118,   1,  65,  97, 119, 159, 
+   35, 243,  86, 225,  10, 240,  97, 167, 
+   97,  24, 219, 186, 222, 193, 226, 151, 
+   14,  96, 250,  56, 231, 138, 236, 179, 
+   69, 208, 255, 242,  71,  56, 207,  10, 
+   45, 231,  80, 132, 137, 232, 159, 156, 
+  121, 209, 158, 137, 182, 240, 244, 127, 
+   72, 224, 129, 167, 146,  25, 122, 228, 
+  223,  12,  40, 223, 138, 172, 178,  22, 
+   87, 157, 173,  69, 176,  36,  40,  69, 
+    4, 149, 200, 203,   3, 159, 195,  18, 
+  146,  66, 131,  82, 213, 230, 246, 151, 
+  250, 237, 231, 226, 232,   9, 113, 248, 
+  214,  28, 226, 254, 220, 165, 205,   7, 
+   42, 207,  32,  90, 106, 192, 161, 144, 
+  134, 177,  26, 237, 181,  41, 128, 146, 
+  121,  89, 248, 176, 207,  67, 124,  23, 
+   51, 135, 142,  50, 105, 226, 217, 197, 
+  122,  40, 126,  41, 255, 233, 225, 121, 
+  120, 191,  70, 158, 162, 105,  98, 209, 
+  138,  32, 105,  24, 161, 170, 168, 148, 
+  228, 170,  12,  92,  98,  45, 200,  26, 
+  103, 186, 218,  28,  40, 170, 106, 241, 
+   43,   3, 151, 217, 128,  60, 192,  76, 
+   97, 100,   4, 121, 178, 110, 236, 204, 
+   58, 139,  66,  43, 195, 144,  20,  66, 
+  136,  58, 144,  31,  59,  78, 106,   1, 
+  187,  92, 153, 191,  41,  77, 252,  32, 
+   80, 193, 142, 236, 106, 122, 104,  74, 
+  137, 173,  63, 129,  75, 105,  65,  64, 
+  226, 202,  76, 181,  24,  11,  29, 128, 
+  129, 218,  16,  59, 233, 125,  39, 178, 
+  250, 168, 147, 220, 181, 199,   9,  30, 
+  220, 157, 134,  14, 157, 240,  82, 250, 
+  187, 215, 201, 214,  86, 255, 252, 118, 
+  227, 203, 150,  61,  44, 156,  63, 219, 
+  188,  87, 205,  81, 252, 141,  82, 143, 
+  192, 157, 165, 223, 241, 160, 122, 183, 
+   52,  17, 211,  90, 197, 156, 227, 153, 
+  160, 112, 240,  67, 207,  63, 177, 183, 
+  219, 116, 242, 107, 192, 180, 166, 176, 
+   77, 235, 238, 127, 202,  51, 173,  44, 
+   96, 227, 119,  48, 235, 238,  60, 134, 
+  203, 222, 227, 131, 136, 153, 248,  27, 
+  165, 241, 252,  58, 115,  61, 125, 247, 
+   46, 195, 116, 172, 136, 141,  75,  53, 
+   45, 118,  36, 188,  18, 158, 105,  77, 
+   33, 249, 253, 130, 217, 211, 103,  54, 
+  162,  86, 203, 147, 123, 231, 130,  67, 
+    1,  62,  90, 156,  26, 127, 222, 211, 
+  127, 197, 155, 138, 126,  84,  25, 199, 
+   75, 193, 193, 254,  93, 108, 111,  35, 
+  239, 252,  58,  47,  82, 250, 115, 183, 
+  226, 113, 212, 213,   5, 148, 236,  56, 
+   68, 252, 132, 206,  76, 234,  43, 167, 
+  119, 205,  55, 120,  23,  43,  49, 150, 
+   28,  68,  22, 165, 192, 165, 151, 228, 
+  117,  41,  33, 182, 254,   4,  66, 126, 
+   46,  59, 172,  42, 252,  66, 213, 204, 
+  221, 148,  38, 190,  48, 114, 224, 101, 
+  185,  94, 216, 168, 247,  13, 231, 145, 
+   49,  43,  25, 116, 106,  53, 197,  13, 
+   21, 148, 103,  21, 227, 176, 184,  24, 
+  144,  20,  70, 172, 235,  48, 209,  37, 
+  249, 184,  74, 125, 241, 171,  61, 131, 
+  204,   8,  78, 127,  31,  80,  53, 118, 
+  209,  59,  28,  36, 159, 201,  96, 151, 
+   57, 142, 184,  72, 201, 238, 167, 109, 
+  221,  46,  94, 174, 135,   2, 160, 163, 
+  236,  28, 121,  81, 227, 249, 208,  94, 
+   70, 108, 249, 113, 228, 166,   2, 148, 
+  154,  72,   0,  14,  69,  12, 226, 119, 
+  199, 191,  32, 164, 180,  24, 234, 173, 
+   96,  57, 130,  24, 160,   1,  33, 136, 
+  240, 211, 135, 249, 188,  56, 142, 225, 
+  250,  80, 246, 181, 197,  94, 206, 159, 
+   38,  16,  62, 158,  15, 147,  14, 211, 
+  189,  36,  23, 127,  65,  90,  67, 158, 
+  163,  30, 204, 216, 146,  37, 136,  13, 
+   26,  92,  13, 165, 124, 240,  69,  55, 
+   62, 123,  63,  19,  86,  29, 101, 246, 
+  168, 208,  43, 178, 207, 243, 203, 201, 
+  188,  50,  58,   6, 107, 155,   3,  23, 
+  189, 137, 147, 121, 150, 139, 247,  20, 
+  180, 213,  62,  63,  56, 204, 223,  42, 
+   93,  20, 120, 151, 211, 111, 192, 113, 
+    4, 187,   6, 124, 173, 172,  15, 158, 
+   67,  66, 195,  14, 201,  23, 137,  70, 
+   14,   5, 199, 115,  48, 124,  60, 177, 
+  206,  43, 219, 247,  98, 168,  62, 148, 
+   13, 185,  13, 204, 181,  31, 198, 101, 
+   53, 129,  88, 138,  80, 105, 133, 122, 
+   21, 162,  67,  71, 113,  80,   8, 223, 
+  247, 186, 133, 238, 103, 126, 148,  28, 
+  171, 245,  36,  78, 125,  39, 242,  12, 
+  157, 201, 139,  26, 239,  14,  38,  46, 
+   87, 174, 183, 255, 244, 240,  60, 188, 
+   95,  43, 239, 146,  13, 114, 205, 210, 
+  135,  68, 115, 218,  50,  34,  19, 165, 
+  238, 142, 106,  27, 100, 199, 220,  64, 
+  233, 224, 177,  28,  15, 186,   5, 128, 
+  194, 252,  74, 210, 231, 126,  13, 165, 
+  229, 160, 212,  67, 143, 142, 248, 223, 
+   20,  78,  82, 143,   0, 194, 130,  36, 
+  231, 109, 179, 217,  56, 120, 200, 204, 
+  241,   1, 253,  46, 219, 248, 159, 123, 
+  235,  29, 113, 227, 214, 175,  89, 208, 
+  123,  39, 190,   6, 129,  50, 187,  28, 
+   75, 153, 131,  35, 154, 161, 100, 223, 
+   48, 155,   2, 159,   1, 212,  85, 218, 
+   73,  95, 148,   6, 251, 142,  54, 166, 
+   31,  93,  24, 250, 108, 247, 230,   9, 
+  101, 199, 170, 249, 185, 135,  81,  83, 
+  105, 218, 169,  79,  21, 239, 224, 159, 
+   19, 165, 172,  60, 202,  85,  64, 178, 
+  198, 135, 211,  53,  85, 212,  89,  69, 
+   10, 123,  12, 227, 139, 193, 175, 178, 
+   97,  81,   6, 214, 142, 129,  82, 198, 
+  253,  74, 218, 149, 239,  36, 249, 147, 
+  157,   8, 191, 153, 159,  73,  23,  77, 
+   49,  62, 141, 221, 190, 181, 114,   5, 
+   71, 173,  33,  76, 126, 161,  87, 139, 
+  204, 239, 138, 119,  34, 220,  87, 129, 
+  252, 113, 105,  37, 139, 230,  84,   5, 
+   99, 230, 166,   1, 222,  27, 207,   0, 
+    0,   3, 173,  73,  68,  65,  84, 112, 
+  203, 142, 121,  68,  29, 220, 138, 183, 
+   70, 160, 131, 175,  63,   7, 172, 181, 
+   20, 202, 164, 125,   5, 254, 180, 102, 
+   20, 182,  92,  69, 155, 120, 243,  55, 
+  165, 137, 219, 227, 252, 220, 159, 183, 
+   61, 123, 168, 133, 126, 122, 207,  29, 
+  136, 119, 128, 146,  78, 181,  59,  73, 
+  252, 118,  25,  93, 173, 219, 208,  26, 
+   21,  24, 149,  78, 106, 202,  69,  30, 
+   73,  31, 192, 232,  97,  55, 241, 204, 
+  159, 239, 187,  44, 175, 243, 206, 221, 
+   98, 143, 238,  58,  84,  42, 169, 254, 
+  206, 150,  58, 200,  58,  88,  73, 213, 
+  215,  69, 210, 187,  65, 236,  38,   8, 
+   50, 208, 123, 209,  77,  68, 197,   4, 
+   72, 231, 148, 126,  65, 208, 142, 245, 
+   36, 230, 127, 139,  95,  99, 181, 159, 
+  204, 150, 163,  27,  56, 155, 137, 119, 
+  191, 209,  42, 249,  18, 211, 211, 196, 
+   30, 241, 210, 208, 142, 181, 166, 138, 
+   77, 135,  27, 176, 150, 212, 224, 252, 
+  170,  12, 162, 130,  72, 154,  18,  70, 
+  254, 230, 115, 244, 189,  59, 133,  64, 
+  127, 111, 246, 239,  63, 196,  95, 179, 
+  238, 161, 234, 180, 147, 236, 154,  64, 
+   44,  14,  45, 169, 177,   3, 248, 243, 
+  195,  79, 183,  89, 127,  95, 142,  74, 
+  224, 254, 219, 163,   0, 168,  48, 187, 
+  208,   9,  42, 178,  14,  85, 147,  93, 
+   32, 181, 201, 209, 183, 245, 164, 188, 
+  240,  40, 241, 239,  60, 202, 123, 251, 
+  134,  72,   1, 104,  59, 237, 228, 218, 
+  180,  26, 233, 129,  15, 122, 224, 221, 
+   24, 192, 212, 137,  70,  22, 223, 121, 
+  176, 229, 234, 163, 246, 224, 105, 224, 
+  158, 212, 237, 228, 222, 247,  58, 134, 
+  168,  46, 108, 252,  76, 218,  22,  62, 
+  177, 147, 156, 164, 238, 126, 152,  69, 
+   27, 129,  58, 169,  23, 234, 237,  79, 
+   11, 153, 250,  67,  78, 155, 121, 111, 
+   45, 124,  81, 220, 151, 183,  19, 173, 
+  194,  66, 162, 111,   5, 254,  29, 228, 
+   60, 159, 244,  30,  61, 123, 118, 167, 
+  162, 170, 142,  61,  75,  51, 136,  25, 
+   17,  74, 214, 202, 179,  80,  88, 138, 
+  252, 102,  35, 154,  96,  95,  70, 118, 
+   83, 163, 241, 149, 230, 147,  28, 204, 
+   45, 107,  49, 105, 247, 114, 229, 122, 
+  251,  79,  15, 207, 195, 251,  53, 240, 
+   46,  11, 189,  96, 111, 127, 128, 200, 
+   40,  48, 106, 193, 102, 129,  98, 147, 
+    4,  59,  47, 115, 152, 121,  75,  28, 
+  131, 167, 245, 110, 217, 205,  57, 120, 
+   96, 235, 119, 208, 219, 114,  18, 116, 
+  126, 224, 178, 129,  76,  37,   9,   2, 
+   16, 102,   0, 235, 197, 121, 237, 241, 
+  238, 130, 206,  97, 199,   9, 209,  72, 
+   91, 145, 102, 155,  34, 169, 240, 239, 
+  217, 252, 195, 211,  38, 105, 219, 237, 
+  118, 126, 151,   7, 209, 126,   8, 190, 
+    2,  49, 165, 233, 196, 104,  26, 248, 
+  222, 123,  16,  98, 141, 216, 252, 130, 
+  176, 246, 228, 233, 180, 208, 161, 121, 
+   44,  56, 176, 106,  63, 137, 122, 105, 
+   92, 186, 216,  26, 196, 241, 179, 157, 
+  219,  95,  62, 128,  32,   3, 104, 244, 
+  112, 182,  81, 111, 118,  83, 179, 110, 
+  205, 213, 109, 122, 215, 197, 178,  29, 
+   45,  55, 106, 217, 177,  34, 157, 139, 
+  242,  66, 244, 160, 210,  66, 153,   5, 
+   78,  22,  94, 181, 189, 204, 223, 212, 
+  204, 125, 225, 169,  13,  45, 247,   7, 
+    9, 242,   1, 179,  67, 170,  91, 149, 
+   22, 242,  75,  37,  91, 105,  39, 253, 
+  125,  31, 233, 135, 126,  72,   2, 199, 
+  255, 190, 175, 121, 251, 233, 210,  90, 
+  105,  67,  55,  63,  25,  84, 187,  32, 
+  255, 108, 251, 219,  11,  72, 123, 161, 
+  244, 139,  34, 104, 162,  20, 212, 148, 
+  174,  41, 132, 221, 133, 237, 254,  46, 
+   15,  55, 239, 167,  50,  53, 201, 154, 
+   16,  68, 231, 191, 164,  98, 218, 158, 
+  195, 239,  78,  86, 183,  31,  79, 167, 
+  133, 152,  32, 201, 151, 157,  54, 129, 
+   78, 209, 252, 222, 144,  70, 249, 231, 
+  191,  52, 198, 253, 177, 181, 201, 202, 
+   47, 229,  63,  61,  60,  15, 239, 151, 
+  230, 181, 250, 109, 163, 151,  90, 175, 
+  126, 126, 166, 114, 173, 222, 118, 232, 
+  225, 121, 120,  30, 222,  47, 200,  11, 
+  111,  28, 246,  40, 178, 120, 234, 211, 
+  195, 243, 240,  60, 188,  75,  22, 217, 
+  207,   1, 215, 175, 124,  92, 152,  57, 
+   42,   4, 202, 170,  47, 253, 163, 178, 
+  106, 102, 142,  10, 185, 106, 225,  90, 
+  240,  46,  50, 219, 253, 154, 242, 174, 
+  183, 124, 255, 203, 188, 162, 114,  79, 
+  125, 254,  55, 241, 138,  44,  45, 131, 
+    9,  79, 125, 122, 120,  30, 158, 135, 
+  119, 145, 210, 234,  27,  26,  51, 238, 
+   25, 113, 195, 241, 134,  11,  35,  25, 
+  139, 141,  49, 157, 213, 108,  88, 247, 
+  220,  85,  11, 231, 225, 121, 120,  30, 
+  158, 135, 231, 225, 121, 120,  30, 222, 
+  127,  39,  79, 214,  90, 224, 134, 117, 
+  207,  73, 235, 200, 207, 143, 100, 202, 
+  170, 153,  61, 204, 216, 238, 194, 121, 
+  120,  30, 158, 135, 231, 225, 121, 120, 
+   30, 158, 135, 247, 223, 197, 107, 243, 
+  141,  13,  28,  62,  95,  76,  43, 148, 
+  102, 101,  13, 140, 210, 144, 182, 229, 
+  133, 118,  23, 206, 195, 243, 240,  60, 
+   60,  15, 207, 195, 243, 240,  60, 188, 
+  223,  54,  15, 128, 169, 119, 189,  37, 
+   78, 189, 235,  45, 145, 235,  84,  60, 
+   60,  15, 207, 195, 243, 240,  60,  60, 
+   15, 207, 195, 251, 117, 243, 254,  31, 
+  119,  32,  88, 255, 247,  27, 132, 220, 
+    0,   0,   0,   0,  73,  69,  78,  68, 
+  174,  66,  96, 130, 
+};

Modified: branches/spectrum-gtk3/spec_panel.c
===================================================================
--- branches/spectrum-gtk3/spec_panel.c	2012-05-25 17:30:34 UTC (rev 18324)
+++ branches/spectrum-gtk3/spec_panel.c	2012-05-25 17:35:00 UTC (rev 18325)
@@ -1,6 +1,6 @@
 /*
  *
- *  gtk2 spectrum analyzer
+ *  gtk3 spectrum analyzer
  *
  *      Copyright (C) 2004-2012 Monty
  *
@@ -23,7 +23,8 @@
 
 #include "analyzer.h"
 #include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
+#include <gdk/gdk.h>
+#include <cairo/cairo.h>
 #include "fisharray.h"
 #include "spec_plot.h"
 #include "io.h"
@@ -32,17 +33,15 @@
 
 static struct panel {
   GtkWidget *twirlimage;
-  GdkPixmap *ff[19];
-  GdkBitmap *fb[19];
+  GdkPixbuf *ff[19];
 
-  GtkAccelGroup *group;
-  GtkWidget *toplevel;
-
-
   guint fishframe_timer;
   int fishframe_init;
   int fishframe;
 
+  GtkAccelGroup *group;
+  GtkWidget *toplevel;
+
   GtkWidget *plot;
   GtkWidget *run;
   GtkWidget **chbuttons;
@@ -66,7 +65,16 @@
 int *active;
 
 static void override_base(GtkWidget *w, int active){
-  gtk_widget_modify_base (w, GTK_STATE_NORMAL, &w->style->bg[active?GTK_STATE_ACTIVE:GTK_STATE_NORMAL]);
+  GtkStyleContext *c = gtk_widget_get_style_context(w);
+  GdkColor color;
+  GdkRGBA rgba;
+  gtk_style_context_get_color(c,active?GTK_STATE_ACTIVE:GTK_STATE_NORMAL,
+                              &rgba);
+  color.red=rgba.red;
+  color.green=rgba.green;
+  color.blue=rgba.blue;
+
+  gtk_widget_modify_base (w, GTK_STATE_NORMAL, &color);
 }
 
 static void replot(struct panel *p){
@@ -94,9 +102,8 @@
     if(increment_fish)p->fishframe++;
     if(p->fishframe>=12)p->fishframe=0;
 
-    gtk_image_set_from_pixmap(GTK_IMAGE(p->twirlimage),
-                              p->ff[p->fishframe],
-                              p->fb[p->fishframe]);
+    gtk_image_set_from_pixbuf(GTK_IMAGE(p->twirlimage),
+                              p->ff[p->fishframe]);
 
     if(p->fishframe==0 && !process_active){
       /* reschedule to blink */
@@ -110,9 +117,8 @@
     if(p->fishframe<=1)p->fishframe=12;
     if(p->fishframe>=19)p->fishframe=0;
 
-    gtk_image_set_from_pixmap(GTK_IMAGE(p->twirlimage),
-                              p->ff[p->fishframe],
-                              p->fb[p->fishframe]);
+    gtk_image_set_from_pixbuf(GTK_IMAGE(p->twirlimage),
+                              p->ff[p->fishframe]);
 
     if(p->fishframe==12){
       /* reschedule to animate */
@@ -363,7 +369,7 @@
   case LINK_SUB_FROM:
     ch=0;
     for(fi=0;fi<inputs;fi++){
-      GdkColor rgb = chcolor(ch);
+      GdkColor rgb = chcolor(NULL,ch);
 
       for(i=ch;i<ch+channels[fi];i++){
 	GtkWidget *button=p->chbuttons[i];	
@@ -377,7 +383,7 @@
     ch=0;
     for(fi=0;fi<inputs;fi++){
       for(i=ch;i<ch+channels[fi];i++){
-	GdkColor rgb = chcolor(i);
+	GdkColor rgb = chcolor(NULL,i);
 	GtkWidget *button=p->chbuttons[i];
 	set_fg(button,&rgb);
       }
@@ -481,22 +487,37 @@
 static gint watch_keyboard(GtkWidget *grab_widget,
                            GdkEventKey *event,
                            gpointer func_data){
-  struct panel *p=(struct panel *)func_data;
-
   if(event->type == GDK_KEY_PRESS){
     if(event->state == GDK_CONTROL_MASK){
-      if(event->keyval == GDK_w) { shutdown(); return TRUE; }
-      if(event->keyval == GDK_q) { shutdown(); return TRUE; }
+      if(event->keyval == GDK_KEY_w) { shutdown(); return TRUE; }
+      if(event->keyval == GDK_KEY_q) { shutdown(); return TRUE; }
     }
   }
   return FALSE;
 }
 
+static cairo_status_t png_read_func(void *closure,
+                             unsigned char *data,
+                             unsigned int length){
+  static unsigned char *prev=0;
+  static int sofar=0;
+
+  if((unsigned char *)closure != prev){
+    sofar=0;
+    prev=(unsigned char *)closure;
+  }
+
+  if(prev){
+    memmove(data,prev+sofar,length);
+    sofar+=length;
+  }
+  return CAIRO_STATUS_SUCCESS;
+}
+
 extern char *version;
 void panel_create(struct panel *panel){
   int i;
 
-  GdkWindow *root=gdk_get_default_root_window();
   GtkWidget *topbox=gtk_hbox_new(0,0);
   GtkWidget *rightframe=gtk_frame_new (NULL);
   GtkWidget *righttopbox=gtk_vbox_new(0,0);
@@ -540,12 +561,12 @@
     gtk_widget_set_name(hold_display,"top-control");
     gtk_widget_set_name(wbold,"top-control");
     g_signal_connect (G_OBJECT (hold_display), "clicked", G_CALLBACK (holdchange), panel);
-    gtk_widget_add_accelerator (hold_display, "activate", panel->group, GDK_h, 0, 0);
+    gtk_widget_add_accelerator (hold_display, "activate", panel->group, GDK_KEY_h, 0, 0);
     g_signal_connect (G_OBJECT (lock_range), "clicked", G_CALLBACK (lockchange), panel);
-    gtk_widget_add_accelerator (lock_range, "activate", panel->group, GDK_y, 0, 0);
-    gtk_widget_add_accelerator (lock_range, "activate", panel->group, GDK_Y, 0, 0);
+    gtk_widget_add_accelerator (lock_range, "activate", panel->group, GDK_KEY_y, 0, 0);
+    gtk_widget_add_accelerator (lock_range, "activate", panel->group, GDK_KEY_Y, 0, 0);
     g_signal_connect (G_OBJECT (wbold), "clicked", G_CALLBACK (boldchange), panel);
-    gtk_widget_add_accelerator (wbold, "activate", panel->group, GDK_b, 0, 0);
+    gtk_widget_add_accelerator (wbold, "activate", panel->group, GDK_KEY_b, 0, 0);
 
   }
 
@@ -597,29 +618,19 @@
     GtkWidget *fishbox=gtk_alignment_new(.5,.5,0,0);
     GtkWidget *sepbox=gtk_alignment_new(.5,.85,.7,0);
     GtkWidget *topsep=gtk_hseparator_new();
-    GdkPixmap *tb;
-    GdkPixmap *tp=gdk_pixmap_create_from_xpm_d(root,&tb,NULL,fisharray_xpm);
-    GdkGC *cgc=gdk_gc_new(tp);
-    GdkGC *bgc=gdk_gc_new(tb);
-    int w, h;
+    cairo_surface_t *tp=
+      cairo_image_surface_create_from_png_stream(png_read_func, fisharray);
+    int w=cairo_image_surface_get_width(tp);
+    int h=cairo_image_surface_get_height(tp);
 
-    gdk_drawable_get_size(tp,&w,&h);
     w/=19;
 
-    for(i=0;i<19;i++){
-      panel->ff[i]=gdk_pixmap_new(tp,w,h,-1);
-      panel->fb[i]=gdk_pixmap_new(tb,w,h,-1);
-      gdk_draw_drawable(panel->ff[i],cgc,tp,i*w,0,0,0,w,h);
-      gdk_draw_drawable(panel->fb[i],bgc,tb,i*w,0,0,0,w,h);
-    }
+    for(i=0;i<19;i++)
+      panel->ff[i]=gdk_pixbuf_get_from_surface(tp,i*w,0,w,h);
 
-    g_object_unref(cgc);
-    g_object_unref(bgc);
-    g_object_unref(tp);
-    g_object_unref(tb);
+    cairo_surface_destroy(tp);
+    panel->twirlimage=gtk_image_new_from_pixbuf(panel->ff[0]);
 
-    panel->twirlimage=gtk_image_new_from_pixmap(panel->ff[0],panel->fb[0]);
-
     gtk_container_set_border_width (GTK_CONTAINER (toptable), 1);
     gtk_box_pack_start(GTK_BOX(righttopbox),toptable,0,0,0);
     gtk_container_add (GTK_CONTAINER (sepbox), topsep);
@@ -679,22 +690,22 @@
   /* bandwidth mode */
     GtkWidget *tbox=panel->bwtable=gtk_table_new(2,2,0);
 
-    GtkWidget *menu=panel->bwbutton=gtk_combo_box_new_text();
+    GtkWidget *menu=panel->bwbutton=gtk_combo_box_text_new();
     char *entries[]={"native","display"};
     //"1Hz","3Hz","10Hz","30Hz","100Hz","300Hz","1kHz",
     //"1/24oct","1/12oct","1/6oct","1/3oct"};
 
     for(i=0;i<2;i++)
-      gtk_combo_box_append_text (GTK_COMBO_BOX (menu), entries[i]);
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (menu), entries[i]);
     //gtk_combo_box_set_active(GTK_COMBO_BOX(menu),0);
     
     g_signal_connect (G_OBJECT (menu), "changed",
     		      G_CALLBACK (bwchange), panel);
 
-    GtkWidget *menu2=panel->bwmodebutton=gtk_combo_box_new_text();
+    GtkWidget *menu2=panel->bwmodebutton=gtk_combo_box_text_new();
     char *entries2[]={"RBW","VBW"};
     for(i=0;i<2;i++)
-      gtk_combo_box_append_text (GTK_COMBO_BOX (menu2), entries2[i]);
+      gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(menu2), entries2[i]);
     
     g_signal_connect (G_OBJECT (menu2), "changed",
     		      G_CALLBACK (bwmodechange), panel);
@@ -706,20 +717,20 @@
     /* scale */
     /* depth */
 
-    GtkWidget *menu3=gtk_combo_box_new_text();
+    GtkWidget *menu3=gtk_combo_box_text_new();
     char *entries3[]={"log","ISO","linear"};
     for(i=0;i<3;i++)
-      gtk_combo_box_append_text (GTK_COMBO_BOX (menu3), entries3[i]);
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(menu3), entries3[i]);
     gtk_combo_box_set_active(GTK_COMBO_BOX(menu3),plot_scale);
     plot_setting(PLOT(panel->plot),plot_scale,plot_mode,plot_link,plot_depth,plot_noise);
     
     g_signal_connect (G_OBJECT (menu3), "changed",
 		      G_CALLBACK (scalechange), panel);
 
-    GtkWidget *menu4=gtk_combo_box_new_text();
+    GtkWidget *menu4=gtk_combo_box_text_new();
     char *entries4[]={"1dB","10dB","20dB","45dB","90dB","140dB","200dB"};
     for(i=0;i<7;i++)
-      gtk_combo_box_append_text (GTK_COMBO_BOX (menu4), entries4[i]);
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(menu4), entries4[i]);
     
     g_signal_connect (G_OBJECT (menu4), "changed",
 		      G_CALLBACK (depthchange), panel);
@@ -734,10 +745,10 @@
   
   /* mode */
   {
-    GtkWidget *menu=gtk_combo_box_new_text();
+    GtkWidget *menu=gtk_combo_box_text_new();
     char *entries[]={"current frame","maximum","accumulate","average"};
     for(i=0;i<4;i++)
-      gtk_combo_box_append_text (GTK_COMBO_BOX (menu), entries[i]);
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(menu), entries[i]);
     gtk_combo_box_set_active(GTK_COMBO_BOX(menu),plot_mode);
     gtk_box_pack_start(GTK_BOX(bbox),menu,0,0,0);
     
@@ -747,9 +758,10 @@
   
   /* link */
   {
-    GtkWidget *menu=gtk_combo_box_new_text();
+    GtkWidget *menu=gtk_combo_box_text_new();
     for(i=0;i<LINKS;i++)
-      gtk_combo_box_append_text (GTK_COMBO_BOX (menu), link_entries[i]);
+      gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(menu),
+                                     link_entries[i]);
     gtk_combo_box_set_active(GTK_COMBO_BOX(menu),0);
     gtk_box_pack_start(GTK_BOX(bbox),menu,0,0,0);
     
@@ -766,8 +778,8 @@
   /* run/pause */
   {
     GtkWidget *button=gtk_toggle_button_new_with_mnemonic("_run");
-    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_space, 0, 0);
-    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_r, 0, 0);
+    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_KEY_space, 0, 0);
+    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_KEY_r, 0, 0);
     g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (runchange), panel);
     gtk_box_pack_start(GTK_BOX(bbox),button,0,0,0);
     panel->run=button;
@@ -778,14 +790,14 @@
   {
     GtkWidget *box=gtk_hbox_new(1,1);
     GtkWidget *button=gtk_toggle_button_new_with_mnemonic("_loop");
-    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_l, 0, 0);
+    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_KEY_l, 0, 0);
     g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (loopchange), panel);
     gtk_box_pack_start(GTK_BOX(box),button,1,1,0);
     gtk_widget_set_sensitive(button,global_seekable);
     
 
     button=gtk_button_new_with_mnemonic("re_wind");
-    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_w, 0, 0);
+    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_KEY_w, 0, 0);
     g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (rewindchange), panel);
     gtk_widget_set_sensitive(button,global_seekable);
     gtk_box_pack_start(GTK_BOX(box),button,1,1,0);
@@ -798,13 +810,13 @@
   {
     GtkWidget *box=gtk_hbox_new(1,1);
     GtkWidget *button=gtk_button_new_with_mnemonic("_clear data");
-    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_c, 0, 0);
+    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_KEY_c, 0, 0);
     g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (clearchange), panel);
     gtk_box_pack_start(GTK_BOX(box),button,1,1,0);
     
 
     button=gtk_button_new_with_mnemonic("_dump data");
-    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_d, 0, 0);
+    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_KEY_d, 0, 0);
     g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (dump), panel);
     gtk_box_pack_start(GTK_BOX(box),button,1,1,0);
 
@@ -815,7 +827,7 @@
 #if 0
   {
     GtkWidget *button=gtk_toggle_button_new_with_mnemonic("sample _noise floor");
-    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_n, 0, 0);
+    gtk_widget_add_accelerator (button, "activate", panel->group, GDK_KEY_n, 0, 0);
     g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (noise), panel);
     gtk_box_pack_start(GTK_BOX(bbox),button,0,0,0);
   }
@@ -875,12 +887,14 @@
   return 1;
 }
 
+#define STR(X) #X
+
 void panel_go(int argc,char *argv[]){
   char *homedir=getenv("HOME");
   int found=0;
   memset(&p,0,sizeof(p));
 
-  found|=look_for_gtkrc(ETCDIR"/spectrum-gtkrc");
+  found|=look_for_gtkrc(STR(ETCDIR) "/spectrum-gtkrc");
   {
     char *rcdir=getenv("HOME");
     if(rcdir){
@@ -911,14 +925,14 @@
 	    "\t./spectrum-gtkrc\n"
 	    "\t$(SPECTRUM_RCDIR)/spectrum-gtkrc\n"
 	    "\t~/.spectrum/spectrum-gtkrc\n\t"
-	    ETCDIR"/spectrum-gtkrc\n"
+	    STR(ETCDIR)"/spectrum-gtkrc\n"
 	    "This configuration file is used to tune the color, font and other detail aspects\n"
 	    "of the user interface.  Although the analyzer will work without it, the UI\n"
 	    "appearence will likely make the application harder to use due to missing visual\n"
 	    "cues.\n");
   }
 
-  gtk_rc_add_default_file(ETCDIR"/spectrum-gtkrc");
+  gtk_rc_add_default_file(STR(ETCDIR) "/spectrum-gtkrc");
   if(homedir){
     char *rcfile="/.spectrum-gtkrc";
     char *homerc=calloc(1,strlen(homedir)+strlen(rcfile)+1);
@@ -936,13 +950,12 @@
   /* set up watching the event pipe */
   {
     GIOChannel *channel = g_io_channel_unix_new (eventpipe[0]);
-    guint id;
 
     g_io_channel_set_encoding (channel, NULL, NULL);
     g_io_channel_set_buffered (channel, FALSE);
     g_io_channel_set_close_on_unref (channel, TRUE);
 
-    id = g_io_add_watch (channel, G_IO_IN, async_event_handle, &p);
+    g_io_add_watch (channel, G_IO_IN, async_event_handle, &p);
 
     g_io_channel_unref (channel);
 

Modified: branches/spectrum-gtk3/spec_plot.c
===================================================================
--- branches/spectrum-gtk3/spec_plot.c	2012-05-25 17:30:34 UTC (rev 18324)
+++ branches/spectrum-gtk3/spec_plot.c	2012-05-25 17:35:00 UTC (rev 18325)
@@ -26,6 +26,7 @@
 #include <math.h>
 #include <string.h>
 #include <gdk/gdk.h>
+#include <cairo/cairo.h>
 #include "spec_plot.h"
 
 static double log_lfreqs[5]={10.,100.,1000.,10000.,100000};
@@ -45,37 +46,6 @@
 
 static GtkDrawingAreaClass *parent_class = NULL;
 
-static void compute_imp_scale(GtkWidget *widget){
-  Plot *p=PLOT(widget);
-  int height=widget->allocation.height-p->pady;
-  int i;
-  double lfreqs[9]={10000000.,1000000.,100000.,10000.,1000.,100.,10.,1.,.1};
-  double tfreqs[64]={9000000.,8000000.,7000000.,6000000.,
-		     5000000.,4000000.,3000000.,2000000.,
-		     900000.,800000.,700000.,600000.,
-		     500000.,400000.,300000.,200000.,
-		     90000.,80000.,70000.,60000.,
-		     50000.,40000.,30000.,20000.,
-		     9000.,8000.,7000.,6000.,
-		     5000.,4000.,3000.,2000.,
-		     900.,800.,700.,600.,
-		     500.,400.,300.,200.,
-		     90.,80.,70.,60.,
-		     50.,40.,30.,20,
-		     9.,8.,7.,6.,
-		     5.,4.,3.,2.,
-		     .9,.8,.7,.6,
-		     .5,.4,.3,.2};
-
-  for(i=0;i<9;i++)
-    p->ygrid[i]=rint( (log10(p->disp_ymax)-log10(lfreqs[i]))/(log10(p->disp_ymax)-log10(.1)) * (height-1));
-  for(i=0;i<64;i++)
-    p->ytic[i]=rint( (log10(p->disp_ymax)-log10(tfreqs[i]))/(log10(p->disp_ymax)-log10(.1)) * (height-1));
-  p->ygrids=9;
-  p->ytics=64;
-
-}
-
 int phase_active_p(Plot *p){
   if(p->link == LINK_PHASE){
     int cho=0;
@@ -90,8 +60,8 @@
 static void compute_metadata(GtkWidget *widget){
   Plot *p=PLOT(widget);
   int phase = phase_active_p(p);
-  int width = widget->allocation.width-p->padx-(phase?p->phax:0);
-  int rate=p->maxrate;
+  int width = gtk_widget_get_allocated_width(widget)-
+    p->padx-(phase?p->phax:0);
   int nyq=p->maxrate/2.;
   int i;
 
@@ -176,152 +146,104 @@
   }
 }
 
-GdkColor chcolor(int ch){
+GdkColor chcolor(cairo_t *c, int ch){
   GdkColor rgb={0,0,0,0};
-
   switch(ch%7){
   case 0:
     rgb.red=0x4000;
     rgb.green=0x4000;
     rgb.blue=0x4000;
+    if(c)cairo_set_source_rgb(c,.25,.25,.25);
     break;
   case 1:
     rgb.red=0xd000;
     rgb.green=0x0000;
     rgb.blue=0x0000;
+    if(c)cairo_set_source_rgb(c,.8125,0,0);
     break;
   case 2:
     rgb.red=0x0000;
     rgb.green=0xb000;
     rgb.blue=0x0000;
+    if(c)cairo_set_source_rgb(c,0,.6875,0);
     break;
   case 3:
     rgb.red=0x0000;
     rgb.green=0x0000;
     rgb.blue=0xf000;
+    if(c)cairo_set_source_rgb(c,0,0,.9375);
     break;
   case 4:
     rgb.red=0xc000;
     rgb.green=0xc000;
     rgb.blue=0x0000;
+    if(c)cairo_set_source_rgb(c,.75,.75,.75);
     break;
   case 5:
     rgb.red=0x0000;
     rgb.green=0xc000;
     rgb.blue=0xc000;
+    if(c)cairo_set_source_rgb(c,0,.75,.75);
     break;
   case 6:
     rgb.red=0xc000;
     rgb.green=0x0000;
     rgb.blue=0xe000;
+    if(c)cairo_set_source_rgb(c,.75,0,.875);
     break;
   }
 
   return rgb;
 }
 
-static void draw(GtkWidget *widget){
+static gboolean draw(GtkWidget *widget, cairo_t *c){
   int i;
   Plot *p=PLOT(widget);
-  int height=widget->allocation.height;
-  int width=widget->allocation.width;
-  GtkWidget *parent=gtk_widget_get_parent(widget);
-#if 0
-  int impedence = (p->link == LINK_IMPEDENCE_p1 ||
-		   p->link == LINK_IMPEDENCE_1 ||
-		   p->link == LINK_IMPEDENCE_10);
-#endif
+  GtkStyleContext *context = gtk_widget_get_style_context (widget);
   int phase = phase_active_p(p);
+  int height = gtk_widget_get_allocated_height(widget);
+  int width = gtk_widget_get_allocated_width(widget);
   int padx = p->padx;
   int phax = phase ? p->phax : 0;
   int pwidth = width - padx - phax;
 
-  if(!p->drawgc){
-    p->drawgc=gdk_gc_new(p->backing);
-    gdk_gc_copy(p->drawgc,widget->style->black_gc);
-  }
+  GdkRGBA gray;
+  GdkRGBA rgb_bg;
+  GdkRGBA rgb_fg;
 
-  if(!p->dashes){
-    p->dashes=gdk_gc_new(p->backing);
-    gdk_gc_copy(p->dashes, p->drawgc);
-    gdk_gc_set_line_attributes(p->dashes, 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_MITER);
-    gdk_gc_set_dashes(p->dashes,0,(signed char *)"\002\002",2);
-  }
-  if(!p->graygc){
-    GdkColor rgb_bg;
-    GdkColor rgb_fg;
-    GdkGCValues v;
-    p->graygc=gdk_gc_new(p->backing);
-    gdk_gc_copy(p->graygc, p->drawgc);
-    gdk_gc_get_values(p->graygc,&v);
-    gdk_colormap_query_color(gdk_gc_get_colormap(p->graygc),v.foreground.pixel,&rgb_fg);
-    gdk_colormap_query_color(gdk_gc_get_colormap(p->graygc),v.background.pixel,&rgb_bg);
-    rgb_fg.red = (rgb_fg.red*3 + rgb_bg.red*2)/5;
-    rgb_fg.green = (rgb_fg.green*3 + rgb_bg.green*2)/5;
-    rgb_fg.blue = (rgb_fg.blue*3 + rgb_bg.blue*2)/5;
-    gdk_gc_set_rgb_fg_color(p->graygc,&rgb_fg);
-  }
-  if(!p->phasegc){
-    GdkColor rgb={0,0x8000,0x0000,0x0000};
-    p->phasegc=gdk_gc_new(p->backing);
-    gdk_gc_set_rgb_fg_color(p->phasegc,&rgb);
-    gdk_gc_set_line_attributes(p->phasegc,1,GDK_LINE_SOLID,GDK_CAP_PROJECTING,GDK_JOIN_MITER);
-  }
+  gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &rgb_fg);
+  gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &rgb_bg);
 
-  {
-    const GdkRectangle clip = {p->padx,0,pwidth,height-p->pady};
-    GdkGCValues values;
-    //gdk_gc_get_values(p->drawgc,&values);
-    values.line_width=1;
-    gdk_gc_set_values(p->drawgc,&values,GDK_GC_LINE_WIDTH);
-    gdk_gc_set_clip_rectangle (p->drawgc, &clip);
-  }
+  gray.alpha = 1.;
+  gray.red = (rgb_fg.red*3 + rgb_bg.red*2)/5;
+  gray.green = (rgb_fg.green*3 + rgb_bg.green*2)/5;
+  gray.blue = (rgb_fg.blue*3 + rgb_bg.blue*2)/5;
 
+  cairo_set_line_width(c,1);
+
   /* clear the old rectangle out */
-  {
-    GdkGC *gc=parent->style->bg_gc[0];
-    gdk_draw_rectangle(p->backing,gc,1,0,0,padx,height);
-    gdk_draw_rectangle(p->backing,gc,1,0,height-p->pady,width,p->pady);
-    if(phase)
-      gdk_draw_rectangle(p->backing,gc,1,width-phax,0,phax,height);
+  gdk_cairo_set_source_rgba (c, &rgb_bg);
+  cairo_rectangle (c,0,0,padx,height);
+  cairo_rectangle(c,0,height-p->pady,width,p->pady);
+  if(phase)
+    cairo_rectangle(c,width-phax,0,phax,height);
+  cairo_fill(c);
 
-    gc=parent->style->white_gc;
-    gdk_draw_rectangle(p->backing,gc,1,padx,0,pwidth,height-p->pady);
-  }
+  cairo_set_source_rgb (c, 1,1,1);
+  cairo_rectangle(c,padx,0,pwidth,height-p->pady);
+  cairo_fill(c);
 
-  /* draw the noise floor if active */
-  #if 0
-  if(p->floor){
-    GdkColor rgb = {0,0xd000,0xd000,0xd000};
-    gdk_gc_set_rgb_fg_color(p->drawgc,&rgb);
+  cairo_set_line_cap(c,CAIRO_LINE_CAP_SQUARE);
 
-    for(i=0;i<pwidth;i++){
-      float val=p->floor[i];
-      int y;
-
-      /* No noise floor is passed back for display in the modes where it's irrelevant */
-      y= rint((height-p->pady-1)/p->disp_depth*(p->disp_ymax-val));
-      if(y<height-p->pady)
-	gdk_draw_line(p->backing,p->drawgc,padx+i,y,padx+i,height-p->pady-1);
-    }
-  }
-  #endif
-
   /* draw the light x grid */
-  {
-    int i;
-    GdkColor rgb={0,0,0,0};
-
-    rgb.red=0xc000;
-    rgb.green=0xff00;
-    rgb.blue=0xff00;
-    gdk_gc_set_rgb_fg_color(p->drawgc,&rgb);
-
-    for(i=0;i<p->xtics;i++)
-      gdk_draw_line(p->backing,p->drawgc,p->xtic[i],0,p->xtic[i],height-p->pady);
+  cairo_set_source_rgb(c, .75, 1, 1);
+  for(i=0;i<p->xtics;i++){
+    cairo_move_to(c,p->xtic[i]+.5,.5);
+    cairo_line_to(c,p->xtic[i]+.5,height-p->pady+.5);
   }
+  cairo_stroke(c);
 
-    /* draw the x labels */
+  /* draw the x labels */
   {
     PangoLayout **proper;
     switch(p->scale){
@@ -335,56 +257,20 @@
       proper=p->lin_layout;
       break;
     }
+    gdk_cairo_set_source_rgba (c, &rgb_fg);
     for(i=0;i<p->xlgrids;i++){
       int px,py;
       pango_layout_get_pixel_size(proper[i],&px,&py);
 
-      if(p->xlgrid[i]+(px/2)<width)
-        gdk_draw_layout (p->backing,
-                         widget->style->black_gc,
-                         p->xlgrid[i]-(px/2), height-py+2,
-                         proper[i]);
+      if(p->xlgrid[i]+(px/2)<width){
+        cairo_move_to(c,p->xlgrid[i]-(px/2)+.5, height-py+2.5);
+        pango_cairo_show_layout(c,proper[i]);
+      }
     }
   }
 
-  /* draw the y grid */
-  //if(impedence){ /* impedence mode */
-  if(0){
-
-    /* light grid */
-
-    GdkColor rgb={0,0,0,0};
-    rgb.red=0xc000;
-    rgb.green=0xff00;
-    rgb.blue=0xff00;
-    gdk_gc_set_rgb_fg_color(p->drawgc,&rgb);
-
-    compute_imp_scale(widget);
-
-    for(i=0;i<p->ytics;i++)
-      gdk_draw_line(p->backing,p->drawgc,padx,p->ytic[i],pwidth,p->ytic[i]);
-
-    /* dark grid */
-    rgb.red=0x0000;
-    rgb.green=0xc000;
-    rgb.blue=0xc000;
-
-    gdk_gc_set_rgb_fg_color(p->drawgc,&rgb);
-
-    for(i=0;i<p->ygrids;i++){
-      int px,py;
-      pango_layout_get_pixel_size(p->imp_layout[i],&px,&py);
-
-      gdk_draw_layout (p->backing,
-		       widget->style->black_gc,
-		       padx-px-2, p->ygrid[i]-py/2,
-		       p->imp_layout[i]);
-
-      gdk_draw_line(p->backing,p->drawgc,padx,p->ygrid[i],pwidth,p->ygrid[i]);
-    }
-
-  }else{
-    GdkColor rgb={0,0,0,0};
+  {
+    /* draw the y grid */
     float emheight = (height-p->pady)/p->pady;
     float emperdB = emheight/p->disp_depth;
     float pxperdB = (height-p->pady)/p->disp_depth;
@@ -449,42 +335,41 @@
     }
 
     /* Light Y grid */
-    rgb.red=0xc000;
-    rgb.green=0xff00;
-    rgb.blue=0xff00;
-    gdk_gc_set_rgb_fg_color(p->drawgc,&rgb);
-    gdk_gc_set_rgb_fg_color(p->dashes,&rgb);
-
     float ymin = (p->disp_ymax - p->disp_depth)*1000;
     int yval = rint((p->disp_ymax*1000/subminordel)+1)*subminordel;
+    cairo_set_source_rgb(c,.75,1,1);
 
     while(1){
       float ydel = (yval - ymin)/(p->disp_depth*1000);
       int ymid = rint(height-p->pady-1 - (height-p->pady) * ydel);
+      double d[2]={2,3};
 
       if(ymid>=height-p->pady)break;
 
       if(ymid>=0){
         if(yval % majordel == 0){
         }else if(yval % minordel == 0){
-          gdk_draw_line(p->backing,p->drawgc,padx,ymid,width-phax,ymid);
+          cairo_move_to(c,padx+.5,ymid+.5);
+          cairo_line_to(c,width-phax+.5,ymid+.5);
         }else{
-          gdk_draw_line(p->backing,p->dashes,padx,ymid,width-phax,ymid);
+          cairo_stroke(c);
+
+          cairo_set_dash(c,d,2,0);
+          cairo_move_to(c,padx+.5,ymid+.5);
+          cairo_line_to(c,width-phax+.5,ymid+.5);
+          cairo_stroke(c);
+          cairo_set_dash(c,d,0,0);
         }
       }
       yval-=subminordel;
     }
+    cairo_stroke(c);
 
     /* Dark Y grid */
-    rgb.red=0x0000;
-    rgb.green=0xc000;
-    rgb.blue=0xc000;
-    gdk_gc_set_rgb_fg_color(p->drawgc,&rgb);
-
-    ymin = (p->disp_ymax - p->disp_depth)*1000;
-    yval = rint((p->disp_ymax*1000/majordel)+1)*majordel;
-
     {
+      ymin = (p->disp_ymax - p->disp_depth)*1000;
+      yval = rint((p->disp_ymax*1000/majordel)+1)*majordel;
+
       int px,py,pxdB,pxN,pxMAX;
       pango_layout_get_pixel_size(p->db_layoutN,&pxN,&py);
       pango_layout_get_pixel_size(p->db_layoutdB,&pxdB,&py);
@@ -498,7 +383,6 @@
         if(ymid>=height-p->pady)break;
 
         if(ymid>=0){
-          int do_dB=0;
           int label = yval/100+2000;
 
           if(label>=0 && label<=4000 /* in range check */
@@ -512,53 +396,49 @@
                   -99.9
                  -999.9 */
 
+              cairo_save(c);
+              gdk_cairo_set_source_rgba(c,&gray);
+
               if(fabsf(yval*.001)<9.98){
-                gdk_draw_layout (p->backing,
-                                 p->graygc,
-                                 padx-pxdB-2, ymid-py/2,
-                                 p->db_layoutdB);
+                cairo_move_to(c,padx-pxdB-1.5, ymid-py/2+.5);
+                pango_cairo_show_layout(c,p->db_layoutdB);
                 sofar+=pxdB;
               }
 
               pango_layout_get_pixel_size(p->db_layout1[abs(yval/100)%10],&px,&py);
               sofar+=px;
-              gdk_draw_layout (p->backing,
-                               p->graygc,
-                               padx-sofar-2, ymid-py/2,
-                               p->db_layout1[abs(yval/100)%10]);
+              cairo_move_to(c,padx-sofar-1.5, ymid-py/2+.5);
+              pango_cairo_show_layout(c,p->db_layout1[abs(yval/100)%10]);
 
               if(yval/1000!=0){ /* no leading zero please */
                 pango_layout_get_pixel_size(p->db_layout[yval/1000+200],&px,&py);
                 sofar+=px;
-                gdk_draw_layout (p->backing,
-                                 p->graygc,
-                                 padx-sofar-2, ymid-py/2,
-                                 p->db_layout[yval/1000+200]);
+                cairo_move_to(c,padx-sofar-1.5, ymid-py/2+.5);
+                pango_cairo_show_layout(c,p->db_layout[yval/1000+200]);
               }else{
                 if(yval<0){
                   /* need to explicitly place negative */
                   sofar+=pxN;
-                  gdk_draw_layout (p->backing,
-                                   p->graygc,
-                                   padx-sofar-2, ymid-py/2,
-                                   p->db_layoutN);
+                  cairo_move_to(c,padx-sofar-1.5, ymid-py/2+.5);
+                  pango_cairo_show_layout(c,p->db_layoutN);
                 }
               }
+              cairo_restore(c);
             }else{
-              gdk_draw_layout (p->backing,
-                               widget->style->black_gc,
-                               padx-pxdB-2, ymid-py/2,
-                               p->db_layoutdB);
+              gdk_cairo_set_source_rgba(c,&rgb_fg);
+              cairo_move_to(c,padx-pxdB-1.5, ymid-py/2+.5);
+              pango_cairo_show_layout(c,p->db_layoutdB);
 
               pango_layout_get_pixel_size(p->db_layout[yval/1000+200],&px,&py);
-
-              gdk_draw_layout (p->backing,
-                               widget->style->black_gc,
-                               padx-px-pxdB-2, ymid-py/2,
-                               p->db_layout[yval/1000+200]);
+              cairo_move_to(c,padx-px-pxdB-1.5, ymid-py/2+.5);
+              pango_cairo_show_layout(c,p->db_layout[yval/1000+200]);
             }
           }
-          gdk_draw_line(p->backing,p->drawgc,padx,ymid,width-phax,ymid);
+
+          cairo_set_source_rgb(c,0,.75,.75);
+          cairo_move_to(c,padx+.5,ymid+.5);
+          cairo_line_to(c,width-phax+.5,ymid+.5);
+          cairo_stroke(c);
         }
         yval-=majordel;
       }
@@ -568,34 +448,30 @@
   /* dark x grid */
   {
     int i;
-    GdkColor rgb={0,0,0,0};
-
-    rgb.red=0x0000;
-    rgb.green=0xc000;
-    rgb.blue=0xc000;
-    gdk_gc_set_rgb_fg_color(p->drawgc,&rgb);
-
-    for(i=0;i<p->xgrids;i++)
-      gdk_draw_line(p->backing,p->drawgc,p->xgrid[i],0,p->xgrid[i],height-p->pady);
+    cairo_set_source_rgb(c,0,.75,.75);
+    for(i=0;i<p->xgrids;i++){
+      cairo_move_to(c,p->xgrid[i]+.5,.5);
+      cairo_line_to(c,p->xgrid[i]+.5,height-p->pady+.5);
+    }
+    cairo_stroke(c);
   }
 
+  cairo_save(c);
+  cairo_set_line_width(c,p->bold+1);
+  cairo_rectangle(c,padx,0,pwidth,height-p->pady);
+  cairo_clip(c);
 
-  gdk_gc_set_line_attributes(p->drawgc,p->bold+1,GDK_LINE_SOLID,GDK_CAP_PROJECTING,
-                             GDK_JOIN_MITER);
-
   /* draw actual data */
   if(p->ydata){
     int cho=0;
     int gi;
     for(gi=0;gi<p->groups;gi++){
       int ch;
-      GdkColor rgb;
 
       for(ch=cho;ch<cho+p->ch[gi];ch++){
 	if(p->ch_active[ch]){
 
-	  rgb = chcolor(ch);
-	  gdk_gc_set_rgb_fg_color(p->drawgc,&rgb);
+	  chcolor(c,ch);
 
 	  for(i=0;i<pwidth;i++){
 	    float valmin=p->ydata[ch][i*2];
@@ -604,18 +480,8 @@
 
             if(!isnan(valmin) && !isnan(valmax)){
 
-              //if(impedence){ /* log scale for impedence */
-              if(0){
+              if(phase && ch==cho+1){
 
-                ymin = rint( (log10(p->disp_ymax)-log10(valmin))/
-                             (log10(p->disp_ymax)-log10(.1)) *
-                             (height-p->pady-1));
-                ymax = rint( (log10(p->disp_ymax)-log10(valmax))/
-                             (log10(p->disp_ymax)-log10(.1)) *
-                             (height-p->pady-1));
-
-              }else if(phase && ch==cho+1){
-
                 ymin = rint((height-p->pady-1)/
                             (p->disp_pmax-p->disp_pmin)*
                             (p->disp_pmax-valmin));
@@ -630,15 +496,19 @@
 
               }
 
-              gdk_draw_line(p->backing,p->drawgc,padx+i,ymin,padx+i,ymax);
+              cairo_move_to(c,padx+i+.5,ymin+.5);
+              cairo_line_to(c,padx+i+.5,ymax+.5);
             }
 	  }
+          cairo_stroke(c);
 	}
       }
       cho+=p->ch[gi];
     }
   }
 
+  cairo_restore(c);
+
   /* phase?  draw in phase and tics on right axis */
   if(phase){
     float depth = p->disp_pmax-p->disp_pmin;
@@ -648,6 +518,8 @@
     step=2;
     if(del>8)step=1;
 
+    cairo_set_source_rgb(0,.5,0,0);
+
     for(i=0;i<38;i++){
       if(((label-i)&1)==0 || step==1){
 	int ymid=rint(del * (i*10+off));
@@ -655,9 +527,8 @@
 
 	if(label-i>=0 && label-i<37 && ymid>=p->pady/2 && ymid<height-p->pady/2){
           pango_layout_get_pixel_size(p->phase_layout[label-i],&px,&py);
-	  gdk_draw_layout (p->backing,p->phasegc,
-			   width-p->phax+2, ymid-py/2,
-			   p->phase_layout[label-i]);
+          cairo_move_to(c,width-p->phax+2.5, ymid-py/2+.5);
+          pango_cairo_show_layout(c,p->phase_layout[label-i]);
 	}
       }
     }
@@ -667,24 +538,31 @@
 	int ymid=rint(del * (i+off));
         int pv = rint(p->pmax - ymid/(float)(height-p->pady) * (p->pmax - p->pmin));
 	if(ymid>=height-p->pady)break;
-	if(ymid>=0 && pv>=-180 && pv<=180)
-	  gdk_draw_line(p->backing,p->phasegc,width-p->phax-(i%5==0?15:10),ymid,width-p->phax-(i%5==0?5:7),ymid);
+	if(ymid>=0 && pv>=-180 && pv<=180){
+          cairo_move_to(c,width-p->phax-(i%5==0?15:10)+.5,
+                        ymid+.5);
+          cairo_line_to(c,width-p->phax-(i%5==0?5:7)+.5,ymid+.5);
+        }
       }
     }else if(del>5){
       for(i=0;;i++){
 	int ymid=rint(del * (i*2+off));
         int pv = rint(p->pmax - ymid/(float)(height-p->pady) * (p->pmax - p->pmin));
 	if(ymid>=height-p->pady)break;
-	if(ymid>=0 && pv>=-180 && pv<=180)
-	  gdk_draw_line(p->backing,p->phasegc,width-p->phax-12,ymid,width-p->phax-7,ymid);
+	if(ymid>=0 && pv>=-180 && pv<=180){
+          cairo_move_to(c,width-p->phax-12+.5,ymid+.5);
+          cairo_line_to(c,width-p->phax-7,ymid);
+        }
       }
     } else if(del>2){
       for(i=0;;i++){
 	int ymid=rint(del * (i*5+off));
         int pv = rint(p->pmax - ymid/(float)(height-p->pady) * (p->pmax - p->pmin));
 	if(ymid>=height-p->pady)break;
-	if(ymid>=0 && pv>=-180 && pv<=180)
-	  gdk_draw_line(p->backing,p->phasegc,width-p->phax-15,ymid,width-p->phax-5,ymid);
+	if(ymid>=0 && pv>=-180 && pv<=180){
+          cairo_move_to(c,width-p->phax-15+.5,ymid+.5);
+          cairo_line_to(c,width-p->phax-5+.5,ymid+.5);
+        }
       }
     }
 
@@ -694,9 +572,12 @@
         int pv = rint(p->pmax - ymid/(float)(height-p->pady) * (p->pmax - p->pmin));
         if(ymid>=height-p->pady)break;
 	if(ymid>=0 && pv>=-180 && pv<=180){
-          gdk_draw_line(p->backing,p->phasegc,width-p->phax-5,ymid-1,width-p->phax-1,ymid-1);
-          gdk_draw_line(p->backing,p->phasegc,width-p->phax-25,ymid,width-p->phax-1,ymid);
-          gdk_draw_line(p->backing,p->phasegc,width-p->phax-5,ymid+1,width-p->phax-1,ymid+1);
+          cairo_move_to(c,width-p->phax-5+.5,ymid-1+.5);
+          cairo_line_to(c,width-p->phax-1+.5,ymid-1+.5);
+          cairo_move_to(c,width-p->phax-25+.5,ymid+.5);
+          cairo_line_to(c,width-p->phax-1+.5,ymid+.5);
+          cairo_move_to(c,width-p->phax-5+.5,ymid+1+.5);
+          cairo_line_to(c,width-p->phax-1+.5,ymid+1+.5);
         }
       }
     }else{
@@ -705,8 +586,10 @@
 	int ymid=rint(del * (i*10+off));
         int pv = rint(p->pmax - ymid/(float)(height-p->pady) * (p->pmax - p->pmin));
 	if(ymid>=height-p->pady)break;
-	if(ymid>=0 && pv>=-180 && pv<=180)
-	  gdk_draw_line(p->backing,p->phasegc,width-p->phax-15,ymid,width-p->phax-5,ymid);
+	if(ymid>=0 && pv>=-180 && pv<=180){
+          cairo_move_to(c,width-p->phax-15+.5,ymid+.5);
+          cairo_line_to(c,width-p->phax-5+.5,ymid+.5);
+        }
       }
 
       for(i=0;;i++){
@@ -714,39 +597,18 @@
         int pv = rint((p->pmax - ymid/(float)(height-p->pady) * (p->pmax - p->pmin))/10);
         if(ymid>=height-p->pady)break;
 	if(ymid>=0 && pv>=-18 && pv<=18 && (pv&1)==0){
-          gdk_draw_line(p->backing,p->phasegc,width-p->phax-5,ymid-1,width-p->phax-1,ymid-1);
-          gdk_draw_line(p->backing,p->phasegc,width-p->phax-25,ymid,width-p->phax-1,ymid);
-          gdk_draw_line(p->backing,p->phasegc,width-p->phax-5,ymid+1,width-p->phax-1,ymid+1);
+          cairo_move_to(c,width-p->phax-5+.5,ymid-1+.5);
+          cairo_line_to(c,width-p->phax-1+.5,ymid-1+.5);
+          cairo_move_to(c,width-p->phax-25+.5,ymid+.5);
+          cairo_line_to(c,width-p->phax-1+.5,ymid+.5);
+          cairo_move_to(c,width-p->phax-5+.5,ymid+1+.5);
+          cairo_line_to(c,width-p->phax-1+.5,ymid+1+.5);
         }
       }
     }
+    cairo_stroke(c);
   }
-}
 
-static void draw_and_expose(GtkWidget *widget){
-  Plot *p=PLOT(widget);
-  if(!GDK_IS_DRAWABLE(p->backing))return;
-  draw(widget);
-  if(!GTK_WIDGET_DRAWABLE(widget))return;
-  if(!GDK_IS_DRAWABLE(widget->window))return;
-  gdk_draw_drawable(widget->window,
-		    widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
-		    p->backing,
-		    0, 0,
-		    0, 0,
-		    widget->allocation.width,
-		    widget->allocation.height);
-}
-
-static gboolean expose( GtkWidget *widget, GdkEventExpose *event ){
-  Plot *p=PLOT(widget);
-  gdk_draw_drawable(widget->window,
-		    widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
-		    p->backing,
-		    event->area.x, event->area.y,
-		    event->area.x, event->area.y,
-		    event->area.width, event->area.height);
-
   return FALSE;
 }
 
@@ -846,19 +708,69 @@
   p->phax=phax+2;
 }
 
-static gboolean configure(GtkWidget *widget, GdkEventConfigure *event){
+static void get_preferred_width (GtkWidget *widget,
+                                 gint *minw, gint *w){
+  GtkRequisition r;
+  size_request(widget,&r);
+  *minw=*w=r.width;
+}
+
+static void get_preferred_height (GtkWidget *widget,
+                                  gint *minh, gint *h){
+  GtkRequisition r;
+  size_request(widget,&r);
+  *minh=*h=r.height;
+}
+
+#if 0
+static void call_expose(GtkWidget *widget){
+  GdkRectangle rect={0,0,0,0};
+  rect.width=gtk_widget_get_allocated_width(widget);
+  rect.height=gtk_widget_get_allocated_height(widget);
+  gdk_window_invalidate_rect (gtk_widget_get_window(widget),&rect,FALSE);
+}
+#endif
+
+static void draw_and_expose(GtkWidget *widget){
   Plot *p=PLOT(widget);
+  if(p->backing){
+    GtkAllocation a;
+    cairo_t *c = cairo_create(p->backing);
+    draw(widget,c);
+    cairo_destroy(c);
 
-  if (p->backing)
-    g_object_unref(p->backing);
+    gtk_widget_get_allocation(widget,&a);
+    c = gdk_cairo_create (gtk_widget_get_window(widget));
+    cairo_set_source_surface (c, p->backing, a.x, a.y);
+    cairo_paint (c);
+    cairo_destroy (c);
+  }
+}
 
-  p->backing = gdk_pixmap_new(widget->window,
-			      widget->allocation.width,
-			      widget->allocation.height,
-			      -1);
+static gboolean expose(GtkWidget *widget, cairo_t *c){
+  Plot *p=PLOT(widget);
+  int w=gtk_widget_get_allocated_width(widget);
+  int h=gtk_widget_get_allocated_height(widget);
+
+  cairo_set_source_surface (c, p->backing, 0, 0);
+  cairo_rectangle(c,0,0,w,h);
+  cairo_fill(c);
+  return FALSE;
+}
+
+static gboolean configure(GtkWidget *widget, GdkEventConfigure *event){
+  Plot *p=PLOT(widget);
   p->ydata=NULL;
   p->configured=1;
 
+  if (p->backing)
+    cairo_surface_destroy(p->backing);
+
+  p->backing = cairo_image_surface_create
+    (CAIRO_FORMAT_RGB24,
+     gtk_widget_get_allocated_width(widget),
+     gtk_widget_get_allocated_height(widget));
+
   compute_metadata(widget);
   plot_refresh(p,NULL);
   draw_and_expose(widget);
@@ -867,20 +779,21 @@
 }
 
 static void plot_class_init (PlotClass *class){
-  int i,w,h;
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
-  GdkWindow *root=gdk_get_default_root_window();
   parent_class = g_type_class_peek_parent (class);
 
-  widget_class->expose_event = expose;
+  widget_class->draw = expose;
   widget_class->configure_event = configure;
-  widget_class->size_request = size_request;
+  widget_class->get_preferred_width = get_preferred_width;
+  widget_class->get_preferred_height = get_preferred_height;
 }
 
 static void plot_init (Plot *p){
   p->mode=0;
   p->scale=0;
   p->depth=45.;
+  gtk_widget_set_has_window(GTK_WIDGET(p),FALSE);
+  gtk_widget_set_double_buffered (GTK_WIDGET(p), FALSE);
 }
 
 GType plot_get_type (void){
@@ -1040,8 +953,9 @@
 void plot_refresh (Plot *p, int *process){
   float ymax,pmax,pmin;
   int phase = phase_active_p(p);
-  int width=GTK_WIDGET(p)->allocation.width-p->padx-(phase ? p->phax : 0);
-  int height=GTK_WIDGET(p)->allocation.height-p->pady;
+  int width=gtk_widget_get_allocated_width(GTK_WIDGET(p))-
+    p->padx-(phase ? p->phax : 0);
+  int height=gtk_widget_get_allocated_height(GTK_WIDGET(p))-p->pady;
   float **data;
 
 #define THRESH .25
@@ -1196,7 +1110,8 @@
 void plot_clear (Plot *p){
   GtkWidget *widget=GTK_WIDGET(p);
   int phase = phase_active_p(p);
-  int width=GTK_WIDGET(p)->allocation.width-p->padx-(phase ? p->phax : 0);
+  int width=gtk_widget_get_allocated_width(GTK_WIDGET(p))-
+    p->padx-(phase ? p->phax : 0);
   int i,j;
 
   if(p->ydata)

Modified: branches/spectrum-gtk3/spec_plot.h
===================================================================
--- branches/spectrum-gtk3/spec_plot.h	2012-05-25 17:30:34 UTC (rev 18324)
+++ branches/spectrum-gtk3/spec_plot.h	2012-05-25 17:35:00 UTC (rev 18325)
@@ -40,14 +40,9 @@
 typedef struct _PlotClass  PlotClass;
 
 struct _Plot{
+  GtkDrawingArea   canvas;
+  cairo_surface_t *backing;
 
-  GtkDrawingArea canvas;  
-  GdkPixmap *backing;
-  GdkGC     *drawgc;
-  GdkGC     *dashes;
-  GdkGC     *graygc;
-  GdkGC     *phasegc;
-
   PangoLayout **lin_layout;
   PangoLayout **log_layout;
   PangoLayout **iso_layout;
@@ -135,7 +130,7 @@
 int            plot_get_left_pad    (Plot *m);
 int            plot_get_right_pad   (Plot *m);
 
-GdkColor chcolor(int ch);
+GdkColor chcolor(cairo_t *c, int ch);
 
 G_END_DECLS
 

Modified: branches/spectrum-gtk3/spec_process.c
===================================================================
--- branches/spectrum-gtk3/spec_process.c	2012-05-25 17:30:34 UTC (rev 18324)
+++ branches/spectrum-gtk3/spec_process.c	2012-05-25 17:35:00 UTC (rev 18325)
@@ -1,7 +1,7 @@
 /*
  *
- *  gtk2 spectrum analyzer
- *    
+ *  gtk3 spectrum analyzer
+ *
  *      Copyright (C) 2004-2012 Monty
  *
  *  This analyzer is free software; you can redistribute it and/or modify
@@ -119,8 +119,6 @@
 /* return 0 on EOF, 1 otherwise */
 static int process(){
   int fi,i,j,ch;
-  int eof_all;
-  int noise=plot_noise;  
 
   if(acc_rewind)
     rewind_files();

Modified: branches/spectrum-gtk3/version.h
===================================================================
--- branches/spectrum-gtk3/version.h	2012-05-25 17:30:34 UTC (rev 18324)
+++ branches/spectrum-gtk3/version.h	2012-05-25 17:35:00 UTC (rev 18325)
@@ -1,2 +1,2 @@
 #define VERSION "$Id$ "
-/* DO NOT EDIT: Automated versioning hack [Fri May 18 04:39:31 EDT 2012] */
+/* DO NOT EDIT: Automated versioning hack [Sat May 19 04:46:31 EDT 2012] */



More information about the commits mailing list