From aadc4e7a2172eaaa19fad9da8412ff15d91252f5 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Wed, 25 Sep 2024 16:26:45 +0200 Subject: [PATCH 01/25] Fixes #24: support independent representation extensions --- README.md | 2 + src/PrintBox.ml | 93 +++++++++++++++++++++++++++++ src/PrintBox.mli | 66 ++++++++++++++++++++ src/printbox-html/PrintBox_html.ml | 19 +++++- src/printbox-html/PrintBox_html.mli | 2 + src/printbox-md/PrintBox_md.ml | 10 +++- src/printbox-md/README.md | 2 +- src/printbox-text/PrintBox_text.ml | 17 ++++-- test/dune | 12 ++++ test/extend_html_specific.expected | 8 +++ test/extend_html_specific.ml | 40 +++++++++++++ test/same_as_only.expected | 12 ++++ test/same_as_only.ml | 35 +++++++++++ 13 files changed, 310 insertions(+), 8 deletions(-) create mode 100644 test/extend_html_specific.expected create mode 100644 test/extend_html_specific.ml create mode 100644 test/same_as_only.expected create mode 100644 test/same_as_only.ml diff --git a/README.md b/README.md index ca7b9aa..73867b8 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ including: See https://c-cube.github.io/printbox/ +See the [test/](test/) and [examples/](examples/) directories for illustrations of potential usage. + ## License BSD-2-clauses diff --git a/src/PrintBox.ml b/src/PrintBox.ml index 25ea16c..ae7f757 100644 --- a/src/PrintBox.ml +++ b/src/PrintBox.ml @@ -38,6 +38,8 @@ module Style = struct let fg_color c : t = set_fg_color c default end +type ext = .. + type view = | Empty | Text of { @@ -64,10 +66,19 @@ type view = id: string; inner: t; } + | Ext of { + key: string; + ext: ext; + } and t = view let empty = Empty + +let is_empty = function + | Empty -> true + | _ -> false + let[@inline] view (t : t) : view = t let[@inline] line_ s = Text { l = [ s ]; style = Style.default } @@ -203,6 +214,87 @@ let mk_tree ?indent f root = let link ~uri inner : t = Link { uri; inner } let anchor ~id inner : t = Anchor { id; inner } +let extension_to_key : ((ext -> bool) * string) list ref = ref [] +let extension_keys = Hashtbl.create 4 + +let register_extension ~key ~domain = + if Hashtbl.mem extension_keys key then + invalid_arg @@ "PrintBox.register_extension: key " ^ key + ^ " is already registered"; + Hashtbl.add extension_keys key domain; + extension_to_key := (domain, key) :: !extension_to_key + +let get_extension_key ext = + let rec loop = function + | [] -> invalid_arg "PrintBox.get_extension_key: unregistered extension" + | (domain, key) :: tl -> + if domain ext then + key + else + loop tl + in + loop !extension_to_key + +let extension ext = Ext { key = get_extension_key ext; ext } + +type ext_backend_result = .. +type ext_backend_result += Unrecognized_extension | Same_as of t + +let extension_backends = Hashtbl.create 3 + +let register_extension_backend ~backend_name = + if Hashtbl.mem extension_backends backend_name then + invalid_arg + @@ "PrintBox.register_extension_backend: backend already registered: " + ^ backend_name; + Hashtbl.add extension_backends backend_name (Hashtbl.create 4) + +let register_extension_handler ~backend_name ~example ~handler = + if not @@ Hashtbl.mem extension_backends backend_name then + invalid_arg @@ "PrintBox.register_extension_handler: unregistered backend " + ^ backend_name; + let handlers = Hashtbl.find extension_backends backend_name in + let key = get_extension_key example in + (match handler example ~nested:(fun _ -> Same_as Empty) with + | Unrecognized_extension -> + invalid_arg + "PrintBox.register_extension_handler: example outside of handler domain" + | _ -> ()); + Hashtbl.add handlers key handler + +let get_extension_handler ~backend_name = + if not @@ Hashtbl.mem extension_backends backend_name then + invalid_arg @@ "PrintBox.get_extension_handler: unregistered backend " + ^ backend_name; + let handlers = Hashtbl.find extension_backends backend_name in + fun ~key -> Hashtbl.find handlers key + +let expand_extensions_same_as_only ~backend_name = + let get_handler = get_extension_handler ~backend_name in + let rec loop = function + | Empty -> Text { l = []; style = Style.default } + | Text _ as b -> b + | Frame { sub; stretch } -> Frame { sub = loop sub; stretch } + | Pad (p, b) -> Pad (p, loop b) + | Align { h; v; inner } -> Align { h; v; inner = loop inner } + | Grid (bars, grid) -> Grid (bars, map_matrix loop grid) + | Tree (indent, node, children) -> + Tree (indent, loop node, Array.map loop children) + | Link { uri; inner } -> Link { uri; inner = loop inner } + | Anchor { id; inner } -> Anchor { id; inner = loop inner } + | Ext { key; ext } -> + let nested b = Same_as (loop b) in + (match get_handler ~key ext ~nested with + | Same_as b -> b + | Unrecognized_extension -> + failwith + @@ "PrintBox.expand_extensions_same_as_only: unrecognized extension " + ^ key ^ " for backend " ^ backend_name + | _ -> + invalid_arg @@ "PrintBox.expand_extensions_same_as_only: extension " + ^ key ^ " is not `Same_as`-only for backend " ^ backend_name) + in + loop (** {2 Simple Structural Interface} *) @@ -219,6 +311,7 @@ module Simple = struct | `Table of t array array | `Tree of t * t list ] + (** The simple interface does not support extensions. *) let rec to_box = function | `Empty -> empty diff --git a/src/PrintBox.mli b/src/PrintBox.mli index 1cde757..43a2aad 100644 --- a/src/PrintBox.mli +++ b/src/PrintBox.mli @@ -103,6 +103,12 @@ type t (** Main type for a document composed of nested boxes. @since 0.2 the type [t] is opaque *) +type ext = .. +(** Extensions of the representation. + + @since NEXT_RELEASE +*) + (** The type [view] can be used to observe the inside of the box, now that [t] is opaque. @@ -137,6 +143,10 @@ type view = private id: string; inner: t; } + | Ext of { + key: string; + ext: ext; + } val view : t -> view (** Observe the content of the box. @@ -317,6 +327,12 @@ val anchor : id:string -> t -> t @since 0.11 *) +val extension : ext -> t +(** [extension ext] embeds an extended representation [ext] as a box. [ext] must be recognized + as a registered extension by one of the [to_key] arguments passed to {!register_extension}. + @since NEXT_RELEASE +*) + (** {2 Styling combinators} *) val line_with_style : Style.t -> string -> t @@ -340,6 +356,56 @@ val asprintf_with_style : (** Formatting for {!text}, with style. @since 0.3 *) +(** {2 Managing Representation Extensions} *) + +val is_empty : t -> bool +(** [is_empty b] is equivalent to [match view b with Empty -> true | _ -> false]. *) + +val register_extension : key:string -> domain:(ext -> bool) -> unit +(** Registers a new representation extension, where [key] is a unique identifier for + the scope of the extension values, and [domain] delineates that scope. + Intended for extension writers. + @since NEXT_RELEASE *) + +type ext_backend_result = .. +(** The type packaging backend-dependent results of handling a representation extension. *) + +type ext_backend_result += + | Unrecognized_extension (** This is an error condition. *) + | Same_as of t + (** The result of rendering is the same as for the given box. *) + +val register_extension_backend : backend_name:string -> unit +(** Enables for a PrintBox backend (such as printbox-text, printbox-html, printbox-md) + the handling of representation extensions via {!register_extension_handler}. + Intended for backend writers. + @since NEXT_RELEASE *) + +val register_extension_handler : + backend_name:string -> + example:ext -> + handler:(ext -> nested:(t -> ext_backend_result) -> ext_backend_result) -> + unit +(** Registers a [handler] for the backend [backend_name] of extensions of the same domain + as [example]. Intended for extension writers. + @since NEXT_RELEASE *) + +val get_extension_handler : + backend_name:string -> + key:string -> + ext -> + nested:(t -> ext_backend_result) -> + ext_backend_result +(** [get_extension_handler ~backend_name] returns a getter function for extension handlers. + Intended for backend writers. + @since NEXT_RELEASE *) + +val expand_extensions_same_as_only : backend_name:string -> t -> t +(** [expand_extensions_same_as_only ~backend_name] expands extensions for the given backend, + as long as the backend's extension handlers only use the [Same_as] variant + of {!ext_backend_result}. + @since NEXT_RELEASE *) + (** {2 Simple Structural Interface} *) type 'a ktree = unit -> [ `Nil | `Node of 'a * 'a ktree list ] diff --git a/src/printbox-html/PrintBox_html.ml b/src/printbox-html/PrintBox_html.ml index 939349a..ae1614b 100644 --- a/src/printbox-html/PrintBox_html.ml +++ b/src/printbox-html/PrintBox_html.ml @@ -7,6 +7,10 @@ module B = PrintBox module H = Html type 'a html = 'a Html.elt +type toplevel_html = Html_types.li_content_fun html +type PrintBox.ext_backend_result += Render_html of toplevel_html + +let () = B.register_extension_backend ~backend_name:"html" let prelude = let l = @@ -128,6 +132,8 @@ let br_lines ~bold l = @@ List.concat @@ List.map (String.split_on_char '\n') l +let get_handler = PrintBox.get_extension_handler ~backend_name:"html" + let to_html_rec ~config (b : B.t) = let open Config in let br_text_to_html ?(border = false) ~l ~style () = @@ -201,7 +207,7 @@ let to_html_rec ~config (b : B.t) = (match B.view inner with | B.Empty -> H.a ~a:[ H.a_id id ] [] | _ -> raise Summary_not_supported) - | B.Tree _ | B.Link _ -> raise Summary_not_supported + | B.Tree _ | B.Link _ | B.Ext _ -> raise Summary_not_supported in let loop : 'tags. @@ -243,8 +249,9 @@ let to_html_rec ~config (b : B.t) = | B.Tree (_, b, l) -> let l = Array.to_list l in H.div [ fix b; H.ul (List.map (fun x -> H.li [ fix x ]) l) ] - | B.Anchor _ | B.Link _ -> assert false + | B.Anchor _ | B.Link _ | B.Ext _ -> assert false in + let rec to_html_rec b = match B.view b with | B.Tree (_, b, l) when config.tree_summary -> @@ -259,6 +266,14 @@ let to_html_rec ~config (b : B.t) = | B.Empty -> H.a ~a:[ H.a_id id ] [] | _ -> H.a ~a:[ H.a_id id; H.a_href @@ "#" ^ id ] [ to_html_nondet_rec inner ]) + | B.Ext {key; ext} -> + let nested b = Render_html (to_html_rec b) in + (match get_handler ~key ext ~nested with + | PrintBox.Unrecognized_extension -> assert false + | PrintBox.Same_as b -> to_html_rec b + | Render_html result -> result + | _ -> + failwith "PrintBox_html.to_html: unrecognized extension handler result") | _ -> loop to_html_rec b and to_html_nondet_rec b = match B.view b with diff --git a/src/printbox-html/PrintBox_html.mli b/src/printbox-html/PrintBox_html.mli index 8972141..bad14d4 100644 --- a/src/printbox-html/PrintBox_html.mli +++ b/src/printbox-html/PrintBox_html.mli @@ -5,6 +5,8 @@ open Tyxml type 'a html = 'a Html.elt +type toplevel_html = Html_types.li_content_fun html +type PrintBox.ext_backend_result += Render_html of toplevel_html val prelude : [> Html_types.style ] html (** HTML text to embed in the "", defining the style for tables *) diff --git a/src/printbox-md/PrintBox_md.ml b/src/printbox-md/PrintBox_md.ml index 95534e3..ad2cd3f 100644 --- a/src/printbox-md/PrintBox_md.ml +++ b/src/printbox-md/PrintBox_md.ml @@ -2,6 +2,8 @@ module B = PrintBox +let () = B.register_extension_backend ~backend_name:"md" + module Config = struct type preformatted = | Code_block @@ -251,6 +253,7 @@ let rec multiline_heuristic c b = | B.Tree (_, header, children) -> Array.length children > 0 || multiline_heuristic c header | B.Link { inner; _ } | B.Anchor { inner; _ } -> multiline_heuristic c inner + | B.Ext _ -> assert false let rec line_of_length_heuristic_exn c b = match B.view b with @@ -305,6 +308,7 @@ let rec line_of_length_heuristic_exn c b = (* INNER *) in line_of_length_heuristic_exn c inner + link_len + | B.Ext _ -> assert false let is_native_table c rows = let rec header h = @@ -330,8 +334,9 @@ let rec remove_bold b = | B.Tree _ -> assert false | B.Link { inner; uri } -> B.link ~uri @@ remove_bold inner | B.Anchor { inner; id } -> B.anchor ~id @@ remove_bold inner + | B.Ext _ -> assert false -let pp c out b = +let pp_impl c out b = let open Format in (* We cannot use Format for indentation, because we need to insert ">" at the right places. *) let rec loop ~no_block ~no_md ~prefix b = @@ -518,9 +523,12 @@ let pp c out b = | _ -> fprintf out {||} id id); loop ~no_block:true ~no_md ~prefix:(prefix ^ " ") inner; pp_print_string out "" + | B.Ext _ -> assert false in pp_open_vbox out 0; loop ~no_block:false ~no_md:false ~prefix:"" b; pp_close_box out () +let expand_exts = B.expand_extensions_same_as_only ~backend_name:"md" +let pp c out b = pp_impl c out @@ expand_exts b let to_string c b = Format.asprintf "%a@." (pp c) b diff --git a/src/printbox-md/README.md b/src/printbox-md/README.md index bde9aa1..9326b94 100644 --- a/src/printbox-md/README.md +++ b/src/printbox-md/README.md @@ -113,7 +113,7 @@ to separate the entries (here with style \`Line_break). - > followed by - a list of the child elements. -
  Trees can be made foldable: +
  Trees can be made foldable: - The head element - > is the summary diff --git a/src/printbox-text/PrintBox_text.ml b/src/printbox-text/PrintBox_text.ml index 1e485f0..ca57ffa 100644 --- a/src/printbox-text/PrintBox_text.ml +++ b/src/printbox-text/PrintBox_text.ml @@ -4,6 +4,8 @@ module B = PrintBox +let () = B.register_extension_backend ~backend_name:"text" + type position = PrintBox.position = { x: int; y: int; @@ -554,7 +556,8 @@ end = struct (* split into lines *) let acc = ref [] in lines_l_ l (fun s i len -> acc := (s, i, len) :: !acc); - Text { l = List.rev !acc; style; link_with_uri = Some uri }) + Text { l = List.rev !acc; style; link_with_uri = Some uri } + | B.Ext _ -> assert false) | B.Link { inner; uri } -> (* just encode as a record *) let self = @@ -570,6 +573,7 @@ end = struct | _ -> of_box ~ansi (B.hlist ~bars:false [ B.line uri; inner ]) in self.shape + | B.Ext _ -> assert false in { shape; size = lazy (size_of_shape shape) } @@ -819,22 +823,27 @@ end = struct let render ~ansi out b = post_render ~out (pre_render ~ansi ~out b Pos.origin) end +let expand_exts = B.expand_extensions_same_as_only ~backend_name:"text" + let to_string_with ~style b = let buf = Output.create () in - Box_inner.render ~ansi:style buf (Box_inner.of_box ~ansi:style b); + Box_inner.render ~ansi:style buf + (Box_inner.of_box ~ansi:style @@ expand_exts b); Output.to_string buf let to_string = to_string_with ~style:true let output ?(style = true) ?(indent = 0) oc b = let buf = Output.create () in - Box_inner.render ~ansi:style buf (Box_inner.of_box ~ansi:style b); + Box_inner.render ~ansi:style buf + (Box_inner.of_box ~ansi:style @@ expand_exts b); Output.to_chan ~indent oc buf; flush oc let pp_with ~style out b = let buf = Output.create () in - Box_inner.render ~ansi:style buf (Box_inner.of_box ~ansi:style b); + Box_inner.render ~ansi:style buf + (Box_inner.of_box ~ansi:style @@ expand_exts b); Output.pp out buf let pp = pp_with ~style:true diff --git a/test/dune b/test/dune index 0f86c79..06a3c1e 100644 --- a/test/dune +++ b/test/dune @@ -51,3 +51,15 @@ (modules reg_45) (package printbox-text) (libraries printbox printbox-text)) + +(test + (name same_as_only) + (modules same_as_only) + (package printbox-md) + (libraries printbox printbox-text printbox-html printbox-md)) + +(test + (name extend_html_specific) + (modules extend_html_specific) + (package printbox-html) + (libraries printbox tyxml printbox-text printbox-html)) diff --git a/test/extend_html_specific.expected b/test/extend_html_specific.expected new file mode 100644 index 0000000..d51b07c --- /dev/null +++ b/test/extend_html_specific.expected @@ -0,0 +1,8 @@ +Text output: +┌────────────┐ +│Hello world!│ +└────────────┘ + +HTML output: +

Hello world!

