Merge: Ropes
authorJean Privat <jean@pryen.org>
Thu, 6 Nov 2014 23:00:22 +0000 (18:00 -0500)
committerJean Privat <jean@pryen.org>
Thu, 6 Nov 2014 23:00:22 +0000 (18:00 -0500)
Here they are, after a few months hiding in the fiery depths of the dumpsterâ„¢, they return, once more.

The Ropes are back, and they're looking for trouble.

On a more serious note, they look a lot more performing than before, thanks to a wrapper-less structure.

The code is also simpler to read and understand (and there's lots more of documentation, I figured @Morriar would like that).

Finally, you can use Strings in a transparent way, never to create Ropes on your own, now the library does it for you.

Furthermore, `RopeBuffer` pridefully returns with the promises of crushing the `FlatBuffer` when concatenating stuff and resisting a bit more to longer strings.
(NDLR: Single-character modifications will be slow.)

Pull-Request: #829
Reviewed-by: Jean Privat <jean@pryen.org>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>

36 files changed:
benchmarks/bench_strings.sh
benchmarks/strings/chain_concat.nit
benchmarks/strings/iteration_bench.nit
benchmarks/strings/substr_bench.nit
lib/buffered_ropes.nit [new file with mode: 0644]
lib/bufferized_ropes.nit [deleted file]
lib/ropes_debug.nit
lib/splay_ropes.nit [deleted file]
lib/standard/ropes.nit
lib/standard/standard.nit
lib/standard/stream.nit
lib/standard/string.nit
lib/string_experimentations/utf8_noindex.nit
src/doc/doc_pages.nit
tests/bench_string_append.nit
tests/example_procedural_string.nit
tests/example_string.nit
tests/sav/bench_string_append_alt1.res [new file with mode: 0644]
tests/sav/example_procedural_string_alt1.res [new file with mode: 0644]
tests/sav/example_string_alt1.res [new file with mode: 0644]
tests/sav/splay_test.res [deleted file]
tests/sav/string_trim_alt1.res [new file with mode: 0644]
tests/sav/test_ropes.res
tests/sav/test_ropes_alt1.res [deleted file]
tests/sav/test_ropes_alt2.res [deleted file]
tests/sav/test_string_long_alt1.res [new file with mode: 0644]
tests/sav/test_to_upper_lower_buffer_alt1.res [new file with mode: 0644]
tests/shootout_nsieve.nit
tests/splay_test.nit [deleted file]
tests/string_trim.nit
tests/test_arr_tos_ropes.nit
tests/test_flatrope.nit
tests/test_ropes.nit
tests/test_string_long.nit
tests/test_text.nit
tests/test_to_upper_lower_buffer.nit

index c327d58..0bb13a7 100755 (executable)
@@ -54,7 +54,7 @@ function bench_array()
                echo "*** Benching Array.to_s performance ***"
        fi
 
-       ../bin/nitg --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_rope.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../bin/nitg --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_flatstr.nit -m ../lib/standard/ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
 
        prepare_res arr_tos_ropes.out arr_tos_ropes ropes
        if $verbose; then
@@ -67,6 +67,19 @@ function bench_array()
                bench_command $i ropes$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
        done
 
+       ../bin/nitg --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_flatstr.nit -m ../lib/standard/ropes.nit -m ../lib/buffered_ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+
+       prepare_res arr_tos_buf_ropes.out arr_tos_buf_ropes buffered_ropes
+       if $verbose; then
+               echo "Buffered Ropes :"
+       fi
+       for i in `seq 1 "$3"`; do
+               if $verbose; then
+                       echo "String length = $i, Concats/loop = $1, Loops = $2"
+               fi
+               bench_command $i buf_ropes$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
+       done
+
        ../bin/nitg --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_flatstr.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
 
        prepare_res arr_tos_flat.out arr_tos_flat flatstring
@@ -110,7 +123,7 @@ function bench_array()
 
        prepare_res arr_tos_man_buf.out arr_tos_man_buf flatbuf_with_capacity
        if $verbose; then
-               echo "Memmove :"
+               echo "FlatBuffer.with_capacity :"
        fi
        for i in `seq 1 "$3"`; do
                if $verbose; then
@@ -119,25 +132,30 @@ function bench_array()
                bench_command $i flatbuf_with_capacity$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
        done
 
+       ../bin/nitg --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_rope_buf.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+
+       prepare_res arr_tos_rope_buf.out arr_tos_rope_buf ropebuf
+       if $verbose; then
+               echo "RopeBuffer :"
+       fi
+       for i in `seq 1 "$3"`; do
+               if $verbose; then
+                       echo "String length = $i, Concats/loop = $1, Loops = $2"
+               fi
+               bench_command $i ropebuf$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
+       done
+
        plot array_tos.gnu
 }
 
 function bench_concat()
 {
-       if $verbose; then
-               echo "*** Benching concat performance ***"
-       fi
+       ../bin/nitg --global ./strings/chain_concat.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../bin/nitg --global ./strings/utf_chain_concat.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
 
-       prepare_res concat_ropes.out concat_ropes ropes
        if $verbose; then
-               echo "Ropes :"
+               echo "*** Benching concat performance ***"
        fi
-       for i in `seq 1 "$1"`; do
-               if $verbose; then
-                       echo "String length = $i, Concats/loop = $2, Loops = $3"
-               fi
-               bench_command $i ropes$i ./chain_concat -m rope --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
-       done
 
        prepare_res concat_flat.out concat_flat flatstring
        if $verbose; then
@@ -172,37 +190,57 @@ function bench_concat()
                bench_command $i flatstr_utf8_noindex$i ./utf_chain_concat -m flatstr_utf8_noindex --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
        done
 
-       plot concat.gnu
-}
+       ../bin/nitg --global ./strings/chain_concat.nit -m ../lib/standard/ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
 
-function bench_iteration()
-{
+       prepare_res concat_ropes.out concat_ropes ropes
        if $verbose; then
-               echo "*** Benching iteration performance ***"
+               echo "Ropes :"
        fi
+       for i in `seq 1 "$1"`; do
+               if $verbose; then
+                       echo "String length = $i, Concats/loop = $2, Loops = $3"
+               fi
+               bench_command $i ropes$i ./chain_concat -m flatstr --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+       done
 
-       prepare_res iter_ropes_iter.out iter_ropes_iter ropes_iter
+       ../bin/nitg --global ./strings/chain_concat.nit -m ../lib/standard/ropes.nit -m ../lib/buffered_ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+
+       prepare_res concat_buf_ropes.out concat_buf_ropes buffered_ropes
        if $verbose; then
-               echo "Ropes by iterator :"
+               echo "buffered ropes :"
        fi
        for i in `seq 1 "$1"`; do
                if $verbose; then
-                       echo "String base length = $1, Concats (depth of the rope) = $i, Loops = $3"
+                       echo "string length = $i, concats/loop = $2, loops = $3"
                fi
-               bench_command $i ropes_iter$i ./iteration_bench -m rope --iter-mode iterator --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i buf_ropes$i ./chain_concat -m flatstr --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
        done
 
-       prepare_res iter_ropes_index.out iter_ropes_index ropes_index
+       ../bin/nitg --global ./strings/chain_cct_ropebuf.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+
+       prepare_res cct_buf_ropes.out cct_buf_ropes cctbuf_ropes
        if $verbose; then
-               echo "Ropes by index :"
+               echo "buffered ropes :"
        fi
        for i in `seq 1 "$1"`; do
                if $verbose; then
-                       echo "String base length = $1, Concats (depth of the rope) = $i, Loops = $3"
+                       echo "string length = $i, concats/loop = $2, loops = $3"
                fi
-               bench_command $i ropes_index$i ./iteration_bench -m rope --iter-mode index --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i cctbuf_ropes$i ./chain_cct_ropebuf --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
        done
 
+       plot concat.gnu
+}
+
+function bench_iteration()
+{
+       if $verbose; then
+               echo "*** Benching iteration performance ***"
+       fi
+
+       ../bin/nitg --global ./strings/iteration_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../bin/nitg --global ./strings/utf_iteration_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+
        prepare_res iter_flat_iter.out iter_flat_iter flatstring_iter
        if $verbose; then
                echo "FlatStrings by iterator :"
@@ -269,26 +307,66 @@ function bench_iteration()
                bench_command $i flatstr_index_utf8_noindex$i ./utf_iteration_bench -m flatstr_utf8_noindex --iter-mode index --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
        done
 
-       plot iter.gnu
-}
+       ../bin/nitg --global ./strings/iteration_bench.nit -m ../lib/standard/ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
 
-function bench_substr()
-{
+       prepare_res iter_ropes_iter.out iter_ropes_iter ropes_iter
        if $verbose; then
-               echo "*** Benching substring performance ***"
+               echo "Ropes by iterator :"
        fi
+       for i in `seq 1 "$1"`; do
+               if $verbose; then
+                       echo "String base length = $1, Concats (depth of the rope) = $i, Loops = $3"
+               fi
+               bench_command $i ropes_iter$i ./iteration_bench -m flatstr --iter-mode iterator --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+       done
 
-       prepare_res substr_ropes.out substr_ropes ropes
+       prepare_res iter_ropes_index.out iter_ropes_index ropes_index
        if $verbose; then
-               echo "Ropes :"
+               echo "Ropes by index :"
        fi
        for i in `seq 1 "$1"`; do
                if $verbose; then
-                       echo "String length = $i, loops = $2, Loops = $3"
+                       echo "String base length = $1, Concats (depth of the rope) = $i, Loops = $3"
+               fi
+               bench_command $i ropes_index$i ./iteration_bench -m flatstr --iter-mode index --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+       done
+
+       ../bin/nitg --global ./strings/iteration_bench.nit -m ../lib/standard/ropes.nit -m ../lib/buffered_ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+
+       prepare_res iter_buf_ropes_iter.out iter_buf_ropes_iter buf_ropes_iter
+       if $verbose; then
+               echo "Buffered Ropes by iterator :"
+       fi
+       for i in `seq 1 "$1"`; do
+               if $verbose; then
+                       echo "String base length = $1, Concats (depth of the rope) = $i, Loops = $3"
+               fi
+               bench_command $i buf_ropes_iter$i ./iteration_bench -m flatstr --iter-mode iterator --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+       done
+
+       prepare_res iter_buf_ropes_index.out iter_buf_ropes_index buf_ropes_index
+       if $verbose; then
+               echo "Buffered Ropes by index :"
+       fi
+       for i in `seq 1 "$1"`; do
+               if $verbose; then
+                       echo "String base length = $1, Concats (depth of the rope) = $i, Loops = $3"
                fi
-               bench_command $i ropes$i ./substr_bench -m rope --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i buf_ropes_index$i ./iteration_bench -m flatstr --iter-mode index --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
        done
 
+       plot iter.gnu
+}
+
+function bench_substr()
+{
+       if $verbose; then
+               echo "*** Benching substring performance ***"
+       fi
+
+       ../bin/nitg --global ./strings/substr_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../bin/nitg --global ./strings/utf_substr_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+
        prepare_res substr_flat.out substr_flat flatstring
        if $verbose; then
                echo "FlatStrings :"
@@ -322,6 +400,31 @@ function bench_substr()
                bench_command $i flatstring_utf8_noindex$i ./utf_substr_bench -m flatstr_utf8_noindex --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
        done
 
+       ../bin/nitg --global ./strings/substr_bench.nit -m ../lib/standard/ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+
+       prepare_res substr_ropes.out substr_ropes ropes
+       if $verbose; then
+               echo "Ropes :"
+       fi
+       for i in `seq 1 "$1"`; do
+               if $verbose; then
+                       echo "String length = $i, loops = $2, Loops = $3"
+               fi
+               bench_command $i ropes$i ./substr_bench -m flatstr --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+       done
+
+       ../bin/nitg --global ./strings/substr_bench.nit -m ../lib/standard/ropes.nit -m ../lib/buffered_ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+
+       prepare_res substr_buf_ropes.out substr_buf_ropes buf_ropes
+       if $verbose; then
+               echo "Buffered Ropes :"
+       fi
+       for i in `seq 1 "$1"`; do
+               if $verbose; then
+                       echo "String length = $i, loops = $2, Loops = $3"
+               fi
+               bench_command $i buf_ropes$i ./substr_bench -m flatstr --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+       done
        plot substr.gnu
 }
 
@@ -340,17 +443,6 @@ if test $# -ne 4; then
        exit
 fi
 
-if $verbose; then
-       echo "Compiling"
-fi
-
-../bin/nitg --global ./strings/chain_concat.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-../bin/nitg --global ./strings/utf_chain_concat.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-../bin/nitg --global ./strings/iteration_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-../bin/nitg --global ./strings/utf_iteration_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-../bin/nitg --global ./strings/substr_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-../bin/nitg --global ./strings/utf_substr_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-
 case "$1" in
        iter) shift; bench_iteration $@ ;;
        cct) shift; bench_concat $@ ;;
index 35466f9..a45075f 100644 (file)
@@ -25,18 +25,6 @@ do
        end
 end
 
-fun bench_rope(str_size: Int, nb_ccts: Int, loops: Int)
-do
-       var lft = "a" * str_size
-
-       for i in [0..loops] do
-               var str: String = new RopeString.from(lft)
-               for j in [0..nb_ccts] do
-                       str += lft
-               end
-       end
-end
-
 fun bench_flatbuf(str_size: Int, nb_ccts: Int, loops: Int)
 do
        var lft = "a" * str_size
@@ -51,7 +39,7 @@ do
 end
 
 var opts = new OptionContext
-var mode = new OptionEnum(["rope", "flatstr", "flatbuf"], "Mode", -1, "-m")
+var mode = new OptionEnum(["flatstr", "flatbuf"], "Mode", -1, "-m")
 var nb_ccts = new OptionInt("Number of concatenations per loop", -1, "--ccts")
 var loops = new OptionInt("Number of loops to be done", -1, "--loops")
 var strlen = new OptionInt("Length of the base string", -1, "--strlen")
@@ -67,10 +55,8 @@ end
 var modval = mode.value
 
 if modval == 0 then
-       bench_rope(strlen.value, nb_ccts.value, loops.value)
-else if modval == 1 then
        bench_flatstr(strlen.value, nb_ccts.value, loops.value)
-else if modval == 2 then
+else if modval == 1 then
        bench_flatbuf(strlen.value, nb_ccts.value, loops.value)
 else
        opts.usage
index a8047d2..0e36c49 100644 (file)
@@ -13,39 +13,6 @@ module iteration_bench
 
 import opts
 
-fun bench_rope_iter(nb_cct: Int, loops: Int, strlen: Int)
-do
-       var a = "a" * strlen
-       var x:String = new RopeString.from(a)
-       for i in [0 .. nb_cct] do x += a
-       var cnt = 0
-       var c: Char
-       while cnt != loops do
-               for i in x do
-                       c = i
-               end
-               cnt += 1
-       end
-end
-
-fun bench_rope_index(nb_cct: Int, loops: Int, strlen: Int)
-do
-       var a = "a" * strlen
-       var x:String = new RopeString.from(a)
-       for i in [0 .. nb_cct] do x += a
-       var cnt = 0
-       var c: Char
-       var pos = 0
-       while cnt != loops do
-               pos = 0
-               while pos < x.length do
-                       c = x[pos]
-                       pos += 1
-               end
-               cnt += 1
-       end
-end
-
 fun bench_flatstr_iter(nb_cct: Int, loops: Int, strlen: Int)
 do
        var a = "a" * strlen
