q-lang-cvs Mailing List for Q - Equational Programming Language (Page 17)
Brought to you by:
agraef
You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(106) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(219) |
Feb
(152) |
Mar
|
Apr
(92) |
May
(45) |
Jun
(3) |
Jul
|
Aug
(3) |
Sep
(111) |
Oct
(52) |
Nov
|
Dec
|
2005 |
Jan
|
Feb
(1) |
Mar
(1) |
Apr
(2) |
May
(23) |
Jun
(46) |
Jul
(158) |
Aug
(22) |
Sep
|
Oct
(26) |
Nov
(11) |
Dec
(49) |
2006 |
Jan
(57) |
Feb
(196) |
Mar
(10) |
Apr
(41) |
May
(149) |
Jun
(308) |
Jul
(11) |
Aug
(25) |
Sep
(15) |
Oct
|
Nov
|
Dec
(15) |
2007 |
Jan
|
Feb
|
Mar
|
Apr
(15) |
May
(204) |
Jun
(112) |
Jul
(7) |
Aug
(16) |
Sep
(134) |
Oct
(313) |
Nov
(262) |
Dec
(83) |
2008 |
Jan
(81) |
Feb
(83) |
Mar
(21) |
Apr
|
May
|
Jun
(1) |
Jul
(2) |
Aug
(6) |
Sep
|
Oct
|
Nov
|
Dec
(2) |
2015 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Albert G. <ag...@us...> - 2007-11-13 11:52:32
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv13722 Modified Files: qcalc.q Log Message: bugfixes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.142 retrieving revision 1.143 diff -C2 -d -r1.142 -r1.143 *** qcalc.q 13 Nov 2007 10:52:54 -0000 1.142 --- qcalc.q 13 Nov 2007 11:52:27 -0000 1.143 *************** *** 1428,1432 **** = EDITED := true || update_title || ! move_spans (-1,0) (get_spans SEL) || process_sel SEL || adjust_rows N || --- 1428,1433 ---- = EDITED := true || update_title || ! do clear_span SP0 || ! move_spans (-1,0) SP || process_sel SEL || adjust_rows N || *************** *** 1437,1441 **** R = map (flip append "".flip (flip sub 0) 1) R, SEL = map (translate (-1,0)) (cat $ tl SEL)++R, ! CELLS = map (flip (flip sub 0) 1) SEL where (I,J,SEL) = check_editing || selection_rows, (_,_;_,_;N,_) = SEL, --- 1438,1444 ---- R = map (flip append "".flip (flip sub 0) 1) R, SEL = map (translate (-1,0)) (cat $ tl SEL)++R, ! CELLS = map (flip (flip sub 0) 1) SEL, ! SP = get_spans SEL, ! SP0 = filter ((<=I).fst) SP, SP = filter ((>I).fst) SP where (I,J,SEL) = check_editing || selection_rows, (_,_;_,_;N,_) = SEL, *************** *** 1463,1467 **** = EDITED := true || update_title || ! move_spans (0,-1) (get_spans SEL) || process_sel SEL || adjust_cols N || --- 1466,1471 ---- = EDITED := true || update_title || ! do clear_span SP0 || ! move_spans (0,-1) SP || process_sel SEL || adjust_cols N || *************** *** 1472,1476 **** R = map (flip append "".flip (flip sub 0) 1) R, SEL = map (translate (0,-1)) (cat $ tl SEL)++R, ! CELLS = map (flip (flip sub 0) 1) SEL where (I,J,SEL) = check_editing || selection_cols, (_,_;_,_;_,N) = SEL, --- 1476,1482 ---- R = map (flip append "".flip (flip sub 0) 1) R, SEL = map (translate (0,-1)) (cat $ tl SEL)++R, ! CELLS = map (flip (flip sub 0) 1) SEL, ! SP = get_spans SEL, ! SP0 = filter ((<=J).snd) SP, SP = filter ((>J).snd) SP where (I,J,SEL) = check_editing || selection_cols, (_,_;_,_;_,N) = SEL, |
From: Albert G. <ag...@us...> - 2007-11-13 11:32:51
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv9337 Modified Files: README Log Message: update README Index: README =================================================================== RCS file: /cvsroot/q-lang/qcalc/README,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** README 12 Nov 2007 20:31:07 -0000 1.17 --- README 13 Nov 2007 11:32:47 -0000 1.18 *************** *** 71,74 **** --- 71,84 ---- ---- + Known bugs and limitations: + + - Copying formulas (as opposed to the plain cell contents in tab-separated + format) via the clipboard uses the special MIME type text/x-qcalc-data. This + doesn't seem to work when transferring values across different applications; + apparently Qt then only allows you to transfer text/plain and image data. + Inside a single QCalc instance, transferring formulas works just fine, so + for the time being the workaround is to copy the data you want, load the + target file in the same QCalc instance and then paste it as usual. + Some stuff that would be nice to have in future releases: |
From: Albert G. <ag...@us...> - 2007-11-13 10:52:58
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv27368 Modified Files: qcalc.q Log Message: make cell spans move when inserting and deleting rows and columns; handle this with undo/redo, too Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.141 retrieving revision 1.142 diff -C2 -d -r1.141 -r1.142 *** qcalc.q 13 Nov 2007 10:03:06 -0000 1.141 --- qcalc.q 13 Nov 2007 10:52:54 -0000 1.142 *************** *** 1377,1381 **** dissociate_cells _ _ _ if is_global: ! = do dissociate_cell $ get_spans SEL where SEL = check_editing || sel_cellvals selection if qt TABW "currentPageIndex" () = 0; --- 1377,1381 ---- dissociate_cells _ _ _ if is_global: ! = do dissociate_cell $ get_spans $ cat SEL where SEL = check_editing || sel_cellvals selection if qt TABW "currentPageIndex" () = 0; *************** *** 1386,1398 **** where IT = get_table_item (I,J); ! get_spans SEL = sort indexcmp SP ! where (I,J,V) = unzip3 $ cat SEL, K = zip I J, K = map real_index K, ! SP = filter is_spanned $ keys $ hdict $ zip K V; insert_row _ _ _ if is_global: = adjust_rows (N+2) || EDITED := true || ! update_title || process_sel SEL || ! save_undo CELLS || updatemsg (I,J) || digest_loop --- 1386,1417 ---- where IT = get_table_item (I,J); ! get_spans SEL = sort indexcmp SEL ! where (I,J,V) = unzip3 SEL, K = zip I J, K = map real_index K, ! SEL = filter is_spanned $ keys $ hdict $ zip K V; ! ! move_spans (DI,DJ) SEL ! = do clear_span SEL || ! dowith set_span (map (translate (DI,DJ)) SEL) SP ! where SP = map cell_span SEL; ! ! clear_span (I,J) ! = qt IT "setSpan" (1,1) ! if not is_nil IT ! where IT = qt TABLE "item" (I,J); ! ! set_span (I,J) (N,M) ! = spanned_table_item (I,J) (N,M) ! if (N>1) or else (M>1) ! where (I1,J1) = (max 0 I,max 0 J), ! (N,M) = (N-I1+I,M-J1+J), (I,J) = (I1,J1), ! (N,M) = (max 1 N,max 1 M); insert_row _ _ _ if is_global: = adjust_rows (N+2) || EDITED := true || ! update_title || ! move_spans (1,0) (get_spans SEL) || ! process_sel SEL || ! save_undo (1,0,CELLS) || updatemsg (I,J) || digest_loop *************** *** 1408,1413 **** delete_row _ _ _ if is_global: = EDITED := true || ! update_title || process_sel SEL || ! adjust_rows N || save_undo CELLS || updatemsg (I,J) || digest_loop --- 1427,1435 ---- delete_row _ _ _ if is_global: = EDITED := true || ! update_title || ! move_spans (-1,0) (get_spans SEL) || ! process_sel SEL || ! adjust_rows N || ! save_undo (-1,0,CELLS) || updatemsg (I,J) || digest_loop *************** *** 1423,1428 **** insert_col _ _ _ if is_global: = adjust_cols (N+2) || EDITED := true || ! update_title || process_sel SEL || ! save_undo CELLS || updatemsg (I,J) || digest_loop --- 1445,1452 ---- insert_col _ _ _ if is_global: = adjust_cols (N+2) || EDITED := true || ! update_title || ! move_spans (0,1) (get_spans SEL) || ! process_sel SEL || ! save_undo (0,1,CELLS) || updatemsg (I,J) || digest_loop *************** *** 1438,1443 **** delete_col _ _ _ if is_global: = EDITED := true || ! update_title || process_sel SEL || ! adjust_cols N || save_undo CELLS || updatemsg (I,J) || digest_loop --- 1462,1470 ---- delete_col _ _ _ if is_global: = EDITED := true || ! update_title || ! move_spans (0,-1) (get_spans SEL) || ! process_sel SEL || ! adjust_cols N || ! save_undo (0,-1,CELLS) || updatemsg (I,J) || digest_loop *************** *** 1615,1618 **** --- 1642,1648 ---- /* Helper functions for processing selections. */ + translate (DI,DJ) (I,J) + = (I+DI,J+DJ); + translate (DI,DJ) (I,J,S) = (I+DI,J+DJ,sprintf "= %s" (translate (DI,DJ) S)) *************** *** 2612,2615 **** --- 2642,2656 ---- /* Undo/redo. **************************************************************/ + /* We currently process three different kinds of actions: + + - a list L of changed values (I,J,S); these are used by most editing + operations + + - a list L as above, with associated moving spans, denoted (DI,DJ,L); + these are used by the row/column insertion/deletion operations + + - a pair (I,J;N,M), denoting a change of cell (I,J) to the given row/column + span; these are used by the cell merge and dissociate operations */ + def LAST_SAVE = ref 0, SPANS = ref emptyhdict; *************** *** 2638,2641 **** --- 2679,2689 ---- where L = undo_cellvals L; + save_undo (DI,DJ,L:List) + = //printf "*** save undo: %s\n" (str (DI,DJ,L)) || + if #get UNDO_LIST < get LAST_SAVE then LAST_SAVE := 0 || + UNDO_LIST := [(DI,DJ,L)|get UNDO_LIST] || REDO_LIST := [] + if not null L + where L = undo_cellvals L; + merge_undo (I,J) = merge_undo [(I,J)]; *************** *** 2648,2651 **** --- 2696,2706 ---- where L = filter (neg is_gui_elem.fst) $ undo_cellvals L; + merge_undo L:List + = //printf "*** merge undo: %s ++ %s\n" (str (DI,DJ,L0),str L) || + UNDO_LIST := [(I,J,L0++L)|UL] + where [(I,J,L0:List)|UL] = get UNDO_LIST + if not null L + where L = filter (neg is_gui_elem.fst) $ undo_cellvals L; + undo_cellvals (I,J) = [undo_cellval (I,J)]; *************** *** 2663,2666 **** --- 2718,2728 ---- = (1,1) otherwise; + undo_filter (I,J;N,M) + = []; + undo_filter (DI,DJ,L:List) + = L; + undo_filter L:List + = L; + undo = //printf "*** undo: %s\n" (str W) || adjust_table (N,M) || *************** *** 2670,2674 **** digest_loop where D = foldl (foldl insert) emptyhdict $ ! filter islist $ reverse UL, W = map (undo_cell D.fst) L, N = foldl max (MIN_ROWS-1) --- 2732,2736 ---- digest_loop where D = foldl (foldl insert) emptyhdict $ ! map undo_filter $ reverse UL, W = map (undo_cell D.fst) L, N = foldl max (MIN_ROWS-1) *************** *** 2680,2683 **** --- 2742,2763 ---- where [L:List|UL] = get UNDO_LIST; + undo = //printf "*** undo: %s\n" (str (DI,DJ,W)) || + adjust_table (N,M) || + move_spans (-DI,-DJ) (get_spans W) || + process_sel W || + UNDO_LIST := UL || REDO_LIST := [(DI,DJ,L)|get REDO_LIST] || + EDITED := (#UL<>get LAST_SAVE) || update_title || + digest_loop + where D = foldl (foldl insert) emptyhdict $ + map undo_filter $ reverse UL, + W = map (undo_cell D.fst) L, + N = foldl max (MIN_ROWS-1) + (map fst $ filter (neg null.trd) W) + 1, + M = foldl max (MIN_COLS-1) + (map snd $ filter (neg null.trd) W) + 1, + W = filter (valid_cell (N,M)) W + if not null UL + where [(DI,DJ,L:List)|UL] = get UNDO_LIST; + undo = //printf "*** undo: %s\n" (str (I,J;N,M)) || set_current_cell (I,J) || spanned_table_item (I,J) (N1,M1) || *************** *** 2704,2707 **** --- 2784,2804 ---- W = filter (valid_cell (N,M)) W; + redo = //printf "*** redo: %s\n" (str (DI,DJ,W)) || + adjust_table (N,M) || + move_spans (DI,DJ) (get_spans W) || + process_sel W || + UNDO_LIST := [(DI,DJ,L)|UL] || REDO_LIST := RL || + EDITED := (#UL+1<>get LAST_SAVE) || update_title || + digest_loop + where [(DI,DJ,L:List)|RL] = get REDO_LIST, + UL = get UNDO_LIST, + (KEYS,VALS) = unzip L, + W = zipwith append KEYS VALS, + N = foldl max (MIN_ROWS-1) + (map fst $ filter (neg null.trd) W) + 1, + M = foldl max (MIN_COLS-1) + (map snd $ filter (neg null.trd) W) + 1, + W = filter (valid_cell (N,M)) W; + redo = //printf "*** redo: %s\n" (str (I,J;N,M)) || set_current_cell (I,J) || spanned_table_item (I,J) (N,M) || |
From: Albert G. <ag...@us...> - 2007-11-13 10:03:11
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv12434 Modified Files: qcalc.q Log Message: code refactoring Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.140 retrieving revision 1.141 diff -C2 -d -r1.140 -r1.141 *** qcalc.q 13 Nov 2007 09:56:28 -0000 1.140 --- qcalc.q 13 Nov 2007 10:03:06 -0000 1.141 *************** *** 1377,1386 **** dissociate_cells _ _ _ if is_global: ! = do dissociate_cell SEL ! where SEL = check_editing || sel_cellvals selection, ! (I,J,V) = unzip3 $ cat SEL, K = zip I J, ! K = map real_index K, ! SEL = filter is_spanned $ keys $ hdict $ zip K V, ! SEL = sort indexcmp SEL if qt TABW "currentPageIndex" () = 0; --- 1377,1382 ---- dissociate_cells _ _ _ if is_global: ! = do dissociate_cell $ get_spans SEL ! where SEL = check_editing || sel_cellvals selection if qt TABW "currentPageIndex" () = 0; *************** *** 1390,1393 **** --- 1386,1394 ---- where IT = get_table_item (I,J); + get_spans SEL = sort indexcmp SP + where (I,J,V) = unzip3 $ cat SEL, K = zip I J, + K = map real_index K, + SP = filter is_spanned $ keys $ hdict $ zip K V; + insert_row _ _ _ if is_global: = adjust_rows (N+2) || EDITED := true || |
From: Albert G. <ag...@us...> - 2007-11-13 09:56:32
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv10837 Modified Files: qcalc.q Log Message: allow selection with Dissociate cells operation Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.139 retrieving revision 1.140 diff -C2 -d -r1.139 -r1.140 *** qcalc.q 13 Nov 2007 09:37:08 -0000 1.139 --- qcalc.q 13 Nov 2007 09:56:28 -0000 1.140 *************** *** 1377,1387 **** dissociate_cells _ _ _ if is_global: = set_current_cell (I,J) || qt IT "setSpan" (1,1) || save_undo (I,J;1,1) ! if not is_nil IT and then ((N>1) or else (M>1)) ! where (_,_;I,J;_,_) = check_editing || selection, ! (I,J) = real_index (I,J), (N,M) = cell_span (I,J), ! IT:QtObject = qt TABLE "item" (I,J) ! if qt TABW "currentPageIndex" () = 0; insert_row _ _ _ if is_global: --- 1377,1392 ---- dissociate_cells _ _ _ if is_global: + = do dissociate_cell SEL + where SEL = check_editing || sel_cellvals selection, + (I,J,V) = unzip3 $ cat SEL, K = zip I J, + K = map real_index K, + SEL = filter is_spanned $ keys $ hdict $ zip K V, + SEL = sort indexcmp SEL + if qt TABW "currentPageIndex" () = 0; + + dissociate_cell (I,J) = set_current_cell (I,J) || qt IT "setSpan" (1,1) || save_undo (I,J;1,1) ! where IT = get_table_item (I,J); insert_row _ _ _ if is_global: |
From: Albert G. <ag...@us...> - 2007-11-13 09:37:16
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv5327 Modified Files: qcalc.q Log Message: bugfixes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.138 retrieving revision 1.139 diff -C2 -d -r1.138 -r1.139 *** qcalc.q 13 Nov 2007 04:44:21 -0000 1.138 --- qcalc.q 13 Nov 2007 09:37:08 -0000 1.139 *************** *** 345,349 **** = false otherwise; ! unquote S = (X,X) if checkstr 'X where 'X = valq S; = (S,fformat S) otherwise; --- 345,349 ---- = false otherwise; ! unquote S = ((),X) if checkstr 'X where 'X = valq S; = (S,fformat S) otherwise; *************** *** 410,417 **** insert_elem D X = insert D (X,true) if not member D X; = D otherwise; - set_cells Xs:HDict - = CELLS := Xs; insert_cells ((I,J),X) = CELLS := insert (get CELLS) ((I,J),X); --- 410,420 ---- insert_elem D X = insert D (X,true) if not member D X; + = insert D (X,true) if is_nil Y where Y:QtObject = D!X; + = D otherwise; + + delete_elem D X = delete D X where true = D!X; + = delete D X if is_nil Y where Y:QtObject = D!X; = D otherwise; insert_cells ((I,J),X) = CELLS := insert (get CELLS) ((I,J),X); *************** *** 419,432 **** = CELLS := insert_elem (get CELLS) (I,J); insert_cells Xs:List ! = CELLS := foldl insert (get CELLS) Xs; delete_cells (I,J) ! = CELLS := delete (get CELLS) (I,J); delete_cells Xs:List ! = CELLS := foldl delete (get CELLS) Xs; filter_cells P = CELLS := hdict $ filter P $ list $ get CELLS; - set_eval Xs:HDict - = EVAL := Xs || make_xref if null (get EVAL); - = update_xref (delta (get EVAL) Xs) || EVAL := Xs otherwise; insert_eval ((I,J),X) = update_xref ((I,J),X) || --- 422,432 ---- = CELLS := insert_elem (get CELLS) (I,J); insert_cells Xs:List ! = CELLS := foldl insert_elem (get CELLS) Xs; delete_cells (I,J) ! = CELLS := delete_elem (get CELLS) (I,J); delete_cells Xs:List ! = CELLS := foldl delete_elem (get CELLS) Xs; filter_cells P = CELLS := hdict $ filter P $ list $ get CELLS; insert_eval ((I,J),X) = update_xref ((I,J),X) || *************** *** 448,464 **** E = zip K $ map (sort indexcmp.map (K!)) E; - delta OLD_EVAL NEW_EVAL - = OLD++NEW - where OLD = sort cellcmp (list OLD_EVAL), - NEW = sort cellcmp (list NEW_EVAL), - OLD = filter (deltacmp NEW_EVAL) OLD, - NEW = filter (deltacmp OLD_EVAL) NEW, - OLD = filter (neg $ member (hdict NEW).fst) OLD, - OLD = map fst OLD; - - deltacmp D (I,J;_,_,X) - = (X<>Y) where (_,_,Y) = D!(I,J); - = true otherwise; - update_xref (I,J;_,_,NEW_DEPS) = //printf "XREF += %s\n" $ str E || --- 448,451 ---- *************** *** 797,803 **** = gui_setval X S || get CELLS!(I,J) where X:QtObject = gui_elem (I,J); ! = if null S0 then delete_cells (I,J) ! else cell_setval (I,J) S0 || S0 ! where (S0,S1) = unquote S; // a variation of the above, used in the evaluation loop (collect_results) --- 784,791 ---- = gui_setval X S || get CELLS!(I,J) where X:QtObject = gui_elem (I,J); ! = if null S1 then delete_cells (I,J) || ! cell_setval (I,J) S0 || S ! where (S0,S1) = unquote S, ! S = if isstr S0 then S else S1; // a variation of the above, used in the evaluation loop (collect_results) *************** *** 806,813 **** = gui_setval X S || get CELLS!(I,J) where X:QtObject = gui_elem (I,J); ! = if null S0 then delete_cells (I,J) ! else cell_setval (I,J) S0 || ! clear_cell (I,J) || set_cell (I,J) S || S0 ! where (S0,S1) = unquote S; def TEMPL = "%s\nimport calclib;\n/* Main program generated by QCalc. */\n", --- 794,802 ---- = gui_setval X S || get CELLS!(I,J) where X:QtObject = gui_elem (I,J); ! = if null S1 then delete_cells (I,J) || ! cell_setval (I,J) S0 || ! clear_cell (I,J) || set_cell (I,J) S1 || S ! where (S0,S1) = unquote S, ! S = if isstr S0 then S else S1; def TEMPL = "%s\nimport calclib;\n/* Main program generated by QCalc. */\n", *************** *** 1042,1046 **** has_table_item (I,J) ! = true if not is_nil IT where IT:QtObject = get CELLS!(I,J); = false otherwise; --- 1031,1038 ---- has_table_item (I,J) ! = true ! where (_,_,_|_) = qt_data IT ! if not is_nil IT ! where IT:QtObject = qt TABLE "item" (I,J); = false otherwise; *************** *** 1066,1075 **** if (I,J) = real_index (I,J): = qt TABLE "clearCell" (I,J) if not has_table_item (I,J); ! = qt TABLE "clearCell" (I,J) || ! spanned_table_item (I,J) (N,M) if (N>1) or else (M>1) where (N,M) = cell_span (I,J); ! = qt TABLE "clearCell" (I,J) || ! get_table_item (I,J) otherwise; --- 1058,1071 ---- if (I,J) = real_index (I,J): = qt TABLE "clearCell" (I,J) if not has_table_item (I,J); ! = cell_setval (I,J) Y ! where Y = cell_getval (I,J), ! IT = qt TABLE "clearCell" (I,J) || ! spanned_table_item (I,J) (N,M) if (N>1) or else (M>1) where (N,M) = cell_span (I,J); ! = cell_setval (I,J) Y ! where Y = cell_getval (I,J), ! IT = qt TABLE "clearCell" (I,J) || ! get_table_item (I,J) otherwise; *************** *** 1356,1361 **** edit_undo _ _ _ if is_global: ! = undo || updatemsg (I,J) ! where (I,J) = current_cell where _ = check_editing if qt TABW "currentPageIndex" () = 0; --- 1352,1356 ---- edit_undo _ _ _ if is_global: ! = undo || updatemsg current_cell where _ = check_editing if qt TABW "currentPageIndex" () = 0; *************** *** 1364,1369 **** edit_redo _ _ _ if is_global: ! = redo || updatemsg (I,J) ! where (I,J) = current_cell where _ = check_editing if qt TABW "currentPageIndex" () = 0; --- 1359,1363 ---- edit_redo _ _ _ if is_global: ! = redo || updatemsg current_cell where _ = check_editing if qt TABW "currentPageIndex" () = 0; *************** *** 1546,1550 **** where SEL:List = check_editing || get_clipboard true, [(I1,J1,_)|_] = SEL, ! (I,J) = current_cell, (DI,DJ) = (I-I1,J-J1), SEL = map (translate (DI,DJ)) SEL, --- 1540,1544 ---- where SEL:List = check_editing || get_clipboard true, [(I1,J1,_)|_] = SEL, ! (I,J) = real_current_cell, (DI,DJ) = (I-I1,J-J1), SEL = map (translate (DI,DJ)) SEL, *************** *** 1564,1568 **** where SEL:List = check_editing || get_clipboard false, [(I1,J1,_)|_] = SEL, ! (I,J) = current_cell, (DI,DJ) = (I-I1,J-J1), SEL = map (translate (DI,DJ)) SEL, --- 1558,1562 ---- where SEL:List = check_editing || get_clipboard false, [(I1,J1,_)|_] = SEL, ! (I,J) = real_current_cell, (DI,DJ) = (I-I1,J-J1), SEL = map (translate (DI,DJ)) SEL, *************** *** 3182,3186 **** update_cell (I,J) S ! = () if is_gui_elem (I,J); = cell_setval (I,J) S || set_cell (I,J) (fformat S) || --- 3176,3180 ---- update_cell (I,J) S ! = cell_setval (I,J) () if is_gui_elem (I,J); = cell_setval (I,J) S || set_cell (I,J) (fformat S) || *************** *** 3218,3222 **** if check_interp; ! doprocess (I,J) = insert_cells (I,J) || clear_cell (I,J) || // do the necessary reevaluations if check_interp then compute V --- 3212,3217 ---- if check_interp; ! doprocess (I,J) = insert_cells (I,J) || ! cell_setval (I,J) () || clear_cell (I,J) || // do the necessary reevaluations if check_interp then compute V *************** *** 3231,3234 **** --- 3226,3230 ---- clear (I,J) = if is_empty (I,J) then delete_cells (I,J) else insert_cells (I,J) || + cell_setval (I,J) () || clear_cell (I,J) || set_cell (I,J) S || if check_interp then compute V *************** *** 3246,3293 **** X = gui_getval X; ! process1 (CELLS,EVAL) (I,J,S) ! = clear_cell (I,J) || (CELLS,EVAL) where ("=",S) = (hd S,trim (tl S)), ! 'X = parse S, DEPS = deps 'X, ! (CELLS,EVAL) = ! (insert_elem CELLS (I,J),insert EVAL (I,J;S,'X,DEPS)); ! = clear_cell (I,J) || set_cell (I,J) S || (CELLS,EVAL) ! where (CELLS,EVAL) = ! (insert_elem CELLS (I,J),delete EVAL (I,J)) if not null S; ! = clear_cell (I,J) || (CELLS,EVAL) ! where (CELLS,EVAL) = ! (delete CELLS (I,J),delete EVAL (I,J)) otherwise; process_sel W = if check_interp then compute V ! where (C,E) = foldl process1 (get CELLS,get EVAL) W, ! _ = set_cells C || set_eval E, W = map (flip (flip sub 0) 1) W, V = eval_list (cst true) W if not null W and then check_interp; ! process2 (CELLS,EVAL) (I,J,S) ! = (CELLS,EVAL) if is_qt_object S; ! = clear_cell (I,J) || (CELLS,EVAL) where ("=",S) = (hd S,trim (tl S)), ! 'X = parse S, DEPS = deps 'X, ! (CELLS,EVAL) = ! (insert_elem CELLS (I,J),insert EVAL (I,J;S,'X,DEPS)); ! = clear_cell (I,J) || set_cell (I,J) S1 || (CELLS,EVAL) ! where S0 = CELLS!(I,J), ! (S0,S1) = if isstr S0 then unquote S else (true,S), ! (CELLS,EVAL) = ! (insert CELLS ((I,J),S0),delete EVAL (I,J)) if not null S; ! = clear_cell (I,J) || (CELLS,EVAL) ! where (CELLS,EVAL) = ! (delete CELLS (I,J),delete EVAL (I,J)) otherwise; process_sel2 W = if check_interp then compute V where //_ = printf "*** pending updates: %s\n" $ str W, ! (C,E) = foldl process2 (get CELLS,get EVAL) W, ! _ = set_cells C || set_eval E, W = map (flip (flip sub 0) 1) W, // Exclude all toplevel GUI elements from this list --- 3242,3287 ---- X = gui_getval X; ! process1 (I,J,S) ! = clear_cell (I,J) || ! insert_cells (I,J) || insert_eval (I,J;S,'X,DEPS) || ! cell_setval (I,J) () where ("=",S) = (hd S,trim (tl S)), ! 'X = parse S, DEPS = deps 'X; ! = clear_cell (I,J) || set_cell (I,J) S || ! insert_cells (I,J) || delete_eval (I,J) || ! cell_setval (I,J) () if not null S; ! = clear_cell (I,J) || ! delete_cells (I,J) || delete_eval (I,J) || ! cell_setval (I,J) () otherwise; process_sel W = if check_interp then compute V ! where _ = do process1 W, W = map (flip (flip sub 0) 1) W, V = eval_list (cst true) W if not null W and then check_interp; ! process2 (I,J,S) ! = cell_setval (I,J) () if is_qt_object S; ! = clear_cell (I,J) || ! insert_cells (I,J) || insert_eval (I,J;S,'X,DEPS) || ! cell_setval (I,J) () where ("=",S) = (hd S,trim (tl S)), ! 'X = parse S, DEPS = deps 'X; ! = clear_cell (I,J) || set_cell (I,J) S1 || ! cell_setval (I,J) S0 || ! insert_cells (I,J) || delete_eval (I,J) ! where S0 = cell_getval (I,J), ! (S0,S1) = if isstr S0 then unquote S else ((),S) if not null S; ! = clear_cell (I,J) || ! delete_cells (I,J) || delete_eval (I,J) || ! cell_setval (I,J) () otherwise; process_sel2 W = if check_interp then compute V where //_ = printf "*** pending updates: %s\n" $ str W, ! _ = do process2 W, W = map (flip (flip sub 0) 1) W, // Exclude all toplevel GUI elements from this list *************** *** 3296,3300 **** if not null W and then check_interp; ! clear_sel W = do clear_cell W || compute V where _ = delete_cells W || delete_eval W, V = eval_list (cst true) W --- 3290,3294 ---- if not null W and then check_interp; ! clear_sel W = do (flip cell_setval ()) W || do clear_cell W || compute V where _ = delete_cells W || delete_eval W, V = eval_list (cst true) W |
From: Albert G. <ag...@us...> - 2007-11-13 04:44:26
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv4342 Modified Files: qcalc.q Log Message: bugfixes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.137 retrieving revision 1.138 diff -C2 -d -r1.137 -r1.138 *** qcalc.q 13 Nov 2007 03:34:53 -0000 1.137 --- qcalc.q 13 Nov 2007 04:44:21 -0000 1.138 *************** *** 1064,1068 **** clear_cell (I,J) ! where (I,J) = real_index (I,J): = qt TABLE "clearCell" (I,J) if not has_table_item (I,J); = qt TABLE "clearCell" (I,J) || --- 1064,1068 ---- clear_cell (I,J) ! if (I,J) = real_index (I,J): = qt TABLE "clearCell" (I,J) if not has_table_item (I,J); = qt TABLE "clearCell" (I,J) || *************** *** 1075,1082 **** set_cell (I,J) S ! = qt TABLE "setText" (I,J,S); set_pixmap (I,J) PM ! = qt TABLE "setPixmap" (I,J,PM); edit_cell (I,J) = get_table_item (I,J) || qt TABLE "editCell" (I,J); --- 1075,1082 ---- set_cell (I,J) S ! = qt TABLE "setText" (I,J,S) if (I,J) = real_index (I,J); set_pixmap (I,J) PM ! = qt TABLE "setPixmap" (I,J,PM) if (I,J) = real_index (I,J); edit_cell (I,J) = get_table_item (I,J) || qt TABLE "editCell" (I,J); *************** *** 1401,1405 **** SEL = R++map (translate (1,0)) (cat SEL), CELLS = map (flip (flip sub 0) 1) SEL - if not any (is_spanned.flip (flip sub 0) 1) (cat SEL) where (I,J,SEL) = check_editing || selection_rows, (_,_;_,_;N,_) = SEL, --- 1401,1404 ---- *************** *** 1417,1421 **** SEL = map (translate (-1,0)) (cat $ tl SEL)++R, CELLS = map (flip (flip sub 0) 1) SEL - if not any (is_spanned.flip (flip sub 0) 1) (cat SEL) where (I,J,SEL) = check_editing || selection_rows, (_,_;_,_;N,_) = SEL, --- 1416,1419 ---- *************** *** 1433,1437 **** SEL = R++map (translate (0,1)) (cat SEL), CELLS = map (flip (flip sub 0) 1) SEL - if not any (is_spanned.flip (flip sub 0) 1) (cat SEL) where (I,J,SEL) = check_editing || selection_cols, (_,_;_,_;_,N) = SEL, --- 1431,1434 ---- *************** *** 1449,1453 **** SEL = map (translate (0,-1)) (cat $ tl SEL)++R, CELLS = map (flip (flip sub 0) 1) SEL - if not any (is_spanned.flip (flip sub 0) 1) (cat SEL) where (I,J,SEL) = check_editing || selection_cols, (_,_;_,_;_,N) = SEL, --- 1446,1449 ---- |
From: Albert G. <ag...@us...> - 2007-11-13 03:34:58
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv26137 Modified Files: qcalc.q Log Message: bugfixes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.136 retrieving revision 1.137 diff -C2 -d -r1.136 -r1.137 *** qcalc.q 12 Nov 2007 21:06:43 -0000 1.136 --- qcalc.q 13 Nov 2007 03:34:53 -0000 1.137 *************** *** 2633,2636 **** --- 2633,2638 ---- UNDO_LIST := [(I,J;N,M)|get UNDO_LIST] || REDO_LIST := []; + save_undo (I,J) = save_undo [(I,J)]; + save_undo L:List = //printf "*** save undo: %s\n" (str L) || *************** *** 2640,2643 **** --- 2642,2648 ---- where L = undo_cellvals L; + merge_undo (I,J) + = merge_undo [(I,J)]; + merge_undo L:List = //printf "*** merge undo: %s ++ %s\n" (str L0,str L) || |
From: Albert G. <ag...@us...> - 2007-11-12 21:06:48
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv32498 Modified Files: qcalc.q Log Message: bugfixes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.135 retrieving revision 1.136 diff -C2 -d -r1.135 -r1.136 *** qcalc.q 12 Nov 2007 20:25:33 -0000 1.135 --- qcalc.q 12 Nov 2007 21:06:43 -0000 1.136 *************** *** 1401,1405 **** SEL = R++map (translate (1,0)) (cat SEL), CELLS = map (flip (flip sub 0) 1) SEL ! if not any (is_spanned.flip (flip sub 0) 1) SEL where (I,J,SEL) = check_editing || selection_rows, (_,_;_,_;N,_) = SEL, --- 1401,1405 ---- SEL = R++map (translate (1,0)) (cat SEL), CELLS = map (flip (flip sub 0) 1) SEL ! if not any (is_spanned.flip (flip sub 0) 1) (cat SEL) where (I,J,SEL) = check_editing || selection_rows, (_,_;_,_;N,_) = SEL, *************** *** 1417,1421 **** SEL = map (translate (-1,0)) (cat $ tl SEL)++R, CELLS = map (flip (flip sub 0) 1) SEL ! if not any (is_spanned.flip (flip sub 0) 1) SEL where (I,J,SEL) = check_editing || selection_rows, (_,_;_,_;N,_) = SEL, --- 1417,1421 ---- SEL = map (translate (-1,0)) (cat $ tl SEL)++R, CELLS = map (flip (flip sub 0) 1) SEL ! if not any (is_spanned.flip (flip sub 0) 1) (cat SEL) where (I,J,SEL) = check_editing || selection_rows, (_,_;_,_;N,_) = SEL, *************** *** 1433,1437 **** SEL = R++map (translate (0,1)) (cat SEL), CELLS = map (flip (flip sub 0) 1) SEL ! if not any (is_spanned.flip (flip sub 0) 1) SEL where (I,J,SEL) = check_editing || selection_cols, (_,_;_,_;_,N) = SEL, --- 1433,1437 ---- SEL = R++map (translate (0,1)) (cat SEL), CELLS = map (flip (flip sub 0) 1) SEL ! if not any (is_spanned.flip (flip sub 0) 1) (cat SEL) where (I,J,SEL) = check_editing || selection_cols, (_,_;_,_;_,N) = SEL, *************** *** 1449,1453 **** SEL = map (translate (0,-1)) (cat $ tl SEL)++R, CELLS = map (flip (flip sub 0) 1) SEL ! if not any (is_spanned.flip (flip sub 0) 1) SEL where (I,J,SEL) = check_editing || selection_cols, (_,_;_,_;_,N) = SEL, --- 1449,1453 ---- SEL = map (translate (0,-1)) (cat $ tl SEL)++R, CELLS = map (flip (flip sub 0) 1) SEL ! if not any (is_spanned.flip (flip sub 0) 1) (cat SEL) where (I,J,SEL) = check_editing || selection_cols, (_,_;_,_;_,N) = SEL, |
From: Albert G. <ag...@us...> - 2007-11-12 20:59:00
|
Update of /cvsroot/q-lang/qcalc/doc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv28533/doc Modified Files: qcalc.xml Log Message: update documentation Index: qcalc.xml =================================================================== RCS file: /cvsroot/q-lang/qcalc/doc/qcalc.xml,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** qcalc.xml 10 Nov 2007 11:27:47 -0000 1.12 --- qcalc.xml 12 Nov 2007 20:58:42 -0000 1.13 *************** *** 131,135 **** </para> <para> ! You can also insert and delete entire rows and columns by selecting a cell (a single cell will do, although you can also select a range, in which case the upper left cell of the range determines where the operation is to be performed) and choose the corresponding option in the <guimenu>Edit</guimenu> menu. The corresponding keyboard shortcuts are <keycap>F7</keycap> and <keycap>Shift-F7</keycap> to insert and delete a row, and <keycap>F8</keycap> and <keycap>Shift-F8</keycap> to insert and delete a column, respectively. Each operation only inserts or deletes a single row or column, so you have to invoke the command repeatedly if you want more. Also note that the other editing operations will enlarge the table if needed, e.g., when you paste a range of cells near the edges of the spreadsheet. Thus it is not necessary to explicitly insert table rows and columns in such cases. </para> <para> --- 131,135 ---- </para> <para> ! The <guimenu>Merge cells</guimenu> option (<keycap>F6</keycap>) in the <guimenu>Edit</guimenu> menu allows you to merge adjacent cells into one bigger cell which may span multiple rows and columns; the <guimenu>Dissociate cells</guimenu> (<keycap>Shift-F6</keycap>) option splits them up into their constituents again. You can also insert and delete entire rows and columns by selecting a cell (a single cell will do, although you can also select a range, in which case the upper left cell of the range determines where the operation is to be performed) and choose the corresponding option. The corresponding keyboard shortcuts are <keycap>F7</keycap> and <keycap>Shift-F7</keycap> to insert and delete a row, and <keycap>F8</keycap> and <keycap>Shift-F8</keycap> to insert and delete a column, respectively. Each of the these operations only inserts or deletes a single row or column, so you have to invoke the command repeatedly if you want more. Also note that the other editing operations will enlarge the table if needed, e.g., when you paste a range of cells near the edges of the spreadsheet. Thus it is not necessary to explicitly insert table rows and columns in such cases. </para> <para> |
From: Albert G. <ag...@us...> - 2007-11-12 20:33:22
|
Update of /cvsroot/q-lang/qcalc/examples In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv17410/examples Modified Files: example.qcalc Log Message: cosmetic changes Index: example.qcalc =================================================================== RCS file: /cvsroot/q-lang/qcalc/examples/example.qcalc,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** example.qcalc 4 Nov 2007 21:35:52 -0000 1.3 --- example.qcalc 12 Nov 2007 20:33:13 -0000 1.4 *************** *** 1,4 **** ! // qcalc 1.0, created Sun Nov 4 22:28:33 2007 -*-Q-*- -*- coding: UTF-8 -*- ! // [((0,1),"*** Erathosthenes' prime sieve ***"),((2,0),"Q stream of *all* primes"),((2,1),"= primes"),((3,0),"The first 50 primes"),((3,1),"= list $ take 50 B3"),((4,0),"The 111th prime"),((4,1),"= B3!111"),((5,0),"Product of the first 50"),((5,1),"= prd B4"),((6,1),"(This is a HUGE number, make the column bigger to see it all.)"),((8,1),"*** Linear Regression (Eddie Rucker) ***"),((9,0),"1"),((9,1),"3"),((10,0),"2"),((10,1),"5"),((11,0),"3"),((11,1),"7"),((12,0),"4"),((12,1),"9"),((13,0),"5"),((13,1),"10"),((14,0),"6"),((14,1),"13"),((15,0),"Least squares:"),((15,1),"= regress A10:A15 B10:B15"),((16,0),"Enter X:"),((16,1),"7"),((17,0),"Value at X:"),((17,1),"= B16 B17"),((19,1),"*** Normal Distribution (Eddie Rucker) ***"),((20,0),"Enter A:"),((20,1),"-1"),((21,0),"Enter B:"),((21,1),"1"),((22,0),"P(X>=A):"),((22,1),"= normal_above B21"),((23,0),"P(X<=B):"),((23,1),"= normal_below B22"),((24,0),"P(A<=X<=B):"),((24,1),"= normal B21 B22"),((26,1),"*** Playing with sums etc. ***"),((26,2),"Squares"),((26,3),"Cubes"),((27,1),"1"),((27,2),"= square B28"),((27,3),"= cube B28"),((28,1),"2"),((28,2),"= square B29"),((28,3),"= cube B29"),((29,1),"3"),((29,2),"= square B30"),((29,3),"= cube B30"),((30,1),"4"),((30,2),"= square B31"),((30,3),"= cube B31"),((31,1),"5"),((31,2),"= square B32"),((31,3),"= cube B32"),((32,1),"6"),((32,2),"= square B33"),((32,3),"= cube B33"),((33,1),"7"),((33,2),"= square B34"),((33,3),"= cube B34"),((34,1),"8"),((34,2),"= square B35"),((34,3),"= cube B35"),((35,1),"9"),((35,2),"= square B36"),((35,3),"= cube B36"),((36,1),"10"),((36,2),"= square B37"),((36,3),"= cube B37"),((38,0),"Sum"),((38,1),"= sum B28:B37"),((38,2),"= sum C28:C37"),((38,3),"= sum D28:D37"),((39,0),"Product"),((39,1),"= prd B28:B37"),((39,2),"= prd C28:C37"),((39,3),"= prd D28:D37"),((40,1),"Note that the range B28:B37 becomes a Q list:"),((41,1),"= B28:B37"),((44,1),"*** Geometric series ***"),((45,0),"Enter Q:"),((45,1),"= 1/3"),((46,0),"Series:"),((46,1),"= geom_series B46"),((47,0),"1"),((47,1),"= B$47!A48"),((48,0),"2"),((48,1),"= B$47!A49"),((49,0),"3"),((49,1),"= B$47!A50"),((50,0),"4"),((50,1),"= B$47!A51"),((51,0),"5"),((51,1),"= B$47!A52"),((52,0),"6"),((52,1),"= B$47!A53"),((53,0),"7"),((53,1),"= B$47!A54"),((54,0),"8"),((54,1),"= B$47!A55"),((55,0),"9"),((55,1),"= B$47!A56"),((56,0),"10"),((56,1),"= B$47!A57"),((57,0),"11"),((57,1),"= B$47!A58"),((58,0),"12"),((58,1),"= B$47!A59"),((59,0),"13"),((59,1),"= B$47!A60"),((60,0),"14"),((60,1),"= B$47!A61"),((61,0),"15"),((61,1),"= B$47!A62"),((63,1),"Some calculations with rationals:"),((64,0),"Op1"),((64,1),"= 5%3"),((65,0),"Op2"),((65,1),"= 81%53"),((66,0),"Sum"),((66,1),"= B65+B66"),((67,0),"Product"),((67,1),"= B65*B66"),((68,0),"Quotient"),((68,1),"= B65 % B66"),((70,1),"Complex numbers:"),((71,0),"2^(1/i)"),((71,1),"= 2^(1/i)"),((72,0),"log2 of that"),((72,1),"= lg B72"),((73,0),"abs, arg of the log2"),((73,1),"= (abs B73,arg B73)"),((75,1),"Complex rationals:"),((76,1),"= (1+:2)%(3+:4)"),((77,1),"= square (5+:-5%18)")] // [] // [(0,139),(1,308),(2,120),(3,163),(4,188)] --- 1,4 ---- ! // qcalc 1.0, created Mon Nov 12 21:36:00 2007 -*-Q-*- -*- coding: UTF-8 -*- ! // [((0,1),"*** Erathosthenes' prime sieve ***"),((2,0),"Q stream of *all* primes"),((2,1),"= primes"),((3,0),"The first 50 primes"),((3,1),"= list $ take 50 B3"),((4,0),"The 111th prime"),((4,1),"= B3!111"),((5,0),"Product of the first 50"),((5,1),"= prd B4"),((6,1),("(This is a HUGE number, make the column bigger to see it all.)",1,2)),((8,1),"*** Linear Regression (Eddie Rucker) ***"),((9,0),"1"),((9,1),"3"),((10,0),"2"),((10,1),"5"),((11,0),"3"),((11,1),"7"),((12,0),"4"),((12,1),"9"),((13,0),"5"),((13,1),"10"),((14,0),"6"),((14,1),"13"),((15,0),"Least squares:"),((15,1),"= regress A10:A15 B10:B15"),((16,0),"Enter X:"),((16,1),"7"),((17,0),"Value at X:"),((17,1),"= B16 B17"),((19,1),"*** Normal Distribution (Eddie Rucker) ***"),((20,0),"Enter A:"),((20,1),"-1"),((21,0),"Enter B:"),((21,1),"1"),((22,0),"P(X>=A):"),((22,1),"= normal_above B21"),((23,0),"P(X<=B):"),((23,1),"= normal_below B22"),((24,0),"P(A<=X<=B):"),((24,1),"= normal B21 B22"),((26,1),"*** Playing with sums etc. ***"),((26,2),"Squares"),((26,3),"Cubes"),((27,1),"1"),((27,2),"= square B28"),((27,3),"= cube B28"),((28,1),"2"),((28,2),"= square B29"),((28,3),"= cube B29"),((29,1),"3"),((29,2),"= square B30"),((29,3),"= cube B30"),((30,1),"4"),((30,2),"= square B31"),((30,3),"= cube B31"),((31,1),"5"),((31,2),"= square B32"),((31,3),"= cube B32"),((32,1),"6"),((32,2),"= square B33"),((32,3),"= cube B33"),((33,1),"7"),((33,2),"= square B34"),((33,3),"= cube B34"),((34,1),"8"),((34,2),"= square B35"),((34,3),"= cube B35"),((35,1),"9"),((35,2),"= square B36"),((35,3),"= cube B36"),((36,1),"10"),((36,2),"= square B37"),((36,3),"= cube B37"),((38,0),"Sum"),((38,1),"= sum B28:B37"),((38,2),"= sum C28:C37"),((38,3),"= sum D28:D37"),((39,0),"Product"),((39,1),"= prd B28:B37"),((39,2),"= prd C28:C37"),((39,3),"= prd D28:D37"),((40,1),"Note that the range B28:B37 becomes a Q list:"),((41,1),"= B28:B37"),((44,1),"*** Geometric series ***"),((45,0),"Enter Q:"),((45,1),"= 1/3"),((46,0),"Series:"),((46,1),"= geom_series B46"),((47,0),"1"),((47,1),"= B$47!A48"),((48,0),"2"),((48,1),"= B$47!A49"),((49,0),"3"),((49,1),"= B$47!A50"),((50,0),"4"),((50,1),"= B$47!A51"),((51,0),"5"),((51,1),"= B$47!A52"),((52,0),"6"),((52,1),"= B$47!A53"),((53,0),"7"),((53,1),"= B$47!A54"),((54,0),"8"),((54,1),"= B$47!A55"),((55,0),"9"),((55,1),"= B$47!A56"),((56,0),"10"),((56,1),"= B$47!A57"),((57,0),"11"),((57,1),"= B$47!A58"),((58,0),"12"),((58,1),"= B$47!A59"),((59,0),"13"),((59,1),"= B$47!A60"),((60,0),"14"),((60,1),"= B$47!A61"),((61,0),"15"),((61,1),"= B$47!A62"),((63,1),"Some calculations with rationals:"),((64,0),"Op1"),((64,1),"= 5%3"),((65,0),"Op2"),((65,1),"= 81%53"),((66,0),"Sum"),((66,1),"= B65+B66"),((67,0),"Product"),((67,1),"= B65*B66"),((68,0),"Quotient"),((68,1),"= B65 % B66"),((70,1),"Complex numbers:"),((71,0),"2^(1/i)"),((71,1),"= 2^(1/i)"),((72,0),"log2 of that"),((72,1),"= lg B72"),((73,0),"abs, arg of the log2"),((73,1),"= (abs B73,arg B73)"),((75,1),"Complex rationals:"),((76,1),"= (1+:2)%(3+:4)"),((77,1),"= square (5+:-5%18)")] // [] // [(0,139),(1,308),(2,120),(3,163),(4,188)] |
From: Albert G. <ag...@us...> - 2007-11-12 20:31:11
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv16256 Modified Files: README Log Message: update README Index: README =================================================================== RCS file: /cvsroot/q-lang/qcalc/README,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** README 8 Nov 2007 21:33:27 -0000 1.16 --- README 12 Nov 2007 20:31:07 -0000 1.17 *************** *** 76,81 **** - Special cell attributes like number format, alignment, color, font and ! frames, cells spanning multiple columns and rows, simple GUI elements like ! buttons, etc. Currently you'll have to help yourself with ASCII art. - Embedded graphics, maybe using Q's OpenDX and OpenGL interfaces. I'm --- 76,80 ---- - Special cell attributes like number format, alignment, color, font and ! frames, etc. Currently you'll have to help yourself with ASCII art. - Embedded graphics, maybe using Q's OpenDX and OpenGL interfaces. I'm *************** *** 86,90 **** Enjoy! :) ! Oct 2007 Albert Graef <Dr....@t-...> http://q-lang.sf.net --- 85,89 ---- Enjoy! :) ! Nov 2007 Albert Graef <Dr....@t-...> http://q-lang.sf.net |
From: Albert G. <ag...@us...> - 2007-11-12 20:29:40
|
Update of /cvsroot/q-lang/qcalc/examples In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv15377/examples Modified Files: guiexamples.qcalc Log Message: cosmetic changes Index: guiexamples.qcalc =================================================================== RCS file: /cvsroot/q-lang/qcalc/examples/guiexamples.qcalc,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** guiexamples.qcalc 10 Nov 2007 13:35:57 -0000 1.4 --- guiexamples.qcalc 12 Nov 2007 20:29:35 -0000 1.5 *************** *** 1,5 **** ! // qcalc 1.0, created Sat Nov 10 14:17:44 2007 -*-Q-*- -*- coding: UTF-8 -*- ! // [((0,1),"GUI element"),((0,2),"Value"),((0,3),"Display"),((2,0),"Checkbox"),((2,1),"= checkbox (\"test\",true)"),((2,2),"= B3"),((2,3),"= checkbox (\"test\",B3)"),((4,0),"Combobox"),((4,1),"= combobox ([\"apples\",\"bananas\",\"oranges\"],\"oranges\")"),((4,2),"= B5"),((4,3),"= combobox ([\"apples\",\"bananas\",\"oranges\"],B5)"),((5,0),"Comboedit"),((5,1),"= comboedit ([\"apples\",\"bananas\",\"oranges\"],\"bananas\")"),((5,2),"= B6"),((5,3),"= comboedit ([\"apples\",\"bananas\",\"oranges\"],B6)"),((6,0),"Int Spinbox"),((6,1),"= spinbox (0,100,5,40)"),((6,2),"= B7"),((6,3),"= spinbox (0,100,5,B7)"),((7,0),"Float Spinbox"),((7,1),"= spinbox (0.0,10.0,0.5,4.0)"),((7,2),"= B8"),((7,3),"= spinbox (0.0,10.0,0.5,B8)"),((9,0),"Spinbox with special value"),((9,1),"= spinbox (-1,10,1,0,\"Any\")"),((9,2),"= B10"),((9,3),"= spinbox (-1,10,1,B10,\"Any\")"),((10,0),"Spinbox with prefix"),((10,1),"= spinbox (-0.1,10,0.1,0,\"Any\",\"$ \")"),((10,2),"= B11"),((10,3),"= spinbox (-0.1,10,0.1,B11,\"Any\",\"$ \")"),((11,0),"Spinbox with suffix"),((11,1),"= spinbox (-1,72,1,10,\"Any\",\"\",\"pt\")"),((11,2),"= B12"),((11,3),"= spinbox (-1,72,1,B12,\"Any\",\"\",\"pt\")"),((13,0),"Horizontal slider"),((13,1),"= hslider (0,100,1,50)"),((13,2),"= B14"),((13,3),"= hslider (0,100,1,B14)"),((14,0),"Vertical slider"),((14,1),"= vslider (0,100,1,50)"),((14,2),"= B15"),((14,3),"= vslider (0,100,1,B15)"),((16,0),"Pushbutton"),((16,1),"= pushbutton \"Push me!\""),((16,2),"= B17"),((16,3),"N/A"),((17,0),"Pushbutton with icon"),((17,1),"= pushbutton (\"Push me!\",which \"pixmaps/1rightarrow.png\")"),((17,2),"= B18"),((17,3),"N/A"),((18,0),"Togglebutton with icon"),((18,1),"= togglebutton (\"Toggle me!\",which \"pixmaps/flag.png\")"),((18,2),"= B19"),((18,3),"= togglebutton (\"Toggle me!\",which \"pixmaps/flag.png\",B19)"),((20,0),"\"Buddies\" (linked elements)"),((20,1),"= hslider (0,100,1,D21)"),((20,2),"= B21"),((20,3),"= spinbox (0,100,1,B21)"),((22,0),"Alternative \"remote control\" of GUI elements using setval"),((24,0),"GUI element A (click here)"),((24,1),"Transfer A -> B"),((24,2),"GUI element B (display)"),((24,3),"Value of B"),((26,0),"= checkbox \"A\""),((26,1),"= setval 'C27 A27"),((26,2),"= checkbox \"B\""),((26,3),"= C27"),((27,0),"= spinbox (-0.1,10,0.1,0,\"Any\")"),((27,1),"= setval 'C28 A28"),((27,2),"= spinbox (-0.1,10,0.1,0,\"Any\")"),((27,3),"= C28"),((28,0),"= spinbox (-5,100,5,40,\"Any\")"),((28,1),"= setval 'C29 A29"),((28,2),"= spinbox (-1,100,1,40,\"Any\")"),((28,3),"= C29"),((29,0),"= combobox ([\"apples\",\"bananas\",\"oranges\"],\"oranges\")"),((29,1),"= setval 'C30 A30"),((29,2),"= combobox ([\"apples\",\"bananas\",\"oranges\"],\"oranges\")"),((29,3),"= C30"),((30,0),"= togglebutton (\"Toggle me!\",which \"pixmaps/flag.png\")"),((30,1),"= setval 'C31 A31"),((30,2),"= togglebutton (\"Toggle me!\",which \"pixmaps/flag.png\")"),((30,3),"= C31")] // [(14,55)] ! // [(0,151),(2,139)] // Start of script. Please do not remove this line. --- 1,5 ---- ! // qcalc 1.0, created Mon Nov 12 21:31:39 2007 -*-Q-*- -*- coding: UTF-8 -*- ! // [((0,1),"GUI element"),((0,2),"Value"),((0,3),"Display"),((2,0),"Checkbox"),((2,1),"= checkbox (\"test\",true)"),((2,2),"= B3"),((2,3),"= checkbox (\"test\",B3)"),((4,0),"Combobox"),((4,1),"= combobox ([\"apples\",\"bananas\",\"oranges\"],\"oranges\")"),((4,2),"= B5"),((4,3),"= combobox ([\"apples\",\"bananas\",\"oranges\"],B5)"),((5,0),"Comboedit"),((5,1),"= comboedit ([\"apples\",\"bananas\",\"oranges\"],\"bananas\")"),((5,2),"= B6"),((5,3),"= comboedit ([\"apples\",\"bananas\",\"oranges\"],B6)"),((6,0),"Int Spinbox"),((6,1),"= spinbox (0,100,5,40)"),((6,2),"= B7"),((6,3),"= spinbox (0,100,5,B7)"),((7,0),"Float Spinbox"),((7,1),"= spinbox (0.0,10.0,0.5,4.0)"),((7,2),"= B8"),((7,3),"= spinbox (0.0,10.0,0.5,B8)"),((9,0),"Spinbox with special value"),((9,1),"= spinbox (-1,10,1,0,\"Any\")"),((9,2),"= B10"),((9,3),"= spinbox (-1,10,1,B10,\"Any\")"),((10,0),"Spinbox with prefix"),((10,1),"= spinbox (-0.1,10,0.1,0,\"Any\",\"$ \")"),((10,2),"= B11"),((10,3),"= spinbox (-0.1,10,0.1,B11,\"Any\",\"$ \")"),((11,0),"Spinbox with suffix"),((11,1),"= spinbox (-1,72,1,10,\"Any\",\"\",\"pt\")"),((11,2),"= B12"),((11,3),"= spinbox (-1,72,1,B12,\"Any\",\"\",\"pt\")"),((13,0),"Horizontal slider"),((13,1),"= hslider (0,100,1,50)"),((13,2),"= B14"),((13,3),"= hslider (0,100,1,B14)"),((14,0),"Vertical slider"),((14,1),"= vslider (0,100,1,50)"),((14,2),"= B15"),((14,3),"= vslider (0,100,1,B15)"),((16,0),"Pushbutton"),((16,1),"= pushbutton \"Push me!\""),((16,2),"= B17"),((16,3),"N/A"),((17,0),"Pushbutton with icon"),((17,1),"= pushbutton (\"Push me!\",which \"pixmaps/1rightarrow.png\")"),((17,2),"= B18"),((17,3),"N/A"),((18,0),"Togglebutton with icon"),((18,1),"= togglebutton (\"Toggle me!\",which \"pixmaps/flag.png\")"),((18,2),"= B19"),((18,3),"= togglebutton (\"Toggle me!\",which \"pixmaps/flag.png\",B19)"),((20,0),"\"Buddies\" (linked elements)"),((20,1),"= hslider (0,100,1,D21)"),((20,2),"= B21"),((20,3),"= spinbox (0,100,1,B21)"),((22,0),("Alternative \"remote control\" of GUI elements using setval",1,4)),((24,0),"GUI element A (click here)"),((24,1),"Transfer A -> B"),((24,2),"GUI element B (display)"),((24,3),"Value of B"),((26,0),"= checkbox \"A\""),((26,1),"= setval 'C27 A27"),((26,2),"= checkbox \"B\""),((26,3),"= C27"),((27,0),"= spinbox (-0.1,10,0.1,0,\"Any\")"),((27,1),"= setval 'C28 A28"),((27,2),"= spinbox (-0.1,10,0.1,0,\"Any\")"),((27,3),"= C28"),((28,0),"= spinbox (-5,100,5,40,\"Any\")"),((28,1),"= setval 'C29 A29"),((28,2),"= spinbox (-1,100,1,40,\"Any\")"),((28,3),"= C29"),((29,0),"= combobox ([\"apples\",\"bananas\",\"oranges\"],\"oranges\")"),((29,1),"= setval 'C30 A30"),((29,2),"= combobox ([\"apples\",\"bananas\",\"oranges\"],\"oranges\")"),((29,3),"= C30"),((30,0),"= togglebutton (\"Toggle me!\",which \"pixmaps/flag.png\")"),((30,1),"= setval 'C31 A31"),((30,2),"= togglebutton (\"Toggle me!\",which \"pixmaps/flag.png\")"),((30,3),"= C31")] // [(14,55)] ! // [(0,162),(2,139)] // Start of script. Please do not remove this line. |
From: Albert G. <ag...@us...> - 2007-11-12 20:25:37
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv12122 Modified Files: qcalc.q Log Message: make mouse selection work again (used Clipboard mode instead of Selection mode) Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.134 retrieving revision 1.135 diff -C2 -d -r1.134 -r1.135 *** qcalc.q 12 Nov 2007 18:28:52 -0000 1.134 --- qcalc.q 12 Nov 2007 20:25:33 -0000 1.135 *************** *** 1715,1719 **** set_clipboard2 S:String ! = qt CLIP "setText" S; selection = (I0,J0;I1,J1;I2,J2) --- 1715,1719 ---- set_clipboard2 S:String ! = qt CLIP "setText" (S,qt_val "QClipboard" "Selection"); selection = (I0,J0;I1,J1;I2,J2) |
From: Albert G. <ag...@us...> - 2007-11-12 18:28:55
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv9866 Modified Files: qcalc.q Log Message: allow word wrap in cells spanning more than one line Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.133 retrieving revision 1.134 diff -C2 -d -r1.133 -r1.134 *** qcalc.q 12 Nov 2007 18:20:52 -0000 1.133 --- qcalc.q 12 Nov 2007 18:28:52 -0000 1.134 *************** *** 927,931 **** spanned_table_item (I,J) (N,M) ! = qt IT "setSpan" (N,M) || IT if not is_nil IT where (I0,J0) = real_index (I,J), --- 927,932 ---- spanned_table_item (I,J) (N,M) ! = qt IT "setSpan" (N,M) || ! qt IT "setWordWrap" (N>1) || IT if not is_nil IT where (I0,J0) = real_index (I,J), |
From: Albert G. <ag...@us...> - 2007-11-12 18:20:56
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv6163 Modified Files: qcalc.q Log Message: bugfixes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.132 retrieving revision 1.133 diff -C2 -d -r1.132 -r1.133 *** qcalc.q 12 Nov 2007 18:16:34 -0000 1.132 --- qcalc.q 12 Nov 2007 18:20:52 -0000 1.133 *************** *** 917,921 **** if not is_nil IT where IT:QtObject = qt TABLE "item" (I,J): = IT where (_,_,_|_) = qt_data IT; ! = qt IT "setText" S || qt IT "setPixmap" PM || IT where S = cell_text (I,J), PM = cell_pixmap (I,J), IT:QtObject = make_table_item (I,J) $ --- 917,922 ---- if not is_nil IT where IT:QtObject = qt TABLE "item" (I,J): = IT where (_,_,_|_) = qt_data IT; ! = qt IT "setText" S || qt IT "setPixmap" PM || ! qt TABLE "updateCell" (I,J) || IT where S = cell_text (I,J), PM = cell_pixmap (I,J), IT:QtObject = make_table_item (I,J) $ |
From: Albert G. <ag...@us...> - 2007-11-12 18:16:41
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv2957 Modified Files: qcalc.q Log Message: undo/redo for cell spanning, bugfixes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.131 retrieving revision 1.132 diff -C2 -d -r1.131 -r1.132 *** qcalc.q 12 Nov 2007 16:26:54 -0000 1.131 --- qcalc.q 12 Nov 2007 18:16:34 -0000 1.132 *************** *** 712,717 **** handled automatically by Qt. */ ! check_focus N X = qt TABLE "setCurrentCell" (I,J) || ! qt TABLE "clearSelection" () if (I,J)<>current_cell where (I,J) = qt_data X; --- 712,716 ---- handled automatically by Qt. */ ! check_focus N X = set_current_cell (I,J) if (I,J)<>current_cell where (I,J) = qt_data X; *************** *** 917,922 **** get_table_item (I,J) if not is_nil IT where IT:QtObject = qt TABLE "item" (I,J): ! = if not is_gui_elem (I,J) then clear_gui_elem (I,J) || ! IT where (_,_,_|_) = qt_data IT; = qt IT "setText" S || qt IT "setPixmap" PM || IT where S = cell_text (I,J), PM = cell_pixmap (I,J), --- 916,920 ---- get_table_item (I,J) if not is_nil IT where IT:QtObject = qt TABLE "item" (I,J): ! = IT where (_,_,_|_) = qt_data IT; = qt IT "setText" S || qt IT "setPixmap" PM || IT where S = cell_text (I,J), PM = cell_pixmap (I,J), *************** *** 927,944 **** qt_val "QTableItem" "OnTyping"; - clear_gui_elem (I,J) - where (X,Y,F|_) = qt_data IT if not is_nil IT - where IT:QtObject = qt TABLE "item" (I,J): - = do (uncurry (qt_set_cb IT)) - [("createEditor",create_editor), - ("setContentFromEditor",content_from_editor)] || - qt_set_data IT (X,Y,F); - spanned_table_item (I,J) (N,M) = qt IT "setSpan" (N,M) || IT - where (I0,J0) = real_index (I,J), - (N,M) = (N+I-I0,M+J-J0), (I,J) = (I0,J0) if not is_nil IT ! where IT:QtObject = get_table_item (I,J); make_table_item (I,J|DATA) ET --- 925,934 ---- qt_val "QTableItem" "OnTyping"; spanned_table_item (I,J) (N,M) = qt IT "setSpan" (N,M) || IT if not is_nil IT ! where (I0,J0) = real_index (I,J), ! (N,M) = (N+I-I0,M+J-J0), (I,J) = (I0,J0), ! IT:QtObject = get_table_item (I,J); make_table_item (I,J|DATA) ET *************** *** 1065,1068 **** --- 1055,1064 ---- = real_index current_cell; + set_current_cell (I,J) + = qt TABLE "setCurrentCell" (I,J) || + // Qt sometimes munges the selection here, so we try to + // force it to a sane value + qt TABLE "clearSelection" (); + clear_cell (I,J) where (I,J) = real_index (I,J): *************** *** 1180,1189 **** where X:QtObject = gui_elem (I,J); = accept S D A || ! qt TABLE "setCurrentCell" ! (if I+M<N then (I+M,J) else (0,J+1)) || ! // Qt sometimes munges the selection here, so we force it to ! // a sane value ! qt TABLE "clearSelection" () || ! qt TABLE "repaintSelections" () where (M,_) = cell_span (I,J) if (qt TABLE "hasFocus" () or else --- 1176,1180 ---- where X:QtObject = gui_elem (I,J); = accept S D A || ! set_current_cell (if I+M<N then (I+M,J) else (0,J+1)) where (M,_) = cell_span (I,J) if (qt TABLE "hasFocus" () or else *************** *** 1202,1207 **** if is_global and then not is_recursive and then not is_nil X: = if (I,J)<>real_current_cell then ! (qt TABLE "setCurrentCell" (I,J) || ! qt TABLE "clearSelection" ()) || process_gui (I,J) X || digest_loop; --- 1193,1197 ---- if is_global and then not is_recursive and then not is_nil X: = if (I,J)<>real_current_cell then ! set_current_cell (I,J) || process_gui (I,J) X || digest_loop; *************** *** 1380,1385 **** merge_cells _ _ _ if is_global: ! = updatemsg (I,J) ! where IT:QtObject = spanned_table_item (I,J) (N,M) if not null SEL and then all is_empty SEL where SEL = check_editing || sel_cellvals selection, --- 1370,1377 ---- merge_cells _ _ _ if is_global: ! = save_undo (I,J;N,M) ! where (I,J) = real_index (I,J), (N,M) = cell_span (I,J) ! where IT:QtObject = set_current_cell (I,J) || ! spanned_table_item (I,J) (N,M) if not null SEL and then all is_empty SEL where SEL = check_editing || sel_cellvals selection, *************** *** 1389,1399 **** dissociate_cells _ _ _ if is_global: ! = qt_set_cb IT "createEditor" || ! qt_set_cb IT "setContentFromEditor" || ! qt IT "setSpan" (1,1) ! if ((N>1) or else (M>1)) ! where N = qt IT "rowSpan" (), M = qt IT "colSpan" () ! if not is_nil IT where (_,_;I,J;_,_) = check_editing || selection, IT:QtObject = qt TABLE "item" (I,J) if qt TABW "currentPageIndex" () = 0; --- 1381,1389 ---- dissociate_cells _ _ _ if is_global: ! = set_current_cell (I,J) || qt IT "setSpan" (1,1) || ! save_undo (I,J;1,1) ! if not is_nil IT and then ((N>1) or else (M>1)) where (_,_;I,J;_,_) = check_editing || selection, + (I,J) = real_index (I,J), (N,M) = cell_span (I,J), IT:QtObject = qt TABLE "item" (I,J) if qt TABW "currentPageIndex" () = 0; *************** *** 1949,1952 **** --- 1939,1943 ---- if RES then digest_loop || do (uncurry spanned_table_item) SPANS || + mark_spans SPANS || statusmsg "Done" || qt TIMER "start" 300 || *************** *** 2623,2635 **** /* Undo/redo. **************************************************************/ ! def LAST_SAVE = ref 0; mark_save = LAST_SAVE := #get UNDO_LIST; mark_undo L = //printf "*** mark undo: %s\n" (str L) || ! LAST_SAVE := 1 || UNDO_LIST := [L] || REDO_LIST := [] where L = zip (map (flip (flip sub 0) 1) L) (map (!2) L); ! save_undo L = //printf "*** save undo: %s\n" (str L) || if #get UNDO_LIST < get LAST_SAVE then LAST_SAVE := 0 || UNDO_LIST := [L|get UNDO_LIST] || REDO_LIST := [] --- 2614,2636 ---- /* Undo/redo. **************************************************************/ ! def LAST_SAVE = ref 0, SPANS = ref emptyhdict; mark_save = LAST_SAVE := #get UNDO_LIST; mark_undo L = //printf "*** mark undo: %s\n" (str L) || ! LAST_SAVE := 1 || UNDO_LIST := [L] || REDO_LIST := [] || ! SPANS := emptyhdict where L = zip (map (flip (flip sub 0) 1) L) (map (!2) L); ! mark_spans L = //printf "*** mark spans: %s\n" (str L) || ! SPANS := hdict L; ! ! save_undo (I,J;N,M) ! = //printf "*** save undo: %s\n" (str (I,J;N,M)) || ! if #get UNDO_LIST < get LAST_SAVE then LAST_SAVE := 0 || ! UNDO_LIST := [(I,J;N,M)|get UNDO_LIST] || REDO_LIST := []; ! ! save_undo L:List ! = //printf "*** save undo: %s\n" (str L) || if #get UNDO_LIST < get LAST_SAVE then LAST_SAVE := 0 || UNDO_LIST := [L|get UNDO_LIST] || REDO_LIST := [] *************** *** 2637,2641 **** where L = undo_cellvals L; ! merge_undo L = //printf "*** merge undo: %s ++ %s\n" (str L0,str L) || UNDO_LIST := [L0++L|UL] where [L0|UL] = get UNDO_LIST --- 2638,2643 ---- where L = undo_cellvals L; ! merge_undo L:List ! = //printf "*** merge undo: %s ++ %s\n" (str L0,str L) || UNDO_LIST := [L0++L|UL] where [L0|UL] = get UNDO_LIST *************** *** 2654,2657 **** --- 2656,2663 ---- = (I,J,"") otherwise; + undo_span SP (I,J) + = (N,M) where (N,M) = SP!(I,J); + = (1,1) otherwise; + undo = //printf "*** undo: %s\n" (str W) || adjust_table (N,M) || *************** *** 2660,2664 **** EDITED := (#UL<>get LAST_SAVE) || update_title || digest_loop ! where D = foldl (foldl insert) emptyhdict (reverse UL), W = map (undo_cell D.fst) L, N = foldl max (MIN_ROWS-1) --- 2666,2671 ---- EDITED := (#UL<>get LAST_SAVE) || update_title || digest_loop ! where D = foldl (foldl insert) emptyhdict $ ! filter islist $ reverse UL, W = map (undo_cell D.fst) L, N = foldl max (MIN_ROWS-1) *************** *** 2668,2672 **** W = filter (valid_cell (N,M)) W if not null UL ! where [L|UL] = get UNDO_LIST; redo = //printf "*** redo: %s\n" (str W) || --- 2675,2688 ---- W = filter (valid_cell (N,M)) W if not null UL ! where [L:List|UL] = get UNDO_LIST; ! ! undo = //printf "*** undo: %s\n" (str (I,J;N,M)) || ! set_current_cell (I,J) || spanned_table_item (I,J) (N1,M1) || ! UNDO_LIST := UL || REDO_LIST := [(I,J;N,M)|get REDO_LIST] || ! EDITED := (#UL<>get LAST_SAVE) || update_title ! where [(I,J;N,M)|UL] = get UNDO_LIST, ! SP = foldl insert (get SPANS) $ ! filter istuple $ reverse UL, ! (N1,M1) = undo_span SP (I,J); redo = //printf "*** redo: %s\n" (str W) || *************** *** 2676,2680 **** EDITED := (#UL+1<>get LAST_SAVE) || update_title || digest_loop ! where [L|RL] = get REDO_LIST, UL = get UNDO_LIST, (KEYS,VALS) = unzip L, W = zipwith append KEYS VALS, --- 2692,2696 ---- EDITED := (#UL+1<>get LAST_SAVE) || update_title || digest_loop ! where [L:List|RL] = get REDO_LIST, UL = get UNDO_LIST, (KEYS,VALS) = unzip L, W = zipwith append KEYS VALS, *************** *** 2685,2688 **** --- 2701,2710 ---- W = filter (valid_cell (N,M)) W; + redo = //printf "*** redo: %s\n" (str (I,J;N,M)) || + set_current_cell (I,J) || spanned_table_item (I,J) (N,M) || + UNDO_LIST := [(I,J;N,M)|UL] || REDO_LIST := RL || + EDITED := (#UL+1<>get LAST_SAVE) || update_title + where [(I,J;N,M)|RL] = get REDO_LIST, UL = get UNDO_LIST; + /* Syntax highlighting. ****************************************************/ |
From: Albert G. <ag...@us...> - 2007-11-12 16:26:59
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv7720 Modified Files: qcalc.q Log Message: bugfixes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.130 retrieving revision 1.131 diff -C2 -d -r1.130 -r1.131 *** qcalc.q 12 Nov 2007 16:19:09 -0000 1.130 --- qcalc.q 12 Nov 2007 16:26:54 -0000 1.131 *************** *** 1068,1074 **** where (I,J) = real_index (I,J): = qt TABLE "clearCell" (I,J) if not has_table_item (I,J); - // = qt TABLE "clearCellWidget" (I,J) || - // clear_gui_elem (I,J) || - // set_cell (I,J) "" || set_pixmap (I,J) NULLPM; = qt TABLE "clearCell" (I,J) || spanned_table_item (I,J) (N,M) --- 1068,1071 ---- *************** *** 1146,1150 **** if qt TABW "currentPageIndex" () = 0 if is_global: = // nuke the current cell ! qt TABLE "clearCell" (I,J) || // leave a sentinel value indicating to finish_edit that // this is a GUI element to be reconstructed if the editing --- 1143,1147 ---- if qt TABW "currentPageIndex" () = 0 if is_global: = // nuke the current cell ! clear_cell (I,J) || // leave a sentinel value indicating to finish_edit that // this is a GUI element to be reconstructed if the editing |
From: Albert G. <ag...@us...> - 2007-11-12 16:19:13
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv4151 Modified Files: qcalc.q Log Message: bugfixes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.129 retrieving revision 1.130 diff -C2 -d -r1.129 -r1.130 *** qcalc.q 12 Nov 2007 12:18:47 -0000 1.129 --- qcalc.q 12 Nov 2007 16:19:09 -0000 1.130 *************** *** 1087,1090 **** --- 1087,1094 ---- edit_cell (I,J) = get_table_item (I,J) || qt TABLE "editCell" (I,J); + end_edit ACCEPT (I,J) + = qt TABLE "endEdit" (I,J,ACCEPT,false) || + qt TABLE "setEditMode" (qt_val "QTable" "NotEditing",I,J); + /* Provide temporary storage for unformatted and edited cell contents. */ *************** *** 1136,1140 **** process (I,J) S || save_undo (I,J) || updatemsg (I,J) || digest_loop ! where S = cell_text (I,J); edit _ _ () --- 1140,1144 ---- process (I,J) S || save_undo (I,J) || updatemsg (I,J) || digest_loop ! where S = cell_text (I,J), _ = LAST_EDIT := (); edit _ _ () *************** *** 1165,1169 **** if is_gui_elem (I,J); = EDITED := true || ! recursive (qt TABLE "endEdit" (I,J,true,false)) || finish_edit true (I,J) if qt TABLE "isEditing" () and then --- 1169,1173 ---- if is_gui_elem (I,J); = EDITED := true || ! recursive (end_edit true (I,J)) || finish_edit true (I,J) if qt TABLE "isEditing" () and then *************** *** 1189,1193 **** qt TABLE "isEditing" ()); ! cancel _ _ _ = qt TABLE "endEdit" (I,J,false,false) || finish_edit false (I,J) if not is_gui_elem (I,J) and then --- 1193,1197 ---- qt TABLE "isEditing" ()); ! cancel _ _ _ = end_edit false (I,J) || finish_edit false (I,J) if not is_gui_elem (I,J) and then *************** *** 1206,1210 **** check_editing = EDITED := true || ! recursive (qt TABLE "endEdit" (I,J,true,false)) || finish_edit true (I,J) if not is_gui_elem (I,J) --- 1210,1214 ---- check_editing = EDITED := true || ! recursive (end_edit true (I,J)) || finish_edit true (I,J) if not is_gui_elem (I,J) |
From: Albert G. <ag...@us...> - 2007-11-12 12:18:55
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv26020 Modified Files: qcalc.q Log Message: bugfixes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.128 retrieving revision 1.129 diff -C2 -d -r1.128 -r1.129 *** qcalc.q 12 Nov 2007 09:59:29 -0000 1.128 --- qcalc.q 12 Nov 2007 12:18:47 -0000 1.129 *************** *** 677,680 **** --- 677,683 ---- qt_invoke OBJ SLOT ARGS = _FAIL_ if is_recursive and then neq SLOT abort; + // Use this for debugging if debug_invoke doesn't work (see below). + // = printf "qt_invoke: %s %s %s\n" (str OBJ,str SLOT,str ARGS) || + // fail if neq SLOT timer; @0 *************** *** 719,739 **** if N < 5; - /* XXXFIXME: Another desperate kludge. For some reasons I don't understand - (probably a Qt bug), cell widgets created with doprocess sometimes - mysteriously become nil between one callback invocation and the next - one. At least with my Qt version this seems to happen whenever I end a cell - edit by clicking on another cell. Currently we make up for that by just - running doprocess again which recreates the element -- not very elegant but - it has the desired effect. This still doesn't resolve similar issues with - checkbox and combobox items, though, which appear to be completely disabled - and rejecting mouse focus under the same circumstances, until they are - double-clicked. If anyone knows what causes this please let me know... */ - - def LASTW = ref []; - - check_lastW (I,J,IT:QtObject) - = doprocess (I,J) - if is_nil X where (_,_,_,X:QtObject|_) = qt_data IT; - /* Timer processing. */ --- 722,725 ---- *************** *** 746,751 **** set_status HAVE_UNDO EDIT_UNDO || set_status HAVE_REDO EDIT_REDO || - if not null (get LASTW) then - (do check_lastW (get LASTW) || LASTW := []) || check_focus 0 (qt APP "focusWidget" ()) || if not is_recursive then digest_loop --- 732,735 ---- *************** *** 788,791 **** --- 772,776 ---- digest "+++ Exiting." = STATE := 0; + digest 'X = X; // background task digest W:List = process_sel2 W || merge_undo $ map (flip (flip sub 0) 1) W if get STATE = 4; *************** *** 993,997 **** [] [] []; ! /* Cell editors. */ create_editor IT DATA ARGS --- 978,986 ---- [] [] []; ! /* Cell editor. This is basically just the standard cell editor, but with the ! added feature that the contents of computed cells is replaced by the ! corresponding formula for editing. */ ! ! def LAST_EDIT = ref (); create_editor IT DATA ARGS *************** *** 999,1008 **** = // editing a GUI element, keep the sentinel value set_cell (I,J) $ sprintf "= %s" S || qt_super IT "createEditor" ARGS ! where '_ = cell_gettmp (I,J); = // ordinary formula cell_settmp (I,J) $ cell_text (I,J) || ! set_cell (I,J) $ sprintf "= %s" S || ! qt_super IT "createEditor" ARGS; otherwise: = // ordinary text, use standard editor --- 988,1000 ---- = // editing a GUI element, keep the sentinel value set_cell (I,J) $ sprintf "= %s" S || + LAST_EDIT := (I,J,S1) || qt_super IT "createEditor" ARGS ! where 'S1 = cell_gettmp (I,J); = // ordinary formula cell_settmp (I,J) $ cell_text (I,J) || ! set_cell (I,J) S1 || ! LAST_EDIT := (I,J,S1) || ! qt_super IT "createEditor" ARGS ! where S1 = sprintf "= %s" S; otherwise: = // ordinary text, use standard editor *************** *** 1074,1081 **** clear_cell (I,J) = qt TABLE "clearCell" (I,J) if not has_table_item (I,J); ! = qt TABLE "clearCellWidget" (I,J) || ! clear_gui_elem (I,J) || ! set_cell (I,J) "" || set_pixmap (I,J) NULLPM; set_cell (I,J) S --- 1066,1081 ---- clear_cell (I,J) + where (I,J) = real_index (I,J): = qt TABLE "clearCell" (I,J) if not has_table_item (I,J); ! // = qt TABLE "clearCellWidget" (I,J) || ! // clear_gui_elem (I,J) || ! // set_cell (I,J) "" || set_pixmap (I,J) NULLPM; ! = qt TABLE "clearCell" (I,J) || ! spanned_table_item (I,J) (N,M) ! if (N>1) or else (M>1) ! where (N,M) = cell_span (I,J); ! = qt TABLE "clearCell" (I,J) || ! get_table_item (I,J) ! otherwise; set_cell (I,J) S *************** *** 1108,1121 **** = process_gui (I,J) X || digest_loop where X:QtObject = gui_elem (I,J); ! = finish_edit true (I,J); finish_edit ACCEPT (I,J) ! if not ACCEPT: ! = cell_settmp (I,J) () || ! set_cell (I,J) S || updatemsg (I,J) ! where S:String = cell_gettmp (I,J); = cell_settmp (I,J) () || process (I,J) S || updatemsg (I,J) || digest_loop ! where 'S:String = cell_gettmp (I,J); otherwise: = cell_settmp (I,J) () || --- 1108,1133 ---- = process_gui (I,J) X || digest_loop where X:QtObject = gui_elem (I,J); ! = post MSGS '(check_last_gui (I,J,X)) ! where X:QtObject = finish_edit true (I,J) || ! gui_elem (I,J); ! = (); ! ! /* FIXME: If we created a GUI object in the edited cell, it will be destroyed ! when editing is finished, as the cell editor is also implemented as a cell ! widget. We currently work around this by rerunning the formula later in the ! timer routine. */ ! ! check_last_gui (I,J,X) ! = doprocess (I,J) if is_nil X; finish_edit ACCEPT (I,J) ! where S = cell_gettmp (I,J) if not ACCEPT where _ = LAST_EDIT := (): = cell_settmp (I,J) () || process (I,J) S || updatemsg (I,J) || digest_loop ! where 'S:String = S; ! = cell_settmp (I,J) () || ! set_cell (I,J) S || updatemsg (I,J) ! if isstr S; ! = () otherwise; otherwise: = cell_settmp (I,J) () || *************** *** 1149,1153 **** accept _ _ _ ! where (I,J) = real_current_cell if is_global: = doprocess (I,J) || digest_loop if is_gui_elem (I,J); --- 1161,1165 ---- accept _ _ _ ! where _ = LAST_EDIT := (), (I,J) = real_current_cell if is_global: = doprocess (I,J) || digest_loop if is_gui_elem (I,J); *************** *** 1162,1166 **** accept2 S D A ! where (I,J) = real_current_cell, N = num_rows if is_global and then (qt TABW "currentPageIndex" () = 0): = gui_enter (I,J) X --- 1174,1178 ---- accept2 S D A ! where _ = LAST_EDIT := (), (I,J) = real_current_cell, N = num_rows if is_global and then (qt TABW "currentPageIndex" () = 0): = gui_enter (I,J) X *************** *** 1182,1186 **** qt TABLE "isEditing" () and then (qt TABW "currentPageIndex" () = 0) ! where (I,J) = real_current_cell if is_global; --- 1194,1198 ---- qt TABLE "isEditing" () and then (qt TABW "currentPageIndex" () = 0) ! where _ = LAST_EDIT := (), (I,J) = real_current_cell if is_global; *************** *** 1198,1201 **** --- 1210,1214 ---- if not is_gui_elem (I,J) where (I,J) = current_edited; + = finish_edit true (I,J) where (I,J,S) = get LAST_EDIT; /* Various status updates. */ *************** *** 3044,3049 **** collect_results U V ! = LASTW := [] || ! begin_recursive || results_loop U V || end_recursive; results_loop U [] --- 3057,3061 ---- collect_results U V ! = begin_recursive || results_loop U V || end_recursive; results_loop U [] *************** *** 3076,3081 **** (I1,J1) = val K1; /* Messages to create GUI elements in cells (calclib::combobox et al). */ ! = LASTW := [(I1,J1,IT)|get LASTW] || ! results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Checkbox: (\\([0-9]+,[0-9]+\\)) (.*)$" S --- 3088,3092 ---- (I1,J1) = val K1; /* Messages to create GUI elements in cells (calclib::combobox et al). */ ! = results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Checkbox: (\\([0-9]+,[0-9]+\\)) (.*)$" S *************** *** 3083,3088 **** (I1,J1) = val K1, (S1,INIT) = val S1, IT:QtObject = make_gui checkbox_gui (I1,J1) (S1,INIT); ! = LASTW := [(I1,J1,IT)|get LASTW] || ! results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Pushbutton: (\\([0-9]+,[0-9]+\\)) (.*)$" S --- 3094,3098 ---- (I1,J1) = val K1, (S1,INIT) = val S1, IT:QtObject = make_gui checkbox_gui (I1,J1) (S1,INIT); ! = results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Pushbutton: (\\([0-9]+,[0-9]+\\)) (.*)$" S *************** *** 3091,3096 **** IT:QtObject = make_gui pushbutton_gui (I1,J1) (TEXT,ICON); ! = LASTW := [(I1,J1,IT)|get LASTW] || ! results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Togglebutton: (\\([0-9]+,[0-9]+\\)) (.*)$" S --- 3101,3105 ---- IT:QtObject = make_gui pushbutton_gui (I1,J1) (TEXT,ICON); ! = results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Togglebutton: (\\([0-9]+,[0-9]+\\)) (.*)$" S *************** *** 3099,3104 **** IT:QtObject = make_gui togglebutton_gui (I1,J1) (TEXT,ICON,INIT); ! = LASTW := [(I1,J1,IT)|get LASTW] || ! results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Combobox: (\\([0-9]+,[0-9]+\\)) (.*)$" S --- 3108,3112 ---- IT:QtObject = make_gui togglebutton_gui (I1,J1) (TEXT,ICON,INIT); ! = results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Combobox: (\\([0-9]+,[0-9]+\\)) (.*)$" S *************** *** 3106,3111 **** (I1,J1) = val K1, (SL,INIT) = val S1, IT:QtObject = make_gui combobox_gui (I1,J1) (SL,INIT); ! = LASTW := [(I1,J1,IT)|get LASTW] || ! results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Comboedit: (\\([0-9]+,[0-9]+\\)) (.*)$" S --- 3114,3118 ---- (I1,J1) = val K1, (SL,INIT) = val S1, IT:QtObject = make_gui combobox_gui (I1,J1) (SL,INIT); ! = results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Comboedit: (\\([0-9]+,[0-9]+\\)) (.*)$" S *************** *** 3113,3118 **** (I1,J1) = val K1, (SL,INIT) = val S1, IT:QtObject = make_gui comboedit_gui (I1,J1) (SL,INIT); ! = LASTW := [(I1,J1,IT)|get LASTW] || ! results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Spinbox: (\\([0-9]+,[0-9]+\\)) (.*)$" S --- 3120,3124 ---- (I1,J1) = val K1, (SL,INIT) = val S1, IT:QtObject = make_gui comboedit_gui (I1,J1) (SL,INIT); ! = results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Spinbox: (\\([0-9]+,[0-9]+\\)) (.*)$" S *************** *** 3122,3127 **** IT:QtObject = make_gui spinbox_gui (I1,J1) (MIN,MAX,STEP,INIT,SPECIAL,PREF,SUFF,V2T,T2V); ! = LASTW := [(I1,J1,IT)|get LASTW] || ! results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Slider: (\\([0-9]+,[0-9]+\\)) (.*)$" S --- 3128,3132 ---- IT:QtObject = make_gui spinbox_gui (I1,J1) (MIN,MAX,STEP,INIT,SPECIAL,PREF,SUFF,V2T,T2V); ! = results_loop (insert U ((I1,J1),IT)) [(I,J)|V] where [(K1,S1)] = regex "" "^\\+\\+\\+ Slider: (\\([0-9]+,[0-9]+\\)) (.*)$" S |
From: Albert G. <ag...@us...> - 2007-11-12 09:59:32
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv26385 Modified Files: qcalc.q Log Message: major code cleanup, add support for custom table items, add preliminary support for cells spanning multiple rows and columns Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.127 retrieving revision 1.128 diff -C2 -d -r1.127 -r1.128 *** qcalc.q 11 Nov 2007 00:42:54 -0000 1.127 --- qcalc.q 12 Nov 2007 09:59:29 -0000 1.128 *************** *** 60,63 **** --- 60,65 ---- "editReturn()", accept2; "editCancel()", cancel; + "editMergeCells()", merge_cells; + "editDissociateCells()", dissociate_cells; "editInsertRow()", insert_row; "editInsertCol()", insert_col; *************** *** 122,125 **** --- 124,128 ---- [...1195 lines suppressed...] 'X = parse S, DEPS = deps 'X, (CELLS,EVAL) = ! (insert_elem CELLS (I,J),insert EVAL (I,J;S,'X,DEPS)); = clear_cell (I,J) || set_cell (I,J) S1 || (CELLS,EVAL) where S0 = CELLS!(I,J), *************** *** 3090,3095 **** where W:List = get XREF!X, (V,Xs) = foldl (search (cst true)) ! (insert V (X,true),Xs) W; ! = (V,[X|Xs]) otherwise; /* Inferior Q process. *****************************************************/ --- 3299,3304 ---- where W:List = get XREF!X, (V,Xs) = foldl (search (cst true)) ! (insert_elem V X,Xs) W; ! = (V,if P X then [X|Xs] else Xs) otherwise; /* Inferior Q process. *****************************************************/ |
From: Albert G. <ag...@us...> - 2007-11-12 09:57:41
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv26298 Modified Files: qcalc.ui Log Message: new Merge and Dissociate cells actions Index: qcalc.ui =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.ui,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** qcalc.ui 5 Nov 2007 11:12:19 -0000 1.20 --- qcalc.ui 12 Nov 2007 09:57:37 -0000 1.21 *************** *** 306,309 **** --- 306,311 ---- <action name="editCancelAction"/> <separator/> + <action name="editMergeCellsAction"/> + <action name="editDissociateCellsAction"/> <action name="editInsertRowAction"/> <action name="editInsertColumnAction"/> *************** *** 1173,1285 **** </property> </action> </actions> <images> <image name="image0"> ! <data format="PNG" length="1654">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af40000063d4944415458859d975f685bf71dc58f9278282363da4837953e541b5d5675834e658c2a14660f6f2bc20f9a408309fc10b1a4e0910763f6504c0646a4a388c0326c98406118a41723c26a343d78910862d286d91545456af1e0aeb88b1ef4a0767ab8196ae1b387dfcf7fe4488ed70be2f87baf7cbfe79cdff97dfdb30f90cfe7d3b48b4d05f4407fd2bc7ed87a20bd322be9a1a459a9f5d0d60f24cd4bcd07d2d5795bcf4acd87d2d563df3fac1fe83f9ad586ef575af33d8d80b3a8775ff1ebe58f5f90be72497a2ce9a2ce809f49172f4cc17f4bb50fa51f3dd66f4e25c0a27ea679ddd77f25dde8499f3e2bcd4ce57af6eb2f2f499fbd2ffd518fce3de5ab91eedf25dd884a9f4a9a91baef372549ddf72663f36f7f3ef5f9bffed9947edcd5e38f2449cf0998dabdf10b65d81674570060d431e81aa8561a6335ee19eb11300a534d8a5309b0a84ce7a6cc2f7955dbb40a39c8dcae92590367d7dcefed1974760b63f54974bb25f3be9d303c95c0a10319000af7802e94b7cd3bb26f037bd069e6cd0d8b47f5baa9b797c0f3a066dec3b00494cf40e056faf7e58d2c14a1b0e98007e9e212d16294e05a1006b074b36c1d6a58a5c601f6b3c012b4d263d82b0681105402d309b0c3353cde2dddefc010f29512bd7e8f6c3d6b94ef6709ee07c9eee4196c0195031216f7568101b4979ec441082a024f54e3c70838bbbd00b05cadb91f328246dd25eb41aa9836367a1d565925500f20846a22b416627dc3c1bb090ceddad7534671373d117bf783806047470e382d7e077c4cdd0858afe5e9f57b94f78ca242bf40952aaac934df154182f86ffb0148250b30005a2b308c423d0674a09eb078ac1e06a12e43e2c001804e770040341735691e3a002cb94b4488a0baf0e327d80e121a8508e72246711f569621f366de286cc68c62373d117b3bd681dde304ea6c0334dc06ced021dfcf336040b41d354a5b7ec28409ed8470fa0e85ddb24db7095e691bdc1cd05e314af7ed9a4fc410b44ddbc30c30e027e58a991691cd081122f877fd0408106a87088fc22cd5cc301a18a3e8dc355bacb16832925a2cc1ed0c4e2502c4709b7393b116300e748f3920e90243f6699a9787ea21ca9499abcd99663d73ff60a2395b556803c914f8fd385b0d7021bd98076f0e5a31c0998241704f6440922f7faff10645e8f58cc472d74caec1d0f6763d00bc2190835e30089702b881008cc06979a49250c8a58118bd56cce2dc58ed36ad03fbe304449d67f2f79c4f4c9771c5ec59ec1bc86f02fb509e8d41c5fc0cb0bad63073a16b154fc420f44f64c05ee7b8cb6ff31bce61ba8f3b50de366c3a7b1e6c82bb7fe08c71acd132ac13c902f41338cd08107d02dd96df38303ce18024adde2a5da1058dfab8f2ce1e303caa9dd60987fa40cf3c1f6c41662d6b14bbb1091884d19319387421b3562e72e728ede51dd728b6cddcbd812531b00e98fb8562c7a24b2a099d56c2acbd6b33e0da0cb8260383f66402a2c24f57dfb4ca06e34a9dddf1fb852d6004e58a71a1619fa7164bd0f2a01b024a16c3166d08774579418f26fd313aef2df35ef66d33640ed69a9181c6ae75a0ed41df2e0fd0dbb7bb67db853b90be9687be708b7a126f89f282c8bcaae549047ce9eb8537065b476b7ee844cd2adeb6f7ecdc70dac7b2609d7173b01e9f83b8493b71c182c1f2823ee0552d4bba32ed3c3093be56fa84bbc7d30e14cd7e07e8743deb90079e7504a8d6ccd44a5f2f9188f381a4972585255d39f6f996a4e7255d9e46c0e7e6782bbd581acbc0c11a1fa6df3a93cf61ed07bab0f26be3406c61fd1ddbecb2a42f1dfb5c9239bd5f987a228abeb6f2b55412f2b9ce98624618c5074eec0139432e73dbcc8154924791ef2ffd52d28b92be2ee90b139b483aed48762e11cf17075b1c4e3aec502a55ace28a71217bc7a1b709896461e8cc9395f41d49dfb0ca2f4a9a7efc3f8580120bfc20610f1b9d2e47bba20f4ed7344f5f2f914a42ecf56c31188c5c95f482a4a0b5f982a4e9ff763d8d80a4f3ee067f3d980b0d9bfafc3d60c7d8dd89f38fc8f7523f97f46d49cf49fab28ce5a7373e23015f229ebf914a42b56e1297bde3904a42229e7f34f7dacab24cc29f97f455497e9d66f7e720204933896461dfdb86f46209778361ecf5ec1f247d57d237253d23e98b92ceebacaaff4f02be449cb712c9028905de095c0e5f95d95acfca6ca999cfd5d85eff031c2ae1e194302d380000000049454e44ae426082</data> </image> <image name="image1"> ! <data format="PNG" length="749">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000002b449444154388da594c14b545114c67f86821712e6419b098d7990e08804498be6519b8116d9260c097297ada45df42fb4b176ea223208c616e52868b8309ba0f00913e390e21808a3a0cc13119f4cf1dea443a7c5bc67e3388ada07978f731fefdcef7ef79c532322f8888f25241a8a9058052304e6ea2cc7c5735b4b97eedc6a5fa31a44647fe5928e388e5485932f71362b22799199e4a2e4928e8c4ca59acb73f8eb4030327a44561f5e72c98ac8a688644472738e7c984a5da94c7cae5cbdd108ae5bf5622534806d033a98ab19088385a23d10fe1eff3877fd482b46463f1dafd8c7b6a778b3740be74b49796c3cd55dd58ae33caec44c7251247790734947626f622da7f7b8127911d9963fa9b992fafe21672b9bc8de95537b5c06f7678933d3f19af6850c990d8800e69a097030b1b93e8b5227c8ba026add850d68bdb603e117b486606967a0b6b3580801d448598358df5ca9bfcc9ea6a9bae394aa891eb81d841f01dc621ad5166065ba1dbd6b056b3061057bcd8b158a41d3541dde35f7d9b7c706d500343f0174682ba05aa2b0017a970e0b36143b5f1eb2c268f4eab4c1f3d067e5ed6b607d8e03afb1de4f42bd058102847b606512c6d2457be7ed4d1e6a8faad7f1aef7ea4e05e74564be4f64b74f44663c5e149157229212c97bfbef3adc431e07da54e901f780ba7fecbaa014d86b161a01ac89c7047b83e00640196027a06fb218ffa53d0ba72763873cdeaf8aba83ec1fa63505617594606f372cdbb0a56061080a3a3ceda8bdd76637b77e95e5d3d5b17f586d02373d04e79fe3ae9bd0588fbd7315b696c42a6000679c15e598ef17997a202222fd0331591c4fddafd2799113779e0ff74207dc1806208241da5efa0d873a8f93755e19545007ef9f594c8ca69213679e15d510c1f8cf597104ca15d7967f301a230c0c0e13c1204182285166314f159b6b263a3a7f01720e03359fcbf1530000000049454e44ae426082</data> </image> <image name="image2"> ! <data format="PNG" length="1017">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003c049444154388db59551685b551cc67f291172a5c516f6900b2934d0311b18b401c1041fd60e1f9c0ace07a1880f565f6c19386605d1a1b0ed615bab28165f9ca3b0ee41a59dd8a5e2682293a6b0d154d6260e1792e04a32dada5c9a927b99573e1f92ae0b763e88fde0703870cfef7c7cfffb3fc72389bd50d39e50ff8ba6c7d571e2e44262765ce513c36afd7fa067f4f6f94fd365dd9772b9aa068735f5c88f253d726cebd41975cf8e6b71f6ba6a5aad4d5f5e902e8deaa5ddb89e8ed7731a391424ee9681361cb70c6e1b97bfcf58f64ca8edf4b9d447af06c21ffa7ac134c12e83d106a5526d3df46ed272b6a2c1afbef0580de4de3169a15a77b22155254d17a5f4efd2fb6777dc4992361b1dab581bbdfd735374aba3011c19ce4992e6ea9ba68b523a255dfa3aa706ddaf9fbd51671677d6a746a5defed98648bc7d8120d8106d81ab4b105c875027847a828da13d0654a0ad0d5803731f0c9d836810f20ee4cb7d9fd03dd70d5170c1d3733ca7d4c74192153057a0ecda840f1affacc69f35f876c6c157321c3914c26cb7e90b18c4b3368e6d541cd7b646cf1b2d5e5f2048aaee7802c8270c624b106d87781e22ed90b803bded90c843c48477bec9f0f95b21e61d00830fe6e1c87e830b3fd352b866ac42fc274fcfb19c529fd51c8f5e84566f8991e74c161d8804209685b01fe2b7a12700b1db36be4e03670516f35076c1f04279c56671c6f8cbb192e08dbee9193c2b8d1d030c308e66b0a742701768df49c12e41de0b93cbd0d50c934bd0d502938b10f1c1e519b0ee61e1a4eed21c3e00f6016f229b0723c8e96b367d3d216cc06887ab4b36cf1f349858021398b8099605b17b369665105f2be16c992caea4c00dc3566a156fd80bf10cd9c385263a6a1953327839020690ac40a8c3602401c1e65a1c51131c07f01b941db02c13cb029ac34006bc61f0d20a91ef009aec6c86b001633f6478e35988af41d007b10274b5426c19f043fc0ed82e9496cb58257028e1f3016e0608819b022f4fe0ce5f01f00c9c94cca7c0acc0d08b400b50027b1f4cfe023dcd9028d4b29db8095d3e486421522f68d40fb15fa1bcce1f85957885c2e15a03f85f4b2bf29e347da3faaf9d96cb55a5aa94beb521ad4a73c9a29493667fcc69e3963430bc203aaa171f54dc7f5cf2f7a7b5abb6cfdabe1b72aac3ebf7c47549bf49d33169e0058940f5a1b67e7a4e8363bb73256963f321c79bd2c28d6da7696da4a46f2717544c4a74ce36bc711e9e91baf643eb934001a2018817c01700a79021e20f9128d40a68e793e0466b7f07e038717c44b0b6c059e70a2b8f1f7d00d61e3da67f03647fc2bcb47f2f810000000049454e44ae426082</data> </image> <image name="image3"> ! <data format="PNG" length="929">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000036849444154388dd594bf6b5b5714c73f2d0d48e04106179e40860a32e8892eef4d7d170af5a3934b97fc0999d2a54ba6d2312d19820b850e5dbc94c693ad0eb16e872457a52d4fe0d452c0f6b38884254ab0442d2cd10abf0b79703a48892becd473ce72cebd07cef99eeff9016f9abcf5d2388be51603eee2407dd0c0cbf9980e2807a241847214a69de02d43ad6d08f20ad336a88262fdf70a6ec67da09bfaf3da2f6be3b90c8fcdee4844e4f8f8544444ee7cbb2d9b5f1fcb976b9b72959c3e13b9b3b629c1079b3fbc8cf7f64b23707ce8423ebf38fd18e6a90c3481a3ae2c5bb7202c86d8d47c7a21b0ee44e040dcee037038aee35ebfc180ee9581d512549a1a527bd179bc23238945e4ef6979473b2267bf9ebfff4fbe5bdf961fd70ec47dffe6e80262d336e040d49922cc9512b21fc2284d00188da6ba7f32afe3bd2efd4119ddd2909e037d1558e503a20e784b45923a648659aab5180659b67e06dbcb72ffa708dbcbb2be01fda7f0d5375b749f407fa8518e22f90f15e71cb70d9e03bad560bc0095fd88f24299ca7e843b824ad3d03ff1b8ffdb164eafcb7a6d83ee73978d3f3476e2bd1e719057d083b0e0d318c6ac96148d31ac9614f56b112bc5105243580ca9bf13b15a0a59ccd4592dad60d388e04580bdac79f7d63647a7cf44b6cdc1fc8cfe75262222c747a722672207f191c8a9c8eece81c89f228fcdaedcfcec9e041fdf16c7b971b179ca51984e0355289f673b81c577b3d3f97616893b50768ad001df29633a0d02c7c75a209d477cce71cba01c1fdd8ae00544f52e4cc03c8c492c541f35c85bd87a14d16dc3fa4383d376a93c3158eb63ad9e63e09ce382c274c0cb29780eaa54842184a532cd61cc27259f6808e17545e35ac4aa1bd2cc809a6e1c41aa2e6f9e6e19dc24411f562107d1d3187250dd6fe02e94d9da8ff073a0f70cfe3f1eba59c59d58f45e9524b1686b2e47ac1c0f3331a8d974a8f7ca985e4c58f0897aa00a0ad38d50cb212685a018524f23569615360550d8d9325d406cad8f3e9c6ea0e9c5048532a6d74015c0b42354aa305d43c0ec74a60add366013ece4351cab25c578a8f1165c4cab41e09467f7d8c7b40de1b28749ab04798f9ad504cb3e26d5a8259ff1640c6930c7f1ab43bff2d1ed5bd60677add5e40bf9d9a50a485203691648209d360a98f933d8d4d2ed0d184f4664c87c61d3daf7bc91f22fa44733c84b07a7d30000000049454e44ae426082</data> </image> <image name="image4"> ! <data format="PNG" length="1077">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003fc49444154388dd59341881b551cc67f8da9ccd2552690ca0c64a1815d68827b98c1cb3c2874870a92ea25f5544fb678e99ea4682bc5937a286d0f0a3d78d85ec40ad2e6649f60f1eda198802d93e27637c10d4dc0b009766d824d3b4f3bedf390aeb6bb7be9d1ffe57ff9bf1f1feffb3e788e319ff3a2f9d9fad2a8538fcd0f973acb1f973e340778e57918db83179835bfb06ccc11637effc998b5b578f9a3b94fcd012636dfa61ffc6a4ed4bad1c9c0f1a10fda06d9aa123a826a1f84037255114e05d07b3bcdacdcc5f50b602bb85eb48a595d384ad9824afc0cf947b56c8c31666dedae31c698e3a72f99e39fad9933e7bf33cfccdf0f8cb9bbc798db1873db32e65bc798d39e39f3fe29e3bd76ec8bcd8a5381538436b86e06006bdda5d797f8aed874da8651076c1b5a166433a8511e11cc43c25b5bc0aa1581032bed1e008d619da3d3657a349ebdec7c0053ce18eab80cae833319505992e8446ff12325723e510b8a8e0bc0d977e7c1ebf1ce1b4f29ee7d0d330e3432907361c926b3ef132ab878b607db816543e13b10b5da00d8afc684fb8a0cf4d88bc19d01d8127a75c8dad0b4406788da7d0a5a209b8a38d9c22525a642e840c1cea36a2b58eb135c5904fa135cfe3e22d3ef41bf076e19ba16e4cad085de680eb92e118e80edc0aa7185d801d98c284c16a9dc8a284e42e55695c2a040bb7f0ef22eacd621e712dfac51edefe1e24d89d631b2299f027b8097066f472a980a51ad15c29c4fb40ea5bd3ed130a2342d68efbc407ebf809e05b912b46c2608a8d8454a7b4be8048287c113f38eed045e066ce0a5946c488453a4bebec2c139c8ccc0a1d77dacdc80836f06306a809b814e04932111139c7d6f1e77566321904309092f402d0bec027602bb52622a447520c815fffba03b90d99d81ee0264caf09b057b0ec192c29f3e42dc02cff6198e2422119be2166cfcb11cd7b619c143a8d6da3082ead52a382edca9c354095a117137c3f96b8ac6d2808bd72e13c71a39929b6cab013c4e7939816c55f1b33e7441eccd13ad8398f6a05b80ddf3d01bc0b0c0c57481b9bca09656cce543b40610e824de50fa08b80f0c538b4d8577cf432e29b041dd5ca16043f546059c12f422e8ba2cd43a7894900d453c12c886822426d60ac040ed4fe00fe01ed4ff4a054e801c2902d723ea40982b4207bcace0ca57e7e08666e16a0d6fe6302a51889c40ffbbf586d2c750bf0ff5475037e3e6352542fb6c3450755620076a55e177db2cac36f0ecc3a8b60204aaa308d321d56e1500ad17b72f889f1d47c69bf4899be374a856155128a3a64b84b365ea694569268427bb9a5608c7470f87a0e36dc13be6f61f3fa1757c526b8d9b2b43b20840acc7d1d189c202f493c73ad15858e844d3eef4198e065858c774b2f8cd56fcff69fe014296f62dc95efdf00000000049454e44ae426082</data> </image> <image name="image5"> ! <data format="PNG" length="968">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000038f49444154388d9d9451685b6514c77fed5249b083065a4c462b0974ae0d3e98b022b9e843c38491296841842a3efbb0471ff541348866f86404b17d10ba3e6c59079a6630d656264dd12d49e996446acd0d6dbc37b4b1092d24a1493d3edca4ae9a54ea79f9dff3f1fdfff77fbeef3b073a84ac8b9e5a939aec494d9af8cf3c7c63e17e277ec748a5b54339290e44645db680ae76fcee4ec22e87bdf35feb400f54739db774144e6fa86dd7ab2dd13a60fb1fc2ae41e7bf17eb60e901aa062ee6164f2f9cc8a5db3a2ded031628ed57516cdece96db85ff927f4434393c7651222295266e1b10be1ed9753fef7eba9dc6d18dfa2ffbafd0c0eb7f636262d23bf95ca69639a3783d549be597f6c17a16f49d2af6010ba59d2ae420fa6bb496594d3e8c3d88ddb5982cb7a2f7a246a9c15783673e0e047f930311d96c3a8a89485644f69af96e13b526ae1b30351d363e9abcd49ac84c203cdb72fa9e8888a6196c4ddb95ddb58aa4368dbab35a7b4c6d56a4b22d12ff392eb22d124fa444764596efc7c57bd1abb07c3d9e6c9d590bbfbcb17c2c5fd68ce38d6445b40391997511ad2232b5265259379ca6d215918451e5f84be35f984a6775070350daa9621db0a0aa3ae9ba42e811b807617a090afdc02a9807e1ab7bc020ccfe60e4fa4a8c0fde5450f36518b1a0e675ec4ee7059362f33dc53e58072cb0054ea79ddc8f906cc0d59bc010b0d21947ad0a14c179de6ef0cfdbb1f75b9fe90edc0cd4ab394824551882d24e09bd082bb7814253e4049ccb183c55d50198ff3e865e2c1d7645420bbf33643ee773282ce6c0e78064398d32ec627e035c36b8f50bd8cd90d461d20d99224c0c0379b00cc2fc6a8c165f71c0d54fdfbe6b5ada88fe71ed956be716f309ae8c7878ff9b4f309b20da98c36b52083562984d506ec0b84961f6b19107ee80d7a4b0d48861ebf763e935f88bb904e55259eb76f7bbf394c137e2215648637e50432faaf8c77c64fa124c8ef9e9eb3377cc9d0d2b99c7217c231e1265f0393c546bd52d265e9f78473491545a13d916097e1614d916c966b3c6bbfd0f8c7c1791d4d75949a5b3227b22e1b9c89fa3c3a32f30f5e154cfccb7e1da5167b5baeb14114ffcdd990bd3cbeb80a90bc07dd1fdacef65df47fe5eff85bed76c2f7ac65c1da7de5134a71d75d01f566ba1db819ff4a2be16bd13fdbc5028e48fed9d0a852f9fca6a6bdaa545c62f055d4f6a1d73e6ebf5bdabaa3ad49beff2044c67546840fa910afd002b6f3da9f5178bbd39d7a62a84ba0000000049454e44ae426082</data> </image> <image name="image6"> ! <data format="PNG" length="1148">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000044349444154388d9d954f681c551cc73fbb7d896f24851d4820a3ad64b482bb58e92e54d885083b586837a72abda415acc58316146c28d23f2236b79a7aca49fc03c55e4a0b12931e2ab387e2ae60dd1c56662d814e20c5110dce6086ceebfa683dccb05b0b1ef45d7ecceff77eef7ddf87ef7b93fb0676b405e78e8d4fceb660b426242dadf83fd1d5aa6f6f46975cadcee64ec317f3fb1baf072ac18a233c0d25c12351e2a12809890fd842e2a3b08524d0600908006bcc20d4d0fad6fd32777b72f29efd5c71947dc7605cc1ce2a6cb487d17660c385671b69b46ab0d14af3be3bacdb0e2c2d42b7c0673717fa79174689233c1180aee2fbcd619c9e25dc91c01bc760da82d9c324cf17e0e061fccd0e5023f45dd035c2351776cd12aa151c18cd3b42828652a182175dc51e2b836a62bf761c8a0666b1c4c3c39830613bd80767a018624e94215ec962135338b4806dbb1f971f56c6b6d331b678418fe0fdb9c6c4a9f7e1b17421afe932b114e27ebd88fd5d8bcead35ac272ab01d78d2222908465a8270d3c5509af0f60d267e0bc83b4007a8fc604014507a6b7ea06ef983794a370258bf84335e8628a2a226e19339b8e6c156768269300b1588234c51c505f2ae565480e53b5fc15803ac74d12b27e79859f7f1d65d8843c2a284a3a7f17fba0a7142b0b40817bd74f2748d4ed4015526d42e5560c0d89112f6c974e2d2328d6e016f2ba254a8c0948d796006769bd87b5e8138c21aafc0cd05d8485b2a87e6e0d7ab98c2a1ad33c50868031c980120bcb6422f5aa1142bbcee1510ce008f7ba70d5b8aa0bb02b122b9fc31008908200808753b555c45d2019cc2ab83e6956e8f8a2ac366402956a0dc41cd99ac421c62a93284114664a66ed9698130304595368a7c3363dc62d8dc10e0d10621f1b4023db49bbbde4c4f956d16ae0ffb8021e3ba48b9d614035e727791929020a0241bff6874a6ea009832c563be7c7c50ebe864c8b8a9559a44419ca4c73a3a8f479af7b50bd41e516c106a1704b0339b77dda5228d871493f958d4e1d3b36977d9a474e83408b0a584d58534bf01d5d54eaa5438b0b70af554b9dd4b40484ce1d08421638f36dc68115c5b062079d381bd2708b4029510d41d987550021090ec053e3a936ed84df0971640a4ecab40eec742e14165ca868c2985067c7e667051e826707901b060dd85fdc7d317aefe10f8033320eb401be2328bdf2f903b3f261fcced2ae20986ef6dc12478e76dacccd7ff3aba21ad9347a8c9ec628d40f07b48707395bc93f9b8241b43a62ac1bab00aa7cec05a3270cb605c77e1c21578ef08359949b753d696001745eebc94f7e6a6ec51bf5048ff08222d861a4c611092600a035f80adc1d709b634800c5da694bf80114967ad87fb73afbfed5dc433dd3c7b6ae4f0ee6b9ed635503d8c3e782ae2295d03b5867957815298f75f82b8077d0d7723b8fb22c45de86b3abfdcc1de0c69feb17931770276d4e1dcaa60560a394ae65a37d5c47ffcee474a5daac2d9bf0183dfeba6a73f64520000000049454e44ae426082</data> </image> <image name="image7"> ! <data format="PNG" length="666">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000026149444154388ded953168136118869fc40bfc81067210a1950cf74315020a895411a79ce3a585da525c1c1a7573a843c5c1c1419c12908a6e867472cb218871bc80838381de50ec52bc1385042ce6a0627ecc411d92566d5a9aa583e0bf3cc3f77d2f2f1fdfcb1fd9d9d9e1385ef45854ff4961ad3c53c6c1c1c4dce3a3dcf2a298a4aa3659bdbf562eeeaf8fc288356d211028140241fd646d11a896673c9ebd95780145ebebfcea6e7d54464d4c140a13135bafe549532d5f85dbd392870b303e49d5d66b8b7ff68dc213b1333104822789952c51dedc9b6a896b1712d43fc0c5533016e9f2fe636cf655e4f2a7733f6d77934d0482a3183531b113b52c699c1b5324af9c9ea0d284a40695269c4fc5b979098441d54e8cee3cc2c28f2c5adcc9192433e3a000c1305bdfc15907c26e71ae7bfdc89d4749c71d42921b1ad84da86f414b412e0581820de04513dea9c11da5e3553b5ecb1eed78f65b9e980ebd0e033ece65f4ac107da75e00fe17027a9d22313da0d7612ebcd538cca9ad3dcf12d39d6829ac34ac6ea1b14bd05d6f0b48830a61fe2c204882fe801e6e29ac340e736a6bb53ba0afd1a33174c7364ff3c4279c8c0142fb9da4351fe812107a2b6872d50a0b7ebfbf6ca0c959426f094d1a845e802665a4345d1a4ace5d961d32e4330006e0836980bd0eed31fa8bdfcb2e101bf46d10a0615a61c11d72ac50d4799d04cf232193466a301c1e4ca5a01d00db5e00d2b428b843c9dba545210099631bd7ff0cfe16a8f1be08e93e8314f86d68b7806d5e8294160577ef2a0e72fcf7cecb8b2097c0cba249a003a10e783ec806782b732cbbfbe722ff7f906317fe0554a258c9f73888670000000049454e44ae426082</data> </image> <image name="image8"> ! <data format="PNG" length="682">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000027149444154388ded95316813511c87bf94137290c23bb090c01572d0c1400be7663be54aa734424de9522c343a5a90603a3939744a0685e2644d06db2d714a27693a3582426e286468210103093470070173d0833a9c893151aa4307c1b77cc37beff73efefff778beabab2b6e624cdc48ea3f192c65ef672953c6c018702792d699e1296da2fe30e1c7120805763e813f8ce99cf2ea792d9b1fdd374c5f2c1ec38f1f0787a3a99200729a60e5d17c9d745cc372419904abebb1506e51ac84289e63020f162f961bfdfdc39c3030bcd0b9928e4bbdb4c1ca6e12d2710d9aa0487072e6913358bd17e2c91a9436d071a91ece958483433fa74f5f2c1ee370b2a403e5f55904d4a9b6356a1d4002e1efb13e2ba34d5bacea0a474d5854e1a8092715786b729ce8ae1a63c687919200caa88883531a07b696aa75d032ddac2f662dfb6c216baf3ff262bba2d85b39084ab0f7d9a3a242f00ed1e264213a66ccdad7f748f20a6e2f95e83d7c397a729f45f99d4092cbe1db3d7d6146c601fc40ad0dd506f958773939bcde47eacaa28991e965cddf75795b4e4751812602955c4442aceb50698225a0f2011395144df8beeee75bf14b53e98dce2da50a3df0cbe042380821e1193b40f51c1cd7eb098e0528f6c4686d469971f74c2e49a2ca4482f06c094201cfcc71614185bb61985f826000b8546c2e31ae351e98b3bb8914ca85a7410930a8717fd43b605f60e3b68c045be6b5c60373f6f3b8241b5fa065c37cd03376825e03ed16362e46867d73708fffc4f88779761349cb892910016874000ba06e24481f8fbdbc3f372fe47149da17d068f7434966281c8fbdbcbf311e32cf81b609f56482747e74def7ff07b9f1e06fa3b45d25fdf824720000000049454e44ae426082</data> </image> <image name="image9"> ! <data format="PNG" length="923">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000036249444154388d9d945f68536718c61f472fbe337a7102154e60c209f4c2e82e1261172d1b988e81acc252c581c8205b65d0fd61f6b2d3b215e7958422e8455925096d2aa824456a2e36765adc96805b9aa03415263999481244920f0c39df45e0d9854dec3f59e373773edef7779ef7f9de73401224b1172da5b23acbcc31fdfa860eaf1b70f3019324c927ff0f7e6b4fc40d690a4100b01eadeef6d250d3a2bdd3fa1ec4324992b5fb5b1b8ab16628bb5ae486ba8fe2372b4b929c8f353b0dd99be510efbd24ae3d7805ee2a0abf7e044edd81bfa10000e727d642b2af12c10780f3c2819673a2afc6ebc2f17cbc4992bc78699ef3537f869ad6c6f06572ed4e2d377b6d497f33c70d05fb9f0a54c30fe145440b008587367efad9ce277289c0d9af8fcb766d57e0e586053cd5e1edb771f2f820d29902d67fade7e5f35460f287b372736dcf6e004e98c1748ff20d0a810254e9f0f96a1400ec928db85cc085b151dc5d4963e18695470b81851b93723b630bf8f698619e7c57247140f9068f7d0cc80c0eb534b0577c8703b812af00674e8de2c2f475b85b9ebcaacb406229bc030a00fbda1717ffc2ad9f30606b1f291dbd02958780fb3d01f4018006e739000c207ceb08646915eb75972bb50bb4cdeb80edef3d11cfc16a083d3a9c3c3e7ffb7235cab07914235846af06ec174045014f0780750bd0305eb0953ce4118bfb3e2dc9ede0ceba2d7dab9331c1d9d3c674a768cad46b770c92265930c998493ef39235efcbe79a97c519b3ce4ba66f3378cbba0df703a8025e47fcdb3e731a6ada75104046017f210f1780fd009403bc330448c0f3a5a6170492afcdd8fa4ae3904f21fe872e2b2f44d4ed82efccfb380ab782f3bb9ecfb454606844d4d1a7808c90b654e31e884fe05741e802d69c1af9f07275714714d9a0b1cc299029903190f70519d6590b9b91db63860e00bc6e9045939c34cf75464f9836ef196c86cd1f37f33aeb966860249531a6fd25151cee851e5f41dedf12570ecf95a29df91a80f3b784927abe7d7477599586c795999adb653df6fcdb9c306ca675ce7e66440060f6b4a173c6a8332e589cdceab8ab4fba50122b589718ed57a18bc78ce40090735a551d8f05acc76af18d1d5f3d6598e529a3ce6b207f013903f2a6e0d5a0d1d98a1d19ef45dfdcaa96ea8e1138a11949f9489a7e2510ae88e81030bebdf63ffd833bc4e1ac28710000000049454e44ae426082</data> </image> <image name="image10"> ! <data format="PNG" length="489">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000001b049444154388d9d95316bdb4018869f0467c890214386420b19da453fc1d0256bc78e81feb79a6a6a4396866c1a327829c49344e92248c12a2de84a025271026f8793ec3b59f2d9f9e0f8ee90f8f4f0de034212ca24dd4b69d3bbe74ff1574962976537f75aabaab2bd2c2b3bfce3979d862389345b1f6ca7da966692aaddc8f724c103e208bf1e810330a6e6eff53fa64f53ce466392a784f30feff708d532e3be6ae2d06f490b29bd95e637e556d4fb00bc1cf8ea21d40f359c40f63d273a85249f066197c48319574ec63db66883358356b443e777a5363d5f59e30fefcf78e164ab86acaf4ae779c79af58c1b1bda6ccd9fbaff0e1e81636b4d3133c49f2f1833269e5c6938e3ca270add416b8d1c6bf6012287a8aeeb950d0d51b4a5359c4292272b2b96192e3a24eda585887fd87d9a758897191e405d3b244796b82fe3f6bde2a7813790ff2a885e3b9e7b19579d3e9471d79a79d3ef3ac48733433cb9a2b834c4930bf2cbe67c6dcfd1466b0cbc80a230f0aa9b716805ac71c9fd8c43e559c39a352eb9977168a5216b9e4b1c85acf1889f93f180357dc4a36d888b9921f996301e9d797f92a1f3f9db77fc075258a07f11d712380000000049454e44ae426082</data> </image> <image name="image11"> ! <data format="PNG" length="865">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000032849444154388d85953f681b571cc73f362ee841043eb041071254c51d2c30c8daee4a07df969a0e2d6428a54bb4b553e738748833189776698640e40c6da6160d056b28e4dca1910b6e6291625b50d12bb6c9991afc445cfc0e2cf875b8b3acbfed0f8e0f5fb87b7cdeef7e776f8211b5bef6ddd76ede2dd6833a5edec30f7cdcacdb78e7e3b73e1fbc5744462d315c77ee3e7abcf7f04c06eb9b073fc8bdbb7b8f07171d774dc88f8bd304d117e4978a955da617e7578aa55b76fca401d435bffcea09ef4dd32844f7dbe4961abcff606807dd7abe36bf2baf3e958bc37579bef64c9ed5f74444e4d5e1d9300f45d6efdf13917539abdf16599bdf1d673c595af8b0889d47e53c6a1d1f375b806db0b1a86fef63635de7e37ddcac0b80e594797163ba384e78aa1ed47159055363e51358fd76150f179f3a29c0a7da97bd77013cd0354a9dd4f89725d52591d77744e4e958eebd149133114938981f559eca502b367f8f200d9cd620ed24eccf852c60010b310b0b605271d61d43f9038fcac666dfdc4d96322e841a661d086b0907f2f1f04e95023458b30a8ea17c6b99ca86df5d7cb2d6f4c10613d4c6333ba28797b1bd3e35043b86caf79b78385df3492793823fdaa8ac3b96fb238c7903388f8df33715e58f96c92f28bc9c171b6ffd1541064cab16b35185a936e6972ad0c6fcfc24eef1a84a83d60666e045338037c13ff2e38597b20eb422d48c03bf86a81b8bd034a88c819689cd47190318b02c052d28cde5d93fa1d7780b3211fab72acc44e8a61fe7663ba13fb2c726f9ccc3230d73109c680a737dc6296868ac9945684558d928a1d3cd433d36c9548460e72c3881fcdb31fb7bacdbe8832db88cd00751c2ebdcd7e3cbd8546b03763c15e412f37caf71c681c860e5cc78f61a5f4d83a5aee7f8cafca8cfd8874e4478104127311ecc3dc6e6bc671a9239c68630d490eb319e3f57f04f849d03a2082b1741d49fbb3d36a0d2238c4fc1b6fb8d274484959b05b1d306670ab63b0cf1b38741fcaf488c551a8c36284ba14f0dd6ac220c0db6ada86c6c52bebd3cf19fc74bf77a999c4f17095f27bc3ac1fe4e7828f2e74f1722224c8d19fdbe0a760cfe8e8f8787cfffb3cc32ff02c02280d74faa38a90000000049454e44ae426082</data> </image> <image name="image12"> ! <data format="PNG" length="1138">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000043949444154388d95945f485b771cc58fee0f0968494021190e12e83a231472c3064de983717b28d687c21eb62a63b1c387ca062be2c390c1c4f9206d19057d708d3a47749b8b59079287b24419bbc99025b1aeb9912a8958c915957b83cacdc516ce1e12ad55c9baf372f8fe2ef7f33bbf73b93fe0880253619b32af8d05829a9a4b680c0467a82c6a0c04b5a432af7d81321223a4a7c3cf130ffce3016f66425103c13095c764381a277345d7d6c8995098b9a892f48d049ca7813d1d3e3a2ef71100c2e32c6e3038e4f7662239ce3c20b9468af32952219920b9498a8b2972876494cc4573eae090df562ebda7c34ff4f5fb6cf1e18c1a0889648e8c2fa6c87d3295c990fba49848919bcfd7c3d13853c399d9e3b0aebb22aff72acfab10c753dffaa766a8ad91f14516b559b4b8549a25921a997a5c1c03c1198ae3a9c34a3a07340e0e29f474f8d975334e00a80cad86ae363baf20b69e80ab1e90b754a01628140a70d501b2ac020e20bb2da3e12d202bcbf8a0f10a422bc14f0ec0fa9e8ee98520a00b8864230080ca265b932db99140d35917b00e586bcd4001301a8dc03660b59a0119b0bf6905b600bbd50a3c03dc968b8789d32b93705509c8ab21e87957111cdd88c16d7321ba2e015540f41f0900202d67013ba0ee16002b20abc5931cf8ec52e8b0ced88f9fd923cb11e87b2ea4e7deab0000cc0c8bd4a2c55ee312c97d92a52eb95372e5d8bc43fafb03273ee0515506ff0eaea20e88ae4b70540189952c50ea12d580aaaa80b9d839aa4b0e20f428b45016ec9085fb93b3d3b8686b80711b70d5d921654b5d6e0166f391ce51f4dbf78620ec368d970587f622bd91b9583eb29400ce028955090d75a5c4b5a5c446a0f0b4f88294ce22bd20216bcde6cb8267e746f3f213b55d4de6115d91e0aa6f00d68f25de058caf01521a48fe9a80bdde856667f3a9bff6815e0180d54c72694b7bf56136b374f9199f1a1ade39876c4e86d95a0d794b45b5d98889c9694cfe340a434d353e7ca315cbdad447d3c2f2d7ef0a06dbe4fcde6fa78201607535b9643ae318ae7e68360cff3e62312955a6d15f7e00d681ee6f7ae7aa16acbdc6b76b7b8533c2cf0f56be6b6c7b3d6b32d6e571ae66db79bed6649b5a380947df08e9fed847008672c73b50ea9a4555e67b482d4e65ca4d7e69a2ef9a65ec858e0120f6d704f2b21d00f4c01429b4dc3a79af1ed16c01370dc910b09784b9e5362038f0e905dd7babe545f851d579da7d743486cb8201a0e77d8b37d72d909b3e5213a94c08e4e726f63496e0e21f64d75d91be11ed3f61c7d575c9e2cd0c08e4a69fd44472c24daddfc4ce0b9631740e84d9da9da3a7c347f7d5e295d7374e7a3a7c2fb5d175a7c99bba5182ef88cc8d08ecbc6463a5abc68d7c3e02d4b8a123060088fd39818d278e974a3dba90fffe4e4c6e97eedd01b6d3483f6a82f17c1b2a3ced3eeaba007d37027d4f477aeeab8aff5b0900b43a4d632683c10b471b36b6dcf7ff05ef61a88aac34230e0000000049454e44ae426082</data> </image> <image name="image13"> ! <data format="PNG" length="963">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000038a49444154388dc5955f685b6518c67fed5ac9010b27605d6a2966b0e21a262cdd3a6871900dc151e6a8ca2efc33560782ec6abdd88d5e287825414aa1b908523aa5d59b6e95b21d70d056949c49e749702367638ca66c9a84b5e4142dc9dc228f1749db75c9e66ec4e7e6f95e3ede1f0fcf77e03448e27f5534e644a271659e7a213ca3e17f85c61d73d156460b52c252e469b88df732de406f4cc3d198733a117fdc52f727e62e82f4809d499e78f8c6773c517fe7d48c3efdf89294b0a468dcf11296820fdf272c45b4a00d156f4ba363dae3581a0f0f395ef073c977ac3650e37cc63b9b3121b5e602dd662ae74e6f5620f3bae78ed3b3b9b0ea2bf1660fa91dfb187c6777b7f96ea70770e25130005d231a5fac2451f1b6148d3bc355f0b0ea686aa6ea9694be2a05de77e43b22b316fc8522a7668a72c6a489f369495234e60c17176ba1c5a2a43fa4f4cd825494a2314727c7245e9d3d5d3775f8bc3213d5ae55900a372bbe45f7d7e952c1ad78fa4769d492cc81ad9f62e3fac1bb961bc90420957329ad02012abeae07403394fe040c48ade4c0807c538ede65e8ea7283bc5218a8491c1c937970444adbd2e8587a4b979b3d54fd6e75b42b1e8d3b9a4d4aecbb305d0306089ed178d42ac81993d26ea587752f56a185bb9543a120659395397b551a9dc92a704c62f754704b1500f7caee88e1f33307186b7e00fc653f3c00c3003cf0b71a9003bf1fe6962a731b106e6aa33f02d037583ff5503a95be5a796d494a24b31b0925299bad249ebab428dddf9c47bf4a2b9a94d8339501d8f628d8f77aecafbfb73170b4a30dfb06bc76a085b99f20f412b00c2ddb9b2103a1e7fd50aece39d8dfde8a7d05ca5d2173e956e7af35e0a6178f2ee5efb67dd8d69ef375fedec2f2331ee180c14ab144cbf6663c0f5657a06c96305a9bf1964b188dcd4c2633ec5ff3536ef798ffbe35d050af0edfdb8af41e66fe2d030e3e072113080265e05ed577807d05cc3258d7a0af03ec9ccba10321f69ebcb8f5f1361ef1db861fe6a7ed217b192ee75c326538f7b30bad60ff96a304c4be76b15360a5921c0ac3e49d1cdffc12626fffe477e4bbdfa89b7843878be3173e3206f37997fe9d21ec3cf405c0baeed2db11c2ba53497fe6cb8babe4bb4760ee2cb7de5b7a22b30a367d476653d10569ea525605579ab016f5d9a414fe20217665e7d93931586ff5c9890122c5a069926a7bd930773c0bc9cbace66f9c3b0b7d23dc78e1b1e91af41ffd4cff01306c8f09abb13fb40000000049454e44ae426082</data> </image> <image name="image14"> ! <data format="PNG" length="3835">89504e470d0a1a0a0000000d49484452000000300000003008060000005702f98700000ec2494441546881b59a7f70137776c03f24e222dd9846ca988e94ca53edd5dc581a3253a930532bc935e8929960930e98733be0e38f60fe39e0a69303feb8029de680bb36c4334d83d3e66293c91c8636c64e9b582213e2853960c5045833014b04bb5e1d562c25769106bbda6d50f8f68fef1a1b621b4c736f66e7eddbefaef6fd7e6fdf570b84102c58b0800781331b0847fd3c666658e0f2839a85981fcc0cb802a06620169034014866a0360064003f24b350eb07b277d106a040d2806099df3ddec310700b1077f3b060be029c594738eae09f74f84104d08108a00151402f43c4015a19a2b3e169f77f03cf7cff8db8c9af57f5f03260025f3f9000620361029cd0333c1aa9068a5273a92c84fcb6660390ca4028700f7a9ae66f3f7f379d91b47611a201e84af3fe8f7a68b6df5c7e1001323afc71a4463282c26d73ff5ef104e8e72152845773fc62c769fe192800b710e21b6e3533f33fe7c50b1b10e24d847817215261214afde2f70ea533f27d09c4994644e925be009602df0578e8beb807b40c2b22000ea02600812e7085a42246413fa7c2a869e36f8f362d1facea85024465a0ff61d0cdf72605988f054e890d08a121c4d07ea99daf24eafde8a83c19b2b536746176faeac8dcebd369bd34f59e4f0342ec468897101b97f2b74015f0d07c2c2003c50094ed7033050b819b3a317f849ca18117d4131aa665d37e6c3c45ab19f50efaeef53b698b9ca1caf7585170c8540d3c0c3c023c3c1f0b9cbeb00121521b85284df34f2144e9fd36514a0971e0b533e24c87107b5e2e099112425ced95dabb5ab271af10a9fe3be9bbd7a7d1fd9f1c15425c97ef2bf54c59a086bf03be0f7c673e162002904d82cb84f138b8c2a8c7358ce1665a8f699856148314d132b41e8f833f4c2e13979acd485acd9cb883be7b7d3a1df247c80d24e4fbc6fa00500d641cda70df024403f649003054c8d7d3fe6b175e2b4a129ded6ba26cdf004deb43e8157d048811ef398ccff2a09e6cc56779e0643be18ac01db4cff2a07eb81b5f360347b6e21bec433db2095f3643fcf8abf8fc41184f4055148098825d01e629809601fc0da8e7b6619caaa7fd844eac022c6f8ef04a0fa1631116bcb5802d9ddbd9be2eca898c4ac4dc08d5105bb91daa8195db31484fa3d702ddc49e31c1adc31a37780d626bdce0d6a90fe7c9fde6cfa0b80f92bb640cccd702a54f85bba75bfc2cf853f14457780fc1aa66528ba0794d8476cf5ed4890efac654529b75f66fd8cf1ba32d60c18aea187bcf26c01506d3b4b14a241095eee7b0e0d2abe00fcb0a1c887d13e72d7c4b808b7d50919c9f057a12fd4ae953f10b3593ca4403b4a8d9d41fac5d16c270a77055abd47f50cfce67b7d1f45413eb97afa779a09956472b58109f5029561858e528ea0709705930ae822b8c3e98901abcd221dd31abce819de48691d6ca727f16104342e955c53bf5d5a121b2ec8efa438f1a6558db18a239d94c7a2289d3ed24be310e13d05deee6b1538f71d07190cc600656c28f3bd7d2b42e04658dc2405432bf2802e32a910a276412506d6bfa1ed8b704c8db42cc6081dbb25cd0865644fccadf6b19e30731bf829a35883da390cca824ac042d877374acefc0300dbc2e2fbb8c5db4d08295b160b211ab0167de895569d17aba83a64013ad673b88561ae4aa5422de22f1532af5b53ef4f7924414a78d99999eb0c82d06df9f221bbb192c801002a18b93e24b21ce6842881179944a4234b43788de54af1037ec8a7bbd57f48b7eb17968b36008818ae01a824f10eeeb6e114805c4e61b9b85739f53881b42f4aa421cd83122f6ef3b2484e8176268b310da3689bf3a746ffcdb3a2174bbfa5f4388966fd601298b9fbfd0060da2b50a00cdc966acbc45d7c62e52668a82abc0e1dc610c9f413a9d46abd0a4466c8d7b6bbc78321e0a1305d2c90ce64f4d7216c45640d7118d62264ae1523b9e27403faf12a9ad95a95871ce8d034e72976d0bc80a2c2d300d1e02d02e732cea5720272f1e3c75909d6b76d255e8c27259ec327661ba4d127d0934b746315fc4bdd44db018245c1d868fa12edfc001a781ba310e16f81603a3b07ddd5a2c348a993a188648b513860125766f9c075f605a0c38ec1898060e002567bea1925f19ab91ab818a005b935b092e0b924ea7312a0df297f310901a0fd604710e3a295805c2576ad19ed72858e0a900ed97af120d34a35b1a918df598017012656fa74afb0ba05fb48884819c0a55ceb97100698165760ccc6681c79bbe7bbcd6ab7c1ebf282f6e59be050383eecbdd242b93e4b379dc356e943185e6ca669c279d6c73ee241e30e858d30e16783ca0eddc4574c776087a88383da83fdb4b4881f0328588b78eae372c82ce021c4bc2581afd5812c63cb3d2dac934bec9143a6901661000b87938a9be12f5827e2ec7f6e5dbf10c7828fa8bb8f36e823541944105a5aca06482e82fe8d479d712f2416ac0040fe446219a37e0ed76e88c63eed944eddb2d18c3b0a55176a1c92b5b488e02cb7ce42c2791653e72567a563abad44d6e92f9c9189845805bde0967a73ac8b8afec0313da9e3b44ec728c2d955b089fada5ab3a4edc1f674b6d338c4b8d7309424b5c3000be32309c83ce1cfc6613ae4103d74411a50a5c0e58ffe70de4f269149722f3fb649eafae9d9dce232d900796480bd4ce2200abfee6c92f83e3fcbb3aa0c30428150af11571ea68a27d452b6e3ce08142015804a974019e905d024ba0fd580ac2bb289cdc0d1316f8bd98de00c630f2d3a32a0f44e9381791be9d4dda58bd076d3f9f930224671300f8faf095d6d7a25511ba8e8367910b4c88f81428800b485d028f050c40c8ef91d75d401ad63f1d426b8ce17cb907d3eda6e0f6903e1847a90286616da3024e1d4f791b0c3af1056c4ddbbdcf4c742a6b490b8c023ec9e4ac1600d8b77feb67894beaf16011f43ec9b5390e54004e083d01660518e720952d4005a406802024b339a27ec8bf588fcb30c8bdab13a90ea19e2a4015a40cd8b66c2d6a46453fe1453dd90e187362c5919316588c9c413820599e4300a01cac08be7ea2acc97e7d1c5c8be41c8785f2475c0e482d8690db837912426ed0ce817bcc070e507c8001212fa040ec690f5defc9394fa416628118ed831162cf3683539913bb50a405c6018f6d0107587308207ed8fcf8476639fa79c729159c501897cc18c3d212a92cd4d780962de07a0ef46c8168003c4f49331bc3805b5a0c64768ad540d78739580a39679a623146fc63e3fe636011721ee700b57cfba7671400e06671aceb95a83746d77fa4f02c42067519c8426809b41f87e8720f8c4224ec81acacfefa39502a9045672190035f05781c10a9f091cac2b635314083e12d76b739d975d67e834ee52d7c9395d72551cc7127b3330970cb1874762606d5f1be4b0ab99cad59071426a0abd3a0790df2fa6248a54d084b13479643d7e99c1c079e33a1128c31a012b49c41c80f8613dcee3a0e9e4c83db496e38090ae486551b4fd1a18053be6712ae480ba8590c2687bdb34c251eee79edfa5b3b7f5e12d7753918104208f1a54417747b86a30b7b623039cf91f71ced961d6d4f4288524a88b637fbe56fa4e4bd6dedb24bddf3f24621ae79c519cd2dc435af1036be4dffd62d846451881b88d22ac4d0f35c0156219bf887661dabac6fdcb3b4674749ecdcdd2b841062c466be3f35298d1c381ded96e3c5fe21490f5d1362e81d21faaf4abaffaa146ae8ea7521ae0bd1ab8e08f1a5100d8d87c4c617fb45e986738ac9d98eab88de7588d26a444335bf049e061e83b987bb0b37ffe4683c16883d5717f6e07a0e998f172303ca057a1a1884a093dbebb92be07300cba64da18bd20d318132b4bf27e7b6ad3d1decf1a7518c7d802c52d3f37cb22cb30e65c001fbb2fcdbbef31c063e03ae01d65c1ff5e56251793d31a8923c27b389f479591f52031009405f2185eb19e8fac0203708ba55806ad02e9a84fca00f9ae0b39f77819e914c9abe024ea2b464dd53cc3295e7559b79b50c798bbe1f5fe65736f3bf03be00be02ee391b7da46df74876fd86a3d2ff47643cf45fb55d684488fec4f499a61d27b6bbf524e4f9854fedf9a67ddf013b26b6ed2889033b4644b0a6ee1f81bf02fe12e9df771fcf034f223ba24791a345e0de63959b894bddaf508ef2eadb9acc4645f05910ffc0c0380ec54a536e4a184025141c262c96f5a37e19b41f330856807ab6000ac48f19342c0fd175ba8059b450332a5e6ff84f909f319f02176638fa807ea4db8c336d87e65e02dc0a8e793b29abe3ae3185d400280a78dc50ff8282590b51af0bf3ac2c767a063c1e178c82c709fa18c4aa145c16c4021e3a3a2152a9d072c4247fca225f4c506b063f4b5f497c8c8c942f906ddbddc717f6faff22d3e714dcc770f7e186d5fd6f35341e12fded32cbdcce3a37a612524f624888eb425cd0edc1eca4bbb4f6cb0ffc4f84b8d02ab3cffac621d1b0ba6d2c58d3f00f4003d2fd7dc8f2373fb89fe9f48aa7762e3db063446cfe498fe4ea9acdfc57d3eac3881087de956bbdaa5c6f6b17a2342444db3b42b4ed1e11eb1b0f89032f0dfd4fed53dbfe13f86be0874010a804be03cc7bbbf47ef7c81636ac6e8b3b17c69eab6b84a64605bdaf4024ecc11806a552f6489e09c839215209eae502c10a0f2d9d2ab98c828586555034f5ecdab7ad89fce74cb94b0199516ecdc9c12c70bfc3dd72d80abe6ea1e11e55c080488d07ed1c285e604ce67b352d532b5960d8c3d6fd1d2804299a89cfd2e9dcaf121f3fb9df9ac85f0652c000f025b2b97c20e6617ebb948f34340efd17687fd4d5d244ca825005c4cf1bc4aa150e9ed2d9d218a1f5480afdac87a2a502d19261ec3dd277fee087c83298b7f10dee18103e38cc478087ea9e3fb0b5ee8986d70a9506bb5e8adedec7d53332b5eefa973811770435a3121c75bfdf7a7ed3fbc5897c16e92a799bf107769799c071ef5b6ec3ad4231d5a966dc7b9d99e822fd0a44aa41bd6892780f8c4c374ea224863b3ed32f1e7eb33bdf3760339d47fab9f96d323e09f3fdabc1c3fb57f7ff6bdfc2be4ddbd635a11a3aaebc0f2da312be19feef835776b4a5af243e41fa760ee92e25be25779909e6fd5f89daa7b62d557c5b2e5968388962dd544b8531efc7274eaf3a0c8c01234cf9f94d66f883c6b70af75307ee82850dabdb3e3ab06344d43dbbe7b4db1dd804ac44ee01fa905f7cf7bd75f5ff85795b00596c1e05be87ecc96f2073fa75a4bb7c3dfba3df3efc1fe79545e4df1ba9c10000000049454e44ae426082</data> </image> <image name="image15"> ! <data format="PNG" length="1276">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000004c349444154388d8d937f68d4651cc75fb7dde97376e6f7ab9b7ccf6dba9bb35c6a3adda20d8c6e9ad889190e29902084b230eb8f2106211962655009ea1f46160a1a49ce722059b899e6dd48d9f9637963a7bbb53bbd831d7ebfd6d7dd3377bba73f76b331117bfff5f0f07c5e7cde9ff7e771304e5f5f53935a13acaeaac41fba8eed17ec09c519a82ba3a12d46c45f46744b832333be6ebc1ca3870dad4a508a4b5ecf4c4996ba8f85e119afc190ef77f394c8e8895871e6550c77520b25bfc2f6ee6d6b72641f09ded0aac4e272be3899e025bfc1a9239dac892c679ab4402b42894e72722e8532015516315a82af076aeba3ad519ca1ad8ef8c3c1ddaa3e9ce2d7480d93b42e9095602540b3415c4822f082d3845a1d99cea0f7bb63c2366f90d587495d7b3fbc63dea5f1e04280aad5dbd75cb50858090aed4520bba0bc1bf47310d02693ee03b7e6c6dd016b741751177a7c99bbc27250117016cfb427cf694b5f69b6c7820b0030c88a28d00f5c072d0a7a2c96d3346e86d21d61a171033b764f68108cc730fac1d79e411814b47575b8cc68d0fd40c77bafa895d1045b1b1632e36a210e2ac0d3c9f00a8f7e38d4b2e9e36c9ffb7bfbce89630d339e3e9d9aa44f17d5bac110cec04c17e95b60cef61aceacb76f6de3feb87c72bb4cfff1510e00ff8981cf8c6ea538ab147d4ad1aa94b15fa58ce79b560213c77651bdada7c87fb4e78340b7ba1b68bdadd6762b557e5229eda052c6ce5bbde56fa8e7ee8fa2417397c84ec000ba8052403055f73715038363c1e11d15e97acdf72516fbfc357a0e098d73c12a03b9d43b4b8a8eb7002740c1c968e61e11e03b203a02b7aa70e16173f5e6db25e367b773856340ab654fc8e6bc5800c114882290e7cc2cd6e22ca00314047cee84d7035a39600145201360d67a176995fa36ff6135ed8125ede76683973324c98ad2916634a177cbab9b8e02ff00148462c94386cda6eaf4b583551a77898c8c2515c7152b62a394e6a1b541b5646df38018e51e99eec805e3c48560287209e41058d27c4ad4eddba8bd7c5a83ffbef4c4ba03aa5a4a7e88545122e3800f8881e143f952f4ac9f4bb023cdd9864ad2c114a58bcb69dc7791a5110f85320694816863505c30dfb47e9e7ac499070f4a69d6243dfa0c19cbdf444762484570584e66872f5061085e09a5c9654a29fca605a704075960c14813487232f5b90514168cda6b98a32fb78a71509dcfb516f08e14c92c482f8e5e8b09110fa2378c4b7a7120f3ce6c105e10292e920afe050c17de0fa4e63dc16cf7322bcb44ad8421f1a739c812b72b7b0f980644f2ef24e0c9070d9000ad835c3618fc2d7b61fb27b2f7f81540de0797adfbf486ab93e180ce42ab8596c9b6fc5174b975e6512c7b29a0380f7b112801ea809ebcab4e6c11e9df6d5f7afb17e0ced8f000a8dea21e3313071658a1c3039615eba95a179b6fce4f1e4cbde07d8210081b844cda185ea7558740038e679438e36e976dabde2575f23230f4c07a8e57f966556a34ab307d4a09a594b64b99c6ca9e0fb5d7ceef1667555634ab616d97ba2c2a37ac021e1f5beb7c087354839c8bddd14c5f466216884be2a7d4c5c666edd9f319bebd5682e9edb73adf6921d1da01fc3db6d0f110e07d09a349884aa35e78d6cf4ab5d7b763f5f60219600230859199de7ba4fd87c801b8f2b0ffa57f0166fb0f173dfca6a80000000049454e44ae426082</data> </image> <image name="image16"> ! <data format="PNG" length="539">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000001e249444154388dedd5bf4bd4711cc7f1c799c48730b8a0e14b247ca3e9a0a1db6a08baff40dd05c3a129a85142a4c1a1e0861b241ce29490a0c972680a4ba2e182ba41ce86d008690aef86882f217d1aba2b15d31373ebb5bc3fefcf8f272f3eefcf8f5c8cd151a8e748a84709cefd4b58be26b56e22a4067ac29245b32e1e8a382bb5a4da5ab1969d36d05a51ca99d6d48b4d25d7d50f049c966222f48591ec6b46af8f1834aadea3df7c7232c9ebb768aa4be715a9a7aaa137ac95064b23855305fad56d2a1aed982b1b486a492c368a514553790f7859aaac1aa6422cbc2ec4a13814f3b3f9a86251457efbe4c7f2ee8ac5588c492389e6344dee804f4acda9aa88c9a72416be17623116637810a2c7aabb79c8b5172e1a74351482ec5dc682164a68614230e232e14a90c90441762f63d38cdbaefd7dcfc6dd54137d1345514d34ade98ea821da68f777c62745d346f6a904c6a4c6db8b3a90c68e7c43b42a1a178d7503eda86ccddb36e4f32eb121bab14f71b7e8d8efd679a9e32e39813358dd129f635ecb0f2593dd9df53f6f45e2a5652478bf25d6f14a5de29cfbdd5fa0ed6fc5b0a6617917f001cfb0ae8e92875add42b73bfea51760196fb06ec6d98343a17747fec48201f0c58c477b9dd1bdb5d3f1bc3eb4dc3a0c1472ffbfa68e7e0217f3c5e5eb8d007f0000000049454e44ae426082</data> </image> <image name="image17"> ! <data format="PNG" length="718">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000029549444154388db595bf4b1b611cc63f2719527078850c57c8708205eb74491d6cd0e1c0a1834bdd441c3a7674e9d2d1a17f43a1fe05858e2e056f684d3bd49c43930a0a71b2528a7743686f78e1e9706f4c628c76f185f78e7b79df0fcf3ddf1faf27897b19d7c197ab18ad12fceff976954001e63a736a6461153303319644cb84778a0a08174a241d4b2c7f147ea5d8294dfeecae4bbbeb3a5f22d5e26478bb4aa880f472cb97b6021d56485429e0928a871c54bbebd2af73a9f94efab02385a40ac7e10a0aa85e04d2dbd7d2764d5af37568486430c356989fb9f3f5740ffc1a4c976123325d4bacf901bc5d2504e274c5375467e1780f7248f39c3a042d5ba8f624e1791e5a26c412f36ac7305d06bf0ea7fb90eec39b2f19106101888902c3d26601f581b80b5fb30c4be4f538923400036891b06b89673722c3a346a1fc640fbe2774de27d90290aef86626780cbdac507ad265e65b96b52cd1931e477d8f47c0000a9df2eda786520d1ed6e1641f7a3fe03485c5c94a8713620c0ca079c28e255e785e2b7cb4409e42cead4aef040368ce297f5933580395c640e9a72e7c1e573a0c9e1a23bad1c98bf7df53a7d4459fe3e2bb65279d2cc68d6057513151601e2c6e16bfef3b3b2a40b94c7dae6c5a9658e59b8b68cc8a76b5808e45bfdb65c602259cd7395ce4342fc81a1079f696e0292892ff963c85b9b2b982ffcea107cd7c143e029ea87428fa75a069891b150c16e8b909347170860a84592f0092bb2a0ac0791a53c2f4a1fde1e035a4b37ef0b24ece197610fdf463016d5d4b292fe7084bd4ec910d4353a001674ddc7abf6dcac7c827d19a2f3d339221d5f4e4b6a912a12015c8cd445c6b9b579b2b18d7fad2c35ba057fb213c28e0c90183463f060690c1c8fcffd52408c4f8d5e4ddd765fa0fe63fca89863cb67c0000000049454e44ae426082</data> </image> <image name="image18"> ! <data format="PNG" length="853">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000031c49444154388d95954f881b551cc73fb36de4056399912a09a490c01e6a40a84b2f0978e8c21ed4dbf6242a88e069bdd51e443cb917e956b1d88bd4827f7aaaeea9542898f562f6a01bca2e3b2d6ec80c256486ed9284dd251976295f0f93cdfe3189f8e0f1e53ddeef3b5f3eccfb3db42dc995b42dadf7f560bd5295d4945491baaea42f72d2835bd287af79f51cef4b62d4647db5ae71a3bb1debfae235a985e4ce4a925a0fbe51f382f96a94f144219767e4d887e40bc00e1472217480ad45f82189b3eb62a7b047954e547d6fb471027afb003d88aec77b1b4008c1dddb848de8fb91c653e31203c904f0fbbb5004fe02f206b60c998b45dc6f5796461abbe312033cf5e0c222fc09640dac01bb70d39f22f3c861e1c61d0d2b3b3d9631405806db8031508b206553090c73b717c0876039189e782c63a0d7f82836f6811d1b6a509a99a3daf020074b8df270e3b18c97e749be91868706260dec1ac0c0ccc74c4de67143b8949d1e6e3c9671ea3bf080b4819a011c2aa9cb90032f0c284c8e493c92f18e07b613cf3009672f432da2747501b6209fcfc089c496e518cb7212308ef1c377e09c0d8f81ac0d5e154c91a0d3830c04411bcec1925fc6b29ce72dcb79197080172dcb490c67bcf60bbcfe266c246172166a0e743af0f615322f25e12964320eee2328a64b0067805371b19900ce0c18c737acaf69a0edc15903fe3264d3b851115e2dc44953505df328a4a1ec9f641c013c37609c4c10f78604e07be0cc426820370bbf7a1466e6610332b6835b83a95c1e1a501a303647dd9f1d32dee7b037a4a721c8c02b0be0b7e93d06d7449005d7f728e462250b95c15f1101ec016da9bd89b68ff4c8bdbedebf16ab7b4fddcf3e9556257525fdddd783febd2afd7cfd37816d837dea58db3cc6b88fc35bf6b8f3e53cdcbd4ff8de1c9c07b7110c129305b7e151380fcb6105a9dd91dacf8ea11e96f8a7ab1fa8f5f52da9dedfab1f49bc27e949fffca674efe61f1afa82acf45f906e57875a6daab5d99224359bb1d69fc4da6ac5079b9bb15ef9e4f3e1c6c7129f647da0fd8f0eceb6fe3bf169b711e0fde8b14419832122e212d3ff6bfd16a57fddb17f0099d3bbbdd190d56d0000000049454e44ae426082</data> </image> <image name="image19"> ! <data format="PNG" length="666">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000026149444154388dad934f68db6518c73f69abcd6629a94eed90b95f419038640a1edccda288ec24450f8d6382cc8345bd84ca465741420f63eda1b25e2422424a2fd253d940684421dda941652d6c87b48b35c540630936d674ece3a129e8d6a6e99f07bebcbceff33e9ff7e1e1fba2b2ad720c3bc6f33be677d1cec99f3e58b67875ad30c2ebff3daf5ce7b405ae964609f6072ea56eabeaec8693e17ef391f72df66475fabeb9c8efc95738013cb67770b6fb47552b39b5a095efd4929ad02c9780e340cbdec0633c6d35b16075b3e7cdb5a4a6d4f852f4182781f6c6473146c47c745833eb56e76ad08c5ad16a4aedb6f42b37804ea0a931f00c6f9a8bfce1435151936a5c2bb5eb932480e6c6c0578838c3f9429a2fadbe3c63b9a7ac735a8da9612dd7aee6d132f7735ff3593df8ff3710021e018e16863865817b8a16d15ce0d408cbce93f67b7e36cb9d81977861a791d4377a9179736881df32e9a9b5586fcc705bf86de029a01d8800e1ed6a9ba817b7f88536cc7ec3e70b375787c787c68906d141a019f85b5d55d7b7adaddbf1389f94bee5ab9a675bcdf967bc3f6e6767e739e0f1c6edf680e636677e64cbb37d1ff55d50ed7eadfb76edb147f705de4ed3d7a78b992b1983e7828f81270e0d9c1c4cbe635e9397924bc03340eba180554ad952fedae835cfbc7ae63270ecd0c0b177636f58d6787f7c0578163872286095d478eaceece8ac67df3a3b023cb9371fd789e589e5f7d2f7d20ef40e7c08b48542a1a38dfb781705413091f82261ac379664f337860edc31c0e2e2e2c5f51fd637ba82ae5e205c13002d0701ab773b3a3a3e8dfe157d115801fed9cafd0bba7a52e7c7954efd0000000049454e44ae426082</data> </image> <image name="image20"> ! <data format="PNG" length="1088">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000040749444154388d85954f485c5718c57f632730af98e00b06e68143678a1b8590ced02c66b2a953ba68a48b345048b22855e8426921edb4504c16c16411262114e2223436849a2e4ae22255292d7996a4198b564d63fd53228ea8758a4a46d4e43d34f474f126a3466d3fb8fcee59bcef1dcefd2ed7c736953edf76291149bc96c966484692d8599b4445e2c1a113af9e0490cd055cbef21de64f49dbb5d85a4da7af5e1bbef2582fd6e5969b6a3e3d7c0d40130d39f5a69fe8226f4aa2b81e7240bda4d54218dd8e96e9cbaa4bbaddd07df54cc360ff77b3ebdd9e6e66fa629b865bdb06d57bfc892469f6f29a7a039fe96ee07d293da0d5e67fa4e05f75af13a2ff7cd5a0661bf4742aadfef3f7753f33ec7d33f5782ba7a4f4b96669e9b8b45a30b07453d26369b543d21d4ddce60bc0425d4d92d292fad57cae599a9294913425ef272fe8feeb1dd2c461afe96a7f811d9266a5b9e84c439057803dbefb2d354a349c05c7860538fb0d244960932100b8783a834deac82854c461770ad60660570cd63a3d7214967b7ef0ede103600eb5d7484b4d92eeeccc4c9bb45ab7e128870bec28eca3def9cd21f5d20cbce4ef1c72a93d02cc77c1be9a02039b75e5059c193082b77016da3142000960009c6fc170611ed8072cd0a4eb2cfb66af7c2aeb1d07ac24e4eced397414f6036bc02e20075806e45d3081ee20ce0a18585039f83b6338255d633658e064bb76664561c87715680143112805a72f48be6c8296d1b30c4c77d27aafe30047142f890703f06811a322b1234766b6b949e146780046f00e66a941eaa37a62072d9291240025dd932e04c119eff2f8a01dfc8b38bfb4038b383fdfa0ba629bc63340791d39bf05611818cb4218ec69db6b5c5311877117a33c0ebfe6304aa330e660041d18773ce7cf1de78047857d552394b66259268c43ac32c2c8df900c151d7743d025ff5b3b94bbe4c76c4f8f2d166817331ef97e042b69410e62d118a9f429521fa7f055fbf0edf1515db9eed8377c26aaea8301288fc2640f848149201c2fea91c000d5fb37c4e000c6f3e900a681109085ecb843e42dc3e7659c5f243fda0d6b2ef951b7c0755dcc781932f73260403eefc00ad83f65705620f5490a221b330ec6c1753043cece2c647ca2b19ed60f5b6119f6ee7d99d8bb316e7d7e8343efc588876b607a3d63dfe5636135bee1927b06961ff2cfc0f4b3591fcb7917017096c1d8ed39364d83fcbc83b9cf2097cb635926ad5f77525f57eb2ba95a3660c5c50a01ae8b1972c1ddac8b73dc07c602900773c5801e30170d98c79b8e8d8e2571eaed6a59bb1de27ee879c616365ec98209278ed793e9eb217b7784daba5acacc3206870619fd6314004945c7ebcfca7fad872fbc284b053e7fc1e60a9c92267e7c2a49f8b7b9535b2adbe760f7d9244962f3ffaca7967f01c5250f15c5eca5a80000000049454e44ae426082</data> </image> <image name="image21"> ! <data format="PNG" length="1214">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000048549444154388d85956168556518c77f3bbdb3f7e826f7828b1dca3511a35d09762f37d8b965e885a24d2c54f28349e0c6823688c01224bfa544995f2a1724fa21a65f740b4257201e23b73373ecde44776713bc8386776d63e7a473e7558f7bfb70a79b73d6ffcbffbce7f0fcf8bf0fef799f12fe430349bb3446aa82d0b5102ccd848a84480784ee28528e955c3877f749b5254f84d6c6ed9890db72a1aa8d0959950bd5b298906442359d10f2af4ca82e25843cd914afe9397af8e8fdff05eba4bd3a071fc5486da72c13e1e5ad062a0faf37c27816420bba8fc178cd0c139d01d0e30af6e537b5f6eef87447b8684a9db49f1fa88d77e9a4ad2777366a7d71524f0f5dd75a6bad6f4e3fe2d34e8fd67b4ee9eb75b6d6493b77b6ceded4d2dc221683ae1e48da5d7afd67f7f51707b4bea9b5be51643dd187b4d6ce0daddf6c98d149fbcfb375f6abedfbdb0d00e3013817aa4f62501f6cc0e0838f61aa007e4070c6810804d7f2451f2cba77c6813020a8f4e09d6f4bf252be900e79df197696b534b7145bdc5f6bdb3ab9cbd33b5b8a296ecca6b93b9bacf394d6635aeb8bbae89da7f4430d69addd1ead0f9dd23a69fbd3751bde6e6c6e7cdae8af8d972604dbf26599e5245bf1861db0806aa074763b9b37e27577401945dfbc71ae876b80418b821c8515d1f26ce86fa919f7234642a42b08a95d156930880c128dc4e1c7d37350807b10ddbc15ae9e2efa4275efc3baa2c00f8c14e9b596ef551999d0b1105479d1415009bc6c278cc7287c7fa45814048f245fa860fbbb702d0fbd1d2020133a561ab3ca4808b93417b22cfa6203f85d44a371505d58960d5f1f02d35cf4680250bf1573bca6f82cd210424248d325283732a12226c0bbd205a3d514fa3a612a28261fa926686c5a1cba2e0d531e2867f685030272a122254cc328fefb4c47c76b60f8385668c11f59a27e14b26d98478f2c0e3eefcc259de73191560edc29e9af8d3f9710f2582078cd2c8bce150ae0e7d34f6ec3fce4c20402509051fe255969ed321232329609d52593f40c4282dc00422e0e5d379beede82e452425903a06612520e1d2f8f148c920be7ee26843c990b9d7f90104407619d5d3c0df314bcd7046b5615bd94c7e4d10b21b73b843ce345229306406b3cde138313f81e666d03f83e9cc8ce55edde8b59b705565898c92db07befdcb71f5c58b38ae8541c171c55dfe402b71e5e9b3d493b96826f7295d6fa58bcd528c80c16500815964853081d2c211f5f2b8575393be38ee4fb232bac2f0faeacfc5522271f5e42f9cdad5703c187b1d1c26fb9be83586535204dac971a4066677dc1daf7b1b292cc48a13f52b9fdf3432bab7f4f57a7fdb6c36d334f3d00773a9ddaab7f6b9289d1ec2b536a696ea8afbae2b65a929f1e29892e7f03ef662fe6920d1426ce53ee7be4bb7f9a890e0c4eb9137dbf943d53f1ddc167559f408ced39b0e71e2c3241daf7b71beeb0bbecabcb83e96ca8b6a448ad05d722d260664287844a28943b8664a843c833aabec97587ddbf53d5297ffe045974e6b534b79428d4929a713f62f95e551ab3ca25284f09d370e04e5c307abc5c16bc48e5a442dd92c8a0ed70dbcc7cc6bfed125bef58d465690000000049454e44ae426082</data> </image> <image name="image22"> ! <data format="PNG" length="793">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000002e049444154388d95944f68545714c67fea35f95e78d13b32093375d4e0ca60160ea9d8859b08459855c9a6345adc54172d0ae2222d52112bdd0ac5d2b5421745b474511044178522b585445cd82eac83a6334f1de2c30c7a4c9ff3ba9849d5c94cc87c70399b7b7ff7fce13bd09bb6009f00b771a4c00be03410f4c8794b7b805f80e72d68da8abf0385f6cb6e15c07e1c87e5340d1470400292b0c4009e5962fff60a76c0212fff358e41b9164c2db85323aec77781855ec06b81522e9bfb52d2200e2c31bcf390345fc6715c15fac1b0e7bd80877de8a715aa10a8399b80a009153cad3fc5cc2e596237bb65d5496b80adc0ce4c984112a5b08424e405d0c0f8d5123b47f3ab655ad705bc1b18b645bb630ddb931fce070ffb1e12f68558623ca93c99896ad1a734f8b35bb9cb3296d346853ae6bdff06c73f56b7afe2385e9cf49318f6aa3a579d8de2e83360b61b74a9e4b7e4bd1fcb67f3bfc96bc0ea56b93f77ff73396df2597f388aa29fac6edf02f3c008d00f3c6a9df44dceb2e1e57379e7b37ee0c0ee03dc98bbf18ea43333b33307ad6ed72db1bf8122704e4e3b2cb1f538ee927014a8ac5401380ac5b1e2d5c90f261f4cec9db8a95027810dc036e07be0459bf35260d7cad0d7edd90aeca5b91b1c302ea7ab402aa714d71657096ed7b8a4b2a4860f7daa50e95254a814c71fad04da0a5f59054967156a9b9c00105ab23366f612f8d1b0a81770bf9c8e78ef2714ea7f1bbf19ad6eb72db10bc0b225d4cd79008386ed97d49f51868ccf1028a0e44b040a30b347b1c5a780b94e8fbb396f0878970677ccac38b46928a301a13e51a6cc427da1567b5c3b9b2c269780462740a78cd749fad07b7f51d29025365d8daa957ddad7dcc1b155cae5f21766f65da716aca4ec4861e4e7e2ae623aba63745ea18e4bfa3857c8ddcb1572d724bd0facef05b8a4eda363a37f9d3f7e3e9dfa682a3df1de0903a680cd342dbc2a75eaf16238106eae5a75bc16d75ede7a7ceb723c1f5f01ee01af560bfe0f0f1519628bd735ff0000000049454e44ae426082</data> </image> <image name="image23"> ! <data format="PNG" length="954">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000038149444154388d8d924168db661cc55fc20632b460430236e4a0c0064d4e566050971edab053e8a06ca7d28b9bd2433b0aebcc0ec58c514c0e25d9caa039843af50c4e0f41d57af07cd8905d06564698ed904d4ae98a5cb22007b748c12972f10a6f07d9ced215391ffc79fa8b4feffbe97d7f9044afe45555b4d7dd8cacb88e5575292b79da9b2e65c5add9ebee17ffdd3ba8fa0fb9ac1c37576c475654da4f4955ab9096a7ee36992fa8b434bb965e96a34736bebb988b9b458bf99f496e93e5759db449564936c9f2a64eb6486aa4a559ceddc59c38d0383597162b4ba62317caa445563675b243eaa64976c87255279b07ef55ad427dc92c0d342e67f53bb9d53cdd6db2b2496f353da918ddde20e992fa53af95953ccb59dd3712246fcdd7fb997648ab6993245dd7255ba46579bdb96d796a59a44d26bf4eddf13556b315aabf563c4ab34be876b5d75b87ff844d32bfa8fac631acedae21264e41db31806380f687010030feaa03e380b3df062240c37180d1032d3d29c077e597ca74358fa26290ec90ec66c95657edb7fa16999b93fd8995df95e71803b41d0313c780eab33af021506f3480e380e338400868b7dbc0f1ae0228fc59d8f0031e9e68488f1e941ee2943889c04b606a6c1c461d188f44801740281402da40201000e0e9c2bd4548fbd3595fe3c2abe2ade2e3b5bde2932af001507d6e6072ac4b3cda250e00ed7fbc0f8cad3ab6360cd423f53d5fe3626979aff1b773c9a9ed417b6660eac424b0f316f13e10781f30b680da8f558c9f98c24c7426ea7b79bdb0cf9e993d3f7b25e1c84a9eec1ccc6d6fae732b3267af24387f3b4d33eb32f7fd3c795364fe7a38f3aecb1b22d93f64faece5e0b470ea9badd1eaf94fa333e2dace1a62620cf77f79f038f6663afbfa236cc446a4606d47c97c3ed210432335e04d1d0f7f137ef8ec7ee3d23b89050d142c50d040bf312209fd42d8b1d793a45ba1bd1a236f0699be70987cb87f8208fcf45e0ac2ae6f720080521b37845a01785543e8dc02204de0f2c9d7f1854f2299fea6c3a4290adfa25f7ed4c98fc371eb2b896ca649b74c7b4522af07993ce39143b040b59922a9d2edaada4c31a80c8e24713a1c376f4b643347ba65722546772ec86b27c319f4093590548f4cdcabd96830ae5fed9ab7cab496255e3b2d1e6ce8911f85f4ffe6e1b83e2791669aea8d04135793ec8f5be0bba1fedcb5bfe4d0e02b3cbc2e4aa14c5010e298b888dd17b147ff0281d14f67823e006d0000000049454e44ae426082</data> </image> <image name="image24"> ! <data format="PNG" length="936">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000036f49444154388dad924168db561cc6bf040632b460430236e460c3068d4f516050971ddab053d8a06cec107a71137a5957d8667628668c90e5509252c69a43a85bcfe0f490a95a0fc6870dd965606584c90ed9a494aed825337271871492f21cbcc2b7839ca4e95a651bfbc3e3d35f3c7dfabdeffd41127b4b59d6a2ceaac82aaa70edaaa0a216e8ac0b2aaaa839abe2e3e7f71eb5f61ff23925595f725c45d5e83c2035dd206d4fc52659286ab475a796b9a98cfc63e3eb0bf964bd64b3f03dc94db2b26a920ec92ac936595937c96d923a69ebb67b7d211f3dd2786636133516ebae52ac903669ac9b649734eb75b24b56aa26d93e78afe906cdc57af948e34acebc965f2e506c92c63abd6a7b6258bdde222948f381d72a6a81959ce91b09d2d3738dfd4cbba4dd7648924208729bb46dafaf6fda9eda36e990e9cf67aef91a6b3983da8f864759ef118a9eeef5f6e193b04d161634df38faf5c72b484447a1372de018a0ff620100acdf1a400c70773a400468b92e3078a0e5fb45f85661b142a17b148645b24bb29725b77beabcd06f93f959c59f58fd597d8421406f5a183e06541f3680378046ab051c075cd7054240a7d3018ef71440f1d7e29a1f70ff704bbe7bbb7c07a7a27104fe00468762b01a402c12019e00a15008e80081400080a7f3371620ef8ce57c8d8b4f4bd3a57b2b5ba5fb55e075a0fac8427ca8473cd8230e009d3fbd0fac8d0636d62c34228d2d5fe352f9e656eb77f7bc5bdb82fed0c2e88938d07c81780708bc06581b40edbb2a622746313e323ee27b797b619f393d7976f242ca55d402d93d98dbbdb9ce2f299cbc90e2dc950ceb39c1fc5773e4e5280b97c2d9975d5e1fc9fd9f8c9d990a8e49a7bed818ac9e7d6f643cbad25c41229ac0ad1f6edf4b3c1bcbedbe89b5c4801cac35d5ecc58156343450039e3570e727e99bf76fb5cebf94f8df2c7322ec3aab695218749613e4e520331387c9fb7d737a45953bf844aa1581a73584de9907e4614c9ddc4dcebf1bc9ee6f927450b2c1bfe955d08f3afd7638697f2693ed0c292a749664f25290e9d31e39241bd4da3324358a9e6aed1906557f639248bd154ed6afc8643b4f8a0ab994a0980df2c393e16c9f74157cd5913b9fb2efa858a6e45032958865e3d329408aa1f5ed47f832eb1e9e8aff5a53722499fa20928d4f5c44e9eb0d1477a5ffc71800cec9a16c509292183e87c74f1277ff023f9eed747a940e850000000049454e44ae426082</data> </image> <image name="image25"> ! <data format="PNG" length="238">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000b549444154388ded523112c22010bc3829aeb0484999529fe053c23ff213de770fb1592b104f2e88410bc79d611886bb65d95ba23f0c4044d0da832b367b0001b2bd85b44edea0589355c9bb0371652f432ff523d058ecbb178435000284353c144dc72979ee170fe75c9a855f7caad37d89582b896766b6bc2c297c9a913908ad981ad3637ac9ccfa8e5e8dd86715eff11882c1e0794ff19e54d4735cce7f3fcc4487eea417a2e831e1741eb66a7f0c2efbfad77103673234546433995b0000000049454e44ae426082</data> </image> <image name="image26"> ! <data format="PNG" length="763">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff61000002c249444154388da5924168930718869fdf5afc037144ad5d3ab2998eeef00f1d545630910daab095b64a572632851d9ca70a9b523cc8f0208581acbda950480f61e241251b5bdb31c57818fe1d0d4d8bac4967b3b4684da42b313425f9e77ef3ee90e926eb4e7b2e2f1fdfc7c377780d49fc1f8cd11ed807c481b0c366dbe4c3ae37ac8eb8cf6adb176cdebce03169fe2dff349e99f865fc76fac6c80c578a2e0bcf0de55330da0de51e3a742e34a94241b752aa91d38ba4ca5274e07e67804f9e0b46bba17088e3b9585ff5d95d6f520ac525cb96ee246725fb73c98e48c93bd26a56b2fbaa213f9fd63ee861af86da9dc2c84066e090f5a3e29195484a8aac4a47ecbf8c439674a3553ae7979e94a55549d176c76fb297a933c11f143da2a0c9411f6ceadbc9b09e4c49b9eb92b2d2fdcb52e19634392065fba5bb919a34f9a5faf770ddd0e485127ebc7c974a8dfd1c7bd875c0da4d4be7360261581c077f0896266a991987c034782d709b18ebbf98377223a172d3b188877c0c7c162c4e4043053245080019e7eff4036b4978c782441abe724a75a1e59597dedc90d883f5ee06723634bc0573d3d0b80be612b539350d5b5760360fdb0ec2e41250c44eaefd6e0046a881f75a5bf8e8e207d661da9a4d02c0dc63f03b30ff18d61c701dc0c46e1f246cf592bff40a7c5fccd5012c95f935b1c437577f5a993dd6526aafaf37bd3486613e0daf6e87fa2ed81166b0709bf31dbb182e5dc22aa519ffdab5ff554dcbcb019df5ffa198250d07353b74595a96b2d19c74dea7de6c50bdb274e1346af571d258afdffd6f131dfc22f8310f1c7894a5b2d143d181a6e2160839300f63d79c64f70c3d75eb09165699d9f2b0f8feee97dded95eab7785e6bc32d1cc5e39da3927549dc74ef75cff0995be5eeba1f00f836f27a6790132702ec4f9b34769a18b12295ca2237cf2e32e2c014f0f43f05ffa001f0020650059681cab3e59f4f24841e355c02530000000049454e44ae426082</data> </image> <image name="image27"> ! <data format="PNG" length="888">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000033f49444154388da59351485b6718869f482e4e8683234cd01121c22e8cb370d2dd2c0121117a935dcdce9bee62eeb632d8d8ca905ed4d12b7150c2f462a08442d68bb633a5b30e04730aebe22898846e31a39324a8182923e73042cea13df0f5e2686b8dc5b8be37efcf773e9eff3ddfffff7044cd0dc9cb4311792a527c24225b22cd154936372470b4f7545abafb7b52ead2a2d59575a9e764fc8de0b76fae26e5492bbcb922b29b95e81bc153d79792b2d50a4f5d5faab40528afd493f33f2e69c77d9b5f584ab78ce5b1c8ebfa0fab23bb9d1d0f13d16713a9579a6713292dae8c442dafe5169eb9966b54083967a32726decd3645b6448a77778d9969173e339dd2ca99a6f1226df390ff2732339d9a3a31f17229037de01b408d10d1af7e373f1e57477465c056e902c3b0c0f7d2ef3dc8623b91ea8989d76fee1a0737a0f848a4bc521729ef277cd2eac5e5ba5c9e9c3f71141d37d616ef587b50db36183c03ca00d00fb5ed1a74bb75baa152a98103a65a23ec0d5f2bcf05bf94b9a0fa5af2ede9f5c0d75fcdbaf32cbb2faec51fbbeb66c67d89c59f2e8a3cbc289208e66531f40a5c4454808e4fbefda06a35acd8c495ef4de35fd8f8bb02efc0c6e6215721b7b7816f0872fa0483b64e4dbf01e7142df78fadcbf4cbe41e8fc704f01c14e62757b5cc4ee6daa8361a2dd925e2c11196ff5c26d2136624340843904b7fc3d96e034a8bd00f6c03c317e017bd805f89793ecb9b2f36383a9ad1b1cb018570c0662daac07d1bd40b3da3c95e6d418d383a86b74697a20036a0603936be33bd64d2144620e6b95a328f051f7b0e974253e787c3577016e13d05766cf02bb003f8814d1bfc71acf45a013fb1b7264a665be0e66450cd38e81f7d8c866341c0075520006c5a2ebc0a74fab897a61081585b60807a22a866aae8e7c7c21a9d7917fa970daa05791bfa8006e08df3f3af6b77da0603ec7ee126fff443348615b00d175e33a15301db863e15e3b72e3a4e037ef7879219f1135b7840816ac8fdfda17d60f77e530f64b1da3bbca32a7e1e5475077d62c8d0f0db70ae1fee57c0021ca8fcd16b9e2af181de4f96ccb09fd85ca1ab4043815b25e8041a36c69eca7283c4ff4a7ca099b1a0ca33d2f1b789e6bd0641bbcbcc38242edd2a4d3d074f121d35bb68c0d10000000049454e44ae426082</data> </image> <image name="image28"> ! <data format="PNG" length="399">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000015649444154388db595b14a03411445cf88162984a40824210a966bb776dae96f087e40c0d20f309f20f801425a3bb173f309b629ec2c022a6121811964e15a6c36c6356e7622fbe0c1e3ce9bcb9d3b6f1823892a62ab125600498b0caf26caea55ad4b59884bfa567cd68f8a3cc9d6cc3cb5064f89cf6fd049f71878e6a03f56ede2feffc667473fbd7e528115790b54844b2aedf166c4650ee64b5c346ecb9b4c0e336b70b6cbc8cd9194c2572a1edc0df24afda38a272dc9cb0a001e6e1f341c0d09ea01d14b446003a25984730e3773042e0030de8a7b973d1545abdbd2baa9581987f5a3b4b0c02b1863e07dbe38055c5a7a1347a34700c61f63d89b834db0530bbb10bb18f01b3700421b02d0d9ef2c3063d2e19104c9a68ae30880c9db64713f92d0675a3be73623ce36369a8dd4e72c767ef67913c7b3d4436b2dd4fe7e07fe1e2721ed761b97a4734b022e71bffa4c559fe91764d5f5a1dc22621b0000000049454e44ae426082</data> </image> <image name="image29"> ! <data format="PNG" length="433">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000017849444154388db593b14e02411086bf35585090402209245a4861b2c4064bdf437a0b1fc0f02cbe81dad9616371d741616d0581420346122e01e3... [truncated message content] |
From: Albert G. <ag...@us...> - 2007-11-11 00:42:58
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv21577 Modified Files: qcalc.q Log Message: disable debugging code, comment changes Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.126 retrieving revision 1.127 diff -C2 -d -r1.126 -r1.127 *** qcalc.q 11 Nov 2007 00:33:04 -0000 1.126 --- qcalc.q 11 Nov 2007 00:42:54 -0000 1.127 *************** *** 3063,3075 **** /* Compute the evaluation order. The present implementation uses a depth-first search algorithm (more precisely, the reversal of a depth-first postorder) ! starting from a given "root" node (cell index) or list of root nodes. ! ! This works ok with cyclic dependencies, but may consider them in an ! arbitrary order, except that root nodes are guaranteed to come first ! (unless they have already been triggered while searching another root ! node). (If you take a closer look you will find that the ordering of cycle ! nodes is in fact not completely arbitrary, but always considers forward ! edges in the dependency graph in the order of the target (dependent) cells, ! where cells are ordered first by their row, then by their column indices.) The result is a list V containing the indices of cells in the order in --- 3063,3070 ---- /* Compute the evaluation order. The present implementation uses a depth-first search algorithm (more precisely, the reversal of a depth-first postorder) ! starting from a given "root" node (cell index) or list of root nodes. This ! works ok with cyclic dependencies, but may consider them in an arbitrary ! order, except that root nodes are guaranteed to come first (unless they ! have already been triggered while searching another root node). The result is a list V containing the indices of cells in the order in *************** *** 3086,3090 **** = eval_list P [(I,J)]; eval_list P [] = []; ! eval_list P V = printf "DFS: %s\n" $ str V || V where V = filter (member (get EVAL)) $ dfs P V; --- 3081,3085 ---- = eval_list P [(I,J)]; eval_list P [] = []; ! eval_list P V = //printf "DFS: %s\n" $ str V || V where V = filter (member (get EVAL)) $ dfs P V; |
From: Albert G. <ag...@us...> - 2007-11-11 00:33:09
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv17405 Modified Files: qcalc.q Log Message: remove obsolete code, optimizations Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.125 retrieving revision 1.126 diff -C2 -d -r1.125 -r1.126 *** qcalc.q 10 Nov 2007 22:49:07 -0000 1.125 --- qcalc.q 11 Nov 2007 00:33:04 -0000 1.126 *************** *** 2834,2840 **** where (S,_,_) = get EVAL!(I,J); ! /* Recompute everything. */ ! compute_all V = begin_compute || do submit V || collect_results emptyhdict V || end_compute_test; --- 2834,2840 ---- where (S,_,_) = get EVAL!(I,J); ! /* Recompute the given cells. */ ! compute V = begin_compute || do submit V || collect_results emptyhdict V || end_compute_test; *************** *** 2956,2994 **** otherwise; - /* Recompute a single cell, or a collection of cells, and all cells depending - on these. */ - - compute U V = begin_compute || - do submit_clear U || collect_results emptyhdict U || - end_compute_test - where U = all_deps U V, U = filter (member (get EVAL)) U; - - /* Same as above, but exclude GUI elements unless they are triggered. */ - - compute2 U V = //printf " -> %s\n" $ str U || - begin_compute || - do submit_clear U || collect_results emptyhdict U || - end_compute_test - where //_ = printf "*** triggered updates: %s" $ str U, - U = all_deps2 U V, U = filter (member (get EVAL)) U; - - all_deps (I,J) V - = all_deps [(I,J)] V; - all_deps U V = filter (member D) V - where D = hdict $ map (flip pair true) U, - D = foldl add_deps D V; - - add_deps D (I,J) - where (S,X,DEPS) = get EVAL!(I,J): - = insert D ((I,J),true) if any (member D) DEPS; - = D otherwise; - - all_deps2 (I,J) V - = all_deps2 [(I,J)] V; - all_deps2 U V = filter (D!) $ filter (member D) V - where W = map (neg is_gui_elem) U, - D = hdict $ zipwith pair U W, - D = foldl add_deps D V; - /* Reformat floating point numbers for the given precision. */ --- 2956,2959 ---- *************** *** 3007,3011 **** /* Process cell values after edits or after loading a new file. */ ! process_all = compute_all $ eval_list $ sort indexcmp $ keys $ get CELLS if check_interp; --- 2972,2977 ---- /* Process cell values after edits or after loading a new file. */ ! process_all = compute $ eval_list (cst true) $ sort indexcmp $ keys $ ! get CELLS if check_interp; *************** *** 3013,3019 **** clear_cell (I,J) || // do the necessary reevaluations ! if check_interp then compute (I,J) V ! where V = eval_list (I,J), ! V = dropwhile (<>(I,J)) V; process (I,J) S = insert_eval (I,J;S,'X,DEPS) || --- 2979,2984 ---- clear_cell (I,J) || // do the necessary reevaluations ! if check_interp then compute V ! where V = eval_list (cst true) (I,J); process (I,J) S = insert_eval (I,J;S,'X,DEPS) || *************** *** 3027,3034 **** clear_cell (I,J) || set_cell (I,J) S || ! if check_interp then compute (I,J) V where S = qt TABLE "text" (I,J), _ = delete_eval (I,J), ! V = eval_list (I,J); process_gui (I,J) X --- 2992,2999 ---- clear_cell (I,J) || set_cell (I,J) S || ! if check_interp then compute V where S = qt TABLE "text" (I,J), _ = delete_eval (I,J), ! V = eval_list (cst true) (I,J); process_gui (I,J) X *************** *** 3037,3043 **** if checkval X then submit_val (I,J) X || // do the necessary reevaluations ! if check_interp then compute (I,J) V ! where V = eval_list (I,J), ! V = dropwhile (=(I,J)) $ dropwhile (<>(I,J)) V, X = gui_getval X; --- 3002,3007 ---- if checkval X then submit_val (I,J) X || // do the necessary reevaluations ! if check_interp then compute V ! where V = eval_list (cst false) (I,J), X = gui_getval X; *************** *** 3057,3065 **** otherwise; ! process_sel W = if check_interp then compute W V where (C,E) = foldl process1 (get CELLS,get EVAL) W, _ = set_cells C || set_eval E, W = map (flip (flip sub 0) 1) W, ! V = eval_list W if not null W and then check_interp; --- 3021,3029 ---- otherwise; ! process_sel W = if check_interp then compute V where (C,E) = foldl process1 (get CELLS,get EVAL) W, _ = set_cells C || set_eval E, W = map (flip (flip sub 0) 1) W, ! V = eval_list (cst true) W if not null W and then check_interp; *************** *** 3082,3121 **** otherwise; ! process_sel2 W = if check_interp then compute2 W V where //_ = printf "*** pending updates: %s\n" $ str W, (C,E) = foldl process2 (get CELLS,get EVAL) W, _ = set_cells C || set_eval E, W = map (flip (flip sub 0) 1) W, ! V = eval_list W if not null W and then check_interp; ! clear_sel W = do clear_cell W || compute W V where _ = delete_cells W || delete_eval W, ! V = eval_list W if not null W and then check_interp; /* Compute the evaluation order. The present implementation uses a depth-first search algorithm (more precisely, the reversal of a depth-first postorder) ! starting from a given node or list of nodes. This works ok with cyclic ! dependencies, but may consider them in an apparently random order. (If you ! take a closer look you will find that the order is not completely random, ! but always considers forward edges in the dependency graph in the order of ! the target (dependent) cells, where cells are ordered first by their row, ! then by their column indices.) The result is a list V containing the ! indices of cells in the order in which they should be evaluated. */ ! eval_list (I,J) = eval_list [(I,J)]; ! eval_list V = dfs_list V; ! dfs_list [] = []; ! dfs_list V = //if not null V then printf "DFS: %s\n" $ str V || ! V ! where V = filter (member (get EVAL)) $ dfs V; ! dfs V = Xs where (_,Xs) = foldl search (emptyhdict,[]) $ reverse V; ! search (V,Xs) X = (V,Xs) if member V X; ! = (V,[X|Xs]) where W:List = get XREF!X, ! (V,Xs) = foldl search (insert V (X,true),Xs) W; = (V,[X|Xs]) otherwise; --- 3046,3099 ---- otherwise; ! process_sel2 W = if check_interp then compute V where //_ = printf "*** pending updates: %s\n" $ str W, (C,E) = foldl process2 (get CELLS,get EVAL) W, _ = set_cells C || set_eval E, W = map (flip (flip sub 0) 1) W, ! // Exclude all toplevel GUI elements from this list ! // (unless they are triggered by other elements). ! V = eval_list (neg is_gui_elem) W if not null W and then check_interp; ! clear_sel W = do clear_cell W || compute V where _ = delete_cells W || delete_eval W, ! V = eval_list (cst true) W if not null W and then check_interp; /* Compute the evaluation order. The present implementation uses a depth-first search algorithm (more precisely, the reversal of a depth-first postorder) ! starting from a given "root" node (cell index) or list of root nodes. ! This works ok with cyclic dependencies, but may consider them in an ! arbitrary order, except that root nodes are guaranteed to come first ! (unless they have already been triggered while searching another root ! node). (If you take a closer look you will find that the ordering of cycle ! nodes is in fact not completely arbitrary, but always considers forward ! edges in the dependency graph in the order of the target (dependent) cells, ! where cells are ordered first by their row, then by their column indices.) ! The result is a list V containing the indices of cells in the order in ! which they should be evaluated. ! The P argument of eval_list is a predicate to be applied to the root nodes, ! in order to determine whether they should be included in the result list. ! If this function returns false, then the corresponding root node is ! excluded from the result list, although it may still trigger other ! elements. This is used to filter out updated GUI elements which shouldn't ! actually be recomputed (cf. process_sel2). */ ! ! eval_list P (I,J) ! = eval_list P [(I,J)]; ! eval_list P [] = []; ! eval_list P V = printf "DFS: %s\n" $ str V || ! V where V = filter (member (get EVAL)) $ dfs P V; ! ! dfs P V = Xs where (_,Xs) = foldl (search P) (emptyhdict,[]) V; ! search P (V,Xs) X ! = (V,Xs) if member V X; ! = (V,if P X then [X|Xs] else Xs) where W:List = get XREF!X, ! (V,Xs) = foldl (search (cst true)) ! (insert V (X,true),Xs) W; = (V,[X|Xs]) otherwise; |
From: Albert G. <ag...@us...> - 2007-11-10 22:49:11
|
Update of /cvsroot/q-lang/qcalc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv30332 Modified Files: qcalc.q Log Message: eliminate the obsolete topsort evaluation algorithm, bugfixes and optimizations Index: qcalc.q =================================================================== RCS file: /cvsroot/q-lang/qcalc/qcalc.q,v retrieving revision 1.124 retrieving revision 1.125 diff -C2 -d -r1.124 -r1.125 *** qcalc.q 10 Nov 2007 22:13:14 -0000 1.124 --- qcalc.q 10 Nov 2007 22:49:07 -0000 1.125 *************** *** 444,448 **** OLD = filter (deltacmp NEW_EVAL) OLD, NEW = filter (deltacmp OLD_EVAL) NEW, ! OLD = filter (neg.member (hdict NEW)) OLD, OLD = map fst OLD; --- 444,448 ---- OLD = filter (deltacmp NEW_EVAL) OLD, NEW = filter (deltacmp OLD_EVAL) NEW, ! OLD = filter (neg $ member (hdict NEW).fst) OLD, OLD = map fst OLD; *************** *** 3007,3021 **** /* Process cell values after edits or after loading a new file. */ ! process_all = do flag U || compute_all V ! where (V,U) = eval_list $ sort indexcmp $ keys $ get CELLS if check_interp; doprocess (I,J) = insert_cells ((I,J),true) || clear_cell (I,J) || - // flag "bad" cells (cyclic computations) - do flag U || // do the necessary reevaluations if check_interp then compute (I,J) V ! where (V,U) = eval_list (I,J), V = dropwhile (<>(I,J)) V; --- 3007,3018 ---- /* Process cell values after edits or after loading a new file. */ ! process_all = compute_all $ eval_list $ sort indexcmp $ keys $ get CELLS if check_interp; doprocess (I,J) = insert_cells ((I,J),true) || clear_cell (I,J) || // do the necessary reevaluations if check_interp then compute (I,J) V ! where V = eval_list (I,J), V = dropwhile (<>(I,J)) V; *************** *** 3033,3047 **** where S = qt TABLE "text" (I,J), _ = delete_eval (I,J), ! (V,U) = eval_list (I,J); process_gui (I,J) X ! = // flag "bad" cells (cyclic computations) ! do flag U || ! // set the new value in the inferior process // (check whether the value is actually transferable) if checkval X then submit_val (I,J) X || // do the necessary reevaluations if check_interp then compute (I,J) V ! where (V,U) = eval_list (I,J), V = dropwhile (=(I,J)) $ dropwhile (<>(I,J)) V, X = gui_getval X; --- 3030,3042 ---- where S = qt TABLE "text" (I,J), _ = delete_eval (I,J), ! V = eval_list (I,J); process_gui (I,J) X ! = // set the new value in the inferior process // (check whether the value is actually transferable) if checkval X then submit_val (I,J) X || // do the necessary reevaluations if check_interp then compute (I,J) V ! where V = eval_list (I,J), V = dropwhile (=(I,J)) $ dropwhile (<>(I,J)) V, X = gui_getval X; *************** *** 3062,3070 **** otherwise; ! process_sel W = do flag U || if check_interp then compute W V where (C,E) = foldl process1 (get CELLS,get EVAL) W, _ = set_cells C || set_eval E, W = map (flip (flip sub 0) 1) W, ! (V,U) = eval_list W if not null W and then check_interp; --- 3057,3065 ---- otherwise; ! process_sel W = if check_interp then compute W V where (C,E) = foldl process1 (get CELLS,get EVAL) W, _ = set_cells C || set_eval E, W = map (flip (flip sub 0) 1) W, ! V = eval_list W if not null W and then check_interp; *************** *** 3087,3130 **** otherwise; ! process_sel2 W = do flag U || if check_interp then compute2 W V where //_ = printf "*** pending updates: %s\n" $ str W, (C,E) = foldl process2 (get CELLS,get EVAL) W, _ = set_cells C || set_eval E, W = map (flip (flip sub 0) 1) W, ! (V,U) = eval_list W if not null W and then check_interp; clear_sel W = do clear_cell W || compute W V where _ = delete_cells W || delete_eval W, ! (V,U) = eval_list W if not null W and then check_interp; ! /* Compute the evaluation order. We now provide two alternative routines, ! depth-first search (more precisely, the reversal of a depth-first ! postorder) starting from a given node or list of nodes (which works ok with ! cyclic dependencies, but may consider them in an apparently random order), ! and global topological sort (which refuses to order cyclic computations). ! In any case, the result is a pair of two lists V and U. V contains the ! indices of cells in the order in which they should be evaluated. U contains ! the indices of "bad" cells which is always empty for the depth-first order, ! and for topsort contains the nodes which couldn't be ordered because they ! are connected to some cyclic computation. The topological sort used in ! previous cvs versions is now being phased out in favour of depth-first ! search, which is a little more efficient for incremental computations and ! handles a greater variety of usage cases, but is also less predictable if ! cyclic computations have to be performed. */ eval_list (I,J) = eval_list [(I,J)]; eval_list V = dfs_list V; - //eval_list V = topsort_list; - - /* Depth-first postorder. */ ! dfs_list [] = ([],[]); ! dfs_list V = //printf "DFS: %s\n" $ str V || ! (V,[]) where V = filter (member (get EVAL)) $ dfs V; ! dfs V = Xs where (_,Xs) = foldl search (emptyhdict,[]) V; search (V,Xs) X = (V,Xs) if member V X; = (V,[X|Xs]) --- 3082,3117 ---- otherwise; ! process_sel2 W = if check_interp then compute2 W V where //_ = printf "*** pending updates: %s\n" $ str W, (C,E) = foldl process2 (get CELLS,get EVAL) W, _ = set_cells C || set_eval E, W = map (flip (flip sub 0) 1) W, ! V = eval_list W if not null W and then check_interp; clear_sel W = do clear_cell W || compute W V where _ = delete_cells W || delete_eval W, ! V = eval_list W if not null W and then check_interp; ! /* Compute the evaluation order. The present implementation uses a depth-first ! search algorithm (more precisely, the reversal of a depth-first postorder) ! starting from a given node or list of nodes. This works ok with cyclic ! dependencies, but may consider them in an apparently random order. (If you ! take a closer look you will find that the order is not completely random, ! but always considers forward edges in the dependency graph in the order of ! the target (dependent) cells, where cells are ordered first by their row, ! then by their column indices.) The result is a list V containing the ! indices of cells in the order in which they should be evaluated. */ eval_list (I,J) = eval_list [(I,J)]; eval_list V = dfs_list V; ! dfs_list [] = []; ! dfs_list V = //if not null V then printf "DFS: %s\n" $ str V || ! V where V = filter (member (get EVAL)) $ dfs V; ! dfs V = Xs where (_,Xs) = foldl search (emptyhdict,[]) $ reverse V; search (V,Xs) X = (V,Xs) if member V X; = (V,[X|Xs]) *************** *** 3133,3174 **** = (V,[X|Xs]) otherwise; - /* Topological order. */ - - topsort_list = (V,U) - where (KEYS,VALS) = unzip (list (get EVAL)), - NODE_NUM = hdict (zip KEYS [0..#KEYS-1]), - ADJ = map (filter (member (get EVAL)).trd) VALS, - ADJ = map (list.set.map (NODE_NUM!)) ADJ, - (V,U) = topsort ADJ, - V = map (KEYS!) V, U = map (KEYS!) U; - - /* Perform a topological sort on a graph given by its adjacency list. Returns - a pair (V,U) where V is a maximal topological order and U are the remaining - nodes which couldn't be ordered as they are connected to cycles in the - graph. */ - - /* FIXME: This is a rather simplistic O(N^2) implementation, must do something - more efficient here. */ - - topsort ADJ = topsort2 [] (leaves G) G - where G = zip [0..#ADJ-1] ADJ; - - topsort2 V [] G = (reverse V,map fst G); - topsort2 V [X|Xs] G - = topsort2 [X|V] (merge Xs (leaves G)) G - where G = remove G X; - - merge [] Ys = Ys; - merge Xs [] = Xs; - merge [X|Xs] [Y|Ys] - = [X|merge Xs [Y|Ys]] if X<Y; - = [Y|merge [X|Xs] Ys] if X>Y; - = [X|merge Xs Ys] otherwise; - - leaves G = map fst (filter (null.snd) G); - - remove G X = zip V (map (filter (<>X)) E) - where (V,E) = unzip (filter ((<>X).fst) G); - /* Inferior Q process. *****************************************************/ --- 3120,3123 ---- |