+ diff --git a/test/extend_html_specific.ml b/test/extend_html_specific.ml new file mode 100644 index 0000000..9ac4a31 --- /dev/null +++ b/test/extend_html_specific.ml @@ -0,0 +1,40 @@ +open Tyxml +module B = PrintBox +module H = Html + +(* This tests extensions with HTML-specific support (as well as text backend support). *) + +type B.ext += Hello_html of string + +let () = + B.register_extension ~key:"hello_html" ~domain:(function + | Hello_html _ -> true + | _ -> false) + +let example = Hello_html "" + +let text_handler ext ~nested:_ = + match ext with + | Hello_html txt -> B.Same_as (B.frame @@ B.text txt) + | _ -> B.Unrecognized_extension + +let html_handler ext ~nested:_ = + match ext with + | Hello_html txt -> + let result = H.h2 [ H.txt txt ] in + PrintBox_html.Render_html result + | _ -> B.Unrecognized_extension + +let () = + B.register_extension_handler ~backend_name:"text" ~example + ~handler:text_handler; + B.register_extension_handler ~backend_name:"html" ~example + ~handler:html_handler + +let test = B.extension @@ Hello_html "Hello world!" + +let () = + print_endline "Text output:"; + print_endline @@ PrintBox_text.to_string test; + print_endline "\nHTML output:"; + print_endline @@ PrintBox_html.to_string test diff --git a/test/same_as_only.expected b/test/same_as_only.expected new file mode 100644 index 0000000..9b6d725 --- /dev/null +++ b/test/same_as_only.expected @@ -0,0 +1,12 @@ +Text output: +┌────────────┐ +│Hello world!│ +└────────────┘ + +HTML output: +
Hello world!
+ + +Markdown output: +> Hello world! + diff --git a/test/same_as_only.ml b/test/same_as_only.ml new file mode 100644 index 0000000..05e2f80 --- /dev/null +++ b/test/same_as_only.ml @@ -0,0 +1,35 @@ +module B = PrintBox + +(* This tests that all backends support [Same_as]-only extensions. *) + +type B.ext += Hello_world of string + +let () = + B.register_extension ~key:"hello_world" ~domain:(function + | Hello_world _ -> true + | _ -> false) + +let example = Hello_world "" + +let handler ext ~nested:_ = + match ext with + | Hello_world txt -> B.Same_as (B.frame @@ B.text txt) + | _ -> B.Unrecognized_extension + +let register backend_name = + B.register_extension_handler ~backend_name ~example ~handler + +let () = + register "text"; + register "html"; + register "md" + +let test = B.extension @@ Hello_world "Hello world!" + +let () = + print_endline "Text output:"; + print_endline @@ PrintBox_text.to_string test; + print_endline "\nHTML output:"; + print_endline @@ PrintBox_html.to_string test; + print_endline "\nMarkdown output:"; + print_endline @@ PrintBox_md.(to_string Config.default test) From bf2f467bb731ceb9c4f8533d28ad3822e88288e8 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Wed, 25 Sep 2024 19:25:11 +0200 Subject: [PATCH 02/25] Remove registering backends for extensibility; fix: stop caching retrieval of handlers to avoid depending on module loading order. --- src/PrintBox.ml | 23 +++++++++-------------- src/PrintBox.mli | 12 +++--------- src/printbox-html/PrintBox_html.ml | 4 +--- src/printbox-md/PrintBox_md.ml | 7 +++---- src/printbox-text/PrintBox_text.ml | 2 -- 5 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/PrintBox.ml b/src/PrintBox.ml index ae7f757..fe4d3ce 100644 --- a/src/PrintBox.ml +++ b/src/PrintBox.ml @@ -242,17 +242,9 @@ type ext_backend_result += Unrecognized_extension | Same_as of t let extension_backends = Hashtbl.create 3 -let register_extension_backend ~backend_name = - if Hashtbl.mem extension_backends backend_name then - invalid_arg - @@ "PrintBox.register_extension_backend: backend already registered: " - ^ backend_name; - Hashtbl.add extension_backends backend_name (Hashtbl.create 4) - let register_extension_handler ~backend_name ~example ~handler = if not @@ Hashtbl.mem extension_backends backend_name then - invalid_arg @@ "PrintBox.register_extension_handler: unregistered backend " - ^ backend_name; + Hashtbl.add extension_backends backend_name (Hashtbl.create 4); let handlers = Hashtbl.find extension_backends backend_name in let key = get_extension_key example in (match handler example ~nested:(fun _ -> Same_as Empty) with @@ -262,12 +254,15 @@ let register_extension_handler ~backend_name ~example ~handler = | _ -> ()); Hashtbl.add handlers key handler -let get_extension_handler ~backend_name = +let get_extension_handler ~backend_name ~key = + (* Note: we do not cache handlers to not depend on the module loading order. *) if not @@ Hashtbl.mem extension_backends backend_name then - invalid_arg @@ "PrintBox.get_extension_handler: unregistered backend " - ^ backend_name; - let handlers = Hashtbl.find extension_backends backend_name in - fun ~key -> Hashtbl.find handlers key + fun _ext ~nested:_ -> + Unrecognized_extension + else ( + let handlers = Hashtbl.find extension_backends backend_name in + Hashtbl.find handlers key + ) let expand_extensions_same_as_only ~backend_name = let get_handler = get_extension_handler ~backend_name in diff --git a/src/PrintBox.mli b/src/PrintBox.mli index 43a2aad..5800f2a 100644 --- a/src/PrintBox.mli +++ b/src/PrintBox.mli @@ -375,12 +375,6 @@ type ext_backend_result += | Same_as of t (** The result of rendering is the same as for the given box. *) -val register_extension_backend : backend_name:string -> unit -(** Enables for a PrintBox backend (such as printbox-text, printbox-html, printbox-md) - the handling of representation extensions via {!register_extension_handler}. - Intended for backend writers. - @since NEXT_RELEASE *) - val register_extension_handler : backend_name:string -> example:ext -> @@ -401,9 +395,9 @@ val get_extension_handler : @since NEXT_RELEASE *) val expand_extensions_same_as_only : backend_name:string -> t -> t -(** [expand_extensions_same_as_only ~backend_name] expands extensions for the given backend, - as long as the backend's extension handlers only use the [Same_as] variant - of {!ext_backend_result}. +(** [expand_extensions_same_as_only ~backend_name b] expands extensions in [b] for the backend, + as long as the backend's extension handlers (for extensions in [b]) only use + the [Same_as] variant of {!ext_backend_result}. @since NEXT_RELEASE *) (** {2 Simple Structural Interface} *) diff --git a/src/printbox-html/PrintBox_html.ml b/src/printbox-html/PrintBox_html.ml index ae1614b..81eb7ac 100644 --- a/src/printbox-html/PrintBox_html.ml +++ b/src/printbox-html/PrintBox_html.ml @@ -10,8 +10,6 @@ type 'a html = 'a Html.elt type toplevel_html = Html_types.li_content_fun html type PrintBox.ext_backend_result += Render_html of toplevel_html -let () = B.register_extension_backend ~backend_name:"html" - let prelude = let l = [ @@ -266,7 +264,7 @@ let to_html_rec ~config (b : B.t) = | B.Empty -> H.a ~a:[ H.a_id id ] [] | _ -> H.a ~a:[ H.a_id id; H.a_href @@ "#" ^ id ] [ to_html_nondet_rec inner ]) - | B.Ext {key; ext} -> + | B.Ext { key; ext } -> let nested b = Render_html (to_html_rec b) in (match get_handler ~key ext ~nested with | PrintBox.Unrecognized_extension -> assert false diff --git a/src/printbox-md/PrintBox_md.ml b/src/printbox-md/PrintBox_md.ml index ad2cd3f..933416b 100644 --- a/src/printbox-md/PrintBox_md.ml +++ b/src/printbox-md/PrintBox_md.ml @@ -2,8 +2,6 @@ module B = PrintBox -let () = B.register_extension_backend ~backend_name:"md" - module Config = struct type preformatted = | Code_block @@ -529,6 +527,7 @@ let pp_impl c out b = loop ~no_block:false ~no_md:false ~prefix:"" b; pp_close_box out () -let expand_exts = B.expand_extensions_same_as_only ~backend_name:"md" -let pp c out b = pp_impl c out @@ expand_exts b +let pp c out b = + pp_impl c out @@ B.expand_extensions_same_as_only ~backend_name:"md" b + let to_string c b = Format.asprintf "%a@." (pp c) b diff --git a/src/printbox-text/PrintBox_text.ml b/src/printbox-text/PrintBox_text.ml index ca57ffa..19c5123 100644 --- a/src/printbox-text/PrintBox_text.ml +++ b/src/printbox-text/PrintBox_text.ml @@ -4,8 +4,6 @@ module B = PrintBox -let () = B.register_extension_backend ~backend_name:"text" - type position = PrintBox.position = { x: int; y: int; From f0ec8abf10304f5e9a9879031976487444e5c830 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Wed, 25 Sep 2024 19:28:29 +0200 Subject: [PATCH 03/25] Plotting 1 of 3: text only, no nesting --- dune-project | 14 + printbox-ext-plot.opam | 39 +++ src/printbox-ext-plot/PrintBox_ext_plot.ml | 270 ++++++++++++++++++++ src/printbox-ext-plot/PrintBox_ext_plot.mli | 37 +++ src/printbox-ext-plot/dune | 7 + test/dune | 6 + test/plotting.expected | 50 ++++ test/plotting.ml | 23 ++ 8 files changed, 446 insertions(+) create mode 100644 printbox-ext-plot.opam create mode 100644 src/printbox-ext-plot/PrintBox_ext_plot.ml create mode 100644 src/printbox-ext-plot/PrintBox_ext_plot.mli create mode 100644 src/printbox-ext-plot/dune create mode 100644 test/plotting.expected create mode 100644 test/plotting.ml diff --git a/dune-project b/dune-project index 7329786..020d80a 100644 --- a/dune-project +++ b/dune-project @@ -47,3 +47,17 @@ Printbox allows to print nested boxes, lists, arrays, tables in several formats" (printbox-html (and (= :version))) (odoc :with-test) (mdx (and (>= 1.4) :with-test)))) + +(package + (name printbox-ext-plot) +(synopsis "Printbox extension for plotting") +(description " +Extends Printbox with the ability to print scatter plots, line plots, decision boundaries. +Printbox allows to print nested boxes, lists, arrays, tables in several formats") + (depends (printbox (= :version)) + (printbox-text (and (= :version))) + (printbox-html (and (= :version))) + (printbox-md (and (= :version))) + (tyxml (>= 4.3)) + (odoc :with-test) + (mdx (and (>= 1.4) :with-test)))) diff --git a/printbox-ext-plot.opam b/printbox-ext-plot.opam new file mode 100644 index 0000000..d5aa992 --- /dev/null +++ b/printbox-ext-plot.opam @@ -0,0 +1,39 @@ +# This file is generated by dune, edit dune-project instead +opam-version: "2.0" +version: "0.11" +synopsis: "Printbox extension for plotting" +description: """ + +Extends Printbox with the ability to print scatter plots, line plots, decision boundaries. +Printbox allows to print nested boxes, lists, arrays, tables in several formats""" +maintainer: ["c-cube" "lukstafi"] +authors: ["Simon Cruanes" "Guillaume Bury" "lukstafi"] +license: "BSD-2-Clause" +homepage: "https://github.com/c-cube/printbox" +bug-reports: "https://github.com/c-cube/printbox/issues" +depends: [ + "dune" {>= "3.0"} + "printbox" {= version} + "printbox-text" {= version} + "printbox-html" {= version} + "printbox-md" {= version} + "tyxml" {>= "4.3"} + "odoc" {with-test} + "mdx" {>= "1.4" & with-test} + "odoc" {with-doc} +] +build: [ + ["dune" "subst"] {dev} + [ + "dune" + "build" + "-p" + name + "-j" + jobs + "@install" + "@runtest" {with-test} + "@doc" {with-doc} + ] +] +dev-repo: "git+https://github.com/c-cube/printbox.git" diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml new file mode 100644 index 0000000..9b7ab5f --- /dev/null +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -0,0 +1,270 @@ +open Tyxml +module B = PrintBox +module H = Html + +(* This tests extensions with HTML-specific support (as well as text backend support). *) + +type plot_spec = + | Scatterplot of { + points: (float * float) array; + pixel: string; + } + | Line_plot of { + points: float array; + pixel: string; + } + | Boundary_map of { + callback: float * float -> bool; + pixel_true: string; + pixel_false: string; + } + | Line_plot_adaptive of { + callback: float -> float; + cache: (float, float) Hashtbl.t; + pixel: string; + } +[@@deriving sexp_of] + +type graph = { + specs: plot_spec list; + x_label: string; + y_label: string; + size: int * int; + no_axes: bool; + prec: int; +} + +let default_config = + { + specs = []; + x_label = "x"; + y_label = "y"; + size = 120, 40; + no_axes = false; + prec = 3; + } + +type PrintBox.ext += Plot of graph + +let () = + B.register_extension ~key:"plot" ~domain:(function + | Plot _ -> true + | _ -> false) + +let plot_canvas ?canvas ?(size : (int * int) option) (specs : plot_spec list) : + float * float * float * float * _ = + (* Unfortunately "x" and "y" of a "matrix" are opposite to how we want them displayed -- + the first dimension (i.e. "x") as the horizontal axis. *) + let (dimx, dimy, canvas) : int * int * _ = + match canvas, size with + | None, None -> invalid_arg "PrintBox_utils.plot: provide ~canvas or ~size" + | None, Some (dimx, dimy) -> dimx, dimy, Array.make_matrix dimy dimx " " + | Some canvas, None -> + let dimy = Array.length canvas in + let dimx = Array.length canvas.(0) in + dimx, dimy, canvas + | Some canvas, Some (dimx, dimy) -> + assert (dimy = Array.length canvas); + assert (dimx = Array.length canvas.(0)); + dimx, dimy, canvas + in + let all_x_points = + specs + |> List.map (function + | Scatterplot { points; _ } -> Array.map fst points + | Line_plot _ -> [||] + | Boundary_map _ -> [||] + | Line_plot_adaptive _ -> [||]) + |> Array.concat + in + let given_y_points = + specs + |> List.map (function + | Scatterplot { points; _ } -> Array.map snd points + | Line_plot { points; _ } -> points + | Boundary_map _ -> [||] + | Line_plot_adaptive _ -> [||]) + |> Array.concat + in + let extra_y_points = + specs + |> List.map (function + | Line_plot_adaptive { callback; cache; _ } -> + Array.iter + (fun x -> + if not (Hashtbl.mem cache x) then + Hashtbl.add cache x (callback x)) + all_x_points; + Array.of_seq @@ Hashtbl.to_seq_values cache + | _ -> [||]) + |> Array.concat + in + let all_y_points = Array.append given_y_points extra_y_points in + let minx = + if all_x_points = [||] then + 0. + else + Array.fold_left min all_x_points.(0) all_x_points + in + let miny = + if all_y_points = [||] then + 0. + else + Array.fold_left min all_y_points.(0) all_y_points + in + let maxx = + if all_x_points = [||] then + Float.of_int (Array.length all_y_points - 1) + else + Array.fold_left max all_x_points.(0) all_x_points + in + let maxy = + if all_y_points = [||] then + maxx -. minx + else + Array.fold_left max all_y_points.(0) all_y_points + in + let spanx = maxx -. minx in + let spanx = + if spanx <= epsilon_float then + 1.0 + else + spanx + in + let spany = maxy -. miny in + let spany = + if spany <= epsilon_float then + 1.0 + else + spany + in + let scale_1d y = + try Some Float.(to_int @@ (of_int (dimy - 1) *. (y -. miny) /. spany)) + with Invalid_argument _ -> None + in + let scale_2d (x, y) = + try + Some + Float.( + ( to_int @@ (of_int (dimx - 1) *. (x -. minx) /. spanx), + to_int @@ (of_int (dimy - 1) *. (y -. miny) /. spany) )) + with Invalid_argument _ -> None + in + specs + |> List.iter (function + | Scatterplot { points; pixel } -> + Array.map scale_2d points + |> Array.iter (function + | Some (i, j) -> canvas.(dimy - 1 - j).(i) <- pixel + | None -> ()) + | Line_plot { points; pixel } -> + let points = Array.map scale_1d points in + let npoints = Float.of_int (Array.length points) in + let rescale_x i = + Float.(to_int @@ (of_int i *. of_int dimx /. npoints)) + in + (* TODO: implement interpolation if not enough points. *) + points + |> Array.iteri (fun i -> + Option.iter (fun j -> + canvas.(dimy - 1 - j).(rescale_x i) <- pixel)) + | Boundary_map { callback; pixel_true; pixel_false } -> + canvas + |> Array.iteri (fun dmj -> + Array.iteri (fun i pix -> + if String.trim pix = "" then ( + let x = + Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx + in + let y = + Float.( + of_int (dimy - 1 - dmj) *. spany /. of_int (dimy - 1)) + +. miny + in + canvas.(dmj).(i) <- + (if callback (x, y) then + pixel_true + else + pixel_false) + ))) + | Line_plot_adaptive { callback; cache; pixel } -> + canvas.(0) + |> Array.iteri (fun i pix -> + if String.trim pix = "" then ( + let x = + Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx + in + let y = + match Hashtbl.find_opt cache x with + | Some y -> y + | None -> + let y = callback x in + Hashtbl.add cache x y; + y + in + scale_1d y + |> Option.iter (fun j -> canvas.(dimy - 1 - j).(i) <- pixel) + ))); + minx, miny, maxx, maxy, canvas + +let concise_float = ref (fun ~prec -> Printf.sprintf "%.*g" prec) + +let plot ?(prec = 3) ?(no_axes = false) ?canvas ?size ?(x_label = "x") + ?(y_label = "y") specs = + let minx, miny, maxx, maxy, canvas = plot_canvas ?canvas ?size specs in + let open PrintBox in + let y_label_l = + List.map Char.escaped @@ List.of_seq @@ String.to_seq y_label + in + if no_axes then + grid_text ~bars:false canvas + else + grid_l + [ + [ + hlist ~bars:false + [ + align ~h:`Left ~v:`Center @@ lines y_label_l; + vlist ~bars:false + [ + line @@ !concise_float ~prec maxy; + align_bottom @@ line @@ !concise_float ~prec miny; + ]; + ]; + grid_text ~bars:false canvas; + ]; + [ + empty; + vlist ~bars:false + [ + hlist ~bars:false + [ + line @@ !concise_float ~prec minx; + align_right @@ line @@ !concise_float ~prec maxx; + ]; + align ~h:`Center ~v:`Bottom @@ line x_label; + ]; + ]; + ] + +let example = Plot default_config + +let text_handler ext ~nested:_ = + match ext with + | Plot { specs; x_label; y_label; size; no_axes; prec } -> + B.Same_as (B.frame @@ plot ~prec ~no_axes ~size ~x_label ~y_label specs) + | _ -> B.Unrecognized_extension + +let html_handler ext ~nested:_ = + match ext with + | Plot _ -> + let result = H.h2 [ H.txt "NOT IMPLEMENTED YET" ] in + PrintBox_html.Render_html result + | _ -> B.Unrecognized_extension + +let () = + B.register_extension_handler ~backend_name:"text" ~example + ~handler:text_handler; + B.register_extension_handler ~backend_name:"md" ~example ~handler:text_handler; + B.register_extension_handler ~backend_name:"html" ~example + ~handler:html_handler diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli new file mode 100644 index 0000000..a8e2119 --- /dev/null +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -0,0 +1,37 @@ +(* This file is free software. See file "license" for more details. *) + +(** {1 Extend [PrintBox.t] with plots of scatter graphs and line graphs} *) + +type plot_spec = + | Scatterplot of { + points: (float * float) array; + pixel: string; + } + | Line_plot of { + points: float array; + pixel: string; + } + | Boundary_map of { + callback: float * float -> bool; + pixel_true: string; + pixel_false: string; + } + | Line_plot_adaptive of { + callback: float -> float; + cache: (float, float) Hashtbl.t; + pixel: string; + } +[@@deriving sexp_of] + +type graph = { + specs: plot_spec list; + x_label: string; + y_label: string; + size: int * int; + no_axes: bool; + prec: int; +} + +val default_config : graph + +type PrintBox.ext += Plot of graph diff --git a/src/printbox-ext-plot/dune b/src/printbox-ext-plot/dune new file mode 100644 index 0000000..28bc1d1 --- /dev/null +++ b/src/printbox-ext-plot/dune @@ -0,0 +1,7 @@ +(library + (name printbox_ext_plot) + (public_name printbox-ext-plot) + (wrapped false) + (modules PrintBox_ext_plot) + (flags :standard -w +a-3-4-44-29 -safe-string) + (libraries printbox tyxml printbox-text printbox-html printbox-md)) diff --git a/test/dune b/test/dune index 06a3c1e..749aa40 100644 --- a/test/dune +++ b/test/dune @@ -63,3 +63,9 @@ (modules extend_html_specific) (package printbox-html) (libraries printbox tyxml printbox-text printbox-html)) + +(test + (name plotting) + (modules plotting) + (package printbox-ext-plot) + (libraries printbox printbox-ext-plot printbox-text printbox-html)) diff --git a/test/plotting.expected b/test/plotting.expected new file mode 100644 index 0000000..d6e6c97 --- /dev/null +++ b/test/plotting.expected @@ -0,0 +1,50 @@ +Text output: +┌──┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1│# │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ # │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│y │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ 0│ #│ +├──┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ │0 1│ +│ │ x │ +└──┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +HTML output: +

NOT IMPLEMENTED YET

+ diff --git a/test/plotting.ml b/test/plotting.ml new file mode 100644 index 0000000..61a45f5 --- /dev/null +++ b/test/plotting.ml @@ -0,0 +1,23 @@ +module B = PrintBox +module BPlot = PrintBox_ext_plot + +(* This tests the printbox-ext-plot extension. *) + +let test = + B.extension + @@ BPlot.( + Plot + { + default_config with + specs = + [ + Scatterplot + { points = [| 0., 1.; 1., 0.; 0.75, 0.75 |]; pixel = "#" }; + ]; + }) + +let () = + print_endline "Text output:"; + print_endline @@ PrintBox_text.to_string test; + print_endline "\nHTML output:"; + print_endline @@ PrintBox_html.to_string test From 4d52d2283031df0e0b4fcea0ec4ec55b1003589f Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Wed, 25 Sep 2024 21:16:16 +0200 Subject: [PATCH 04/25] Expose `PrintBox_ext_plot.concise_float` --- src/printbox-ext-plot/PrintBox_ext_plot.mli | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index a8e2119..63807c3 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -35,3 +35,5 @@ type graph = { val default_config : graph type PrintBox.ext += Plot of graph + +val concise_float : (prec:int -> float -> string) ref From e40afd325a847932e79629d70132003a9f3e26bb Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Wed, 25 Sep 2024 22:27:30 +0200 Subject: [PATCH 05/25] Partially rendered boxes: embed rendering result in a box --- src/PrintBox.ml | 21 +++++++++++------- src/PrintBox.mli | 9 ++++++++ test/extend_html_specific.expected | 16 +++++++++++--- test/extend_html_specific.ml | 34 +++++++++++++++++++++--------- 4 files changed, 59 insertions(+), 21 deletions(-) diff --git a/src/PrintBox.ml b/src/PrintBox.ml index fe4d3ce..9c64f24 100644 --- a/src/PrintBox.ml +++ b/src/PrintBox.ml @@ -239,8 +239,10 @@ let extension ext = Ext { key = get_extension_key ext; ext } type ext_backend_result = .. type ext_backend_result += Unrecognized_extension | Same_as of t +type ext += Embed_rendering of ext_backend_result let extension_backends = Hashtbl.create 3 +let embed_rendering result = Ext { key = ""; ext = Embed_rendering result } let register_extension_handler ~backend_name ~example ~handler = if not @@ Hashtbl.mem extension_backends backend_name then @@ -254,15 +256,18 @@ let register_extension_handler ~backend_name ~example ~handler = | _ -> ()); Hashtbl.add handlers key handler -let get_extension_handler ~backend_name ~key = +let get_extension_handler ~backend_name ~key ext = (* Note: we do not cache handlers to not depend on the module loading order. *) - if not @@ Hashtbl.mem extension_backends backend_name then - fun _ext ~nested:_ -> - Unrecognized_extension - else ( - let handlers = Hashtbl.find extension_backends backend_name in - Hashtbl.find handlers key - ) + match ext with + | Embed_rendering result -> fun ~nested:_ -> result + | _ -> + if not @@ Hashtbl.mem extension_backends backend_name then + fun ~nested:_ -> + Unrecognized_extension + else ( + let handlers = Hashtbl.find extension_backends backend_name in + Hashtbl.find handlers key ext + ) let expand_extensions_same_as_only ~backend_name = let get_handler = get_extension_handler ~backend_name in diff --git a/src/PrintBox.mli b/src/PrintBox.mli index 5800f2a..1936682 100644 --- a/src/PrintBox.mli +++ b/src/PrintBox.mli @@ -375,6 +375,15 @@ type ext_backend_result += | Same_as of t (** The result of rendering is the same as for the given box. *) +type ext += + | Embed_rendering of ext_backend_result + (** Lets extensions stage rendering by embedding partial results inside boxes. *) + +val embed_rendering : ext_backend_result -> t +(** Embeds the given rendering result in a box. Only backends that can handle the result + will be able to render the returned box! + @since NEXT_RELEASE *) + val register_extension_handler : backend_name:string -> example:ext -> diff --git a/test/extend_html_specific.expected b/test/extend_html_specific.expected index d51b07c..d943db5 100644 --- a/test/extend_html_specific.expected +++ b/test/extend_html_specific.expected @@ -1,8 +1,18 @@ -Text output: +Text output simple: ┌────────────┐ │Hello world!│ └────────────┘ -HTML output: -

Hello world!

+HTML output simple: +
+ + +Text output with header: +Greetings! +└─┬─────────────────┐ + │Hello wide world!│ + └─────────────────┘ + +HTML output with header: +
Greetings!
diff --git a/test/extend_html_specific.ml b/test/extend_html_specific.ml index 9ac4a31..acf78ff 100644 --- a/test/extend_html_specific.ml +++ b/test/extend_html_specific.ml @@ -4,25 +4,33 @@ module H = Html (* This tests extensions with HTML-specific support (as well as text backend support). *) -type B.ext += Hello_html of string +type B.ext += Hello_html of string | Hello_with_header of string let () = B.register_extension ~key:"hello_html" ~domain:(function - | Hello_html _ -> true + | Hello_html _ | Hello_with_header _ -> true | _ -> false) let example = Hello_html "" let text_handler ext ~nested:_ = match ext with - | Hello_html txt -> B.Same_as (B.frame @@ B.text txt) + | Hello_html txt -> B.Same_as B.(frame @@ text txt) + | Hello_with_header txt -> + B.Same_as B.(tree (text "Greetings!") [ frame @@ text txt ]) | _ -> B.Unrecognized_extension -let html_handler ext ~nested:_ = +let html_handler ext ~nested = match ext with | Hello_html txt -> - let result = H.h2 [ H.txt txt ] in + let result = H.button [ H.txt txt ] in PrintBox_html.Render_html result + | Hello_with_header txt -> + let result = H.button [ H.txt txt ] in + nested + B.( + tree (text "Greetings!") + [ embed_rendering @@ PrintBox_html.Render_html result ]) | _ -> B.Unrecognized_extension let () = @@ -31,10 +39,16 @@ let () = B.register_extension_handler ~backend_name:"html" ~example ~handler:html_handler -let test = B.extension @@ Hello_html "Hello world!" +let test1 = B.extension @@ Hello_html "Hello world!" +let test2 = B.extension @@ Hello_with_header "Hello wide world!" let () = - print_endline "Text output:"; - print_endline @@ PrintBox_text.to_string test; - print_endline "\nHTML output:"; - print_endline @@ PrintBox_html.to_string test + print_endline "Text output simple:"; + print_endline @@ PrintBox_text.to_string test1; + print_endline "\nHTML output simple:"; + print_endline @@ PrintBox_html.to_string test1; + print_endline "\nText output with header:"; + print_endline @@ PrintBox_text.to_string test2; + print_endline "\nHTML output with header:"; + print_endline + @@ PrintBox_html.(to_string ~config:Config.(tree_summary true default) test2) From 381d59c0ec3be209c1b2c47ce1d9b3152d51f990 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Thu, 26 Sep 2024 00:15:46 +0200 Subject: [PATCH 06/25] Plotting in html: mimic the text rendering This works sufficiently well for scatterplots, but insufficiently well for line plots and horribly for other plots --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 53 +++++++++++++++++++--- test/plotting.expected | 2 +- test/plotting.ml | 8 ++-- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index 9b7ab5f..12b667d 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -210,14 +210,14 @@ let plot_canvas ?canvas ?(size : (int * int) option) (specs : plot_spec list) : let concise_float = ref (fun ~prec -> Printf.sprintf "%.*g" prec) let plot ?(prec = 3) ?(no_axes = false) ?canvas ?size ?(x_label = "x") - ?(y_label = "y") specs = + ?(y_label = "y") embed_canvas specs = let minx, miny, maxx, maxy, canvas = plot_canvas ?canvas ?size specs in let open PrintBox in let y_label_l = List.map Char.escaped @@ List.of_seq @@ String.to_seq y_label in if no_axes then - grid_text ~bars:false canvas + embed_canvas canvas else grid_l [ @@ -231,7 +231,7 @@ let plot ?(prec = 3) ?(no_axes = false) ?canvas ?size ?(x_label = "x") align_bottom @@ line @@ !concise_float ~prec miny; ]; ]; - grid_text ~bars:false canvas; + embed_canvas canvas; ]; [ empty; @@ -252,14 +252,53 @@ let example = Plot default_config let text_handler ext ~nested:_ = match ext with | Plot { specs; x_label; y_label; size; no_axes; prec } -> - B.Same_as (B.frame @@ plot ~prec ~no_axes ~size ~x_label ~y_label specs) + B.Same_as + (B.frame + @@ plot ~prec ~no_axes ~size ~x_label ~y_label + (B.grid_text ?pad:None ~bars:false) + specs) | _ -> B.Unrecognized_extension +let embed_canvas_html canvas = + let size_y = Array.length canvas in + let size_x = Array.length canvas.(0) in + let cells = + canvas + |> Array.mapi (fun y row -> + row + |> Array.mapi (fun x cell -> x, cell) + |> Array.to_list + |> List.filter_map (fun (x, cell) -> + if String.trim cell = "" then + None + else + Some + (H.span + ~a: + [ + H.a_style + ("position:absolute;top:" ^ Int.to_string y + ^ "px;left:" ^ Int.to_string x ^ "px"); + ] + [ H.txt cell ]))) + in + let result = + Array.to_list cells |> List.concat + |> H.div + ~a: + [ + H.a_style @@ "border:thin dotted;position:relative;width:" ^ Int.to_string size_x + ^ ";height:" ^ Int.to_string size_y; + ] + in + B.embed_rendering @@ PrintBox_html.Render_html result + let html_handler ext ~nested:_ = match ext with - | Plot _ -> - let result = H.h2 [ H.txt "NOT IMPLEMENTED YET" ] in - PrintBox_html.Render_html result + | Plot { specs; x_label; y_label; size; no_axes; prec } -> + B.Same_as + (B.frame + @@ plot ~prec ~no_axes ~size ~x_label ~y_label embed_canvas_html specs) | _ -> B.Unrecognized_extension let () = diff --git a/test/plotting.expected b/test/plotting.expected index d6e6c97..1c4399e 100644 --- a/test/plotting.expected +++ b/test/plotting.expected @@ -46,5 +46,5 @@ Text output: └──┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -

NOT IMPLEMENTED YET

+
y
1
0
###
0
1
x
diff --git a/test/plotting.ml b/test/plotting.ml index 61a45f5..35c9b0d 100644 --- a/test/plotting.ml +++ b/test/plotting.ml @@ -3,12 +3,13 @@ module BPlot = PrintBox_ext_plot (* This tests the printbox-ext-plot extension. *) -let test = +let test ~size = B.extension @@ BPlot.( Plot { default_config with + size; specs = [ Scatterplot @@ -18,6 +19,7 @@ let test = let () = print_endline "Text output:"; - print_endline @@ PrintBox_text.to_string test; + print_endline @@ PrintBox_text.to_string + @@ test ~size:BPlot.default_config.size; print_endline "\nHTML output:"; - print_endline @@ PrintBox_html.to_string test + print_endline @@ PrintBox_html.to_string @@ test ~size:(800, 800) From 3cef520d27a6dd165c3ffa9294521ae0ae113028 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Thu, 26 Sep 2024 12:06:24 +0200 Subject: [PATCH 07/25] Plotting extension: html output --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 38 +++++++++++---- test/dune | 6 +++ test/plotting_half_moons.expected | 50 +++++++++++++++++++ test/plotting_half_moons.ml | 57 ++++++++++++++++++++++ 4 files changed, 142 insertions(+), 9 deletions(-) create mode 100644 test/plotting_half_moons.expected create mode 100644 test/plotting_half_moons.ml diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index 12b667d..dcadc2e 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -51,8 +51,8 @@ let () = | Plot _ -> true | _ -> false) -let plot_canvas ?canvas ?(size : (int * int) option) (specs : plot_spec list) : - float * float * float * float * _ = +let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) + (specs : plot_spec list) : float * float * float * float * _ = (* Unfortunately "x" and "y" of a "matrix" are opposite to how we want them displayed -- the first dimension (i.e. "x") as the horizontal axis. *) let (dimx, dimy, canvas) : int * int * _ = @@ -150,6 +150,20 @@ let plot_canvas ?canvas ?(size : (int * int) option) (specs : plot_spec list) : to_int @@ (of_int (dimy - 1) *. (y -. miny) /. spany) )) with Invalid_argument _ -> None in + let spread i j px1 px2 = + if sparse then + (i mod 10 = 0 && j mod 10 = 0) + || i mod 10 = 5 + && j mod 10 = 0 + && canvas.(j).(i - 5) <> px1 + && canvas.(j).(i - 5) <> px2 + || i mod 10 = 0 + && j mod 10 = 5 + && canvas.(j - 5).(i) <> px1 + && canvas.(j - 5).(i) <> px2 + else + true + in specs |> List.iter (function | Scatterplot { points; pixel } -> @@ -172,7 +186,10 @@ let plot_canvas ?canvas ?(size : (int * int) option) (specs : plot_spec list) : canvas |> Array.iteri (fun dmj -> Array.iteri (fun i pix -> - if String.trim pix = "" then ( + if + String.trim pix = "" + && spread i dmj pixel_true pixel_false + then ( let x = Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx in @@ -210,8 +227,10 @@ let plot_canvas ?canvas ?(size : (int * int) option) (specs : plot_spec list) : let concise_float = ref (fun ~prec -> Printf.sprintf "%.*g" prec) let plot ?(prec = 3) ?(no_axes = false) ?canvas ?size ?(x_label = "x") - ?(y_label = "y") embed_canvas specs = - let minx, miny, maxx, maxy, canvas = plot_canvas ?canvas ?size specs in + ?(y_label = "y") ~sparse embed_canvas specs = + let minx, miny, maxx, maxy, canvas = + plot_canvas ?canvas ?size ~sparse specs + in let open PrintBox in let y_label_l = List.map Char.escaped @@ List.of_seq @@ String.to_seq y_label @@ -254,7 +273,7 @@ let text_handler ext ~nested:_ = | Plot { specs; x_label; y_label; size; no_axes; prec } -> B.Same_as (B.frame - @@ plot ~prec ~no_axes ~size ~x_label ~y_label + @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:false (B.grid_text ?pad:None ~bars:false) specs) | _ -> B.Unrecognized_extension @@ -287,8 +306,8 @@ let embed_canvas_html canvas = |> H.div ~a: [ - H.a_style @@ "border:thin dotted;position:relative;width:" ^ Int.to_string size_x - ^ ";height:" ^ Int.to_string size_y; + H.a_style @@ "border:thin dotted;position:relative;width:" + ^ Int.to_string size_x ^ ";height:" ^ Int.to_string size_y; ] in B.embed_rendering @@ PrintBox_html.Render_html result @@ -298,7 +317,8 @@ let html_handler ext ~nested:_ = | Plot { specs; x_label; y_label; size; no_axes; prec } -> B.Same_as (B.frame - @@ plot ~prec ~no_axes ~size ~x_label ~y_label embed_canvas_html specs) + @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:true + embed_canvas_html specs) | _ -> B.Unrecognized_extension let () = diff --git a/test/dune b/test/dune index 749aa40..803d607 100644 --- a/test/dune +++ b/test/dune @@ -69,3 +69,9 @@ (modules plotting) (package printbox-ext-plot) (libraries printbox printbox-ext-plot printbox-text printbox-html)) + +(test + (name plotting_half_moons) + (modules plotting_half_moons) + (package printbox-ext-plot) + (libraries printbox printbox-ext-plot printbox-text printbox-html)) diff --git a/test/plotting_half_moons.expected b/test/plotting_half_moons.expected new file mode 100644 index 0000000..16350cc --- /dev/null +++ b/test/plotting_half_moons.expected @@ -0,0 +1,50 @@ +Text output: +┌───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1.09 │..................................#.................................................************************************│ +│ │...................................##.#.....#...##................................**************************************│ +│ │..........................#.#.#.##.#..#.#..#......#..##.........................****************************************│ +│ │.........................#..#..#.###.#....#.#...###.#...#......#...............*****************************************│ +│ │.................#.....#########.##.###....#.##..##...##.##.#................*******************************************│ +│ │...............##.#.###...###.#..#.#.##.....####...##.##...#.#.............*********************************************│ +│ │....................#.#..#.########.....#####..#...#.##..#.##.##.........***********************************************│ +│ │...........#....#..#..##.#...#..#.#.#..###........###...#...####.##.#.#.************************************************│ +│ │..........#.......#....##.##.#.#.#...#..#.####...#.......#.##..####.#.***#**********************************************│ +│ │............###.....#.###.###.#.#.#............#...#......####.#..##*#**************************************************│ +│ │........#...##.#..#..#.....#.....#....................#..###....#..#**#*************************************************│ +│ │........##..####..#.#.##................................#.....#..##*#*#*************************************************│ +│ │...#.....#..##.#.##..#.............%..........................#***#*##**************************************************│ +│ │........#.###.#.....#........................%%............#.***##*#**#*#**********************************%*******%****│ +│ │.#.#.##....##..#...##...................%....%..............*****##*##**##*#*#******************************************│ +│ │.#..#.#..###..##.##.....................%%....%...........*********###*****##***#*****************************%*%*%%*%**│ +│ │.......##...##.......................%...%%%%%..........***********#*##*###**#****************************%%****%*%%%***│ +│ │#..##.#.#..#..#...................%.%....%..%%%........**********#****#*****#***#************************%***%***%******│ +│ │.###.#..#...#.#....................%...%.%......%....***************##***#**###**##********************%%*%*****%%**%*%*│ +│y │#..#.##.#.#.##.....................%%..%.%.%...%...***************#*********#*#**#**********************%%**%******%%*%%│ +│ │##....###...#......................%.%.%...%.%%..********************##**#*###****#********************%*%****%%**%*%*%*│ +│ │.#.......####................................%%.%**%***********************##*##*##***********************%%******%%*%%*│ +│ │...#..#..###.......................%..%%.%%..%****%*******************##***#*#*####*******************%%*%******%*%*****│ +│ │.......##.............................%...%.%%*%********************#**#**#*******#*********************%***%*%***%*%***│ +│ │.....#..#.................................%*%***%***%*******************#*******#*******************%**%%*%***%****%****│ +│ │..........##...........................%.*%%%***%*%%**********************#***#*#******************%%***%%**%%%**%******│ +│ │#.#..................................%.**%***%**%*%****%%%***********#***#*****#**#*******************%%%%*%%***********│ +│ │..#...#..............................*%%*%***%*%%*%*%********************#******#***********%******%%%%%%*%*%%***%******│ +│ │....................................*********%***%%%****%*%*%*%******#************************%**%**%*%%**%*%*%**%******│ +│ │..................................*******%*%*%%%%*%**%**%%*********%*************************%*%**%%%*%**%*%*****%******│ +│ │................................**********%****%%%%%%**%*%********%********************%*%%**%**%%*%%%*%*%**************│ +│ │..............................*******************%*******%%%%%%*%*%**%%************%**%%%%%*%*%***%*********************│ +│ │.............................**************%****%**%%*%*********%**%%***%%%*%***%%%%*%%*%**%**%**%*****%*%**************│ +│ │...........................*******************%**%**%%**%%%****%**%%*%*%*%***%*%*%*%%%**%%*%**%%%*%%*******%************│ +│ │.........................**********************%*%*%*%**%%********%%%***%***%%%%%%%%****%**%**%%%**%********************│ +│ │........................******************************%***%%***%*%%*%%*%*%%*****%***%*%*%***%%%%****%%%*****************│ +│ │......................**************************************%**%*%%%**%%*%%***%%*%****%%**%%%*%*******%*****************│ +│ │....................*************************************%%%%%********%*%*%*%%*%*%*%%**%%*%*****%***********************│ +│ │..................********************************************%*%%*%*%%**%%%**%%%%%****%%*******************************│ +│ -0.794│.................********************************************%********%******%****%*****%%******************************│ +├───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ │-1.25 2.1│ +│ │ x │ +└───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +HTML output: +
y
1.09
-0.794
.......................#.................................************************##........................................................************************#####..................................#.....................*************************########.......................................................*************************######....................#..................................**************************#########......................................................**************************##########.......................#..............................***************************################....................................................****************************#############...................#......#.........#.......#...........****************************##############.....................................#..............*****************************##############...............#...#.............#....................*****************************################....................#.......................#.......******************************############.....................#...............#..............******************************##########....................#...................#......#....*******************************##################.................................................*******************************###############.............#..................#.............#....********************************#################........................................#.......*********************************################...............................................*********************************#########........#...........................#..........#.**********************************########.###..............................................**********************************##########.........#...................................#.***********************************#########.............................................***********************************############......#......................................************************************#####%###.......#....................................*************************************########...........................................*************************************##############..........................................****#**********************************###%#%..........................................**************************************#%####%#####.........................................******#*********************************###########.....#..........................%..........*********#******************************##%##%#.......#.................................***************************************%*%###%#####%..#..........#...........................********#*********************************###%#%%#####...............................%........**************************************%***###%%%%#######%.............................%.........**************************************%****#%%#%%%#%#%%......................................******************************************##%###%%%%###......#...............................***************#****************************#####%#%%%#...#..................................****************#***************************#%%####%##%#%#%#..#...............................%...********************************************#%#%#%####%.#......#.............................********************************************%###%%%#%#%%%#%%%...................................*********************************************#%%###%##%%##%%..................................**********************************************#%%###%%%#%##%#%..................................**********************************************##%%#%#%#%%##...........................%......***********************************************%##%%#%%%##%.......#..........................***********************************************%#%#%.#%##%%%##................................************************************************#%##%###%#................................***********************#*************************%#%#%#%##%##%%#%%...............................***********************#**********************%****%#%%%%%%%......#.......................%.********************#******************************%##%%%%......#........................*****************#*********************************%#%%#%.............................***************************************************%%%#%#%%%.............................%***************************************************%%#%%#%#%#%%............................***************************************%*************%%%%%%%#%...........................%.*************************#***************************%%%%#%#%%#%%%...........................*****************************************************#%#%%##%%%%...........................***********%*%%*****************************************#%%%%%#%%%%%%%%..........................************************#******************************%%%%%#%%%%%%%%%.........................***%**************************#**************************%%%*%%%%%%%%.........................**********************#*********************%**%**********%%%%%%%........................*****************************************************%***%%%%%%%%%%%%%........................********************************************************%%%%%%%%%%%%.......................*****************************************%%****************%%%%%%%%%%%.......................**********************%***********************%************%%%%%%%%%%%%%%......................**********************************************************%%%%%%%%.....................***************************%********************************%%%%%%%%%.....................********************%***************************************%%%%%%*%%%%%%%%%%....................******************************************%******************%%%%%%%%%%%%%%%%%%%%%....................********************************************%****************%%%%%%%%%%%...................*********************************************%%****************%%%%%%%%%%%...................**************************%************%***********************%%%%%%%%%%%%%%%%%%%..................**************************************************************%%%%%%%%%%%%%.................**************************************************%*************%%%%%%%%%%%%%.................**********************************************%*****************%%%%%%%%%................*******************************%*********************************%%%%%%%%%%%%%%%%................***************************%**************************%***********%%%%%%%%%...............***********************************%******************************%%%%%%%%%%%%%%...............*************************************%********%********************%%%%%%%%%%..............*********************************************%*********************%%%%%%%%..............******************************************************************%%%%%%%%.............*******************************************************************%%%%%%%%%%%%%............********************************************************************%%%%............********************************************************************%%
-1.25
2.1
x
+ diff --git a/test/plotting_half_moons.ml b/test/plotting_half_moons.ml new file mode 100644 index 0000000..85b7e70 --- /dev/null +++ b/test/plotting_half_moons.ml @@ -0,0 +1,57 @@ +module B = PrintBox +module BPlot = PrintBox_ext_plot + +module Rand = struct + let rand = ref (1l : Int32.t) + + let rand_int32 () = + let open Int32 in + rand := logxor !rand @@ shift_left !rand 13; + rand := logxor !rand @@ shift_right_logical !rand 17; + rand := logxor !rand @@ shift_left !rand 5; + !rand + + let float_range low high = + let raw = Int32.(to_float @@ rem (rand_int32 ()) 10000l) in + (raw /. 10000. *. (high -. low)) +. low + + let int high = Int32.(to_int @@ rem (rand_int32 ()) (of_int high)) +end + +let noise () = Rand.float_range (-0.1) 0.1 + +(* This tests the printbox-ext-plot extension. *) +let moons data_len = + let npairs = data_len / 2 in + Array.split + (Array.init npairs (fun _pos -> + let i = Rand.int npairs in + let v = Float.(of_int (i / 2) *. pi /. of_int npairs) in + let c = cos v and s = sin v in + ( (s +. noise (), c +. noise ()), + (1.0 -. s +. noise (), 0.5 -. c +. noise ()) ))) + +let points1, points2 = moons 1024 +let callback (x, y) = Float.compare x y > 0 + +let test ~size = + B.extension + @@ BPlot.( + Plot + { + default_config with + size; + specs = + [ + Scatterplot { points = points1; pixel = "#" }; + Scatterplot { points = points2; pixel = "%" }; + Boundary_map { pixel_false = "."; pixel_true = "*"; callback }; + ]; + }) + +let () = + print_endline "Text output:"; + print_endline @@ PrintBox_text.to_string + @@ test ~size:BPlot.default_config.size; + print_endline "\nHTML output:"; + print_endline @@ PrintBox_html.to_string @@ test ~size:(800, 800) From da5fbce6ae317a0a64b8acb720d2e11dabe3ba1c Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Thu, 26 Sep 2024 14:12:12 +0200 Subject: [PATCH 08/25] Uniform interpretation of [graph.size] as pixels -- scale down for text --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 9 ++- src/printbox-ext-plot/PrintBox_ext_plot.mli | 9 +++ test/plotting.expected | 90 ++++++++++----------- test/plotting_half_moons.expected | 90 ++++++++++----------- 4 files changed, 106 insertions(+), 92 deletions(-) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index dcadc2e..b16d3be 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -39,7 +39,7 @@ let default_config = specs = []; x_label = "x"; y_label = "y"; - size = 120, 40; + size = 800, 800; no_axes = false; prec = 3; } @@ -267,10 +267,15 @@ let plot ?(prec = 3) ?(no_axes = false) ?canvas ?size ?(x_label = "x") ] let example = Plot default_config +let scale_size_for_text = ref (0.125, 0.05) let text_handler ext ~nested:_ = match ext with - | Plot { specs; x_label; y_label; size; no_axes; prec } -> + | Plot { specs; x_label; y_label; size = sx, sy; no_axes; prec } -> + let cx, cy = !scale_size_for_text in + let size = + Float.(to_int @@ (cx *. of_int sx), to_int @@ (cy *. of_int sy)) + in B.Same_as (B.frame @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:false diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index 63807c3..5eba75a 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -33,7 +33,16 @@ type graph = { } val default_config : graph +(** A suggested configuration for plotting, with intended use: + [Plot {default_config with specs = ...; ...}]. The default values are: + [{ specs = []; x_label = "x"; y_label = "y"; size = 800, 800; no_axes = false; prec = 3 }] *) type PrintBox.ext += Plot of graph val concise_float : (prec:int -> float -> string) ref +(** The conversion function for labeling axes. Defaults to [sprintf "%.*g"]. *) + +val scale_size_for_text : (float * float) ref +(** To provide a unified experience across the text and html backends, we treat + the size specification as measured in pixels, and scale it by [!scale_size_for_text] + to get a size measured in characters. The default value is [(0.125, 0.05)]. *) diff --git a/test/plotting.expected b/test/plotting.expected index 1c4399e..fce24f8 100644 --- a/test/plotting.expected +++ b/test/plotting.expected @@ -1,49 +1,49 @@ Text output: -┌──┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ 1│# │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ # │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│y │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ 0│ #│ -├──┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ -│ │0 1│ -│ │ x │ -└──┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──┬────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1│# │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ # │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│y │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ 0│ #│ +├──┼────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ │0 1│ +│ │ x │ +└──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output:
y
1
0
###
0
1
x
diff --git a/test/plotting_half_moons.expected b/test/plotting_half_moons.expected index 16350cc..72a1ba8 100644 --- a/test/plotting_half_moons.expected +++ b/test/plotting_half_moons.expected @@ -1,49 +1,49 @@ Text output: -┌───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ 1.09 │..................................#.................................................************************************│ -│ │...................................##.#.....#...##................................**************************************│ -│ │..........................#.#.#.##.#..#.#..#......#..##.........................****************************************│ -│ │.........................#..#..#.###.#....#.#...###.#...#......#...............*****************************************│ -│ │.................#.....#########.##.###....#.##..##...##.##.#................*******************************************│ -│ │...............##.#.###...###.#..#.#.##.....####...##.##...#.#.............*********************************************│ -│ │....................#.#..#.########.....#####..#...#.##..#.##.##.........***********************************************│ -│ │...........#....#..#..##.#...#..#.#.#..###........###...#...####.##.#.#.************************************************│ -│ │..........#.......#....##.##.#.#.#...#..#.####...#.......#.##..####.#.***#**********************************************│ -│ │............###.....#.###.###.#.#.#............#...#......####.#..##*#**************************************************│ -│ │........#...##.#..#..#.....#.....#....................#..###....#..#**#*************************************************│ -│ │........##..####..#.#.##................................#.....#..##*#*#*************************************************│ -│ │...#.....#..##.#.##..#.............%..........................#***#*##**************************************************│ -│ │........#.###.#.....#........................%%............#.***##*#**#*#**********************************%*******%****│ -│ │.#.#.##....##..#...##...................%....%..............*****##*##**##*#*#******************************************│ -│ │.#..#.#..###..##.##.....................%%....%...........*********###*****##***#*****************************%*%*%%*%**│ -│ │.......##...##.......................%...%%%%%..........***********#*##*###**#****************************%%****%*%%%***│ -│ │#..##.#.#..#..#...................%.%....%..%%%........**********#****#*****#***#************************%***%***%******│ -│ │.###.#..#...#.#....................%...%.%......%....***************##***#**###**##********************%%*%*****%%**%*%*│ -│y │#..#.##.#.#.##.....................%%..%.%.%...%...***************#*********#*#**#**********************%%**%******%%*%%│ -│ │##....###...#......................%.%.%...%.%%..********************##**#*###****#********************%*%****%%**%*%*%*│ -│ │.#.......####................................%%.%**%***********************##*##*##***********************%%******%%*%%*│ -│ │...#..#..###.......................%..%%.%%..%****%*******************##***#*#*####*******************%%*%******%*%*****│ -│ │.......##.............................%...%.%%*%********************#**#**#*******#*********************%***%*%***%*%***│ -│ │.....#..#.................................%*%***%***%*******************#*******#*******************%**%%*%***%****%****│ -│ │..........##...........................%.*%%%***%*%%**********************#***#*#******************%%***%%**%%%**%******│ -│ │#.#..................................%.**%***%**%*%****%%%***********#***#*****#**#*******************%%%%*%%***********│ -│ │..#...#..............................*%%*%***%*%%*%*%********************#******#***********%******%%%%%%*%*%%***%******│ -│ │....................................*********%***%%%****%*%*%*%******#************************%**%**%*%%**%*%*%**%******│ -│ │..................................*******%*%*%%%%*%**%**%%*********%*************************%*%**%%%*%**%*%*****%******│ -│ │................................**********%****%%%%%%**%*%********%********************%*%%**%**%%*%%%*%*%**************│ -│ │..............................*******************%*******%%%%%%*%*%**%%************%**%%%%%*%*%***%*********************│ -│ │.............................**************%****%**%%*%*********%**%%***%%%*%***%%%%*%%*%**%**%**%*****%*%**************│ -│ │...........................*******************%**%**%%**%%%****%**%%*%*%*%***%*%*%*%%%**%%*%**%%%*%%*******%************│ -│ │.........................**********************%*%*%*%**%%********%%%***%***%%%%%%%%****%**%**%%%**%********************│ -│ │........................******************************%***%%***%*%%*%%*%*%%*****%***%*%*%***%%%%****%%%*****************│ -│ │......................**************************************%**%*%%%**%%*%%***%%*%****%%**%%%*%*******%*****************│ -│ │....................*************************************%%%%%********%*%*%*%%*%*%*%%**%%*%*****%***********************│ -│ │..................********************************************%*%%*%*%%**%%%**%%%%%****%%*******************************│ -│ -0.794│.................********************************************%********%******%****%*****%%******************************│ -├───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ -│ │-1.25 2.1│ -│ │ x │ -└───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌───────┬────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1.09 │............................#.........................................******************************│ +│ │.............................##.#...##..##..........................********************************│ +│ │......................########.###..#.....#.##.....................*********************************│ +│ │.....................#.#..####.#...#.#..##.#...#.....#...........***********************************│ +│ │..............#....##########.##....####.#...#.##.#.............************************************│ +│ │.............#.#####.###.#.#.#.##....###..##.##..##............*************************************│ +│ │.................#.#.#####.###...####..#..#.##.#.##.##.......***************************************│ +│ │.........#....##..##.#..#..####.###......###..##.####.##.##.****************************************│ +│ │.........#.....#...###.##.##...#.#.#.#...#.....#.##.#####.**#***************************************│ +│ │..........###....#.#####.##.#..........#..#.....#####..###******************************************│ +│ │.......#..#.#..#.#....#.....#................#..##...#.#**#*****************************************│ +│ │......###.###..##.##..........................#....#..###*#*****************************************│ +│ │...#....#.###.##.##..........%.....................##**#*#******************************************│ +│ │......#######....#...................%%..........#.**##*#*###****************************%*****%****│ +│ │.##.##...##.#...##...............%...%............****##*##*###*#***********************************│ +│ │.#.#.#.###.##.##.................%%...%.........********###***##**#*************************%%%*%%**│ +│ │.....#.#..##...................%..%%%%%........*********###*###*#***********************%%***%%%%***│ +│ │#.##.###.#.#................%.%...%.%%%......*********#***#****#**#********************%***%**%*****│ +│ │#####.#...##.................%..%.%.....%...*************#**##*###*##*****************%%%****%%*%*%*│ +│y │#.#.###.#.##.................%%.%.%%%..%...************#*******#*#*#******************%%*%******%*%%│ +│ │##...###..#..................%%..%..%.%..****************##**####****#***************%**%***%*%**%%*│ +│ │##......###..........................%%.%*%********************#*####*******************%%*****%*%%*│ +│ │...#.#.###...................%..%%%%..%**%****************##**#######****************%%%*****%*%****│ +│ │......##.......................%...%.%%%*****************#*#*#******#******************%**%%***%%%**│ +│ │....#..#...........................%*%**%**%****************#******#***************%*%%%%**%%**%****│ +│ │........##.......................%*%%***%*%*******************#**##***************%%***%**%%%*%*****│ +│ │#.#............................%.*%**%**%%****%%*********#**#*****#*#****************%%%*%%*********│ +│ │.#...#.........................*%%%**%%%%%*%*****************#****#**********%*****%%%%*%*%***%*****│ +│ │..............................*******%**%%%***%*%%%*%****#********************%*%**%*%%*%*%%**%*****│ +│ │............................******%*%%%%%*%*%*%*%******%**********************%%**%%*%*%*%****%*****│ +│ │...........................********%***%%%%%*%%%*******%****************%*%%**%*%%%%%*%%************│ +│ │.........................****************%*****%%%%%*%*%*%%**********%*%%%%%%*%**%******************│ +│ │........................************%***%*%%*%*******%**%%**%%*%***%%%%%%%**%*%*%*****%%************│ +│ │.......................***************%**%*%%*%%%****%*%%%*%%***%*%%*%*%*%%%**%%%%%******%**********│ +│ │.....................******************%%%%*%**%*******%%%**%**%%%%*%%***%*%**%%**%*****************│ +│ │....................*************************%**%%**%*%*%*%%*%%***%***%*%%***%%%***%%%**************│ +│ │..................********************************%**%%%**%%%%**%%%%***%%*%%%%%******%**************│ +│ │.................*******************************%%%********%%%%%%*%%*%**%%*%****%*******************│ +│ │...............************************************%*%%*%%%*%%%**%%%%***%%**************************│ +│ -0.794│..............*************************************%******%*****%***%****%%*************************│ +├───────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ │-1.25 2.1│ +│ │ x │ +└───────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output:
y
1.09
-0.794
.......................#.................................************************##........................................................************************#####..................................#.....................*************************########.......................................................*************************######....................#..................................**************************#########......................................................**************************##########.......................#..............................***************************################....................................................****************************#############...................#......#.........#.......#...........****************************##############.....................................#..............*****************************##############...............#...#.............#....................*****************************################....................#.......................#.......******************************############.....................#...............#..............******************************##########....................#...................#......#....*******************************##################.................................................*******************************###############.............#..................#.............#....********************************#################........................................#.......*********************************################...............................................*********************************#########........#...........................#..........#.**********************************########.###..............................................**********************************##########.........#...................................#.***********************************#########.............................................***********************************############......#......................................************************************#####%###.......#....................................*************************************########...........................................*************************************##############..........................................****#**********************************###%#%..........................................**************************************#%####%#####.........................................******#*********************************###########.....#..........................%..........*********#******************************##%##%#.......#.................................***************************************%*%###%#####%..#..........#...........................********#*********************************###%#%%#####...............................%........**************************************%***###%%%%#######%.............................%.........**************************************%****#%%#%%%#%#%%......................................******************************************##%###%%%%###......#...............................***************#****************************#####%#%%%#...#..................................****************#***************************#%%####%##%#%#%#..#...............................%...********************************************#%#%#%####%.#......#.............................********************************************%###%%%#%#%%%#%%%...................................*********************************************#%%###%##%%##%%..................................**********************************************#%%###%%%#%##%#%..................................**********************************************##%%#%#%#%%##...........................%......***********************************************%##%%#%%%##%.......#..........................***********************************************%#%#%.#%##%%%##................................************************************************#%##%###%#................................***********************#*************************%#%#%#%##%##%%#%%...............................***********************#**********************%****%#%%%%%%%......#.......................%.********************#******************************%##%%%%......#........................*****************#*********************************%#%%#%.............................***************************************************%%%#%#%%%.............................%***************************************************%%#%%#%#%#%%............................***************************************%*************%%%%%%%#%...........................%.*************************#***************************%%%%#%#%%#%%%...........................*****************************************************#%#%%##%%%%...........................***********%*%%*****************************************#%%%%%#%%%%%%%%..........................************************#******************************%%%%%#%%%%%%%%%.........................***%**************************#**************************%%%*%%%%%%%%.........................**********************#*********************%**%**********%%%%%%%........................*****************************************************%***%%%%%%%%%%%%%........................********************************************************%%%%%%%%%%%%.......................*****************************************%%****************%%%%%%%%%%%.......................**********************%***********************%************%%%%%%%%%%%%%%......................**********************************************************%%%%%%%%.....................***************************%********************************%%%%%%%%%.....................********************%***************************************%%%%%%*%%%%%%%%%%....................******************************************%******************%%%%%%%%%%%%%%%%%%%%%....................********************************************%****************%%%%%%%%%%%...................*********************************************%%****************%%%%%%%%%%%...................**************************%************%***********************%%%%%%%%%%%%%%%%%%%..................**************************************************************%%%%%%%%%%%%%.................**************************************************%*************%%%%%%%%%%%%%.................**********************************************%*****************%%%%%%%%%................*******************************%*********************************%%%%%%%%%%%%%%%%................***************************%**************************%***********%%%%%%%%%...............***********************************%******************************%%%%%%%%%%%%%%...............*************************************%********%********************%%%%%%%%%%..............*********************************************%*********************%%%%%%%%..............******************************************************************%%%%%%%%.............*******************************************************************%%%%%%%%%%%%%............********************************************************************%%%%............********************************************************************%%
-1.25
2.1
x
From 55a87a44aaa078f246676c5a213107463889436b Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Thu, 26 Sep 2024 15:21:15 +0200 Subject: [PATCH 09/25] Consistently prefer plots coming first; docu-comments; prevent out-of-bounds crashes The out-of-bounds happen now due to still-unfixed bugs. Maybe it's better to keep crashing to iron out the bugs? --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 41 +++++++++++------ src/printbox-ext-plot/PrintBox_ext_plot.mli | 15 +++++-- test/dune | 6 +++ test/plotting_half_moons.ml | 8 ++-- test/plotting_linear.expected | 50 +++++++++++++++++++++ test/plotting_linear.ml | 39 ++++++++++++++++ 6 files changed, 136 insertions(+), 23 deletions(-) create mode 100644 test/plotting_linear.expected create mode 100644 test/plotting_linear.ml diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index b16d3be..c13cc91 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -150,26 +150,36 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) to_int @@ (of_int (dimy - 1) *. (y -. miny) /. spany) )) with Invalid_argument _ -> None in - let spread i j px1 px2 = + let spread ~i ~dmj px1 px2 = if sparse then - (i mod 10 = 0 && j mod 10 = 0) + (i mod 10 = 0 && dmj mod 10 = 0) || i mod 10 = 5 - && j mod 10 = 0 - && canvas.(j).(i - 5) <> px1 - && canvas.(j).(i - 5) <> px2 + && dmj mod 10 = 0 + && canvas.(dmj).(i - 5) <> px1 + && canvas.(dmj).(i - 5) <> px2 || i mod 10 = 0 - && j mod 10 = 5 - && canvas.(j - 5).(i) <> px1 - && canvas.(j - 5).(i) <> px2 + && dmj mod 10 = 5 + && canvas.(dmj - 5).(i) <> px1 + && canvas.(dmj - 5).(i) <> px2 else true in + let update ~i ~dmj px = + if + i >= 0 && dmj >= 0 && i < dimx && dmj < dimy + && String.trim canvas.(dmj).(i) = "" + then ( + canvas.(dmj).(i) <- px; + true + ) else + false + in specs |> List.iter (function | Scatterplot { points; pixel } -> Array.map scale_2d points |> Array.iter (function - | Some (i, j) -> canvas.(dimy - 1 - j).(i) <- pixel + | Some (i, j) -> ignore @@ update ~i ~dmj:(dimy - 1 - j) pixel | None -> ()) | Line_plot { points; pixel } -> let points = Array.map scale_1d points in @@ -181,14 +191,14 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) points |> Array.iteri (fun i -> Option.iter (fun j -> - canvas.(dimy - 1 - j).(rescale_x i) <- pixel)) + ignore @@ update ~i:(rescale_x i) ~dmj:(dimy - 1 - j) pixel)) | Boundary_map { callback; pixel_true; pixel_false } -> canvas |> Array.iteri (fun dmj -> Array.iteri (fun i pix -> if String.trim pix = "" - && spread i dmj pixel_true pixel_false + && spread ~i ~dmj pixel_true pixel_false then ( let x = Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx @@ -205,9 +215,11 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) pixel_false) ))) | Line_plot_adaptive { callback; cache; pixel } -> + let updated = ref true in canvas.(0) - |> Array.iteri (fun i pix -> - if String.trim pix = "" then ( + |> Array.iteri (fun i _ -> + if (not sparse) || i mod 5 = 0 || ((not !updated) && i mod 5 = 2) + then ( let x = Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx in @@ -220,7 +232,8 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) y in scale_1d y - |> Option.iter (fun j -> canvas.(dimy - 1 - j).(i) <- pixel) + |> Option.iter (fun j -> + updated := update ~i ~dmj:(dimy - 1 - j) pixel) ))); minx, miny, maxx, maxy, canvas diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index 5eba75a..6eb21e1 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -25,11 +25,15 @@ type plot_spec = type graph = { specs: plot_spec list; - x_label: string; - y_label: string; + (** Earlier plots in the list take precedence over later plots. *) + x_label: string; (** Horizontal axis label. *) + y_label: string; (** Vertical axis label. *) size: int * int; + (** Size of the graphing area in pixels. Scale for characters is configured by + {!scale_size_for_text}. *) no_axes: bool; - prec: int; + (** If true, only the graphing area is output (skipping the axes box). *) + prec: int; (** Precision for numerical labels on axes. *) } val default_config : graph @@ -37,7 +41,10 @@ val default_config : graph [Plot {default_config with specs = ...; ...}]. The default values are: [{ specs = []; x_label = "x"; y_label = "y"; size = 800, 800; no_axes = false; prec = 3 }] *) -type PrintBox.ext += Plot of graph +type PrintBox.ext += + | Plot of graph + (** PrintBox extension for plotting: scatterplots, linear graphs, decision boundaries... + See {!graph} and {!plot_spec} for details. *) val concise_float : (prec:int -> float -> string) ref (** The conversion function for labeling axes. Defaults to [sprintf "%.*g"]. *) diff --git a/test/dune b/test/dune index 803d607..e36cf56 100644 --- a/test/dune +++ b/test/dune @@ -75,3 +75,9 @@ (modules plotting_half_moons) (package printbox-ext-plot) (libraries printbox printbox-ext-plot printbox-text printbox-html)) + +(test + (name plotting_linear) + (modules plotting_linear) + (package printbox-ext-plot) + (libraries printbox printbox-ext-plot printbox-text printbox-html)) diff --git a/test/plotting_half_moons.ml b/test/plotting_half_moons.ml index 85b7e70..65dcfc3 100644 --- a/test/plotting_half_moons.ml +++ b/test/plotting_half_moons.ml @@ -34,13 +34,12 @@ let moons data_len = let points1, points2 = moons 1024 let callback (x, y) = Float.compare x y > 0 -let test ~size = +let test = B.extension @@ BPlot.( Plot { default_config with - size; specs = [ Scatterplot { points = points1; pixel = "#" }; @@ -51,7 +50,6 @@ let test ~size = let () = print_endline "Text output:"; - print_endline @@ PrintBox_text.to_string - @@ test ~size:BPlot.default_config.size; + print_endline @@ PrintBox_text.to_string test; print_endline "\nHTML output:"; - print_endline @@ PrintBox_html.to_string @@ test ~size:(800, 800) + print_endline @@ PrintBox_html.to_string test diff --git a/test/plotting_linear.expected b/test/plotting_linear.expected new file mode 100644 index 0000000..3a1fcc1 --- /dev/null +++ b/test/plotting_linear.expected @@ -0,0 +1,50 @@ +Text output: +┌───┬────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ -1│...................................................................................................%│ +│ │.................................................................................................,%,│ +│ │..............................................................................................,,,%,,│ +│ │............................................................................................,,,,%,,,│ +│ │.........................................................................................,,,,,%%,,,,│ +│ │.......................................................................................,,,,,,%,,,,,,│ +│ │....................................................................................,,,,,,,,%,,,,,,,│ +│ │..................................................................................,,,,,,,,%%,,,,####│ +│ │...............................................................................,,,,,,,,,,%,#####,,,,│ +│ │.............................................................................,,,,,,,,,,####,,,,,,,,,│ +│ │..........................................................................,,,,,,,,,,###,,,,,,,,,,,,,│ +│ │........................................................................,,,,,,,,####%%,,,,,,,,,,,,,,│ +│ │.....................................................................,,,,,,,####,,,%,,,,,,,,,,,,,,,,│ +│ │...................................................................,,,,,,###,,,,,%%,,,,,,,,,,,,,,,,,│ +│ │................................................................,,,,,####,,,,,,,%,,,,,,,,,,,,,,,,,,,│ +│ │.............................................................,,,,,###,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,│ +│ │...........................................................,,,,###,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,│ +│ │........................................................,,,,###,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,│ +│ │......................................................,,,###,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,│ +│y │...................................................,,,###,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.................................................,,###,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │..............................................,,###,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │............................................,###,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.........................................,###,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.......................................,##,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │....................................,###,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │..................................###,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │...............................###,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │............................,##,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │..........................###,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.......................,##,,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.....................###,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │..................###,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │................##,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.............###,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │...........##,,,,,,,,,,,,,,,,,,,%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │........###,,,,,,,,,,,,,,,,,%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │......##,,,,,,,,,,,,,,,%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │...###,,,,,,,,,,%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ 0 │###%%%%%%%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +├───┼────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ │0 -1│ +│ │ x │ +└───┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +HTML output: +
y
1
0
.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#####.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##
0
199
x
+ diff --git a/test/plotting_linear.ml b/test/plotting_linear.ml new file mode 100644 index 0000000..740eb3c --- /dev/null +++ b/test/plotting_linear.ml @@ -0,0 +1,39 @@ +module B = PrintBox +module BPlot = PrintBox_ext_plot + +(* This tests the printbox-ext-plot extension. *) + +let test = + B.extension + @@ BPlot.( + Plot + { + default_config with + specs = + [ + Line_plot_adaptive + { + callback = (fun x -> sin x); + pixel = "#"; + cache = Hashtbl.create 20; + }; + Line_plot_adaptive + { + callback = (fun x -> x ** 2.); + pixel = "%"; + cache = Hashtbl.create 20; + }; + Boundary_map + { + pixel_false = "."; + pixel_true = ","; + callback = (fun (x, y) -> x > y); + }; + ]; + }) + +let () = + print_endline "Text output:"; + print_endline @@ PrintBox_text.to_string test; + print_endline "\nHTML output:"; + print_endline @@ PrintBox_html.to_string test From fecfa6eec0cb1bddb09983885f69d7670480ac22 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Thu, 26 Sep 2024 16:31:23 +0200 Subject: [PATCH 10/25] Fix determining the y range from `Line_plot_adaptive` --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 77 ++++++++++-------- test/plotting_linear.expected | 92 +++++++++++----------- 2 files changed, 91 insertions(+), 78 deletions(-) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index c13cc91..656a452 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -86,51 +86,69 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) | Line_plot_adaptive _ -> [||]) |> Array.concat in + let minx = + if all_x_points = [||] then + 0. + else + Array.fold_left min all_x_points.(0) all_x_points + in + let maxx = + if given_y_points = [||] then + 1. + else if all_x_points = [||] then + Float.of_int (Array.length given_y_points - 1) + else + Array.fold_left max all_x_points.(0) all_x_points + in + let spanx = maxx -. minx in + let spanx = + if spanx <= epsilon_float then + 1.0 + else + spanx + in + let scale_x x = Float.(to_int (of_int (dimx - 1) *. (x -. minx) /. spanx)) in + let unscale_x i = Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx in let extra_y_points = specs |> List.map (function | Line_plot_adaptive { callback; cache; _ } -> - Array.iter - (fun x -> - if not (Hashtbl.mem cache x) then - Hashtbl.add cache x (callback x)) - all_x_points; - Array.of_seq @@ Hashtbl.to_seq_values cache + Array.init + (if sparse then + dimx / 5 + else + dimx) + (fun i -> + let x = + unscale_x + (if sparse then + i * 5 + else + i) + in + let y = + match Hashtbl.find_opt cache x with + | Some y -> y + | None -> callback x + in + if not (Hashtbl.mem cache x) then Hashtbl.add cache x y; + y) | _ -> [||]) |> Array.concat in let all_y_points = Array.append given_y_points extra_y_points in - let minx = - if all_x_points = [||] then - 0. - else - Array.fold_left min all_x_points.(0) all_x_points - in let miny = if all_y_points = [||] then 0. else Array.fold_left min all_y_points.(0) all_y_points in - let maxx = - if all_x_points = [||] then - Float.of_int (Array.length all_y_points - 1) - else - Array.fold_left max all_x_points.(0) all_x_points - in let maxy = if all_y_points = [||] then maxx -. minx else Array.fold_left max all_y_points.(0) all_y_points in - let spanx = maxx -. minx in - let spanx = - if spanx <= epsilon_float then - 1.0 - else - spanx - in let spany = maxy -. miny in let spany = if spany <= epsilon_float then @@ -144,10 +162,7 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) in let scale_2d (x, y) = try - Some - Float.( - ( to_int @@ (of_int (dimx - 1) *. (x -. minx) /. spanx), - to_int @@ (of_int (dimy - 1) *. (y -. miny) /. spany) )) + Some Float.(scale_x x, to_int (of_int (dimy - 1) *. (y -. miny) /. spany)) with Invalid_argument _ -> None in let spread ~i ~dmj px1 px2 = @@ -220,9 +235,7 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) |> Array.iteri (fun i _ -> if (not sparse) || i mod 5 = 0 || ((not !updated) && i mod 5 = 2) then ( - let x = - Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx - in + let x = unscale_x i in let y = match Hashtbl.find_opt cache x with | Some y -> y diff --git a/test/plotting_linear.expected b/test/plotting_linear.expected index 3a1fcc1..22ac13a 100644 --- a/test/plotting_linear.expected +++ b/test/plotting_linear.expected @@ -1,50 +1,50 @@ Text output: -┌───┬────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ -1│...................................................................................................%│ -│ │.................................................................................................,%,│ -│ │..............................................................................................,,,%,,│ -│ │............................................................................................,,,,%,,,│ -│ │.........................................................................................,,,,,%%,,,,│ -│ │.......................................................................................,,,,,,%,,,,,,│ -│ │....................................................................................,,,,,,,,%,,,,,,,│ -│ │..................................................................................,,,,,,,,%%,,,,####│ -│ │...............................................................................,,,,,,,,,,%,#####,,,,│ -│ │.............................................................................,,,,,,,,,,####,,,,,,,,,│ -│ │..........................................................................,,,,,,,,,,###,,,,,,,,,,,,,│ -│ │........................................................................,,,,,,,,####%%,,,,,,,,,,,,,,│ -│ │.....................................................................,,,,,,,####,,,%,,,,,,,,,,,,,,,,│ -│ │...................................................................,,,,,,###,,,,,%%,,,,,,,,,,,,,,,,,│ -│ │................................................................,,,,,####,,,,,,,%,,,,,,,,,,,,,,,,,,,│ -│ │.............................................................,,,,,###,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,│ -│ │...........................................................,,,,###,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,│ -│ │........................................................,,,,###,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,│ -│ │......................................................,,,###,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,│ -│y │...................................................,,,###,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │.................................................,,###,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │..............................................,,###,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │............................................,###,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │.........................................,###,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │.......................................,##,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │....................................,###,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │..................................###,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │...............................###,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │............................,##,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │..........................###,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │.......................,##,,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │.....................###,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │..................###,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │................##,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │.............###,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │...........##,,,,,,,,,,,,,,,,,,,%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │........###,,,,,,,,,,,,,,,,,%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │......##,,,,,,,,,,,,,,,%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ │...###,,,,,,,,,,%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -│ 0 │###%%%%%%%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ -├───┼────────────────────────────────────────────────────────────────────────────────────────────────────┤ -│ │0 -1│ -│ │ x │ -└───┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──┬────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1│...................................................................................................%│ +│ │.................................................................................................,%,│ +│ │..............................................................................................,,,%,,│ +│ │............................................................................................,,,,%,,,│ +│ │.........................................................................................,,,,,%%,,,,│ +│ │.......................................................................................,,,,,,%,,,,,,│ +│ │....................................................................................,,,,,,,,%,,,,,,,│ +│ │..................................................................................,,,,,,,,%%,,,,####│ +│ │...............................................................................,,,,,,,,,,%,#####,,,,│ +│ │.............................................................................,,,,,,,,,,####,,,,,,,,,│ +│ │..........................................................................,,,,,,,,,,###,,,,,,,,,,,,,│ +│ │........................................................................,,,,,,,,####%%,,,,,,,,,,,,,,│ +│ │.....................................................................,,,,,,,####,,,%,,,,,,,,,,,,,,,,│ +│ │...................................................................,,,,,,###,,,,,%%,,,,,,,,,,,,,,,,,│ +│ │................................................................,,,,,####,,,,,,,%,,,,,,,,,,,,,,,,,,,│ +│ │.............................................................,,,,,###,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,│ +│ │...........................................................,,,,###,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,│ +│ │........................................................,,,,###,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,│ +│ │......................................................,,,###,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,│ +│y │...................................................,,,###,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.................................................,,###,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │..............................................,,###,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │............................................,###,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.........................................,###,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.......................................,##,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │....................................,###,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │..................................###,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │...............................###,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │............................,##,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │..........................###,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.......................,##,,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.....................###,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │..................###,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │................##,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.............###,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │...........##,,,,,,,,,,,,,,,,,,,%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │........###,,,,,,,,,,,,,,,,,%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │......##,,,,,,,,,,,,,,,%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │...###,,,,,,,,,,%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ 0│###%%%%%%%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +├──┼────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ │0 1│ +│ │ x │ +└──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1
0
.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#####.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##
0
199
x
+
y
0.99
0
................................................................................%...............................................................................,%..............................................................................,%,.............................................................................,%,,,............................................................................,,%,,...........................................................................,,%,,,,..........................................................................,,,%,,,%.........................................................................,,,,,,,%........................................................................,,,,,,,,%.......................................................................,,,,,,,,,%......................................................................,,,,,,,,,,%.....................................................................,,,,,,,,,,,%....................................................................,,,,,,,,,,,,##%#...................................................................,,,,,,,,,,,,,##%#..................................................................,,,,,,,,,,,#,,,#%##.................................................................,,,,,,,,,,,,,,,#%##................................................................,,,,,,,,,,,,,,,,#%##...............................................................,,,,,,,,,#,,,,,,,,%###..............................................................,,,,,,,,%,,,,,,,,,,#,##%.............................................................,,,,,,,,,,,,,,,,,,,##%#............................................................,,,,,,,,,,,,,,,,,,,,##%...........................................................,,,,,,,#,,,,,,,,,,,,,,#%#..........................................................,,,,,,#,,,,,,,,,,,,,,,,#%,#.........................................................,,,,,,,,,,,,,,,,,,,,,,,#%##........................................................,,,,,,,,,,,%,,,,,,,,,,,,,###%.......................................................,,,,,,,,,,,,,,,,,,,,,,,,,##%......................................................,,,,,#,,,,,,,,,,,,,,,,,,,,,#%#.....................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,#%##....................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##...................................................,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,##%#..................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%##................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%...............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%#..............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%............................................,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,%#...........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%.........................................,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.......................................,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,##%......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.....................................,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#,%#....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%................................,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#...............................,#,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%.............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#............................,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,%#...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%..........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%.........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#........................,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%.......................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#,%......................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#,%.....................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#,%....................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#,%#...................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#................,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%...............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#.............,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%,%#............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#%...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..........,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%,%#.........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#........,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%,%#.......,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#%.....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#%....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%#%...,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%%#..,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%%%#%.,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%#%%%%%%%%#%%%%%%
0
1
x
From 53b4dccece2c6dc2d66e1f340a365f52e524bbb4 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Thu, 26 Sep 2024 17:03:28 +0200 Subject: [PATCH 11/25] A couple more plotting primitives Also just one fallback point when there is a clash on a Boundary_map or Map. --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 78 ++++++++++---------- src/printbox-ext-plot/PrintBox_ext_plot.mli | 2 + test/plotting.expected | 82 ++++++++++----------- test/plotting.ml | 23 +++++- test/plotting_half_moons.expected | 82 ++++++++++----------- test/plotting_half_moons.ml | 2 +- test/plotting_linear.expected | 2 +- 7 files changed, 147 insertions(+), 124 deletions(-) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index 656a452..488fd81 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -2,13 +2,12 @@ open Tyxml module B = PrintBox module H = Html -(* This tests extensions with HTML-specific support (as well as text backend support). *) - type plot_spec = | Scatterplot of { points: (float * float) array; pixel: string; } + | Scatterbag of { points: ((float * float) * string) array } | Line_plot of { points: float array; pixel: string; @@ -18,6 +17,7 @@ type plot_spec = pixel_true: string; pixel_false: string; } + | Map of { callback: float * float -> string } | Line_plot_adaptive of { callback: float -> float; cache: (float, float) Hashtbl.t; @@ -72,8 +72,9 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) specs |> List.map (function | Scatterplot { points; _ } -> Array.map fst points + | Scatterbag { points } -> Array.map (fun ((x, _), _) -> x) points | Line_plot _ -> [||] - | Boundary_map _ -> [||] + | Map _ | Boundary_map _ -> [||] | Line_plot_adaptive _ -> [||]) |> Array.concat in @@ -81,8 +82,9 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) specs |> List.map (function | Scatterplot { points; _ } -> Array.map snd points + | Scatterbag { points } -> Array.map (fun ((_, y), _) -> y) points | Line_plot { points; _ } -> points - | Boundary_map _ -> [||] + | Map _ | Boundary_map _ -> [||] | Line_plot_adaptive _ -> [||]) |> Array.concat in @@ -165,17 +167,10 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) Some Float.(scale_x x, to_int (of_int (dimy - 1) *. (y -. miny) /. spany)) with Invalid_argument _ -> None in - let spread ~i ~dmj px1 px2 = + let spread ~i ~dmj updated = if sparse then (i mod 10 = 0 && dmj mod 10 = 0) - || i mod 10 = 5 - && dmj mod 10 = 0 - && canvas.(dmj).(i - 5) <> px1 - && canvas.(dmj).(i - 5) <> px2 - || i mod 10 = 0 - && dmj mod 10 = 5 - && canvas.(dmj - 5).(i) <> px1 - && canvas.(dmj - 5).(i) <> px2 + || (i mod 10 = 5 && dmj mod 10 = 0 && not updated) else true in @@ -189,13 +184,35 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) ) else false in + let prerender_scatter points = + Array.iter + (fun (p, pixel) -> + match scale_2d p with + | Some (i, j) -> ignore @@ update ~i ~dmj:(dimy - 1 - j) pixel + | None -> ()) + points + in + let prerender_map callback = + let updated = ref true in + canvas + |> Array.iteri (fun dmj -> + Array.iteri (fun i pix -> + if String.trim pix = "" && spread ~i ~dmj !updated then ( + let x = + Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx + in + let y = + Float.(of_int (dimy - 1 - dmj) *. spany /. of_int (dimy - 1)) + +. miny + in + updated := update ~i ~dmj (callback (x, y)) + ))) + in specs |> List.iter (function | Scatterplot { points; pixel } -> - Array.map scale_2d points - |> Array.iter (function - | Some (i, j) -> ignore @@ update ~i ~dmj:(dimy - 1 - j) pixel - | None -> ()) + prerender_scatter (Array.map (fun p -> p, pixel) points) + | Scatterbag { points } -> prerender_scatter points | Line_plot { points; pixel } -> let points = Array.map scale_1d points in let npoints = Float.of_int (Array.length points) in @@ -208,27 +225,12 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) Option.iter (fun j -> ignore @@ update ~i:(rescale_x i) ~dmj:(dimy - 1 - j) pixel)) | Boundary_map { callback; pixel_true; pixel_false } -> - canvas - |> Array.iteri (fun dmj -> - Array.iteri (fun i pix -> - if - String.trim pix = "" - && spread ~i ~dmj pixel_true pixel_false - then ( - let x = - Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx - in - let y = - Float.( - of_int (dimy - 1 - dmj) *. spany /. of_int (dimy - 1)) - +. miny - in - canvas.(dmj).(i) <- - (if callback (x, y) then - pixel_true - else - pixel_false) - ))) + prerender_map (fun point -> + if callback point then + pixel_true + else + pixel_false) + | Map { callback } -> prerender_map callback | Line_plot_adaptive { callback; cache; pixel } -> let updated = ref true in canvas.(0) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index 6eb21e1..712a987 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -7,6 +7,7 @@ type plot_spec = points: (float * float) array; pixel: string; } + | Scatterbag of { points: ((float * float) * string) array } | Line_plot of { points: float array; pixel: string; @@ -16,6 +17,7 @@ type plot_spec = pixel_true: string; pixel_false: string; } + | Map of { callback: float * float -> string } | Line_plot_adaptive of { callback: float -> float; cache: (float, float) Hashtbl.t; diff --git a/test/plotting.expected b/test/plotting.expected index fce24f8..56ec9f8 100644 --- a/test/plotting.expected +++ b/test/plotting.expected @@ -1,50 +1,50 @@ Text output: ┌──┬────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ 1│# │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ # │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│y │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ 0│ #│ +│ 1│Y:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;│ +│ │::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;│ +│ │:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;│ +│ │::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;│ +│ │,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::M:::::::::::::::::::;;;;;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::;;;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::│ +│ │...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::│ +│ │.....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::│ +│ │...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::│ +│y │...............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::│ +│ │...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::│ +│ │......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::│ +│ │.........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::│ +│ │............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::│ +│ │..............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::│ +│ │................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::│ +│ │..................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::│ +│ │...................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::│ +│ │ ..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::│ +│ │ ......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::│ +│ │ ....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::│ +│ │ ..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::│ +│ │ .................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::│ +│ │ ................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::│ +│ │ ................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ +│ │ ...............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ +│ │ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ +│ │ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ +│ │ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::│ +│ 0│ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::X│ ├──┼────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ │0 1│ │ │ x │ └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1
0
###
0
1
x
+
y
1
0
Y::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::M:::::::::::::::;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::..........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::......................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::..........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::.............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::...............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::.................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::.....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::.......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::.......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::.........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::.........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::........................................,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::...................................,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::.................................,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::................................,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::..............................,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::..............................,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::.............................,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::............................,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::............................,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::...........................,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::..........................,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::..........................,,,,,,,,,,,,,,,,,,,,,,,,:::::::::..........................,,,,,,,,,,,,,,,,,,,,,,,,:::::::::.........................,,,,,,,,,,,,,,,,,,,,,,,,,::::::::.........................,,,,,,,,,,,,,,,,,,,,,,,,,::::::::.........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::.........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::.........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::X
0
1
x
diff --git a/test/plotting.ml b/test/plotting.ml index 35c9b0d..31e686a 100644 --- a/test/plotting.ml +++ b/test/plotting.ml @@ -12,8 +12,27 @@ let test ~size = size; specs = [ - Scatterplot - { points = [| 0., 1.; 1., 0.; 0.75, 0.75 |]; pixel = "#" }; + Scatterbag + { + points = + [| (0., 1.), "Y"; (1., 0.), "X"; (0.75, 0.75), "M" |]; + }; + Map + { + callback = + (fun (x, y) -> + let s = (x ** 2. +. y ** 2.) ** 0.5 in + if s < 0.3 then + "" + else if s < 0.6 then + "." + else if s < 0.9 then + "," + else if s < 1.2 then + ":" + else + ";"); + }; ]; }) diff --git a/test/plotting_half_moons.expected b/test/plotting_half_moons.expected index 72a1ba8..d39c953 100644 --- a/test/plotting_half_moons.expected +++ b/test/plotting_half_moons.expected @@ -1,50 +1,50 @@ Text output: ┌───────┬────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ 1.09 │............................#.........................................******************************│ -│ │.............................##.#...##..##..........................********************************│ -│ │......................########.###..#.....#.##.....................*********************************│ -│ │.....................#.#..####.#...#.#..##.#...#.....#...........***********************************│ -│ │..............#....##########.##....####.#...#.##.#.............************************************│ -│ │.............#.#####.###.#.#.#.##....###..##.##..##............*************************************│ -│ │.................#.#.#####.###...####..#..#.##.#.##.##.......***************************************│ -│ │.........#....##..##.#..#..####.###......###..##.####.##.##.****************************************│ -│ │.........#.....#...###.##.##...#.#.#.#...#.....#.##.#####.**#***************************************│ -│ │..........###....#.#####.##.#..........#..#.....#####..###******************************************│ -│ │.......#..#.#..#.#....#.....#................#..##...#.#**#*****************************************│ -│ │......###.###..##.##..........................#....#..###*#*****************************************│ -│ │...#....#.###.##.##..........%.....................##**#*#******************************************│ -│ │......#######....#...................%%..........#.**##*#*###****************************%*****%****│ -│ │.##.##...##.#...##...............%...%............****##*##*###*#***********************************│ -│ │.#.#.#.###.##.##.................%%...%.........********###***##**#*************************%%%*%%**│ -│ │.....#.#..##...................%..%%%%%........*********###*###*#***********************%%***%%%%***│ -│ │#.##.###.#.#................%.%...%.%%%......*********#***#****#**#********************%***%**%*****│ -│ │#####.#...##.................%..%.%.....%...*************#**##*###*##*****************%%%****%%*%*%*│ -│y │#.#.###.#.##.................%%.%.%%%..%...************#*******#*#*#******************%%*%******%*%%│ -│ │##...###..#..................%%..%..%.%..****************##**####****#***************%**%***%*%**%%*│ -│ │##......###..........................%%.%*%********************#*####*******************%%*****%*%%*│ -│ │...#.#.###...................%..%%%%..%**%****************##**#######****************%%%*****%*%****│ -│ │......##.......................%...%.%%%*****************#*#*#******#******************%**%%***%%%**│ -│ │....#..#...........................%*%**%**%****************#******#***************%*%%%%**%%**%****│ -│ │........##.......................%*%%***%*%*******************#**##***************%%***%**%%%*%*****│ -│ │#.#............................%.*%**%**%%****%%*********#**#*****#*#****************%%%*%%*********│ -│ │.#...#.........................*%%%**%%%%%*%*****************#****#**********%*****%%%%*%*%***%*****│ -│ │..............................*******%**%%%***%*%%%*%****#********************%*%**%*%%*%*%%**%*****│ -│ │............................******%*%%%%%*%*%*%*%******%**********************%%**%%*%*%*%****%*****│ -│ │...........................********%***%%%%%*%%%*******%****************%*%%**%*%%%%%*%%************│ -│ │.........................****************%*****%%%%%*%*%*%%**********%*%%%%%%*%**%******************│ -│ │........................************%***%*%%*%*******%**%%**%%*%***%%%%%%%**%*%*%*****%%************│ -│ │.......................***************%**%*%%*%%%****%*%%%*%%***%*%%*%*%*%%%**%%%%%******%**********│ -│ │.....................******************%%%%*%**%*******%%%**%**%%%%*%%***%*%**%%**%*****************│ -│ │....................*************************%**%%**%*%*%*%%*%%***%***%*%%***%%%***%%%**************│ -│ │..................********************************%**%%%**%%%%**%%%%***%%*%%%%%******%**************│ -│ │.................*******************************%%%********%%%%%%*%%*%**%%*%****%*******************│ -│ │...............************************************%*%%*%%%*%%%**%%%%***%%**************************│ -│ -0.794│..............*************************************%******%*****%***%****%%*************************│ +│ 1.09 │............................#.........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.............................##.#...##..##..........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │......................########.###..#.....#.##.....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.....................#.#..####.#...#.#..##.#...#.....#...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │..............#....##########.##....####.#...#.##.#.............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.............#.#####.###.#.#.#.##....###..##.##..##............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.................#.#.#####.###...####..#..#.##.#.##.##.......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.........#....##..##.#..#..####.###......###..##.####.##.##.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.........#.....#...###.##.##...#.#.#.#...#.....#.##.#####.,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │..........###....#.#####.##.#..........#..#.....#####..###,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.......#..#.#..#.#....#.....#................#..##...#.#,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │......###.###..##.##..........................#....#..###,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │...#....#.###.##.##..........%.....................##,,#,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │......#######....#...................%%..........#.,,##,#,###,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,%,,,,│ +│ │.##.##...##.#...##...............%...%............,,,,##,##,###,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ │.#.#.#.###.##.##.................%%...%.........,,,,,,,,###,,,##,,#,,,,,,,,,,,,,,,,,,,,,,,,,%%%,%%,,│ +│ │.....#.#..##...................%..%%%%%........,,,,,,,,,###,###,#,,,,,,,,,,,,,,,,,,,,,,,%%,,,%%%%,,,│ +│ │#.##.###.#.#................%.%...%.%%%......,,,,,,,,,#,,,#,,,,#,,#,,,,,,,,,,,,,,,,,,,,%,,,%,,%,,,,,│ +│ │#####.#...##.................%..%.%.....%...,,,,,,,,,,,,,#,,##,###,##,,,,,,,,,,,,,,,,,%%%,,,,%%,%,%,│ +│y │#.#.###.#.##.................%%.%.%%%..%...,,,,,,,,,,,,#,,,,,,,#,#,#,,,,,,,,,,,,,,,,,,%%,%,,,,,,%,%%│ +│ │##...###..#..................%%..%..%.%..,,,,,,,,,,,,,,,,##,,####,,,,#,,,,,,,,,,,,,,,%,,%,,,%,%,,%%,│ +│ │##......###..........................%%.%,%,,,,,,,,,,,,,,,,,,,,#,####,,,,,,,,,,,,,,,,,,,%%,,,,,%,%%,│ +│ │...#.#.###...................%..%%%%..%,,%,,,,,,,,,,,,,,,,##,,#######,,,,,,,,,,,,,,,,%%%,,,,,%,%,,,,│ +│ │......##.......................%...%.%%%,,,,,,,,,,,,,,,,,#,#,#,,,,,,#,,,,,,,,,,,,,,,,,,%,,%%,,,%%%,,│ +│ │....#..#...........................%,%,,%,,%,,,,,,,,,,,,,,,,#,,,,,,#,,,,,,,,,,,,,,,%,%%%%,,%%,,%,,,,│ +│ │........##.......................%,%%,,,%,%,,,,,,,,,,,,,,,,,,,#,,##,,,,,,,,,,,,,,,%%,,,%,,%%%,%,,,,,│ +│ │#.#............................%.,%,,%,,%%,,,,%%,,,,,,,,,#,,#,,,,,#,#,,,,,,,,,,,,,,,,%%%,%%,,,,,,,,,│ +│ │.#...#.........................,%%%,,%%%%%,%,,,,,,,,,,,,,,,,,#,,,,#,,,,,,,,,,%,,,,,%%%%,%,%,,,%,,,,,│ +│ │..............................,,,,,,,%,,%%%,,,%,%%%,%,,,,#,,,,,,,,,,,,,,,,,,,,%,%,,%,%%,%,%%,,%,,,,,│ +│ │............................,,,,,,%,%%%%%,%,%,%,%,,,,,,%,,,,,,,,,,,,,,,,,,,,,,%%,,%%,%,%,%,,,,%,,,,,│ +│ │...........................,,,,,,,,%,,,%%%%%,%%%,,,,,,,%,,,,,,,,,,,,,,,,%,%%,,%,%%%%%,%%,,,,,,,,,,,,│ +│ │.........................,,,,,,,,,,,,,,,,%,,,,,%%%%%,%,%,%%,,,,,,,,,,%,%%%%%%,%,,%,,,,,,,,,,,,,,,,,,│ +│ │........................,,,,,,,,,,,,%,,,%,%%,%,,,,,,,%,,%%,,%%,%,,,%%%%%%%,,%,%,%,,,,,%%,,,,,,,,,,,,│ +│ │.......................,,,,,,,,,,,,,,,%,,%,%%,%%%,,,,%,%%%,%%,,,%,%%,%,%,%%%,,%%%%%,,,,,,%,,,,,,,,,,│ +│ │.....................,,,,,,,,,,,,,,,,,,%%%%,%,,%,,,,,,,%%%,,%,,%%%%,%%,,,%,%,,%%,,%,,,,,,,,,,,,,,,,,│ +│ │....................,,,,,,,,,,,,,,,,,,,,,,,,,%,,%%,,%,%,%,%%,%%,,,%,,,%,%%,,,%%%,,,%%%,,,,,,,,,,,,,,│ +│ │..................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,%%%,,%%%%,,%%%%,,,%%,%%%%%,,,,,,%,,,,,,,,,,,,,,│ +│ │.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%,,,,,,,,%%%%%%,%%,%,,%%,%,,,,%,,,,,,,,,,,,,,,,,,,│ +│ │...............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,%%,%%%,%%%,,%%%%,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,│ +│ -0.794│..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,%,,,,,%,,,%,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,│ ├───────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ │-1.25 2.1│ │ │ x │ └───────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1.09
-0.794
.......................#.................................************************##........................................................************************#####..................................#.....................*************************########.......................................................*************************######....................#..................................**************************#########......................................................**************************##########.......................#..............................***************************################....................................................****************************#############...................#......#.........#.......#...........****************************##############.....................................#..............*****************************##############...............#...#.............#....................*****************************################....................#.......................#.......******************************############.....................#...............#..............******************************##########....................#...................#......#....*******************************##################.................................................*******************************###############.............#..................#.............#....********************************#################........................................#.......*********************************################...............................................*********************************#########........#...........................#..........#.**********************************########.###..............................................**********************************##########.........#...................................#.***********************************#########.............................................***********************************############......#......................................************************************#####%###.......#....................................*************************************########...........................................*************************************##############..........................................****#**********************************###%#%..........................................**************************************#%####%#####.........................................******#*********************************###########.....#..........................%..........*********#******************************##%##%#.......#.................................***************************************%*%###%#####%..#..........#...........................********#*********************************###%#%%#####...............................%........**************************************%***###%%%%#######%.............................%.........**************************************%****#%%#%%%#%#%%......................................******************************************##%###%%%%###......#...............................***************#****************************#####%#%%%#...#..................................****************#***************************#%%####%##%#%#%#..#...............................%...********************************************#%#%#%####%.#......#.............................********************************************%###%%%#%#%%%#%%%...................................*********************************************#%%###%##%%##%%..................................**********************************************#%%###%%%#%##%#%..................................**********************************************##%%#%#%#%%##...........................%......***********************************************%##%%#%%%##%.......#..........................***********************************************%#%#%.#%##%%%##................................************************************************#%##%###%#................................***********************#*************************%#%#%#%##%##%%#%%...............................***********************#**********************%****%#%%%%%%%......#.......................%.********************#******************************%##%%%%......#........................*****************#*********************************%#%%#%.............................***************************************************%%%#%#%%%.............................%***************************************************%%#%%#%#%#%%............................***************************************%*************%%%%%%%#%...........................%.*************************#***************************%%%%#%#%%#%%%...........................*****************************************************#%#%%##%%%%...........................***********%*%%*****************************************#%%%%%#%%%%%%%%..........................************************#******************************%%%%%#%%%%%%%%%.........................***%**************************#**************************%%%*%%%%%%%%.........................**********************#*********************%**%**********%%%%%%%........................*****************************************************%***%%%%%%%%%%%%%........................********************************************************%%%%%%%%%%%%.......................*****************************************%%****************%%%%%%%%%%%.......................**********************%***********************%************%%%%%%%%%%%%%%......................**********************************************************%%%%%%%%.....................***************************%********************************%%%%%%%%%.....................********************%***************************************%%%%%%*%%%%%%%%%%....................******************************************%******************%%%%%%%%%%%%%%%%%%%%%....................********************************************%****************%%%%%%%%%%%...................*********************************************%%****************%%%%%%%%%%%...................**************************%************%***********************%%%%%%%%%%%%%%%%%%%..................**************************************************************%%%%%%%%%%%%%.................**************************************************%*************%%%%%%%%%%%%%.................**********************************************%*****************%%%%%%%%%................*******************************%*********************************%%%%%%%%%%%%%%%%................***************************%**************************%***********%%%%%%%%%...............***********************************%******************************%%%%%%%%%%%%%%...............*************************************%********%********************%%%%%%%%%%..............*********************************************%*********************%%%%%%%%..............******************************************************************%%%%%%%%.............*******************************************************************%%%%%%%%%%%%%............********************************************************************%%%%............********************************************************************%%
-1.25
2.1
x
+
y
1.09
-0.794
.......................#.................................,,,,,,,,,,,,,,,,,,,,,,,,##........................................................,,,,,,,,,,,,,,,,,,,,,,,,#####..................................#.....................,,,,,,,,,,,,,,,,,,,,,,,,,########.......................................................,,,,,,,,,,,,,,,,,,,,,,,,,######....................#..................................,,,,,,,,,,,,,,,,,,,,,,,,,,#########......................................................,,,,,,,,,,,,,,,,,,,,,,,,,,##########.......................#..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,################....................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,#############...................#......#.........#.......#...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,##############.....................................#..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##############...............#...#.............#....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,################....................#.......................#.......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,############.....................#...............#..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##########....................#...................#......#....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##################.................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,###############.............#..................#.............#....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#################........................................#.......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,################...............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#########........#..........................#..........#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,###########..............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##########.........#...................................#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#########.............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,############......#......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#####%###.......#....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,########...........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##############..........................................,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,###%#%..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%####%#####.........................................,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,###########.....#..........................%..........,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%##%#.......#.................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,%###%#####%..#..........#...........................,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,###%#%%#####...............................%........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,###%%%%#######%.............................%.........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,#%%#%%%#%#%%......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%###%%%%###......#...............................,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,#####%#%%%#...#..................................,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%####%##%#%#%#..#...............................%...,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%#%####%.#......#.............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%###%%%#%#%%%#%%%...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%###%##%%##%%..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%###%%%#%##%#%..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%%#%#%#%%##...........................%......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%%#%%%##%.......#.........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#%#%##%%%##................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%##%###%#................................,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,%#%#%#%##%##%%#%%...............................,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,%,,,,%#%%%%%%%......#.......................%.,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%%%%......#........................,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#%.............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%#%#%%%.............................%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%#%#%#%%............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,%%%%%%%#%...........................%.,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%#%#%%#%%%...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%%##%%%%...........................,,,,,,,,,,,%,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%%%%#%%%%%%%%..........................,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%#%%%%%%%%%.........................,,,%,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%.........................,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,%,,%,,,,,,,,,,%%%%%%%........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,%%%%%%%%%%%%%........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%.......................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,%%%%%%%%%%%.......................,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,%%%%%%%%%%%%%%......................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%.....................,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%.....................,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%%%%%%....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,%%%%%%%%%%%...................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,%%%%%%%%%%%...................,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%%%%..................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,%%%%%%%%%%%%%.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,%%%%%%%%%................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%................,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,%%%%%%%%%...............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%...............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,%,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,%%%%%%%%..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%.............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%
-1.25
2.1
x
diff --git a/test/plotting_half_moons.ml b/test/plotting_half_moons.ml index 65dcfc3..038c104 100644 --- a/test/plotting_half_moons.ml +++ b/test/plotting_half_moons.ml @@ -44,7 +44,7 @@ let test = [ Scatterplot { points = points1; pixel = "#" }; Scatterplot { points = points2; pixel = "%" }; - Boundary_map { pixel_false = "."; pixel_true = "*"; callback }; + Boundary_map { pixel_false = "."; pixel_true = ","; callback }; ]; }) diff --git a/test/plotting_linear.expected b/test/plotting_linear.expected index 22ac13a..2da3252 100644 --- a/test/plotting_linear.expected +++ b/test/plotting_linear.expected @@ -46,5 +46,5 @@ Text output: └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
0.99
0
................................................................................%...............................................................................,%..............................................................................,%,.............................................................................,%,,,............................................................................,,%,,...........................................................................,,%,,,,..........................................................................,,,%,,,%.........................................................................,,,,,,,%........................................................................,,,,,,,,%.......................................................................,,,,,,,,,%......................................................................,,,,,,,,,,%.....................................................................,,,,,,,,,,,%....................................................................,,,,,,,,,,,,##%#...................................................................,,,,,,,,,,,,,##%#..................................................................,,,,,,,,,,,#,,,#%##.................................................................,,,,,,,,,,,,,,,#%##................................................................,,,,,,,,,,,,,,,,#%##...............................................................,,,,,,,,,#,,,,,,,,%###..............................................................,,,,,,,,%,,,,,,,,,,#,##%.............................................................,,,,,,,,,,,,,,,,,,,##%#............................................................,,,,,,,,,,,,,,,,,,,,##%...........................................................,,,,,,,#,,,,,,,,,,,,,,#%#..........................................................,,,,,,#,,,,,,,,,,,,,,,,#%,#.........................................................,,,,,,,,,,,,,,,,,,,,,,,#%##........................................................,,,,,,,,,,,%,,,,,,,,,,,,,###%.......................................................,,,,,,,,,,,,,,,,,,,,,,,,,##%......................................................,,,,,#,,,,,,,,,,,,,,,,,,,,,#%#.....................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,#%##....................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##...................................................,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,##%#..................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%##................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%...............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%#..............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%............................................,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,%#...........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%.........................................,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.......................................,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,##%......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.....................................,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#,%#....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%................................,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#...............................,#,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%.............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#............................,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,%#...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%..........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%.........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#........................,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%.......................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#,%......................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#,%.....................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#,%....................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#,%#...................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#................,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%...............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#.............,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%,%#............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#%...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..........,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%,%#.........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#........,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%,%#.......,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#%.....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#%....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%#%...,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%%#..,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%%%#%.,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%#%%%%%%%%#%%%%%%
0
1
x
+
y
0.99
0
................................................................................%...............................................................................,%..............................................................................,%,.............................................................................,%,............................................................................,,%,,...........................................................................,,%,,..........................................................................,,,%,,,%.........................................................................,,,,,,,%........................................................................,,,,,,,,%.......................................................................,,,,,,,,,%......................................................................,,,,,,,,,,%.....................................................................,,,,,,,,,,,%....................................................................,,,,,,,,,,,,##%#...................................................................,,,,,,,,,,,,,##%#..................................................................,,,,,,,,,,,#,,,#%##.................................................................,,,,,,,,,,,,,,,#%##................................................................,,,,,,,,,,,,,,,,#%##...............................................................,,,,,,,,,#,,,,,,,,%###..............................................................,,,,,,,,%,,,,,,,,,###%.............................................................,,,,,,,,,,,,,,,,,,,##%#............................................................,,,,,,,,,,,,,,,,,,,,##%...........................................................,,,,,,,#,,,,,,,,,,,,,,#%#..........................................................,,,,,,#,,,,,,,,,,,,,,,#%#.........................................................,,,,,,,,,,,,,,,,,,,,,,,#%##........................................................,,,,,,,,,,,%,,,,,,,,,,,,,###%.......................................................,,,,,,,,,,,,,,,,,,,,,,,,,##%......................................................,,,,,#,,,,,,,,,,,,,,,,,,,,,#%#.....................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,#%##....................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##...................................................,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,##%#..................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%##................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%...............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%#..............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%............................................,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#...........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%.........................................,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.......................................,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,##%......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.....................................,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%................................,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#...............................,#,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%.............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#............................,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%..........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%.........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#........................,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%.......................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%......................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%.....................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%....................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#...................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#................,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%...............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#.............,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%#............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#%...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..........,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%#.........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#........,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%#.......,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#%.....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#%....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%#%...,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%%#..,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%%%#%.,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%#%%%%%%%%#%%%%%%
0
1
x
From 1db9608dd8fc2e392b4cf033c064f98f8370c66a Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Thu, 26 Sep 2024 21:03:55 +0200 Subject: [PATCH 12/25] Plotting with nested boxes --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 135 ++++++++++++++------ src/printbox-ext-plot/PrintBox_ext_plot.mli | 14 +- src/printbox-text/PrintBox_text.ml | 10 +- src/printbox-text/PrintBox_text.mli | 9 ++ test/dune | 6 + test/plotting.expected | 2 +- test/plotting.ml | 12 +- test/plotting_half_moons.expected | 2 +- test/plotting_half_moons.ml | 11 +- test/plotting_linear.expected | 2 +- test/plotting_linear.ml | 8 +- test/plotting_nested.expected | 50 ++++++++ test/plotting_nested.ml | 90 +++++++++++++ 13 files changed, 286 insertions(+), 65 deletions(-) create mode 100644 test/plotting_nested.expected create mode 100644 test/plotting_nested.ml diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index 488fd81..a62cdc2 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -5,23 +5,23 @@ module H = Html type plot_spec = | Scatterplot of { points: (float * float) array; - pixel: string; + content: B.t; } - | Scatterbag of { points: ((float * float) * string) array } + | Scatterbag of { points: ((float * float) * B.t) array } | Line_plot of { points: float array; - pixel: string; + content: B.t; } | Boundary_map of { callback: float * float -> bool; - pixel_true: string; - pixel_false: string; + content_true: B.t; + content_false: B.t; } - | Map of { callback: float * float -> string } + | Map of { callback: float * float -> B.t } | Line_plot_adaptive of { callback: float -> float; cache: (float, float) Hashtbl.t; - pixel: string; + content: B.t; } [@@deriving sexp_of] @@ -52,13 +52,13 @@ let () = | _ -> false) let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) - (specs : plot_spec list) : float * float * float * float * _ = + (specs : plot_spec list) = (* Unfortunately "x" and "y" of a "matrix" are opposite to how we want them displayed -- the first dimension (i.e. "x") as the horizontal axis. *) - let (dimx, dimy, canvas) : int * int * _ = + let (dimx, dimy, canvas) : int * int * B.t option array array = match canvas, size with | None, None -> invalid_arg "PrintBox_utils.plot: provide ~canvas or ~size" - | None, Some (dimx, dimy) -> dimx, dimy, Array.make_matrix dimy dimx " " + | None, Some (dimx, dimy) -> dimx, dimy, Array.make_matrix dimy dimx None | Some canvas, None -> let dimy = Array.length canvas in let dimx = Array.length canvas.(0) in @@ -177,18 +177,18 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) let update ~i ~dmj px = if i >= 0 && dmj >= 0 && i < dimx && dmj < dimy - && String.trim canvas.(dmj).(i) = "" + && Option.is_none canvas.(dmj).(i) then ( - canvas.(dmj).(i) <- px; + canvas.(dmj).(i) <- Some px; true ) else false in let prerender_scatter points = Array.iter - (fun (p, pixel) -> + (fun (p, content) -> match scale_2d p with - | Some (i, j) -> ignore @@ update ~i ~dmj:(dimy - 1 - j) pixel + | Some (i, j) -> ignore @@ update ~i ~dmj:(dimy - 1 - j) content | None -> ()) points in @@ -197,7 +197,7 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) canvas |> Array.iteri (fun dmj -> Array.iteri (fun i pix -> - if String.trim pix = "" && spread ~i ~dmj !updated then ( + if Option.is_none pix && spread ~i ~dmj !updated then ( let x = Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx in @@ -210,10 +210,10 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) in specs |> List.iter (function - | Scatterplot { points; pixel } -> - prerender_scatter (Array.map (fun p -> p, pixel) points) + | Scatterplot { points; content } -> + prerender_scatter (Array.map (fun p -> p, content) points) | Scatterbag { points } -> prerender_scatter points - | Line_plot { points; pixel } -> + | Line_plot { points; content } -> let points = Array.map scale_1d points in let npoints = Float.of_int (Array.length points) in let rescale_x i = @@ -223,15 +223,16 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) points |> Array.iteri (fun i -> Option.iter (fun j -> - ignore @@ update ~i:(rescale_x i) ~dmj:(dimy - 1 - j) pixel)) - | Boundary_map { callback; pixel_true; pixel_false } -> + ignore + @@ update ~i:(rescale_x i) ~dmj:(dimy - 1 - j) content)) + | Boundary_map { callback; content_true; content_false } -> prerender_map (fun point -> if callback point then - pixel_true + content_true else - pixel_false) + content_false) | Map { callback } -> prerender_map callback - | Line_plot_adaptive { callback; cache; pixel } -> + | Line_plot_adaptive { callback; cache; content } -> let updated = ref true in canvas.(0) |> Array.iteri (fun i _ -> @@ -248,7 +249,7 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) in scale_1d y |> Option.iter (fun j -> - updated := update ~i ~dmj:(dimy - 1 - j) pixel) + updated := update ~i ~dmj:(dimy - 1 - j) content) ))); minx, miny, maxx, maxy, canvas @@ -297,6 +298,51 @@ let plot ?(prec = 3) ?(no_axes = false) ?canvas ?size ?(x_label = "x") let example = Plot default_config let scale_size_for_text = ref (0.125, 0.05) +let flatten_text_canvas canvas = + let outputs = + B.map_matrix + (function + | Some b -> + (* Fortunately, PrintBox_text does not insert \r by itself. *) + String.split_on_char '\n' @@ PrintBox_text.to_string b + | None -> []) + canvas + in + let dimj = Array.length canvas in + let dimi = Array.length canvas.(0) in + (* A [None] on the canvas means that the cell is occupied by a cell to the left of it. *) + let canvas = Array.make_matrix dimj dimi (Some " ") in + let update ~i ~j line = + if i >= 0 && i < dimi && j >= 0 && j < dimj then ( + let visible_len = + min + (dimi - i) + (PrintBox_text.str_display_width line 0 (String.length line)) + in + if visible_len > 0 then ( + let actual_len = ref @@ String.length line in + let cur_len () = PrintBox_text.str_display_width line 0 !actual_len in + while !actual_len > 0 && (cur_len () = 0 || cur_len () > visible_len) do + decr actual_len + done; + canvas.(j).(i) <- Some (String.sub line 0 !actual_len) + ); + for di = 1 to visible_len - 1 do + canvas.(j).(i + di) <- None + done + ) + in + Array.iteri + (fun j row -> + Array.iteri + (fun i lines -> + List.iteri (fun dj line -> update ~i ~j:(j + dj) line) lines) + row) + outputs; + Array.map + (fun row -> String.concat "" @@ List.filter_map Fun.id @@ Array.to_list row) + canvas + let text_handler ext ~nested:_ = match ext with | Plot { specs; x_label; y_label; size = sx, sy; no_axes; prec } -> @@ -307,11 +353,12 @@ let text_handler ext ~nested:_ = B.Same_as (B.frame @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:false - (B.grid_text ?pad:None ~bars:false) + (fun canvas -> + B.lines @@ Array.to_list @@ flatten_text_canvas canvas) specs) | _ -> B.Unrecognized_extension -let embed_canvas_html canvas = +let embed_canvas_html ~nested canvas = let size_y = Array.length canvas in let size_x = Array.length canvas.(0) in let cells = @@ -321,18 +368,25 @@ let embed_canvas_html canvas = |> Array.mapi (fun x cell -> x, cell) |> Array.to_list |> List.filter_map (fun (x, cell) -> - if String.trim cell = "" then - None - else - Some - (H.span - ~a: - [ - H.a_style - ("position:absolute;top:" ^ Int.to_string y - ^ "px;left:" ^ Int.to_string x ^ "px"); - ] - [ H.txt cell ]))) + Option.map + (fun cell -> + let cell = + match nested cell with + | PrintBox_html.Render_html html -> html + | _ -> + invalid_arg + "PrintBox_ext_plot.embed_canvas_html: unrecognized \ + rendering backend" + in + H.div + ~a: + [ + H.a_style + ("position:absolute;top:" ^ Int.to_string y + ^ "px;left:" ^ Int.to_string x ^ "px"); + ] + [ cell ]) + cell)) in let result = Array.to_list cells |> List.concat @@ -345,13 +399,14 @@ let embed_canvas_html canvas = in B.embed_rendering @@ PrintBox_html.Render_html result -let html_handler ext ~nested:_ = +let html_handler ext ~nested = match ext with | Plot { specs; x_label; y_label; size; no_axes; prec } -> B.Same_as (B.frame @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:true - embed_canvas_html specs) + (embed_canvas_html ~nested) + specs) | _ -> B.Unrecognized_extension let () = diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index 712a987..2f9e8c6 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -5,23 +5,23 @@ type plot_spec = | Scatterplot of { points: (float * float) array; - pixel: string; + content: PrintBox.t; } - | Scatterbag of { points: ((float * float) * string) array } + | Scatterbag of { points: ((float * float) * PrintBox.t) array } | Line_plot of { points: float array; - pixel: string; + content: PrintBox.t; } | Boundary_map of { callback: float * float -> bool; - pixel_true: string; - pixel_false: string; + content_true: PrintBox.t; + content_false: PrintBox.t; } - | Map of { callback: float * float -> string } + | Map of { callback: float * float -> PrintBox.t } | Line_plot_adaptive of { callback: float -> float; cache: (float, float) Hashtbl.t; - pixel: string; + content: PrintBox.t; } [@@deriving sexp_of] diff --git a/src/printbox-text/PrintBox_text.ml b/src/printbox-text/PrintBox_text.ml index 19c5123..69a96d8 100644 --- a/src/printbox-text/PrintBox_text.ml +++ b/src/printbox-text/PrintBox_text.ml @@ -102,7 +102,7 @@ let str_display_len_ = 0 s) let[@inline] set_string_len f = str_display_len_ := f -let[@inline] str_display_width_ s i len : int = !str_display_len_ s i len +let[@inline] str_display_width s i len : int = !str_display_len_ s i len (** {2 Output: where to print to} *) @@ -216,7 +216,7 @@ end = struct Pos.move_x start_pos l | Str_slice { s; i; len } -> O.output_substring out s i len; - let l = str_display_width_ s i len in + let l = str_display_width s i len in Pos.move_x start_pos l | Str_slice_bracket { pre; s; i; len; post } -> O.output_string out pre; @@ -225,7 +225,7 @@ end = struct does not try to mutate the string (which it should have no reason to do), but just to be safe... *) O.output_string out post; - let l = str_display_width_ s i len in + let l = str_display_width s i len in Pos.move_x start_pos l let render ?(indent = 0) (out : O.t) (self : t) : unit = @@ -480,7 +480,7 @@ end = struct | Text { l; style = _; link_with_uri = _ } -> let width = List.fold_left - (fun acc (s, i, len) -> max acc (str_display_width_ s i len)) + (fun acc (s, i, len) -> max acc (str_display_width s i len)) 0 l in { x = width; y = List.length l } @@ -795,7 +795,7 @@ end = struct write_vline_ ~ct:`Tree conn_m (Pos.move_y pos' 1) ((size b).y - 1); let child_pos = - Pos.move_x pos' (str_display_width_ s 0 (String.length s)) + Pos.move_x pos' (str_display_width s 0 (String.length s)) in conn_m.m <- render_rec ~ansi b child_pos; if (size b).x > 0 && has_border child_pos conn_m.m then diff --git a/src/printbox-text/PrintBox_text.mli b/src/printbox-text/PrintBox_text.mli index c5c332b..40711db 100644 --- a/src/printbox-text/PrintBox_text.mli +++ b/src/printbox-text/PrintBox_text.mli @@ -45,3 +45,12 @@ val pp_with : style:bool -> Format.formatter -> PrintBox.t -> unit @param style if true, emit ANSI codes for styling @since 0.3 *) + +(** {2 Support for Representation Extensions} *) + +val str_display_width : String.t -> int -> int -> int +(** [str_display_width s pos len] computes the width in visible characters + of the string [s] starting at string position [pos] and stopping right before [pos + len]. + See {!set_string_len}. + @since NEXT_RELEASE +*) diff --git a/test/dune b/test/dune index e36cf56..3b4aeb5 100644 --- a/test/dune +++ b/test/dune @@ -81,3 +81,9 @@ (modules plotting_linear) (package printbox-ext-plot) (libraries printbox printbox-ext-plot printbox-text printbox-html)) + +(test + (name plotting_nested) + (modules plotting_nested) + (package printbox-ext-plot) + (libraries printbox printbox-ext-plot printbox-text printbox-html)) diff --git a/test/plotting.expected b/test/plotting.expected index 56ec9f8..3e5369d 100644 --- a/test/plotting.expected +++ b/test/plotting.expected @@ -46,5 +46,5 @@ Text output: └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1
0
Y::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::;;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::;;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::;;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::;;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::M:::::::::::::::;;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::;;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::..........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::......................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::..........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::.............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::...............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::.................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::.....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::.......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::.......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::.........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::.........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::........................................,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::...................................,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::.................................,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::................................,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::..............................,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::..............................,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::.............................,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::............................,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::............................,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::...........................,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::..........................,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::..........................,,,,,,,,,,,,,,,,,,,,,,,,:::::::::..........................,,,,,,,,,,,,,,,,,,,,,,,,:::::::::.........................,,,,,,,,,,,,,,,,,,,,,,,,,::::::::.........................,,,,,,,,,,,,,,,,,,,,,,,,,::::::::.........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::.........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::.........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::........................,,,,,,,,,,,,,,,,,,,,,,,,::::::::X
0
1
x
+
y
1
0
Y
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
M
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
X
0
1
x
diff --git a/test/plotting.ml b/test/plotting.ml index 31e686a..35ded49 100644 --- a/test/plotting.ml +++ b/test/plotting.ml @@ -15,15 +15,21 @@ let test ~size = Scatterbag { points = - [| (0., 1.), "Y"; (1., 0.), "X"; (0.75, 0.75), "M" |]; + [| + (0., 1.), B.line "Y"; + (1., 0.), B.line "X"; + (0.75, 0.75), B.line "M"; + |]; }; Map { callback = (fun (x, y) -> - let s = (x ** 2. +. y ** 2.) ** 0.5 in + let s = ((x ** 2.) +. (y ** 2.)) ** 0.5 in + B.line + @@ if s < 0.3 then - "" + " " else if s < 0.6 then "." else if s < 0.9 then diff --git a/test/plotting_half_moons.expected b/test/plotting_half_moons.expected index d39c953..5c5db86 100644 --- a/test/plotting_half_moons.expected +++ b/test/plotting_half_moons.expected @@ -46,5 +46,5 @@ Text output: └───────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1.09
-0.794
.......................#.................................,,,,,,,,,,,,,,,,,,,,,,,,##........................................................,,,,,,,,,,,,,,,,,,,,,,,,#####..................................#.....................,,,,,,,,,,,,,,,,,,,,,,,,,########.......................................................,,,,,,,,,,,,,,,,,,,,,,,,,######....................#..................................,,,,,,,,,,,,,,,,,,,,,,,,,,#########......................................................,,,,,,,,,,,,,,,,,,,,,,,,,,##########.......................#..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,################....................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,#############...................#......#.........#.......#...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,##############.....................................#..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##############...............#...#.............#....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,################....................#.......................#.......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,############.....................#...............#..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##########....................#...................#......#....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##################.................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,###############.............#..................#.............#....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#################........................................#.......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,################...............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#########........#..........................#..........#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,###########..............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##########.........#...................................#.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#########.............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,############......#......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#####%###.......#....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,########...........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##############..........................................,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,###%#%..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%####%#####.........................................,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,###########.....#..........................%..........,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%##%#.......#.................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,%###%#####%..#..........#...........................,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,###%#%%#####...............................%........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,###%%%%#######%.............................%.........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,#%%#%%%#%#%%......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%###%%%%###......#...............................,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,#####%#%%%#...#..................................,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%####%##%#%#%#..#...............................%...,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%#%####%.#......#.............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%###%%%#%#%%%#%%%...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%###%##%%##%%..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%###%%%#%##%#%..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%%#%#%#%%##...........................%......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%%#%%%##%.......#.........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#%#%##%%%##................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%##%###%#................................,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,%#%#%#%##%##%%#%%...............................,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,%,,,,%#%%%%%%%......#.......................%.,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%%%%......#........................,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#%.............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%#%#%%%.............................%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%#%#%#%%............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,%%%%%%%#%...........................%.,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%#%#%%#%%%...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%%##%%%%...........................,,,,,,,,,,,%,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%%%%#%%%%%%%%..........................,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%#%%%%%%%%%.........................,,,%,,,,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%.........................,,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,%,,%,,,,,,,,,,%%%%%%%........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,%%%%%%%%%%%%%........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%.......................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,%%%%%%%%%%%.......................,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,%%%%%%%%%%%%%%......................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%.....................,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%.....................,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%%%%%%....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,%%%%%%%%%%%...................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,%%%%%%%%%%%...................,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%%%%..................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,%%%%%%%%%%%%%.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,%%%%%%%%%................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%................,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,%%%%%%%%%...............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%...............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,%,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,%%%%%%%%..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%.............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%
-1.25
2.1
x
+
y
1.09
-0.794
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
#
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
#
#
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
%
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
%
#
#
#
%
#
#
#
#
#
%
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
#
#
#
%
%
%
%
#
#
#
#
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
#
%
%
#
%
%
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
#
%
%
%
%
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
%
%
%
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
#
%
#
#
%
#
%
#
%
#
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
#
%
#
#
#
#
%
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
#
%
%
%
#
%
#
%
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
#
#
%
%
#
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
%
%
#
%
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
%
#
%
#
%
#
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
#
%
%
%
#
#
%
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
%
#
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
#
#
%
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
%
#
%
%
%
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
#
%
#
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
%
#
#
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
%
%
%
#
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
#
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
%
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
-1.25
2.1
x
diff --git a/test/plotting_half_moons.ml b/test/plotting_half_moons.ml index 038c104..d485bb6 100644 --- a/test/plotting_half_moons.ml +++ b/test/plotting_half_moons.ml @@ -42,9 +42,14 @@ let test = default_config with specs = [ - Scatterplot { points = points1; pixel = "#" }; - Scatterplot { points = points2; pixel = "%" }; - Boundary_map { pixel_false = "."; pixel_true = ","; callback }; + Scatterplot { points = points1; content = B.line "#" }; + Scatterplot { points = points2; content = B.line "%" }; + Boundary_map + { + content_false = B.line "."; + content_true = B.line ","; + callback; + }; ]; }) diff --git a/test/plotting_linear.expected b/test/plotting_linear.expected index 2da3252..7780fd3 100644 --- a/test/plotting_linear.expected +++ b/test/plotting_linear.expected @@ -46,5 +46,5 @@ Text output: └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
0.99
0
................................................................................%...............................................................................,%..............................................................................,%,.............................................................................,%,............................................................................,,%,,...........................................................................,,%,,..........................................................................,,,%,,,%.........................................................................,,,,,,,%........................................................................,,,,,,,,%.......................................................................,,,,,,,,,%......................................................................,,,,,,,,,,%.....................................................................,,,,,,,,,,,%....................................................................,,,,,,,,,,,,##%#...................................................................,,,,,,,,,,,,,##%#..................................................................,,,,,,,,,,,#,,,#%##.................................................................,,,,,,,,,,,,,,,#%##................................................................,,,,,,,,,,,,,,,,#%##...............................................................,,,,,,,,,#,,,,,,,,%###..............................................................,,,,,,,,%,,,,,,,,,###%.............................................................,,,,,,,,,,,,,,,,,,,##%#............................................................,,,,,,,,,,,,,,,,,,,,##%...........................................................,,,,,,,#,,,,,,,,,,,,,,#%#..........................................................,,,,,,#,,,,,,,,,,,,,,,#%#.........................................................,,,,,,,,,,,,,,,,,,,,,,,#%##........................................................,,,,,,,,,,,%,,,,,,,,,,,,,###%.......................................................,,,,,,,,,,,,,,,,,,,,,,,,,##%......................................................,,,,,#,,,,,,,,,,,,,,,,,,,,,#%#.....................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,#%##....................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##...................................................,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,##%#..................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%##................................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%...............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%#..............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%............................................,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#...........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%.........................................,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.......................................,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,##%......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.....................................,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#.................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%................................,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#...............................,#,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%##%.............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#............................,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%..........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%.........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#........................,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##%.......................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%......................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%.....................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%....................#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#...................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#.................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#................,,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%#%...............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#.............,,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%#............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#%...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%#..........,,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%#.........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#........,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%#.......,,,,,,,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#......,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#%.....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%#%%#%....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%#%...,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%%#..,,,,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#%%%%#%.,,,,,,,,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%#%%%%%%%%#%%%%%%
0
1
x
+
y
0.99
0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
%
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
#
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
%
#
%
.
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
%
%
%
%
%
%
%
#
%
%
%
%
%
%
0
1
x
diff --git a/test/plotting_linear.ml b/test/plotting_linear.ml index 740eb3c..5db89b4 100644 --- a/test/plotting_linear.ml +++ b/test/plotting_linear.ml @@ -14,19 +14,19 @@ let test = Line_plot_adaptive { callback = (fun x -> sin x); - pixel = "#"; + content = B.line "#"; cache = Hashtbl.create 20; }; Line_plot_adaptive { callback = (fun x -> x ** 2.); - pixel = "%"; + content = B.line "%"; cache = Hashtbl.create 20; }; Boundary_map { - pixel_false = "."; - pixel_true = ","; + content_false = B.line "."; + content_true = B.line ","; callback = (fun (x, y) -> x > y); }; ]; diff --git a/test/plotting_nested.expected b/test/plotting_nested.expected new file mode 100644 index 0000000..1974c38 --- /dev/null +++ b/test/plotting_nested.expected @@ -0,0 +1,50 @@ +Text output: +┌──┬────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1│┌─────────┐ │ +│ ││123456789│ │ +│ │├─────────┤ │ +│ ││┌───────┐│ │ +│ │││ ....││ │ +│ ││├───────┤│ │ +│ │││. ││ │ +│ ││└───────┘│ │ +│ │└─────────┘ │ +│ │ │ +│ │ ┌─────────────────────────│ +│ │ │nice unicode! 💪 │ +│ │ ├─────────────────────────│ +│ │ │┌──────────────┬─────────│ +│ │ ││oï ωεird nums:│┌────────│ +│ │ ││π/2 ││┌───────│ +│ │ ││τ/4 │││┌──────│ +│ │ │├──────────────┤│││sum=Σ_│ +│ │ ││ ││││————— │ +│y │ ││ ││││1+1 │ +│ │ ││ 0 │││├──────│ +│ │ ││ ├─1 ││││ │ +│ │ ││ └─ω ││││ │ +│ │ ││ └─ω² │││└──────│ +│ │ ││ ││└───────│ +│ │ ││ │└────────│ +│ │ │└──────────────┴─────────│ +│ │ └─────────────────────────│ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ │ │ +│ 0│ (│ +├──┼────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ │0 1│ +│ │ x │ +└──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +HTML output: +
y
1
0
123456789
....
.
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)
0
1
x
+ diff --git a/test/plotting_nested.ml b/test/plotting_nested.ml new file mode 100644 index 0000000..0af8ddc --- /dev/null +++ b/test/plotting_nested.ml @@ -0,0 +1,90 @@ +module B = PrintBox +module BPlot = PrintBox_ext_plot + +(* This tests the printbox-ext-plot extension. *) + +let reg_45 = + B.( + frame + (vlist + [ + text "123456789"; + frame ~stretch:true + (vlist [ text "...." |> align ~h:`Right ~v:`Top; text "." ]); + ])) + +let for_3 = + let n = 3 in + Array.init n (fun i -> Array.init n (fun j -> B.sprintf "(%d,%d)" i j)) + |> B.grid + +let nice_unicode = + B.( + frame + @@ vlist + [ + text "nice unicode! 💪"; + frame + @@ hlist + [ + vlist + [ + text "oï ωεird nums:\nπ/2\nτ/4"; + center_hv + @@ tree (text "0") + [ text "1"; tree (text "ω") [ text "ω²" ] ]; + ]; + frame @@ frame @@ frame + @@ vlist + [ + text "sum=Σ_i a·xᵢ²\n—————\n1+1"; + align_right @@ text "Ōₒ\nÀ"; + ]; + ]; + ]) + +let test ~size = + B.extension + @@ BPlot.( + Plot + { + default_config with + size; + specs = + [ + Scatterbag + { + points = + [| + (0., 1.), reg_45; + (1., 0.), for_3; + (0.75, 0.75), nice_unicode; + |]; + }; + (* Map + { + callback = + (fun (x, y) -> + let s = ((x ** 2.) +. (y ** 2.)) ** 0.5 in + B.line + @@ + if s < 0.3 then + " " + else if s < 0.6 then + "." + else if s < 0.9 then + "," + else if s < 1.2 then + ":" + else + ";"); + }; *) + ]; + }) + +let () = + print_endline "Text output:"; + print_endline @@ PrintBox_text.to_string + @@ test ~size:BPlot.default_config.size; + print_endline "\nHTML output:"; + print_endline @@ PrintBox_html.to_string @@ test ~size:(800, 800) From 4f70815b69ba78a78493a5575ac152ce9baae8c6 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Thu, 26 Sep 2024 21:30:55 +0200 Subject: [PATCH 13/25] Fix nested plotting: overlapping boxes were badly mishandled --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 24 ++++--- test/plotting_nested.expected | 82 +++++++++++----------- test/plotting_nested.ml | 4 +- 3 files changed, 58 insertions(+), 52 deletions(-) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index a62cdc2..6ef0f68 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -315,8 +315,7 @@ let flatten_text_canvas canvas = let update ~i ~j line = if i >= 0 && i < dimi && j >= 0 && j < dimj then ( let visible_len = - min - (dimi - i) + min (dimi - i) (PrintBox_text.str_display_width line 0 (String.length line)) in if visible_len > 0 then ( @@ -332,13 +331,20 @@ let flatten_text_canvas canvas = done ) in - Array.iteri - (fun j row -> - Array.iteri - (fun i lines -> - List.iteri (fun dj line -> update ~i ~j:(j + dj) line) lines) - row) - outputs; + (* Traverse in reverse order, so that space-making changes do not get undone. *) + let _ : int = + Array.fold_right + (fun row j -> + let _ : int = + Array.fold_right + (fun lines i -> + List.iteri (fun dj line -> update ~i ~j:(j + dj) line) lines; + i - 1) + row (dimi - 1) + in + j - 1) + outputs (dimj - 1) + in Array.map (fun row -> String.concat "" @@ List.filter_map Fun.id @@ Array.to_list row) canvas diff --git a/test/plotting_nested.expected b/test/plotting_nested.expected index 1974c38..695c552 100644 --- a/test/plotting_nested.expected +++ b/test/plotting_nested.expected @@ -1,50 +1,50 @@ Text output: ┌──┬────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ 1│┌─────────┐ │ -│ ││123456789│ │ -│ │├─────────┤ │ -│ ││┌───────┐│ │ -│ │││ ....││ │ -│ ││├───────┤│ │ -│ │││. ││ │ -│ ││└───────┘│ │ -│ │└─────────┘ │ -│ │ │ -│ │ ┌─────────────────────────│ -│ │ │nice unicode! 💪 │ -│ │ ├─────────────────────────│ -│ │ │┌──────────────┬─────────│ -│ │ ││oï ωεird nums:│┌────────│ -│ │ ││π/2 ││┌───────│ -│ │ ││τ/4 │││┌──────│ -│ │ │├──────────────┤│││sum=Σ_│ -│ │ ││ ││││————— │ -│y │ ││ ││││1+1 │ -│ │ ││ 0 │││├──────│ -│ │ ││ ├─1 ││││ │ -│ │ ││ └─ω ││││ │ -│ │ ││ └─ω² │││└──────│ -│ │ ││ ││└───────│ -│ │ ││ │└────────│ -│ │ │└──────────────┴─────────│ -│ │ └─────────────────────────│ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ 0│ (│ +│ 1│┌─────────┐:::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;│ +│ ││123456789│:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;│ +│ │├─────────┤::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;│ +│ ││┌───────┐│:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;│ +│ │││ ....││::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;│ +│ ││├───────┤│,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;│ +│ │││. ││,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;│ +│ ││└───────┘│,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;│ +│ │└─────────┘,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::┌─────────────────────────│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::│nice unicode! 💪 │ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::├─────────────────────────│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::│┌──────────────┬─────────│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::││oï ωεird nums:│┌────────│ +│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::││π/2 ││┌───────│ +│ │...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::││τ/4 │││┌──────│ +│ │.....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::│├──────────────┤│││sum=Σ_│ +│ │...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::││ ││││————— │ +│y │...............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ ││││1+1 │ +│ │...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ 0 │││├──────│ +│ │......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ ├─1 ││││ │ +│ │.........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ └─ω ││││ │ +│ │............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ └─ω² │││└──────│ +│ │..............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ ││└───────│ +│ │................................................,,,,,,,,,,,,,,,,,,,,,,,,,,││ │└────────│ +│ │..................................................,,,,,,,,,,,,,,,,,,,,,,,,│└──────────────┴─────────│ +│ │...................................................,,,,,,,,,,,,,,,,,,,,,,,└─────────────────────────│ +│ │ ..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::│ +│ │ ......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::│ +│ │ ....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::│ +│ │ ..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::│ +│ │ .................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::│ +│ │ ................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::│ +│ │ ................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ +│ │ ...............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ +│ │ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ +│ │ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ +│ │ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::│ +│ 0│ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::(│ ├──┼────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ │0 1│ │ │ x │ └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1
0
123456789
....
.
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)
0
1
x
+
y
1
0
123456789
....
.
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)
0
1
x
diff --git a/test/plotting_nested.ml b/test/plotting_nested.ml index 0af8ddc..255e990 100644 --- a/test/plotting_nested.ml +++ b/test/plotting_nested.ml @@ -61,7 +61,7 @@ let test ~size = (0.75, 0.75), nice_unicode; |]; }; - (* Map + Map { callback = (fun (x, y) -> @@ -78,7 +78,7 @@ let test ~size = ":" else ";"); - }; *) + }; ]; }) From 1422acf323ad03710fe2bbba822e66bcfc2f2c58 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Thu, 26 Sep 2024 21:42:18 +0200 Subject: [PATCH 14/25] Plotting test: Fix lower bounds error (OCaml < 4.13) --- test/plotting_half_moons.ml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/plotting_half_moons.ml b/test/plotting_half_moons.ml index d485bb6..6824231 100644 --- a/test/plotting_half_moons.ml +++ b/test/plotting_half_moons.ml @@ -20,10 +20,23 @@ end let noise () = Rand.float_range (-0.1) 0.1 +(* [Array.split] only available since OCaml 4.12. *) +let array_split x = + let a0, b0 = x.(0) in + let n = Array.length x in + let a = Array.make n a0 in + let b = Array.make n b0 in + for i = 1 to n - 1 do + let ai, bi = x.(i) in + a.(i) <- ai; + b.(i) <- bi + done; + a, b + (* This tests the printbox-ext-plot extension. *) let moons data_len = let npairs = data_len / 2 in - Array.split + array_split (Array.init npairs (fun _pos -> let i = Rand.int npairs in let v = Float.(of_int (i / 2) *. pi /. of_int npairs) in From 3c482838d5f20dc8d42b3a3bfc8da7b8f76e8cc8 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Fri, 27 Sep 2024 00:23:52 +0200 Subject: [PATCH 15/25] Plotting: arbitrary box overlaps with priorities like layers in graphics editors --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 148 ++++++++++---------- src/printbox-ext-plot/PrintBox_ext_plot.mli | 5 +- test/plotting.expected | 2 +- test/plotting_half_moons.expected | 2 +- test/plotting_linear.expected | 2 +- test/plotting_nested.expected | 92 ++++++------ test/plotting_nested.ml | 13 +- 7 files changed, 136 insertions(+), 128 deletions(-) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index 6ef0f68..22056d8 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -55,10 +55,11 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) (specs : plot_spec list) = (* Unfortunately "x" and "y" of a "matrix" are opposite to how we want them displayed -- the first dimension (i.e. "x") as the horizontal axis. *) - let (dimx, dimy, canvas) : int * int * B.t option array array = + let (dimx, dimy, canvas) : int * int * (int * B.t) list array array = + (* The integer in the cells is the priority number: lower number = more visible. *) match canvas, size with | None, None -> invalid_arg "PrintBox_utils.plot: provide ~canvas or ~size" - | None, Some (dimx, dimy) -> dimx, dimy, Array.make_matrix dimy dimx None + | None, Some (dimx, dimy) -> dimx, dimy, Array.make_matrix dimy dimx [] | Some canvas, None -> let dimy = Array.length canvas in let dimx = Array.length canvas.(0) in @@ -167,37 +168,29 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) Some Float.(scale_x x, to_int (of_int (dimy - 1) *. (y -. miny) /. spany)) with Invalid_argument _ -> None in - let spread ~i ~dmj updated = + let spread ~i ~dmj = if sparse then - (i mod 10 = 0 && dmj mod 10 = 0) - || (i mod 10 = 5 && dmj mod 10 = 0 && not updated) + i mod 10 = 0 && dmj mod 10 = 0 else true in let update ~i ~dmj px = - if - i >= 0 && dmj >= 0 && i < dimx && dmj < dimy - && Option.is_none canvas.(dmj).(i) - then ( - canvas.(dmj).(i) <- Some px; - true - ) else - false + if i >= 0 && dmj >= 0 && i < dimx && dmj < dimy then + canvas.(dmj).(i) <- px :: canvas.(dmj).(i) in - let prerender_scatter points = + let prerender_scatter ~priority points = Array.iter (fun (p, content) -> match scale_2d p with - | Some (i, j) -> ignore @@ update ~i ~dmj:(dimy - 1 - j) content + | Some (i, j) -> update ~i ~dmj:(dimy - 1 - j) (priority, content) | None -> ()) points in - let prerender_map callback = - let updated = ref true in + let prerender_map ~priority callback = canvas |> Array.iteri (fun dmj -> - Array.iteri (fun i pix -> - if Option.is_none pix && spread ~i ~dmj !updated then ( + Array.iteri (fun i _ -> + if spread ~i ~dmj then ( let x = Float.(of_int i *. spanx /. of_int (dimx - 1)) +. minx in @@ -205,14 +198,14 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) Float.(of_int (dimy - 1 - dmj) *. spany /. of_int (dimy - 1)) +. miny in - updated := update ~i ~dmj (callback (x, y)) + update ~i ~dmj (priority, callback (x, y)) ))) in specs - |> List.iter (function + |> List.iteri (fun priority -> function | Scatterplot { points; content } -> - prerender_scatter (Array.map (fun p -> p, content) points) - | Scatterbag { points } -> prerender_scatter points + prerender_scatter ~priority (Array.map (fun p -> p, content) points) + | Scatterbag { points } -> prerender_scatter ~priority points | Line_plot { points; content } -> let points = Array.map scale_1d points in let npoints = Float.of_int (Array.length points) in @@ -223,21 +216,20 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) points |> Array.iteri (fun i -> Option.iter (fun j -> - ignore - @@ update ~i:(rescale_x i) ~dmj:(dimy - 1 - j) content)) + update ~i:(rescale_x i) + ~dmj:(dimy - 1 - j) + (priority, content))) | Boundary_map { callback; content_true; content_false } -> - prerender_map (fun point -> + prerender_map ~priority (fun point -> if callback point then content_true else content_false) - | Map { callback } -> prerender_map callback + | Map { callback } -> prerender_map ~priority callback | Line_plot_adaptive { callback; cache; content } -> - let updated = ref true in canvas.(0) |> Array.iteri (fun i _ -> - if (not sparse) || i mod 5 = 0 || ((not !updated) && i mod 5 = 2) - then ( + if (not sparse) || i mod 5 = 0 then ( let x = unscale_x i in let y = match Hashtbl.find_opt cache x with @@ -249,7 +241,7 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) in scale_1d y |> Option.iter (fun j -> - updated := update ~i ~dmj:(dimy - 1 - j) content) + update ~i ~dmj:(dimy - 1 - j) (priority, content)) ))); minx, miny, maxx, maxy, canvas @@ -298,55 +290,58 @@ let plot ?(prec = 3) ?(no_axes = false) ?canvas ?size ?(x_label = "x") let example = Plot default_config let scale_size_for_text = ref (0.125, 0.05) -let flatten_text_canvas canvas = +let explode s = + let s_len = String.length s in + let rec loop pos = + let char_len = ref 1 in + let cur_len () = PrintBox_text.str_display_width s pos !char_len in + while pos + !char_len <= s_len && cur_len () = 0 do + incr char_len + done; + if cur_len () > 0 then + String.sub s pos !char_len :: loop (pos + !char_len) + else + [] + in + loop 0 + +let flatten_text_canvas ~num_specs canvas = let outputs = B.map_matrix - (function - | Some b -> - (* Fortunately, PrintBox_text does not insert \r by itself. *) - String.split_on_char '\n' @@ PrintBox_text.to_string b - | None -> []) + (fun bs -> + (* Fortunately, PrintBox_text does not insert \r by itself. *) + List.map + (fun (prio, b) -> + let lines = + String.split_on_char '\n' @@ PrintBox_text.to_string b + in + prio, List.map explode lines) + bs) canvas in let dimj = Array.length canvas in let dimi = Array.length canvas.(0) in - (* A [None] on the canvas means that the cell is occupied by a cell to the left of it. *) - let canvas = Array.make_matrix dimj dimi (Some " ") in - let update ~i ~j line = - if i >= 0 && i < dimi && j >= 0 && j < dimj then ( - let visible_len = - min (dimi - i) - (PrintBox_text.str_display_width line 0 (String.length line)) - in - if visible_len > 0 then ( - let actual_len = ref @@ String.length line in - let cur_len () = PrintBox_text.str_display_width line 0 !actual_len in - while !actual_len > 0 && (cur_len () = 0 || cur_len () > visible_len) do - decr actual_len - done; - canvas.(j).(i) <- Some (String.sub line 0 !actual_len) - ); - for di = 1 to visible_len - 1 do - canvas.(j).(i + di) <- None - done - ) - in - (* Traverse in reverse order, so that space-making changes do not get undone. *) - let _ : int = - Array.fold_right - (fun row j -> - let _ : int = - Array.fold_right - (fun lines i -> - List.iteri (fun dj line -> update ~i ~j:(j + dj) line) lines; - i - 1) - row (dimi - 1) - in - j - 1) - outputs (dimj - 1) + let canvas = Array.make_matrix dimj dimi (num_specs, " ") in + let update ~i ~j (prio, box) = + if i >= 0 && i < dimi && j >= 0 && j < dimj then + List.iteri + (fun dj -> + List.iteri (fun di char -> + let j' = j + dj and i' = i + di in + if i' >= 0 && i' < dimi && j' >= 0 && j' < dimj then ( + let old_prio, _ = canvas.(j').(i') in + if prio <= old_prio then canvas.(j').(i') <- prio, char + ))) + box in + Array.iteri + (fun j row -> + Array.iteri + (fun i boxes -> List.iter (fun box -> update ~i ~j box) boxes) + row) + outputs; Array.map - (fun row -> String.concat "" @@ List.filter_map Fun.id @@ Array.to_list row) + (fun row -> String.concat "" @@ List.map snd @@ Array.to_list row) canvas let text_handler ext ~nested:_ = @@ -360,7 +355,8 @@ let text_handler ext ~nested:_ = (B.frame @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:false (fun canvas -> - B.lines @@ Array.to_list @@ flatten_text_canvas canvas) + B.lines @@ Array.to_list + @@ flatten_text_canvas ~num_specs:(List.length specs) canvas) specs) | _ -> B.Unrecognized_extension @@ -373,9 +369,9 @@ let embed_canvas_html ~nested canvas = row |> Array.mapi (fun x cell -> x, cell) |> Array.to_list - |> List.filter_map (fun (x, cell) -> - Option.map - (fun cell -> + |> List.concat_map (fun (x, cell) -> + List.map + (fun (_prio, cell) -> let cell = match nested cell with | PrintBox_html.Render_html html -> html diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index 2f9e8c6..9946e67 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -27,7 +27,8 @@ type plot_spec = type graph = { specs: plot_spec list; - (** Earlier plots in the list take precedence over later plots. *) + (** Earlier plots in the list take precedence in text rendering: in case of overlap, + their boxes are on top. *) x_label: string; (** Horizontal axis label. *) y_label: string; (** Vertical axis label. *) size: int * int; @@ -46,7 +47,7 @@ val default_config : graph type PrintBox.ext += | Plot of graph (** PrintBox extension for plotting: scatterplots, linear graphs, decision boundaries... - See {!graph} and {!plot_spec} for details. *) + See {!graph} and {!plot_spec} for details. *) val concise_float : (prec:int -> float -> string) ref (** The conversion function for labeling axes. Defaults to [sprintf "%.*g"]. *) diff --git a/test/plotting.expected b/test/plotting.expected index 3e5369d..b45b74c 100644 --- a/test/plotting.expected +++ b/test/plotting.expected @@ -46,5 +46,5 @@ Text output: └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1
0
Y
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
M
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
X
0
1
x
+
y
1
0
:
Y
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
M
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
X
0
1
x
diff --git a/test/plotting_half_moons.expected b/test/plotting_half_moons.expected index 5c5db86..dc5bb92 100644 --- a/test/plotting_half_moons.expected +++ b/test/plotting_half_moons.expected @@ -46,5 +46,5 @@ Text output: └───────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1.09
-0.794
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
#
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
#
#
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
%
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
%
#
#
#
%
#
#
#
#
#
%
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
#
#
#
%
%
%
%
#
#
#
#
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
#
%
%
#
%
%
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
#
%
%
%
%
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
%
%
%
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
#
%
#
#
%
#
%
#
%
#
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
#
%
#
#
#
#
%
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
#
%
%
%
#
%
#
%
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
#
#
%
%
#
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
%
%
#
%
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
%
#
%
#
%
#
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
#
%
%
%
#
#
%
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
%
#
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
#
#
%
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
%
#
%
%
%
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
#
%
#
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
%
#
#
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
%
%
%
#
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
#
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
%
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
-1.25
2.1
x
+
y
1.09
-0.794
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
#
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
#
#
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
%
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
%
#
#
#
%
#
#
#
#
#
%
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
#
#
#
%
%
%
%
#
#
#
#
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
#
%
%
#
%
%
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
#
%
%
%
%
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
%
%
%
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
#
%
#
#
%
#
%
#
%
#
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
#
%
#
#
#
#
%
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
#
%
%
%
#
%
#
%
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
#
#
%
%
#
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
%
%
#
%
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
%
#
%
#
%
#
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
#
%
%
%
#
#
%
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
%
#
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
#
#
%
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
%
#
%
%
%
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
#
%
#
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
%
#
#
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
%
%
%
#
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
#
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
%
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
-1.25
2.1
x
diff --git a/test/plotting_linear.expected b/test/plotting_linear.expected index 7780fd3..8be0285 100644 --- a/test/plotting_linear.expected +++ b/test/plotting_linear.expected @@ -46,5 +46,5 @@ Text output: └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
0.99
0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
%
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
#
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
%
#
%
.
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
%
%
%
%
%
%
%
#
%
%
%
%
%
%
0
1
x
+
y
0.99
0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
%
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
#
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
%
#
%
.
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
%
%
%
%
%
%
%
%
#
%
%
%
%
%
0
1
x
diff --git a/test/plotting_nested.expected b/test/plotting_nested.expected index 695c552..9c9a3e2 100644 --- a/test/plotting_nested.expected +++ b/test/plotting_nested.expected @@ -1,50 +1,50 @@ Text output: -┌──┬────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ 1│┌─────────┐:::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;│ -│ ││123456789│:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;│ -│ │├─────────┤::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;│ -│ ││┌───────┐│:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;│ -│ │││ ....││::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;│ -│ ││├───────┤│,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;│ -│ │││. ││,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;│ -│ ││└───────┘│,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;│ -│ │└─────────┘,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;│ -│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;│ -│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::::::::┌─────────────────────────│ -│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::│nice unicode! 💪 │ -│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::::├─────────────────────────│ -│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::│┌──────────────┬─────────│ -│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::││oï ωεird nums:│┌────────│ -│ │,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::││π/2 ││┌───────│ -│ │...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::││τ/4 │││┌──────│ -│ │.....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::│├──────────────┤│││sum=Σ_│ -│ │...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::││ ││││————— │ -│y │...............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ ││││1+1 │ -│ │...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ 0 │││├──────│ -│ │......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ ├─1 ││││ │ -│ │.........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ └─ω ││││ │ -│ │............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ └─ω² │││└──────│ -│ │..............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ ││└───────│ -│ │................................................,,,,,,,,,,,,,,,,,,,,,,,,,,││ │└────────│ -│ │..................................................,,,,,,,,,,,,,,,,,,,,,,,,│└──────────────┴─────────│ -│ │...................................................,,,,,,,,,,,,,,,,,,,,,,,└─────────────────────────│ -│ │ ..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::::│ -│ │ ......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::│ -│ │ ....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::│ -│ │ ..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::::│ -│ │ .................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::│ -│ │ ................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::│ -│ │ ................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ -│ │ ...............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ -│ │ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ -│ │ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::::│ -│ │ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::│ -│ 0│ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::::::::(│ -├──┼────────────────────────────────────────────────────────────────────────────────────────────────────┤ -│ │0 1│ -│ │ x │ -└──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──┬─────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1│┌────────────────────────────────────┐::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; │ +│ ││nice unicode! 💪 │:::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;│ +│ │├────┌─────────┐─────────────────────┤:::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;; │ +│ ││┌───│123456789│┬───────────────────┐│::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;; │ +│ │││oï ├─────────┤────────────────────────────┐::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;; │ +│ │││π/2│┌───────┐│code! 💪 │::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;│ +│ │││τ/4││ ....││────────────────────────────┤::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;; │ +│ ││├───│├───────┤│───────┬───────────────────┐│::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;; │ +│ │││ ││. ││d nums:│┌─────────────────┐││::::::::::::::::::::::::::::::::::┌──────────────────── │ +│ │││ │└───────┘│ ││┌───────────────┐│││,,::::::::::::::::::::::::::::::::│nice unicode! 💪 │ +│ │││ └─────────┘ │││┌─────────────┐││││,,,,,,:::::::::::::::::::::::┌───────────────────────── │ +│ │││ ├─│├──────────────┤│││sum=Σ_i a·xᵢ²│││││,,,,,,,,,::::::::::::::::::::│nice unicode! 💪 │ +│ │││ └─││ ││││————— │││││,,,,,,,,,,,,:::::::::::::::::├───────────────────────── │ +│ │││ ││ ││││1+1 │││││,,,,,,,,,,,,,,,::::::::::::::│┌──────────────┬───────── │ +│ │││ ││ 0 │││├─────────────┤││││,,,,,,,,,,,,,,,,,,:::::::::::││oï ωεird nums:│┌──────── │ +│ │││ ││ ├─1 ││││ Ōₒ│││││,,,,,,,,,,,,,,,,,,,,,::::::::││π/2 ││┌─────── │ +│ ││└─────││ └─ω ││││ À │││││,,,,,,,,,,,,,,,,,,,,,,,::::::││τ/4 │││┌────── │ +│ │└──────││ └─ω² │││└─────────────┘││││,,,,,,,,,,,,,,,,,,,,,,,,,::::│├──────────────┤│││sum=Σ_ │ +│ │.......││ ││└───────────────┘│││,,,,,,,,,,,,,,,,,,,,,,,,,,,::││ ││││————— │ +│y │.......││ │└─────────────────┘││,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ ││││1+1 │ +│ │.......│└──────────────┴───────────────────┘│,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ 0 │││├────── │ +│ │.......└────────────────────────────────────┘,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ ├─1 ││││ │ +│ │.........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ └─ω ││││ │ +│ │............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ └─ω² │││└────── │ +│ │..............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,││ ││└─────── │ +│ │................................................,,,,,,,,,,,,,,,,,,,,,,,,,,││ │└──────── │ +│ │..................................................,,,,,,,,,,,,,,,,,,,,,,,,│└──────────────┴───────── │ +│ │...................................................,,,,,,,,,,,,,,,,,,,,,,,└───────────────────────── │ +│ │ ..................┌─────────┐──────────────────────────┐,,,,,,,,,,,,,,,,,,::::::::::::::: │ +│ │ .............│123456789│de! 💪 │,,,,,,,,,,,,,,,,,,,,::::::::::::::│ +│ │ ..........├─────────┤──────────────────────────┤,,,,,,,,,,,,,,,,,,,,::::::::::::: │ +│ │ .......│┌───────┐│─────┬───────────────────┐│,,,,,,,,,,,,,,,,,,,,::::::::::::: │ +│ │ .....││ ....││nums:│┌─────────────────┐││,,,,,,,,,,,,,,,,,,,,,:::::::::::: │ +│ │ ...│├───────┤│ ││┌───────────────┐│││,,,,,,,,,,,,,,,,,,,,,:::::::::::: │ +│ │ ..││. ││ │││┌─────────────┐││││,,,,,,,,,,,,,,,,,,,,,,::::::::::: │ +│ │ .│└───────┘│─────┤│││sum=Σ_i a·xᵢ²│││││,,,,,,,,,,,,,,,,,,,,,,::::::::::: │ +│ │ └─────────┘ ││││————— │││││,,,,,,,,,,,,,,,,,,,,,,::::::::::: │ +│ │ ││ ││││1+1 │││││,,,,,,,,,,,,,,,,,,,,,,::::::::::: │ +│ │ ││ 0 │││├─────────────┤││││,,,,,,,,,,,,,,,,,,,,,,,:::::::::: │ +│ 0│ ││ ├─1 ││││ Ōₒ│││││,,,,,,,,,,,,,,,,,,,,,,,:::::::::( │ +├──┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ │0 1│ +│ │ x │ +└──┴─────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1
0
123456789
....
.
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)
0
1
x
+
y
1
0
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
123456789
....
.
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
123456789
....
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)
0
1
x
diff --git a/test/plotting_nested.ml b/test/plotting_nested.ml index 255e990..c8fb803 100644 --- a/test/plotting_nested.ml +++ b/test/plotting_nested.ml @@ -56,9 +56,20 @@ let test ~size = { points = [| - (0., 1.), reg_45; + (0.06, 0.95), reg_45; + (0.3, 0.3), reg_45; + |]; + }; + Scatterbag + { + points = + [| + (0., 1.), nice_unicode; + (0.08, 0.9), nice_unicode; (1., 0.), for_3; + (0.3, 0.3), nice_unicode; (0.75, 0.75), nice_unicode; + (0.8, 0.8), nice_unicode; |]; }; Map From 4ef13cc2839187b8e83436959ae504878d29390b Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Fri, 27 Sep 2024 00:32:05 +0200 Subject: [PATCH 16/25] Plotting: Fix lower bounds error (OCaml < 4.10), but also shorter --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index 22056d8..f871efb 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -367,9 +367,7 @@ let embed_canvas_html ~nested canvas = canvas |> Array.mapi (fun y row -> row - |> Array.mapi (fun x cell -> x, cell) - |> Array.to_list - |> List.concat_map (fun (x, cell) -> + |> Array.mapi (fun x cell -> List.map (fun (_prio, cell) -> let cell = @@ -388,7 +386,8 @@ let embed_canvas_html ~nested canvas = ^ "px;left:" ^ Int.to_string x ^ "px"); ] [ cell ]) - cell)) + cell) + |> Array.to_list |> List.concat) in let result = Array.to_list cells |> List.concat From 0070030bf5934d84ff444da04ad06aa3f6b08c3e Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Fri, 27 Sep 2024 10:43:40 +0200 Subject: [PATCH 17/25] Plotting PR: revert the introduction of `PrintBox.is_empty` --- src/PrintBox.ml | 4 ---- src/PrintBox.mli | 3 --- 2 files changed, 7 deletions(-) diff --git a/src/PrintBox.ml b/src/PrintBox.ml index 9c64f24..05f5a23 100644 --- a/src/PrintBox.ml +++ b/src/PrintBox.ml @@ -75,10 +75,6 @@ and t = view let empty = Empty -let is_empty = function - | Empty -> true - | _ -> false - let[@inline] view (t : t) : view = t let[@inline] line_ s = Text { l = [ s ]; style = Style.default } diff --git a/src/PrintBox.mli b/src/PrintBox.mli index 1936682..1c459e7 100644 --- a/src/PrintBox.mli +++ b/src/PrintBox.mli @@ -358,9 +358,6 @@ val asprintf_with_style : (** {2 Managing Representation Extensions} *) -val is_empty : t -> bool -(** [is_empty b] is equivalent to [match view b with Empty -> true | _ -> false]. *) - val register_extension : key:string -> domain:(ext -> bool) -> unit (** Registers a new representation extension, where [key] is a unique identifier for the scope of the extension values, and [domain] delineates that scope. From 6db15d237a31158cfbe514d0c2345371cc1c74e6 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Fri, 27 Sep 2024 11:08:47 +0200 Subject: [PATCH 18/25] Plotting PR: 2 tiny typos --- src/PrintBox.mli | 2 +- src/printbox-ext-plot/PrintBox_ext_plot.mli | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PrintBox.mli b/src/PrintBox.mli index 1c459e7..537e5c2 100644 --- a/src/PrintBox.mli +++ b/src/PrintBox.mli @@ -329,7 +329,7 @@ val anchor : id:string -> t -> t val extension : ext -> t (** [extension ext] embeds an extended representation [ext] as a box. [ext] must be recognized - as a registered extension by one of the [to_key] arguments passed to {!register_extension}. + as a registered extension by one of the [domain] arguments passed to {!register_extension}. @since NEXT_RELEASE *) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index 9946e67..3c7a045 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -1,6 +1,6 @@ (* This file is free software. See file "license" for more details. *) -(** {1 Extend [PrintBox.t] with plots of scatter graphs and line graphs} *) +(** {1 Extend {!PrintBox.t} with plots of scatter graphs and line graphs} *) type plot_spec = | Scatterplot of { From dc95393c82cc82db2e95bf270e415be07f5f0c15 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Fri, 27 Sep 2024 11:18:15 +0200 Subject: [PATCH 19/25] Plotting PR: cleaner and faster `get_extension_handler` --- src/PrintBox.ml | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/PrintBox.ml b/src/PrintBox.ml index 05f5a23..d9c08a1 100644 --- a/src/PrintBox.ml +++ b/src/PrintBox.ml @@ -74,7 +74,6 @@ type view = and t = view let empty = Empty - let[@inline] view (t : t) : view = t let[@inline] line_ s = Text { l = [ s ]; style = Style.default } @@ -252,18 +251,13 @@ let register_extension_handler ~backend_name ~example ~handler = | _ -> ()); Hashtbl.add handlers key handler -let get_extension_handler ~backend_name ~key ext = - (* Note: we do not cache handlers to not depend on the module loading order. *) - match ext with - | Embed_rendering result -> fun ~nested:_ -> result - | _ -> - if not @@ Hashtbl.mem extension_backends backend_name then - fun ~nested:_ -> - Unrecognized_extension - else ( - let handlers = Hashtbl.find extension_backends backend_name in - Hashtbl.find handlers key ext - ) +let get_extension_handler ~backend_name = + if not @@ Hashtbl.mem extension_backends backend_name then + Hashtbl.add extension_backends backend_name (Hashtbl.create 4); + let handlers = Hashtbl.find extension_backends backend_name in + fun ~key -> function + | Embed_rendering result -> fun ~nested:_ -> result + | ext -> Hashtbl.find handlers key ext let expand_extensions_same_as_only ~backend_name = let get_handler = get_extension_handler ~backend_name in From 8a4ae1ffb0b01afb6a7c4a86ce5238105c49c4fc Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Fri, 27 Sep 2024 14:52:11 +0200 Subject: [PATCH 20/25] Plotting with html backend: fix z-index ordering, make framed=opaque --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 23 +++++++++++++++++---- src/printbox-ext-plot/PrintBox_ext_plot.mli | 4 ++-- test/plotting.expected | 2 +- test/plotting_half_moons.expected | 2 +- test/plotting_linear.expected | 2 +- test/plotting_nested.expected | 2 +- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index f871efb..96a525e 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -360,7 +360,7 @@ let text_handler ext ~nested:_ = specs) | _ -> B.Unrecognized_extension -let embed_canvas_html ~nested canvas = +let embed_canvas_html ~num_specs ~nested canvas = let size_y = Array.length canvas in let size_x = Array.length canvas.(0) in let cells = @@ -369,7 +369,21 @@ let embed_canvas_html ~nested canvas = row |> Array.mapi (fun x cell -> List.map - (fun (_prio, cell) -> + (fun (priority, cell) -> + let is_framed = + match PrintBox.view cell with + | B.Frame _ | B.Grid (`Bars, _) -> true + | _ -> false + in + let frame = + if is_framed then + ";background-color:rgba(255,255,255,1)" + else + "" + in + let z_index = + ";z-index:" ^ Int.to_string (num_specs - priority) + in let cell = match nested cell with | PrintBox_html.Render_html html -> html @@ -383,7 +397,8 @@ let embed_canvas_html ~nested canvas = [ H.a_style ("position:absolute;top:" ^ Int.to_string y - ^ "px;left:" ^ Int.to_string x ^ "px"); + ^ "px;left:" ^ Int.to_string x ^ "px" ^ z_index + ^ frame); ] [ cell ]) cell) @@ -406,7 +421,7 @@ let html_handler ext ~nested = B.Same_as (B.frame @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:true - (embed_canvas_html ~nested) + (embed_canvas_html ~num_specs:(List.length specs) ~nested) specs) | _ -> B.Unrecognized_extension diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index 3c7a045..27eb5ca 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -27,8 +27,8 @@ type plot_spec = type graph = { specs: plot_spec list; - (** Earlier plots in the list take precedence in text rendering: in case of overlap, - their boxes are on top. *) + (** Earlier plots in the list take precedence: in case of overlap, their contents + are on top. For HTML, we ensure that framed boxes and grids with bars are opaque. *) x_label: string; (** Horizontal axis label. *) y_label: string; (** Vertical axis label. *) size: int * int; diff --git a/test/plotting.expected b/test/plotting.expected index b45b74c..4803f12 100644 --- a/test/plotting.expected +++ b/test/plotting.expected @@ -46,5 +46,5 @@ Text output: └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1
0
:
Y
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
M
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
X
0
1
x
+
y
1
0
:
Y
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
M
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
X
0
1
x
diff --git a/test/plotting_half_moons.expected b/test/plotting_half_moons.expected index dc5bb92..7a7bdf5 100644 --- a/test/plotting_half_moons.expected +++ b/test/plotting_half_moons.expected @@ -46,5 +46,5 @@ Text output: └───────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1.09
-0.794
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
#
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
#
#
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
%
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
%
#
#
#
%
#
#
#
#
#
%
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
#
#
#
%
%
%
%
#
#
#
#
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
#
%
%
#
%
%
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
#
%
%
%
%
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
%
%
%
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
#
%
#
#
%
#
%
#
%
#
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
#
%
#
#
#
#
%
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
#
%
%
%
#
%
#
%
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
#
#
%
%
#
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
%
%
#
%
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
%
#
%
#
%
#
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
#
%
%
%
#
#
%
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
%
#
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
#
#
%
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
%
#
%
%
%
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
#
%
#
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
%
#
#
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
%
%
%
#
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
#
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
%
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
-1.25
2.1
x
+
y
1.09
-0.794
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
#
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
#
#
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
%
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
%
#
#
#
%
#
#
#
#
#
%
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
#
#
#
%
%
%
%
#
#
#
#
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
#
%
%
#
%
%
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
#
%
%
%
%
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
%
%
%
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
#
%
#
#
%
#
%
#
%
#
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
#
%
#
#
#
#
%
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
#
%
%
%
#
%
#
%
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
#
#
%
%
#
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
%
%
#
%
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
%
#
%
#
%
#
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
#
%
%
%
#
#
%
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
%
#
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
#
#
%
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
%
#
%
%
%
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
#
%
#
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
%
#
#
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
%
%
%
#
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
#
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
%
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
-1.25
2.1
x
diff --git a/test/plotting_linear.expected b/test/plotting_linear.expected index 8be0285..ec1418f 100644 --- a/test/plotting_linear.expected +++ b/test/plotting_linear.expected @@ -46,5 +46,5 @@ Text output: └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
0.99
0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
%
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
#
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
%
#
%
.
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
%
%
%
%
%
%
%
%
#
%
%
%
%
%
0
1
x
+
y
0.99
0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
%
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
#
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
%
#
%
.
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
%
%
%
%
%
%
%
%
#
%
%
%
%
%
0
1
x
diff --git a/test/plotting_nested.expected b/test/plotting_nested.expected index 9c9a3e2..f859172 100644 --- a/test/plotting_nested.expected +++ b/test/plotting_nested.expected @@ -46,5 +46,5 @@ Text output: └──┴─────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1
0
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
123456789
....
.
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
123456789
....
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)
0
1
x
+
y
1
0
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
123456789
....
.
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
123456789
....
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)
0
1
x
From 2333c867a62de28c97fa617fc7280ceeda27c4c4 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Sat, 28 Sep 2024 13:53:27 +0200 Subject: [PATCH 21/25] Greatly simplify the extensibility desing; pass config to handlers --- src/PrintBox.ml | 77 +--------------- src/PrintBox.mli | 56 +----------- src/printbox-ext-plot/PrintBox_ext_plot.ml | 51 +++++------ src/printbox-ext-plot/PrintBox_ext_plot.mli | 3 + src/printbox-html/PrintBox_html.ml | 27 +++--- src/printbox-html/PrintBox_html.mli | 13 ++- src/printbox-md/PrintBox_md.ml | 38 ++++++-- src/printbox-md/PrintBox_md.mli | 5 ++ src/printbox-md/README.md | 2 +- src/printbox-text/PrintBox_text.ml | 32 ++++--- src/printbox-text/PrintBox_text.mli | 4 + test/dune | 4 +- ...{same_as_only.expected => extend.expected} | 8 +- test/extend.ml | 37 ++++++++ test/extend_html_specific.expected | 2 +- test/extend_html_specific.ml | 44 ++++----- test/plotting.expected | 2 +- test/plotting.ml | 73 ++++++++------- test/plotting_half_moons.expected | 2 +- test/plotting_half_moons.ml | 33 ++++--- test/plotting_linear.expected | 2 +- test/plotting_linear.ml | 53 ++++++----- test/plotting_nested.expected | 2 +- test/plotting_nested.ml | 89 +++++++++---------- test/same_as_only.ml | 35 -------- 25 files changed, 306 insertions(+), 388 deletions(-) rename test/{same_as_only.expected => extend.expected} (66%) create mode 100644 test/extend.ml delete mode 100644 test/same_as_only.ml diff --git a/src/PrintBox.ml b/src/PrintBox.ml index d9c08a1..97bb73a 100644 --- a/src/PrintBox.ml +++ b/src/PrintBox.ml @@ -209,82 +209,7 @@ let mk_tree ?indent f root = let link ~uri inner : t = Link { uri; inner } let anchor ~id inner : t = Anchor { id; inner } -let extension_to_key : ((ext -> bool) * string) list ref = ref [] -let extension_keys = Hashtbl.create 4 - -let register_extension ~key ~domain = - if Hashtbl.mem extension_keys key then - invalid_arg @@ "PrintBox.register_extension: key " ^ key - ^ " is already registered"; - Hashtbl.add extension_keys key domain; - extension_to_key := (domain, key) :: !extension_to_key - -let get_extension_key ext = - let rec loop = function - | [] -> invalid_arg "PrintBox.get_extension_key: unregistered extension" - | (domain, key) :: tl -> - if domain ext then - key - else - loop tl - in - loop !extension_to_key - -let extension ext = Ext { key = get_extension_key ext; ext } - -type ext_backend_result = .. -type ext_backend_result += Unrecognized_extension | Same_as of t -type ext += Embed_rendering of ext_backend_result - -let extension_backends = Hashtbl.create 3 -let embed_rendering result = Ext { key = ""; ext = Embed_rendering result } - -let register_extension_handler ~backend_name ~example ~handler = - if not @@ Hashtbl.mem extension_backends backend_name then - Hashtbl.add extension_backends backend_name (Hashtbl.create 4); - let handlers = Hashtbl.find extension_backends backend_name in - let key = get_extension_key example in - (match handler example ~nested:(fun _ -> Same_as Empty) with - | Unrecognized_extension -> - invalid_arg - "PrintBox.register_extension_handler: example outside of handler domain" - | _ -> ()); - Hashtbl.add handlers key handler - -let get_extension_handler ~backend_name = - if not @@ Hashtbl.mem extension_backends backend_name then - Hashtbl.add extension_backends backend_name (Hashtbl.create 4); - let handlers = Hashtbl.find extension_backends backend_name in - fun ~key -> function - | Embed_rendering result -> fun ~nested:_ -> result - | ext -> Hashtbl.find handlers key ext - -let expand_extensions_same_as_only ~backend_name = - let get_handler = get_extension_handler ~backend_name in - let rec loop = function - | Empty -> Text { l = []; style = Style.default } - | Text _ as b -> b - | Frame { sub; stretch } -> Frame { sub = loop sub; stretch } - | Pad (p, b) -> Pad (p, loop b) - | Align { h; v; inner } -> Align { h; v; inner = loop inner } - | Grid (bars, grid) -> Grid (bars, map_matrix loop grid) - | Tree (indent, node, children) -> - Tree (indent, loop node, Array.map loop children) - | Link { uri; inner } -> Link { uri; inner = loop inner } - | Anchor { id; inner } -> Anchor { id; inner = loop inner } - | Ext { key; ext } -> - let nested b = Same_as (loop b) in - (match get_handler ~key ext ~nested with - | Same_as b -> b - | Unrecognized_extension -> - failwith - @@ "PrintBox.expand_extensions_same_as_only: unrecognized extension " - ^ key ^ " for backend " ^ backend_name - | _ -> - invalid_arg @@ "PrintBox.expand_extensions_same_as_only: extension " - ^ key ^ " is not `Same_as`-only for backend " ^ backend_name) - in - loop +let extension ~key ext = Ext { key; ext } (** {2 Simple Structural Interface} *) diff --git a/src/PrintBox.mli b/src/PrintBox.mli index 537e5c2..d298c56 100644 --- a/src/PrintBox.mli +++ b/src/PrintBox.mli @@ -327,9 +327,9 @@ val anchor : id:string -> t -> t @since 0.11 *) -val extension : ext -> t -(** [extension ext] embeds an extended representation [ext] as a box. [ext] must be recognized - as a registered extension by one of the [domain] arguments passed to {!register_extension}. +val extension : key:string -> ext -> t +(** [extension ~key ext] embeds an extended representation [ext] as a box. [ext] must be + recognized by the used backends as an extension registered under [key]. @since NEXT_RELEASE *) @@ -356,56 +356,6 @@ val asprintf_with_style : (** Formatting for {!text}, with style. @since 0.3 *) -(** {2 Managing Representation Extensions} *) - -val register_extension : key:string -> domain:(ext -> bool) -> unit -(** Registers a new representation extension, where [key] is a unique identifier for - the scope of the extension values, and [domain] delineates that scope. - Intended for extension writers. - @since NEXT_RELEASE *) - -type ext_backend_result = .. -(** The type packaging backend-dependent results of handling a representation extension. *) - -type ext_backend_result += - | Unrecognized_extension (** This is an error condition. *) - | Same_as of t - (** The result of rendering is the same as for the given box. *) - -type ext += - | Embed_rendering of ext_backend_result - (** Lets extensions stage rendering by embedding partial results inside boxes. *) - -val embed_rendering : ext_backend_result -> t -(** Embeds the given rendering result in a box. Only backends that can handle the result - will be able to render the returned box! - @since NEXT_RELEASE *) - -val register_extension_handler : - backend_name:string -> - example:ext -> - handler:(ext -> nested:(t -> ext_backend_result) -> ext_backend_result) -> - unit -(** Registers a [handler] for the backend [backend_name] of extensions of the same domain - as [example]. Intended for extension writers. - @since NEXT_RELEASE *) - -val get_extension_handler : - backend_name:string -> - key:string -> - ext -> - nested:(t -> ext_backend_result) -> - ext_backend_result -(** [get_extension_handler ~backend_name] returns a getter function for extension handlers. - Intended for backend writers. - @since NEXT_RELEASE *) - -val expand_extensions_same_as_only : backend_name:string -> t -> t -(** [expand_extensions_same_as_only ~backend_name b] expands extensions in [b] for the backend, - as long as the backend's extension handlers (for extensions in [b]) only use - the [Same_as] variant of {!ext_backend_result}. - @since NEXT_RELEASE *) - (** {2 Simple Structural Interface} *) type 'a ktree = unit -> [ `Nil | `Node of 'a * 'a ktree list ] diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index 96a525e..0a234a0 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -46,10 +46,7 @@ let default_config = type PrintBox.ext += Plot of graph -let () = - B.register_extension ~key:"plot" ~domain:(function - | Plot _ -> true - | _ -> false) +let box graph = B.extension ~key:"Plot" (Plot graph) let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) (specs : plot_spec list) = @@ -287,7 +284,6 @@ let plot ?(prec = 3) ?(no_axes = false) ?canvas ?size ?(x_label = "x") ]; ] -let example = Plot default_config let scale_size_for_text = ref (0.125, 0.05) let explode s = @@ -344,23 +340,28 @@ let flatten_text_canvas ~num_specs canvas = (fun row -> String.concat "" @@ List.map snd @@ Array.to_list row) canvas -let text_handler ext ~nested:_ = +let text_based_handler ~render ext = match ext with | Plot { specs; x_label; y_label; size = sx, sy; no_axes; prec } -> let cx, cy = !scale_size_for_text in let size = Float.(to_int @@ (cx *. of_int sx), to_int @@ (cy *. of_int sy)) in - B.Same_as + render (B.frame @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:false (fun canvas -> B.lines @@ Array.to_list @@ flatten_text_canvas ~num_specs:(List.length specs) canvas) specs) - | _ -> B.Unrecognized_extension + | _ -> invalid_arg "PrintBox_ext_plot.text_handler: unrecognized extension" + +let text_handler = text_based_handler ~render:PrintBox_text.to_string + +let md_handler config = + text_based_handler ~render:(PrintBox_md.to_string config) -let embed_canvas_html ~num_specs ~nested canvas = +let embed_canvas_html ~num_specs canvas = let size_y = Array.length canvas in let size_x = Array.length canvas.(0) in let cells = @@ -385,12 +386,7 @@ let embed_canvas_html ~num_specs ~nested canvas = ";z-index:" ^ Int.to_string (num_specs - priority) in let cell = - match nested cell with - | PrintBox_html.Render_html html -> html - | _ -> - invalid_arg - "PrintBox_ext_plot.embed_canvas_html: unrecognized \ - rendering backend" + PrintBox_html.((to_html cell :> toplevel_html)) in H.div ~a: @@ -413,21 +409,20 @@ let embed_canvas_html ~num_specs ~nested canvas = ^ Int.to_string size_x ^ ";height:" ^ Int.to_string size_y; ] in - B.embed_rendering @@ PrintBox_html.Render_html result + PrintBox_html.embed_html result -let html_handler ext ~nested = +let html_handler config ext = match ext with | Plot { specs; x_label; y_label; size; no_axes; prec } -> - B.Same_as - (B.frame - @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:true - (embed_canvas_html ~num_specs:(List.length specs) ~nested) - specs) - | _ -> B.Unrecognized_extension + (PrintBox_html.to_html ~config + (B.frame + @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:true + (embed_canvas_html ~num_specs:(List.length specs)) + specs) + :> PrintBox_html.toplevel_html) + | _ -> invalid_arg "PrintBox_ext_plot.html_handler: unrecognized extension" let () = - B.register_extension_handler ~backend_name:"text" ~example - ~handler:text_handler; - B.register_extension_handler ~backend_name:"md" ~example ~handler:text_handler; - B.register_extension_handler ~backend_name:"html" ~example - ~handler:html_handler + PrintBox_text.register_extension ~key:"Plot" text_handler; + PrintBox_md.register_extension ~key:"Plot" md_handler; + PrintBox_html.register_extension ~key:"Plot" html_handler diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index 27eb5ca..53f8305 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -49,6 +49,9 @@ type PrintBox.ext += (** PrintBox extension for plotting: scatterplots, linear graphs, decision boundaries... See {!graph} and {!plot_spec} for details. *) +val box : graph -> PrintBox.t +(** [box graph] is the same as [PrintBox.extension ~key:"Plot" (Plot graph)]. *) + val concise_float : (prec:int -> float -> string) ref (** The conversion function for labeling axes. Defaults to [sprintf "%.*g"]. *) diff --git a/src/printbox-html/PrintBox_html.ml b/src/printbox-html/PrintBox_html.ml index 81eb7ac..1f6e093 100644 --- a/src/printbox-html/PrintBox_html.ml +++ b/src/printbox-html/PrintBox_html.ml @@ -8,7 +8,7 @@ module H = Html type 'a html = 'a Html.elt type toplevel_html = Html_types.li_content_fun html -type PrintBox.ext_backend_result += Render_html of toplevel_html +type PrintBox.ext += Embed_html of toplevel_html let prelude = let l = @@ -107,6 +107,16 @@ module Config = struct let tree_summary x c = { c with tree_summary = x } end +let extensions : (string, Config.t -> PrintBox.ext -> toplevel_html) Hashtbl.t = + Hashtbl.create 4 + +let register_extension ~key handler = + if Hashtbl.mem extensions key then + invalid_arg @@ "PrintBox_html.register_extension: already registered " ^ key; + Hashtbl.add extensions key handler + +let embed_html html = B.extension ~key:"Embed_html" (Embed_html html) + let sep_spans sep l = let len = List.length l in List.concat @@ -130,8 +140,6 @@ let br_lines ~bold l = @@ List.concat @@ List.map (String.split_on_char '\n') l -let get_handler = PrintBox.get_extension_handler ~backend_name:"html" - let to_html_rec ~config (b : B.t) = let open Config in let br_text_to_html ?(border = false) ~l ~style () = @@ -264,14 +272,13 @@ let to_html_rec ~config (b : B.t) = | B.Empty -> H.a ~a:[ H.a_id id ] [] | _ -> H.a ~a:[ H.a_id id; H.a_href @@ "#" ^ id ] [ to_html_nondet_rec inner ]) + | B.Ext { key = _; ext = Embed_html result } -> result | B.Ext { key; ext } -> - let nested b = Render_html (to_html_rec b) in - (match get_handler ~key ext ~nested with - | PrintBox.Unrecognized_extension -> assert false - | PrintBox.Same_as b -> to_html_rec b - | Render_html result -> result - | _ -> - failwith "PrintBox_html.to_html: unrecognized extension handler result") + (match Hashtbl.find_opt extensions key with + | Some handler -> handler config ext + | None -> + failwith @@ "PrintBox_html.to_html: missing extension handler for " + ^ key) | _ -> loop to_html_rec b and to_html_nondet_rec b = match B.view b with diff --git a/src/printbox-html/PrintBox_html.mli b/src/printbox-html/PrintBox_html.mli index bad14d4..e36caf8 100644 --- a/src/printbox-html/PrintBox_html.mli +++ b/src/printbox-html/PrintBox_html.mli @@ -6,7 +6,14 @@ open Tyxml type 'a html = 'a Html.elt type toplevel_html = Html_types.li_content_fun html -type PrintBox.ext_backend_result += Render_html of toplevel_html + +type PrintBox.ext += + | Embed_html of toplevel_html + (** Injects HTML into a box. It is handled natively by [PrintBox_html]. + NOTE: this extension is unlikely to be supported by other backends! *) + +val embed_html : toplevel_html -> PrintBox.t +(** Injects HTML into a box. NOTE: this is unlikely to be supported by other backends! *) val prelude : [> Html_types.style ] html (** HTML text to embed in the "", defining the style for tables *) @@ -36,6 +43,10 @@ module Config : sig using the [] HTML5 element. *) end +val register_extension : + key:string -> (Config.t -> PrintBox.ext -> toplevel_html) -> unit +(** Add support for the extension with the given key to this rendering backend. *) + val to_html : ?config:Config.t -> PrintBox.t -> [ `Div ] html (** HTML for one box *) diff --git a/src/printbox-md/PrintBox_md.ml b/src/printbox-md/PrintBox_md.ml index 933416b..99f0b16 100644 --- a/src/printbox-md/PrintBox_md.ml +++ b/src/printbox-md/PrintBox_md.ml @@ -55,6 +55,14 @@ module Config = struct let table_frames c = { c with frames = `As_table } end +let extensions : (string, Config.t -> PrintBox.ext -> string) Hashtbl.t = + Hashtbl.create 4 + +let register_extension ~key handler = + if Hashtbl.mem extensions key then + invalid_arg @@ "PrintBox_text.register_extension: already registered " ^ key; + Hashtbl.add extensions key handler + let style_format c ~no_md ~multiline (s : B.Style.t) = let open B.Style in (* Colors require support for styles: see issue #37 *) @@ -251,7 +259,11 @@ let rec multiline_heuristic c b = | B.Tree (_, header, children) -> Array.length children > 0 || multiline_heuristic c header | B.Link { inner; _ } | B.Anchor { inner; _ } -> multiline_heuristic c inner - | B.Ext _ -> assert false + | B.Ext { key; ext } -> + (match Hashtbl.find_opt extensions key with + | Some handler -> String.contains (handler c ext) '\n' + | None -> + failwith @@ "PrintBox_html.to_html: missing extension handler for " ^ key) let rec line_of_length_heuristic_exn c b = match B.view b with @@ -306,7 +318,15 @@ let rec line_of_length_heuristic_exn c b = (* INNER *) in line_of_length_heuristic_exn c inner + link_len - | B.Ext _ -> assert false + | B.Ext { key; ext } -> + (match Hashtbl.find_opt extensions key with + | Some handler -> + let s = handler c ext in + if String.contains s '\n' then + raise Not_found + else + String.length s + | None -> failwith @@ "PrintBox_md: missing extension handler for " ^ key) let is_native_table c rows = let rec header h = @@ -332,9 +352,9 @@ let rec remove_bold b = | B.Tree _ -> assert false | B.Link { inner; uri } -> B.link ~uri @@ remove_bold inner | B.Anchor { inner; id } -> B.anchor ~id @@ remove_bold inner - | B.Ext _ -> assert false + | B.Ext _ -> (* TODO: non-ideal but avoid complexity for now. *) b -let pp_impl c out b = +let pp c out b = let open Format in (* We cannot use Format for indentation, because we need to insert ">" at the right places. *) let rec loop ~no_block ~no_md ~prefix b = @@ -521,13 +541,15 @@ let pp_impl c out b = | _ -> fprintf out {||} id id); loop ~no_block:true ~no_md ~prefix:(prefix ^ " ") inner; pp_print_string out "" - | B.Ext _ -> assert false + | B.Ext { key; ext } -> + (match Hashtbl.find_opt extensions key with + | Some handler -> pp_print_string out @@ handler c ext + | None -> + failwith @@ "PrintBox_html.to_html: missing extension handler for " + ^ key) in pp_open_vbox out 0; loop ~no_block:false ~no_md:false ~prefix:"" b; pp_close_box out () -let pp c out b = - pp_impl c out @@ B.expand_extensions_same_as_only ~backend_name:"md" b - let to_string c b = Format.asprintf "%a@." (pp c) b diff --git a/src/printbox-md/PrintBox_md.mli b/src/printbox-md/PrintBox_md.mli index 89e9320..30f557a 100644 --- a/src/printbox-md/PrintBox_md.mli +++ b/src/printbox-md/PrintBox_md.mli @@ -72,6 +72,11 @@ module Config : sig Already the case for the {!uniform} config. *) end +val register_extension : + key:string -> (Config.t -> PrintBox.ext -> string) -> unit +(** Add support for the extension with the given key to this rendering backend. + Note: the string returned by the handler can have line breaks. *) + val pp : Config.t -> Format.formatter -> PrintBox.t -> unit (** Pretty-print the Markdown source code into this formatter. *) diff --git a/src/printbox-md/README.md b/src/printbox-md/README.md index 9326b94..bde9aa1 100644 --- a/src/printbox-md/README.md +++ b/src/printbox-md/README.md @@ -113,7 +113,7 @@ to separate the entries (here with style \`Line_break). - > followed by - a list of the child elements. -
  Trees can be made foldable: +
  Trees can be made foldable: - The head element - > is the summary diff --git a/src/printbox-text/PrintBox_text.ml b/src/printbox-text/PrintBox_text.ml index 69a96d8..4a17682 100644 --- a/src/printbox-text/PrintBox_text.ml +++ b/src/printbox-text/PrintBox_text.ml @@ -4,6 +4,13 @@ module B = PrintBox +let extensions = Hashtbl.create 4 + +let register_extension ~key handler = + if Hashtbl.mem extensions key then + invalid_arg @@ "PrintBox_text.register_extension: already registered " ^ key; + Hashtbl.add extensions key handler + type position = PrintBox.position = { x: int; y: int; @@ -555,7 +562,12 @@ end = struct let acc = ref [] in lines_l_ l (fun s i len -> acc := (s, i, len) :: !acc); Text { l = List.rev !acc; style; link_with_uri = Some uri } - | B.Ext _ -> assert false) + | B.Ext { key; ext } -> + (match Hashtbl.find_opt extensions key with + | Some handler -> (of_box ~ansi @@ B.text @@ handler ext).shape + | None -> + failwith @@ "PrintBox_html.to_html: missing extension handler for " + ^ key)) | B.Link { inner; uri } -> (* just encode as a record *) let self = @@ -571,7 +583,12 @@ end = struct | _ -> of_box ~ansi (B.hlist ~bars:false [ B.line uri; inner ]) in self.shape - | B.Ext _ -> assert false + | B.Ext { key; ext } -> + (match Hashtbl.find_opt extensions key with + | Some handler -> (of_box ~ansi @@ B.text @@ handler ext).shape + | None -> + failwith @@ "PrintBox_html.to_html: missing extension handler for " + ^ key) in { shape; size = lazy (size_of_shape shape) } @@ -821,27 +838,22 @@ end = struct let render ~ansi out b = post_render ~out (pre_render ~ansi ~out b Pos.origin) end -let expand_exts = B.expand_extensions_same_as_only ~backend_name:"text" - let to_string_with ~style b = let buf = Output.create () in - Box_inner.render ~ansi:style buf - (Box_inner.of_box ~ansi:style @@ expand_exts b); + Box_inner.render ~ansi:style buf (Box_inner.of_box ~ansi:style b); Output.to_string buf let to_string = to_string_with ~style:true let output ?(style = true) ?(indent = 0) oc b = let buf = Output.create () in - Box_inner.render ~ansi:style buf - (Box_inner.of_box ~ansi:style @@ expand_exts b); + Box_inner.render ~ansi:style buf (Box_inner.of_box ~ansi:style b); Output.to_chan ~indent oc buf; flush oc let pp_with ~style out b = let buf = Output.create () in - Box_inner.render ~ansi:style buf - (Box_inner.of_box ~ansi:style @@ expand_exts b); + Box_inner.render ~ansi:style buf (Box_inner.of_box ~ansi:style b); Output.pp out buf let pp = pp_with ~style:true diff --git a/src/printbox-text/PrintBox_text.mli b/src/printbox-text/PrintBox_text.mli index 40711db..de69147 100644 --- a/src/printbox-text/PrintBox_text.mli +++ b/src/printbox-text/PrintBox_text.mli @@ -5,6 +5,10 @@ This module should be used to output boxes directly to a terminal, or another area of monospace text *) +val register_extension : key:string -> (PrintBox.ext -> string) -> unit +(** Add support for the extension with the given key to this rendering backend. + Note: the string returned by the handler can have line breaks. *) + val set_string_len : (String.t -> int -> int -> int) -> unit (** Set which function is used to compute string length. Typically to be used with a unicode-sensitive length function. diff --git a/test/dune b/test/dune index 3b4aeb5..4f17a74 100644 --- a/test/dune +++ b/test/dune @@ -53,8 +53,8 @@ (libraries printbox printbox-text)) (test - (name same_as_only) - (modules same_as_only) + (name extend) + (modules extend) (package printbox-md) (libraries printbox printbox-text printbox-html printbox-md)) diff --git a/test/same_as_only.expected b/test/extend.expected similarity index 66% rename from test/same_as_only.expected rename to test/extend.expected index 9b6d725..630d1da 100644 --- a/test/same_as_only.expected +++ b/test/extend.expected @@ -3,10 +3,10 @@ Text output: │Hello world!│ └────────────┘ -HTML output: -
Hello world!
- - Markdown output: > Hello world! + +HTML output: +
Hello world!
+ diff --git a/test/extend.ml b/test/extend.ml new file mode 100644 index 0000000..1d8aee2 --- /dev/null +++ b/test/extend.ml @@ -0,0 +1,37 @@ +module B = PrintBox + +(* This tests that all backends support extensions that expand into boxes. *) + +type B.ext += Hello_world of string + +let text_handler ext = + match ext with + | Hello_world txt -> PrintBox_text.to_string (B.frame @@ B.text txt) + | _ -> invalid_arg "text_handler: unrecognized extension" + +let md_handler config ext = + match ext with + | Hello_world txt -> + String.trim PrintBox_md.(to_string config (B.frame @@ B.text txt)) + | _ -> invalid_arg "text_handler: unrecognized extension" + +let html_handler config ext = + match ext with + | Hello_world txt -> + PrintBox_html.((to_html ~config (B.frame @@ B.text txt) :> toplevel_html)) + | _ -> invalid_arg "text_handler: unrecognized extension" + +let () = + PrintBox_text.register_extension ~key:"Hello_world" text_handler; + PrintBox_md.register_extension ~key:"Hello_world" md_handler; + PrintBox_html.register_extension ~key:"Hello_world" html_handler + +let test = B.extension ~key:"Hello_world" @@ Hello_world "Hello world!" + +let () = + print_endline "Text output:"; + print_endline @@ PrintBox_text.to_string test; + print_endline "\nMarkdown output:"; + (print_endline @@ PrintBox_md.(to_string Config.default test)); + print_endline "\nHTML output:"; + print_endline @@ PrintBox_html.to_string test diff --git a/test/extend_html_specific.expected b/test/extend_html_specific.expected index d943db5..bd35a44 100644 --- a/test/extend_html_specific.expected +++ b/test/extend_html_specific.expected @@ -14,5 +14,5 @@ Greetings! └─────────────────┘ HTML output with header: -
Greetings!
+
Greetings!
diff --git a/test/extend_html_specific.ml b/test/extend_html_specific.ml index acf78ff..a496b89 100644 --- a/test/extend_html_specific.ml +++ b/test/extend_html_specific.ml @@ -6,41 +6,33 @@ module H = Html type B.ext += Hello_html of string | Hello_with_header of string -let () = - B.register_extension ~key:"hello_html" ~domain:(function - | Hello_html _ | Hello_with_header _ -> true - | _ -> false) - -let example = Hello_html "" - -let text_handler ext ~nested:_ = +let text_handler ext = match ext with - | Hello_html txt -> B.Same_as B.(frame @@ text txt) + | Hello_html txt -> PrintBox_text.to_string B.(frame @@ text txt) | Hello_with_header txt -> - B.Same_as B.(tree (text "Greetings!") [ frame @@ text txt ]) - | _ -> B.Unrecognized_extension + PrintBox_text.to_string B.(tree (text "Greetings!") [ frame @@ text txt ]) + | _ -> invalid_arg "text_handler: unrecognized extension" -let html_handler ext ~nested = +let html_handler config ext = match ext with - | Hello_html txt -> - let result = H.button [ H.txt txt ] in - PrintBox_html.Render_html result + | Hello_html txt -> (H.button [ H.txt txt ] :> PrintBox_html.toplevel_html) | Hello_with_header txt -> let result = H.button [ H.txt txt ] in - nested - B.( - tree (text "Greetings!") - [ embed_rendering @@ PrintBox_html.Render_html result ]) - | _ -> B.Unrecognized_extension + (PrintBox_html.to_html ~config + B.( + tree (text "Greetings!") + [ B.extension ~key:"Embed_html" (PrintBox_html.Embed_html result) ]) + :> PrintBox_html.toplevel_html) + | _ -> invalid_arg "html_handler: unknown extension" let () = - B.register_extension_handler ~backend_name:"text" ~example - ~handler:text_handler; - B.register_extension_handler ~backend_name:"html" ~example - ~handler:html_handler + PrintBox_text.register_extension ~key:"Hello_world" text_handler; + PrintBox_html.register_extension ~key:"Hello_world" html_handler + +let test1 = B.extension ~key:"Hello_world" @@ Hello_html "Hello world!" -let test1 = B.extension @@ Hello_html "Hello world!" -let test2 = B.extension @@ Hello_with_header "Hello wide world!" +let test2 = + B.extension ~key:"Hello_world" @@ Hello_with_header "Hello wide world!" let () = print_endline "Text output simple:"; diff --git a/test/plotting.expected b/test/plotting.expected index 4803f12..d6c7ccb 100644 --- a/test/plotting.expected +++ b/test/plotting.expected @@ -46,5 +46,5 @@ Text output: └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1
0
:
Y
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
M
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
X
0
1
x
+
y
1
0
:
Y
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
M
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
X
0
1
x
diff --git a/test/plotting.ml b/test/plotting.ml index 35ded49..f2b649d 100644 --- a/test/plotting.ml +++ b/test/plotting.ml @@ -4,43 +4,42 @@ module BPlot = PrintBox_ext_plot (* This tests the printbox-ext-plot extension. *) let test ~size = - B.extension - @@ BPlot.( - Plot - { - default_config with - size; - specs = - [ - Scatterbag - { - points = - [| - (0., 1.), B.line "Y"; - (1., 0.), B.line "X"; - (0.75, 0.75), B.line "M"; - |]; - }; - Map - { - callback = - (fun (x, y) -> - let s = ((x ** 2.) +. (y ** 2.)) ** 0.5 in - B.line - @@ - if s < 0.3 then - " " - else if s < 0.6 then - "." - else if s < 0.9 then - "," - else if s < 1.2 then - ":" - else - ";"); - }; - ]; - }) + BPlot.( + box + { + default_config with + size; + specs = + [ + Scatterbag + { + points = + [| + (0., 1.), B.line "Y"; + (1., 0.), B.line "X"; + (0.75, 0.75), B.line "M"; + |]; + }; + Map + { + callback = + (fun (x, y) -> + let s = ((x ** 2.) +. (y ** 2.)) ** 0.5 in + B.line + @@ + if s < 0.3 then + " " + else if s < 0.6 then + "." + else if s < 0.9 then + "," + else if s < 1.2 then + ":" + else + ";"); + }; + ]; + }) let () = print_endline "Text output:"; diff --git a/test/plotting_half_moons.expected b/test/plotting_half_moons.expected index 7a7bdf5..d2dfd5f 100644 --- a/test/plotting_half_moons.expected +++ b/test/plotting_half_moons.expected @@ -46,5 +46,5 @@ Text output: └───────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1.09
-0.794
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
#
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
#
#
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
%
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
%
#
#
#
%
#
#
#
#
#
%
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
#
#
#
%
%
%
%
#
#
#
#
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
#
%
%
#
%
%
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
#
%
%
%
%
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
%
%
%
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
#
%
#
#
%
#
%
#
%
#
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
#
%
#
#
#
#
%
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
#
%
%
%
#
%
#
%
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
#
#
%
%
#
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
%
%
#
%
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
%
#
%
#
%
#
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
#
%
%
%
#
#
%
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
%
#
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
#
#
%
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
%
#
%
%
%
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
#
%
#
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
%
#
#
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
%
%
%
#
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
#
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
%
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
-1.25
2.1
x
+
y
1.09
-0.794
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
#
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
#
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
#
#
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
#
#
#
#
#
#
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
%
#
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
%
#
#
#
%
#
#
#
#
#
%
.
.
#
.
.
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
#
%
%
#
#
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
#
#
#
%
%
%
%
#
#
#
#
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
#
%
%
#
%
%
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
#
#
%
%
%
%
#
#
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
#
#
%
#
%
%
%
#
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
#
%
#
#
%
#
%
#
%
#
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
#
%
#
#
#
#
%
.
#
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
#
%
%
%
#
%
#
%
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
#
#
%
%
#
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
#
#
%
%
%
#
%
#
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
%
#
%
#
%
#
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
#
%
%
%
#
#
%
.
.
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
%
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
%
#
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
#
%
#
#
%
#
#
%
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
%
#
%
%
%
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
%
%
%
.
.
.
.
.
.
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
#
%
#
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
#
%
#
%
%
#
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
%
#
#
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
%
%
%
#
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
#
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
%
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
%
%
%
%
%
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
%
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
-1.25
2.1
x
diff --git a/test/plotting_half_moons.ml b/test/plotting_half_moons.ml index 6824231..e58ef95 100644 --- a/test/plotting_half_moons.ml +++ b/test/plotting_half_moons.ml @@ -48,23 +48,22 @@ let points1, points2 = moons 1024 let callback (x, y) = Float.compare x y > 0 let test = - B.extension - @@ BPlot.( - Plot - { - default_config with - specs = - [ - Scatterplot { points = points1; content = B.line "#" }; - Scatterplot { points = points2; content = B.line "%" }; - Boundary_map - { - content_false = B.line "."; - content_true = B.line ","; - callback; - }; - ]; - }) + BPlot.( + box + { + default_config with + specs = + [ + Scatterplot { points = points1; content = B.line "#" }; + Scatterplot { points = points2; content = B.line "%" }; + Boundary_map + { + content_false = B.line "."; + content_true = B.line ","; + callback; + }; + ]; + }) let () = print_endline "Text output:"; diff --git a/test/plotting_linear.expected b/test/plotting_linear.expected index ec1418f..15ac7c5 100644 --- a/test/plotting_linear.expected +++ b/test/plotting_linear.expected @@ -46,5 +46,5 @@ Text output: └──┴────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
0.99
0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
%
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
#
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
%
#
%
.
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
%
%
%
%
%
%
%
%
#
%
%
%
%
%
0
1
x
+
y
0.99
0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
%
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
#
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
%
#
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
#
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
%
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
#
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#
%
%
#
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
#
%
%
#
%
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
#
%
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
#
.
.
,
,
,
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
#
%
%
%
%
#
%
.
,
,
,
,
,
,
,
,
%
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
%
%
%
#
%
%
%
%
%
%
%
%
%
#
%
%
%
%
%
0
1
x
diff --git a/test/plotting_linear.ml b/test/plotting_linear.ml index 5db89b4..957a30a 100644 --- a/test/plotting_linear.ml +++ b/test/plotting_linear.ml @@ -4,33 +4,32 @@ module BPlot = PrintBox_ext_plot (* This tests the printbox-ext-plot extension. *) let test = - B.extension - @@ BPlot.( - Plot - { - default_config with - specs = - [ - Line_plot_adaptive - { - callback = (fun x -> sin x); - content = B.line "#"; - cache = Hashtbl.create 20; - }; - Line_plot_adaptive - { - callback = (fun x -> x ** 2.); - content = B.line "%"; - cache = Hashtbl.create 20; - }; - Boundary_map - { - content_false = B.line "."; - content_true = B.line ","; - callback = (fun (x, y) -> x > y); - }; - ]; - }) + BPlot.( + box + { + default_config with + specs = + [ + Line_plot_adaptive + { + callback = (fun x -> sin x); + content = B.line "#"; + cache = Hashtbl.create 20; + }; + Line_plot_adaptive + { + callback = (fun x -> x ** 2.); + content = B.line "%"; + cache = Hashtbl.create 20; + }; + Boundary_map + { + content_false = B.line "."; + content_true = B.line ","; + callback = (fun (x, y) -> x > y); + }; + ]; + }) let () = print_endline "Text output:"; diff --git a/test/plotting_nested.expected b/test/plotting_nested.expected index f859172..bd48aae 100644 --- a/test/plotting_nested.expected +++ b/test/plotting_nested.expected @@ -46,5 +46,5 @@ Text output: └──┴─────────────────────────────────────────────────────────────────────────────────────────────────────┘ HTML output: -
y
1
0
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
123456789
....
.
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
123456789
....
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)
0
1
x
+
y
1
0
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
123456789
....
.
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
nice unicode! 💪
oï ωεird nums:
π/2
τ/4
0
  • 1
  • ω
    • ω²
sum=Σ_i a·xᵢ²
—————
1+1
Ōₒ
À
123456789
....
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
:
:
:
:
:
:
:
:
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)
0
1
x
diff --git a/test/plotting_nested.ml b/test/plotting_nested.ml index c8fb803..639760e 100644 --- a/test/plotting_nested.ml +++ b/test/plotting_nested.ml @@ -44,54 +44,47 @@ let nice_unicode = ]) let test ~size = - B.extension - @@ BPlot.( - Plot - { - default_config with - size; - specs = - [ - Scatterbag - { - points = - [| - (0.06, 0.95), reg_45; - (0.3, 0.3), reg_45; - |]; - }; - Scatterbag - { - points = - [| - (0., 1.), nice_unicode; - (0.08, 0.9), nice_unicode; - (1., 0.), for_3; - (0.3, 0.3), nice_unicode; - (0.75, 0.75), nice_unicode; - (0.8, 0.8), nice_unicode; - |]; - }; - Map - { - callback = - (fun (x, y) -> - let s = ((x ** 2.) +. (y ** 2.)) ** 0.5 in - B.line - @@ - if s < 0.3 then - " " - else if s < 0.6 then - "." - else if s < 0.9 then - "," - else if s < 1.2 then - ":" - else - ";"); - }; - ]; - }) + BPlot.( + box + { + default_config with + size; + specs = + [ + Scatterbag + { points = [| (0.06, 0.95), reg_45; (0.3, 0.3), reg_45 |] }; + Scatterbag + { + points = + [| + (0., 1.), nice_unicode; + (0.08, 0.9), nice_unicode; + (1., 0.), for_3; + (0.3, 0.3), nice_unicode; + (0.75, 0.75), nice_unicode; + (0.8, 0.8), nice_unicode; + |]; + }; + Map + { + callback = + (fun (x, y) -> + let s = ((x ** 2.) +. (y ** 2.)) ** 0.5 in + B.line + @@ + if s < 0.3 then + " " + else if s < 0.6 then + "." + else if s < 0.9 then + "," + else if s < 1.2 then + ":" + else + ";"); + }; + ]; + }) let () = print_endline "Text output:"; diff --git a/test/same_as_only.ml b/test/same_as_only.ml deleted file mode 100644 index 05e2f80..0000000 --- a/test/same_as_only.ml +++ /dev/null @@ -1,35 +0,0 @@ -module B = PrintBox - -(* This tests that all backends support [Same_as]-only extensions. *) - -type B.ext += Hello_world of string - -let () = - B.register_extension ~key:"hello_world" ~domain:(function - | Hello_world _ -> true - | _ -> false) - -let example = Hello_world "" - -let handler ext ~nested:_ = - match ext with - | Hello_world txt -> B.Same_as (B.frame @@ B.text txt) - | _ -> B.Unrecognized_extension - -let register backend_name = - B.register_extension_handler ~backend_name ~example ~handler - -let () = - register "text"; - register "html"; - register "md" - -let test = B.extension @@ Hello_world "Hello world!" - -let () = - print_endline "Text output:"; - print_endline @@ PrintBox_text.to_string test; - print_endline "\nHTML output:"; - print_endline @@ PrintBox_html.to_string test; - print_endline "\nMarkdown output:"; - print_endline @@ PrintBox_md.(to_string Config.default test) From c1bdc61fe89375c87961687442a90369cf639b76 Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Mon, 30 Sep 2024 16:08:59 +0200 Subject: [PATCH 22/25] Standalone test for extending `printbox-md` since its dependencies can evolve --- test/dune | 6 +++--- test/extend.expected | 12 ------------ test/extend.ml | 37 ------------------------------------- test/extend_md.expected | 4 ++++ test/extend_md.ml | 18 ++++++++++++++++++ 5 files changed, 25 insertions(+), 52 deletions(-) delete mode 100644 test/extend.expected delete mode 100644 test/extend.ml create mode 100644 test/extend_md.expected create mode 100644 test/extend_md.ml diff --git a/test/dune b/test/dune index 4f17a74..f6e0d07 100644 --- a/test/dune +++ b/test/dune @@ -53,10 +53,10 @@ (libraries printbox printbox-text)) (test - (name extend) - (modules extend) + (name extend_md) + (modules extend_md) (package printbox-md) - (libraries printbox printbox-text printbox-html printbox-md)) + (libraries printbox printbox-md)) (test (name extend_html_specific) diff --git a/test/extend.expected b/test/extend.expected deleted file mode 100644 index 630d1da..0000000 --- a/test/extend.expected +++ /dev/null @@ -1,12 +0,0 @@ -Text output: -┌────────────┐ -│Hello world!│ -└────────────┘ - -Markdown output: -> Hello world! - - -HTML output: -
Hello world!
- diff --git a/test/extend.ml b/test/extend.ml deleted file mode 100644 index 1d8aee2..0000000 --- a/test/extend.ml +++ /dev/null @@ -1,37 +0,0 @@ -module B = PrintBox - -(* This tests that all backends support extensions that expand into boxes. *) - -type B.ext += Hello_world of string - -let text_handler ext = - match ext with - | Hello_world txt -> PrintBox_text.to_string (B.frame @@ B.text txt) - | _ -> invalid_arg "text_handler: unrecognized extension" - -let md_handler config ext = - match ext with - | Hello_world txt -> - String.trim PrintBox_md.(to_string config (B.frame @@ B.text txt)) - | _ -> invalid_arg "text_handler: unrecognized extension" - -let html_handler config ext = - match ext with - | Hello_world txt -> - PrintBox_html.((to_html ~config (B.frame @@ B.text txt) :> toplevel_html)) - | _ -> invalid_arg "text_handler: unrecognized extension" - -let () = - PrintBox_text.register_extension ~key:"Hello_world" text_handler; - PrintBox_md.register_extension ~key:"Hello_world" md_handler; - PrintBox_html.register_extension ~key:"Hello_world" html_handler - -let test = B.extension ~key:"Hello_world" @@ Hello_world "Hello world!" - -let () = - print_endline "Text output:"; - print_endline @@ PrintBox_text.to_string test; - print_endline "\nMarkdown output:"; - (print_endline @@ PrintBox_md.(to_string Config.default test)); - print_endline "\nHTML output:"; - print_endline @@ PrintBox_html.to_string test diff --git a/test/extend_md.expected b/test/extend_md.expected new file mode 100644 index 0000000..490ab48 --- /dev/null +++ b/test/extend_md.expected @@ -0,0 +1,4 @@ + +Markdown output: +> Hello world! + diff --git a/test/extend_md.ml b/test/extend_md.ml new file mode 100644 index 0000000..1c01bed --- /dev/null +++ b/test/extend_md.ml @@ -0,0 +1,18 @@ +module B = PrintBox + +(* This tests that all backends support extensions that expand into boxes. *) + +type B.ext += Hello_world of string + +let md_handler config ext = + match ext with + | Hello_world txt -> + String.trim PrintBox_md.(to_string config (B.frame @@ B.text txt)) + | _ -> invalid_arg "text_handler: unrecognized extension" + +let () = PrintBox_md.register_extension ~key:"Hello_world" md_handler +let test = B.extension ~key:"Hello_world" @@ Hello_world "Hello world!" + +let () = + print_endline "\nMarkdown output:"; + print_endline @@ PrintBox_md.(to_string Config.default test) From 1692771f79f24b8b333e73f491dee1a7c2d1bc7d Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Mon, 30 Sep 2024 16:17:13 +0200 Subject: [PATCH 23/25] Standalone test for extending `printbox-html`, its dependency on `printbox-text` is spurious --- test/dune | 2 +- test/extend_html_specific.expected | 10 ---------- test/extend_html_specific.ml | 12 ------------ 3 files changed, 1 insertion(+), 23 deletions(-) diff --git a/test/dune b/test/dune index f6e0d07..3e96fcb 100644 --- a/test/dune +++ b/test/dune @@ -62,7 +62,7 @@ (name extend_html_specific) (modules extend_html_specific) (package printbox-html) - (libraries printbox tyxml printbox-text printbox-html)) + (libraries printbox tyxml printbox-html)) (test (name plotting) diff --git a/test/extend_html_specific.expected b/test/extend_html_specific.expected index bd35a44..2f97395 100644 --- a/test/extend_html_specific.expected +++ b/test/extend_html_specific.expected @@ -1,18 +1,8 @@ -Text output simple: -┌────────────┐ -│Hello world!│ -└────────────┘ HTML output simple:
-Text output with header: -Greetings! -└─┬─────────────────┐ - │Hello wide world!│ - └─────────────────┘ - HTML output with header:
Greetings!
diff --git a/test/extend_html_specific.ml b/test/extend_html_specific.ml index a496b89..ca89320 100644 --- a/test/extend_html_specific.ml +++ b/test/extend_html_specific.ml @@ -6,13 +6,6 @@ module H = Html type B.ext += Hello_html of string | Hello_with_header of string -let text_handler ext = - match ext with - | Hello_html txt -> PrintBox_text.to_string B.(frame @@ text txt) - | Hello_with_header txt -> - PrintBox_text.to_string B.(tree (text "Greetings!") [ frame @@ text txt ]) - | _ -> invalid_arg "text_handler: unrecognized extension" - let html_handler config ext = match ext with | Hello_html txt -> (H.button [ H.txt txt ] :> PrintBox_html.toplevel_html) @@ -26,7 +19,6 @@ let html_handler config ext = | _ -> invalid_arg "html_handler: unknown extension" let () = - PrintBox_text.register_extension ~key:"Hello_world" text_handler; PrintBox_html.register_extension ~key:"Hello_world" html_handler let test1 = B.extension ~key:"Hello_world" @@ Hello_html "Hello world!" @@ -35,12 +27,8 @@ let test2 = B.extension ~key:"Hello_world" @@ Hello_with_header "Hello wide world!" let () = - print_endline "Text output simple:"; - print_endline @@ PrintBox_text.to_string test1; print_endline "\nHTML output simple:"; print_endline @@ PrintBox_html.to_string test1; - print_endline "\nText output with header:"; - print_endline @@ PrintBox_text.to_string test2; print_endline "\nHTML output with header:"; print_endline @@ PrintBox_html.(to_string ~config:Config.(tree_summary true default) test2) From 196ecb1c71763252b542fb68fc21ee60552cac9d Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Mon, 30 Sep 2024 17:23:09 +0200 Subject: [PATCH 24/25] More docu-comments for the plotting extension --- src/printbox-ext-plot/PrintBox_ext_plot.mli | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index 53f8305..aa9e8b8 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -2,27 +2,39 @@ (** {1 Extend {!PrintBox.t} with plots of scatter graphs and line graphs} *) +(** Specifies a layer of plotting to be rendered on a graph, where all layers share + the same coordinate space. A coordinate pair has the horizontal position first. *) type plot_spec = | Scatterplot of { points: (float * float) array; content: PrintBox.t; - } + } (** Places the [content] box at each of the [points] coordinates. *) | Scatterbag of { points: ((float * float) * PrintBox.t) array } + (** For each element of [points], places the given box at the given coordinates. *) | Line_plot of { points: float array; content: PrintBox.t; } + (** Places the [content] box at vertical coordinates [points], + evenly horizontally spread. *) | Boundary_map of { callback: float * float -> bool; content_true: PrintBox.t; content_false: PrintBox.t; } + (** At evenly and densely spread coordinates across the graph, places either + [content_true] or [content_false], depending on the result of [callback]. *) | Map of { callback: float * float -> PrintBox.t } + (** At evenly and densely spread coordinates across the graph, places the box + returned by [callback]. *) | Line_plot_adaptive of { callback: float -> float; cache: (float, float) Hashtbl.t; content: PrintBox.t; } + (** At evenly and densely spread horizontal coordinates, places the [content] box + at the vertical coordinate returned by [callback] for the horizontal coordinate + of the placement position. *) [@@deriving sexp_of] type graph = { @@ -38,6 +50,8 @@ type graph = { (** If true, only the graphing area is output (skipping the axes box). *) prec: int; (** Precision for numerical labels on axes. *) } +(** A graph of plot layers, with a fixed rendering size but a coordinate window + that adapts to the specified points. *) val default_config : graph (** A suggested configuration for plotting, with intended use: From 758efdd4191fe5dbcc357dcece5f75e34e4e505c Mon Sep 17 00:00:00 2001 From: Lukasz Stafiniak Date: Mon, 30 Sep 2024 17:32:16 +0200 Subject: [PATCH 25/25] `PrintBox_ext_plot.graph`: Rename `no_axes` -> `axes` --- src/printbox-ext-plot/PrintBox_ext_plot.ml | 20 ++++++++++---------- src/printbox-ext-plot/PrintBox_ext_plot.mli | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.ml b/src/printbox-ext-plot/PrintBox_ext_plot.ml index 0a234a0..41691de 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.ml +++ b/src/printbox-ext-plot/PrintBox_ext_plot.ml @@ -30,7 +30,7 @@ type graph = { x_label: string; y_label: string; size: int * int; - no_axes: bool; + axes: bool; prec: int; } @@ -40,7 +40,7 @@ let default_config = x_label = "x"; y_label = "y"; size = 800, 800; - no_axes = false; + axes = true; prec = 3; } @@ -55,7 +55,7 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) let (dimx, dimy, canvas) : int * int * (int * B.t) list array array = (* The integer in the cells is the priority number: lower number = more visible. *) match canvas, size with - | None, None -> invalid_arg "PrintBox_utils.plot: provide ~canvas or ~size" + | None, None -> invalid_arg "PrintBox_ext_plot.plot: provide ~canvas or ~size" | None, Some (dimx, dimy) -> dimx, dimy, Array.make_matrix dimy dimx [] | Some canvas, None -> let dimy = Array.length canvas in @@ -244,8 +244,8 @@ let plot_canvas ?canvas ?(size : (int * int) option) ?(sparse = false) let concise_float = ref (fun ~prec -> Printf.sprintf "%.*g" prec) -let plot ?(prec = 3) ?(no_axes = false) ?canvas ?size ?(x_label = "x") - ?(y_label = "y") ~sparse embed_canvas specs = +let plot ~prec ~axes ?canvas ?size ~x_label + ~y_label ~sparse embed_canvas specs = let minx, miny, maxx, maxy, canvas = plot_canvas ?canvas ?size ~sparse specs in @@ -253,7 +253,7 @@ let plot ?(prec = 3) ?(no_axes = false) ?canvas ?size ?(x_label = "x") let y_label_l = List.map Char.escaped @@ List.of_seq @@ String.to_seq y_label in - if no_axes then + if not axes then embed_canvas canvas else grid_l @@ -342,14 +342,14 @@ let flatten_text_canvas ~num_specs canvas = let text_based_handler ~render ext = match ext with - | Plot { specs; x_label; y_label; size = sx, sy; no_axes; prec } -> + | Plot { specs; x_label; y_label; size = sx, sy; axes; prec } -> let cx, cy = !scale_size_for_text in let size = Float.(to_int @@ (cx *. of_int sx), to_int @@ (cy *. of_int sy)) in render (B.frame - @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:false + @@ plot ~prec ~axes ~size ~x_label ~y_label ~sparse:false (fun canvas -> B.lines @@ Array.to_list @@ flatten_text_canvas ~num_specs:(List.length specs) canvas) @@ -413,10 +413,10 @@ let embed_canvas_html ~num_specs canvas = let html_handler config ext = match ext with - | Plot { specs; x_label; y_label; size; no_axes; prec } -> + | Plot { specs; x_label; y_label; size; axes; prec } -> (PrintBox_html.to_html ~config (B.frame - @@ plot ~prec ~no_axes ~size ~x_label ~y_label ~sparse:true + @@ plot ~prec ~axes ~size ~x_label ~y_label ~sparse:true (embed_canvas_html ~num_specs:(List.length specs)) specs) :> PrintBox_html.toplevel_html) diff --git a/src/printbox-ext-plot/PrintBox_ext_plot.mli b/src/printbox-ext-plot/PrintBox_ext_plot.mli index aa9e8b8..1fed378 100644 --- a/src/printbox-ext-plot/PrintBox_ext_plot.mli +++ b/src/printbox-ext-plot/PrintBox_ext_plot.mli @@ -46,8 +46,8 @@ type graph = { size: int * int; (** Size of the graphing area in pixels. Scale for characters is configured by {!scale_size_for_text}. *) - no_axes: bool; - (** If true, only the graphing area is output (skipping the axes box). *) + axes: bool; + (** If false, only the graphing area is output (skipping the axes box). *) prec: int; (** Precision for numerical labels on axes. *) } (** A graph of plot layers, with a fixed rendering size but a coordinate window @@ -56,7 +56,7 @@ type graph = { val default_config : graph (** A suggested configuration for plotting, with intended use: [Plot {default_config with specs = ...; ...}]. The default values are: - [{ specs = []; x_label = "x"; y_label = "y"; size = 800, 800; no_axes = false; prec = 3 }] *) + [{ specs = []; x_label = "x"; y_label = "y"; size = 800, 800; axes = true; prec = 3 }] *) type PrintBox.ext += | Plot of graph