@@ -113,7 +80,7 @@ do
 end
 
 var opts = new OptionContext
-var mode = new OptionEnum(["rope", "flatstr", "flatbuf"], "Mode", -1, "-m")
+var mode = new OptionEnum(["flatstr", "flatbuf"], "Mode", -1, "-m")
 var access_mode = new OptionEnum(["iterator", "index"], "Iteration mode", -1, "--iter-mode")
 var nb_ccts = new OptionInt("Number of concatenations done to the string (in the case of the rope, this will increase its depth)", -1, "--ccts")
 var loops = new OptionInt("Number of loops to be done", -1, "--loops")
@@ -132,15 +99,6 @@ var iterval = access_mode.value
 
 if modval == 0 then
        if iterval == 0 then
-               bench_rope_iter(nb_ccts.value, loops.value, strlen.value)
-       else if iterval == 1 then
-               bench_rope_index(nb_ccts.value, loops.value, strlen.value)
-       else
-               opts.usage
-               exit(-1)
-       end
-else if modval == 1 then
-       if iterval == 0 then
                bench_flatstr_iter(nb_ccts.value, loops.value, strlen.value)
        else if iterval == 1 then
                bench_flatstr_index(nb_ccts.value, loops.value, strlen.value)
@@ -148,7 +106,7 @@ else if modval == 1 then
                opts.usage
                exit(-1)
        end
-else if modval == 2 then
+else if modval == 1 then
        if iterval == 0 then
                bench_flatbuf_iter(nb_ccts.value, loops.value, strlen.value)
        else if iterval == 1 then
index 5021e66..effb9ec 100644 (file)
@@ -13,18 +13,6 @@ module substr_bench
 
 import opts
 
-fun bench_rope(nb_cct: Int, loops: Int, strlen: Int)
-do
-       var a = "a" * strlen
-       var x:String = new RopeString.from(a)
-       for i in [0 .. nb_cct] do x += a
-       var cnt = 0
-       while cnt != loops do
-               x.substring(0,5)
-               cnt += 1
-       end
-end
-
 fun bench_flatstr(nb_cct: Int, loops: Int, strlen: Int)
 do
        var a = "a" * strlen
@@ -50,7 +38,7 @@ do
 end
 
 var opts = new OptionContext
-var mode = new OptionEnum(["rope", "flatstr", "flatbuf"], "Mode", -1, "-m")
+var mode = new OptionEnum(["flatstr", "flatbuf"], "Mode", -1, "-m")
 var nb_ccts = new OptionInt("Number of concatenations done to the string (in the case of the rope, this will increase its depth)", -1, "--ccts")
 var loops = new OptionInt("Number of loops to be done", -1, "--loops")
 var strlen = new OptionInt("Length of the base string", -1, "--strlen")
@@ -66,10 +54,8 @@ end
 var modval = mode.value
 
 if modval == 0 then
-       bench_rope(nb_ccts.value, loops.value, strlen.value)
-else if modval == 1 then
        bench_flatstr(nb_ccts.value, loops.value, strlen.value)
-else if modval == 2 then
+else if modval == 1 then
        bench_flatbuf(nb_ccts.value, loops.value, strlen.value)
 else
        opts.usage
diff --git a/lib/buffered_ropes.nit b/lib/buffered_ropes.nit
new file mode 100644 (file)
index 0000000..b287871
--- /dev/null
@@ -0,0 +1,353 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# This file is free software, which comes along with NIT.  This software is
+# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
+# PARTICULAR PURPOSE.  You can modify it is you want,  provided this header
+# is kept unaltered, and a notification of the changes is added.
+# You  are  allowed  to  redistribute it and sell it, alone or is a part of
+# another product.
+
+# Ropes with a special kind of Leaves that act similar to a `Buffer`
+#
+# When using this module, re-allocations are limited by the introduction
+# of a larger-than-necessary buffered area for the native part of a `String`
+# in an append-only fashion.
+#
+# Concretely, when concatenating two small strings of length `n` + `m` < `maxlen`
+# What happens is that a `maxlen` byte buffer is allocated, ready to receive more
+# bytes a posteriori without necessarily reallocating a new byte array.
+#
+# Theoretically, this should lower the number of concatenations
+# and reallocations when concatenating `String` objects.
+module buffered_ropes
+
+intrude import standard::ropes
+
+# Hidden buffer, used to simulate a `FlatBuffer` on a short string.
+#
+# This is to be used by low-level APIs because of its lack of
+# safety, if you use it, make sure you know what you are doing !
+#
+# Practically, it is the underlying representation of a `Leaf` in
+# the `Rope` block, its advantage is that it saves a bit more space
+# for future concatenations, without risking to overwrite previously
+# used space, making it suitable for Strings.
+#
+# Note for future use : Should there be parallel capacity in Nit at
+# some point, this is NOT thread safe !
+private class ManualBuffer
+       var ns: NativeString is noinit
+       # Current position in the `NativeString`
+       #
+       # It is used by the clients of `ManualBuffer` as a guard
+       # to detect if the concatenation in the `ManualBuffer`
+       # is safe or not.
+       #
+       # i.e. :
+       # Say we have two strings `x` and `y` referencing the
+       # same `ManualBuffer` `b`, `y` is the concatenation of
+       # `x` and another string.
+       #
+       # If we try to concatenate a `String` `z` to `x`, a new
+       # `ManualBuffer` will be created since `pos` and `x.length`
+       # do not match.
+       #
+       # However, if we concatenate the same `String` to `y`,
+       # the contents of `z` will be copied to the `ManualBuffer`.
+       var pos = 0
+
+       init do ns = new NativeString(maxlen)
+
+       fun [](i: Int): Char do return ns[i]
+end
+
+# Simple implementation of the iterator on Substrings for `Leaf`
+#
+# Basically just returns `self` encapsulated in a `FlatString`.
+private class LeafSubstrings
+       super IndexedIterator[Text]
+
+       var str: String
+       var avail = true
+
+       init(l: Leaf) do str = new FlatString.with_infos(l.buf.ns, l.length, 0, l.length - 1)
+
+       redef fun is_ok do return avail
+
+       redef fun next do avail = false
+
+       redef fun index do return 0
+
+       redef fun item do return str
+end
+
+# Leaf of a `Rope`, used as a buffered area for speedy concatenation.
+private class Leaf
+       super RopeString
+
+       private var buf: ManualBuffer
+       private var bns: NativeString is noinit
+       redef var length: Int is noinit
+
+       redef fun empty do return new Leaf(new ManualBuffer)
+
+       redef fun to_cstring do
+               var len = length
+               var ns = new NativeString(len + 1)
+               ns[len] = '\0'
+               buf.ns.copy_to(ns, len, 0, 0)
+               return ns
+       end
+
+       redef fun substrings do return new LeafSubstrings(self)
+
+       redef fun [](i) do return buf[i]
+
+       init do
+               bns = buf.ns
+               length = buf.pos
+       end
+
+       redef fun output do new FlatString.with_infos(buf.ns, length, 0, length - 1).output
+
+       redef fun to_upper do
+               var x = new ManualBuffer
+               var nns = x.ns
+               var ns = bns
+               var mlen = length
+               for i in [0..mlen[ do
+                       nns[i] = ns[i].to_upper
+               end
+               x.pos = mlen - 1
+               return new Leaf(x)
+       end
+
+       redef fun to_lower do
+               var x = new ManualBuffer
+               var nns = x.ns
+               var ns = bns
+               var mlen = length
+               for i in [0..mlen[ do
+                       nns[i] = ns[i].to_lower
+               end
+               x.pos = mlen - 1
+               return new Leaf(x)
+       end
+
+       redef fun reversed do
+               var x = new ManualBuffer
+               var nns = x.ns
+               var ns = bns
+               var mlen = length
+               var j = mlen - 1
+               for i in [0 .. mlen[ do
+                       nns[j] = ns[i]
+                       j -= 1
+               end
+               x.pos = mlen - 1
+               return new Leaf(x)
+       end
+
+       redef fun substring(from, len) do
+               return new FlatString.with_infos(buf.ns, len, from, from + len - 1)
+       end
+
+       redef fun insert_at(s, pos) do
+               var l = substring(0, pos)
+               var r = substring_from(pos)
+               return l + s + r
+       end
+
+       redef fun +(o) do
+               var s = o.to_s
+               var slen = s.length
+               var mlen = length
+               if slen == 0 then return self
+               if mlen == 0 then return s
+               var nlen = mlen + slen
+               if nlen > maxlen then return new Concat(self, s)
+               if s isa FlatString then
+                       var bpos = buf.pos
+                       var sits = s.items
+                       if bpos == mlen then
+                               sits.copy_to(buf.ns, slen, s.index_from, bpos)
+                               buf.pos = bpos + slen
+                               return new Leaf(buf)
+                       else
+                               var b = new ManualBuffer
+                               var nbns = b.ns
+                               bns.copy_to(nbns, mlen, 0, 0)
+                               sits.copy_to(nbns, slen, s.index_from, mlen)
+                               b.pos = nlen
+                               return new Leaf(b)
+                       end
+               else if s isa Leaf then
+                       var bpos = buf.pos
+                       var sbns = s.bns
+                       if bpos == mlen then
+                               sbns.copy_to(bns, slen, 0, bpos)
+                               buf.pos += slen
+                               return new Leaf(buf)
+                       else
+                               var b = new ManualBuffer
+                               var nbns = b.ns
+                               bns.copy_to(nbns, mlen, 0, 0)
+                               sbns.copy_to(nbns, slen, 0, mlen)
+                               b.pos = nlen
+                               return new Leaf(b)
+                       end
+               else if s isa Concat then
+                       if not s.left isa Concat then
+                               return new Concat(self + s.left, s.right)
+                       end
+                       return new Concat(self, s)
+               else
+                       var bpos = buf.pos
+                       var b = buf
+                       if bpos != mlen then
+                               b = new ManualBuffer
+                               bns.copy_to(b.ns, mlen, 0, 0)
+                       end
+                       for i in s.chars do
+                               bns[bpos] = i
+                               bpos += 1
+                       end
+                       return new Leaf(b)
+               end
+       end
+end
+
+redef class Concat
+       redef fun to_cstring do
+               var len = length
+               var ns = new NativeString(len + 1)
+               ns[len] = '\0'
+               var off = 0
+               for i in substrings do
+                       var ilen = i.length
+                       if i isa FlatString then
+                               i.items.copy_to(ns, ilen, i.index_from, off)
+                       else if i isa Leaf then
+                               i.buf.ns.copy_to(ns, ilen, 0, off)
+                       else
+                               abort
+                       end
+                       off += ilen
+               end
+               return ns
+       end
+
+       redef fun +(o) do
+               var s = o.to_s
+               var mlen = length
+               var slen = s.length
+               if s isa FlatString then
+                       var r = right
+                       var rlen = r.length
+                       if rlen + slen > maxlen then return new Concat(left, new Concat(r, s))
+                       return new Concat(left, r + s)
+               else if s isa Concat then
+                       return new Concat(self, s)
+               else if s isa Leaf then
+                       var r = right
+                       var rlen = r.length
+                       if rlen + slen > maxlen then return new Concat(left, new Concat(r, s))
+                       return new Concat(left, r + s)
+               else
+                       abort
+               end
+       end
+end
+
+redef class FlatString
+       redef fun +(o) do
+               var s = o.to_s
+               var slen = s.length
+               var mlen = length
+               if slen == 0 then return self
+               if mlen == 0 then return s
+               if s isa FlatString then
+                       if slen + mlen > maxlen then return new Concat(self, s)
+                       var mits = items
+                       var sifrom = s.index_from
+                       var mifrom = index_from
+                       var sits = s.items
+                       var b = new ManualBuffer
+                       var bns = b.ns
+                       mits.copy_to(bns, mlen, mifrom, 0)
+                       sits.copy_to(bns, slen, sifrom, mlen)
+                       b.pos = mlen + slen
+                       return new Leaf(b)
+               else if s isa Concat then
+                       var sl = s.left
+                       var sllen = sl.length
+                       if sllen + mlen > maxlen then return new Concat(self, s)
+                       return new Concat(sl + self, s.right)
+               else if s isa Leaf then
+                       if slen + mlen > maxlen then return new Concat(self, s)
+                       var mits = items
+                       var mifrom = index_from
+                       var sb = s.buf
+                       var b = new ManualBuffer
+                       var bns = b.ns
+                       items.copy_to(bns, mlen, mifrom, 0)
+                       sb.ns.copy_to(bns, slen, 0, mlen)
+                       b.pos = mlen + slen
+                       return new Leaf(b)
+               else
+                       abort
+               end
+       end
+end
+
+redef class Array[E]
+
+       # Fast implementation
+       redef fun to_s do
+               var l = length
+               if l == 0 then return ""
+               if l == 1 then if self[0] == null then return "" else return self[0].to_s
+               var its = _items
+               var na = new NativeArray[String](l)
+               var i = 0
+               var sl = 0
+               var mypos = 0
+               while i < l do
+                       var itsi = its[i]
+                       if itsi == null then
+                               i += 1
+                               continue
+                       end
+                       var tmp = itsi.to_s
+                       sl += tmp.length
+                       na[mypos] = tmp
+                       i += 1
+                       mypos += 1
+               end
+               var ns = new NativeString(sl + 1)
+               ns[sl] = '\0'
+               i = 0
+               var off = 0
+               while i < mypos do
+                       var tmp = na[i]
+                       var tpl = tmp.length
+                       if tmp isa FlatString then
+                               tmp.items.copy_to(ns, tpl, tmp.index_from, off)
+                               off += tpl
+                       else
+                               for j in tmp.substrings do
+                                       var slen = j.length
+                                       if j isa FlatString then
+                                               j.items.copy_to(ns, slen, j.index_from, off)
+                                       else if j isa Leaf then
+                                               j.buf.ns.copy_to(ns, slen, 0, off)
+                                       end
+                                       off += slen
+                               end
+                       end
+                       i += 1
+               end
+               return ns.to_s_with_length(sl)
+       end
+end
diff --git a/lib/bufferized_ropes.nit b/lib/bufferized_ropes.nit
deleted file mode 100644 (file)
index 18cfa4c..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-# This file is part of NIT ( http://www.nitlanguage.org ).
-#
-# This file is free software, which comes along with NIT.  This software is
-# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
-# PARTICULAR PURPOSE.  You can modify it if you want,  provided this header
-# is kept unaltered, and a notification of the changes is added.
-# You  are  allowed  to  redistribute it and sell it, alone or as a part of
-# another product.
-
-# Introduces ropes with buffered leaves
-module bufferized_ropes
-
-import standard
-intrude import standard::ropes
-
-# Leaf containing a FlatBuffer to optimize concatenation operations
-private class BufferLeaf
-       super Leaf
-
-       init(val: FlatBuffer) do
-               self.str = val
-               length = str.length
-       end
-
-end
-
-redef class Concat
-       redef fun to_leaf
-       do
-               if left == null then
-                       if right == null then return new StringLeaf("".as(FlatString))
-                       return right.to_leaf
-               end
-               if right == null then return left.as(not null).to_leaf
-               if left.length + right.length < buf_len then
-                       var b = new FlatBuffer.with_capacity(buf_len)
-                       b.append(left.to_leaf.str)
-                       b.append(right.to_leaf.str)
-                       return new BufferLeaf(b)
-               else
-                       var b = new FlatBuffer.with_capacity(left.length + right.length)
-                       b.append(left.to_leaf.str)
-                       b.append(right.to_leaf.str)
-                       return new StringLeaf(b.lazy_to_s(b.length))
-               end
-       end
-end
-
-redef class FlatText
-
-       # Creates a substring, only without any copy overhead for Buffers
-       # The call to lazy_substring ensures the creation of a FlatString, which is required for Leaves.
-       private fun lazy_substring(from: Int, length: Int): FlatString is abstract
-
-       # Same as substring_from, but without copy of the data for Buffers.
-       private fun lazy_substring_from(from: Int): FlatString is abstract
-end
-
-redef class FlatBuffer
-
-       # Same as to_s, only will not copy self before returning a String.
-       private fun lazy_to_s(len: Int): FlatString
-       do
-               return new FlatString.with_infos(items, len, 0, length - 1)
-       end
-
-       redef fun lazy_substring(from,length)
-       do
-               return new FlatString.with_infos(items, length, from, from + length - 1)
-       end
-
-       redef fun lazy_substring_from(from)
-       do
-               var newlen = length - from
-               return new FlatString.with_infos(items, newlen, from, from + newlen - 1)
-       end
-
-end
-
-redef class FlatString
-
-       redef fun lazy_substring(from, len) do return substring(from,len).as(FlatString)
-
-       redef fun lazy_substring_from(from) do return substring_from(from).as(FlatString)
-
-end
-
-redef class Rope
-
-       # Empty Rope
-       init do root = new BufferLeaf(new FlatBuffer.with_capacity(buf_len))
-
-end
-
-redef class RopeString
-
-       init from(s: String) do
-               if s.length < buf_len then
-                       var b = new FlatBuffer.with_capacity(buf_len)
-                       b.append(s)
-                       root = new BufferLeaf(b)
-               else
-                       if s isa RopeString then root = s.root else root = new StringLeaf(s.as(FlatString))
-               end
-       end
-
-       redef fun +(o) do return insert_at(o.to_s, length)
-
-       # Inserts a String `str` at position `pos`
-       redef fun insert_at(str, pos)
-       do
-               if str.length == 0 then return self
-
-               assert pos >= 0 and pos <= length
-
-               if pos == length then
-                       var r = root
-                       if r isa BufferLeaf then
-                               var b = r.str.as(FlatBuffer)
-                               if r.length + str.length < b.capacity then
-                                       b.append(str)
-                                       return new RopeString.from_root(new BufferLeaf(b))
-                               end
-                       end
-               end
-
-               var path = node_at(pos)
-
-               var cct: RopeNode
-
-               if path.offset == path.leaf.length then
-                       cct = build_node_len_offset(path, str)
-               else if path.offset == 0 then
-                       cct = build_node_zero_offset(path, str)
-               else
-                       cct = build_node_other(path,str)
-               end
-
-               if path.stack.is_empty then return new RopeString.from_root(cct)
-
-               var tmp = path.stack.pop
-               var last_concat: Concat
-
-               if tmp.left then
-                       last_concat = new Concat(cct,tmp.node.right.as(not null))
-               else
-                       last_concat = new Concat(tmp.node.left.as(not null), cct)
-               end
-
-               for i in path.stack.reverse_iterator do
-                       var nod: Concat
-                       if i.left then
-                               nod = new Concat(last_concat, i.node.right.as(not null))
-                       else
-                               nod = new Concat(i.node.left.as(not null), last_concat)
-                       end
-                       last_concat = nod
-               end
-
-               return new RopeString.from_root(last_concat)
-       end
-
-       redef fun substring(pos, len)
-       do
-               if pos < 0 then
-                       len += pos
-                       pos = 0
-               end
-
-               if pos + len > length then len = length - pos
-
-               if len <= 0 then return new RopeString
-
-               var path = node_at(pos)
-
-               var lf = path.leaf
-               var offset = path.offset
-
-               var s: FlatString
-               if lf isa StringLeaf then
-                       s = lf.str.as(FlatString)
-               else
-                       s = lf.str.as(FlatBuffer).lazy_to_s(lf.length)
-               end
-
-               if path.leaf.str.length - offset > len then
-                       lf = new StringLeaf(s.substring(offset,len).as(FlatString))
-               else
-                       lf = new StringLeaf(s.substring_from(offset).as(FlatString))
-               end
-
-               var nod: RopeNode = lf
-
-               if lf.length == len then return new RopeString.from_root(lf)
-
-               var lft: nullable RopeNode
-               var rht: nullable RopeNode
-
-               for i in path.stack.reverse_iterator do
-                       if i.right then continue
-                       lft = nod
-                       rht = i.node.right
-                       nod = new Concat(lft, rht)
-               end
-
-               var ret = new RopeString
-               ret.root = nod
-
-               path = ret.node_at(len-1)
-
-               offset = path.offset
-
-               lf = path.leaf
-
-               if lf isa StringLeaf then
-                       s = lf.str.as(FlatString)
-               else
-                       s = lf.str.as(FlatBuffer).lazy_to_s(lf.length)
-               end
-
-               nod = new StringLeaf(s.substring(0, offset+1).as(FlatString))
-
-               for i in path.stack.reverse_iterator do
-                       if i.left then continue
-                       rht = nod
-                       lft = i.node.left
-                       nod = new Concat(lft, rht)
-               end
-
-               ret.root = nod
-
-               return ret
-       end
-
-       private fun build_node_zero_offset(path: Path, s: String): RopeNode
-       do
-               var finlen = path.leaf.length + s.length
-               if finlen <= buf_len then
-                       var b = new FlatBuffer.with_capacity(buf_len)
-                       b.append(s)
-                       b.append(path.leaf.str)
-                       if finlen == buf_len then return new StringLeaf(b.lazy_to_s(finlen))
-                       return new BufferLeaf(b)
-               end
-               var rht = path.leaf
-               var lft: RopeNode
-               if s isa FlatString then
-                       if s.length > buf_len then
-                               lft = new StringLeaf(s)
-                       else
-                               var b = new FlatBuffer
-                               b.append(s)
-                               lft = new BufferLeaf(b)
-                       end
-               else
-                       lft = s.as(RopeString).root
-               end
-               return new Concat(lft, rht)
-       end
-
-       private fun build_node_len_offset(path: Path, s: String): RopeNode
-       do
-               var leaf = path.leaf
-               if leaf isa BufferLeaf then
-                       if s.length > buf_len then
-                               if s isa FlatString then
-                                       return new Concat(leaf, new StringLeaf(s))
-                               else
-                                       return new Concat(leaf, s.as(Rope).root)
-                               end
-                       end
-                       var finlen = leaf.length + s.length
-                       var buf = leaf.str.as(FlatBuffer)
-                       var cap = buf.capacity
-                       # Meaning the buffer was modified elsewhere
-                       # Therefore, we create a new one
-                       if leaf.length != buf.length then
-                               var b = new FlatBuffer.with_capacity(buf_len)
-                               b.append(buf.lazy_to_s(leaf.length))
-                               buf = b
-                       end
-                       if finlen <= cap then
-                               buf.append(s)
-                               if finlen == buf_len then return new StringLeaf(buf.lazy_to_s(finlen))
-                               return new BufferLeaf(buf)
-                       else
-                               var l_len = finlen - cap
-                               buf.append(s.substring(0,l_len))
-                               var b2 = new FlatBuffer.with_capacity(buf_len)
-                               b2.append(s.substring_from(l_len))
-                               var left_leaf = new StringLeaf(buf.lazy_to_s(buf.length))
-                               var right_leaf = new BufferLeaf(b2)
-                               var cct = new Concat(left_leaf, right_leaf)
-                               return cct
-                       end
-               else
-                       var lft = leaf
-                       var rht: RopeNode
-                       if s.length >= buf_len then
-                               if s isa FlatString then rht = new StringLeaf(s) else rht = s.as(Rope).root
-                       else
-                               var buf = new FlatBuffer.with_capacity(buf_len)
-                               buf.append(s)
-                               rht = new BufferLeaf(buf)
-                       end
-                       return new Concat(lft,rht)
-               end
-       end
-
-       private fun build_node_other(path: Path,str: String): RopeNode
-       do
-               var lf = path.leaf
-               var s: FlatString
-               if lf isa BufferLeaf then
-                       var b = lf.str.as(FlatBuffer)
-                       s = b.lazy_to_s(lf.length)
-               else
-                       s = lf.str.as(FlatString)
-               end
-               var l_str = s.lazy_substring(0, path.offset)
-               var r_str = s.lazy_substring_from(path.offset)
-               if s.length + str.length < buf_len then
-                       var buf = new FlatBuffer.with_capacity(buf_len)
-                       buf.append(l_str)
-                       buf.append(str)
-                       buf.append(r_str)
-                       return new BufferLeaf(buf)
-               end
-               var child: RopeNode
-               if str isa FlatString then child = new StringLeaf(str) else child = str.as(Rope).root
-               var l_cct = new Concat(new StringLeaf(l_str), child)
-               var r_cct = new Concat(l_cct, new StringLeaf(r_str))
-               return r_cct
-       end
-
-end
-
-redef class SubstringsIterator
-
-       # Compute the bounds of the current substring and makes the substring
-       redef fun make_substring
-       do
-               var l = nodes.item
-               var s = l.str
-               var min = 0
-               var length = l.length
-               if nodes.index < pos then
-                       min = pos - nodes.index
-               end
-               substring = s.lazy_substring(min, length)
-       end
-
-end
-
-redef class ReverseSubstringsIterator
-
-       redef fun make_substring
-       do
-               var l = leaves.item
-               var s = l.str
-               if pos > (leaves.index + l.length - 1) then return
-               str = s.lazy_substring(0, (pos - leaves.index + 1))
-       end
-
-end
-
-# Default size of a buffer in a rope leaf.
-fun buf_len: Int do return 200
-
index a122a02..da40da1 100644 (file)
 # Exposes methods for debugging ropes when needed.
 module ropes_debug
 
-intrude import ::standard::ropes
-import ::standard
+import standard
+intrude import standard::ropes
 
-redef class Rope
+redef class Text
        # Writes self as a dot file on the hard drive
-       fun to_dot(filepath: String): String is abstract
-end
+       private fun internal_to_dot: String is abstract
 
-redef class RopeNode
-       # Generates a dot string
-       fun to_dot(s: String): String is abstract
+       fun to_dot: String do
+               return "digraph g \{\n" + internal_to_dot + "\}\n"
+       end
 end
 
-redef class Leaf
-       redef fun to_dot(s): String
+redef class Concat
+       redef fun internal_to_dot: String
        do
-               s += "n{object_id} [label = \"{str}\" shape = rect];\n"
-               s += "n{str.object_id} -> n{object_id} [label = \"contains\"];\n"
-               s = str.to_dot(s)
+               var s = "n{object_id} [label = {length}];\n"
+               s += "n{object_id} -> n{left.object_id} [label = \"left\"];\n"
+               s += left.internal_to_dot
+               s += "n{object_id} -> n{right.object_id} [label = \"right\"];\n"
+               s += right.internal_to_dot
                return s
        end
 end
 
-redef class Concat
-       redef fun to_dot(s): String
+redef class RopeBuffer
+       redef fun internal_to_dot: String
        do
-               s += "n{object_id} [label = {length}];\n"
-               if left != null then
-                       s += "n{object_id} -> n{left.object_id} [label = \"left\"];\n"
-                       s = left.to_dot(s)
-               end
-               if right != null then
-                       s += "n{object_id} -> n{right.object_id} [label = \"right\"];\n"
-                       s = right.to_dot(s)
-               end
+               var s = "n{object_id} [label = {length}];\n"
+               s += "n{object_id} -> n{str.object_id} [label = \"str\"];\n"
+               s += str.internal_to_dot
+               s += "n{object_id} -> n{ns.object_id} [label = \"ns\"];\n"
+               s += "n{ns.object_id}[label = \"NativeString\", content=\"{ns.to_s_with_length(rpos)}\"];\n"
                return s
        end
 end
 
-redef class FlatText
-       fun to_dot(s: String): String is abstract
-end
-
 redef class FlatString
-       redef fun to_dot(s: String): String
+       redef fun internal_to_dot: String
        do
-               return s + "n{object_id} [label=\"FlatString\\nindex_from = {index_from}\\nindex_to = {index_to}\\nNativeString = {items.to_s_with_length(items.cstring_length)}\"];\n"
+               return "n{object_id} [label=\"FlatString\\nindex_from = {index_from}\\nindex_to = {index_to}\\nNativeString = {items.to_s_with_length(items.cstring_length)}\"];\n"
        end
 end
 
 redef class FlatBuffer
-       redef fun to_dot(s: String): String
+       redef fun internal_to_dot: String
        do
-               return s + "n{object_id} [label=\"FlatBuffer\\length = {length}\\ncapacity = {capacity}\\nitems = {items.to_s_with_length(items.cstring_length)}\"];\n"
+               return "n{object_id} [label=\"FlatBuffer\\length = {length}\\ncapacity = {capacity}\\nitems = {items.to_s_with_length(items.cstring_length)}\"];\n"
        end
 end
 
-redef class RopeString
-       redef fun to_dot(filepath: String)
-       do
-               var of = new OFStream.open(filepath)
-               var ret: String = new RopeString.from("digraph g \{\n")
-               ret = root.to_dot(ret).as(RopeString)
-               ret += "\}\n"
-               ret.write_to(of)
-               of.close
-               return ret
-       end
-end
-
-
diff --git a/lib/splay_ropes.nit b/lib/splay_ropes.nit
deleted file mode 100644 (file)
index e167ce7..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-# This file is part of NIT ( http://www.nitlanguage.org ).
-#
-# This file is free software, which comes along with NIT.  This software is
-# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
-# PARTICULAR PURPOSE.  You can modify it is you want,  provided this header
-# is kept unaltered, and a notification of the changes is added.
-# You  are  allowed  to  redistribute it and sell it, alone or is a part of
-# another product.
-
-# Introduces a self-balancing method on Rope, using a Splay Tree
-module splay_ropes
-
-import standard
-intrude import standard::ropes
-
-redef class Rope
-
-       # Performs a Left rotation on node `x`
-       # Since a Rope does not have any notion of parent in its node, they need to be passed as arguments if available.
-       private fun left_rotate(r: Concat): Concat
-       do
-               var rr = r.right.as(Concat)
-               var rl = r.left
-               var pl = rr.left
-               var pr = rr.right
-               var nr = new Concat(rl, pl)
-               var np = new Concat(nr, pr)
-               return np
-       end
-
-       # Performs a Right rotation on node `r`
-       # Since a Rope does not have any notion of parent in its node, they need to be passed as arguments if available.
-       private fun right_rotate(r: Concat): Concat
-       do
-               var rl = r.left.as(Concat)
-               var rr = r.right
-               var pr = rl.right
-               var pl = rl.left
-               var nr = new Concat(pr, rr)
-               var np = new Concat(pl, nr)
-               return np
-       end
-
-       # Performs a Splay operation on a complete path
-       # The last node of the path will become the root.
-       private fun splay(path: Path): nullable Concat
-       do
-               var st = path.stack
-               if st.is_empty then return null
-               var cct = st.pop.node
-               while not st.is_empty do
-                       var tmp = st.pop
-                       var nod: Concat
-                       if tmp.left then
-                               nod = new Concat(cct, tmp.node.right)
-                               cct = right_rotate(nod)
-                       else
-                               nod = new Concat(tmp.node.left, cct)
-                               cct = left_rotate(nod)
-                       end
-               end
-               return cct
-       end
-end
-
-redef class RopeString
-
-       # Inserts a String `str` at position `pos`
-       redef fun insert_at(str, pos)
-       do
-               if str.length == 0 then return self
-               if self.length == 0 then return new RopeString.from(str)
-
-               assert pos >= 0 and pos <= length
-
-               var path = node_at(pos)
-
-               var last_concat: Concat
-
-               if path.offset == 0 then
-                       if str isa FlatString then
-                               last_concat = new Concat(new StringLeaf(str), path.leaf)
-                       else
-                               last_concat = new Concat(str.as(RopeString).root, path.leaf)
-                       end
-               else if path.offset == path.leaf.length then
-                       if str isa FlatString then
-                               last_concat = new Concat(path.leaf, new StringLeaf(str))
-                       else
-                               last_concat = new Concat(path.leaf, str.as(RopeString).root)
-                       end
-               else
-                       var s = path.leaf.str
-                       var l_half = s.substring(0, s.length - path.offset)
-                       var r_half = s.substring_from(s.length - path.offset)
-                       var cct: Concat
-                       var ll = new StringLeaf(l_half.as(FlatString))
-                       if str isa FlatString then
-                               cct = new Concat(ll, new StringLeaf(str))
-                       else
-                               cct = new Concat(ll, str.as(RopeString).root)
-                       end
-                       last_concat = new Concat(cct, new StringLeaf(r_half.as(FlatString)))
-               end
-
-               var st = path.stack
-
-               if st.is_empty then return new RopeString.from_root(last_concat)
-
-               var tmp = st.pop
-
-               if tmp.left then
-                       var n = tmp.node.right
-                       var r = new Concat(last_concat, n)
-                       st.push(new PathElement(r))
-               else
-                       var n = tmp.node.left
-                       var r = new Concat(n, last_concat)
-                       st.push(new PathElement(r))
-               end
-
-               return new RopeString.from_root(splay(path).as(not null))
-       end
-
-end
-
index ad97500..c4915fd 100644 (file)
-# This file is part of NIT ( http://www.nitlanguage.org ).
+# This file is part of NIT (http://www.nitlanguage.org).
 #
-# This file is free software, which comes along with NIT.  This software is
-# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
-# PARTICULAR PURPOSE.  You can modify it if you want,  provided this header
-# is kept unaltered, and a notification of the changes is added.
-# You  are  allowed  to  redistribute it and sell it, alone or as a part of
-# another product.
-
-# Nit implementation of the Ropes (see Ropes : An Alternative to Strings,
-# SOFTWARE - PRACTICE AND EXPERIENCE, VOL. 25(12), 1315 - 1330 (DECEMBER 1995)
-# Hans. J Boehm, Russ Atkinson and Michael Plass)
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
 #
-# A rope is a kind of string but instead of being flat, it relies on a binary tree structure to store data.
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Tree-based representation of a String.
+#
+# Ropes are a data structure introduced in a 1995 paper from
+# Hans J. Boehm, Russ Atkinson and Michael Plass.
+# See : `Ropes : an Alternative to Strings`, `Software - Practice and Experience,
+# Vol. 25(12), 1315-1330 (December 1995)`.
+#
+# The implementation developed here provides an automatic change
+# of data structure depending on the length of the leaves.
+#
+# The length from which a `Rope` is built from a `flat` string
+# if defined at top-level (see `maxlen`) and can be redefined by clients
+# depending on their needs (e.g. if you need to bench the speed of
+# the creation of concat nodes, lower the size of maxlen).
+#
+# A Rope as defined in the original paper is a Tree made of concatenation
+# nodes and containing `Flat` (that is Array-based) strings as Leaves.
+#
+# Example :
+#
+# `            Concat                   `
+# `          /        \                 `
+# `    Concat          Concat           `
+# `   /      \        /      \          `
+# `"My"     " Name"  " is"   " Simon."  `
+#
+# Note that the above example is not representative of the actual implementation
+# of `Ropes`, since short leaves are merged to keep the rope at an acceptable
+# height (hence, this rope here might actually be a `FlatString` !).
 module ropes
 
 intrude import string
 
-# Used when searching for a particular node
-# Returns the path to the node from the root of the rope
-# Also, the node and the offset for seeked position in the rope
-private class Path
-       # Leaf found
-       var leaf: Leaf
-       # Offset in leaf
-       var offset: Int
-       # Stack of the nodes traversed, and the path used
-       var stack: List[PathElement]
-end
+# Maxlen is the maximum length of a Leaf node
+#
+# When concatenating two leaves, if `new_length` > `maxlen`,
+# A `Concat` node is created instead
+#
+# Its purpose is to limit the depth of the `Rope` (this
+# improves performance when accessing/iterating).
+fun maxlen: Int do return 64
 
-# An element for a Path, has the concat node and whether or not
-# left or right child was visited.
-private class PathElement
-       # Visited node
-       var node: Concat
-       # Was the left child visited ?
-       var left = false
-       # Was the right child visited ?
-       var right = false
+# String using a tree-based representation with leaves as `FlatStrings`
+private abstract class Rope
+       super Text
 end
 
-# A node for a Rope
-private abstract class RopeNode
-       # Length of the node
-       var length = 0
+private abstract class RopeString
+       super Rope
+       super String
 
-       # Transforms the current node to a Leaf.
-       # This might be costly to invoke since this produces a FlatString concatenation.
-       # Can be used internally to limit the growth of the Rope when working with small leaves.
-       fun to_leaf: Leaf is abstract
+       redef fun chars is cached do return new RopeChars(self)
 end
 
-# Node that represents a concatenation between two nodes (of any RopeNode type)
+# Node that represents a concatenation between two `String`
 private class Concat
-       super RopeNode
+       super RopeString
+
+       redef var length: Int
+
+       redef fun substrings do return new RopeSubstrings(self)
+
+       redef fun empty do return ""
+
+       redef fun to_cstring is cached do
+               var len = length
+               var ns = new NativeString(len + 1)
+               ns[len] = '\0'
+               var off = 0
+               for i in substrings do
+                       var ilen = i.length
+                       i.as(FlatString).items.copy_to(ns, ilen, i.as(FlatString).index_from, off)
+                       off += ilen
+               end
+               return ns
+       end
 
        # Left child of the node
-       var left: nullable RopeNode
+       var left: String
        # Right child of the node
-       var right: nullable RopeNode
+       var right: String
 
-       init(l: nullable RopeNode, r: nullable RopeNode)
-       do
+       init(l: String, r: String) do
                left = l
                right = r
-               if l != null then length += l.length
-               if r != null then length += r.length
+               length = l.length + r.length
        end
 
-       redef fun to_leaf
-       do
-               if left == null then
-                       if right == null then return new StringLeaf("".as(FlatString))
-                       return right.to_leaf
-               end
-               if right == null then return left.as(not null).to_leaf
-               return new StringLeaf((left.to_leaf.str.as(FlatString) + right.to_leaf.str.as(FlatString)).as(FlatString))
+       redef fun output do
+               left.output
+               right.output
        end
-end
-
-# Leaf of a Rope, contains a FlatString
-private abstract class Leaf
-       super RopeNode
-
-       # Encapsulated FlatString in the leaf node
-       var str: FlatText
-
-end
 
-private class StringLeaf
-       super Leaf
+       redef fun iterator do return new RopeIter(self)
 
-       init(val: FlatString) do
-               self.str = val
-               length = str.length
+       redef fun *(i) do
+               var x: String = self
+               for j in [1 .. i[ do x += self
+               return x
        end
 
-       redef fun to_leaf do return self
-end
-
-# Used as a cache when using indexed access to a substring in the Rope
-private class LeafCache
-       # Cached leaf
-       var leaf: Leaf
-       # Position in Rope
-       var pos: Int
-end
-
-# Basic structure, binary tree with a root node.
-#
-# Also shared services by subsequent implementations.
-abstract class Rope
-       super Text
-
-       # Root node, entry point of a Rope.
-       private var root: RopeNode is noinit
-
-       # Cached version of self as a flat String
-       private var str_representation: nullable NativeString = null
-
-       private var leaf_cache: nullable LeafCache = null
-
-       # Empty Rope
-       init do root = new StringLeaf("".as(FlatString))
-
-       # Creates a new Rope with `s` as root
-       init from(s: String) do
-               if s isa RopeString then root = s.root else root = new StringLeaf(s.as(FlatString))
+       redef fun [](i) do
+               var llen = left.length
+               if i >= llen then return right[i - llen]
+               return left[i]
        end
 
-       private init from_root(r: RopeNode)
-       do
-               root = r
+       redef fun substring(from, len) do
+               var llen = left.length
+               if from < llen then
+                       if from + len < llen then return left.substring(from,len)
+                       var lsublen = llen - from
+                       return left.substring_from(from) + right.substring(0, len - lsublen)
+               else
+                       return right.substring(from - llen, len)
+               end
        end
 
-       redef fun length do return root.length
-
-       # Iterator on the nodes of the rope, in forward postfix order
-       private fun postfix(from: Int): Postfix do return new Postfix.from(self, from)
-
-       # Iterator on the leaves of the rope, forward order
-       private fun leaves(from: Int): LeavesIterator do return new LeavesIterator(self, from)
+       redef fun reversed do return new Concat(right.reversed, left.reversed)
 
-       # Iterator on the substrings from 0, in forward order
-       redef fun substrings do return new SubstringsIterator(self, 0)
-
-       # Iterator on the substrings, starting at position `from`, in forward order
-       fun substrings_from(from: Int): IndexedIterator[Text] do return new SubstringsIterator(self, from)
-
-       # Iterator on the nodes of the rope, in backwards postfix order
-       private fun reverse_postfix(from: Int): ReversePostfix do return new ReversePostfix.from(self, from)
-
-       # Iterator on the leaves of the rope, backwards order
-       private fun reverse_leaves(from: Int): ReverseLeavesIterator do return new ReverseLeavesIterator(self,from)
+       redef fun insert_at(s, pos) do
+               if pos > left.length then
+                       return left + right.insert_at(s, pos - left.length)
+               end
+               return left.insert_at(s, pos) + right
+       end
 
-       # Iterator on the substrings, in reverse order
-       fun reverse_substrings: IndexedIterator[Text] do return new ReverseSubstringsIterator(self, length-1)
+       redef fun to_upper do return new Concat(left.to_upper, right.to_upper)
 
-       # Iterator on the substrings, in reverse order, starting iteration at position `from`
-       fun reverse_substrings_from(from: Int): IndexedIterator[Text] do return new ReverseSubstringsIterator(self, from)
+       redef fun to_lower do return new Concat(left.to_lower, right.to_lower)
 
-       redef fun output
-       do
-               for i in substrings do
-                       i.output
+       redef fun +(o) do
+               var s = o.to_s
+               var mlen = length
+               var slen = s.length
+               if s isa Concat then
+                       return new Concat(self, s)
+               else
+                       var r = right
+                       var rlen = r.length
+                       if rlen + slen > maxlen then return new Concat(left, new Concat(r, s))
+                       return new Concat(left, r + s)
                end
        end
+end
 
-       redef fun to_cstring
-       do
-               if str_representation != null then return str_representation.as(not null)
+# Mutable `Rope`, optimized for concatenation operations
+#
+# A `RopeBuffer` is an efficient way of building a `String` when
+# concatenating small strings.
+#
+# It does concatenations in an optimized way by having a
+# mutable part and an immutable part built by efficiently
+# concatenating strings in chain.
+#
+# Every concatenation operation is done by copying a string to
+# the mutable part and flushing it when full.
+#
+# However, when a long string is appended to the `Buffer`,
+# the concatenation is done at it would be in a `Rope`.
+class RopeBuffer
+       super Rope
+       super Buffer
 
-               var native_final_str = calloc_string(length + 1)
+       redef fun chars: Sequence[Char] is cached do return new RopeBufferChars(self)
 
-               native_final_str[length] = '\0'
+       # The final string being built on the fly
+       private var str: String is noinit
 
-               if self.length == 0 then
-                       str_representation = native_final_str
-                       return native_final_str
-               end
+       # Current concatenation buffer
+       private var ns: NativeString is noinit
 
-               var offset = 0
+       # Next available (e.g. unset) character in the `Buffer`
+       private var rpos = 0
 
-               for i in substrings do
-                       var str = i.flatten
-                       if str isa FlatString then str.items.copy_to(native_final_str, str.length, str.index_from, offset)
-                       offset += i.length
-               end
+       # Keeps track of the buffer's currently dumped part
+       #
+       # This might happen if for instance, a String was being
+       # built by concatenating small parts of string and suddenly
+       # a long string (length > maxlen) is appended.
+       private var dumped: Int is noinit
 
-               str_representation = native_final_str
+       # Length of the complete rope
+       redef var length = 0
 
-               return native_final_str
-       end
+       # Length of the mutable part
+       #
+       # Is also used as base to compute the size of the next
+       # mutable native string (`ns`)
+       private var buf_size: Int is noinit
 
-       # Path to the Leaf for `position`
-       private fun node_at(position: Int): Path
-       do
-               assert position >= 0 and position <= length
-               if position == length then
-                       var st = new List[PathElement]
-                       stack_to_end(root,st)
-                       if not st.is_empty then
-                               var lst = st.last
-                               var lf = lst.node.right
-                               if lf != null then
-                                       return new Path(lf.as(Leaf), lf.length, st)
-                               else
-                                       lf = lst.node.left
-                                       return new Path(lf.as(Leaf), lf.length, st)
-                               end
-                       else
-                               return new Path(root.as(Leaf), length, st)
-                       end
-               end
-               return get_node_from(root, 0, position, new List[PathElement])
-       end
-
-       # Special case for when the required pos is length
-       private fun stack_to_end(nod: RopeNode, st: List[PathElement])
-       do
-               if nod isa Leaf then return
-               var n = nod.as(Concat)
-               var r = n.right
-               var ele = new PathElement(n)
-               ele.right = true
-               st.push(ele)
-               if r != null then
-                       stack_to_end(r, st)
-               end
-               return
-       end
+       redef fun substrings: Iterator[String] do return new RopeBufSubstringIterator(self)
 
-       # Builds the path to Leaf at position `seek_pos`
-       private fun get_node_from(node: RopeNode, curr_pos: Int, seek_pos: Int, stack: List[PathElement]): Path
-       do
-               assert curr_pos >= 0
-               if node isa Leaf then
-                       self.leaf_cache = new LeafCache(node, curr_pos)
-                       return new Path(node, seek_pos - curr_pos, stack)
-               end
-               node = node.as(Concat)
-
-               if node.left != null then
-                       var next_pos = curr_pos + node.left.length
-                       stack.add(new PathElement(node))
-                       if next_pos > seek_pos then
-                               stack.last.left = true
-                               return get_node_from(node.left.as(not null), curr_pos, seek_pos, stack)
-                       end
-                       stack.last.right = true
-                       return get_node_from(node.right.as(not null), next_pos, seek_pos, stack)
-               else
-                       var vis = new PathElement(node)
-                       vis.right = true
-                       stack.add(vis)
-                       return get_node_from(node.right.as(not null), curr_pos, seek_pos, stack)
-               end
+       # Builds an empty `RopeBuffer`
+       init do
+               str = ""
+               ns = new NativeString(maxlen)
+               buf_size = maxlen
+               dumped = 0
        end
 
-       redef fun ==(o)
-       do
-               if not o isa Text then return false
-               if o.length != self.length then return false
-               var oit = o.chars.iterator
-               for i in self.chars.iterator do
-                       if i != oit.item then return false
-                       oit.next
-               end
-               return true
+       # Builds a new `RopeBuffer` with `str` in it.
+       init from(str: String) do
+               self.str = str
+               ns = new NativeString(maxlen)
+               buf_size = maxlen
+               length = str.length
+               dumped = 0
        end
-end
 
-# Rope that cannot be modified
-class RopeString
-       super Rope
-       super String
+       # Resets the informations of the `Buffer`
+       #
+       # This is called when doing in-place modifications
+       # on a previously to_s'd `RopeBuffer`
+       private fun reset do
+               var nns = new NativeString(buf_size)
+               var blen = rpos - dumped
+               ns.copy_to(nns, blen, dumped, 0)
+               dumped = 0
+               rpos = blen
+               written = false
+       end
 
-       redef fun to_s do return self
+       redef fun empty do return new RopeBuffer
 
-       redef fun empty do return once new RopeString.from("")
+       redef fun clear do
+               str = ""
+               length = 0
+               rpos = 0
+       end
 
-       redef var chars: SequenceRead[Char] = new RopeStringChars(self)
+       redef fun substring(from, count) do
+               var strlen = str.length
 
-       redef fun reversed
-       do
-               var ret = empty
-               for i in substrings do
-                       ret = i.as(String).reversed + ret
+               if from < 0 then
+                       count += from
+                       if count < 0 then count = 0
+                       from = 0
                end
-               return ret
-       end
 
-       redef fun to_upper
-       do
-               var ret = empty
-               for i in substrings do
-                       ret += i.as(String).to_upper
-               end
-               return ret
-       end
+               if count > length then count = length - from
 
-       redef fun to_lower
-       do
-               var ret = empty
-               for i in substrings do
-                       ret += i.as(String).to_lower
-               end
-               return ret
-       end
+               if count == 0 then return empty
 
-       redef fun +(o) do
-               if self.length == 0 then return o.to_s
-               if o.length == 0 then return self
-               var str = o.to_s
-               if str isa FlatString then
-                       return new RopeString.from_root(new Concat(root, new StringLeaf(str)))
-               else if str isa RopeString then
-                       return new RopeString.from_root(new Concat(root, str.root))
+               if from < strlen then
+                       var subpos = strlen - from
+                       if count <= subpos then
+                               return new RopeBuffer.from(str.substring(from, count))
+                       else
+                               var l = str.substring_from(from)
+                               var rem = count - subpos
+                               var nns = new NativeString(rem)
+                               ns.copy_to(nns, rem, dumped, 0)
+                               return new RopeBuffer.from(l + nns.to_s_with_length(rem))
+                       end
                else
-                       abort
-               end
-       end
-
-       redef fun *(n)
-       do
-               var ret = new RopeString.from("")
-               for i in [0..n[ do
-                       ret = (ret + self).as(RopeString)
+                       var nns = new NativeString(count)
+                       ns.copy_to(nns, count, dumped, 0)
+                       return new RopeBuffer.from(nns.to_s_with_length(count))
                end
-               return ret
        end
 
-       # Inserts a String `str` at position `pos`
-       redef fun insert_at(str, pos)
-       do
-               if str.length == 0 then return self
-               if self.length == 0 then return new RopeString.from(str)
-
-               assert pos >= 0 and pos <= length
-
-               var path = node_at(pos)
-
-               var last_concat: Concat
-
-               if path.offset == 0 then
-                       if str isa FlatString then
-                               last_concat = new Concat(new StringLeaf(str), path.leaf)
-                       else
-                               last_concat = new Concat(str.as(RopeString).root, path.leaf)
+       redef fun append(s) do
+               var slen = s.length
+               length += slen
+               var rp = rpos
+               if s isa Rope then
+                       if rp > 0 and dumped != rp then
+                               str += new FlatString.with_infos(ns, rp - dumped, dumped, rp - 1)
+                               dumped = rp
                        end
-               else if path.offset == path.leaf.length then
-                       if str isa FlatString then
-                               last_concat = new Concat(path.leaf, new StringLeaf(str))
-                       else
-                               last_concat = new Concat(path.leaf, str.as(RopeString).root)
+                       str = str + s
+                       return
+               end
+               if slen > maxlen then
+                       if rp > 0 and dumped != rp then
+                               str += new FlatString.with_infos(ns, rp - dumped, dumped, rp - 1)
+                               dumped = rp
                        end
+                       str = str + s
+                       return
+               end
+               var remsp = buf_size - rp
+               var sits: NativeString
+               var begin: Int
+               if s isa FlatString then
+                       begin = s.index_from
+                       sits = s.items
+               else if s isa FlatBuffer then
+                       begin = 0
+                       sits = s.items
                else
-                       var s = path.leaf.str
-                       var l_half = s.substring(0, s.length - path.offset)
-                       var r_half = s.substring_from(s.length - path.offset)
-                       var cct: Concat
-                       var ll = new StringLeaf(l_half.as(FlatString))
-                       if str isa FlatString then
-                               cct = new Concat(ll, new StringLeaf(str))
+                       if slen <= remsp then
+                               for i in s.chars do
+                                       ns[rpos] = i
+                                       rpos += 1
+                               end
                        else
-                               cct = new Concat(ll, str.as(RopeString).root)
+                               var spos = 0
+                               for i in [0..remsp[ do
+                                       ns[rpos] = s[spos]
+                                       rpos += 1
+                                       spos += 1
+                               end
+                               dump_buffer
+                               while spos < slen do
+                                       ns[rpos] = s[spos]
+                                       spos += 1
+                                       rpos += 1
+                               end
                        end
-                       last_concat = new Concat(cct, new StringLeaf(r_half.as(FlatString)))
+                       return
                end
-
-               for i in path.stack.reverse_iterator do
-                       if i.left then
-                               last_concat = new Concat(last_concat, i.node.right)
+               if slen <= remsp then
+                       sits.copy_to(ns, slen, begin, rp)
+                       if rp == buf_size then
+                               rpos = buf_size
+                               dump_buffer
+                               rpos = 0
                        else
-                               last_concat = new Concat(i.node.left, last_concat)
+                               rpos += slen
                        end
+               else
+                       sits.copy_to(ns, remsp, begin, rp)
+                       rpos = buf_size
+                       dump_buffer
+                       var nlen = slen - remsp
+                       sits.copy_to(ns, nlen, begin + remsp, 0)
+                       rpos = nlen
                end
-
-               return new RopeString.from_root(last_concat)
        end
 
-       # O(log(n))
-       #
-       #     var rope = new RopeString.from("abcd")
-       #     assert rope.substring(1, 2)         ==  "bc"
-       #     assert rope.substring(-1, 2)         ==  "a"
-       #     assert rope.substring(1, 0)         ==  ""
-       #     assert rope.substring(2, 5)         ==  "cd"
-       #
-       redef fun substring(pos, len)
-       do
-               if pos < 0 then
-                       len += pos
-                       pos = 0
+       redef fun add(c) do
+               var rp = rpos
+               length += 1
+               ns[rp] = c
+               rp += 1
+               if rp == buf_size then
+                       rpos = rp
+                       dump_buffer
+                       rp = 0
                end
+               rpos = rp
+       end
 
-               if pos + len > length then len = length - pos
-
-               if len <= 0 then return new RopeString.from("")
-
-               var path = node_at(pos)
+       # Converts the Buffer to a FlatString, appends it to
+       # the final String and re-allocates a new larger Buffer.
+       private fun dump_buffer do
+               written = false
+               var nstr = new FlatString.with_infos(ns, rpos - dumped, dumped, rpos - 1)
+               str += nstr
+               var bs = buf_size
+               bs = bs * 2
+               ns = new NativeString(bs)
+               buf_size = bs
+               dumped = 0
+       end
 
-               var lf = path.leaf
-               var offset = path.offset
+       redef fun output do
+               str.output
+               new FlatString.with_infos(ns, rpos - dumped, dumped, rpos - 1).output
+       end
 
-               if path.leaf.str.length - offset > len then lf = new StringLeaf(lf.str.substring(offset,len).as(FlatString)) else lf = new StringLeaf(lf.str.substring_from(offset).as(FlatString))
+       # Enlarge is useless here since the `Buffer`
+       # part is automatically dumped when necessary.
+       #
+       # Also, since the buffer can not be overused by a
+       # single string, there is no need for manual
+       # resizing.
+       #
+       # "You have no power here !"
+       redef fun enlarge(i) do end
 
-               var nod: RopeNode = lf
+       redef fun to_s do
+               written = true
+               var nnslen = rpos - dumped
+               if nnslen == 0 then return str
+               return str + new FlatString.with_infos(ns, rpos - dumped, dumped, rpos - 1)
+       end
 
-               for i in path.stack.reverse_iterator do
-                       if i.right then continue
-                       nod = new Concat(nod, i.node.right)
+       redef fun reverse do
+               str = str.reversed
+               var nns = new NativeString(buf_size)
+               var j = rpos
+               var mits = ns
+               for i in [0 .. rpos[ do
+                       nns[i] = mits[j]
+                       j -= 1
                end
+               ns = nns
+       end
 
-               var ret = new RopeString
-               ret.root = nod
-
-               path = ret.node_at(len-1)
-
-               offset = path.offset
-               nod = new StringLeaf(path.leaf.str.substring(0, offset+1).as(FlatString))
-
-               for i in path.stack.reverse_iterator do
-                       if i.left then continue
-                       nod = new Concat(i.node.left, nod)
+       redef fun upper do
+               if written then reset
+               str = str.to_upper
+               var mits = ns
+               for i in [0 .. rpos[ do
+                       mits[i] = mits[i].to_upper
                end
+       end
 
-               ret.root = nod
-
-               return ret
+       redef fun lower do
+               if written then reset
+               str = str.to_lower
+               var mits = ns
+               for i in [0 .. rpos[ do
+                       mits[i] = mits[i].to_lower
+               end
        end
 end
 
 redef class FlatString
 
-       redef fun insert_at(s, pos)
-       do
+       redef fun insert_at(s, pos) do
+               var l = substring(0, pos)
+               var r = substring_from(pos)
+               return l + s + r
+       end
 
-               if pos == 0 then
-                       var r = new RopeString.from(s)
-                       return r + self
-               end
-               if pos == length then
-                       var r = new RopeString.from(self)
-                       return r + s
+       redef fun +(o) do
+               var s = o.to_s
+               var slen = s.length
+               var mlen = length
+               if slen == 0 then return self
+               if mlen == 0 then return s
+               var nlen = slen + mlen
+               if s isa FlatString then
+                       if nlen > maxlen then return new Concat(self, s)
+                       var mits = items
+                       var sifrom = s.index_from
+                       var mifrom = index_from
+                       var sits = s.items
+                       var ns = new NativeString(nlen + 1)
+                       mits.copy_to(ns, mlen, mifrom, 0)
+                       sits.copy_to(ns, slen, sifrom, mlen)
+                       return ns.to_s_with_length(nlen)
+               else if s isa Concat then
+                       var sl = s.left
+                       var sllen = sl.length
+                       if sllen + mlen > maxlen then return new Concat(self, s)
+                       return new Concat(self + sl, s.right)
+               else
+                       abort
                end
-
-               var l = substring(0,pos)
-               var r = substring_from(pos)
-               var ret: String = new RopeString.from(l)
-               ret += s
-               return ret + r
        end
+end
 
+# A simple linked list for use with iterators
+private class RopeIterPiece
+       # The encapsulated node of the `Rope`
+       var node: String
+       # Was its left child (if any) visited ?
+       var ldone: Bool
+       # Was its right child (if any) visited ?
+       var rdone: Bool
+       # The previous node in the list.
+       var prev: nullable RopeIterPiece
 end
 
-private class RopeStringChars
-       super SequenceRead[Char]
+# A reverse iterator capable of working with `Rope` objects
+private class RopeReviter
+       super IndexedIterator[Char]
 
-       var tgt: Rope
+       # Current NativeString
+       var ns: String
+       # Current position in NativeString
+       var pns: Int
+       # Position in the Rope (0-indexed)
+       var pos: Int
+       # Iterator on the substrings, does the Postfix part of
+       # the Rope traversal.
+       var subs: IndexedIterator[String]
 
-       redef fun [](pos)
-       do
-               assert pos < tgt.length
-               if tgt.leaf_cache != null and pos >= tgt.leaf_cache.pos and (tgt.leaf_cache.pos + tgt.leaf_cache.leaf.length) > pos then return tgt.leaf_cache.leaf.str.chars[pos - tgt.leaf_cache.pos]
-               var path = tgt.node_at(pos)
-               return path.leaf.str.chars[path.offset]
+       init(root: RopeString) do
+               pos = root.length - 1
+               subs = new ReverseRopeSubstrings(root)
+               ns = subs.item
+               pns = ns.length - 1
        end
 
-       redef fun iterator do return iterator_from(0)
-
-       redef fun iterator_from(pos) do return new RopeCharIterator(tgt, pos)
+       init from(root: RopeString, pos: Int) do
+               self.pos = pos
+               subs = new ReverseRopeSubstrings.from(root, pos)
+               ns = subs.item
+               pns = pos - subs.index
+       end
 
-       redef fun reverse_iterator do return reverse_iterator_from(tgt.length-1)
+       redef fun index do return pos
 
-       redef fun reverse_iterator_from(pos) do return new ReverseRopeCharIterator(tgt, pos)
-end
+       redef fun is_ok do return pos >= 0
 
-# Used to iterate on a Rope
-private class IteratorElement
+       redef fun item do return ns[pns]
 
-       init(e: RopeNode)
-       do
-               if e isa Leaf then
-                       left = true
-                       right = true
-               end
-               node = e
+       redef fun next do
+               pns -= 1
+               pos -= 1
+               if pns >= 0 then return
+               if not subs.is_ok then return
+               subs.next
+               if not subs.is_ok then return
+               ns = subs.item
+               pns = ns.length - 1
        end
-
-       # The node being visited
-       var node: RopeNode
-       # If the node has a left child, was it visited ?
-       var left = false
-       # If the node has a right child, was it visited ?
-       var right = false
-       # Was the current node visited ?
-       var done = false
 end
 
-# Simple Postfix iterator on the nodes of a Rope
-private class Postfix
-       super IndexedIterator[RopeNode]
-
-       # Target Rope to iterate on
-       var target: Rope
+# Forward iterator on the chars of a `Rope`
+private class RopeIter
+       super IndexedIterator[Char]
 
-       # Current position in Rope
+       # Position in current `String`
+       var pns: Int
+       # Current `String` being iterated on
+       var str: String
+       # Substrings of the Rope
+       var subs: IndexedIterator[String]
+       # Maximum position to iterate on (e.g. Rope.length)
+       var max: Int
+       # Position (char) in the Rope (0-indexed)
        var pos: Int
 
-       # Visited nodes
-       var stack = new List[IteratorElement]
+       init(root: RopeString) do
+               subs = new RopeSubstrings(root)
+               pns = 0
+               str = subs.item
+               max = root.length - 1
+               pos = 0
+       end
 
-       init from(tgt: Rope, pos: Int)
-       do
-               self.target = tgt
+       init from(root: RopeString, pos: Int) do
+               subs = new RopeSubstrings.from(root, pos)
+               pns = pos - subs.index
                self.pos = pos
-               if pos < 0 or pos >= tgt.length then return
-               var path = tgt.node_at(pos)
-               self.pos -= path.offset
-               for i in path.stack do
-                       var item = new IteratorElement(i.node)
-                       item.left = true
-                       if i.right then item.right = true
-                       stack.push item
-               end
-               var item = new IteratorElement(path.leaf)
-               item.done = true
-               stack.push item
+               str = subs.item
+               max = root.length - 1
        end
 
-       redef fun item
-       do
-               assert is_ok
-               return stack.last.node
-       end
+       redef fun item do return str[pns]
 
-       redef fun is_ok do return not stack.is_empty
+       redef fun is_ok do return pos <= max
 
        redef fun index do return pos
 
        redef fun next do
-               if stack.is_empty then return
-               if pos > target.length-1 then
-                       stack.clear
-                       return
-               end
-               var lst = stack.last
-               if lst.done then
-                       if lst.node isa Leaf then
-                               pos += lst.node.length
-                       end
-                       stack.pop
-                       next
-                       return
-               end
-               if not lst.left then
-                       lst.left = true
-                       var nod = lst.node
-                       if nod isa Concat and nod.left != null then
-                               stack.push(new IteratorElement(nod.left.as(not null)))
-                               next
-                               return
-                       end
-               end
-               if not lst.right then
-                       lst.right = true
-                       var nod = lst.node
-                       if nod isa Concat and nod.right != null then
-                               stack.push(new IteratorElement(nod.right.as(not null)))
-                               next
-                               return
-                       end
-               end
-               lst.done = true
+               pns += 1
+               pos += 1
+               if pns < subs.item.length then return
+               if not subs.is_ok then return
+               subs.next
+               if not subs.is_ok then return
+               str = subs.item
+               pns = 0
        end
 end
 
-# Iterates on the leaves (substrings) of the Rope
-class LeavesIterator
-       super IndexedIterator[Leaf]
-
-       private var nodes: Postfix
+# Substrings of a Rope (i.e. Reverse postfix iterator on leaves)
+private class ReverseRopeSubstrings
+       super IndexedIterator[String]
+
+       # Visit Stack
+       var iter: RopeIterPiece is noinit
+       # Position in `Rope`
+       var pos: Int is noinit
+
+       # Current leaf
+       var str: String is noinit
+
+       init(root: RopeString) do
+               var r = new RopeIterPiece(root, false, true, null)
+               pos = root.length - 1
+               var lnod: String = root
+               loop
+                       if lnod isa Concat then
+                               lnod = lnod.right
+                               r = new RopeIterPiece(lnod, false, true, r)
+                       else
+                               str = lnod
+                               iter = r
+                               break
+                       end
+               end
+       end
 
-       init(tgt: Rope, pos: Int)
-       do
-               nodes = tgt.postfix(pos)
+       init from(root: RopeString, pos: Int) do
+               var r = new RopeIterPiece(root, false, true, null)
+               var rnod: String = root
+               var off = pos
+               loop
+                       if rnod isa Concat then
+                               if off >= rnod.left.length then
+                                       off -= rnod.left.length
+                                       rnod = rnod.right
+                                       r = new RopeIterPiece(rnod, false, true, r)
+                               else
+                                       r.ldone = true
+                                       rnod = rnod.left
+                                       r = new RopeIterPiece(rnod, false, true, r)
+                               end
+                       else
+                               str = rnod
+                               r.ldone = true
+                               iter = r
+                               self.pos = pos - off
+                               break
+                       end
+               end
        end
 
-       redef fun is_ok do return nodes.is_ok
+       redef fun item do return str
 
-       redef fun item
-       do
-               assert is_ok
-               return nodes.item.as(Leaf)
-       end
+       redef fun index do return pos
 
-       redef fun index do return nodes.index
+       redef fun is_ok do return pos >= 0
 
-       redef fun next
-       do
-               while nodes.is_ok do
-                       nodes.next
-                       if nodes.is_ok and nodes.item isa Leaf then break
+       redef fun next do
+               if pos < 0 then return
+               var curr: nullable RopeIterPiece = iter.prev
+               var currit = curr.node
+               while curr != null do
+                       currit = curr.node
+                       if not currit isa Concat then
+                               str = currit
+                               pos -= str.length
+                               iter = curr
+                               return
+                       end
+                       if not curr.rdone then
+                               curr.rdone = true
+                               curr = new RopeIterPiece(currit.right, false, false, curr)
+                               continue
+                       end
+                       if not curr.ldone then
+                               curr.ldone = true
+                               curr = new RopeIterPiece(currit.left, false, false, curr)
+                               continue
+                       end
+                       curr = curr.prev
                end
+               pos = -1
        end
 end
 
-# Uses the leaves and calculates a new substring on each iteration
-class SubstringsIterator
-       super IndexedIterator[Text]
-
-       private var nodes: IndexedIterator[Leaf]
-
-       # Current position in Rope
-       var pos: Int
+private class RopeBufSubstringIterator
+       super Iterator[String]
 
-       # Current substring, computed from the current Leaf and indexes
-       var substring: Text
+       # Iterator on the substrings of the building string
+       var iter: Iterator[String]
+       # Makes a String out of the buffered part of the Ropebuffer
+       var nsstr: String
+       # Did we attain the buffered part ?
+       var nsstr_done = false
 
-       init(tgt: Rope, pos: Int)
-       do
-               nodes = tgt.leaves(pos)
-               self.pos = pos
-               if pos < 0 or pos >= tgt.length then return
-               make_substring
-       end
-
-       # Compute the bounds of the current substring and makes the substring
-       private fun make_substring
-       do
-               substring = nodes.item.str
-               var min = 0
-               var length = substring.length
-               if nodes.index < pos then
-                       min = pos - nodes.index
-               end
-               substring = substring.substring(min, length)
+       init(str: RopeBuffer) do
+               iter = str.str.substrings
+               nsstr = new FlatString.with_infos(str.ns, str.rpos - str.dumped, str.dumped, str.rpos - 1)
+               if str.length == 0 then nsstr_done = true
        end
 
-       redef fun is_ok do return nodes.is_ok
+       redef fun is_ok do return iter.is_ok or not nsstr_done
 
-       redef fun item
-       do
+       redef fun item do
                assert is_ok
-               return substring
+               if iter.is_ok then return iter.item
+               return nsstr
        end
 
-       redef fun index do return pos
-
-       redef fun next
-       do
-               pos += substring.length
-               nodes.next
-               if nodes.is_ok then make_substring
+       redef fun next do
+               if iter.is_ok then
+                       iter.next
+                       return
+               end
+               nsstr_done = true
        end
-
 end
 
-class RopeCharIterator
-       super IndexedIterator[Char]
-
-       var substrings: IndexedIterator[Text]
-
-       var pos: Int
-
-       var max: Int
-
-       var substr_iter: IndexedIterator[Char]
+# Substrings of a Rope (i.e. Postfix iterator on leaves)
+private class RopeSubstrings
+       super IndexedIterator[String]
+
+       # Visit Stack
+       var iter: RopeIterPiece is noinit
+       # Position in `Rope`
+       var pos: Int is noinit
+       # Maximum position in `Rope` (i.e. length - 1)
+       var max: Int is noinit
+
+       # Current leaf
+       var str: String is noinit
+
+       init(root: RopeString) do
+               var r = new RopeIterPiece(root, true, false, null)
+               pos = 0
+               max = root.length - 1
+               var rnod: String = root
+               loop
+                       if rnod isa Concat then
+                               rnod = rnod.left
+                               r = new RopeIterPiece(rnod, true, false, r)
+                       else
+                               str = rnod
+                               r.rdone = true
+                               iter = r
+                               break
+                       end
+               end
+       end
 
-       init(tgt: Rope, from: Int)
-       do
-               substrings = tgt.substrings_from(from)
-               max = tgt.length - 1
-               if not substrings.is_ok then
-                       pos = tgt.length
-                       return
+       init from(root: RopeString, pos: Int) do
+               var r = new RopeIterPiece(root, true, false, null)
+               max = root.length - 1
+               var rnod: String = root
+               var off = pos
+               loop
+                       if rnod isa Concat then
+                               if off >= rnod.left.length then
+                                       r.rdone = true
+                                       off -= rnod.left.length
+                                       rnod = rnod.right
+                                       r = new RopeIterPiece(rnod, true, false, r)
+                               else
+                                       rnod = rnod.left
+                                       r = new RopeIterPiece(rnod, true, false, r)
+                               end
+                       else
+                               str = rnod
+                               r.rdone = true
+                               iter = r
+                               self.pos = pos - off
+                               break
+                       end
                end
-               pos = from
-               substr_iter = substrings.item.chars.iterator
        end
 
-       redef fun item do return substr_iter.item
+       redef fun item do return str
 
        redef fun is_ok do return pos <= max
 
        redef fun index do return pos
 
-       redef fun next
-       do
-               pos += 1
-               if substr_iter.is_ok then
-                       substr_iter.next
-               end
-               if not substr_iter.is_ok then
-                       substrings.next
-                       if substrings.is_ok then
-                               substr_iter = substrings.item.chars.iterator
+       redef fun next do
+               pos += str.length
+               if pos > max then return
+               var it = iter.prev
+               var rnod: String = it.node
+               loop
+                       if not rnod isa Concat then
+                               it.ldone = true
+                               it.rdone = true
+                               str = rnod
+                               iter = it.as(not null)
+                               break
+                       end
+                       if not it.ldone then
+                               rnod = rnod.left
+                               it.ldone = true
+                               it = new RopeIterPiece(rnod, false, false, it)
+                       else if not it.rdone then
+                               it.rdone = true
+                               rnod = rnod.right
+                               it = new RopeIterPiece(rnod, false, false, it)
+                       else
+                               it = it.prev
+                               rnod = it.node
+                               continue
                        end
                end
        end
 end
 
-private class ReversePostfix
-       super IndexedIterator[RopeNode]
+# Implementation of a `StringCharView` for `RopeString` objects
+private class RopeChars
+       super StringCharView
 
-       var target: Rope
+       var tgt: RopeString
 
-       var pos: Int
+       init(s: RopeString) do tgt = s
 
-       var min = 0
+       redef fun [](i) do
+               return tgt[i]
+       end
 
-       var stack = new List[IteratorElement]
+       redef fun iterator_from(i) do return new RopeIter.from(tgt, i)
 
-       init from(tgt: Rope, pos: Int)
-       do
-               self.pos = pos
-               target = tgt
-               if pos < 0 or pos >= tgt.length then return
-               var path = tgt.node_at(pos)
-               self.pos -= path.offset
-               for i in path.stack do
-                       var elemt = new IteratorElement(i.node)
-                       elemt.right = true
-                       if i.left then
-                               elemt.left = true
-                       end
-                       stack.push elemt
-               end
-               stack.push(new IteratorElement(path.leaf))
-               stack.last.done = true
-       end
+       redef fun reverse_iterator_from(i) do return new RopeReviter.from(tgt, i)
 
-       redef fun item do
-               assert is_ok
-               return stack.last.node
-       end
+end
 
-       redef fun is_ok do return not stack.is_empty
+class RopeBufferIter
+       super IndexedIterator[Char]
 
-       redef fun index do return pos
+       var sit: IndexedIterator[Char]
 
-       redef fun next
-       do
-               if stack.is_empty then return
-               if pos < min then
-                       stack.clear
-                       return
-               end
-               var lst = stack.last
-               if lst.done then
-                       stack.pop
-                       next
-                       return
-               end
-               if not lst.right then
-                       var nod = lst.node.as(Concat)
-                       var rgt = nod.right
-                       lst.right = true
-                       if rgt != null then
-                               stack.push(new IteratorElement(rgt))
-                               next
-                               return
-                       end
-               end
-               if not lst.left then
-                       var nod = lst.node.as(Concat)
-                       var lft = nod.left
-                       lst.left = true
-                       if lft != null then
-                               stack.push(new IteratorElement(lft))
-                               next
-                               return
-                       end
-               end
-               if lst.node isa Leaf then pos -= lst.node.length
-               lst.done = true
-       end
-end
+       var ns: NativeString
+
+       var pns: Int
 
-private class ReverseLeavesIterator
-       super IndexedIterator[Leaf]
+       var maxpos: Int
 
-       var nodes: ReversePostfix
+       redef var index: Int
+
+       init(t: RopeBuffer) do
+               ns = t.ns
+               maxpos = t.rpos
+               sit = t.str.chars.iterator
+               pns = t.dumped
+               index = 0
+       end
 
-       init(tgt: Rope, from: Int)
-       do
-               nodes = tgt.reverse_postfix(from)
+       init from(t: RopeBuffer, pos: Int) do
+               ns = t.ns
+               maxpos = t.length
+               sit = t.str.chars.iterator_from(pos)
+               pns = pos - t.str.length
+               index = pos
        end
 
-       redef fun is_ok do return nodes.is_ok
+       redef fun is_ok do return index < maxpos
 
        redef fun item do
-               assert is_ok
-               return nodes.item.as(Leaf)
+               if sit.is_ok then return sit.item
+               return ns[pns]
        end
 
        redef fun next do
-               while nodes.is_ok do
-                       nodes.next
-                       if nodes.is_ok then if nodes.item isa Leaf then break
+               index += 1
+               if sit.is_ok then
+                       sit.next
+               else
+                       pns += 1
                end
        end
-
-       redef fun index do return nodes.index
-
 end
 
-private class ReverseSubstringsIterator
-       super IndexedIterator[Text]
+class RopeBufferReviter
+       super IndexedIterator[Char]
 
-       var leaves: ReverseLeavesIterator
+       var sit: IndexedIterator[Char]
 
-       var pos: Int
+       var ns: NativeString
+
+       var pns: Int
 
-       var str: Text
+       redef var index: Int
 
-       init(tgt: Rope, from: Int)
-       do
-               leaves = tgt.reverse_leaves(from)
-               pos = from
-               if not leaves.is_ok then return
-               str = leaves.item.str
-               make_substring
+       init(tgt: RopeBuffer) do
+               sit = tgt.str.chars.reverse_iterator
+               pns = tgt.rpos - 1
+               index = tgt.length - 1
+               ns = tgt.ns
        end
 
-       fun make_substring
-       do
-               if pos >= (leaves.index + str.length - 1) then return
-               str = str.substring(0, (pos - leaves.index + 1))
+       init from(tgt: RopeBuffer, pos: Int) do
+               sit = tgt.str.chars.reverse_iterator_from(pos - tgt.rpos - tgt.dumped)
+               pns = pos - tgt.str.length
+               index = pos
+               ns = tgt.ns
        end
 
-       redef fun is_ok do return leaves.is_ok
+       redef fun is_ok do return index > 0
 
        redef fun item do
-               assert is_ok
-               return str
+               if pns >= 0 then return ns[pns]
+               return sit.item
        end
 
-       redef fun index do return pos
-
        redef fun next do
-               pos -= str.length
-               leaves.next
-               if not leaves.is_ok then return
-               str = leaves.item.str
-               make_substring
+               index -= 1
+               if pns >= 0 then
+                       pns -= 1
+               else
+                       sit.next
+               end
        end
 end
 
-private class ReverseRopeCharIterator
-       super IndexedIterator[Char]
+# View on the chars of a `RopeBuffer`
+class RopeBufferChars
+       super BufferCharView
 
-       var substrs: IndexedIterator[Text]
+       redef type SELFTYPE: RopeBuffer
 
-       var pos: Int
-
-       var subiter: IndexedIterator[Char]
+       redef fun [](i) do
+               if i < target.str.length then
+                       return target.str[i]
+               else
+                       return target.ns[i - target.str.length]
+               end
+       end
 
-       init(tgt: Rope, from: Int)
-       do
-               substrs = tgt.reverse_substrings_from(from)
-               if not substrs.is_ok then
-                       pos = -1
-                       return
+       redef fun []=(i,c) do
+               if i == target.length then target.add c
+               if i < target.str.length then
+                       var s = target.str
+                       var l = s.substring(0, i)
+                       var r = s.substring_from(i + 1)
+                       target.str = l + c.to_s + r
+               else
+                       target.ns[i - target.str.length] = c
                end
-               subiter = substrs.item.chars.reverse_iterator
-               pos = from
        end
 
-       redef fun is_ok do return pos >= 0
+       redef fun add(c) do target.add c
 
-       redef fun item do
-               assert is_ok
-               return subiter.item
-       end
+       redef fun push(c) do target.add c
 
-       redef fun index do return pos
+       redef fun iterator_from(i) do return new RopeBufferIter.from(target, i)
 
-       redef fun next do
-               pos -= 1
-               if subiter.is_ok then subiter.next
-               if not subiter.is_ok then
-                       if substrs.is_ok then substrs.next
-                       if substrs.is_ok then subiter = substrs.item.chars.reverse_iterator
-               end
-       end
+       redef fun reverse_iterator_from(i) do return new RopeBufferReviter.from(target, i)
 end
-
index 4550113..a487d98 100644 (file)
@@ -22,9 +22,9 @@ import string_search
 import file
 import exec
 import stream
-import ropes
 import collection
 import math
+import ropes
 import kernel
 import gc
 import bitset
index 6765305..84b167a 100644 (file)
@@ -135,29 +135,6 @@ redef class Text
        redef fun write_to(stream) do stream.write(self)
 end
 
-redef class RopeNode
-       super Streamable
-end
-
-redef class Leaf
-
-       redef fun write_to(s) do s.write(str)
-end
-
-redef class Concat
-
-       redef fun write_to(s)
-       do
-               if left != null then left.write_to(s)
-               if right != null then right.write_to(s)
-       end
-end
-
-redef class RopeString
-
-       redef fun write_to(s) do root.write_to(s)
-end
-
 # Input streams with a buffer
 abstract class BufferedIStream
        super IStream
index e8e4a4e..3059597 100644 (file)
@@ -778,6 +778,8 @@ abstract class String
 
        fun insert_at(s: String, pos: Int): SELFTYPE is abstract
 
+       redef fun substrings: Iterator[String] is abstract
+
        # Returns a reversed version of self
        #
        #     assert "hello".reversed  == "olleh"
@@ -2098,7 +2100,6 @@ extern class NativeString `{ char* `}
        do
                assert length >= 0
                var str = new FlatString.with_infos(self, length, 0, length - 1)
-               str.real_items = self
                return str
        end
 
@@ -2108,7 +2109,8 @@ extern class NativeString `{ char* `}
                var new_self = calloc_string(length + 1)
                copy_to(new_self, length, 0, 0)
                var str = new FlatString.with_infos(new_self, length, 0, length - 1)
-               str.real_items = self
+               new_self[length] = '\0'
+               str.real_items = new_self
                return str
        end
 end
index 16c2502..c473a3c 100644 (file)
@@ -448,8 +448,8 @@ redef class FlatString
                        items.copy_to(new_str, bytelen, index_from, 0)
                        o.items.copy_to(new_str, o.bytelen, o.index_from, bytelen)
                        return new FlatString.full(new_str, 0, new_bytelen - 1, new_bytelen, newlen)
-               else if o isa RopeString then
-                       return new RopeString.from(self) + o
+               else if o isa Concat then
+                       return new Concat(self, o)
                else
                        # If it goes to this point, that means another String implementation was concerned, therefore you need to support the + operation for this variant
                        abort
@@ -519,7 +519,7 @@ redef class FlatBuffer
        redef var bytelen: Int
 
        redef init from(s) do
-               if s isa RopeString then
+               if s isa Concat then
                        with_capacity(50)
                        for i in s.substrings do self.append(i)
                end
@@ -618,7 +618,7 @@ redef class FlatBuffer
        end
 
        redef fun append(s) do
-               if s isa RopeString then
+               if s isa Concat then
                        for i in s.substrings do append i
                end
                var i = s.as(FlatString)
index 9c5aec7..4ebd217 100644 (file)
@@ -311,7 +311,7 @@ abstract class NitdocPage
 
        # Clickable graphviz image using dot format
        # return null if no graph for this page
-       fun tpl_graph(dot: FlatBuffer, name: String, title: nullable String): nullable TplArticle do
+       fun tpl_graph(dot: Buffer, name: String, title: nullable String): nullable TplArticle do
                if ctx.opt_nodot.value then return null
                var output_dir = ctx.output_dir
                var file = new OFStream.open("{output_dir}/{name}.dot")
@@ -992,7 +992,7 @@ class NitdocModule
                        end
                end
                # build graph
-               var op = new FlatBuffer
+               var op = new RopeBuffer
                var name = "dep_module_{mmodule.nitdoc_id}"
                op.append("digraph {name} \{ rankdir=BT; node[shape=none,margin=0,width=0,height=0,fontsize=10]; edge[dir=none,color=gray]; ranksep=0.2; nodesep=0.1;\n")
                for mmodule in poset do
@@ -1373,7 +1373,7 @@ class NitdocClass
                        end
                end
 
-               var op = new FlatBuffer
+               var op = new RopeBuffer
                var name = "dep_class_{mclass.nitdoc_id}"
                op.append("digraph {name} \{ rankdir=BT; node[shape=none,margin=0,width=0,height=0,fontsize=10]; edge[dir=none,color=gray]; ranksep=0.2; nodesep=0.1;\n")
                var classes = poset.to_a
index 3dff2fc..c99dc83 100644 (file)
@@ -14,6 +14,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+#alt1 import standard
+#alt1 import standard::ropes
+
 var n = 7
 if not args.is_empty then
        n = args.first.to_i
@@ -22,7 +25,8 @@ end
 var s = "*"
 var i = 0
 while i < n do
-       var s2 = new FlatBuffer.from("Je dis Â«")
+       var s2: Buffer = new FlatBuffer.from("Je dis Â«")
+       #alt1 s2 = new RopeBuffer.from("Je dis Â«")
        s2.append(s)
        s2.append("» et redis Â«")
        s2.append(s)
index c00d979..e8d5c50 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+#alt1 import standard
+#alt1 import standard::ropes
+
 # A procedural program (without explicit class).
 
 fun first_word(s: String): String
 do
-       var result = new FlatBuffer
+       var result: Buffer = new FlatBuffer
+       #alt1 result = new RopeBuffer
        var i = 0
        while i < s.length and s.chars[i] != ' ' do
                result.add(s.chars[i])
index f066eac..aad8297 100644 (file)
@@ -18,6 +18,9 @@
 # It displays the value of a local variable.
 # It exhibs ways to concatenate strings.
 
+#alt1 import standard
+#alt1 import standard::ropes
+
 var a = 10
 # First way: Multiple parameters.
 # Pro: Simple.
@@ -27,7 +30,8 @@ printn("The value of a is: ", a, ".\n")
 # Second way: Build a string and display it.
 # Pro: Eiffel way (rigourous).
 # Con: Eiffel way (heavy).
-var s = new FlatBuffer.from("The value of a is: ")
+var s: Buffer = new FlatBuffer.from("The value of a is: ")
+#alt1 s = new RopeBuffer.from("The value of a is: ")
 s.append(a.to_s)
 s.append(".\n")
 printn(s)
diff --git a/tests/sav/bench_string_append_alt1.res b/tests/sav/bench_string_append_alt1.res
new file mode 100644 (file)
index 0000000..24c2167
--- /dev/null
@@ -0,0 +1,3 @@
+1092
+1365
+147447
diff --git a/tests/sav/example_procedural_string_alt1.res b/tests/sav/example_procedural_string_alt1.res
new file mode 100644 (file)
index 0000000..e965047
--- /dev/null
@@ -0,0 +1 @@
+Hello
diff --git a/tests/sav/example_string_alt1.res b/tests/sav/example_string_alt1.res
new file mode 100644 (file)
index 0000000..02444a6
--- /dev/null
@@ -0,0 +1,5 @@
+The value of a is: 10.
+The value of a is: 10.
+The value of a is: 10.
+The value of a is: 10.
+The value of a is: 10.
diff --git a/tests/sav/splay_test.res b/tests/sav/splay_test.res
deleted file mode 100644 (file)
index a8191ea..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-digraph g {
-[label = 6];
- ->  [label = "left"];
-[label = "AB" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = AB"];
- ->  [label = "right"];
-[label = 4];
- ->  [label = "left"];
-[label = "CD" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = CD"];
- ->  [label = "right"];
-[label = "EF" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = EF"];
-}
-
-ABCDEF
-digraph g {
-[label = 6];
- ->  [label = "left"];
-[label = 4];
- ->  [label = "left"];
-[label = "AB" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = AB"];
- ->  [label = "right"];
-[label = "CD" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = CD"];
- ->  [label = "right"];
-[label = "EF" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = EF"];
-}
-
-ABCDEF
-ABCDEFGH
-digraph g {
-[label = 8];
- ->  [label = "left"];
-[label = 6];
- ->  [label = "left"];
-[label = 4];
- ->  [label = "left"];
-[label = "AB" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = AB"];
- ->  [label = "right"];
-[label = "CD" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = CD"];
- ->  [label = "right"];
-[label = "EF" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = EF"];
- ->  [label = "right"];
-[label = "GH" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = GH"];
-}
-
-ABCDEFGH
-digraph g {
-[label = 8];
- ->  [label = "left"];
-[label = "AB" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = AB"];
- ->  [label = "right"];
-[label = 6];
- ->  [label = "left"];
-[label = 4];
- ->  [label = "left"];
-[label = "CD" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = CD"];
- ->  [label = "right"];
-[label = "EF" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = EF"];
- ->  [label = "right"];
-[label = "GH" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = GH"];
-}
-
-ABCDEFGH
-digraph g {
-[label = 8];
- ->  [label = "left"];
-[label = "AB" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = AB"];
- ->  [label = "right"];
-[label = 6];
- ->  [label = "left"];
-[label = "CD" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = CD"];
- ->  [label = "right"];
-[label = 4];
- ->  [label = "left"];
-[label = "EF" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = EF"];
- ->  [label = "right"];
-[label = "GH" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = GH"];
-}
-
-ABCDEFGH
-digraph g {
-[label = 8];
- ->  [label = "left"];
-[label = 6];
- ->  [label = "left"];
-[label = "AB" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = AB"];
- ->  [label = "right"];
-[label = 4];
- ->  [label = "left"];
-[label = "CD" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = CD"];
- ->  [label = "right"];
-[label = "EF" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = EF"];
- ->  [label = "right"];
-[label = "GH" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = GH"];
-}
-
-ABCDEFGH
-digraph g {
-[label = 8];
- ->  [label = "left"];
-[label = 6];
- ->  [label = "left"];
-[label = "AB" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = AB"];
- ->  [label = "right"];
-[label = 4];
- ->  [label = "left"];
-[label = "CD" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = CD"];
- ->  [label = "right"];
-[label = "EF" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = EF"];
- ->  [label = "right"];
-[label = "GH" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = GH"];
-}
-
-ABCDEFGH
-digraph g {
-[label = 8];
- ->  [label = "left"];
-[label = 4];
- ->  [label = "left"];
-[label = "AB" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = AB"];
- ->  [label = "right"];
-[label = "CD" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = CD"];
- ->  [label = "right"];
-[label = 4];
- ->  [label = "left"];
-[label = "EF" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = EF"];
- ->  [label = "right"];
-[label = "GH" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = GH"];
-}
-
-ABCDEFGH
-digraph g {
-[label = 8];
- ->  [label = "left"];
-[label = "AB" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = AB"];
- ->  [label = "right"];
-[label = 6];
- ->  [label = "left"];
-[label = 4];
- ->  [label = "left"];
-[label = "CD" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = CD"];
- ->  [label = "right"];
-[label = "EF" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = EF"];
- ->  [label = "right"];
-[label = "GH" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = GH"];
-}
-
-ABCDEFGH
-digraph g {
-[label = 8];
- ->  [label = "left"];
-[label = 4];
- ->  [label = "left"];
-[label = "AB" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = AB"];
- ->  [label = "right"];
-[label = "CD" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = CD"];
- ->  [label = "right"];
-[label = 4];
- ->  [label = "left"];
-[label = "EF" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = EF"];
- ->  [label = "right"];
-[label = "GH" shape = rect];
- -> [label = "contains"];
- [label="FlatString\nindex_from = 0\nindex_to = 1\nNativeString = GH"];
-}
-
diff --git a/tests/sav/string_trim_alt1.res b/tests/sav/string_trim_alt1.res
new file mode 100644 (file)
index 0000000..24d9987
--- /dev/null
@@ -0,0 +1,13 @@
+resulttrim = nono nono
+returntrim + nono nono
+thirdtrim = nono nono
+emptytrim = 
+bufferemptytrim = 
+onelettertrim = d
+oneletterbuftest = d
+twolettertrim = hg
+twoletterbuftest = hg
+firstlettertrimtest = d
+firstlettertrimbuftest = d
+lastlettertrimtest = d
+lastlettertrimbuftest = d
index 7e4b7c1..8c7831d 100644 (file)
@@ -13,7 +13,6 @@ now step live...
 now step live...
  live...
 .
- live stepnow
 ...evil pets won
 n
 now step live... step live...
diff --git a/tests/sav/test_ropes_alt1.res b/tests/sav/test_ropes_alt1.res
deleted file mode 100644 (file)
index 7e4b7c1..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-NODEATTEST
-INZZ
-INDDZZ
-EEINDDZZ
-EEINDDZZFF
-eeinddzzff
-EEINDDZZFF
-FFZZDDNIEE
-hello_world.types.1.o
-now step live...
-...evil pets won
-now step live...
-now step live...
- live...
-.
- live stepnow
-...evil pets won
-n
-now step live... step live...
-w s
-ZZ
-ZZZZZZZZZZ
-ZZAAZZZZZZZZ
-NNZZAAZZZZZZZZ
-NIINZZAAZZZZZZZZ
-NINIINZZAAZZZZZZZZINZZAAZZZZZZZZ
diff --git a/tests/sav/test_ropes_alt2.res b/tests/sav/test_ropes_alt2.res
deleted file mode 100644 (file)
index 3fa08b9..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-NODEATTEST
-INZZ
-INDDZZ
-EEINDDZZ
-EEINDDZZFF
-eeinddzzff
-EEINDDZZFF
-FFZZDDNIEE
-hello_world.types.1.o
-now step live...
-...evil pets won
-now step live...
-now step live...
- live...
-.
-now step live
-...evil pets won
-n
-now step live... step live...
-w s
-ZZ
-ZZZZZZZZZZ
-ZZAAZZZZZZZZ
-NNZZAAZZZZZZZZ
-NIINZZAAZZZZZZZZ
-NINIINZZAAZZZZZZZZINZZAAZZZZZZZZ
diff --git a/tests/sav/test_string_long_alt1.res b/tests/sav/test_string_long_alt1.res
new file mode 100644 (file)
index 0000000..21373ff
--- /dev/null
@@ -0,0 +1,10000 @@
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
+Bonjour !
diff --git a/tests/sav/test_to_upper_lower_buffer_alt1.res b/tests/sav/test_to_upper_lower_buffer_alt1.res
new file mode 100644 (file)
index 0000000..e69de29
index acc2856..2137a3a 100644 (file)
@@ -17,7 +17,7 @@
 fun nsieve(n: Int): Int
 do
        var count = 0
-       var array = new FlatBuffer.with_capacity(n)
+       var array: Buffer = new FlatBuffer.with_capacity(n)
        for i in [0..n[ do
                array.chars[i] = 'o'
        end
diff --git a/tests/splay_test.nit b/tests/splay_test.nit
deleted file mode 100644 (file)
index dae8aef..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-# This file is part of NIT ( http://www.nitlanguage.org ).
-#
-# This file is free software, which comes along with NIT.  This software is
-# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
-# PARTICULAR PURPOSE.  You can modify it is you want,  provided this header
-# is kept unaltered, and a notification of the changes is added.
-# You  are  allowed  to  redistribute it and sell it, alone or is a part of
-# another product.
-
-intrude import splay_ropes
-intrude import standard::ropes
-intrude import ropes_debug
-
-redef class Leaf
-       redef fun to_dot(s): String
-       do
-               s += "[label = \"{str}\" shape = rect];\n"
-               s += " -> [label = \"contains\"];\n"
-               s = str.to_dot(s)
-               return s
-       end
-end
-
-redef class Concat
-       redef fun to_dot(s): String
-       do
-               s += "[label = {length}];\n"
-               if left != null then
-                       s += " ->  [label = \"left\"];\n"
-                       s = left.to_dot(s)
-               end
-               if right != null then
-                       s += " ->  [label = \"right\"];\n"
-                       s = right.to_dot(s)
-               end
-               return s
-       end
-end
-
-redef class FlatString
-       redef fun to_dot(s: String): String
-       do
-               return s + " [label=\"FlatString\\nindex_from = {index_from}\\nindex_to = {index_to}\\nNativeString = {items.to_s_with_length(items.cstring_length)}\"];\n"
-       end
-end
-
-redef class FlatBuffer
-       redef fun to_dot(s: String): String
-       do
-               return s + " [label=\"FlatBuffer\\length = {length}\\ncapacity = {capacity}\\nitems = {items.to_s_with_length(items.cstring_length)}\"];\n"
-       end
-end
-
-
-redef class RopeString
-
-       redef fun to_dot(f)
-       do
-               var ret: String = new RopeString.from("digraph g \{\n")
-               ret = root.to_dot(ret).as(RopeString)
-               ret += "\}\n"
-               print ret
-               return ret
-       end
-
-end
-
-var ab = new StringLeaf("AB".as(FlatString))
-var cd = new StringLeaf("CD".as(FlatString))
-var ef = new StringLeaf("EF".as(FlatString))
-var gh = new StringLeaf("GH".as(FlatString))
-
-# Zig test
-
-var c = new Concat(cd,ef)
-c = new Concat(ab,c)
-var ro = new RopeString.from_root(c)
-
-ro.to_dot("Zig-Before_splay.dot")
-print ro
-
-var p = ro.node_at(5)
-
-ro = new RopeString.from_root(ro.splay(p).as(not null))
-
-ro.to_dot("Zig-After_splay.dot")
-print ro
-
-# Zig-zig test left left
-
-var d = new Concat(ab,cd)
-var e = new Concat(d,ef)
-var f = new Concat(e,gh)
-ro = new RopeString.from_root(f)
-
-p = ro.node_at(0)
-
-print ro
-ro.to_dot("Zig-zigll-Before_splay.dot")
-
-ro = new RopeString.from_root(ro.splay(p).as(not null))
-
-print ro
-ro.to_dot("Zig-zigll-After_splay.dot")
-
-# Zig-zig test right right
-
-d = new Concat(ef,gh)
-e = new Concat(cd,d)
-f = new Concat(ab,e)
-ro = new RopeString.from_root(f)
-
-p = ro.node_at(7)
-
-print ro
-ro.to_dot("Zig-zigrr-Before_splay.dot")
-
-ro = new RopeString.from_root(ro.splay(p).as(not null))
-
-print ro
-ro.to_dot("Zig-zigrr-After_splay.dot")
-
-# Zig-zag test left right
-
-d = new Concat(cd,ef)
-e = new Concat(ab,d)
-f = new Concat(e,gh)
-ro = new RopeString.from_root(f)
-
-p = ro.node_at(4)
-
-print ro
-ro.to_dot("Zig-zaglr-Before_splay.dot")
-
-ro = new RopeString.from_root(ro.splay(p).as(not null))
-
-print ro
-ro.to_dot("Zig-zaglr-After_splay.dot")
-
-# Zig-zag test right left
-
-d = new Concat(cd,ef)
-e = new Concat(d,gh)
-f = new Concat(ab,e)
-ro = new RopeString.from_root(f)
-
-p = ro.node_at(4)
-
-print ro
-ro.to_dot("Zig-zagrl-Before_splay.dot")
-
-ro = new RopeString.from_root(ro.splay(p).as(not null))
-
-print ro
-ro.to_dot("Zig-zagrl-After_splay.dot")
-
index 387c8b1..81ce2bd 100644 (file)
@@ -1,10 +1,12 @@
-module string_trim
+#alt1 import standard::ropes
+#alt1 import standard
 
 var trimtest = "   \t nono nono   \n \t"
 
 var subtrim = trimtest.substring(2,15)
 
-var buffertrimtest = new FlatBuffer.from(trimtest)
+var buffertrimtest: Buffer = new FlatBuffer.from(trimtest)
+#alt1 buffertrimtest = new RopeBuffer.from(trimtest)
 
 print "resulttrim = {buffertrimtest.trim}"
 
@@ -14,7 +16,8 @@ print "thirdtrim = {subtrim.trim}"
 
 var emptytrim = "         \t  "
 
-var bufferemptytest = new FlatBuffer.from(emptytrim)
+var bufferemptytest: Buffer = new FlatBuffer.from(emptytrim)
+#alt1 bufferemptytest = new RopeBuffer.from(emptytrim)
 
 print "emptytrim = {emptytrim.trim}"
 
@@ -22,7 +25,8 @@ print "bufferemptytrim = {bufferemptytest.trim}"
 
 var onelettertrim = "    \n   d      \n\t  "
 
-var oneletterbuftest = new FlatBuffer.from(onelettertrim)
+var oneletterbuftest: Buffer = new FlatBuffer.from(onelettertrim)
+#alt1 oneletterbuftest = new RopeBuffer.from(onelettertrim)
 
 print "onelettertrim = {onelettertrim.trim}"
 
@@ -30,7 +34,8 @@ print "oneletterbuftest = {oneletterbuftest.trim}"
 
 var twolettertrim = "    \n   hg      \n\t  "
 
-var twoletterbuftest = new FlatBuffer.from(twolettertrim)
+var twoletterbuftest: Buffer = new FlatBuffer.from(twolettertrim)
+#alt1 twoletterbuftest = new RopeBuffer.from(twolettertrim)
 
 print "twolettertrim = {twolettertrim.trim}"
 
@@ -38,7 +43,8 @@ print "twoletterbuftest = {twoletterbuftest.trim}"
 
 var firstlettertrim = "d                "
 
-var firstlettertrimbuf = new FlatBuffer.from(firstlettertrim)
+var firstlettertrimbuf: Buffer = new FlatBuffer.from(firstlettertrim)
+#alt1 firstlettertrimbuf = new RopeBuffer.from(firstlettertrim)
 
 print "firstlettertrimtest = {firstlettertrim.trim}"
 
@@ -46,7 +52,8 @@ print "firstlettertrimbuftest = {firstlettertrimbuf.trim}"
 
 var lastlettertrim = "                     d"
 
-var lastlettertrimbuf = new FlatBuffer.from(lastlettertrim)
+var lastlettertrimbuf: Buffer = new FlatBuffer.from(lastlettertrim)
+#alt1 lastlettertrimbuf = new RopeBuffer.from(lastlettertrim)
 
 print "lastlettertrimtest = {lastlettertrim.trim}"
 
index f9a416d..3f080c1 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-var rp: String = new RopeString.from("xxx")
-rp += "yyy"
+import standard
+intrude import standard::ropes
+
+var rp: String = new Concat("xxx", "yyy")
 rp += "zzz"
 var arr = ["FlatString", rp]
 print arr.to_s
index d08aa03..1e54bee 100644 (file)
@@ -12,8 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#alt1 import splay_ropes
-#alt2 import bufferized_ropes
+#alt1 import standard
+#alt1 import buffered_ropes
 
 var st = "quick brown fox over the lazy dog"
 
index 2d03f50..c8829ee 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#alt1 import splay_ropes
-#alt2 import bufferized_ropes
+import standard
+intrude import standard::ropes
 
-var x :String = new RopeString
+# Force building a Rope
+redef fun maxlen: Int do return once 2
 
-x = x + "NODE"
-x = x + "AT"
-x = x + "TEST"
+var x :String = new Concat("NODE", "AT")
+
+x += "TEST"
 
 print x
 
 var lst = new List[String]
 
-lst.push(new RopeString.from("ZZ"))
+lst.push("ZZ")
 
 lst.push((lst.last * 5))
 
@@ -41,7 +42,7 @@ var ss = lst.last.substring(4,4)
 
 print ss
 
-ss = ss.as(RopeString).insert_at("DD", 2)
+ss = ss.insert_at("DD", 2)
 
 print ss
 
@@ -67,15 +68,14 @@ print ss
 
 var atb = new Array[String]
 
-var s: String = new RopeString
-s = s + "./examples/hello_world.nit".substring(11,11) + ".types"
+var s: String = "./examples/hello_world.nit".substring(11,11) + ".types"
 s += "."
 s += "1"
 s += ".o"
 
 print s
 
-var str = new RopeString.from("now") + " step" + " live..."
+var str = "now" + " step" + " live..."
 
 print str
 
@@ -101,16 +101,13 @@ printn "\n"
 for i in str.chars.iterator_from(str.length-1) do printn i
 printn "\n"
 
-for i in str.as(RopeString).reverse_substrings_from(12) do printn i
-printn "\n"
-
 for i in str.chars.reverse_iterator do printn i
 printn "\n"
 
 for i in str.chars.reverse_iterator_from(0) do printn i
 printn "\n"
 
-var str2 = str.as(RopeString).insert_at(str.substring_from(3), 3)
+var str2 = str.insert_at(str.substring_from(3), 3)
 
 print str2
 
index 04655ba..6bfb034 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+#alt1 import standard
+#alt1 import standard::ropes
 
 var s = "Bonjour !\n"
-var r = new FlatBuffer.with_capacity(50)
-var r2 = new FlatBuffer
+var r: Buffer = new FlatBuffer.with_capacity(50)
+#alt1 r = new RopeBuffer
+var r2: Buffer = new FlatBuffer
+#alt1 r2 = new RopeBuffer
 
 var i = 0
 while i < 5000 do
index 2b6ef28..3e7da27 100644 (file)
@@ -12,7 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#alt3 import bufferized_ropes
+#alt2 import standard
+#alt2 import buffered_ropes
 
 var str = "Woe to you, oh earth and sea for the Devil sends the beast with wrath because he knows the time is short. Let him who hath understanding reckon the number of the beast, for it is a human number, its number is Six Hundred and Sixty-Six."
 var spaces = "           "
@@ -32,17 +33,11 @@ num = numstr
 #alt1 trimable.append(spaces)
 #alt1 num = new FlatBuffer.from(numstr)
 
-#alt2 txt = new RopeString.from(str)
-#alt2 trimable = new RopeString.from(spaces)
-#alt2 trimable = trimable + str
-#alt2 trimable = trimable + spaces
-#alt2 num = new RopeString.from(numstr)
-
-#alt3 txt = new RopeString.from(str)
-#alt3 trimable = new RopeString.from(spaces)
-#alt3 trimable = trimable + str
-#alt3 trimable = trimable + spaces
-#alt3 num = new RopeString.from(numstr)
+#alt3 txt = new RopeBuffer.from(str)
+#alt3 trimable = new RopeBuffer.from(spaces)
+#alt3 trimable.append(str)
+#alt3 trimable.append(spaces)
+#alt3 num = new RopeBuffer.from(numstr)
 
 # Test Text methods on all types of receivers
 
index d8b7eb5..e856eff 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-var x = new FlatBuffer.from("test")
-var y = new FlatBuffer.from("TEST")
+#alt1 import standard::ropes
+
+var x: Buffer = new FlatBuffer.from("test")
+#alt1 x = new RopeBuffer.from("test")
+var y: Buffer = new FlatBuffer.from("TEST")
+#alt1 y = new RopeBuffer.from("TEST")
 
 x.upper
 y.lower