1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <string>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
126e0a1f458e41c08112a130f50636ced03907e29eHoward Hinnant// basic_string<charT,traits,Allocator>&
136e0a1f458e41c08112a130f50636ced03907e29eHoward Hinnant//   replace(size_type pos1, size_type n1, const basic_string<charT,traits,Allocator>& str,
14a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow//           size_type pos2, size_type n2=npos);
15a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow//  the "=npos" was added in C++14
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <string>
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <stdexcept>
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <algorithm>
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
22061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
249dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
269dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttest(S s, typename S::size_type pos1, typename S::size_type n1,
279dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant     S str, typename S::size_type pos2, typename S::size_type n2,
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant     S expected)
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
309dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    typename S::size_type old_size = s.size();
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    S s0 = s;
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    try
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        s.replace(pos1, n1, str, pos2, n2);
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(s.__invariants());
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(pos1 <= old_size && pos2 <= str.size());
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(s == expected);
389dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant        typename S::size_type xlen = std::min(n1, old_size - pos1);
399dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant        typename S::size_type rlen = std::min(n2, str.size() - pos2);
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(s.size() == old_size - xlen + rlen);
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    catch (std::out_of_range&)
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(pos1 > old_size || pos2 > str.size());
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(s == s0);
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
499dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
50a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clowvoid
51a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clowtest_npos(S s, typename S::size_type pos1, typename S::size_type n1,
52a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow     S str, typename S::size_type pos2,
53a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow     S expected)
54a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow{
55a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    typename S::size_type old_size = s.size();
56a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    S s0 = s;
57a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    try
58a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    {
59a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow        s.replace(pos1, n1, str, pos2);
60a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow        assert(s.__invariants());
61a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow        assert(pos1 <= old_size && pos2 <= str.size());
62a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow        assert(s == expected);
63a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow        typename S::size_type xlen = std::min(n1, old_size - pos1);
64a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow        typename S::size_type rlen = std::min(S::npos, str.size() - pos2);
65a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow        assert(s.size() == old_size - xlen + rlen);
66a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    }
67a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    catch (std::out_of_range&)
68a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    {
69a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow        assert(pos1 > old_size || pos2 > str.size());
70a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow        assert(s == s0);
71a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    }
72a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow}
73a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow
74a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow
75a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clowtemplate <class S>
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test0()
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S(""), 0, 0, S(""));
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S(""), 0, 1, S(""));
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S(""), 1, 0, S("can't happen"));
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 0, 0, S(""));
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 0, 1, S("1"));
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 0, 2, S("12"));
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 0, 4, S("1234"));
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 0, 5, S("12345"));
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 0, 6, S("12345"));
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 1, 0, S(""));
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 1, 1, S("2"));
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 1, 2, S("23"));
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 1, 3, S("234"));
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 1, 4, S("2345"));
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 1, 5, S("2345"));
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 2, 0, S(""));
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 2, 1, S("3"));
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 2, 2, S("34"));
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 2, 3, S("345"));
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 2, 4, S("345"));
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 4, 0, S(""));
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 4, 1, S("5"));
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 4, 2, S("5"));
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 5, 0, S(""));
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 5, 1, S(""));
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), 6, 0, S("can't happen"));
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 0, 0, S(""));
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 0, 1, S("1"));
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 0, 5, S("12345"));
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 0, 9, S("123456789"));
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 0, 10, S("1234567890"));
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 0, 11, S("1234567890"));
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 1, 0, S(""));
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 1, 1, S("2"));
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 1, 4, S("2345"));
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 1, 8, S("23456789"));
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 1, 9, S("234567890"));
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 1, 10, S("234567890"));
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 5, 0, S(""));
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 5, 1, S("6"));
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 5, 2, S("67"));
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 5, 4, S("6789"));
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 5, 5, S("67890"));
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 5, 6, S("67890"));
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 9, 0, S(""));
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 9, 1, S("0"));
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 9, 2, S("0"));
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 10, 0, S(""));
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 10, 1, S(""));
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), 11, 0, S("can't happen"));
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 0, 0, S(""));
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 0, 1, S("1"));
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 0, 10, S("1234567890"));
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 0, 19, S("1234567890123456789"));
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 0, 20, S("12345678901234567890"));
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 0, 21, S("12345678901234567890"));
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 1, 0, S(""));
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 1, 1, S("2"));
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 1, 9, S("234567890"));
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 1, 18, S("234567890123456789"));
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 1, 19, S("2345678901234567890"));
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 1, 20, S("2345678901234567890"));
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 10, 0, S(""));
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 10, 1, S("1"));
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 10, 5, S("12345"));
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 10, 9, S("123456789"));
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 10, 10, S("1234567890"));
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 10, 11, S("1234567890"));
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 19, 0, S(""));
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 19, 1, S("0"));
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 19, 2, S("0"));
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 20, 0, S(""));
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 20, 1, S(""));
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S(""), 0, 0, S(""));
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S(""), 0, 1, S(""));
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S(""), 1, 0, S("can't happen"));
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 0, 0, S(""));
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 0, 1, S("1"));
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 0, 2, S("12"));
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 0, 4, S("1234"));
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 0, 5, S("12345"));
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 0, 6, S("12345"));
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 1, 0, S(""));
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 1, 1, S("2"));
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 1, 2, S("23"));
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 1, 3, S("234"));
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 1, 4, S("2345"));
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 1, 5, S("2345"));
167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 2, 0, S(""));
168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 2, 1, S("3"));
169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 2, 2, S("34"));
170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 2, 3, S("345"));
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 2, 4, S("345"));
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 4, 0, S(""));
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 4, 1, S("5"));
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 4, 2, S("5"));
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 5, 0, S(""));
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 5, 1, S(""));
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), 6, 0, S("can't happen"));
178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1809dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test1()
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 0, 0, S(""));
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 0, 1, S("1"));
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 0, 5, S("12345"));
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 0, 9, S("123456789"));
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 0, 10, S("1234567890"));
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 0, 11, S("1234567890"));
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 1, 0, S(""));
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 1, 1, S("2"));
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 1, 4, S("2345"));
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 1, 8, S("23456789"));
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 1, 9, S("234567890"));
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 1, 10, S("234567890"));
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 5, 0, S(""));
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 5, 1, S("6"));
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 5, 2, S("67"));
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 5, 4, S("6789"));
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 5, 5, S("67890"));
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 5, 6, S("67890"));
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 9, 0, S(""));
202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 9, 1, S("0"));
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 9, 2, S("0"));
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 10, 0, S(""));
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 10, 1, S(""));
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), 11, 0, S("can't happen"));
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 0, 0, S(""));
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 0, 1, S("1"));
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 0, 10, S("1234567890"));
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 0, 19, S("1234567890123456789"));
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 0, 20, S("12345678901234567890"));
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 0, 21, S("12345678901234567890"));
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 1, 0, S(""));
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 1, 1, S("2"));
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 1, 9, S("234567890"));
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 1, 18, S("234567890123456789"));
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 1, 19, S("2345678901234567890"));
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 1, 20, S("2345678901234567890"));
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 10, 0, S(""));
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 10, 1, S("1"));
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 10, 5, S("12345"));
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 10, 9, S("123456789"));
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 10, 10, S("1234567890"));
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 10, 11, S("1234567890"));
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 19, 0, S(""));
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 19, 1, S("0"));
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 19, 2, S("0"));
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 20, 0, S(""));
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 20, 1, S(""));
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S(""), 0, 0, S("can't happen"));
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S(""), 0, 1, S("can't happen"));
233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S(""), 1, 0, S("can't happen"));
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 0, 0, S("can't happen"));
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 0, 1, S("can't happen"));
236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 0, 2, S("can't happen"));
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 0, 4, S("can't happen"));
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 0, 5, S("can't happen"));
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 0, 6, S("can't happen"));
240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 1, 0, S("can't happen"));
241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 1, 1, S("can't happen"));
242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 1, 2, S("can't happen"));
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 1, 3, S("can't happen"));
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 1, 4, S("can't happen"));
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 1, 5, S("can't happen"));
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 2, 0, S("can't happen"));
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 2, 1, S("can't happen"));
248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 2, 2, S("can't happen"));
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 2, 3, S("can't happen"));
250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 2, 4, S("can't happen"));
251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 4, 0, S("can't happen"));
252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 4, 1, S("can't happen"));
253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 4, 2, S("can't happen"));
254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 5, 0, S("can't happen"));
255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 5, 1, S("can't happen"));
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), 6, 0, S("can't happen"));
257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 0, 0, S("can't happen"));
258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 0, 1, S("can't happen"));
259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 0, 5, S("can't happen"));
260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 0, 9, S("can't happen"));
261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 0, 10, S("can't happen"));
262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 0, 11, S("can't happen"));
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 1, 0, S("can't happen"));
264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 1, 1, S("can't happen"));
265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 1, 4, S("can't happen"));
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 1, 8, S("can't happen"));
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 1, 9, S("can't happen"));
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 1, 10, S("can't happen"));
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 5, 0, S("can't happen"));
270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 5, 1, S("can't happen"));
271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 5, 2, S("can't happen"));
272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 5, 4, S("can't happen"));
273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 5, 5, S("can't happen"));
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 5, 6, S("can't happen"));
275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 9, 0, S("can't happen"));
276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 9, 1, S("can't happen"));
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 9, 2, S("can't happen"));
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 10, 0, S("can't happen"));
279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 10, 1, S("can't happen"));
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), 11, 0, S("can't happen"));
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 0, 0, S("can't happen"));
282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 0, 1, S("can't happen"));
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
2859dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test2()
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 0, 10, S("can't happen"));
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 0, 19, S("can't happen"));
290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 0, 20, S("can't happen"));
291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 0, 21, S("can't happen"));
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 1, 0, S("can't happen"));
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 1, 1, S("can't happen"));
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 1, 9, S("can't happen"));
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 1, 18, S("can't happen"));
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 1, 19, S("can't happen"));
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 1, 20, S("can't happen"));
298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 10, 0, S("can't happen"));
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 10, 1, S("can't happen"));
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 10, 5, S("can't happen"));
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 10, 9, S("can't happen"));
302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 10, 10, S("can't happen"));
303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 10, 11, S("can't happen"));
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 19, 0, S("can't happen"));
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 19, 1, S("can't happen"));
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 19, 2, S("can't happen"));
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 20, 0, S("can't happen"));
308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 20, 1, S("can't happen"));
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S(""), 0, 0, S("abcde"));
311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S(""), 0, 1, S("abcde"));
312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S(""), 1, 0, S("can't happen"));
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 0, 0, S("abcde"));
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 0, 1, S("1abcde"));
315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 0, 2, S("12abcde"));
316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 0, 4, S("1234abcde"));
317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 0, 5, S("12345abcde"));
318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 0, 6, S("12345abcde"));
319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 1, 0, S("abcde"));
320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 1, 1, S("2abcde"));
321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 1, 2, S("23abcde"));
322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 1, 3, S("234abcde"));
323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 1, 4, S("2345abcde"));
324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 1, 5, S("2345abcde"));
325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 2, 0, S("abcde"));
326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 2, 1, S("3abcde"));
327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 2, 2, S("34abcde"));
328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 2, 3, S("345abcde"));
329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 2, 4, S("345abcde"));
330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 4, 0, S("abcde"));
331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 4, 1, S("5abcde"));
332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 4, 2, S("5abcde"));
333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 5, 0, S("abcde"));
334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 5, 1, S("abcde"));
335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), 6, 0, S("can't happen"));
336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 0, 0, S("abcde"));
337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 0, 1, S("1abcde"));
338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 0, 5, S("12345abcde"));
339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 0, 9, S("123456789abcde"));
340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 0, 10, S("1234567890abcde"));
341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 0, 11, S("1234567890abcde"));
342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 1, 0, S("abcde"));
343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 1, 1, S("2abcde"));
344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 1, 4, S("2345abcde"));
345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 1, 8, S("23456789abcde"));
346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 1, 9, S("234567890abcde"));
347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 1, 10, S("234567890abcde"));
348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 5, 0, S("abcde"));
349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 5, 1, S("6abcde"));
350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 5, 2, S("67abcde"));
351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 5, 4, S("6789abcde"));
352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 5, 5, S("67890abcde"));
353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 5, 6, S("67890abcde"));
354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 9, 0, S("abcde"));
355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 9, 1, S("0abcde"));
356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 9, 2, S("0abcde"));
357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 10, 0, S("abcde"));
358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 10, 1, S("abcde"));
359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), 11, 0, S("can't happen"));
360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 0, 0, S("abcde"));
361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 0, 1, S("1abcde"));
362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 0, 10, S("1234567890abcde"));
363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 0, 19, S("1234567890123456789abcde"));
364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 0, 20, S("12345678901234567890abcde"));
365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 0, 21, S("12345678901234567890abcde"));
366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 1, 0, S("abcde"));
367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 1, 1, S("2abcde"));
368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 1, 9, S("234567890abcde"));
369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 1, 18, S("234567890123456789abcde"));
370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 1, 19, S("2345678901234567890abcde"));
371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 1, 20, S("2345678901234567890abcde"));
372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 10, 0, S("abcde"));
373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 10, 1, S("1abcde"));
374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 10, 5, S("12345abcde"));
375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 10, 9, S("123456789abcde"));
376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 10, 10, S("1234567890abcde"));
377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 10, 11, S("1234567890abcde"));
378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 19, 0, S("abcde"));
379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 19, 1, S("0abcde"));
380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 19, 2, S("0abcde"));
381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 20, 0, S("abcde"));
382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 20, 1, S("abcde"));
383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S(""), 0, 0, S("bcde"));
385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S(""), 0, 1, S("bcde"));
386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S(""), 1, 0, S("can't happen"));
387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 0, 0, S("bcde"));
388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
3909dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test3()
392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 0, 1, S("1bcde"));
394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 0, 2, S("12bcde"));
395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 0, 4, S("1234bcde"));
396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 0, 5, S("12345bcde"));
397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 0, 6, S("12345bcde"));
398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 1, 0, S("bcde"));
399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 1, 1, S("2bcde"));
400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 1, 2, S("23bcde"));
401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 1, 3, S("234bcde"));
402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 1, 4, S("2345bcde"));
403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 1, 5, S("2345bcde"));
404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 2, 0, S("bcde"));
405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 2, 1, S("3bcde"));
406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 2, 2, S("34bcde"));
407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 2, 3, S("345bcde"));
408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 2, 4, S("345bcde"));
409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 4, 0, S("bcde"));
410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 4, 1, S("5bcde"));
411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 4, 2, S("5bcde"));
412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 5, 0, S("bcde"));
413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 5, 1, S("bcde"));
414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), 6, 0, S("can't happen"));
415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 0, 0, S("bcde"));
416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 0, 1, S("1bcde"));
417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 0, 5, S("12345bcde"));
418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 0, 9, S("123456789bcde"));
419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 0, 10, S("1234567890bcde"));
420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 0, 11, S("1234567890bcde"));
421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 1, 0, S("bcde"));
422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 1, 1, S("2bcde"));
423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 1, 4, S("2345bcde"));
424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 1, 8, S("23456789bcde"));
425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 1, 9, S("234567890bcde"));
426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 1, 10, S("234567890bcde"));
427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 5, 0, S("bcde"));
428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 5, 1, S("6bcde"));
429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 5, 2, S("67bcde"));
430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 5, 4, S("6789bcde"));
431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 5, 5, S("67890bcde"));
432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 5, 6, S("67890bcde"));
433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 9, 0, S("bcde"));
434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 9, 1, S("0bcde"));
435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 9, 2, S("0bcde"));
436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 10, 0, S("bcde"));
437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 10, 1, S("bcde"));
438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), 11, 0, S("can't happen"));
439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 0, 0, S("bcde"));
440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 0, 1, S("1bcde"));
441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 0, 10, S("1234567890bcde"));
442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 0, 19, S("1234567890123456789bcde"));
443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 0, 20, S("12345678901234567890bcde"));
444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 0, 21, S("12345678901234567890bcde"));
445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 1, 0, S("bcde"));
446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 1, 1, S("2bcde"));
447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 1, 9, S("234567890bcde"));
448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 1, 18, S("234567890123456789bcde"));
449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 1, 19, S("2345678901234567890bcde"));
450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 1, 20, S("2345678901234567890bcde"));
451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 10, 0, S("bcde"));
452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 10, 1, S("1bcde"));
453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 10, 5, S("12345bcde"));
454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 10, 9, S("123456789bcde"));
455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 10, 10, S("1234567890bcde"));
456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 10, 11, S("1234567890bcde"));
457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 19, 0, S("bcde"));
458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 19, 1, S("0bcde"));
459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 19, 2, S("0bcde"));
460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 20, 0, S("bcde"));
461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 20, 1, S("bcde"));
462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S(""), 0, 0, S("cde"));
464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S(""), 0, 1, S("cde"));
465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S(""), 1, 0, S("can't happen"));
466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 0, 0, S("cde"));
467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 0, 1, S("1cde"));
468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 0, 2, S("12cde"));
469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 0, 4, S("1234cde"));
470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 0, 5, S("12345cde"));
471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 0, 6, S("12345cde"));
472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 1, 0, S("cde"));
473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 1, 1, S("2cde"));
474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 1, 2, S("23cde"));
475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 1, 3, S("234cde"));
476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 1, 4, S("2345cde"));
477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 1, 5, S("2345cde"));
478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 2, 0, S("cde"));
479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 2, 1, S("3cde"));
480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 2, 2, S("34cde"));
481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 2, 3, S("345cde"));
482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 2, 4, S("345cde"));
483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 4, 0, S("cde"));
484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 4, 1, S("5cde"));
485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 4, 2, S("5cde"));
486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 5, 0, S("cde"));
487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 5, 1, S("cde"));
488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), 6, 0, S("can't happen"));
489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 0, 0, S("cde"));
490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 0, 1, S("1cde"));
491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 0, 5, S("12345cde"));
492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 0, 9, S("123456789cde"));
493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4959dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test4()
497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 0, 10, S("1234567890cde"));
499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 0, 11, S("1234567890cde"));
500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 1, 0, S("cde"));
501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 1, 1, S("2cde"));
502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 1, 4, S("2345cde"));
503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 1, 8, S("23456789cde"));
504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 1, 9, S("234567890cde"));
505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 1, 10, S("234567890cde"));
506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 5, 0, S("cde"));
507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 5, 1, S("6cde"));
508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 5, 2, S("67cde"));
509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 5, 4, S("6789cde"));
510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 5, 5, S("67890cde"));
511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 5, 6, S("67890cde"));
512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 9, 0, S("cde"));
513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 9, 1, S("0cde"));
514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 9, 2, S("0cde"));
515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 10, 0, S("cde"));
516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 10, 1, S("cde"));
517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), 11, 0, S("can't happen"));
518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 0, 0, S("cde"));
519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 0, 1, S("1cde"));
520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 0, 10, S("1234567890cde"));
521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 0, 19, S("1234567890123456789cde"));
522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 0, 20, S("12345678901234567890cde"));
523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 0, 21, S("12345678901234567890cde"));
524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 1, 0, S("cde"));
525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 1, 1, S("2cde"));
526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 1, 9, S("234567890cde"));
527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 1, 18, S("234567890123456789cde"));
528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 1, 19, S("2345678901234567890cde"));
529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 1, 20, S("2345678901234567890cde"));
530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 10, 0, S("cde"));
531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 10, 1, S("1cde"));
532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 10, 5, S("12345cde"));
533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 10, 9, S("123456789cde"));
534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 10, 10, S("1234567890cde"));
535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 10, 11, S("1234567890cde"));
536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 19, 0, S("cde"));
537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 19, 1, S("0cde"));
538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 19, 2, S("0cde"));
539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 20, 0, S("cde"));
540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 20, 1, S("cde"));
541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), 21, 0, S("can't happen"));
542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S(""), 0, 0, S("e"));
543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S(""), 0, 1, S("e"));
544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S(""), 1, 0, S("can't happen"));
545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 0, 0, S("e"));
546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 0, 1, S("1e"));
547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 0, 2, S("12e"));
548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 0, 4, S("1234e"));
549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 0, 5, S("12345e"));
550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 0, 6, S("12345e"));
551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 1, 0, S("e"));
552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 1, 1, S("2e"));
553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 1, 2, S("23e"));
554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 1, 3, S("234e"));
555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 1, 4, S("2345e"));
556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 1, 5, S("2345e"));
557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 2, 0, S("e"));
558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 2, 1, S("3e"));
559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 2, 2, S("34e"));
560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 2, 3, S("345e"));
561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 2, 4, S("345e"));
562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 4, 0, S("e"));
563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 4, 1, S("5e"));
564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 4, 2, S("5e"));
565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 5, 0, S("e"));
566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 5, 1, S("e"));
567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), 6, 0, S("can't happen"));
568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 0, 0, S("e"));
569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 0, 1, S("1e"));
570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 0, 5, S("12345e"));
571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 0, 9, S("123456789e"));
572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 0, 10, S("1234567890e"));
573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 0, 11, S("1234567890e"));
574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 1, 0, S("e"));
575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 1, 1, S("2e"));
576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 1, 4, S("2345e"));
577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 1, 8, S("23456789e"));
578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 1, 9, S("234567890e"));
579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 1, 10, S("234567890e"));
580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 5, 0, S("e"));
581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 5, 1, S("6e"));
582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 5, 2, S("67e"));
583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 5, 4, S("6789e"));
584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 5, 5, S("67890e"));
585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 5, 6, S("67890e"));
586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 9, 0, S("e"));
587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 9, 1, S("0e"));
588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 9, 2, S("0e"));
589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 10, 0, S("e"));
590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 10, 1, S("e"));
591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), 11, 0, S("can't happen"));
592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 0, 0, S("e"));
593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 0, 1, S("1e"));
594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 0, 10, S("1234567890e"));
595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 0, 19, S("1234567890123456789e"));
596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 0, 20, S("12345678901234567890e"));
597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 0, 21, S("12345678901234567890e"));
598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6009dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test5()
602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 1, 0, S("e"));
604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 1, 1, S("2e"));
605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 1, 9, S("234567890e"));
606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 1, 18, S("234567890123456789e"));
607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 1, 19, S("2345678901234567890e"));
608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 1, 20, S("2345678901234567890e"));
609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 10, 0, S("e"));
610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 10, 1, S("1e"));
611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 10, 5, S("12345e"));
612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 10, 9, S("123456789e"));
613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 10, 10, S("1234567890e"));
614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 10, 11, S("1234567890e"));
615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 19, 0, S("e"));
616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 19, 1, S("0e"));
617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 19, 2, S("0e"));
618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 20, 0, S("e"));
619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 20, 1, S("e"));
620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), 21, 0, S("can't happen"));
621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S(""), 0, 0, S(""));
622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S(""), 0, 1, S(""));
623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S(""), 1, 0, S("can't happen"));
624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 0, 0, S(""));
625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 0, 1, S("1"));
626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 0, 2, S("12"));
627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 0, 4, S("1234"));
628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 0, 5, S("12345"));
629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 0, 6, S("12345"));
630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 1, 0, S(""));
631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 1, 1, S("2"));
632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 1, 2, S("23"));
633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 1, 3, S("234"));
634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 1, 4, S("2345"));
635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 1, 5, S("2345"));
636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 2, 0, S(""));
637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 2, 1, S("3"));
638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 2, 2, S("34"));
639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 2, 3, S("345"));
640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 2, 4, S("345"));
641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 4, 0, S(""));
642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 4, 1, S("5"));
643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 4, 2, S("5"));
644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 5, 0, S(""));
645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 5, 1, S(""));
646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), 6, 0, S("can't happen"));
647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 0, 0, S(""));
648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 0, 1, S("1"));
649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 0, 5, S("12345"));
650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 0, 9, S("123456789"));
651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 0, 10, S("1234567890"));
652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 0, 11, S("1234567890"));
653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 1, 0, S(""));
654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 1, 1, S("2"));
655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 1, 4, S("2345"));
656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 1, 8, S("23456789"));
657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 1, 9, S("234567890"));
658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 1, 10, S("234567890"));
659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 5, 0, S(""));
660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 5, 1, S("6"));
661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 5, 2, S("67"));
662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 5, 4, S("6789"));
663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 5, 5, S("67890"));
664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 5, 6, S("67890"));
665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 9, 0, S(""));
666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 9, 1, S("0"));
667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 9, 2, S("0"));
668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 10, 0, S(""));
669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 10, 1, S(""));
670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), 11, 0, S("can't happen"));
671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 0, 0, S(""));
672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 0, 1, S("1"));
673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 0, 10, S("1234567890"));
674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 0, 19, S("1234567890123456789"));
675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 0, 20, S("12345678901234567890"));
676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 0, 21, S("12345678901234567890"));
677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 1, 0, S(""));
678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 1, 1, S("2"));
679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 1, 9, S("234567890"));
680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 1, 18, S("234567890123456789"));
681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 1, 19, S("2345678901234567890"));
682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 1, 20, S("2345678901234567890"));
683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 10, 0, S(""));
684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 10, 1, S("1"));
685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 10, 5, S("12345"));
686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 10, 9, S("123456789"));
687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 10, 10, S("1234567890"));
688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 10, 11, S("1234567890"));
689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 19, 0, S(""));
690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 19, 1, S("0"));
691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 19, 2, S("0"));
692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 20, 0, S(""));
693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 20, 1, S(""));
694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), 21, 0, S("can't happen"));
695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S(""), 0, 0, S(""));
696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S(""), 0, 1, S(""));
697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S(""), 1, 0, S("can't happen"));
698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 0, 0, S(""));
699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 0, 1, S("1"));
700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 0, 2, S("12"));
701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 0, 4, S("1234"));
702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 0, 5, S("12345"));
703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
7059dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test6()
707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 0, 6, S("12345"));
709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 1, 0, S(""));
710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 1, 1, S("2"));
711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 1, 2, S("23"));
712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 1, 3, S("234"));
713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 1, 4, S("2345"));
714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 1, 5, S("2345"));
715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 2, 0, S(""));
716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 2, 1, S("3"));
717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 2, 2, S("34"));
718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 2, 3, S("345"));
719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 2, 4, S("345"));
720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 4, 0, S(""));
721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 4, 1, S("5"));
722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 4, 2, S("5"));
723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 5, 0, S(""));
724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 5, 1, S(""));
725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), 6, 0, S("can't happen"));
726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 0, 0, S(""));
727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 0, 1, S("1"));
728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 0, 5, S("12345"));
729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 0, 9, S("123456789"));
730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 0, 10, S("1234567890"));
731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 0, 11, S("1234567890"));
732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 1, 0, S(""));
733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 1, 1, S("2"));
734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 1, 4, S("2345"));
735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 1, 8, S("23456789"));
736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 1, 9, S("234567890"));
737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 1, 10, S("234567890"));
738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 5, 0, S(""));
739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 5, 1, S("6"));
740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 5, 2, S("67"));
741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 5, 4, S("6789"));
742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 5, 5, S("67890"));
743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 5, 6, S("67890"));
744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 9, 0, S(""));
745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 9, 1, S("0"));
746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 9, 2, S("0"));
747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 10, 0, S(""));
748bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 10, 1, S(""));
749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), 11, 0, S("can't happen"));
750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 0, 0, S(""));
751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 0, 1, S("1"));
752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 0, 10, S("1234567890"));
753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 0, 19, S("1234567890123456789"));
754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 0, 20, S("12345678901234567890"));
755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 0, 21, S("12345678901234567890"));
756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 1, 0, S(""));
757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 1, 1, S("2"));
758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 1, 9, S("234567890"));
759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 1, 18, S("234567890123456789"));
760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 1, 19, S("2345678901234567890"));
761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 1, 20, S("2345678901234567890"));
762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 10, 0, S(""));
763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 10, 1, S("1"));
764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 10, 5, S("12345"));
765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 10, 9, S("123456789"));
766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 10, 10, S("1234567890"));
767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 10, 11, S("1234567890"));
768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 19, 0, S(""));
769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 19, 1, S("0"));
770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 19, 2, S("0"));
771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 20, 0, S(""));
772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 20, 1, S(""));
773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), 21, 0, S("can't happen"));
774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S(""), 0, 0, S("abcde"));
775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S(""), 0, 1, S("abcde"));
776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S(""), 1, 0, S("can't happen"));
777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 0, 0, S("abcde"));
778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 0, 1, S("a1bcde"));
779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 0, 2, S("a12bcde"));
780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 0, 4, S("a1234bcde"));
781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 0, 5, S("a12345bcde"));
782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 0, 6, S("a12345bcde"));
783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 1, 0, S("abcde"));
784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 1, 1, S("a2bcde"));
785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 1, 2, S("a23bcde"));
786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 1, 3, S("a234bcde"));
787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 1, 4, S("a2345bcde"));
788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 1, 5, S("a2345bcde"));
789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 2, 0, S("abcde"));
790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 2, 1, S("a3bcde"));
791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 2, 2, S("a34bcde"));
792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 2, 3, S("a345bcde"));
793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 2, 4, S("a345bcde"));
794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 4, 0, S("abcde"));
795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 4, 1, S("a5bcde"));
796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 4, 2, S("a5bcde"));
797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 5, 0, S("abcde"));
798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 5, 1, S("abcde"));
799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), 6, 0, S("can't happen"));
800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 0, 0, S("abcde"));
801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 0, 1, S("a1bcde"));
802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 0, 5, S("a12345bcde"));
803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 0, 9, S("a123456789bcde"));
804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 0, 10, S("a1234567890bcde"));
805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 0, 11, S("a1234567890bcde"));
806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 1, 0, S("abcde"));
807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 1, 1, S("a2bcde"));
808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
8109dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test7()
812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 1, 4, S("a2345bcde"));
814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 1, 8, S("a23456789bcde"));
815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 1, 9, S("a234567890bcde"));
816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 1, 10, S("a234567890bcde"));
817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 5, 0, S("abcde"));
818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 5, 1, S("a6bcde"));
819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 5, 2, S("a67bcde"));
820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 5, 4, S("a6789bcde"));
821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 5, 5, S("a67890bcde"));
822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 5, 6, S("a67890bcde"));
823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 9, 0, S("abcde"));
824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 9, 1, S("a0bcde"));
825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 9, 2, S("a0bcde"));
826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 10, 0, S("abcde"));
827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 10, 1, S("abcde"));
828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), 11, 0, S("can't happen"));
829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 0, 0, S("abcde"));
830bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 0, 1, S("a1bcde"));
831bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 0, 10, S("a1234567890bcde"));
832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 0, 19, S("a1234567890123456789bcde"));
833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 0, 20, S("a12345678901234567890bcde"));
834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 0, 21, S("a12345678901234567890bcde"));
835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 1, 0, S("abcde"));
836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 1, 1, S("a2bcde"));
837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 1, 9, S("a234567890bcde"));
838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 1, 18, S("a234567890123456789bcde"));
839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 1, 19, S("a2345678901234567890bcde"));
840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 1, 20, S("a2345678901234567890bcde"));
841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 10, 0, S("abcde"));
842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 10, 1, S("a1bcde"));
843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 10, 5, S("a12345bcde"));
844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 10, 9, S("a123456789bcde"));
845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 10, 10, S("a1234567890bcde"));
846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 10, 11, S("a1234567890bcde"));
847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 19, 0, S("abcde"));
848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 19, 1, S("a0bcde"));
849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 19, 2, S("a0bcde"));
850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 20, 0, S("abcde"));
851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 20, 1, S("abcde"));
852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S(""), 0, 0, S("acde"));
854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S(""), 0, 1, S("acde"));
855bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S(""), 1, 0, S("can't happen"));
856bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 0, 0, S("acde"));
857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 0, 1, S("a1cde"));
858bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 0, 2, S("a12cde"));
859bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 0, 4, S("a1234cde"));
860bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 0, 5, S("a12345cde"));
861bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 0, 6, S("a12345cde"));
862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 1, 0, S("acde"));
863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 1, 1, S("a2cde"));
864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 1, 2, S("a23cde"));
865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 1, 3, S("a234cde"));
866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 1, 4, S("a2345cde"));
867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 1, 5, S("a2345cde"));
868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 2, 0, S("acde"));
869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 2, 1, S("a3cde"));
870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 2, 2, S("a34cde"));
871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 2, 3, S("a345cde"));
872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 2, 4, S("a345cde"));
873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 4, 0, S("acde"));
874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 4, 1, S("a5cde"));
875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 4, 2, S("a5cde"));
876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 5, 0, S("acde"));
877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 5, 1, S("acde"));
878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), 6, 0, S("can't happen"));
879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 0, 0, S("acde"));
880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 0, 1, S("a1cde"));
881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 0, 5, S("a12345cde"));
882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 0, 9, S("a123456789cde"));
883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 0, 10, S("a1234567890cde"));
884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 0, 11, S("a1234567890cde"));
885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 1, 0, S("acde"));
886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 1, 1, S("a2cde"));
887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 1, 4, S("a2345cde"));
888bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 1, 8, S("a23456789cde"));
889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 1, 9, S("a234567890cde"));
890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 1, 10, S("a234567890cde"));
891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 5, 0, S("acde"));
892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 5, 1, S("a6cde"));
893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 5, 2, S("a67cde"));
894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 5, 4, S("a6789cde"));
895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 5, 5, S("a67890cde"));
896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 5, 6, S("a67890cde"));
897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 9, 0, S("acde"));
898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 9, 1, S("a0cde"));
899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 9, 2, S("a0cde"));
900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 10, 0, S("acde"));
901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 10, 1, S("acde"));
902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), 11, 0, S("can't happen"));
903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 0, 0, S("acde"));
904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 0, 1, S("a1cde"));
905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 0, 10, S("a1234567890cde"));
906bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 0, 19, S("a1234567890123456789cde"));
907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 0, 20, S("a12345678901234567890cde"));
908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 0, 21, S("a12345678901234567890cde"));
909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 1, 0, S("acde"));
910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 1, 1, S("a2cde"));
911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 1, 9, S("a234567890cde"));
912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 1, 18, S("a234567890123456789cde"));
913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
9159dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test8()
917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 1, 19, S("a2345678901234567890cde"));
919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 1, 20, S("a2345678901234567890cde"));
920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 10, 0, S("acde"));
921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 10, 1, S("a1cde"));
922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 10, 5, S("a12345cde"));
923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 10, 9, S("a123456789cde"));
924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 10, 10, S("a1234567890cde"));
925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 10, 11, S("a1234567890cde"));
926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 19, 0, S("acde"));
927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 19, 1, S("a0cde"));
928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 19, 2, S("a0cde"));
929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 20, 0, S("acde"));
930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 20, 1, S("acde"));
931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S(""), 0, 0, S("ade"));
933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S(""), 0, 1, S("ade"));
934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S(""), 1, 0, S("can't happen"));
935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 0, 0, S("ade"));
936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 0, 1, S("a1de"));
937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 0, 2, S("a12de"));
938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 0, 4, S("a1234de"));
939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 0, 5, S("a12345de"));
940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 0, 6, S("a12345de"));
941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 1, 0, S("ade"));
942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 1, 1, S("a2de"));
943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 1, 2, S("a23de"));
944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 1, 3, S("a234de"));
945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 1, 4, S("a2345de"));
946bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 1, 5, S("a2345de"));
947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 2, 0, S("ade"));
948bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 2, 1, S("a3de"));
949bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 2, 2, S("a34de"));
950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 2, 3, S("a345de"));
951bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 2, 4, S("a345de"));
952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 4, 0, S("ade"));
953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 4, 1, S("a5de"));
954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 4, 2, S("a5de"));
955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 5, 0, S("ade"));
956bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 5, 1, S("ade"));
957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), 6, 0, S("can't happen"));
958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 0, 0, S("ade"));
959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 0, 1, S("a1de"));
960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 0, 5, S("a12345de"));
961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 0, 9, S("a123456789de"));
962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 0, 10, S("a1234567890de"));
963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 0, 11, S("a1234567890de"));
964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 1, 0, S("ade"));
965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 1, 1, S("a2de"));
966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 1, 4, S("a2345de"));
967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 1, 8, S("a23456789de"));
968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 1, 9, S("a234567890de"));
969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 1, 10, S("a234567890de"));
970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 5, 0, S("ade"));
971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 5, 1, S("a6de"));
972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 5, 2, S("a67de"));
973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 5, 4, S("a6789de"));
974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 5, 5, S("a67890de"));
975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 5, 6, S("a67890de"));
976bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 9, 0, S("ade"));
977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 9, 1, S("a0de"));
978bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 9, 2, S("a0de"));
979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 10, 0, S("ade"));
980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 10, 1, S("ade"));
981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), 11, 0, S("can't happen"));
982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 0, 0, S("ade"));
983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 0, 1, S("a1de"));
984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 0, 10, S("a1234567890de"));
985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 0, 19, S("a1234567890123456789de"));
986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 0, 20, S("a12345678901234567890de"));
987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 0, 21, S("a12345678901234567890de"));
988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 1, 0, S("ade"));
989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 1, 1, S("a2de"));
990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 1, 9, S("a234567890de"));
991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 1, 18, S("a234567890123456789de"));
992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 1, 19, S("a2345678901234567890de"));
993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 1, 20, S("a2345678901234567890de"));
994bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 10, 0, S("ade"));
995bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 10, 1, S("a1de"));
996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 10, 5, S("a12345de"));
997bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 10, 9, S("a123456789de"));
998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 10, 10, S("a1234567890de"));
999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 10, 11, S("a1234567890de"));
1000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 19, 0, S("ade"));
1001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 19, 1, S("a0de"));
1002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 19, 2, S("a0de"));
1003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 20, 0, S("ade"));
1004bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 20, 1, S("ade"));
1005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), 21, 0, S("can't happen"));
1006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S(""), 0, 0, S("ae"));
1007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S(""), 0, 1, S("ae"));
1008bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S(""), 1, 0, S("can't happen"));
1009bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 0, 0, S("ae"));
1010bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 0, 1, S("a1e"));
1011bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 0, 2, S("a12e"));
1012bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 0, 4, S("a1234e"));
1013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 0, 5, S("a12345e"));
1014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 0, 6, S("a12345e"));
1015bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 1, 0, S("ae"));
1016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 1, 1, S("a2e"));
1017bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 1, 2, S("a23e"));
1018bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1019bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10209dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
1021bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test9()
1022bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 1, 3, S("a234e"));
1024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 1, 4, S("a2345e"));
1025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 1, 5, S("a2345e"));
1026bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 2, 0, S("ae"));
1027bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 2, 1, S("a3e"));
1028bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 2, 2, S("a34e"));
1029bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 2, 3, S("a345e"));
1030bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 2, 4, S("a345e"));
1031bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 4, 0, S("ae"));
1032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 4, 1, S("a5e"));
1033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 4, 2, S("a5e"));
1034bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 5, 0, S("ae"));
1035bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 5, 1, S("ae"));
1036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), 6, 0, S("can't happen"));
1037bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 0, 0, S("ae"));
1038bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 0, 1, S("a1e"));
1039bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 0, 5, S("a12345e"));
1040bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 0, 9, S("a123456789e"));
1041bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 0, 10, S("a1234567890e"));
1042bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 0, 11, S("a1234567890e"));
1043bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 1, 0, S("ae"));
1044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 1, 1, S("a2e"));
1045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 1, 4, S("a2345e"));
1046bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 1, 8, S("a23456789e"));
1047bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 1, 9, S("a234567890e"));
1048bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 1, 10, S("a234567890e"));
1049bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 5, 0, S("ae"));
1050bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 5, 1, S("a6e"));
1051bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 5, 2, S("a67e"));
1052bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 5, 4, S("a6789e"));
1053bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 5, 5, S("a67890e"));
1054bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 5, 6, S("a67890e"));
1055bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 9, 0, S("ae"));
1056bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 9, 1, S("a0e"));
1057bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 9, 2, S("a0e"));
1058bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 10, 0, S("ae"));
1059bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 10, 1, S("ae"));
1060bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), 11, 0, S("can't happen"));
1061bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 0, 0, S("ae"));
1062bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 0, 1, S("a1e"));
1063bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 0, 10, S("a1234567890e"));
1064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 0, 19, S("a1234567890123456789e"));
1065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 0, 20, S("a12345678901234567890e"));
1066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 0, 21, S("a12345678901234567890e"));
1067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 1, 0, S("ae"));
1068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 1, 1, S("a2e"));
1069bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 1, 9, S("a234567890e"));
1070bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 1, 18, S("a234567890123456789e"));
1071bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 1, 19, S("a2345678901234567890e"));
1072bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 1, 20, S("a2345678901234567890e"));
1073bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 10, 0, S("ae"));
1074bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 10, 1, S("a1e"));
1075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 10, 5, S("a12345e"));
1076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 10, 9, S("a123456789e"));
1077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 10, 10, S("a1234567890e"));
1078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 10, 11, S("a1234567890e"));
1079bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 19, 0, S("ae"));
1080bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 19, 1, S("a0e"));
1081bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 19, 2, S("a0e"));
1082bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 20, 0, S("ae"));
1083bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 20, 1, S("ae"));
1084bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), 21, 0, S("can't happen"));
1085bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S(""), 0, 0, S("a"));
1086bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S(""), 0, 1, S("a"));
1087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S(""), 1, 0, S("can't happen"));
1088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 0, 0, S("a"));
1089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 0, 1, S("a1"));
1090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 0, 2, S("a12"));
1091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 0, 4, S("a1234"));
1092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 0, 5, S("a12345"));
1093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 0, 6, S("a12345"));
1094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 1, 0, S("a"));
1095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 1, 1, S("a2"));
1096bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 1, 2, S("a23"));
1097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 1, 3, S("a234"));
1098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 1, 4, S("a2345"));
1099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 1, 5, S("a2345"));
1100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 2, 0, S("a"));
1101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 2, 1, S("a3"));
1102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 2, 2, S("a34"));
1103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 2, 3, S("a345"));
1104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 2, 4, S("a345"));
1105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 4, 0, S("a"));
1106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 4, 1, S("a5"));
1107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 4, 2, S("a5"));
1108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 5, 0, S("a"));
1109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 5, 1, S("a"));
1110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), 6, 0, S("can't happen"));
1111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 0, 0, S("a"));
1112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 0, 1, S("a1"));
1113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 0, 5, S("a12345"));
1114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 0, 9, S("a123456789"));
1115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 0, 10, S("a1234567890"));
1116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 0, 11, S("a1234567890"));
1117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 1, 0, S("a"));
1118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 1, 1, S("a2"));
1119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 1, 4, S("a2345"));
1120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 1, 8, S("a23456789"));
1121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 1, 9, S("a234567890"));
1122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 1, 10, S("a234567890"));
1123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
11259dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
1126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test10()
1127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 5, 0, S("a"));
1129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 5, 1, S("a6"));
1130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 5, 2, S("a67"));
1131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 5, 4, S("a6789"));
1132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 5, 5, S("a67890"));
1133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 5, 6, S("a67890"));
1134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 9, 0, S("a"));
1135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 9, 1, S("a0"));
1136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 9, 2, S("a0"));
1137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 10, 0, S("a"));
1138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 10, 1, S("a"));
1139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), 11, 0, S("can't happen"));
1140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 0, 0, S("a"));
1141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 0, 1, S("a1"));
1142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 0, 10, S("a1234567890"));
1143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 0, 19, S("a1234567890123456789"));
1144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 0, 20, S("a12345678901234567890"));
1145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 0, 21, S("a12345678901234567890"));
1146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 1, 0, S("a"));
1147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 1, 1, S("a2"));
1148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 1, 9, S("a234567890"));
1149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 1, 18, S("a234567890123456789"));
1150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 1, 19, S("a2345678901234567890"));
1151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 1, 20, S("a2345678901234567890"));
1152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 10, 0, S("a"));
1153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 10, 1, S("a1"));
1154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 10, 5, S("a12345"));
1155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 10, 9, S("a123456789"));
1156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 10, 10, S("a1234567890"));
1157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 10, 11, S("a1234567890"));
1158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 19, 0, S("a"));
1159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 19, 1, S("a0"));
1160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 19, 2, S("a0"));
1161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 20, 0, S("a"));
1162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 20, 1, S("a"));
1163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), 21, 0, S("can't happen"));
1164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S(""), 0, 0, S("a"));
1165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S(""), 0, 1, S("a"));
1166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S(""), 1, 0, S("can't happen"));
1167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 0, 0, S("a"));
1168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 0, 1, S("a1"));
1169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 0, 2, S("a12"));
1170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 0, 4, S("a1234"));
1171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 0, 5, S("a12345"));
1172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 0, 6, S("a12345"));
1173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 1, 0, S("a"));
1174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 1, 1, S("a2"));
1175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 1, 2, S("a23"));
1176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 1, 3, S("a234"));
1177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 1, 4, S("a2345"));
1178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 1, 5, S("a2345"));
1179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 2, 0, S("a"));
1180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 2, 1, S("a3"));
1181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 2, 2, S("a34"));
1182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 2, 3, S("a345"));
1183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 2, 4, S("a345"));
1184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 4, 0, S("a"));
1185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 4, 1, S("a5"));
1186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 4, 2, S("a5"));
1187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 5, 0, S("a"));
1188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 5, 1, S("a"));
1189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), 6, 0, S("can't happen"));
1190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 0, 0, S("a"));
1191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 0, 1, S("a1"));
1192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 0, 5, S("a12345"));
1193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 0, 9, S("a123456789"));
1194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 0, 10, S("a1234567890"));
1195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 0, 11, S("a1234567890"));
1196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 1, 0, S("a"));
1197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 1, 1, S("a2"));
1198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 1, 4, S("a2345"));
1199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 1, 8, S("a23456789"));
1200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 1, 9, S("a234567890"));
1201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 1, 10, S("a234567890"));
1202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 5, 0, S("a"));
1203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 5, 1, S("a6"));
1204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 5, 2, S("a67"));
1205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 5, 4, S("a6789"));
1206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 5, 5, S("a67890"));
1207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 5, 6, S("a67890"));
1208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 9, 0, S("a"));
1209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 9, 1, S("a0"));
1210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 9, 2, S("a0"));
1211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 10, 0, S("a"));
1212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 10, 1, S("a"));
1213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), 11, 0, S("can't happen"));
1214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 0, 0, S("a"));
1215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 0, 1, S("a1"));
1216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 0, 10, S("a1234567890"));
1217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 0, 19, S("a1234567890123456789"));
1218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 0, 20, S("a12345678901234567890"));
1219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 0, 21, S("a12345678901234567890"));
1220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 1, 0, S("a"));
1221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 1, 1, S("a2"));
1222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 1, 9, S("a234567890"));
1223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 1, 18, S("a234567890123456789"));
1224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 1, 19, S("a2345678901234567890"));
1225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 1, 20, S("a2345678901234567890"));
1226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 10, 0, S("a"));
1227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 10, 1, S("a1"));
1228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12309dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
1231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test11()
1232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 10, 5, S("a12345"));
1234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 10, 9, S("a123456789"));
1235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 10, 10, S("a1234567890"));
1236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 10, 11, S("a1234567890"));
1237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 19, 0, S("a"));
1238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 19, 1, S("a0"));
1239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 19, 2, S("a0"));
1240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 20, 0, S("a"));
1241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 20, 1, S("a"));
1242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), 21, 0, S("can't happen"));
1243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S(""), 0, 0, S("abcde"));
1244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S(""), 0, 1, S("abcde"));
1245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S(""), 1, 0, S("can't happen"));
1246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 0, 0, S("abcde"));
1247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 0, 1, S("ab1cde"));
1248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 0, 2, S("ab12cde"));
1249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 0, 4, S("ab1234cde"));
1250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 0, 5, S("ab12345cde"));
1251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 0, 6, S("ab12345cde"));
1252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 1, 0, S("abcde"));
1253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 1, 1, S("ab2cde"));
1254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 1, 2, S("ab23cde"));
1255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 1, 3, S("ab234cde"));
1256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 1, 4, S("ab2345cde"));
1257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 1, 5, S("ab2345cde"));
1258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 2, 0, S("abcde"));
1259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 2, 1, S("ab3cde"));
1260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 2, 2, S("ab34cde"));
1261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 2, 3, S("ab345cde"));
1262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 2, 4, S("ab345cde"));
1263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 4, 0, S("abcde"));
1264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 4, 1, S("ab5cde"));
1265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 4, 2, S("ab5cde"));
1266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 5, 0, S("abcde"));
1267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 5, 1, S("abcde"));
1268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), 6, 0, S("can't happen"));
1269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 0, 0, S("abcde"));
1270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 0, 1, S("ab1cde"));
1271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 0, 5, S("ab12345cde"));
1272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 0, 9, S("ab123456789cde"));
1273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 0, 10, S("ab1234567890cde"));
1274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 0, 11, S("ab1234567890cde"));
1275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 1, 0, S("abcde"));
1276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 1, 1, S("ab2cde"));
1277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 1, 4, S("ab2345cde"));
1278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 1, 8, S("ab23456789cde"));
1279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 1, 9, S("ab234567890cde"));
1280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 1, 10, S("ab234567890cde"));
1281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 5, 0, S("abcde"));
1282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 5, 1, S("ab6cde"));
1283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 5, 2, S("ab67cde"));
1284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 5, 4, S("ab6789cde"));
1285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 5, 5, S("ab67890cde"));
1286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 5, 6, S("ab67890cde"));
1287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 9, 0, S("abcde"));
1288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 9, 1, S("ab0cde"));
1289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 9, 2, S("ab0cde"));
1290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 10, 0, S("abcde"));
1291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 10, 1, S("abcde"));
1292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), 11, 0, S("can't happen"));
1293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 0, 0, S("abcde"));
1294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 0, 1, S("ab1cde"));
1295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 0, 10, S("ab1234567890cde"));
1296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 0, 19, S("ab1234567890123456789cde"));
1297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 0, 20, S("ab12345678901234567890cde"));
1298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 0, 21, S("ab12345678901234567890cde"));
1299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 1, 0, S("abcde"));
1300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 1, 1, S("ab2cde"));
1301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 1, 9, S("ab234567890cde"));
1302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 1, 18, S("ab234567890123456789cde"));
1303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 1, 19, S("ab2345678901234567890cde"));
1304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 1, 20, S("ab2345678901234567890cde"));
1305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 10, 0, S("abcde"));
1306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 10, 1, S("ab1cde"));
1307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 10, 5, S("ab12345cde"));
1308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 10, 9, S("ab123456789cde"));
1309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 10, 10, S("ab1234567890cde"));
1310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 10, 11, S("ab1234567890cde"));
1311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 19, 0, S("abcde"));
1312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 19, 1, S("ab0cde"));
1313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 19, 2, S("ab0cde"));
1314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 20, 0, S("abcde"));
1315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 20, 1, S("abcde"));
1316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
1317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S(""), 0, 0, S("abde"));
1318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S(""), 0, 1, S("abde"));
1319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S(""), 1, 0, S("can't happen"));
1320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 0, 0, S("abde"));
1321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 0, 1, S("ab1de"));
1322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 0, 2, S("ab12de"));
1323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 0, 4, S("ab1234de"));
1324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 0, 5, S("ab12345de"));
1325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 0, 6, S("ab12345de"));
1326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 1, 0, S("abde"));
1327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 1, 1, S("ab2de"));
1328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 1, 2, S("ab23de"));
1329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 1, 3, S("ab234de"));
1330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 1, 4, S("ab2345de"));
1331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 1, 5, S("ab2345de"));
1332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 2, 0, S("abde"));
1333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
13359dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
1336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test12()
1337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 2, 1, S("ab3de"));
1339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 2, 2, S("ab34de"));
1340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 2, 3, S("ab345de"));
1341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 2, 4, S("ab345de"));
1342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 4, 0, S("abde"));
1343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 4, 1, S("ab5de"));
1344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 4, 2, S("ab5de"));
1345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 5, 0, S("abde"));
1346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 5, 1, S("abde"));
1347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), 6, 0, S("can't happen"));
1348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 0, 0, S("abde"));
1349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 0, 1, S("ab1de"));
1350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 0, 5, S("ab12345de"));
1351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 0, 9, S("ab123456789de"));
1352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 0, 10, S("ab1234567890de"));
1353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 0, 11, S("ab1234567890de"));
1354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 1, 0, S("abde"));
1355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 1, 1, S("ab2de"));
1356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 1, 4, S("ab2345de"));
1357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 1, 8, S("ab23456789de"));
1358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 1, 9, S("ab234567890de"));
1359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 1, 10, S("ab234567890de"));
1360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 5, 0, S("abde"));
1361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 5, 1, S("ab6de"));
1362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 5, 2, S("ab67de"));
1363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 5, 4, S("ab6789de"));
1364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 5, 5, S("ab67890de"));
1365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 5, 6, S("ab67890de"));
1366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 9, 0, S("abde"));
1367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 9, 1, S("ab0de"));
1368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 9, 2, S("ab0de"));
1369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 10, 0, S("abde"));
1370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 10, 1, S("abde"));
1371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), 11, 0, S("can't happen"));
1372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 0, 0, S("abde"));
1373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 0, 1, S("ab1de"));
1374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 0, 10, S("ab1234567890de"));
1375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 0, 19, S("ab1234567890123456789de"));
1376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 0, 20, S("ab12345678901234567890de"));
1377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 0, 21, S("ab12345678901234567890de"));
1378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 1, 0, S("abde"));
1379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 1, 1, S("ab2de"));
1380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 1, 9, S("ab234567890de"));
1381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 1, 18, S("ab234567890123456789de"));
1382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 1, 19, S("ab2345678901234567890de"));
1383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 1, 20, S("ab2345678901234567890de"));
1384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 10, 0, S("abde"));
1385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 10, 1, S("ab1de"));
1386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 10, 5, S("ab12345de"));
1387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 10, 9, S("ab123456789de"));
1388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 10, 10, S("ab1234567890de"));
1389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 10, 11, S("ab1234567890de"));
1390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 19, 0, S("abde"));
1391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 19, 1, S("ab0de"));
1392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 19, 2, S("ab0de"));
1393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 20, 0, S("abde"));
1394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 20, 1, S("abde"));
1395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
1396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S(""), 0, 0, S("abe"));
1397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S(""), 0, 1, S("abe"));
1398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S(""), 1, 0, S("can't happen"));
1399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 0, 0, S("abe"));
1400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 0, 1, S("ab1e"));
1401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 0, 2, S("ab12e"));
1402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 0, 4, S("ab1234e"));
1403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 0, 5, S("ab12345e"));
1404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 0, 6, S("ab12345e"));
1405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 1, 0, S("abe"));
1406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 1, 1, S("ab2e"));
1407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 1, 2, S("ab23e"));
1408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 1, 3, S("ab234e"));
1409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 1, 4, S("ab2345e"));
1410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 1, 5, S("ab2345e"));
1411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 2, 0, S("abe"));
1412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 2, 1, S("ab3e"));
1413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 2, 2, S("ab34e"));
1414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 2, 3, S("ab345e"));
1415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 2, 4, S("ab345e"));
1416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 4, 0, S("abe"));
1417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 4, 1, S("ab5e"));
1418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 4, 2, S("ab5e"));
1419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 5, 0, S("abe"));
1420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 5, 1, S("abe"));
1421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), 6, 0, S("can't happen"));
1422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 0, 0, S("abe"));
1423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 0, 1, S("ab1e"));
1424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 0, 5, S("ab12345e"));
1425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 0, 9, S("ab123456789e"));
1426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 0, 10, S("ab1234567890e"));
1427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 0, 11, S("ab1234567890e"));
1428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 1, 0, S("abe"));
1429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 1, 1, S("ab2e"));
1430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 1, 4, S("ab2345e"));
1431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 1, 8, S("ab23456789e"));
1432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 1, 9, S("ab234567890e"));
1433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 1, 10, S("ab234567890e"));
1434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 5, 0, S("abe"));
1435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 5, 1, S("ab6e"));
1436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 5, 2, S("ab67e"));
1437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 5, 4, S("ab6789e"));
1438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14409dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
1441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test13()
1442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 5, 5, S("ab67890e"));
1444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 5, 6, S("ab67890e"));
1445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 9, 0, S("abe"));
1446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 9, 1, S("ab0e"));
1447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 9, 2, S("ab0e"));
1448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 10, 0, S("abe"));
1449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 10, 1, S("abe"));
1450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), 11, 0, S("can't happen"));
1451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 0, 0, S("abe"));
1452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 0, 1, S("ab1e"));
1453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 0, 10, S("ab1234567890e"));
1454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 0, 19, S("ab1234567890123456789e"));
1455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 0, 20, S("ab12345678901234567890e"));
1456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 0, 21, S("ab12345678901234567890e"));
1457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 1, 0, S("abe"));
1458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 1, 1, S("ab2e"));
1459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 1, 9, S("ab234567890e"));
1460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 1, 18, S("ab234567890123456789e"));
1461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 1, 19, S("ab2345678901234567890e"));
1462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 1, 20, S("ab2345678901234567890e"));
1463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 10, 0, S("abe"));
1464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 10, 1, S("ab1e"));
1465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 10, 5, S("ab12345e"));
1466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 10, 9, S("ab123456789e"));
1467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 10, 10, S("ab1234567890e"));
1468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 10, 11, S("ab1234567890e"));
1469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 19, 0, S("abe"));
1470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 19, 1, S("ab0e"));
1471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 19, 2, S("ab0e"));
1472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 20, 0, S("abe"));
1473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 20, 1, S("abe"));
1474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), 21, 0, S("can't happen"));
1475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S(""), 0, 0, S("ab"));
1476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S(""), 0, 1, S("ab"));
1477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S(""), 1, 0, S("can't happen"));
1478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 0, 0, S("ab"));
1479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 0, 1, S("ab1"));
1480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 0, 2, S("ab12"));
1481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 0, 4, S("ab1234"));
1482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 0, 5, S("ab12345"));
1483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 0, 6, S("ab12345"));
1484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 1, 0, S("ab"));
1485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 1, 1, S("ab2"));
1486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 1, 2, S("ab23"));
1487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 1, 3, S("ab234"));
1488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 1, 4, S("ab2345"));
1489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 1, 5, S("ab2345"));
1490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 2, 0, S("ab"));
1491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 2, 1, S("ab3"));
1492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 2, 2, S("ab34"));
1493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 2, 3, S("ab345"));
1494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 2, 4, S("ab345"));
1495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 4, 0, S("ab"));
1496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 4, 1, S("ab5"));
1497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 4, 2, S("ab5"));
1498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 5, 0, S("ab"));
1499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 5, 1, S("ab"));
1500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), 6, 0, S("can't happen"));
1501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 0, 0, S("ab"));
1502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 0, 1, S("ab1"));
1503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 0, 5, S("ab12345"));
1504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 0, 9, S("ab123456789"));
1505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 0, 10, S("ab1234567890"));
1506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 0, 11, S("ab1234567890"));
1507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 1, 0, S("ab"));
1508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 1, 1, S("ab2"));
1509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 1, 4, S("ab2345"));
1510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 1, 8, S("ab23456789"));
1511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 1, 9, S("ab234567890"));
1512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 1, 10, S("ab234567890"));
1513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 5, 0, S("ab"));
1514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 5, 1, S("ab6"));
1515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 5, 2, S("ab67"));
1516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 5, 4, S("ab6789"));
1517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 5, 5, S("ab67890"));
1518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 5, 6, S("ab67890"));
1519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 9, 0, S("ab"));
1520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 9, 1, S("ab0"));
1521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 9, 2, S("ab0"));
1522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 10, 0, S("ab"));
1523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 10, 1, S("ab"));
1524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), 11, 0, S("can't happen"));
1525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 0, 0, S("ab"));
1526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 0, 1, S("ab1"));
1527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 0, 10, S("ab1234567890"));
1528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 0, 19, S("ab1234567890123456789"));
1529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 0, 20, S("ab12345678901234567890"));
1530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 0, 21, S("ab12345678901234567890"));
1531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 1, 0, S("ab"));
1532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 1, 1, S("ab2"));
1533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 1, 9, S("ab234567890"));
1534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 1, 18, S("ab234567890123456789"));
1535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 1, 19, S("ab2345678901234567890"));
1536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 1, 20, S("ab2345678901234567890"));
1537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 10, 0, S("ab"));
1538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 10, 1, S("ab1"));
1539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 10, 5, S("ab12345"));
1540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 10, 9, S("ab123456789"));
1541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 10, 10, S("ab1234567890"));
1542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 10, 11, S("ab1234567890"));
1543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
15459dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
1546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test14()
1547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 19, 0, S("ab"));
1549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 19, 1, S("ab0"));
1550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 19, 2, S("ab0"));
1551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 20, 0, S("ab"));
1552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 20, 1, S("ab"));
1553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), 21, 0, S("can't happen"));
1554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S(""), 0, 0, S("ab"));
1555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S(""), 0, 1, S("ab"));
1556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S(""), 1, 0, S("can't happen"));
1557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 0, 0, S("ab"));
1558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 0, 1, S("ab1"));
1559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 0, 2, S("ab12"));
1560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 0, 4, S("ab1234"));
1561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 0, 5, S("ab12345"));
1562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 0, 6, S("ab12345"));
1563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 1, 0, S("ab"));
1564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 1, 1, S("ab2"));
1565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 1, 2, S("ab23"));
1566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 1, 3, S("ab234"));
1567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 1, 4, S("ab2345"));
1568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 1, 5, S("ab2345"));
1569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 2, 0, S("ab"));
1570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 2, 1, S("ab3"));
1571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 2, 2, S("ab34"));
1572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 2, 3, S("ab345"));
1573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 2, 4, S("ab345"));
1574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 4, 0, S("ab"));
1575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 4, 1, S("ab5"));
1576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 4, 2, S("ab5"));
1577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 5, 0, S("ab"));
1578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 5, 1, S("ab"));
1579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), 6, 0, S("can't happen"));
1580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 0, 0, S("ab"));
1581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 0, 1, S("ab1"));
1582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 0, 5, S("ab12345"));
1583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 0, 9, S("ab123456789"));
1584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 0, 10, S("ab1234567890"));
1585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 0, 11, S("ab1234567890"));
1586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 1, 0, S("ab"));
1587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 1, 1, S("ab2"));
1588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 1, 4, S("ab2345"));
1589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 1, 8, S("ab23456789"));
1590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 1, 9, S("ab234567890"));
1591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 1, 10, S("ab234567890"));
1592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 5, 0, S("ab"));
1593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 5, 1, S("ab6"));
1594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 5, 2, S("ab67"));
1595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 5, 4, S("ab6789"));
1596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 5, 5, S("ab67890"));
1597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 5, 6, S("ab67890"));
1598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 9, 0, S("ab"));
1599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 9, 1, S("ab0"));
1600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 9, 2, S("ab0"));
1601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 10, 0, S("ab"));
1602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 10, 1, S("ab"));
1603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), 11, 0, S("can't happen"));
1604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 0, 0, S("ab"));
1605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 0, 1, S("ab1"));
1606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 0, 10, S("ab1234567890"));
1607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 0, 19, S("ab1234567890123456789"));
1608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 0, 20, S("ab12345678901234567890"));
1609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 0, 21, S("ab12345678901234567890"));
1610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 1, 0, S("ab"));
1611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 1, 1, S("ab2"));
1612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 1, 9, S("ab234567890"));
1613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 1, 18, S("ab234567890123456789"));
1614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 1, 19, S("ab2345678901234567890"));
1615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 1, 20, S("ab2345678901234567890"));
1616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 10, 0, S("ab"));
1617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 10, 1, S("ab1"));
1618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 10, 5, S("ab12345"));
1619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 10, 9, S("ab123456789"));
1620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 10, 10, S("ab1234567890"));
1621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 10, 11, S("ab1234567890"));
1622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 19, 0, S("ab"));
1623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 19, 1, S("ab0"));
1624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 19, 2, S("ab0"));
1625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 20, 0, S("ab"));
1626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 20, 1, S("ab"));
1627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), 21, 0, S("can't happen"));
1628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S(""), 0, 0, S("abcde"));
1629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S(""), 0, 1, S("abcde"));
1630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S(""), 1, 0, S("can't happen"));
1631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 0, 0, S("abcde"));
1632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 0, 1, S("abcd1e"));
1633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 0, 2, S("abcd12e"));
1634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 0, 4, S("abcd1234e"));
1635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 0, 5, S("abcd12345e"));
1636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 0, 6, S("abcd12345e"));
1637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 1, 0, S("abcde"));
1638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 1, 1, S("abcd2e"));
1639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 1, 2, S("abcd23e"));
1640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 1, 3, S("abcd234e"));
1641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 1, 4, S("abcd2345e"));
1642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 1, 5, S("abcd2345e"));
1643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 2, 0, S("abcde"));
1644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 2, 1, S("abcd3e"));
1645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 2, 2, S("abcd34e"));
1646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 2, 3, S("abcd345e"));
1647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 2, 4, S("abcd345e"));
1648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
16509dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
1651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test15()
1652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 4, 0, S("abcde"));
1654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 4, 1, S("abcd5e"));
1655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 4, 2, S("abcd5e"));
1656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 5, 0, S("abcde"));
1657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 5, 1, S("abcde"));
1658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), 6, 0, S("can't happen"));
1659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 0, 0, S("abcde"));
1660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 0, 1, S("abcd1e"));
1661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 0, 5, S("abcd12345e"));
1662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 0, 9, S("abcd123456789e"));
1663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 0, 10, S("abcd1234567890e"));
1664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 0, 11, S("abcd1234567890e"));
1665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 1, 0, S("abcde"));
1666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 1, 1, S("abcd2e"));
1667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 1, 4, S("abcd2345e"));
1668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 1, 8, S("abcd23456789e"));
1669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 1, 9, S("abcd234567890e"));
1670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 1, 10, S("abcd234567890e"));
1671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 5, 0, S("abcde"));
1672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 5, 1, S("abcd6e"));
1673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 5, 2, S("abcd67e"));
1674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 5, 4, S("abcd6789e"));
1675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 5, 5, S("abcd67890e"));
1676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 5, 6, S("abcd67890e"));
1677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 9, 0, S("abcde"));
1678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 9, 1, S("abcd0e"));
1679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 9, 2, S("abcd0e"));
1680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 10, 0, S("abcde"));
1681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 10, 1, S("abcde"));
1682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), 11, 0, S("can't happen"));
1683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 0, 0, S("abcde"));
1684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 0, 1, S("abcd1e"));
1685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 0, 10, S("abcd1234567890e"));
1686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 0, 19, S("abcd1234567890123456789e"));
1687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 0, 20, S("abcd12345678901234567890e"));
1688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 0, 21, S("abcd12345678901234567890e"));
1689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 1, 0, S("abcde"));
1690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 1, 1, S("abcd2e"));
1691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 1, 9, S("abcd234567890e"));
1692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 1, 18, S("abcd234567890123456789e"));
1693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 1, 19, S("abcd2345678901234567890e"));
1694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 1, 20, S("abcd2345678901234567890e"));
1695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 10, 0, S("abcde"));
1696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 10, 1, S("abcd1e"));
1697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 10, 5, S("abcd12345e"));
1698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 10, 9, S("abcd123456789e"));
1699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 10, 10, S("abcd1234567890e"));
1700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 10, 11, S("abcd1234567890e"));
1701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 19, 0, S("abcde"));
1702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 19, 1, S("abcd0e"));
1703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 19, 2, S("abcd0e"));
1704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 20, 0, S("abcde"));
1705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 20, 1, S("abcde"));
1706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
1707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S(""), 0, 0, S("abcd"));
1708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S(""), 0, 1, S("abcd"));
1709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S(""), 1, 0, S("can't happen"));
1710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 0, 0, S("abcd"));
1711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 0, 1, S("abcd1"));
1712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 0, 2, S("abcd12"));
1713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 0, 4, S("abcd1234"));
1714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 0, 5, S("abcd12345"));
1715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 0, 6, S("abcd12345"));
1716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 1, 0, S("abcd"));
1717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 1, 1, S("abcd2"));
1718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 1, 2, S("abcd23"));
1719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 1, 3, S("abcd234"));
1720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 1, 4, S("abcd2345"));
1721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 1, 5, S("abcd2345"));
1722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 2, 0, S("abcd"));
1723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 2, 1, S("abcd3"));
1724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 2, 2, S("abcd34"));
1725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 2, 3, S("abcd345"));
1726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 2, 4, S("abcd345"));
1727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 4, 0, S("abcd"));
1728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 4, 1, S("abcd5"));
1729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 4, 2, S("abcd5"));
1730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 5, 0, S("abcd"));
1731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 5, 1, S("abcd"));
1732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), 6, 0, S("can't happen"));
1733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 0, 0, S("abcd"));
1734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 0, 1, S("abcd1"));
1735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 0, 5, S("abcd12345"));
1736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 0, 9, S("abcd123456789"));
1737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 0, 10, S("abcd1234567890"));
1738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 0, 11, S("abcd1234567890"));
1739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 1, 0, S("abcd"));
1740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 1, 1, S("abcd2"));
1741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 1, 4, S("abcd2345"));
1742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 1, 8, S("abcd23456789"));
1743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 1, 9, S("abcd234567890"));
1744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 1, 10, S("abcd234567890"));
1745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 5, 0, S("abcd"));
1746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 5, 1, S("abcd6"));
1747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 5, 2, S("abcd67"));
1748bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 5, 4, S("abcd6789"));
1749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 5, 5, S("abcd67890"));
1750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 5, 6, S("abcd67890"));
1751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 9, 0, S("abcd"));
1752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 9, 1, S("abcd0"));
1753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17559dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
1756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test16()
1757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 9, 2, S("abcd0"));
1759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 10, 0, S("abcd"));
1760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 10, 1, S("abcd"));
1761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), 11, 0, S("can't happen"));
1762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 0, 0, S("abcd"));
1763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 0, 1, S("abcd1"));
1764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 0, 10, S("abcd1234567890"));
1765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 0, 19, S("abcd1234567890123456789"));
1766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 0, 20, S("abcd12345678901234567890"));
1767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 0, 21, S("abcd12345678901234567890"));
1768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 1, 0, S("abcd"));
1769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 1, 1, S("abcd2"));
1770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 1, 9, S("abcd234567890"));
1771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 1, 18, S("abcd234567890123456789"));
1772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 1, 19, S("abcd2345678901234567890"));
1773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 1, 20, S("abcd2345678901234567890"));
1774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 10, 0, S("abcd"));
1775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 10, 1, S("abcd1"));
1776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 10, 5, S("abcd12345"));
1777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 10, 9, S("abcd123456789"));
1778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 10, 10, S("abcd1234567890"));
1779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 10, 11, S("abcd1234567890"));
1780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 19, 0, S("abcd"));
1781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 19, 1, S("abcd0"));
1782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 19, 2, S("abcd0"));
1783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 20, 0, S("abcd"));
1784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 20, 1, S("abcd"));
1785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
1786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S(""), 0, 0, S("abcd"));
1787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S(""), 0, 1, S("abcd"));
1788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S(""), 1, 0, S("can't happen"));
1789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 0, 0, S("abcd"));
1790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 0, 1, S("abcd1"));
1791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 0, 2, S("abcd12"));
1792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 0, 4, S("abcd1234"));
1793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 0, 5, S("abcd12345"));
1794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 0, 6, S("abcd12345"));
1795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 1, 0, S("abcd"));
1796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 1, 1, S("abcd2"));
1797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 1, 2, S("abcd23"));
1798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 1, 3, S("abcd234"));
1799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 1, 4, S("abcd2345"));
1800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 1, 5, S("abcd2345"));
1801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 2, 0, S("abcd"));
1802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 2, 1, S("abcd3"));
1803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 2, 2, S("abcd34"));
1804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 2, 3, S("abcd345"));
1805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 2, 4, S("abcd345"));
1806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 4, 0, S("abcd"));
1807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 4, 1, S("abcd5"));
1808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 4, 2, S("abcd5"));
1809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 5, 0, S("abcd"));
1810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 5, 1, S("abcd"));
1811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), 6, 0, S("can't happen"));
1812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 0, 0, S("abcd"));
1813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 0, 1, S("abcd1"));
1814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 0, 5, S("abcd12345"));
1815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 0, 9, S("abcd123456789"));
1816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 0, 10, S("abcd1234567890"));
1817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 0, 11, S("abcd1234567890"));
1818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 1, 0, S("abcd"));
1819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 1, 1, S("abcd2"));
1820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 1, 4, S("abcd2345"));
1821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 1, 8, S("abcd23456789"));
1822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 1, 9, S("abcd234567890"));
1823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 1, 10, S("abcd234567890"));
1824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 5, 0, S("abcd"));
1825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 5, 1, S("abcd6"));
1826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 5, 2, S("abcd67"));
1827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 5, 4, S("abcd6789"));
1828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 5, 5, S("abcd67890"));
1829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 5, 6, S("abcd67890"));
1830bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 9, 0, S("abcd"));
1831bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 9, 1, S("abcd0"));
1832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 9, 2, S("abcd0"));
1833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 10, 0, S("abcd"));
1834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 10, 1, S("abcd"));
1835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), 11, 0, S("can't happen"));
1836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 0, 0, S("abcd"));
1837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 0, 1, S("abcd1"));
1838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 0, 10, S("abcd1234567890"));
1839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 0, 19, S("abcd1234567890123456789"));
1840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 0, 20, S("abcd12345678901234567890"));
1841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 0, 21, S("abcd12345678901234567890"));
1842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 1, 0, S("abcd"));
1843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 1, 1, S("abcd2"));
1844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 1, 9, S("abcd234567890"));
1845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 1, 18, S("abcd234567890123456789"));
1846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 1, 19, S("abcd2345678901234567890"));
1847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 1, 20, S("abcd2345678901234567890"));
1848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 10, 0, S("abcd"));
1849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 10, 1, S("abcd1"));
1850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 10, 5, S("abcd12345"));
1851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 10, 9, S("abcd123456789"));
1852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 10, 10, S("abcd1234567890"));
1853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 10, 11, S("abcd1234567890"));
1854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 19, 0, S("abcd"));
1855bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 19, 1, S("abcd0"));
1856bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 19, 2, S("abcd0"));
1857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 20, 0, S("abcd"));
1858bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1859bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
18609dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
1861bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test17()
1862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 20, 1, S("abcd"));
1864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), 21, 0, S("can't happen"));
1865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S(""), 0, 0, S("abcde"));
1866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S(""), 0, 1, S("abcde"));
1867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S(""), 1, 0, S("can't happen"));
1868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 0, 0, S("abcde"));
1869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 0, 1, S("abcde1"));
1870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 0, 2, S("abcde12"));
1871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 0, 4, S("abcde1234"));
1872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 0, 5, S("abcde12345"));
1873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 0, 6, S("abcde12345"));
1874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 1, 0, S("abcde"));
1875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 1, 1, S("abcde2"));
1876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 1, 2, S("abcde23"));
1877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 1, 3, S("abcde234"));
1878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 1, 4, S("abcde2345"));
1879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 1, 5, S("abcde2345"));
1880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 2, 0, S("abcde"));
1881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 2, 1, S("abcde3"));
1882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 2, 2, S("abcde34"));
1883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 2, 3, S("abcde345"));
1884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 2, 4, S("abcde345"));
1885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 4, 0, S("abcde"));
1886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 4, 1, S("abcde5"));
1887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 4, 2, S("abcde5"));
1888bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 5, 0, S("abcde"));
1889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 5, 1, S("abcde"));
1890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), 6, 0, S("can't happen"));
1891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 0, 0, S("abcde"));
1892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 0, 1, S("abcde1"));
1893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 0, 5, S("abcde12345"));
1894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 0, 9, S("abcde123456789"));
1895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 0, 10, S("abcde1234567890"));
1896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 0, 11, S("abcde1234567890"));
1897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 1, 0, S("abcde"));
1898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 1, 1, S("abcde2"));
1899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 1, 4, S("abcde2345"));
1900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 1, 8, S("abcde23456789"));
1901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 1, 9, S("abcde234567890"));
1902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 1, 10, S("abcde234567890"));
1903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 5, 0, S("abcde"));
1904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 5, 1, S("abcde6"));
1905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 5, 2, S("abcde67"));
1906bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 5, 4, S("abcde6789"));
1907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 5, 5, S("abcde67890"));
1908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 5, 6, S("abcde67890"));
1909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 9, 0, S("abcde"));
1910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 9, 1, S("abcde0"));
1911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 9, 2, S("abcde0"));
1912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 10, 0, S("abcde"));
1913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 10, 1, S("abcde"));
1914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), 11, 0, S("can't happen"));
1915bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 0, 0, S("abcde"));
1916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 0, 1, S("abcde1"));
1917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 0, 10, S("abcde1234567890"));
1918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789"));
1919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890"));
1920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890"));
1921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 1, 0, S("abcde"));
1922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 1, 1, S("abcde2"));
1923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 1, 9, S("abcde234567890"));
1924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 1, 18, S("abcde234567890123456789"));
1925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890"));
1926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890"));
1927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 10, 0, S("abcde"));
1928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 10, 1, S("abcde1"));
1929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 10, 5, S("abcde12345"));
1930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 10, 9, S("abcde123456789"));
1931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 10, 10, S("abcde1234567890"));
1932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 10, 11, S("abcde1234567890"));
1933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 19, 0, S("abcde"));
1934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 19, 1, S("abcde0"));
1935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 19, 2, S("abcde0"));
1936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 20, 0, S("abcde"));
1937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 20, 1, S("abcde"));
1938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
1939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S(""), 0, 0, S("abcde"));
1940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S(""), 0, 1, S("abcde"));
1941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S(""), 1, 0, S("can't happen"));
1942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 0, 0, S("abcde"));
1943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 0, 1, S("abcde1"));
1944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 0, 2, S("abcde12"));
1945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 0, 4, S("abcde1234"));
1946bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 0, 5, S("abcde12345"));
1947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 0, 6, S("abcde12345"));
1948bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 1, 0, S("abcde"));
1949bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 1, 1, S("abcde2"));
1950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 1, 2, S("abcde23"));
1951bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 1, 3, S("abcde234"));
1952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 1, 4, S("abcde2345"));
1953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 1, 5, S("abcde2345"));
1954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 2, 0, S("abcde"));
1955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 2, 1, S("abcde3"));
1956bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 2, 2, S("abcde34"));
1957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 2, 3, S("abcde345"));
1958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 2, 4, S("abcde345"));
1959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 4, 0, S("abcde"));
1960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 4, 1, S("abcde5"));
1961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 4, 2, S("abcde5"));
1962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 5, 0, S("abcde"));
1963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
19659dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
1966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test18()
1967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 5, 1, S("abcde"));
1969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), 6, 0, S("can't happen"));
1970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 0, 0, S("abcde"));
1971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 0, 1, S("abcde1"));
1972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 0, 5, S("abcde12345"));
1973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 0, 9, S("abcde123456789"));
1974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 0, 10, S("abcde1234567890"));
1975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 0, 11, S("abcde1234567890"));
1976bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 1, 0, S("abcde"));
1977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 1, 1, S("abcde2"));
1978bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 1, 4, S("abcde2345"));
1979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 1, 8, S("abcde23456789"));
1980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 1, 9, S("abcde234567890"));
1981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 1, 10, S("abcde234567890"));
1982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 5, 0, S("abcde"));
1983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 5, 1, S("abcde6"));
1984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 5, 2, S("abcde67"));
1985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 5, 4, S("abcde6789"));
1986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 5, 5, S("abcde67890"));
1987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 5, 6, S("abcde67890"));
1988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 9, 0, S("abcde"));
1989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 9, 1, S("abcde0"));
1990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 9, 2, S("abcde0"));
1991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 10, 0, S("abcde"));
1992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 10, 1, S("abcde"));
1993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), 11, 0, S("can't happen"));
1994bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 0, 0, S("abcde"));
1995bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 0, 1, S("abcde1"));
1996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 0, 10, S("abcde1234567890"));
1997bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789"));
1998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890"));
1999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890"));
2000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 1, 0, S("abcde"));
2001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 1, 1, S("abcde2"));
2002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 1, 9, S("abcde234567890"));
2003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 1, 18, S("abcde234567890123456789"));
2004bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890"));
2005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890"));
2006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 10, 0, S("abcde"));
2007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 10, 1, S("abcde1"));
2008bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 10, 5, S("abcde12345"));
2009bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 10, 9, S("abcde123456789"));
2010bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 10, 10, S("abcde1234567890"));
2011bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 10, 11, S("abcde1234567890"));
2012bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 19, 0, S("abcde"));
2013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 19, 1, S("abcde0"));
2014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 19, 2, S("abcde0"));
2015bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 20, 0, S("abcde"));
2016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 20, 1, S("abcde"));
2017bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
2018bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S(""), 0, 0, S("can't happen"));
2019bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S(""), 0, 1, S("can't happen"));
2020bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S(""), 1, 0, S("can't happen"));
2021bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 0, 0, S("can't happen"));
2022bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 0, 1, S("can't happen"));
2023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 0, 2, S("can't happen"));
2024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 0, 4, S("can't happen"));
2025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 0, 5, S("can't happen"));
2026bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 0, 6, S("can't happen"));
2027bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 1, 0, S("can't happen"));
2028bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 1, 1, S("can't happen"));
2029bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 1, 2, S("can't happen"));
2030bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 1, 3, S("can't happen"));
2031bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 1, 4, S("can't happen"));
2032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 1, 5, S("can't happen"));
2033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 2, 0, S("can't happen"));
2034bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 2, 1, S("can't happen"));
2035bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 2, 2, S("can't happen"));
2036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 2, 3, S("can't happen"));
2037bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 2, 4, S("can't happen"));
2038bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 4, 0, S("can't happen"));
2039bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 4, 1, S("can't happen"));
2040bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 4, 2, S("can't happen"));
2041bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 5, 0, S("can't happen"));
2042bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 5, 1, S("can't happen"));
2043bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), 6, 0, S("can't happen"));
2044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 0, 0, S("can't happen"));
2045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 0, 1, S("can't happen"));
2046bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 0, 5, S("can't happen"));
2047bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 0, 9, S("can't happen"));
2048bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 0, 10, S("can't happen"));
2049bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 0, 11, S("can't happen"));
2050bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 1, 0, S("can't happen"));
2051bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 1, 1, S("can't happen"));
2052bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 1, 4, S("can't happen"));
2053bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 1, 8, S("can't happen"));
2054bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 1, 9, S("can't happen"));
2055bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 1, 10, S("can't happen"));
2056bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 5, 0, S("can't happen"));
2057bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 5, 1, S("can't happen"));
2058bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 5, 2, S("can't happen"));
2059bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 5, 4, S("can't happen"));
2060bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 5, 5, S("can't happen"));
2061bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 5, 6, S("can't happen"));
2062bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 9, 0, S("can't happen"));
2063bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 9, 1, S("can't happen"));
2064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 9, 2, S("can't happen"));
2065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 10, 0, S("can't happen"));
2066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 10, 1, S("can't happen"));
2067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), 11, 0, S("can't happen"));
2068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2069bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
20709dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
2071bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test19()
2072bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2073bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 0, 0, S("can't happen"));
2074bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 0, 1, S("can't happen"));
2075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 0, 10, S("can't happen"));
2076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 0, 19, S("can't happen"));
2077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 0, 20, S("can't happen"));
2078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 0, 21, S("can't happen"));
2079bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 1, 0, S("can't happen"));
2080bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 1, 1, S("can't happen"));
2081bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 1, 9, S("can't happen"));
2082bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 1, 18, S("can't happen"));
2083bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 1, 19, S("can't happen"));
2084bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 1, 20, S("can't happen"));
2085bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 10, 0, S("can't happen"));
2086bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 10, 1, S("can't happen"));
2087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 10, 5, S("can't happen"));
2088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 10, 9, S("can't happen"));
2089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 10, 10, S("can't happen"));
2090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 10, 11, S("can't happen"));
2091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 19, 0, S("can't happen"));
2092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 19, 1, S("can't happen"));
2093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 19, 2, S("can't happen"));
2094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 20, 0, S("can't happen"));
2095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 20, 1, S("can't happen"));
2096bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
2097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S(""), 0, 0, S("abcdefghij"));
2098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S(""), 0, 1, S("abcdefghij"));
2099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S(""), 1, 0, S("can't happen"));
2100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 0, 0, S("abcdefghij"));
2101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 0, 1, S("1abcdefghij"));
2102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 0, 2, S("12abcdefghij"));
2103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 0, 4, S("1234abcdefghij"));
2104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 0, 5, S("12345abcdefghij"));
2105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 0, 6, S("12345abcdefghij"));
2106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 1, 0, S("abcdefghij"));
2107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 1, 1, S("2abcdefghij"));
2108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 1, 2, S("23abcdefghij"));
2109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 1, 3, S("234abcdefghij"));
2110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 1, 4, S("2345abcdefghij"));
2111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 1, 5, S("2345abcdefghij"));
2112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 2, 0, S("abcdefghij"));
2113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 2, 1, S("3abcdefghij"));
2114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 2, 2, S("34abcdefghij"));
2115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 2, 3, S("345abcdefghij"));
2116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 2, 4, S("345abcdefghij"));
2117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 4, 0, S("abcdefghij"));
2118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 4, 1, S("5abcdefghij"));
2119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 4, 2, S("5abcdefghij"));
2120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 5, 0, S("abcdefghij"));
2121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 5, 1, S("abcdefghij"));
2122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), 6, 0, S("can't happen"));
2123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 0, 0, S("abcdefghij"));
2124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 0, 1, S("1abcdefghij"));
2125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 0, 5, S("12345abcdefghij"));
2126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 0, 9, S("123456789abcdefghij"));
2127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 0, 10, S("1234567890abcdefghij"));
2128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 0, 11, S("1234567890abcdefghij"));
2129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 1, 0, S("abcdefghij"));
2130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 1, 1, S("2abcdefghij"));
2131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 1, 4, S("2345abcdefghij"));
2132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 1, 8, S("23456789abcdefghij"));
2133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 1, 9, S("234567890abcdefghij"));
2134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 1, 10, S("234567890abcdefghij"));
2135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 5, 0, S("abcdefghij"));
2136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 5, 1, S("6abcdefghij"));
2137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 5, 2, S("67abcdefghij"));
2138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 5, 4, S("6789abcdefghij"));
2139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 5, 5, S("67890abcdefghij"));
2140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 5, 6, S("67890abcdefghij"));
2141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 9, 0, S("abcdefghij"));
2142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 9, 1, S("0abcdefghij"));
2143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 9, 2, S("0abcdefghij"));
2144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 10, 0, S("abcdefghij"));
2145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 10, 1, S("abcdefghij"));
2146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), 11, 0, S("can't happen"));
2147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 0, 0, S("abcdefghij"));
2148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 0, 1, S("1abcdefghij"));
2149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 0, 10, S("1234567890abcdefghij"));
2150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 0, 19, S("1234567890123456789abcdefghij"));
2151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 0, 20, S("12345678901234567890abcdefghij"));
2152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 0, 21, S("12345678901234567890abcdefghij"));
2153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 1, 0, S("abcdefghij"));
2154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 1, 1, S("2abcdefghij"));
2155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 1, 9, S("234567890abcdefghij"));
2156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 1, 18, S("234567890123456789abcdefghij"));
2157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 1, 19, S("2345678901234567890abcdefghij"));
2158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 1, 20, S("2345678901234567890abcdefghij"));
2159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 10, 0, S("abcdefghij"));
2160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 10, 1, S("1abcdefghij"));
2161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 10, 5, S("12345abcdefghij"));
2162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 10, 9, S("123456789abcdefghij"));
2163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 10, 10, S("1234567890abcdefghij"));
2164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 10, 11, S("1234567890abcdefghij"));
2165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 19, 0, S("abcdefghij"));
2166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 19, 1, S("0abcdefghij"));
2167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 19, 2, S("0abcdefghij"));
2168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 20, 0, S("abcdefghij"));
2169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 20, 1, S("abcdefghij"));
2170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
2171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S(""), 0, 0, S("bcdefghij"));
2172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S(""), 0, 1, S("bcdefghij"));
2173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
21759dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
2176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test20()
2177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S(""), 1, 0, S("can't happen"));
2179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 0, 0, S("bcdefghij"));
2180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 0, 1, S("1bcdefghij"));
2181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 0, 2, S("12bcdefghij"));
2182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 0, 4, S("1234bcdefghij"));
2183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 0, 5, S("12345bcdefghij"));
2184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 0, 6, S("12345bcdefghij"));
2185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 1, 0, S("bcdefghij"));
2186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 1, 1, S("2bcdefghij"));
2187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 1, 2, S("23bcdefghij"));
2188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 1, 3, S("234bcdefghij"));
2189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 1, 4, S("2345bcdefghij"));
2190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 1, 5, S("2345bcdefghij"));
2191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 2, 0, S("bcdefghij"));
2192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 2, 1, S("3bcdefghij"));
2193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 2, 2, S("34bcdefghij"));
2194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 2, 3, S("345bcdefghij"));
2195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 2, 4, S("345bcdefghij"));
2196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 4, 0, S("bcdefghij"));
2197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 4, 1, S("5bcdefghij"));
2198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 4, 2, S("5bcdefghij"));
2199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 5, 0, S("bcdefghij"));
2200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 5, 1, S("bcdefghij"));
2201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), 6, 0, S("can't happen"));
2202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 0, 0, S("bcdefghij"));
2203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 0, 1, S("1bcdefghij"));
2204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 0, 5, S("12345bcdefghij"));
2205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 0, 9, S("123456789bcdefghij"));
2206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 0, 10, S("1234567890bcdefghij"));
2207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 0, 11, S("1234567890bcdefghij"));
2208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 1, 0, S("bcdefghij"));
2209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 1, 1, S("2bcdefghij"));
2210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 1, 4, S("2345bcdefghij"));
2211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 1, 8, S("23456789bcdefghij"));
2212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 1, 9, S("234567890bcdefghij"));
2213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 1, 10, S("234567890bcdefghij"));
2214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 5, 0, S("bcdefghij"));
2215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 5, 1, S("6bcdefghij"));
2216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 5, 2, S("67bcdefghij"));
2217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 5, 4, S("6789bcdefghij"));
2218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 5, 5, S("67890bcdefghij"));
2219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 5, 6, S("67890bcdefghij"));
2220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 9, 0, S("bcdefghij"));
2221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 9, 1, S("0bcdefghij"));
2222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 9, 2, S("0bcdefghij"));
2223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 10, 0, S("bcdefghij"));
2224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 10, 1, S("bcdefghij"));
2225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), 11, 0, S("can't happen"));
2226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 0, 0, S("bcdefghij"));
2227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 0, 1, S("1bcdefghij"));
2228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 0, 10, S("1234567890bcdefghij"));
2229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 0, 19, S("1234567890123456789bcdefghij"));
2230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 0, 20, S("12345678901234567890bcdefghij"));
2231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 0, 21, S("12345678901234567890bcdefghij"));
2232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 1, 0, S("bcdefghij"));
2233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 1, 1, S("2bcdefghij"));
2234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 1, 9, S("234567890bcdefghij"));
2235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 1, 18, S("234567890123456789bcdefghij"));
2236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 1, 19, S("2345678901234567890bcdefghij"));
2237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 1, 20, S("2345678901234567890bcdefghij"));
2238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 10, 0, S("bcdefghij"));
2239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 10, 1, S("1bcdefghij"));
2240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 10, 5, S("12345bcdefghij"));
2241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 10, 9, S("123456789bcdefghij"));
2242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 10, 10, S("1234567890bcdefghij"));
2243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 10, 11, S("1234567890bcdefghij"));
2244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 19, 0, S("bcdefghij"));
2245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 19, 1, S("0bcdefghij"));
2246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 19, 2, S("0bcdefghij"));
2247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 20, 0, S("bcdefghij"));
2248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 20, 1, S("bcdefghij"));
2249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
2250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S(""), 0, 0, S("fghij"));
2251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S(""), 0, 1, S("fghij"));
2252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S(""), 1, 0, S("can't happen"));
2253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 0, 0, S("fghij"));
2254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 0, 1, S("1fghij"));
2255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 0, 2, S("12fghij"));
2256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 0, 4, S("1234fghij"));
2257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 0, 5, S("12345fghij"));
2258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 0, 6, S("12345fghij"));
2259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 1, 0, S("fghij"));
2260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 1, 1, S("2fghij"));
2261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 1, 2, S("23fghij"));
2262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 1, 3, S("234fghij"));
2263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 1, 4, S("2345fghij"));
2264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 1, 5, S("2345fghij"));
2265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 2, 0, S("fghij"));
2266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 2, 1, S("3fghij"));
2267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 2, 2, S("34fghij"));
2268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 2, 3, S("345fghij"));
2269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 2, 4, S("345fghij"));
2270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 4, 0, S("fghij"));
2271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 4, 1, S("5fghij"));
2272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 4, 2, S("5fghij"));
2273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 5, 0, S("fghij"));
2274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 5, 1, S("fghij"));
2275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), 6, 0, S("can't happen"));
2276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 0, 0, S("fghij"));
2277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 0, 1, S("1fghij"));
2278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
22809dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
2281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test21()
2282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 0, 5, S("12345fghij"));
2284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 0, 9, S("123456789fghij"));
2285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 0, 10, S("1234567890fghij"));
2286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 0, 11, S("1234567890fghij"));
2287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 1, 0, S("fghij"));
2288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 1, 1, S("2fghij"));
2289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 1, 4, S("2345fghij"));
2290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 1, 8, S("23456789fghij"));
2291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 1, 9, S("234567890fghij"));
2292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 1, 10, S("234567890fghij"));
2293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 5, 0, S("fghij"));
2294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 5, 1, S("6fghij"));
2295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 5, 2, S("67fghij"));
2296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 5, 4, S("6789fghij"));
2297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 5, 5, S("67890fghij"));
2298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 5, 6, S("67890fghij"));
2299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 9, 0, S("fghij"));
2300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 9, 1, S("0fghij"));
2301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 9, 2, S("0fghij"));
2302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 10, 0, S("fghij"));
2303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 10, 1, S("fghij"));
2304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), 11, 0, S("can't happen"));
2305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 0, 0, S("fghij"));
2306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 0, 1, S("1fghij"));
2307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 0, 10, S("1234567890fghij"));
2308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 0, 19, S("1234567890123456789fghij"));
2309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 0, 20, S("12345678901234567890fghij"));
2310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 0, 21, S("12345678901234567890fghij"));
2311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 1, 0, S("fghij"));
2312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 1, 1, S("2fghij"));
2313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 1, 9, S("234567890fghij"));
2314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 1, 18, S("234567890123456789fghij"));
2315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 1, 19, S("2345678901234567890fghij"));
2316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 1, 20, S("2345678901234567890fghij"));
2317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 10, 0, S("fghij"));
2318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 10, 1, S("1fghij"));
2319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 10, 5, S("12345fghij"));
2320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 10, 9, S("123456789fghij"));
2321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 10, 10, S("1234567890fghij"));
2322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 10, 11, S("1234567890fghij"));
2323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 19, 0, S("fghij"));
2324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 19, 1, S("0fghij"));
2325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 19, 2, S("0fghij"));
2326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 20, 0, S("fghij"));
2327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 20, 1, S("fghij"));
2328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), 21, 0, S("can't happen"));
2329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S(""), 0, 0, S("j"));
2330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S(""), 0, 1, S("j"));
2331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S(""), 1, 0, S("can't happen"));
2332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 0, 0, S("j"));
2333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 0, 1, S("1j"));
2334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 0, 2, S("12j"));
2335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 0, 4, S("1234j"));
2336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 0, 5, S("12345j"));
2337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 0, 6, S("12345j"));
2338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 1, 0, S("j"));
2339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 1, 1, S("2j"));
2340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 1, 2, S("23j"));
2341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 1, 3, S("234j"));
2342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 1, 4, S("2345j"));
2343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 1, 5, S("2345j"));
2344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 2, 0, S("j"));
2345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 2, 1, S("3j"));
2346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 2, 2, S("34j"));
2347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 2, 3, S("345j"));
2348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 2, 4, S("345j"));
2349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 4, 0, S("j"));
2350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 4, 1, S("5j"));
2351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 4, 2, S("5j"));
2352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 5, 0, S("j"));
2353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 5, 1, S("j"));
2354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), 6, 0, S("can't happen"));
2355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 0, 0, S("j"));
2356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 0, 1, S("1j"));
2357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 0, 5, S("12345j"));
2358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 0, 9, S("123456789j"));
2359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 0, 10, S("1234567890j"));
2360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 0, 11, S("1234567890j"));
2361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 1, 0, S("j"));
2362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 1, 1, S("2j"));
2363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 1, 4, S("2345j"));
2364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 1, 8, S("23456789j"));
2365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 1, 9, S("234567890j"));
2366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 1, 10, S("234567890j"));
2367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 5, 0, S("j"));
2368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 5, 1, S("6j"));
2369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 5, 2, S("67j"));
2370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 5, 4, S("6789j"));
2371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 5, 5, S("67890j"));
2372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 5, 6, S("67890j"));
2373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 9, 0, S("j"));
2374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 9, 1, S("0j"));
2375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 9, 2, S("0j"));
2376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 10, 0, S("j"));
2377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 10, 1, S("j"));
2378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), 11, 0, S("can't happen"));
2379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 0, 0, S("j"));
2380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 0, 1, S("1j"));
2381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 0, 10, S("1234567890j"));
2382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 0, 19, S("1234567890123456789j"));
2383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
23859dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
2386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test22()
2387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 0, 20, S("12345678901234567890j"));
2389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 0, 21, S("12345678901234567890j"));
2390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 1, 0, S("j"));
2391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 1, 1, S("2j"));
2392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 1, 9, S("234567890j"));
2393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 1, 18, S("234567890123456789j"));
2394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 1, 19, S("2345678901234567890j"));
2395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 1, 20, S("2345678901234567890j"));
2396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 10, 0, S("j"));
2397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 10, 1, S("1j"));
2398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 10, 5, S("12345j"));
2399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 10, 9, S("123456789j"));
2400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 10, 10, S("1234567890j"));
2401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 10, 11, S("1234567890j"));
2402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 19, 0, S("j"));
2403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 19, 1, S("0j"));
2404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 19, 2, S("0j"));
2405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 20, 0, S("j"));
2406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 20, 1, S("j"));
2407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), 21, 0, S("can't happen"));
2408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S(""), 0, 0, S(""));
2409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S(""), 0, 1, S(""));
2410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S(""), 1, 0, S("can't happen"));
2411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 0, 0, S(""));
2412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 0, 1, S("1"));
2413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 0, 2, S("12"));
2414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 0, 4, S("1234"));
2415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 0, 5, S("12345"));
2416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 0, 6, S("12345"));
2417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 1, 0, S(""));
2418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 1, 1, S("2"));
2419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 1, 2, S("23"));
2420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 1, 3, S("234"));
2421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 1, 4, S("2345"));
2422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 1, 5, S("2345"));
2423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 2, 0, S(""));
2424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 2, 1, S("3"));
2425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 2, 2, S("34"));
2426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 2, 3, S("345"));
2427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 2, 4, S("345"));
2428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 4, 0, S(""));
2429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 4, 1, S("5"));
2430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 4, 2, S("5"));
2431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 5, 0, S(""));
2432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 5, 1, S(""));
2433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), 6, 0, S("can't happen"));
2434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 0, 0, S(""));
2435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 0, 1, S("1"));
2436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 0, 5, S("12345"));
2437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 0, 9, S("123456789"));
2438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 0, 10, S("1234567890"));
2439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 0, 11, S("1234567890"));
2440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 1, 0, S(""));
2441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 1, 1, S("2"));
2442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 1, 4, S("2345"));
2443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 1, 8, S("23456789"));
2444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 1, 9, S("234567890"));
2445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 1, 10, S("234567890"));
2446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 5, 0, S(""));
2447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 5, 1, S("6"));
2448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 5, 2, S("67"));
2449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 5, 4, S("6789"));
2450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 5, 5, S("67890"));
2451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 5, 6, S("67890"));
2452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 9, 0, S(""));
2453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 9, 1, S("0"));
2454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 9, 2, S("0"));
2455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 10, 0, S(""));
2456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 10, 1, S(""));
2457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), 11, 0, S("can't happen"));
2458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 0, 0, S(""));
2459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 0, 1, S("1"));
2460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 0, 10, S("1234567890"));
2461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 0, 19, S("1234567890123456789"));
2462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 0, 20, S("12345678901234567890"));
2463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 0, 21, S("12345678901234567890"));
2464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 1, 0, S(""));
2465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 1, 1, S("2"));
2466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 1, 9, S("234567890"));
2467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 1, 18, S("234567890123456789"));
2468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 1, 19, S("2345678901234567890"));
2469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 1, 20, S("2345678901234567890"));
2470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 10, 0, S(""));
2471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 10, 1, S("1"));
2472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 10, 5, S("12345"));
2473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 10, 9, S("123456789"));
2474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 10, 10, S("1234567890"));
2475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 10, 11, S("1234567890"));
2476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 19, 0, S(""));
2477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 19, 1, S("0"));
2478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 19, 2, S("0"));
2479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 20, 0, S(""));
2480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 20, 1, S(""));
2481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), 21, 0, S("can't happen"));
2482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S(""), 0, 0, S(""));
2483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S(""), 0, 1, S(""));
2484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S(""), 1, 0, S("can't happen"));
2485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 0, 0, S(""));
2486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 0, 1, S("1"));
2487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 0, 2, S("12"));
2488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
24909dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
2491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test23()
2492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 0, 4, S("1234"));
2494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 0, 5, S("12345"));
2495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 0, 6, S("12345"));
2496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 1, 0, S(""));
2497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 1, 1, S("2"));
2498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 1, 2, S("23"));
2499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 1, 3, S("234"));
2500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 1, 4, S("2345"));
2501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 1, 5, S("2345"));
2502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 2, 0, S(""));
2503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 2, 1, S("3"));
2504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 2, 2, S("34"));
2505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 2, 3, S("345"));
2506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 2, 4, S("345"));
2507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 4, 0, S(""));
2508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 4, 1, S("5"));
2509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 4, 2, S("5"));
2510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 5, 0, S(""));
2511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 5, 1, S(""));
2512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), 6, 0, S("can't happen"));
2513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 0, 0, S(""));
2514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 0, 1, S("1"));
2515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 0, 5, S("12345"));
2516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 0, 9, S("123456789"));
2517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 0, 10, S("1234567890"));
2518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 0, 11, S("1234567890"));
2519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 1, 0, S(""));
2520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 1, 1, S("2"));
2521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 1, 4, S("2345"));
2522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 1, 8, S("23456789"));
2523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 1, 9, S("234567890"));
2524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 1, 10, S("234567890"));
2525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 5, 0, S(""));
2526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 5, 1, S("6"));
2527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 5, 2, S("67"));
2528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 5, 4, S("6789"));
2529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 5, 5, S("67890"));
2530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 5, 6, S("67890"));
2531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 9, 0, S(""));
2532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 9, 1, S("0"));
2533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 9, 2, S("0"));
2534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 10, 0, S(""));
2535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 10, 1, S(""));
2536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), 11, 0, S("can't happen"));
2537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 0, 0, S(""));
2538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 0, 1, S("1"));
2539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 0, 10, S("1234567890"));
2540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 0, 19, S("1234567890123456789"));
2541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 0, 20, S("12345678901234567890"));
2542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 0, 21, S("12345678901234567890"));
2543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 1, 0, S(""));
2544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 1, 1, S("2"));
2545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 1, 9, S("234567890"));
2546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 1, 18, S("234567890123456789"));
2547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 1, 19, S("2345678901234567890"));
2548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 1, 20, S("2345678901234567890"));
2549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 10, 0, S(""));
2550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 10, 1, S("1"));
2551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 10, 5, S("12345"));
2552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 10, 9, S("123456789"));
2553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 10, 10, S("1234567890"));
2554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 10, 11, S("1234567890"));
2555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 19, 0, S(""));
2556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 19, 1, S("0"));
2557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 19, 2, S("0"));
2558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 20, 0, S(""));
2559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 20, 1, S(""));
2560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), 21, 0, S("can't happen"));
2561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S(""), 0, 0, S("abcdefghij"));
2562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S(""), 0, 1, S("abcdefghij"));
2563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S(""), 1, 0, S("can't happen"));
2564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 0, 0, S("abcdefghij"));
2565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 0, 1, S("a1bcdefghij"));
2566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 0, 2, S("a12bcdefghij"));
2567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 0, 4, S("a1234bcdefghij"));
2568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 0, 5, S("a12345bcdefghij"));
2569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 0, 6, S("a12345bcdefghij"));
2570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 1, 0, S("abcdefghij"));
2571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 1, 1, S("a2bcdefghij"));
2572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 1, 2, S("a23bcdefghij"));
2573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 1, 3, S("a234bcdefghij"));
2574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 1, 4, S("a2345bcdefghij"));
2575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 1, 5, S("a2345bcdefghij"));
2576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 2, 0, S("abcdefghij"));
2577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 2, 1, S("a3bcdefghij"));
2578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 2, 2, S("a34bcdefghij"));
2579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 2, 3, S("a345bcdefghij"));
2580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 2, 4, S("a345bcdefghij"));
2581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 4, 0, S("abcdefghij"));
2582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 4, 1, S("a5bcdefghij"));
2583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 4, 2, S("a5bcdefghij"));
2584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 5, 0, S("abcdefghij"));
2585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 5, 1, S("abcdefghij"));
2586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), 6, 0, S("can't happen"));
2587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 0, 0, S("abcdefghij"));
2588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 0, 1, S("a1bcdefghij"));
2589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 0, 5, S("a12345bcdefghij"));
2590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 0, 9, S("a123456789bcdefghij"));
2591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 0, 10, S("a1234567890bcdefghij"));
2592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 0, 11, S("a1234567890bcdefghij"));
2593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
25959dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
2596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test24()
2597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 1, 0, S("abcdefghij"));
2599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 1, 1, S("a2bcdefghij"));
2600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 1, 4, S("a2345bcdefghij"));
2601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 1, 8, S("a23456789bcdefghij"));
2602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 1, 9, S("a234567890bcdefghij"));
2603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 1, 10, S("a234567890bcdefghij"));
2604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 5, 0, S("abcdefghij"));
2605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 5, 1, S("a6bcdefghij"));
2606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 5, 2, S("a67bcdefghij"));
2607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 5, 4, S("a6789bcdefghij"));
2608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 5, 5, S("a67890bcdefghij"));
2609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 5, 6, S("a67890bcdefghij"));
2610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 9, 0, S("abcdefghij"));
2611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 9, 1, S("a0bcdefghij"));
2612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 9, 2, S("a0bcdefghij"));
2613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 10, 0, S("abcdefghij"));
2614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 10, 1, S("abcdefghij"));
2615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), 11, 0, S("can't happen"));
2616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 0, 0, S("abcdefghij"));
2617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 0, 1, S("a1bcdefghij"));
2618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 0, 10, S("a1234567890bcdefghij"));
2619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 0, 19, S("a1234567890123456789bcdefghij"));
2620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 0, 20, S("a12345678901234567890bcdefghij"));
2621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 0, 21, S("a12345678901234567890bcdefghij"));
2622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 1, 0, S("abcdefghij"));
2623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 1, 1, S("a2bcdefghij"));
2624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 1, 9, S("a234567890bcdefghij"));
2625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 1, 18, S("a234567890123456789bcdefghij"));
2626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 1, 19, S("a2345678901234567890bcdefghij"));
2627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 1, 20, S("a2345678901234567890bcdefghij"));
2628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 10, 0, S("abcdefghij"));
2629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 10, 1, S("a1bcdefghij"));
2630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 10, 5, S("a12345bcdefghij"));
2631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 10, 9, S("a123456789bcdefghij"));
2632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 10, 10, S("a1234567890bcdefghij"));
2633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 10, 11, S("a1234567890bcdefghij"));
2634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 19, 0, S("abcdefghij"));
2635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 19, 1, S("a0bcdefghij"));
2636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 19, 2, S("a0bcdefghij"));
2637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 20, 0, S("abcdefghij"));
2638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 20, 1, S("abcdefghij"));
2639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
2640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S(""), 0, 0, S("acdefghij"));
2641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S(""), 0, 1, S("acdefghij"));
2642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S(""), 1, 0, S("can't happen"));
2643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 0, 0, S("acdefghij"));
2644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 0, 1, S("a1cdefghij"));
2645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 0, 2, S("a12cdefghij"));
2646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 0, 4, S("a1234cdefghij"));
2647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 0, 5, S("a12345cdefghij"));
2648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 0, 6, S("a12345cdefghij"));
2649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 1, 0, S("acdefghij"));
2650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 1, 1, S("a2cdefghij"));
2651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 1, 2, S("a23cdefghij"));
2652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 1, 3, S("a234cdefghij"));
2653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 1, 4, S("a2345cdefghij"));
2654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 1, 5, S("a2345cdefghij"));
2655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 2, 0, S("acdefghij"));
2656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 2, 1, S("a3cdefghij"));
2657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 2, 2, S("a34cdefghij"));
2658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 2, 3, S("a345cdefghij"));
2659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 2, 4, S("a345cdefghij"));
2660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 4, 0, S("acdefghij"));
2661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 4, 1, S("a5cdefghij"));
2662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 4, 2, S("a5cdefghij"));
2663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 5, 0, S("acdefghij"));
2664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 5, 1, S("acdefghij"));
2665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), 6, 0, S("can't happen"));
2666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 0, 0, S("acdefghij"));
2667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 0, 1, S("a1cdefghij"));
2668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 0, 5, S("a12345cdefghij"));
2669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 0, 9, S("a123456789cdefghij"));
2670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 0, 10, S("a1234567890cdefghij"));
2671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 0, 11, S("a1234567890cdefghij"));
2672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 1, 0, S("acdefghij"));
2673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 1, 1, S("a2cdefghij"));
2674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 1, 4, S("a2345cdefghij"));
2675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 1, 8, S("a23456789cdefghij"));
2676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 1, 9, S("a234567890cdefghij"));
2677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 1, 10, S("a234567890cdefghij"));
2678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 5, 0, S("acdefghij"));
2679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 5, 1, S("a6cdefghij"));
2680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 5, 2, S("a67cdefghij"));
2681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 5, 4, S("a6789cdefghij"));
2682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 5, 5, S("a67890cdefghij"));
2683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 5, 6, S("a67890cdefghij"));
2684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 9, 0, S("acdefghij"));
2685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 9, 1, S("a0cdefghij"));
2686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 9, 2, S("a0cdefghij"));
2687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 10, 0, S("acdefghij"));
2688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 10, 1, S("acdefghij"));
2689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), 11, 0, S("can't happen"));
2690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 0, 0, S("acdefghij"));
2691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 0, 1, S("a1cdefghij"));
2692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 0, 10, S("a1234567890cdefghij"));
2693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 0, 19, S("a1234567890123456789cdefghij"));
2694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 0, 20, S("a12345678901234567890cdefghij"));
2695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 0, 21, S("a12345678901234567890cdefghij"));
2696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 1, 0, S("acdefghij"));
2697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 1, 1, S("a2cdefghij"));
2698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
27009dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
2701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test25()
2702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 1, 9, S("a234567890cdefghij"));
2704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 1, 18, S("a234567890123456789cdefghij"));
2705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 1, 19, S("a2345678901234567890cdefghij"));
2706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 1, 20, S("a2345678901234567890cdefghij"));
2707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 10, 0, S("acdefghij"));
2708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 10, 1, S("a1cdefghij"));
2709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 10, 5, S("a12345cdefghij"));
2710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 10, 9, S("a123456789cdefghij"));
2711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 10, 10, S("a1234567890cdefghij"));
2712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 10, 11, S("a1234567890cdefghij"));
2713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 19, 0, S("acdefghij"));
2714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 19, 1, S("a0cdefghij"));
2715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 19, 2, S("a0cdefghij"));
2716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 20, 0, S("acdefghij"));
2717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 20, 1, S("acdefghij"));
2718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
2719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S(""), 0, 0, S("afghij"));
2720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S(""), 0, 1, S("afghij"));
2721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S(""), 1, 0, S("can't happen"));
2722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 0, 0, S("afghij"));
2723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 0, 1, S("a1fghij"));
2724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 0, 2, S("a12fghij"));
2725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 0, 4, S("a1234fghij"));
2726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 0, 5, S("a12345fghij"));
2727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 0, 6, S("a12345fghij"));
2728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 1, 0, S("afghij"));
2729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 1, 1, S("a2fghij"));
2730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 1, 2, S("a23fghij"));
2731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 1, 3, S("a234fghij"));
2732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 1, 4, S("a2345fghij"));
2733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 1, 5, S("a2345fghij"));
2734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 2, 0, S("afghij"));
2735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 2, 1, S("a3fghij"));
2736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 2, 2, S("a34fghij"));
2737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 2, 3, S("a345fghij"));
2738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 2, 4, S("a345fghij"));
2739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 4, 0, S("afghij"));
2740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 4, 1, S("a5fghij"));
2741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 4, 2, S("a5fghij"));
2742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 5, 0, S("afghij"));
2743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 5, 1, S("afghij"));
2744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), 6, 0, S("can't happen"));
2745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 0, 0, S("afghij"));
2746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 0, 1, S("a1fghij"));
2747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 0, 5, S("a12345fghij"));
2748bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 0, 9, S("a123456789fghij"));
2749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 0, 10, S("a1234567890fghij"));
2750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 0, 11, S("a1234567890fghij"));
2751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 1, 0, S("afghij"));
2752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 1, 1, S("a2fghij"));
2753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 1, 4, S("a2345fghij"));
2754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 1, 8, S("a23456789fghij"));
2755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 1, 9, S("a234567890fghij"));
2756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 1, 10, S("a234567890fghij"));
2757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 5, 0, S("afghij"));
2758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 5, 1, S("a6fghij"));
2759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 5, 2, S("a67fghij"));
2760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 5, 4, S("a6789fghij"));
2761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 5, 5, S("a67890fghij"));
2762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 5, 6, S("a67890fghij"));
2763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 9, 0, S("afghij"));
2764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 9, 1, S("a0fghij"));
2765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 9, 2, S("a0fghij"));
2766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 10, 0, S("afghij"));
2767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 10, 1, S("afghij"));
2768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), 11, 0, S("can't happen"));
2769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 0, 0, S("afghij"));
2770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 0, 1, S("a1fghij"));
2771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 0, 10, S("a1234567890fghij"));
2772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 0, 19, S("a1234567890123456789fghij"));
2773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 0, 20, S("a12345678901234567890fghij"));
2774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 0, 21, S("a12345678901234567890fghij"));
2775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 1, 0, S("afghij"));
2776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 1, 1, S("a2fghij"));
2777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 1, 9, S("a234567890fghij"));
2778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 1, 18, S("a234567890123456789fghij"));
2779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 1, 19, S("a2345678901234567890fghij"));
2780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 1, 20, S("a2345678901234567890fghij"));
2781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 10, 0, S("afghij"));
2782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 10, 1, S("a1fghij"));
2783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 10, 5, S("a12345fghij"));
2784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 10, 9, S("a123456789fghij"));
2785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 10, 10, S("a1234567890fghij"));
2786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 10, 11, S("a1234567890fghij"));
2787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 19, 0, S("afghij"));
2788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 19, 1, S("a0fghij"));
2789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 19, 2, S("a0fghij"));
2790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 20, 0, S("afghij"));
2791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 20, 1, S("afghij"));
2792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), 21, 0, S("can't happen"));
2793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S(""), 0, 0, S("aj"));
2794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S(""), 0, 1, S("aj"));
2795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S(""), 1, 0, S("can't happen"));
2796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 0, 0, S("aj"));
2797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 0, 1, S("a1j"));
2798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 0, 2, S("a12j"));
2799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 0, 4, S("a1234j"));
2800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 0, 5, S("a12345j"));
2801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 0, 6, S("a12345j"));
2802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 1, 0, S("aj"));
2803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
28059dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
2806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test26()
2807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 1, 1, S("a2j"));
2809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 1, 2, S("a23j"));
2810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 1, 3, S("a234j"));
2811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 1, 4, S("a2345j"));
2812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 1, 5, S("a2345j"));
2813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 2, 0, S("aj"));
2814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 2, 1, S("a3j"));
2815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 2, 2, S("a34j"));
2816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 2, 3, S("a345j"));
2817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 2, 4, S("a345j"));
2818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 4, 0, S("aj"));
2819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 4, 1, S("a5j"));
2820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 4, 2, S("a5j"));
2821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 5, 0, S("aj"));
2822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 5, 1, S("aj"));
2823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), 6, 0, S("can't happen"));
2824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 0, 0, S("aj"));
2825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 0, 1, S("a1j"));
2826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 0, 5, S("a12345j"));
2827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 0, 9, S("a123456789j"));
2828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 0, 10, S("a1234567890j"));
2829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 0, 11, S("a1234567890j"));
2830bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 1, 0, S("aj"));
2831bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 1, 1, S("a2j"));
2832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 1, 4, S("a2345j"));
2833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 1, 8, S("a23456789j"));
2834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 1, 9, S("a234567890j"));
2835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 1, 10, S("a234567890j"));
2836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 5, 0, S("aj"));
2837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 5, 1, S("a6j"));
2838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 5, 2, S("a67j"));
2839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 5, 4, S("a6789j"));
2840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 5, 5, S("a67890j"));
2841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 5, 6, S("a67890j"));
2842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 9, 0, S("aj"));
2843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 9, 1, S("a0j"));
2844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 9, 2, S("a0j"));
2845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 10, 0, S("aj"));
2846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 10, 1, S("aj"));
2847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), 11, 0, S("can't happen"));
2848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 0, 0, S("aj"));
2849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 0, 1, S("a1j"));
2850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 0, 10, S("a1234567890j"));
2851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 0, 19, S("a1234567890123456789j"));
2852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 0, 20, S("a12345678901234567890j"));
2853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 0, 21, S("a12345678901234567890j"));
2854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 1, 0, S("aj"));
2855bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 1, 1, S("a2j"));
2856bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 1, 9, S("a234567890j"));
2857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 1, 18, S("a234567890123456789j"));
2858bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 1, 19, S("a2345678901234567890j"));
2859bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 1, 20, S("a2345678901234567890j"));
2860bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 10, 0, S("aj"));
2861bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 10, 1, S("a1j"));
2862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 10, 5, S("a12345j"));
2863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 10, 9, S("a123456789j"));
2864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 10, 10, S("a1234567890j"));
2865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 10, 11, S("a1234567890j"));
2866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 19, 0, S("aj"));
2867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 19, 1, S("a0j"));
2868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 19, 2, S("a0j"));
2869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 20, 0, S("aj"));
2870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 20, 1, S("aj"));
2871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), 21, 0, S("can't happen"));
2872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S(""), 0, 0, S("a"));
2873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S(""), 0, 1, S("a"));
2874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S(""), 1, 0, S("can't happen"));
2875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 0, 0, S("a"));
2876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 0, 1, S("a1"));
2877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 0, 2, S("a12"));
2878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 0, 4, S("a1234"));
2879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 0, 5, S("a12345"));
2880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 0, 6, S("a12345"));
2881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 1, 0, S("a"));
2882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 1, 1, S("a2"));
2883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 1, 2, S("a23"));
2884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 1, 3, S("a234"));
2885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 1, 4, S("a2345"));
2886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 1, 5, S("a2345"));
2887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 2, 0, S("a"));
2888bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 2, 1, S("a3"));
2889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 2, 2, S("a34"));
2890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 2, 3, S("a345"));
2891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 2, 4, S("a345"));
2892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 4, 0, S("a"));
2893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 4, 1, S("a5"));
2894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 4, 2, S("a5"));
2895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 5, 0, S("a"));
2896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 5, 1, S("a"));
2897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), 6, 0, S("can't happen"));
2898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 0, 0, S("a"));
2899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 0, 1, S("a1"));
2900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 0, 5, S("a12345"));
2901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 0, 9, S("a123456789"));
2902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 0, 10, S("a1234567890"));
2903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 0, 11, S("a1234567890"));
2904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 1, 0, S("a"));
2905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 1, 1, S("a2"));
2906bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 1, 4, S("a2345"));
2907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 1, 8, S("a23456789"));
2908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
29109dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
2911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test27()
2912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
2913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 1, 9, S("a234567890"));
2914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 1, 10, S("a234567890"));
2915bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 5, 0, S("a"));
2916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 5, 1, S("a6"));
2917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 5, 2, S("a67"));
2918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 5, 4, S("a6789"));
2919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 5, 5, S("a67890"));
2920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 5, 6, S("a67890"));
2921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 9, 0, S("a"));
2922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 9, 1, S("a0"));
2923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 9, 2, S("a0"));
2924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 10, 0, S("a"));
2925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 10, 1, S("a"));
2926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), 11, 0, S("can't happen"));
2927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 0, 0, S("a"));
2928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 0, 1, S("a1"));
2929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 0, 10, S("a1234567890"));
2930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 0, 19, S("a1234567890123456789"));
2931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 0, 20, S("a12345678901234567890"));
2932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 0, 21, S("a12345678901234567890"));
2933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 1, 0, S("a"));
2934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 1, 1, S("a2"));
2935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 1, 9, S("a234567890"));
2936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 1, 18, S("a234567890123456789"));
2937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 1, 19, S("a2345678901234567890"));
2938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 1, 20, S("a2345678901234567890"));
2939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 10, 0, S("a"));
2940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 10, 1, S("a1"));
2941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 10, 5, S("a12345"));
2942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 10, 9, S("a123456789"));
2943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 10, 10, S("a1234567890"));
2944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 10, 11, S("a1234567890"));
2945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 19, 0, S("a"));
2946bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 19, 1, S("a0"));
2947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 19, 2, S("a0"));
2948bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 20, 0, S("a"));
2949bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 20, 1, S("a"));
2950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), 21, 0, S("can't happen"));
2951bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S(""), 0, 0, S("a"));
2952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S(""), 0, 1, S("a"));
2953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S(""), 1, 0, S("can't happen"));
2954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 0, 0, S("a"));
2955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 0, 1, S("a1"));
2956bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 0, 2, S("a12"));
2957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 0, 4, S("a1234"));
2958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 0, 5, S("a12345"));
2959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 0, 6, S("a12345"));
2960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 1, 0, S("a"));
2961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 1, 1, S("a2"));
2962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 1, 2, S("a23"));
2963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 1, 3, S("a234"));
2964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 1, 4, S("a2345"));
2965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 1, 5, S("a2345"));
2966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 2, 0, S("a"));
2967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 2, 1, S("a3"));
2968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 2, 2, S("a34"));
2969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 2, 3, S("a345"));
2970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 2, 4, S("a345"));
2971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 4, 0, S("a"));
2972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 4, 1, S("a5"));
2973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 4, 2, S("a5"));
2974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 5, 0, S("a"));
2975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 5, 1, S("a"));
2976bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), 6, 0, S("can't happen"));
2977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 0, 0, S("a"));
2978bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 0, 1, S("a1"));
2979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 0, 5, S("a12345"));
2980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 0, 9, S("a123456789"));
2981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 0, 10, S("a1234567890"));
2982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 0, 11, S("a1234567890"));
2983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 1, 0, S("a"));
2984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 1, 1, S("a2"));
2985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 1, 4, S("a2345"));
2986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 1, 8, S("a23456789"));
2987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 1, 9, S("a234567890"));
2988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 1, 10, S("a234567890"));
2989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 5, 0, S("a"));
2990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 5, 1, S("a6"));
2991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 5, 2, S("a67"));
2992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 5, 4, S("a6789"));
2993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 5, 5, S("a67890"));
2994bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 5, 6, S("a67890"));
2995bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 9, 0, S("a"));
2996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 9, 1, S("a0"));
2997bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 9, 2, S("a0"));
2998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 10, 0, S("a"));
2999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 10, 1, S("a"));
3000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), 11, 0, S("can't happen"));
3001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 0, 0, S("a"));
3002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 0, 1, S("a1"));
3003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 0, 10, S("a1234567890"));
3004bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 0, 19, S("a1234567890123456789"));
3005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 0, 20, S("a12345678901234567890"));
3006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 0, 21, S("a12345678901234567890"));
3007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 1, 0, S("a"));
3008bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 1, 1, S("a2"));
3009bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 1, 9, S("a234567890"));
3010bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 1, 18, S("a234567890123456789"));
3011bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 1, 19, S("a2345678901234567890"));
3012bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 1, 20, S("a2345678901234567890"));
3013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
3014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
30159dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
3016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test28()
3017bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3018bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 10, 0, S("a"));
3019bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 10, 1, S("a1"));
3020bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 10, 5, S("a12345"));
3021bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 10, 9, S("a123456789"));
3022bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 10, 10, S("a1234567890"));
3023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 10, 11, S("a1234567890"));
3024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 19, 0, S("a"));
3025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 19, 1, S("a0"));
3026bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 19, 2, S("a0"));
3027bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 20, 0, S("a"));
3028bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 20, 1, S("a"));
3029bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), 21, 0, S("can't happen"));
3030bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S(""), 0, 0, S("abcdefghij"));
3031bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S(""), 0, 1, S("abcdefghij"));
3032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S(""), 1, 0, S("can't happen"));
3033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 0, 0, S("abcdefghij"));
3034bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 0, 1, S("abcde1fghij"));
3035bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 0, 2, S("abcde12fghij"));
3036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 0, 4, S("abcde1234fghij"));
3037bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 0, 5, S("abcde12345fghij"));
3038bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 0, 6, S("abcde12345fghij"));
3039bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 1, 0, S("abcdefghij"));
3040bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 1, 1, S("abcde2fghij"));
3041bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 1, 2, S("abcde23fghij"));
3042bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 1, 3, S("abcde234fghij"));
3043bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 1, 4, S("abcde2345fghij"));
3044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 1, 5, S("abcde2345fghij"));
3045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 2, 0, S("abcdefghij"));
3046bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 2, 1, S("abcde3fghij"));
3047bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 2, 2, S("abcde34fghij"));
3048bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 2, 3, S("abcde345fghij"));
3049bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 2, 4, S("abcde345fghij"));
3050bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 4, 0, S("abcdefghij"));
3051bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 4, 1, S("abcde5fghij"));
3052bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 4, 2, S("abcde5fghij"));
3053bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 5, 0, S("abcdefghij"));
3054bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 5, 1, S("abcdefghij"));
3055bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), 6, 0, S("can't happen"));
3056bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 0, 0, S("abcdefghij"));
3057bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 0, 1, S("abcde1fghij"));
3058bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 0, 5, S("abcde12345fghij"));
3059bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 0, 9, S("abcde123456789fghij"));
3060bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 0, 10, S("abcde1234567890fghij"));
3061bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 0, 11, S("abcde1234567890fghij"));
3062bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 1, 0, S("abcdefghij"));
3063bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 1, 1, S("abcde2fghij"));
3064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 1, 4, S("abcde2345fghij"));
3065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 1, 8, S("abcde23456789fghij"));
3066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 1, 9, S("abcde234567890fghij"));
3067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 1, 10, S("abcde234567890fghij"));
3068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 5, 0, S("abcdefghij"));
3069bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 5, 1, S("abcde6fghij"));
3070bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 5, 2, S("abcde67fghij"));
3071bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 5, 4, S("abcde6789fghij"));
3072bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 5, 5, S("abcde67890fghij"));
3073bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 5, 6, S("abcde67890fghij"));
3074bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 9, 0, S("abcdefghij"));
3075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 9, 1, S("abcde0fghij"));
3076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 9, 2, S("abcde0fghij"));
3077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 10, 0, S("abcdefghij"));
3078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 10, 1, S("abcdefghij"));
3079bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), 11, 0, S("can't happen"));
3080bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 0, 0, S("abcdefghij"));
3081bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 0, 1, S("abcde1fghij"));
3082bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 0, 10, S("abcde1234567890fghij"));
3083bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789fghij"));
3084bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890fghij"));
3085bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890fghij"));
3086bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 1, 0, S("abcdefghij"));
3087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 1, 1, S("abcde2fghij"));
3088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 1, 9, S("abcde234567890fghij"));
3089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 1, 18, S("abcde234567890123456789fghij"));
3090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890fghij"));
3091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890fghij"));
3092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 10, 0, S("abcdefghij"));
3093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 10, 1, S("abcde1fghij"));
3094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 10, 5, S("abcde12345fghij"));
3095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 10, 9, S("abcde123456789fghij"));
3096bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 10, 10, S("abcde1234567890fghij"));
3097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 10, 11, S("abcde1234567890fghij"));
3098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 19, 0, S("abcdefghij"));
3099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 19, 1, S("abcde0fghij"));
3100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 19, 2, S("abcde0fghij"));
3101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 20, 0, S("abcdefghij"));
3102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 20, 1, S("abcdefghij"));
3103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
3104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S(""), 0, 0, S("abcdeghij"));
3105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S(""), 0, 1, S("abcdeghij"));
3106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S(""), 1, 0, S("can't happen"));
3107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 0, 0, S("abcdeghij"));
3108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 0, 1, S("abcde1ghij"));
3109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 0, 2, S("abcde12ghij"));
3110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 0, 4, S("abcde1234ghij"));
3111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 0, 5, S("abcde12345ghij"));
3112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 0, 6, S("abcde12345ghij"));
3113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 1, 0, S("abcdeghij"));
3114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 1, 1, S("abcde2ghij"));
3115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 1, 2, S("abcde23ghij"));
3116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 1, 3, S("abcde234ghij"));
3117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 1, 4, S("abcde2345ghij"));
3118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
3119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
31209dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
3121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test29()
3122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 1, 5, S("abcde2345ghij"));
3124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 2, 0, S("abcdeghij"));
3125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 2, 1, S("abcde3ghij"));
3126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 2, 2, S("abcde34ghij"));
3127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 2, 3, S("abcde345ghij"));
3128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 2, 4, S("abcde345ghij"));
3129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 4, 0, S("abcdeghij"));
3130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 4, 1, S("abcde5ghij"));
3131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 4, 2, S("abcde5ghij"));
3132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 5, 0, S("abcdeghij"));
3133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 5, 1, S("abcdeghij"));
3134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), 6, 0, S("can't happen"));
3135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 0, 0, S("abcdeghij"));
3136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 0, 1, S("abcde1ghij"));
3137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 0, 5, S("abcde12345ghij"));
3138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 0, 9, S("abcde123456789ghij"));
3139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 0, 10, S("abcde1234567890ghij"));
3140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 0, 11, S("abcde1234567890ghij"));
3141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 1, 0, S("abcdeghij"));
3142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 1, 1, S("abcde2ghij"));
3143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 1, 4, S("abcde2345ghij"));
3144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 1, 8, S("abcde23456789ghij"));
3145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 1, 9, S("abcde234567890ghij"));
3146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 1, 10, S("abcde234567890ghij"));
3147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 5, 0, S("abcdeghij"));
3148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 5, 1, S("abcde6ghij"));
3149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 5, 2, S("abcde67ghij"));
3150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 5, 4, S("abcde6789ghij"));
3151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 5, 5, S("abcde67890ghij"));
3152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 5, 6, S("abcde67890ghij"));
3153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 9, 0, S("abcdeghij"));
3154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 9, 1, S("abcde0ghij"));
3155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 9, 2, S("abcde0ghij"));
3156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 10, 0, S("abcdeghij"));
3157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 10, 1, S("abcdeghij"));
3158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), 11, 0, S("can't happen"));
3159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 0, 0, S("abcdeghij"));
3160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 0, 1, S("abcde1ghij"));
3161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 0, 10, S("abcde1234567890ghij"));
3162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789ghij"));
3163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890ghij"));
3164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890ghij"));
3165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 1, 0, S("abcdeghij"));
3166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 1, 1, S("abcde2ghij"));
3167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 1, 9, S("abcde234567890ghij"));
3168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 1, 18, S("abcde234567890123456789ghij"));
3169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890ghij"));
3170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890ghij"));
3171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 10, 0, S("abcdeghij"));
3172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 10, 1, S("abcde1ghij"));
3173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 10, 5, S("abcde12345ghij"));
3174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 10, 9, S("abcde123456789ghij"));
3175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 10, 10, S("abcde1234567890ghij"));
3176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 10, 11, S("abcde1234567890ghij"));
3177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 19, 0, S("abcdeghij"));
3178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 19, 1, S("abcde0ghij"));
3179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 19, 2, S("abcde0ghij"));
3180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 20, 0, S("abcdeghij"));
3181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 20, 1, S("abcdeghij"));
3182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
3183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S(""), 0, 0, S("abcdehij"));
3184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S(""), 0, 1, S("abcdehij"));
3185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S(""), 1, 0, S("can't happen"));
3186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 0, 0, S("abcdehij"));
3187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 0, 1, S("abcde1hij"));
3188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 0, 2, S("abcde12hij"));
3189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 0, 4, S("abcde1234hij"));
3190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 0, 5, S("abcde12345hij"));
3191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 0, 6, S("abcde12345hij"));
3192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 1, 0, S("abcdehij"));
3193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 1, 1, S("abcde2hij"));
3194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 1, 2, S("abcde23hij"));
3195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 1, 3, S("abcde234hij"));
3196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 1, 4, S("abcde2345hij"));
3197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 1, 5, S("abcde2345hij"));
3198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 2, 0, S("abcdehij"));
3199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 2, 1, S("abcde3hij"));
3200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 2, 2, S("abcde34hij"));
3201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 2, 3, S("abcde345hij"));
3202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 2, 4, S("abcde345hij"));
3203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 4, 0, S("abcdehij"));
3204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 4, 1, S("abcde5hij"));
3205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 4, 2, S("abcde5hij"));
3206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 5, 0, S("abcdehij"));
3207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 5, 1, S("abcdehij"));
3208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), 6, 0, S("can't happen"));
3209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 0, 0, S("abcdehij"));
3210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 0, 1, S("abcde1hij"));
3211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 0, 5, S("abcde12345hij"));
3212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 0, 9, S("abcde123456789hij"));
3213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 0, 10, S("abcde1234567890hij"));
3214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 0, 11, S("abcde1234567890hij"));
3215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 1, 0, S("abcdehij"));
3216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 1, 1, S("abcde2hij"));
3217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 1, 4, S("abcde2345hij"));
3218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 1, 8, S("abcde23456789hij"));
3219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 1, 9, S("abcde234567890hij"));
3220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 1, 10, S("abcde234567890hij"));
3221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 5, 0, S("abcdehij"));
3222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 5, 1, S("abcde6hij"));
3223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
3224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
32259dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
3226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test30()
3227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 5, 2, S("abcde67hij"));
3229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 5, 4, S("abcde6789hij"));
3230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 5, 5, S("abcde67890hij"));
3231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 5, 6, S("abcde67890hij"));
3232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 9, 0, S("abcdehij"));
3233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 9, 1, S("abcde0hij"));
3234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 9, 2, S("abcde0hij"));
3235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 10, 0, S("abcdehij"));
3236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 10, 1, S("abcdehij"));
3237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), 11, 0, S("can't happen"));
3238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 0, 0, S("abcdehij"));
3239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 0, 1, S("abcde1hij"));
3240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 0, 10, S("abcde1234567890hij"));
3241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789hij"));
3242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890hij"));
3243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890hij"));
3244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 1, 0, S("abcdehij"));
3245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 1, 1, S("abcde2hij"));
3246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 1, 9, S("abcde234567890hij"));
3247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 1, 18, S("abcde234567890123456789hij"));
3248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890hij"));
3249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890hij"));
3250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 10, 0, S("abcdehij"));
3251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 10, 1, S("abcde1hij"));
3252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 10, 5, S("abcde12345hij"));
3253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 10, 9, S("abcde123456789hij"));
3254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 10, 10, S("abcde1234567890hij"));
3255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 10, 11, S("abcde1234567890hij"));
3256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 19, 0, S("abcdehij"));
3257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 19, 1, S("abcde0hij"));
3258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 19, 2, S("abcde0hij"));
3259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 20, 0, S("abcdehij"));
3260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 20, 1, S("abcdehij"));
3261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), 21, 0, S("can't happen"));
3262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S(""), 0, 0, S("abcdej"));
3263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S(""), 0, 1, S("abcdej"));
3264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S(""), 1, 0, S("can't happen"));
3265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 0, 0, S("abcdej"));
3266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 0, 1, S("abcde1j"));
3267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 0, 2, S("abcde12j"));
3268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 0, 4, S("abcde1234j"));
3269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 0, 5, S("abcde12345j"));
3270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 0, 6, S("abcde12345j"));
3271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 1, 0, S("abcdej"));
3272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 1, 1, S("abcde2j"));
3273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 1, 2, S("abcde23j"));
3274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 1, 3, S("abcde234j"));
3275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 1, 4, S("abcde2345j"));
3276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 1, 5, S("abcde2345j"));
3277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 2, 0, S("abcdej"));
3278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 2, 1, S("abcde3j"));
3279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 2, 2, S("abcde34j"));
3280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 2, 3, S("abcde345j"));
3281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 2, 4, S("abcde345j"));
3282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 4, 0, S("abcdej"));
3283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 4, 1, S("abcde5j"));
3284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 4, 2, S("abcde5j"));
3285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 5, 0, S("abcdej"));
3286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 5, 1, S("abcdej"));
3287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), 6, 0, S("can't happen"));
3288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 0, 0, S("abcdej"));
3289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 0, 1, S("abcde1j"));
3290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 0, 5, S("abcde12345j"));
3291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 0, 9, S("abcde123456789j"));
3292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 0, 10, S("abcde1234567890j"));
3293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 0, 11, S("abcde1234567890j"));
3294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 1, 0, S("abcdej"));
3295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 1, 1, S("abcde2j"));
3296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 1, 4, S("abcde2345j"));
3297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 1, 8, S("abcde23456789j"));
3298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 1, 9, S("abcde234567890j"));
3299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 1, 10, S("abcde234567890j"));
3300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 5, 0, S("abcdej"));
3301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 5, 1, S("abcde6j"));
3302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 5, 2, S("abcde67j"));
3303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 5, 4, S("abcde6789j"));
3304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 5, 5, S("abcde67890j"));
3305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 5, 6, S("abcde67890j"));
3306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 9, 0, S("abcdej"));
3307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 9, 1, S("abcde0j"));
3308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 9, 2, S("abcde0j"));
3309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 10, 0, S("abcdej"));
3310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 10, 1, S("abcdej"));
3311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), 11, 0, S("can't happen"));
3312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 0, 0, S("abcdej"));
3313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 0, 1, S("abcde1j"));
3314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 0, 10, S("abcde1234567890j"));
3315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789j"));
3316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890j"));
3317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890j"));
3318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 1, 0, S("abcdej"));
3319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 1, 1, S("abcde2j"));
3320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 1, 9, S("abcde234567890j"));
3321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 1, 18, S("abcde234567890123456789j"));
3322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890j"));
3323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890j"));
3324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 10, 0, S("abcdej"));
3325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 10, 1, S("abcde1j"));
3326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 10, 5, S("abcde12345j"));
3327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 10, 9, S("abcde123456789j"));
3328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
3329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
33309dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
3331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test31()
3332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 10, 10, S("abcde1234567890j"));
3334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 10, 11, S("abcde1234567890j"));
3335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 19, 0, S("abcdej"));
3336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 19, 1, S("abcde0j"));
3337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 19, 2, S("abcde0j"));
3338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 20, 0, S("abcdej"));
3339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 20, 1, S("abcdej"));
3340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), 21, 0, S("can't happen"));
3341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S(""), 0, 0, S("abcde"));
3342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S(""), 0, 1, S("abcde"));
3343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S(""), 1, 0, S("can't happen"));
3344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 0, 0, S("abcde"));
3345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 0, 1, S("abcde1"));
3346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 0, 2, S("abcde12"));
3347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 0, 4, S("abcde1234"));
3348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 0, 5, S("abcde12345"));
3349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 0, 6, S("abcde12345"));
3350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 1, 0, S("abcde"));
3351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 1, 1, S("abcde2"));
3352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 1, 2, S("abcde23"));
3353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 1, 3, S("abcde234"));
3354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 1, 4, S("abcde2345"));
3355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 1, 5, S("abcde2345"));
3356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 2, 0, S("abcde"));
3357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 2, 1, S("abcde3"));
3358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 2, 2, S("abcde34"));
3359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 2, 3, S("abcde345"));
3360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 2, 4, S("abcde345"));
3361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 4, 0, S("abcde"));
3362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 4, 1, S("abcde5"));
3363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 4, 2, S("abcde5"));
3364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 5, 0, S("abcde"));
3365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 5, 1, S("abcde"));
3366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), 6, 0, S("can't happen"));
3367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 0, 0, S("abcde"));
3368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 0, 1, S("abcde1"));
3369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 0, 5, S("abcde12345"));
3370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 0, 9, S("abcde123456789"));
3371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 0, 10, S("abcde1234567890"));
3372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 0, 11, S("abcde1234567890"));
3373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 1, 0, S("abcde"));
3374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 1, 1, S("abcde2"));
3375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 1, 4, S("abcde2345"));
3376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 1, 8, S("abcde23456789"));
3377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 1, 9, S("abcde234567890"));
3378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 1, 10, S("abcde234567890"));
3379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 5, 0, S("abcde"));
3380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 5, 1, S("abcde6"));
3381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 5, 2, S("abcde67"));
3382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 5, 4, S("abcde6789"));
3383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 5, 5, S("abcde67890"));
3384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 5, 6, S("abcde67890"));
3385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 9, 0, S("abcde"));
3386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 9, 1, S("abcde0"));
3387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 9, 2, S("abcde0"));
3388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 10, 0, S("abcde"));
3389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 10, 1, S("abcde"));
3390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), 11, 0, S("can't happen"));
3391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 0, 0, S("abcde"));
3392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 0, 1, S("abcde1"));
3393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 0, 10, S("abcde1234567890"));
3394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789"));
3395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890"));
3396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890"));
3397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 1, 0, S("abcde"));
3398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 1, 1, S("abcde2"));
3399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 1, 9, S("abcde234567890"));
3400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 1, 18, S("abcde234567890123456789"));
3401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890"));
3402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890"));
3403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 10, 0, S("abcde"));
3404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 10, 1, S("abcde1"));
3405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 10, 5, S("abcde12345"));
3406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 10, 9, S("abcde123456789"));
3407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 10, 10, S("abcde1234567890"));
3408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 10, 11, S("abcde1234567890"));
3409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 19, 0, S("abcde"));
3410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 19, 1, S("abcde0"));
3411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 19, 2, S("abcde0"));
3412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 20, 0, S("abcde"));
3413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 20, 1, S("abcde"));
3414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), 21, 0, S("can't happen"));
3415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S(""), 0, 0, S("abcde"));
3416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S(""), 0, 1, S("abcde"));
3417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S(""), 1, 0, S("can't happen"));
3418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 0, 0, S("abcde"));
3419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 0, 1, S("abcde1"));
3420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 0, 2, S("abcde12"));
3421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 0, 4, S("abcde1234"));
3422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 0, 5, S("abcde12345"));
3423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 0, 6, S("abcde12345"));
3424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 1, 0, S("abcde"));
3425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 1, 1, S("abcde2"));
3426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 1, 2, S("abcde23"));
3427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 1, 3, S("abcde234"));
3428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 1, 4, S("abcde2345"));
3429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 1, 5, S("abcde2345"));
3430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 2, 0, S("abcde"));
3431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 2, 1, S("abcde3"));
3432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 2, 2, S("abcde34"));
3433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
3434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
34359dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
3436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test32()
3437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 2, 3, S("abcde345"));
3439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 2, 4, S("abcde345"));
3440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 4, 0, S("abcde"));
3441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 4, 1, S("abcde5"));
3442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 4, 2, S("abcde5"));
3443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 5, 0, S("abcde"));
3444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 5, 1, S("abcde"));
3445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), 6, 0, S("can't happen"));
3446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 0, 0, S("abcde"));
3447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 0, 1, S("abcde1"));
3448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 0, 5, S("abcde12345"));
3449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 0, 9, S("abcde123456789"));
3450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 0, 10, S("abcde1234567890"));
3451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 0, 11, S("abcde1234567890"));
3452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 1, 0, S("abcde"));
3453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 1, 1, S("abcde2"));
3454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 1, 4, S("abcde2345"));
3455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 1, 8, S("abcde23456789"));
3456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 1, 9, S("abcde234567890"));
3457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 1, 10, S("abcde234567890"));
3458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 5, 0, S("abcde"));
3459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 5, 1, S("abcde6"));
3460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 5, 2, S("abcde67"));
3461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 5, 4, S("abcde6789"));
3462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 5, 5, S("abcde67890"));
3463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 5, 6, S("abcde67890"));
3464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 9, 0, S("abcde"));
3465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 9, 1, S("abcde0"));
3466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 9, 2, S("abcde0"));
3467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 10, 0, S("abcde"));
3468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 10, 1, S("abcde"));
3469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), 11, 0, S("can't happen"));
3470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 0, 0, S("abcde"));
3471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 0, 1, S("abcde1"));
3472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 0, 10, S("abcde1234567890"));
3473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789"));
3474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890"));
3475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890"));
3476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 1, 0, S("abcde"));
3477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 1, 1, S("abcde2"));
3478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 1, 9, S("abcde234567890"));
3479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 1, 18, S("abcde234567890123456789"));
3480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890"));
3481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890"));
3482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 10, 0, S("abcde"));
3483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 10, 1, S("abcde1"));
3484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 10, 5, S("abcde12345"));
3485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 10, 9, S("abcde123456789"));
3486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 10, 10, S("abcde1234567890"));
3487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 10, 11, S("abcde1234567890"));
3488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 19, 0, S("abcde"));
3489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 19, 1, S("abcde0"));
3490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 19, 2, S("abcde0"));
3491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 20, 0, S("abcde"));
3492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 20, 1, S("abcde"));
3493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), 21, 0, S("can't happen"));
3494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S(""), 0, 0, S("abcdefghij"));
3495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S(""), 0, 1, S("abcdefghij"));
3496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S(""), 1, 0, S("can't happen"));
3497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 0, 0, S("abcdefghij"));
3498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 0, 1, S("abcdefghi1j"));
3499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 0, 2, S("abcdefghi12j"));
3500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 0, 4, S("abcdefghi1234j"));
3501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 0, 5, S("abcdefghi12345j"));
3502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 0, 6, S("abcdefghi12345j"));
3503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 1, 0, S("abcdefghij"));
3504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 1, 1, S("abcdefghi2j"));
3505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 1, 2, S("abcdefghi23j"));
3506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 1, 3, S("abcdefghi234j"));
3507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 1, 4, S("abcdefghi2345j"));
3508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 1, 5, S("abcdefghi2345j"));
3509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 2, 0, S("abcdefghij"));
3510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 2, 1, S("abcdefghi3j"));
3511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 2, 2, S("abcdefghi34j"));
3512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 2, 3, S("abcdefghi345j"));
3513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 2, 4, S("abcdefghi345j"));
3514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 4, 0, S("abcdefghij"));
3515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 4, 1, S("abcdefghi5j"));
3516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 4, 2, S("abcdefghi5j"));
3517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 5, 0, S("abcdefghij"));
3518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 5, 1, S("abcdefghij"));
3519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), 6, 0, S("can't happen"));
3520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 0, 0, S("abcdefghij"));
3521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 0, 1, S("abcdefghi1j"));
3522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 0, 5, S("abcdefghi12345j"));
3523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 0, 9, S("abcdefghi123456789j"));
3524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 0, 10, S("abcdefghi1234567890j"));
3525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 0, 11, S("abcdefghi1234567890j"));
3526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 1, 0, S("abcdefghij"));
3527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 1, 1, S("abcdefghi2j"));
3528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 1, 4, S("abcdefghi2345j"));
3529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 1, 8, S("abcdefghi23456789j"));
3530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 1, 9, S("abcdefghi234567890j"));
3531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 1, 10, S("abcdefghi234567890j"));
3532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 5, 0, S("abcdefghij"));
3533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 5, 1, S("abcdefghi6j"));
3534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 5, 2, S("abcdefghi67j"));
3535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 5, 4, S("abcdefghi6789j"));
3536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 5, 5, S("abcdefghi67890j"));
3537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 5, 6, S("abcdefghi67890j"));
3538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
3539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
35409dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
3541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test33()
3542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 9, 0, S("abcdefghij"));
3544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 9, 1, S("abcdefghi0j"));
3545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 9, 2, S("abcdefghi0j"));
3546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 10, 0, S("abcdefghij"));
3547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 10, 1, S("abcdefghij"));
3548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), 11, 0, S("can't happen"));
3549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 0, 0, S("abcdefghij"));
3550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 0, 1, S("abcdefghi1j"));
3551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 0, 10, S("abcdefghi1234567890j"));
3552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 0, 19, S("abcdefghi1234567890123456789j"));
3553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 0, 20, S("abcdefghi12345678901234567890j"));
3554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 0, 21, S("abcdefghi12345678901234567890j"));
3555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 1, 0, S("abcdefghij"));
3556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 1, 1, S("abcdefghi2j"));
3557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 1, 9, S("abcdefghi234567890j"));
3558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 1, 18, S("abcdefghi234567890123456789j"));
3559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 1, 19, S("abcdefghi2345678901234567890j"));
3560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 1, 20, S("abcdefghi2345678901234567890j"));
3561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 10, 0, S("abcdefghij"));
3562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 10, 1, S("abcdefghi1j"));
3563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 10, 5, S("abcdefghi12345j"));
3564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 10, 9, S("abcdefghi123456789j"));
3565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 10, 10, S("abcdefghi1234567890j"));
3566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 10, 11, S("abcdefghi1234567890j"));
3567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 19, 0, S("abcdefghij"));
3568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 19, 1, S("abcdefghi0j"));
3569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 19, 2, S("abcdefghi0j"));
3570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 20, 0, S("abcdefghij"));
3571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 20, 1, S("abcdefghij"));
3572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
3573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S(""), 0, 0, S("abcdefghi"));
3574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S(""), 0, 1, S("abcdefghi"));
3575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S(""), 1, 0, S("can't happen"));
3576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 0, 0, S("abcdefghi"));
3577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 0, 1, S("abcdefghi1"));
3578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 0, 2, S("abcdefghi12"));
3579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 0, 4, S("abcdefghi1234"));
3580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 0, 5, S("abcdefghi12345"));
3581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 0, 6, S("abcdefghi12345"));
3582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 1, 0, S("abcdefghi"));
3583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 1, 1, S("abcdefghi2"));
3584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 1, 2, S("abcdefghi23"));
3585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 1, 3, S("abcdefghi234"));
3586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 1, 4, S("abcdefghi2345"));
3587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 1, 5, S("abcdefghi2345"));
3588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 2, 0, S("abcdefghi"));
3589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 2, 1, S("abcdefghi3"));
3590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 2, 2, S("abcdefghi34"));
3591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 2, 3, S("abcdefghi345"));
3592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 2, 4, S("abcdefghi345"));
3593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 4, 0, S("abcdefghi"));
3594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 4, 1, S("abcdefghi5"));
3595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 4, 2, S("abcdefghi5"));
3596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 5, 0, S("abcdefghi"));
3597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 5, 1, S("abcdefghi"));
3598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), 6, 0, S("can't happen"));
3599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 0, 0, S("abcdefghi"));
3600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 0, 1, S("abcdefghi1"));
3601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 0, 5, S("abcdefghi12345"));
3602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 0, 9, S("abcdefghi123456789"));
3603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 0, 10, S("abcdefghi1234567890"));
3604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 0, 11, S("abcdefghi1234567890"));
3605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 1, 0, S("abcdefghi"));
3606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 1, 1, S("abcdefghi2"));
3607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 1, 4, S("abcdefghi2345"));
3608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 1, 8, S("abcdefghi23456789"));
3609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 1, 9, S("abcdefghi234567890"));
3610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 1, 10, S("abcdefghi234567890"));
3611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 5, 0, S("abcdefghi"));
3612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 5, 1, S("abcdefghi6"));
3613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 5, 2, S("abcdefghi67"));
3614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 5, 4, S("abcdefghi6789"));
3615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 5, 5, S("abcdefghi67890"));
3616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 5, 6, S("abcdefghi67890"));
3617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 9, 0, S("abcdefghi"));
3618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 9, 1, S("abcdefghi0"));
3619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 9, 2, S("abcdefghi0"));
3620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 10, 0, S("abcdefghi"));
3621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 10, 1, S("abcdefghi"));
3622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), 11, 0, S("can't happen"));
3623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 0, 0, S("abcdefghi"));
3624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 0, 1, S("abcdefghi1"));
3625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 0, 10, S("abcdefghi1234567890"));
3626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 0, 19, S("abcdefghi1234567890123456789"));
3627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 0, 20, S("abcdefghi12345678901234567890"));
3628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 0, 21, S("abcdefghi12345678901234567890"));
3629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 1, 0, S("abcdefghi"));
3630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 1, 1, S("abcdefghi2"));
3631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 1, 9, S("abcdefghi234567890"));
3632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 1, 18, S("abcdefghi234567890123456789"));
3633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 1, 19, S("abcdefghi2345678901234567890"));
3634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 1, 20, S("abcdefghi2345678901234567890"));
3635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 10, 0, S("abcdefghi"));
3636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 10, 1, S("abcdefghi1"));
3637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 10, 5, S("abcdefghi12345"));
3638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 10, 9, S("abcdefghi123456789"));
3639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 10, 10, S("abcdefghi1234567890"));
3640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 10, 11, S("abcdefghi1234567890"));
3641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 19, 0, S("abcdefghi"));
3642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 19, 1, S("abcdefghi0"));
3643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
3644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
36459dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
3646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test34()
3647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 19, 2, S("abcdefghi0"));
3649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 20, 0, S("abcdefghi"));
3650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 20, 1, S("abcdefghi"));
3651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
3652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S(""), 0, 0, S("abcdefghi"));
3653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S(""), 0, 1, S("abcdefghi"));
3654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S(""), 1, 0, S("can't happen"));
3655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 0, 0, S("abcdefghi"));
3656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 0, 1, S("abcdefghi1"));
3657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 0, 2, S("abcdefghi12"));
3658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 0, 4, S("abcdefghi1234"));
3659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 0, 5, S("abcdefghi12345"));
3660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 0, 6, S("abcdefghi12345"));
3661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 1, 0, S("abcdefghi"));
3662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 1, 1, S("abcdefghi2"));
3663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 1, 2, S("abcdefghi23"));
3664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 1, 3, S("abcdefghi234"));
3665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 1, 4, S("abcdefghi2345"));
3666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 1, 5, S("abcdefghi2345"));
3667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 2, 0, S("abcdefghi"));
3668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 2, 1, S("abcdefghi3"));
3669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 2, 2, S("abcdefghi34"));
3670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 2, 3, S("abcdefghi345"));
3671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 2, 4, S("abcdefghi345"));
3672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 4, 0, S("abcdefghi"));
3673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 4, 1, S("abcdefghi5"));
3674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 4, 2, S("abcdefghi5"));
3675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 5, 0, S("abcdefghi"));
3676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 5, 1, S("abcdefghi"));
3677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), 6, 0, S("can't happen"));
3678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 0, 0, S("abcdefghi"));
3679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 0, 1, S("abcdefghi1"));
3680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 0, 5, S("abcdefghi12345"));
3681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 0, 9, S("abcdefghi123456789"));
3682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 0, 10, S("abcdefghi1234567890"));
3683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 0, 11, S("abcdefghi1234567890"));
3684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 1, 0, S("abcdefghi"));
3685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 1, 1, S("abcdefghi2"));
3686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 1, 4, S("abcdefghi2345"));
3687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 1, 8, S("abcdefghi23456789"));
3688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 1, 9, S("abcdefghi234567890"));
3689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 1, 10, S("abcdefghi234567890"));
3690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 5, 0, S("abcdefghi"));
3691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 5, 1, S("abcdefghi6"));
3692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 5, 2, S("abcdefghi67"));
3693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 5, 4, S("abcdefghi6789"));
3694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 5, 5, S("abcdefghi67890"));
3695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 5, 6, S("abcdefghi67890"));
3696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 9, 0, S("abcdefghi"));
3697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 9, 1, S("abcdefghi0"));
3698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 9, 2, S("abcdefghi0"));
3699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 10, 0, S("abcdefghi"));
3700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 10, 1, S("abcdefghi"));
3701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), 11, 0, S("can't happen"));
3702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 0, 0, S("abcdefghi"));
3703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 0, 1, S("abcdefghi1"));
3704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 0, 10, S("abcdefghi1234567890"));
3705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 0, 19, S("abcdefghi1234567890123456789"));
3706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 0, 20, S("abcdefghi12345678901234567890"));
3707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 0, 21, S("abcdefghi12345678901234567890"));
3708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 1, 0, S("abcdefghi"));
3709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 1, 1, S("abcdefghi2"));
3710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 1, 9, S("abcdefghi234567890"));
3711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 1, 18, S("abcdefghi234567890123456789"));
3712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 1, 19, S("abcdefghi2345678901234567890"));
3713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 1, 20, S("abcdefghi2345678901234567890"));
3714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 10, 0, S("abcdefghi"));
3715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 10, 1, S("abcdefghi1"));
3716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 10, 5, S("abcdefghi12345"));
3717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 10, 9, S("abcdefghi123456789"));
3718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 10, 10, S("abcdefghi1234567890"));
3719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 10, 11, S("abcdefghi1234567890"));
3720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 19, 0, S("abcdefghi"));
3721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 19, 1, S("abcdefghi0"));
3722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 19, 2, S("abcdefghi0"));
3723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 20, 0, S("abcdefghi"));
3724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 20, 1, S("abcdefghi"));
3725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), 21, 0, S("can't happen"));
3726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S(""), 0, 0, S("abcdefghij"));
3727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S(""), 0, 1, S("abcdefghij"));
3728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S(""), 1, 0, S("can't happen"));
3729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 0, 0, S("abcdefghij"));
3730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 0, 1, S("abcdefghij1"));
3731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 0, 2, S("abcdefghij12"));
3732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 0, 4, S("abcdefghij1234"));
3733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 0, 5, S("abcdefghij12345"));
3734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 0, 6, S("abcdefghij12345"));
3735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 1, 0, S("abcdefghij"));
3736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 1, 1, S("abcdefghij2"));
3737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 1, 2, S("abcdefghij23"));
3738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 1, 3, S("abcdefghij234"));
3739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 1, 4, S("abcdefghij2345"));
3740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 1, 5, S("abcdefghij2345"));
3741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 2, 0, S("abcdefghij"));
3742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 2, 1, S("abcdefghij3"));
3743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 2, 2, S("abcdefghij34"));
3744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 2, 3, S("abcdefghij345"));
3745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 2, 4, S("abcdefghij345"));
3746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 4, 0, S("abcdefghij"));
3747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 4, 1, S("abcdefghij5"));
3748bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
3749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
37509dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
3751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test35()
3752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 4, 2, S("abcdefghij5"));
3754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 5, 0, S("abcdefghij"));
3755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 5, 1, S("abcdefghij"));
3756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), 6, 0, S("can't happen"));
3757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 0, 0, S("abcdefghij"));
3758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 0, 1, S("abcdefghij1"));
3759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 0, 5, S("abcdefghij12345"));
3760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 0, 9, S("abcdefghij123456789"));
3761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 0, 10, S("abcdefghij1234567890"));
3762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 0, 11, S("abcdefghij1234567890"));
3763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 1, 0, S("abcdefghij"));
3764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 1, 1, S("abcdefghij2"));
3765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 1, 4, S("abcdefghij2345"));
3766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 1, 8, S("abcdefghij23456789"));
3767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 1, 9, S("abcdefghij234567890"));
3768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 1, 10, S("abcdefghij234567890"));
3769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 5, 0, S("abcdefghij"));
3770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 5, 1, S("abcdefghij6"));
3771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 5, 2, S("abcdefghij67"));
3772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 5, 4, S("abcdefghij6789"));
3773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 5, 5, S("abcdefghij67890"));
3774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 5, 6, S("abcdefghij67890"));
3775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 9, 0, S("abcdefghij"));
3776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 9, 1, S("abcdefghij0"));
3777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 9, 2, S("abcdefghij0"));
3778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 10, 0, S("abcdefghij"));
3779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 10, 1, S("abcdefghij"));
3780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), 11, 0, S("can't happen"));
3781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 0, 0, S("abcdefghij"));
3782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 0, 1, S("abcdefghij1"));
3783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890"));
3784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789"));
3785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890"));
3786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890"));
3787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 1, 0, S("abcdefghij"));
3788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 1, 1, S("abcdefghij2"));
3789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 1, 9, S("abcdefghij234567890"));
3790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789"));
3791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890"));
3792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890"));
3793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 10, 0, S("abcdefghij"));
3794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 10, 1, S("abcdefghij1"));
3795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 10, 5, S("abcdefghij12345"));
3796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 10, 9, S("abcdefghij123456789"));
3797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890"));
3798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890"));
3799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 19, 0, S("abcdefghij"));
3800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 19, 1, S("abcdefghij0"));
3801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 19, 2, S("abcdefghij0"));
3802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 20, 0, S("abcdefghij"));
3803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 20, 1, S("abcdefghij"));
3804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
3805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S(""), 0, 0, S("abcdefghij"));
3806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S(""), 0, 1, S("abcdefghij"));
3807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S(""), 1, 0, S("can't happen"));
3808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 0, 0, S("abcdefghij"));
3809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 0, 1, S("abcdefghij1"));
3810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 0, 2, S("abcdefghij12"));
3811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 0, 4, S("abcdefghij1234"));
3812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 0, 5, S("abcdefghij12345"));
3813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 0, 6, S("abcdefghij12345"));
3814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 1, 0, S("abcdefghij"));
3815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 1, 1, S("abcdefghij2"));
3816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 1, 2, S("abcdefghij23"));
3817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 1, 3, S("abcdefghij234"));
3818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 1, 4, S("abcdefghij2345"));
3819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 1, 5, S("abcdefghij2345"));
3820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 2, 0, S("abcdefghij"));
3821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 2, 1, S("abcdefghij3"));
3822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 2, 2, S("abcdefghij34"));
3823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 2, 3, S("abcdefghij345"));
3824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 2, 4, S("abcdefghij345"));
3825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 4, 0, S("abcdefghij"));
3826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 4, 1, S("abcdefghij5"));
3827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 4, 2, S("abcdefghij5"));
3828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 5, 0, S("abcdefghij"));
3829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 5, 1, S("abcdefghij"));
3830bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), 6, 0, S("can't happen"));
3831bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 0, 0, S("abcdefghij"));
3832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 0, 1, S("abcdefghij1"));
3833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 0, 5, S("abcdefghij12345"));
3834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 0, 9, S("abcdefghij123456789"));
3835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 0, 10, S("abcdefghij1234567890"));
3836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 0, 11, S("abcdefghij1234567890"));
3837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 1, 0, S("abcdefghij"));
3838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 1, 1, S("abcdefghij2"));
3839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 1, 4, S("abcdefghij2345"));
3840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 1, 8, S("abcdefghij23456789"));
3841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 1, 9, S("abcdefghij234567890"));
3842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 1, 10, S("abcdefghij234567890"));
3843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 5, 0, S("abcdefghij"));
3844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 5, 1, S("abcdefghij6"));
3845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 5, 2, S("abcdefghij67"));
3846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 5, 4, S("abcdefghij6789"));
3847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 5, 5, S("abcdefghij67890"));
3848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 5, 6, S("abcdefghij67890"));
3849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 9, 0, S("abcdefghij"));
3850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 9, 1, S("abcdefghij0"));
3851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 9, 2, S("abcdefghij0"));
3852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 10, 0, S("abcdefghij"));
3853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
3854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
38559dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
3856bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test36()
3857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3858bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 10, 1, S("abcdefghij"));
3859bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), 11, 0, S("can't happen"));
3860bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 0, 0, S("abcdefghij"));
3861bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 0, 1, S("abcdefghij1"));
3862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890"));
3863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789"));
3864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890"));
3865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890"));
3866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 1, 0, S("abcdefghij"));
3867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 1, 1, S("abcdefghij2"));
3868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 1, 9, S("abcdefghij234567890"));
3869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789"));
3870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890"));
3871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890"));
3872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 10, 0, S("abcdefghij"));
3873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 10, 1, S("abcdefghij1"));
3874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 10, 5, S("abcdefghij12345"));
3875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 10, 9, S("abcdefghij123456789"));
3876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890"));
3877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890"));
3878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 19, 0, S("abcdefghij"));
3879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 19, 1, S("abcdefghij0"));
3880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 19, 2, S("abcdefghij0"));
3881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 20, 0, S("abcdefghij"));
3882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 20, 1, S("abcdefghij"));
3883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
3884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S(""), 0, 0, S("can't happen"));
3885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S(""), 0, 1, S("can't happen"));
3886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S(""), 1, 0, S("can't happen"));
3887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 0, 0, S("can't happen"));
3888bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 0, 1, S("can't happen"));
3889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 0, 2, S("can't happen"));
3890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 0, 4, S("can't happen"));
3891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 0, 5, S("can't happen"));
3892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 0, 6, S("can't happen"));
3893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 1, 0, S("can't happen"));
3894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 1, 1, S("can't happen"));
3895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 1, 2, S("can't happen"));
3896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 1, 3, S("can't happen"));
3897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 1, 4, S("can't happen"));
3898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 1, 5, S("can't happen"));
3899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 2, 0, S("can't happen"));
3900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 2, 1, S("can't happen"));
3901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 2, 2, S("can't happen"));
3902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 2, 3, S("can't happen"));
3903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 2, 4, S("can't happen"));
3904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 4, 0, S("can't happen"));
3905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 4, 1, S("can't happen"));
3906bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 4, 2, S("can't happen"));
3907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 5, 0, S("can't happen"));
3908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 5, 1, S("can't happen"));
3909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), 6, 0, S("can't happen"));
3910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 0, 0, S("can't happen"));
3911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 0, 1, S("can't happen"));
3912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 0, 5, S("can't happen"));
3913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 0, 9, S("can't happen"));
3914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 0, 10, S("can't happen"));
3915bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 0, 11, S("can't happen"));
3916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 1, 0, S("can't happen"));
3917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 1, 1, S("can't happen"));
3918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 1, 4, S("can't happen"));
3919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 1, 8, S("can't happen"));
3920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 1, 9, S("can't happen"));
3921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 1, 10, S("can't happen"));
3922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 5, 0, S("can't happen"));
3923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 5, 1, S("can't happen"));
3924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 5, 2, S("can't happen"));
3925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 5, 4, S("can't happen"));
3926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 5, 5, S("can't happen"));
3927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 5, 6, S("can't happen"));
3928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 9, 0, S("can't happen"));
3929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 9, 1, S("can't happen"));
3930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 9, 2, S("can't happen"));
3931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 10, 0, S("can't happen"));
3932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 10, 1, S("can't happen"));
3933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), 11, 0, S("can't happen"));
3934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 0, 0, S("can't happen"));
3935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 0, 1, S("can't happen"));
3936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 0, 10, S("can't happen"));
3937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 0, 19, S("can't happen"));
3938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 0, 20, S("can't happen"));
3939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 0, 21, S("can't happen"));
3940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 1, 0, S("can't happen"));
3941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 1, 1, S("can't happen"));
3942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 1, 9, S("can't happen"));
3943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 1, 18, S("can't happen"));
3944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 1, 19, S("can't happen"));
3945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 1, 20, S("can't happen"));
3946bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 10, 0, S("can't happen"));
3947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 10, 1, S("can't happen"));
3948bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 10, 5, S("can't happen"));
3949bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 10, 9, S("can't happen"));
3950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 10, 10, S("can't happen"));
3951bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 10, 11, S("can't happen"));
3952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 19, 0, S("can't happen"));
3953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 19, 1, S("can't happen"));
3954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 19, 2, S("can't happen"));
3955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 20, 0, S("can't happen"));
3956bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 20, 1, S("can't happen"));
3957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
3958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
3959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
39609dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
3961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test37()
3962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 0, S("abcdefghijklmnopqrst"));
3964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 1, S("abcdefghijklmnopqrst"));
3965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 1, 0, S("can't happen"));
3966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
3967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 0, 1, S("1abcdefghijklmnopqrst"));
3968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 0, 2, S("12abcdefghijklmnopqrst"));
3969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 0, 4, S("1234abcdefghijklmnopqrst"));
3970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 0, 5, S("12345abcdefghijklmnopqrst"));
3971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 0, 6, S("12345abcdefghijklmnopqrst"));
3972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
3973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 1, 1, S("2abcdefghijklmnopqrst"));
3974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 1, 2, S("23abcdefghijklmnopqrst"));
3975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 1, 3, S("234abcdefghijklmnopqrst"));
3976bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 1, 4, S("2345abcdefghijklmnopqrst"));
3977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 1, 5, S("2345abcdefghijklmnopqrst"));
3978bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
3979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 2, 1, S("3abcdefghijklmnopqrst"));
3980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 2, 2, S("34abcdefghijklmnopqrst"));
3981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 2, 3, S("345abcdefghijklmnopqrst"));
3982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 2, 4, S("345abcdefghijklmnopqrst"));
3983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
3984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 4, 1, S("5abcdefghijklmnopqrst"));
3985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 4, 2, S("5abcdefghijklmnopqrst"));
3986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
3987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
3988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), 6, 0, S("can't happen"));
3989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
3990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 0, 1, S("1abcdefghijklmnopqrst"));
3991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 0, 5, S("12345abcdefghijklmnopqrst"));
3992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 0, 9, S("123456789abcdefghijklmnopqrst"));
3993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 0, 10, S("1234567890abcdefghijklmnopqrst"));
3994bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 0, 11, S("1234567890abcdefghijklmnopqrst"));
3995bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
3996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 1, 1, S("2abcdefghijklmnopqrst"));
3997bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 1, 4, S("2345abcdefghijklmnopqrst"));
3998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 1, 8, S("23456789abcdefghijklmnopqrst"));
3999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 1, 9, S("234567890abcdefghijklmnopqrst"));
4000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 1, 10, S("234567890abcdefghijklmnopqrst"));
4001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
4002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 5, 1, S("6abcdefghijklmnopqrst"));
4003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 5, 2, S("67abcdefghijklmnopqrst"));
4004bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 5, 4, S("6789abcdefghijklmnopqrst"));
4005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 5, 5, S("67890abcdefghijklmnopqrst"));
4006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 5, 6, S("67890abcdefghijklmnopqrst"));
4007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
4008bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 9, 1, S("0abcdefghijklmnopqrst"));
4009bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 9, 2, S("0abcdefghijklmnopqrst"));
4010bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
4011bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
4012bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), 11, 0, S("can't happen"));
4013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
4014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 0, 1, S("1abcdefghijklmnopqrst"));
4015bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 0, 10, S("1234567890abcdefghijklmnopqrst"));
4016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 0, 19, S("1234567890123456789abcdefghijklmnopqrst"));
4017bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 0, 20, S("12345678901234567890abcdefghijklmnopqrst"));
4018bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 0, 21, S("12345678901234567890abcdefghijklmnopqrst"));
4019bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
4020bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 1, 1, S("2abcdefghijklmnopqrst"));
4021bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 1, 9, S("234567890abcdefghijklmnopqrst"));
4022bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 1, 18, S("234567890123456789abcdefghijklmnopqrst"));
4023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 1, 19, S("2345678901234567890abcdefghijklmnopqrst"));
4024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 1, 20, S("2345678901234567890abcdefghijklmnopqrst"));
4025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
4026bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 10, 1, S("1abcdefghijklmnopqrst"));
4027bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 10, 5, S("12345abcdefghijklmnopqrst"));
4028bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 10, 9, S("123456789abcdefghijklmnopqrst"));
4029bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 10, 10, S("1234567890abcdefghijklmnopqrst"));
4030bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 10, 11, S("1234567890abcdefghijklmnopqrst"));
4031bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
4032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 19, 1, S("0abcdefghijklmnopqrst"));
4033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 19, 2, S("0abcdefghijklmnopqrst"));
4034bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
4035bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
4036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
4037bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 0, S("bcdefghijklmnopqrst"));
4038bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 1, S("bcdefghijklmnopqrst"));
4039bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 1, 0, S("can't happen"));
4040bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 0, 0, S("bcdefghijklmnopqrst"));
4041bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 0, 1, S("1bcdefghijklmnopqrst"));
4042bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 0, 2, S("12bcdefghijklmnopqrst"));
4043bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 0, 4, S("1234bcdefghijklmnopqrst"));
4044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 0, 5, S("12345bcdefghijklmnopqrst"));
4045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 0, 6, S("12345bcdefghijklmnopqrst"));
4046bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 1, 0, S("bcdefghijklmnopqrst"));
4047bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 1, 1, S("2bcdefghijklmnopqrst"));
4048bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 1, 2, S("23bcdefghijklmnopqrst"));
4049bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 1, 3, S("234bcdefghijklmnopqrst"));
4050bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 1, 4, S("2345bcdefghijklmnopqrst"));
4051bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 1, 5, S("2345bcdefghijklmnopqrst"));
4052bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 2, 0, S("bcdefghijklmnopqrst"));
4053bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 2, 1, S("3bcdefghijklmnopqrst"));
4054bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 2, 2, S("34bcdefghijklmnopqrst"));
4055bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 2, 3, S("345bcdefghijklmnopqrst"));
4056bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 2, 4, S("345bcdefghijklmnopqrst"));
4057bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 4, 0, S("bcdefghijklmnopqrst"));
4058bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 4, 1, S("5bcdefghijklmnopqrst"));
4059bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 4, 2, S("5bcdefghijklmnopqrst"));
4060bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 5, 0, S("bcdefghijklmnopqrst"));
4061bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 5, 1, S("bcdefghijklmnopqrst"));
4062bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), 6, 0, S("can't happen"));
4063bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
40659dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
4066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test38()
4067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 0, 0, S("bcdefghijklmnopqrst"));
4069bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 0, 1, S("1bcdefghijklmnopqrst"));
4070bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 0, 5, S("12345bcdefghijklmnopqrst"));
4071bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 0, 9, S("123456789bcdefghijklmnopqrst"));
4072bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 0, 10, S("1234567890bcdefghijklmnopqrst"));
4073bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 0, 11, S("1234567890bcdefghijklmnopqrst"));
4074bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 1, 0, S("bcdefghijklmnopqrst"));
4075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 1, 1, S("2bcdefghijklmnopqrst"));
4076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 1, 4, S("2345bcdefghijklmnopqrst"));
4077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 1, 8, S("23456789bcdefghijklmnopqrst"));
4078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 1, 9, S("234567890bcdefghijklmnopqrst"));
4079bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 1, 10, S("234567890bcdefghijklmnopqrst"));
4080bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 5, 0, S("bcdefghijklmnopqrst"));
4081bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 5, 1, S("6bcdefghijklmnopqrst"));
4082bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 5, 2, S("67bcdefghijklmnopqrst"));
4083bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 5, 4, S("6789bcdefghijklmnopqrst"));
4084bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 5, 5, S("67890bcdefghijklmnopqrst"));
4085bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 5, 6, S("67890bcdefghijklmnopqrst"));
4086bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 9, 0, S("bcdefghijklmnopqrst"));
4087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 9, 1, S("0bcdefghijklmnopqrst"));
4088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 9, 2, S("0bcdefghijklmnopqrst"));
4089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 10, 0, S("bcdefghijklmnopqrst"));
4090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 10, 1, S("bcdefghijklmnopqrst"));
4091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), 11, 0, S("can't happen"));
4092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 0, 0, S("bcdefghijklmnopqrst"));
4093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 0, 1, S("1bcdefghijklmnopqrst"));
4094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 0, 10, S("1234567890bcdefghijklmnopqrst"));
4095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 0, 19, S("1234567890123456789bcdefghijklmnopqrst"));
4096bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 0, 20, S("12345678901234567890bcdefghijklmnopqrst"));
4097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 0, 21, S("12345678901234567890bcdefghijklmnopqrst"));
4098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 1, 0, S("bcdefghijklmnopqrst"));
4099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 1, 1, S("2bcdefghijklmnopqrst"));
4100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 1, 9, S("234567890bcdefghijklmnopqrst"));
4101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 1, 18, S("234567890123456789bcdefghijklmnopqrst"));
4102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 1, 19, S("2345678901234567890bcdefghijklmnopqrst"));
4103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 1, 20, S("2345678901234567890bcdefghijklmnopqrst"));
4104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 10, 0, S("bcdefghijklmnopqrst"));
4105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 10, 1, S("1bcdefghijklmnopqrst"));
4106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 10, 5, S("12345bcdefghijklmnopqrst"));
4107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 10, 9, S("123456789bcdefghijklmnopqrst"));
4108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 10, 10, S("1234567890bcdefghijklmnopqrst"));
4109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 10, 11, S("1234567890bcdefghijklmnopqrst"));
4110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 19, 0, S("bcdefghijklmnopqrst"));
4111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 19, 1, S("0bcdefghijklmnopqrst"));
4112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 19, 2, S("0bcdefghijklmnopqrst"));
4113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 20, 0, S("bcdefghijklmnopqrst"));
4114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 20, 1, S("bcdefghijklmnopqrst"));
4115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
4116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 0, S("klmnopqrst"));
4117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 1, S("klmnopqrst"));
4118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 1, 0, S("can't happen"));
4119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 0, 0, S("klmnopqrst"));
4120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 0, 1, S("1klmnopqrst"));
4121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 0, 2, S("12klmnopqrst"));
4122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 0, 4, S("1234klmnopqrst"));
4123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 0, 5, S("12345klmnopqrst"));
4124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 0, 6, S("12345klmnopqrst"));
4125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 1, 0, S("klmnopqrst"));
4126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 1, 1, S("2klmnopqrst"));
4127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 1, 2, S("23klmnopqrst"));
4128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 1, 3, S("234klmnopqrst"));
4129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 1, 4, S("2345klmnopqrst"));
4130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 1, 5, S("2345klmnopqrst"));
4131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 2, 0, S("klmnopqrst"));
4132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 2, 1, S("3klmnopqrst"));
4133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 2, 2, S("34klmnopqrst"));
4134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 2, 3, S("345klmnopqrst"));
4135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 2, 4, S("345klmnopqrst"));
4136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 4, 0, S("klmnopqrst"));
4137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 4, 1, S("5klmnopqrst"));
4138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 4, 2, S("5klmnopqrst"));
4139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 5, 0, S("klmnopqrst"));
4140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 5, 1, S("klmnopqrst"));
4141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), 6, 0, S("can't happen"));
4142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 0, 0, S("klmnopqrst"));
4143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 0, 1, S("1klmnopqrst"));
4144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 0, 5, S("12345klmnopqrst"));
4145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 0, 9, S("123456789klmnopqrst"));
4146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 0, 10, S("1234567890klmnopqrst"));
4147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 0, 11, S("1234567890klmnopqrst"));
4148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 1, 0, S("klmnopqrst"));
4149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 1, 1, S("2klmnopqrst"));
4150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 1, 4, S("2345klmnopqrst"));
4151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 1, 8, S("23456789klmnopqrst"));
4152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 1, 9, S("234567890klmnopqrst"));
4153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 1, 10, S("234567890klmnopqrst"));
4154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 5, 0, S("klmnopqrst"));
4155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 5, 1, S("6klmnopqrst"));
4156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 5, 2, S("67klmnopqrst"));
4157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 5, 4, S("6789klmnopqrst"));
4158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 5, 5, S("67890klmnopqrst"));
4159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 5, 6, S("67890klmnopqrst"));
4160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 9, 0, S("klmnopqrst"));
4161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 9, 1, S("0klmnopqrst"));
4162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 9, 2, S("0klmnopqrst"));
4163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 10, 0, S("klmnopqrst"));
4164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 10, 1, S("klmnopqrst"));
4165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), 11, 0, S("can't happen"));
4166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 0, 0, S("klmnopqrst"));
4167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 0, 1, S("1klmnopqrst"));
4168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
41709dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
4171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test39()
4172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 0, 10, S("1234567890klmnopqrst"));
4174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 0, 19, S("1234567890123456789klmnopqrst"));
4175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 0, 20, S("12345678901234567890klmnopqrst"));
4176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 0, 21, S("12345678901234567890klmnopqrst"));
4177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 1, 0, S("klmnopqrst"));
4178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 1, 1, S("2klmnopqrst"));
4179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 1, 9, S("234567890klmnopqrst"));
4180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 1, 18, S("234567890123456789klmnopqrst"));
4181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 1, 19, S("2345678901234567890klmnopqrst"));
4182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 1, 20, S("2345678901234567890klmnopqrst"));
4183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 10, 0, S("klmnopqrst"));
4184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 10, 1, S("1klmnopqrst"));
4185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 10, 5, S("12345klmnopqrst"));
4186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 10, 9, S("123456789klmnopqrst"));
4187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 10, 10, S("1234567890klmnopqrst"));
4188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 10, 11, S("1234567890klmnopqrst"));
4189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 19, 0, S("klmnopqrst"));
4190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 19, 1, S("0klmnopqrst"));
4191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 19, 2, S("0klmnopqrst"));
4192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 20, 0, S("klmnopqrst"));
4193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 20, 1, S("klmnopqrst"));
4194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), 21, 0, S("can't happen"));
4195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 0, S("t"));
4196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 1, S("t"));
4197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 1, 0, S("can't happen"));
4198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 0, 0, S("t"));
4199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 0, 1, S("1t"));
4200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 0, 2, S("12t"));
4201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 0, 4, S("1234t"));
4202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 0, 5, S("12345t"));
4203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 0, 6, S("12345t"));
4204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 1, 0, S("t"));
4205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 1, 1, S("2t"));
4206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 1, 2, S("23t"));
4207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 1, 3, S("234t"));
4208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 1, 4, S("2345t"));
4209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 1, 5, S("2345t"));
4210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 2, 0, S("t"));
4211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 2, 1, S("3t"));
4212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 2, 2, S("34t"));
4213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 2, 3, S("345t"));
4214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 2, 4, S("345t"));
4215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 4, 0, S("t"));
4216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 4, 1, S("5t"));
4217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 4, 2, S("5t"));
4218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 5, 0, S("t"));
4219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 5, 1, S("t"));
4220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), 6, 0, S("can't happen"));
4221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 0, 0, S("t"));
4222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 0, 1, S("1t"));
4223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 0, 5, S("12345t"));
4224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 0, 9, S("123456789t"));
4225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 0, 10, S("1234567890t"));
4226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 0, 11, S("1234567890t"));
4227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 1, 0, S("t"));
4228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 1, 1, S("2t"));
4229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 1, 4, S("2345t"));
4230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 1, 8, S("23456789t"));
4231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 1, 9, S("234567890t"));
4232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 1, 10, S("234567890t"));
4233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 5, 0, S("t"));
4234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 5, 1, S("6t"));
4235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 5, 2, S("67t"));
4236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 5, 4, S("6789t"));
4237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 5, 5, S("67890t"));
4238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 5, 6, S("67890t"));
4239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 9, 0, S("t"));
4240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 9, 1, S("0t"));
4241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 9, 2, S("0t"));
4242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 10, 0, S("t"));
4243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 10, 1, S("t"));
4244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), 11, 0, S("can't happen"));
4245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 0, 0, S("t"));
4246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 0, 1, S("1t"));
4247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 0, 10, S("1234567890t"));
4248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 0, 19, S("1234567890123456789t"));
4249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 0, 20, S("12345678901234567890t"));
4250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 0, 21, S("12345678901234567890t"));
4251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 1, 0, S("t"));
4252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 1, 1, S("2t"));
4253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 1, 9, S("234567890t"));
4254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 1, 18, S("234567890123456789t"));
4255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 1, 19, S("2345678901234567890t"));
4256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 1, 20, S("2345678901234567890t"));
4257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 10, 0, S("t"));
4258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 10, 1, S("1t"));
4259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 10, 5, S("12345t"));
4260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 10, 9, S("123456789t"));
4261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 10, 10, S("1234567890t"));
4262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 10, 11, S("1234567890t"));
4263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 19, 0, S("t"));
4264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 19, 1, S("0t"));
4265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 19, 2, S("0t"));
4266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 20, 0, S("t"));
4267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 20, 1, S("t"));
4268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), 21, 0, S("can't happen"));
4269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 0, S(""));
4270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 1, S(""));
4271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 1, 0, S("can't happen"));
4272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 0, 0, S(""));
4273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
42759dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
4276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test40()
4277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 0, 1, S("1"));
4279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 0, 2, S("12"));
4280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 0, 4, S("1234"));
4281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 0, 5, S("12345"));
4282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 0, 6, S("12345"));
4283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 1, 0, S(""));
4284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 1, 1, S("2"));
4285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 1, 2, S("23"));
4286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 1, 3, S("234"));
4287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 1, 4, S("2345"));
4288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 1, 5, S("2345"));
4289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 2, 0, S(""));
4290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 2, 1, S("3"));
4291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 2, 2, S("34"));
4292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 2, 3, S("345"));
4293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 2, 4, S("345"));
4294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 4, 0, S(""));
4295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 4, 1, S("5"));
4296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 4, 2, S("5"));
4297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 5, 0, S(""));
4298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 5, 1, S(""));
4299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), 6, 0, S("can't happen"));
4300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 0, 0, S(""));
4301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 0, 1, S("1"));
4302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 0, 5, S("12345"));
4303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 0, 9, S("123456789"));
4304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 0, 10, S("1234567890"));
4305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 0, 11, S("1234567890"));
4306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 1, 0, S(""));
4307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 1, 1, S("2"));
4308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 1, 4, S("2345"));
4309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 1, 8, S("23456789"));
4310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 1, 9, S("234567890"));
4311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 1, 10, S("234567890"));
4312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 5, 0, S(""));
4313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 5, 1, S("6"));
4314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 5, 2, S("67"));
4315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 5, 4, S("6789"));
4316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 5, 5, S("67890"));
4317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 5, 6, S("67890"));
4318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 9, 0, S(""));
4319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 9, 1, S("0"));
4320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 9, 2, S("0"));
4321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 10, 0, S(""));
4322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 10, 1, S(""));
4323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), 11, 0, S("can't happen"));
4324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 0, 0, S(""));
4325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 0, 1, S("1"));
4326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 0, 10, S("1234567890"));
4327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 0, 19, S("1234567890123456789"));
4328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 0, 20, S("12345678901234567890"));
4329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 0, 21, S("12345678901234567890"));
4330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 1, 0, S(""));
4331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 1, 1, S("2"));
4332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 1, 9, S("234567890"));
4333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 1, 18, S("234567890123456789"));
4334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 1, 19, S("2345678901234567890"));
4335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 1, 20, S("2345678901234567890"));
4336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 10, 0, S(""));
4337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 10, 1, S("1"));
4338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 10, 5, S("12345"));
4339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 10, 9, S("123456789"));
4340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 10, 10, S("1234567890"));
4341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 10, 11, S("1234567890"));
4342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 19, 0, S(""));
4343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 19, 1, S("0"));
4344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 19, 2, S("0"));
4345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 20, 0, S(""));
4346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 20, 1, S(""));
4347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), 21, 0, S("can't happen"));
4348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 0, S(""));
4349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 1, S(""));
4350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 1, 0, S("can't happen"));
4351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 0, 0, S(""));
4352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 0, 1, S("1"));
4353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 0, 2, S("12"));
4354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 0, 4, S("1234"));
4355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 0, 5, S("12345"));
4356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 0, 6, S("12345"));
4357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 1, 0, S(""));
4358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 1, 1, S("2"));
4359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 1, 2, S("23"));
4360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 1, 3, S("234"));
4361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 1, 4, S("2345"));
4362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 1, 5, S("2345"));
4363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 2, 0, S(""));
4364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 2, 1, S("3"));
4365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 2, 2, S("34"));
4366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 2, 3, S("345"));
4367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 2, 4, S("345"));
4368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 4, 0, S(""));
4369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 4, 1, S("5"));
4370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 4, 2, S("5"));
4371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 5, 0, S(""));
4372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 5, 1, S(""));
4373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), 6, 0, S("can't happen"));
4374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 0, 0, S(""));
4375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 0, 1, S("1"));
4376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 0, 5, S("12345"));
4377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 0, 9, S("123456789"));
4378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
43809dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
4381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test41()
4382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 0, 10, S("1234567890"));
4384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 0, 11, S("1234567890"));
4385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 1, 0, S(""));
4386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 1, 1, S("2"));
4387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 1, 4, S("2345"));
4388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 1, 8, S("23456789"));
4389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 1, 9, S("234567890"));
4390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 1, 10, S("234567890"));
4391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 5, 0, S(""));
4392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 5, 1, S("6"));
4393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 5, 2, S("67"));
4394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 5, 4, S("6789"));
4395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 5, 5, S("67890"));
4396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 5, 6, S("67890"));
4397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 9, 0, S(""));
4398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 9, 1, S("0"));
4399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 9, 2, S("0"));
4400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 10, 0, S(""));
4401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 10, 1, S(""));
4402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), 11, 0, S("can't happen"));
4403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 0, 0, S(""));
4404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 0, 1, S("1"));
4405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 0, 10, S("1234567890"));
4406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 0, 19, S("1234567890123456789"));
4407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 0, 20, S("12345678901234567890"));
4408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 0, 21, S("12345678901234567890"));
4409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 1, 0, S(""));
4410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 1, 1, S("2"));
4411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 1, 9, S("234567890"));
4412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 1, 18, S("234567890123456789"));
4413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 1, 19, S("2345678901234567890"));
4414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 1, 20, S("2345678901234567890"));
4415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 10, 0, S(""));
4416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 10, 1, S("1"));
4417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 10, 5, S("12345"));
4418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 10, 9, S("123456789"));
4419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 10, 10, S("1234567890"));
4420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 10, 11, S("1234567890"));
4421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 19, 0, S(""));
4422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 19, 1, S("0"));
4423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 19, 2, S("0"));
4424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 20, 0, S(""));
4425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 20, 1, S(""));
4426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), 21, 0, S("can't happen"));
4427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 0, S("abcdefghijklmnopqrst"));
4428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 1, S("abcdefghijklmnopqrst"));
4429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 1, 0, S("can't happen"));
4430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
4431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 0, 1, S("a1bcdefghijklmnopqrst"));
4432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 0, 2, S("a12bcdefghijklmnopqrst"));
4433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 0, 4, S("a1234bcdefghijklmnopqrst"));
4434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 0, 5, S("a12345bcdefghijklmnopqrst"));
4435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 0, 6, S("a12345bcdefghijklmnopqrst"));
4436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
4437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 1, 1, S("a2bcdefghijklmnopqrst"));
4438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 1, 2, S("a23bcdefghijklmnopqrst"));
4439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 1, 3, S("a234bcdefghijklmnopqrst"));
4440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 1, 4, S("a2345bcdefghijklmnopqrst"));
4441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 1, 5, S("a2345bcdefghijklmnopqrst"));
4442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
4443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 2, 1, S("a3bcdefghijklmnopqrst"));
4444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 2, 2, S("a34bcdefghijklmnopqrst"));
4445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 2, 3, S("a345bcdefghijklmnopqrst"));
4446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 2, 4, S("a345bcdefghijklmnopqrst"));
4447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
4448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 4, 1, S("a5bcdefghijklmnopqrst"));
4449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 4, 2, S("a5bcdefghijklmnopqrst"));
4450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
4451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
4452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), 6, 0, S("can't happen"));
4453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
4454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 0, 1, S("a1bcdefghijklmnopqrst"));
4455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 0, 5, S("a12345bcdefghijklmnopqrst"));
4456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 0, 9, S("a123456789bcdefghijklmnopqrst"));
4457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 0, 10, S("a1234567890bcdefghijklmnopqrst"));
4458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 0, 11, S("a1234567890bcdefghijklmnopqrst"));
4459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
4460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 1, 1, S("a2bcdefghijklmnopqrst"));
4461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 1, 4, S("a2345bcdefghijklmnopqrst"));
4462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 1, 8, S("a23456789bcdefghijklmnopqrst"));
4463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 1, 9, S("a234567890bcdefghijklmnopqrst"));
4464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 1, 10, S("a234567890bcdefghijklmnopqrst"));
4465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
4466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 5, 1, S("a6bcdefghijklmnopqrst"));
4467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 5, 2, S("a67bcdefghijklmnopqrst"));
4468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 5, 4, S("a6789bcdefghijklmnopqrst"));
4469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 5, 5, S("a67890bcdefghijklmnopqrst"));
4470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 5, 6, S("a67890bcdefghijklmnopqrst"));
4471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
4472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 9, 1, S("a0bcdefghijklmnopqrst"));
4473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 9, 2, S("a0bcdefghijklmnopqrst"));
4474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
4475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
4476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), 11, 0, S("can't happen"));
4477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
4478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 0, 1, S("a1bcdefghijklmnopqrst"));
4479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 0, 10, S("a1234567890bcdefghijklmnopqrst"));
4480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 0, 19, S("a1234567890123456789bcdefghijklmnopqrst"));
4481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 0, 20, S("a12345678901234567890bcdefghijklmnopqrst"));
4482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 0, 21, S("a12345678901234567890bcdefghijklmnopqrst"));
4483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
44859dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
4486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test42()
4487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
4489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 1, 1, S("a2bcdefghijklmnopqrst"));
4490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 1, 9, S("a234567890bcdefghijklmnopqrst"));
4491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 1, 18, S("a234567890123456789bcdefghijklmnopqrst"));
4492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 1, 19, S("a2345678901234567890bcdefghijklmnopqrst"));
4493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 1, 20, S("a2345678901234567890bcdefghijklmnopqrst"));
4494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
4495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 10, 1, S("a1bcdefghijklmnopqrst"));
4496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 10, 5, S("a12345bcdefghijklmnopqrst"));
4497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 10, 9, S("a123456789bcdefghijklmnopqrst"));
4498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 10, 10, S("a1234567890bcdefghijklmnopqrst"));
4499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 10, 11, S("a1234567890bcdefghijklmnopqrst"));
4500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
4501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 19, 1, S("a0bcdefghijklmnopqrst"));
4502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 19, 2, S("a0bcdefghijklmnopqrst"));
4503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
4504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
4505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
4506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 0, S("acdefghijklmnopqrst"));
4507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 1, S("acdefghijklmnopqrst"));
4508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 1, 0, S("can't happen"));
4509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 0, 0, S("acdefghijklmnopqrst"));
4510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 0, 1, S("a1cdefghijklmnopqrst"));
4511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 0, 2, S("a12cdefghijklmnopqrst"));
4512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 0, 4, S("a1234cdefghijklmnopqrst"));
4513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 0, 5, S("a12345cdefghijklmnopqrst"));
4514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 0, 6, S("a12345cdefghijklmnopqrst"));
4515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 1, 0, S("acdefghijklmnopqrst"));
4516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 1, 1, S("a2cdefghijklmnopqrst"));
4517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 1, 2, S("a23cdefghijklmnopqrst"));
4518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 1, 3, S("a234cdefghijklmnopqrst"));
4519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 1, 4, S("a2345cdefghijklmnopqrst"));
4520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 1, 5, S("a2345cdefghijklmnopqrst"));
4521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 2, 0, S("acdefghijklmnopqrst"));
4522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 2, 1, S("a3cdefghijklmnopqrst"));
4523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 2, 2, S("a34cdefghijklmnopqrst"));
4524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 2, 3, S("a345cdefghijklmnopqrst"));
4525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 2, 4, S("a345cdefghijklmnopqrst"));
4526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 4, 0, S("acdefghijklmnopqrst"));
4527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 4, 1, S("a5cdefghijklmnopqrst"));
4528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 4, 2, S("a5cdefghijklmnopqrst"));
4529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 5, 0, S("acdefghijklmnopqrst"));
4530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 5, 1, S("acdefghijklmnopqrst"));
4531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), 6, 0, S("can't happen"));
4532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 0, 0, S("acdefghijklmnopqrst"));
4533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 0, 1, S("a1cdefghijklmnopqrst"));
4534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 0, 5, S("a12345cdefghijklmnopqrst"));
4535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 0, 9, S("a123456789cdefghijklmnopqrst"));
4536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 0, 10, S("a1234567890cdefghijklmnopqrst"));
4537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 0, 11, S("a1234567890cdefghijklmnopqrst"));
4538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 1, 0, S("acdefghijklmnopqrst"));
4539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 1, 1, S("a2cdefghijklmnopqrst"));
4540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 1, 4, S("a2345cdefghijklmnopqrst"));
4541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 1, 8, S("a23456789cdefghijklmnopqrst"));
4542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 1, 9, S("a234567890cdefghijklmnopqrst"));
4543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 1, 10, S("a234567890cdefghijklmnopqrst"));
4544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 5, 0, S("acdefghijklmnopqrst"));
4545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 5, 1, S("a6cdefghijklmnopqrst"));
4546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 5, 2, S("a67cdefghijklmnopqrst"));
4547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 5, 4, S("a6789cdefghijklmnopqrst"));
4548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 5, 5, S("a67890cdefghijklmnopqrst"));
4549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 5, 6, S("a67890cdefghijklmnopqrst"));
4550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 9, 0, S("acdefghijklmnopqrst"));
4551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 9, 1, S("a0cdefghijklmnopqrst"));
4552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 9, 2, S("a0cdefghijklmnopqrst"));
4553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 10, 0, S("acdefghijklmnopqrst"));
4554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 10, 1, S("acdefghijklmnopqrst"));
4555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), 11, 0, S("can't happen"));
4556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 0, 0, S("acdefghijklmnopqrst"));
4557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 0, 1, S("a1cdefghijklmnopqrst"));
4558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 0, 10, S("a1234567890cdefghijklmnopqrst"));
4559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 0, 19, S("a1234567890123456789cdefghijklmnopqrst"));
4560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 0, 20, S("a12345678901234567890cdefghijklmnopqrst"));
4561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 0, 21, S("a12345678901234567890cdefghijklmnopqrst"));
4562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 1, 0, S("acdefghijklmnopqrst"));
4563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 1, 1, S("a2cdefghijklmnopqrst"));
4564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 1, 9, S("a234567890cdefghijklmnopqrst"));
4565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 1, 18, S("a234567890123456789cdefghijklmnopqrst"));
4566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 1, 19, S("a2345678901234567890cdefghijklmnopqrst"));
4567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 1, 20, S("a2345678901234567890cdefghijklmnopqrst"));
4568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 10, 0, S("acdefghijklmnopqrst"));
4569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 10, 1, S("a1cdefghijklmnopqrst"));
4570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 10, 5, S("a12345cdefghijklmnopqrst"));
4571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 10, 9, S("a123456789cdefghijklmnopqrst"));
4572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 10, 10, S("a1234567890cdefghijklmnopqrst"));
4573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 10, 11, S("a1234567890cdefghijklmnopqrst"));
4574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 19, 0, S("acdefghijklmnopqrst"));
4575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 19, 1, S("a0cdefghijklmnopqrst"));
4576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 19, 2, S("a0cdefghijklmnopqrst"));
4577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 20, 0, S("acdefghijklmnopqrst"));
4578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 20, 1, S("acdefghijklmnopqrst"));
4579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
4580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 0, S("aklmnopqrst"));
4581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 1, S("aklmnopqrst"));
4582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 1, 0, S("can't happen"));
4583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 0, 0, S("aklmnopqrst"));
4584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 0, 1, S("a1klmnopqrst"));
4585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 0, 2, S("a12klmnopqrst"));
4586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 0, 4, S("a1234klmnopqrst"));
4587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 0, 5, S("a12345klmnopqrst"));
4588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
45909dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
4591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test43()
4592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 0, 6, S("a12345klmnopqrst"));
4594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 1, 0, S("aklmnopqrst"));
4595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 1, 1, S("a2klmnopqrst"));
4596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 1, 2, S("a23klmnopqrst"));
4597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 1, 3, S("a234klmnopqrst"));
4598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 1, 4, S("a2345klmnopqrst"));
4599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 1, 5, S("a2345klmnopqrst"));
4600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 2, 0, S("aklmnopqrst"));
4601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 2, 1, S("a3klmnopqrst"));
4602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 2, 2, S("a34klmnopqrst"));
4603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 2, 3, S("a345klmnopqrst"));
4604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 2, 4, S("a345klmnopqrst"));
4605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 4, 0, S("aklmnopqrst"));
4606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 4, 1, S("a5klmnopqrst"));
4607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 4, 2, S("a5klmnopqrst"));
4608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 5, 0, S("aklmnopqrst"));
4609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 5, 1, S("aklmnopqrst"));
4610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), 6, 0, S("can't happen"));
4611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 0, 0, S("aklmnopqrst"));
4612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 0, 1, S("a1klmnopqrst"));
4613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 0, 5, S("a12345klmnopqrst"));
4614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 0, 9, S("a123456789klmnopqrst"));
4615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 0, 10, S("a1234567890klmnopqrst"));
4616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 0, 11, S("a1234567890klmnopqrst"));
4617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 1, 0, S("aklmnopqrst"));
4618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 1, 1, S("a2klmnopqrst"));
4619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 1, 4, S("a2345klmnopqrst"));
4620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 1, 8, S("a23456789klmnopqrst"));
4621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 1, 9, S("a234567890klmnopqrst"));
4622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 1, 10, S("a234567890klmnopqrst"));
4623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 5, 0, S("aklmnopqrst"));
4624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 5, 1, S("a6klmnopqrst"));
4625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 5, 2, S("a67klmnopqrst"));
4626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 5, 4, S("a6789klmnopqrst"));
4627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 5, 5, S("a67890klmnopqrst"));
4628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 5, 6, S("a67890klmnopqrst"));
4629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 9, 0, S("aklmnopqrst"));
4630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 9, 1, S("a0klmnopqrst"));
4631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 9, 2, S("a0klmnopqrst"));
4632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 10, 0, S("aklmnopqrst"));
4633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 10, 1, S("aklmnopqrst"));
4634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), 11, 0, S("can't happen"));
4635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 0, 0, S("aklmnopqrst"));
4636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 0, 1, S("a1klmnopqrst"));
4637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 0, 10, S("a1234567890klmnopqrst"));
4638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 0, 19, S("a1234567890123456789klmnopqrst"));
4639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 0, 20, S("a12345678901234567890klmnopqrst"));
4640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 0, 21, S("a12345678901234567890klmnopqrst"));
4641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 1, 0, S("aklmnopqrst"));
4642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 1, 1, S("a2klmnopqrst"));
4643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 1, 9, S("a234567890klmnopqrst"));
4644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 1, 18, S("a234567890123456789klmnopqrst"));
4645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 1, 19, S("a2345678901234567890klmnopqrst"));
4646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 1, 20, S("a2345678901234567890klmnopqrst"));
4647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 10, 0, S("aklmnopqrst"));
4648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 10, 1, S("a1klmnopqrst"));
4649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 10, 5, S("a12345klmnopqrst"));
4650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 10, 9, S("a123456789klmnopqrst"));
4651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 10, 10, S("a1234567890klmnopqrst"));
4652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 10, 11, S("a1234567890klmnopqrst"));
4653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 19, 0, S("aklmnopqrst"));
4654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 19, 1, S("a0klmnopqrst"));
4655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 19, 2, S("a0klmnopqrst"));
4656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 20, 0, S("aklmnopqrst"));
4657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 20, 1, S("aklmnopqrst"));
4658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), 21, 0, S("can't happen"));
4659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 0, S("at"));
4660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 1, S("at"));
4661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 1, 0, S("can't happen"));
4662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 0, 0, S("at"));
4663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 0, 1, S("a1t"));
4664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 0, 2, S("a12t"));
4665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 0, 4, S("a1234t"));
4666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 0, 5, S("a12345t"));
4667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 0, 6, S("a12345t"));
4668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 1, 0, S("at"));
4669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 1, 1, S("a2t"));
4670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 1, 2, S("a23t"));
4671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 1, 3, S("a234t"));
4672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 1, 4, S("a2345t"));
4673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 1, 5, S("a2345t"));
4674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 2, 0, S("at"));
4675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 2, 1, S("a3t"));
4676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 2, 2, S("a34t"));
4677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 2, 3, S("a345t"));
4678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 2, 4, S("a345t"));
4679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 4, 0, S("at"));
4680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 4, 1, S("a5t"));
4681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 4, 2, S("a5t"));
4682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 5, 0, S("at"));
4683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 5, 1, S("at"));
4684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), 6, 0, S("can't happen"));
4685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 0, 0, S("at"));
4686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 0, 1, S("a1t"));
4687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 0, 5, S("a12345t"));
4688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 0, 9, S("a123456789t"));
4689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 0, 10, S("a1234567890t"));
4690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 0, 11, S("a1234567890t"));
4691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 1, 0, S("at"));
4692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 1, 1, S("a2t"));
4693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
46959dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
4696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test44()
4697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 1, 4, S("a2345t"));
4699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 1, 8, S("a23456789t"));
4700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 1, 9, S("a234567890t"));
4701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 1, 10, S("a234567890t"));
4702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 5, 0, S("at"));
4703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 5, 1, S("a6t"));
4704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 5, 2, S("a67t"));
4705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 5, 4, S("a6789t"));
4706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 5, 5, S("a67890t"));
4707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 5, 6, S("a67890t"));
4708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 9, 0, S("at"));
4709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 9, 1, S("a0t"));
4710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 9, 2, S("a0t"));
4711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 10, 0, S("at"));
4712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 10, 1, S("at"));
4713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), 11, 0, S("can't happen"));
4714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 0, 0, S("at"));
4715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 0, 1, S("a1t"));
4716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 0, 10, S("a1234567890t"));
4717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 0, 19, S("a1234567890123456789t"));
4718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 0, 20, S("a12345678901234567890t"));
4719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 0, 21, S("a12345678901234567890t"));
4720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 1, 0, S("at"));
4721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 1, 1, S("a2t"));
4722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 1, 9, S("a234567890t"));
4723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 1, 18, S("a234567890123456789t"));
4724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 1, 19, S("a2345678901234567890t"));
4725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 1, 20, S("a2345678901234567890t"));
4726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 10, 0, S("at"));
4727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 10, 1, S("a1t"));
4728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 10, 5, S("a12345t"));
4729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 10, 9, S("a123456789t"));
4730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 10, 10, S("a1234567890t"));
4731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 10, 11, S("a1234567890t"));
4732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 19, 0, S("at"));
4733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 19, 1, S("a0t"));
4734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 19, 2, S("a0t"));
4735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 20, 0, S("at"));
4736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 20, 1, S("at"));
4737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), 21, 0, S("can't happen"));
4738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 0, S("a"));
4739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 1, S("a"));
4740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 1, 0, S("can't happen"));
4741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 0, 0, S("a"));
4742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 0, 1, S("a1"));
4743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 0, 2, S("a12"));
4744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 0, 4, S("a1234"));
4745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 0, 5, S("a12345"));
4746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 0, 6, S("a12345"));
4747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 1, 0, S("a"));
4748bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 1, 1, S("a2"));
4749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 1, 2, S("a23"));
4750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 1, 3, S("a234"));
4751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 1, 4, S("a2345"));
4752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 1, 5, S("a2345"));
4753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 2, 0, S("a"));
4754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 2, 1, S("a3"));
4755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 2, 2, S("a34"));
4756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 2, 3, S("a345"));
4757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 2, 4, S("a345"));
4758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 4, 0, S("a"));
4759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 4, 1, S("a5"));
4760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 4, 2, S("a5"));
4761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 5, 0, S("a"));
4762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 5, 1, S("a"));
4763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), 6, 0, S("can't happen"));
4764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 0, 0, S("a"));
4765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 0, 1, S("a1"));
4766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 0, 5, S("a12345"));
4767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 0, 9, S("a123456789"));
4768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 0, 10, S("a1234567890"));
4769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 0, 11, S("a1234567890"));
4770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 1, 0, S("a"));
4771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 1, 1, S("a2"));
4772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 1, 4, S("a2345"));
4773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 1, 8, S("a23456789"));
4774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 1, 9, S("a234567890"));
4775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 1, 10, S("a234567890"));
4776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 5, 0, S("a"));
4777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 5, 1, S("a6"));
4778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 5, 2, S("a67"));
4779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 5, 4, S("a6789"));
4780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 5, 5, S("a67890"));
4781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 5, 6, S("a67890"));
4782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 9, 0, S("a"));
4783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 9, 1, S("a0"));
4784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 9, 2, S("a0"));
4785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 10, 0, S("a"));
4786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 10, 1, S("a"));
4787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), 11, 0, S("can't happen"));
4788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 0, 0, S("a"));
4789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 0, 1, S("a1"));
4790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 0, 10, S("a1234567890"));
4791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 0, 19, S("a1234567890123456789"));
4792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 0, 20, S("a12345678901234567890"));
4793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 0, 21, S("a12345678901234567890"));
4794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 1, 0, S("a"));
4795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 1, 1, S("a2"));
4796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 1, 9, S("a234567890"));
4797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 1, 18, S("a234567890123456789"));
4798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
48009dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
4801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test45()
4802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 1, 19, S("a2345678901234567890"));
4804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 1, 20, S("a2345678901234567890"));
4805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 10, 0, S("a"));
4806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 10, 1, S("a1"));
4807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 10, 5, S("a12345"));
4808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 10, 9, S("a123456789"));
4809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 10, 10, S("a1234567890"));
4810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 10, 11, S("a1234567890"));
4811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 19, 0, S("a"));
4812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 19, 1, S("a0"));
4813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 19, 2, S("a0"));
4814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 20, 0, S("a"));
4815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 20, 1, S("a"));
4816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), 21, 0, S("can't happen"));
4817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 0, S("a"));
4818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 1, S("a"));
4819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 1, 0, S("can't happen"));
4820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 0, 0, S("a"));
4821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 0, 1, S("a1"));
4822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 0, 2, S("a12"));
4823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 0, 4, S("a1234"));
4824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 0, 5, S("a12345"));
4825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 0, 6, S("a12345"));
4826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 1, 0, S("a"));
4827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 1, 1, S("a2"));
4828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 1, 2, S("a23"));
4829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 1, 3, S("a234"));
4830bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 1, 4, S("a2345"));
4831bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 1, 5, S("a2345"));
4832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 2, 0, S("a"));
4833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 2, 1, S("a3"));
4834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 2, 2, S("a34"));
4835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 2, 3, S("a345"));
4836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 2, 4, S("a345"));
4837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 4, 0, S("a"));
4838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 4, 1, S("a5"));
4839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 4, 2, S("a5"));
4840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 5, 0, S("a"));
4841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 5, 1, S("a"));
4842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), 6, 0, S("can't happen"));
4843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 0, 0, S("a"));
4844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 0, 1, S("a1"));
4845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 0, 5, S("a12345"));
4846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 0, 9, S("a123456789"));
4847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 0, 10, S("a1234567890"));
4848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 0, 11, S("a1234567890"));
4849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 1, 0, S("a"));
4850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 1, 1, S("a2"));
4851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 1, 4, S("a2345"));
4852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 1, 8, S("a23456789"));
4853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 1, 9, S("a234567890"));
4854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 1, 10, S("a234567890"));
4855bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 5, 0, S("a"));
4856bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 5, 1, S("a6"));
4857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 5, 2, S("a67"));
4858bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 5, 4, S("a6789"));
4859bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 5, 5, S("a67890"));
4860bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 5, 6, S("a67890"));
4861bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 9, 0, S("a"));
4862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 9, 1, S("a0"));
4863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 9, 2, S("a0"));
4864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 10, 0, S("a"));
4865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 10, 1, S("a"));
4866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), 11, 0, S("can't happen"));
4867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 0, 0, S("a"));
4868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 0, 1, S("a1"));
4869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 0, 10, S("a1234567890"));
4870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 0, 19, S("a1234567890123456789"));
4871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 0, 20, S("a12345678901234567890"));
4872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 0, 21, S("a12345678901234567890"));
4873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 1, 0, S("a"));
4874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 1, 1, S("a2"));
4875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 1, 9, S("a234567890"));
4876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 1, 18, S("a234567890123456789"));
4877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 1, 19, S("a2345678901234567890"));
4878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 1, 20, S("a2345678901234567890"));
4879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 10, 0, S("a"));
4880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 10, 1, S("a1"));
4881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 10, 5, S("a12345"));
4882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 10, 9, S("a123456789"));
4883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 10, 10, S("a1234567890"));
4884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 10, 11, S("a1234567890"));
4885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 19, 0, S("a"));
4886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 19, 1, S("a0"));
4887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 19, 2, S("a0"));
4888bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 20, 0, S("a"));
4889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 20, 1, S("a"));
4890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), 21, 0, S("can't happen"));
4891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 0, S("abcdefghijklmnopqrst"));
4892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 1, S("abcdefghijklmnopqrst"));
4893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 1, 0, S("can't happen"));
4894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
4895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 0, 1, S("abcdefghij1klmnopqrst"));
4896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 0, 2, S("abcdefghij12klmnopqrst"));
4897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 0, 4, S("abcdefghij1234klmnopqrst"));
4898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 0, 5, S("abcdefghij12345klmnopqrst"));
4899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 0, 6, S("abcdefghij12345klmnopqrst"));
4900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
4901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 1, 1, S("abcdefghij2klmnopqrst"));
4902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 1, 2, S("abcdefghij23klmnopqrst"));
4903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
49059dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
4906bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test46()
4907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 1, 3, S("abcdefghij234klmnopqrst"));
4909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 1, 4, S("abcdefghij2345klmnopqrst"));
4910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 1, 5, S("abcdefghij2345klmnopqrst"));
4911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
4912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 2, 1, S("abcdefghij3klmnopqrst"));
4913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 2, 2, S("abcdefghij34klmnopqrst"));
4914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 2, 3, S("abcdefghij345klmnopqrst"));
4915bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 2, 4, S("abcdefghij345klmnopqrst"));
4916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
4917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 4, 1, S("abcdefghij5klmnopqrst"));
4918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 4, 2, S("abcdefghij5klmnopqrst"));
4919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
4920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
4921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), 6, 0, S("can't happen"));
4922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
4923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 0, 1, S("abcdefghij1klmnopqrst"));
4924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 0, 5, S("abcdefghij12345klmnopqrst"));
4925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 0, 9, S("abcdefghij123456789klmnopqrst"));
4926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 0, 10, S("abcdefghij1234567890klmnopqrst"));
4927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 0, 11, S("abcdefghij1234567890klmnopqrst"));
4928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
4929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 1, 1, S("abcdefghij2klmnopqrst"));
4930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 1, 4, S("abcdefghij2345klmnopqrst"));
4931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 1, 8, S("abcdefghij23456789klmnopqrst"));
4932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 1, 9, S("abcdefghij234567890klmnopqrst"));
4933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 1, 10, S("abcdefghij234567890klmnopqrst"));
4934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
4935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 5, 1, S("abcdefghij6klmnopqrst"));
4936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 5, 2, S("abcdefghij67klmnopqrst"));
4937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 5, 4, S("abcdefghij6789klmnopqrst"));
4938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 5, 5, S("abcdefghij67890klmnopqrst"));
4939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 5, 6, S("abcdefghij67890klmnopqrst"));
4940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
4941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 9, 1, S("abcdefghij0klmnopqrst"));
4942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 9, 2, S("abcdefghij0klmnopqrst"));
4943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
4944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
4945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), 11, 0, S("can't happen"));
4946bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
4947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 0, 1, S("abcdefghij1klmnopqrst"));
4948bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890klmnopqrst"));
4949bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789klmnopqrst"));
4950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890klmnopqrst"));
4951bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890klmnopqrst"));
4952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
4953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 1, 1, S("abcdefghij2klmnopqrst"));
4954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 1, 9, S("abcdefghij234567890klmnopqrst"));
4955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789klmnopqrst"));
4956bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890klmnopqrst"));
4957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890klmnopqrst"));
4958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
4959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 10, 1, S("abcdefghij1klmnopqrst"));
4960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 10, 5, S("abcdefghij12345klmnopqrst"));
4961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 10, 9, S("abcdefghij123456789klmnopqrst"));
4962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890klmnopqrst"));
4963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890klmnopqrst"));
4964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
4965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 19, 1, S("abcdefghij0klmnopqrst"));
4966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 19, 2, S("abcdefghij0klmnopqrst"));
4967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
4968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
4969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
4970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 0, S("abcdefghijlmnopqrst"));
4971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 1, S("abcdefghijlmnopqrst"));
4972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 1, 0, S("can't happen"));
4973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 0, 0, S("abcdefghijlmnopqrst"));
4974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 0, 1, S("abcdefghij1lmnopqrst"));
4975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 0, 2, S("abcdefghij12lmnopqrst"));
4976bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 0, 4, S("abcdefghij1234lmnopqrst"));
4977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 0, 5, S("abcdefghij12345lmnopqrst"));
4978bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 0, 6, S("abcdefghij12345lmnopqrst"));
4979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 1, 0, S("abcdefghijlmnopqrst"));
4980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 1, 1, S("abcdefghij2lmnopqrst"));
4981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 1, 2, S("abcdefghij23lmnopqrst"));
4982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 1, 3, S("abcdefghij234lmnopqrst"));
4983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 1, 4, S("abcdefghij2345lmnopqrst"));
4984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 1, 5, S("abcdefghij2345lmnopqrst"));
4985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 2, 0, S("abcdefghijlmnopqrst"));
4986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 2, 1, S("abcdefghij3lmnopqrst"));
4987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 2, 2, S("abcdefghij34lmnopqrst"));
4988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 2, 3, S("abcdefghij345lmnopqrst"));
4989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 2, 4, S("abcdefghij345lmnopqrst"));
4990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 4, 0, S("abcdefghijlmnopqrst"));
4991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 4, 1, S("abcdefghij5lmnopqrst"));
4992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 4, 2, S("abcdefghij5lmnopqrst"));
4993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 5, 0, S("abcdefghijlmnopqrst"));
4994bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 5, 1, S("abcdefghijlmnopqrst"));
4995bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), 6, 0, S("can't happen"));
4996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 0, 0, S("abcdefghijlmnopqrst"));
4997bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 0, 1, S("abcdefghij1lmnopqrst"));
4998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 0, 5, S("abcdefghij12345lmnopqrst"));
4999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 0, 9, S("abcdefghij123456789lmnopqrst"));
5000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 0, 10, S("abcdefghij1234567890lmnopqrst"));
5001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 0, 11, S("abcdefghij1234567890lmnopqrst"));
5002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 1, 0, S("abcdefghijlmnopqrst"));
5003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 1, 1, S("abcdefghij2lmnopqrst"));
5004bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 1, 4, S("abcdefghij2345lmnopqrst"));
5005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 1, 8, S("abcdefghij23456789lmnopqrst"));
5006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 1, 9, S("abcdefghij234567890lmnopqrst"));
5007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 1, 10, S("abcdefghij234567890lmnopqrst"));
5008bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5009bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
50109dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
5011bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test47()
5012bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 5, 0, S("abcdefghijlmnopqrst"));
5014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 5, 1, S("abcdefghij6lmnopqrst"));
5015bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 5, 2, S("abcdefghij67lmnopqrst"));
5016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 5, 4, S("abcdefghij6789lmnopqrst"));
5017bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 5, 5, S("abcdefghij67890lmnopqrst"));
5018bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 5, 6, S("abcdefghij67890lmnopqrst"));
5019bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 9, 0, S("abcdefghijlmnopqrst"));
5020bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 9, 1, S("abcdefghij0lmnopqrst"));
5021bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 9, 2, S("abcdefghij0lmnopqrst"));
5022bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 10, 0, S("abcdefghijlmnopqrst"));
5023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 10, 1, S("abcdefghijlmnopqrst"));
5024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), 11, 0, S("can't happen"));
5025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 0, 0, S("abcdefghijlmnopqrst"));
5026bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 0, 1, S("abcdefghij1lmnopqrst"));
5027bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890lmnopqrst"));
5028bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789lmnopqrst"));
5029bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890lmnopqrst"));
5030bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890lmnopqrst"));
5031bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 1, 0, S("abcdefghijlmnopqrst"));
5032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 1, 1, S("abcdefghij2lmnopqrst"));
5033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 1, 9, S("abcdefghij234567890lmnopqrst"));
5034bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789lmnopqrst"));
5035bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890lmnopqrst"));
5036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890lmnopqrst"));
5037bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 10, 0, S("abcdefghijlmnopqrst"));
5038bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 10, 1, S("abcdefghij1lmnopqrst"));
5039bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 10, 5, S("abcdefghij12345lmnopqrst"));
5040bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 10, 9, S("abcdefghij123456789lmnopqrst"));
5041bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890lmnopqrst"));
5042bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890lmnopqrst"));
5043bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 19, 0, S("abcdefghijlmnopqrst"));
5044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 19, 1, S("abcdefghij0lmnopqrst"));
5045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 19, 2, S("abcdefghij0lmnopqrst"));
5046bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 20, 0, S("abcdefghijlmnopqrst"));
5047bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 20, 1, S("abcdefghijlmnopqrst"));
5048bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
5049bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 0, S("abcdefghijpqrst"));
5050bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 1, S("abcdefghijpqrst"));
5051bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 1, 0, S("can't happen"));
5052bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 0, 0, S("abcdefghijpqrst"));
5053bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 0, 1, S("abcdefghij1pqrst"));
5054bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 0, 2, S("abcdefghij12pqrst"));
5055bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 0, 4, S("abcdefghij1234pqrst"));
5056bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 0, 5, S("abcdefghij12345pqrst"));
5057bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 0, 6, S("abcdefghij12345pqrst"));
5058bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 1, 0, S("abcdefghijpqrst"));
5059bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 1, 1, S("abcdefghij2pqrst"));
5060bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 1, 2, S("abcdefghij23pqrst"));
5061bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 1, 3, S("abcdefghij234pqrst"));
5062bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 1, 4, S("abcdefghij2345pqrst"));
5063bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 1, 5, S("abcdefghij2345pqrst"));
5064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 2, 0, S("abcdefghijpqrst"));
5065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 2, 1, S("abcdefghij3pqrst"));
5066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 2, 2, S("abcdefghij34pqrst"));
5067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 2, 3, S("abcdefghij345pqrst"));
5068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 2, 4, S("abcdefghij345pqrst"));
5069bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 4, 0, S("abcdefghijpqrst"));
5070bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 4, 1, S("abcdefghij5pqrst"));
5071bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 4, 2, S("abcdefghij5pqrst"));
5072bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 5, 0, S("abcdefghijpqrst"));
5073bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 5, 1, S("abcdefghijpqrst"));
5074bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), 6, 0, S("can't happen"));
5075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 0, 0, S("abcdefghijpqrst"));
5076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 0, 1, S("abcdefghij1pqrst"));
5077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 0, 5, S("abcdefghij12345pqrst"));
5078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 0, 9, S("abcdefghij123456789pqrst"));
5079bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 0, 10, S("abcdefghij1234567890pqrst"));
5080bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 0, 11, S("abcdefghij1234567890pqrst"));
5081bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 1, 0, S("abcdefghijpqrst"));
5082bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 1, 1, S("abcdefghij2pqrst"));
5083bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 1, 4, S("abcdefghij2345pqrst"));
5084bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 1, 8, S("abcdefghij23456789pqrst"));
5085bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 1, 9, S("abcdefghij234567890pqrst"));
5086bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 1, 10, S("abcdefghij234567890pqrst"));
5087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 5, 0, S("abcdefghijpqrst"));
5088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 5, 1, S("abcdefghij6pqrst"));
5089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 5, 2, S("abcdefghij67pqrst"));
5090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 5, 4, S("abcdefghij6789pqrst"));
5091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 5, 5, S("abcdefghij67890pqrst"));
5092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 5, 6, S("abcdefghij67890pqrst"));
5093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 9, 0, S("abcdefghijpqrst"));
5094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 9, 1, S("abcdefghij0pqrst"));
5095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 9, 2, S("abcdefghij0pqrst"));
5096bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 10, 0, S("abcdefghijpqrst"));
5097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 10, 1, S("abcdefghijpqrst"));
5098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), 11, 0, S("can't happen"));
5099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 0, 0, S("abcdefghijpqrst"));
5100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 0, 1, S("abcdefghij1pqrst"));
5101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890pqrst"));
5102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789pqrst"));
5103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890pqrst"));
5104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890pqrst"));
5105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 1, 0, S("abcdefghijpqrst"));
5106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 1, 1, S("abcdefghij2pqrst"));
5107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 1, 9, S("abcdefghij234567890pqrst"));
5108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789pqrst"));
5109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890pqrst"));
5110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890pqrst"));
5111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 10, 0, S("abcdefghijpqrst"));
5112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 10, 1, S("abcdefghij1pqrst"));
5113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
51159dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
5116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test48()
5117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 10, 5, S("abcdefghij12345pqrst"));
5119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 10, 9, S("abcdefghij123456789pqrst"));
5120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890pqrst"));
5121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890pqrst"));
5122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 19, 0, S("abcdefghijpqrst"));
5123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 19, 1, S("abcdefghij0pqrst"));
5124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 19, 2, S("abcdefghij0pqrst"));
5125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 20, 0, S("abcdefghijpqrst"));
5126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 20, 1, S("abcdefghijpqrst"));
5127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), 21, 0, S("can't happen"));
5128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 0, S("abcdefghijt"));
5129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 1, S("abcdefghijt"));
5130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 1, 0, S("can't happen"));
5131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 0, 0, S("abcdefghijt"));
5132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 0, 1, S("abcdefghij1t"));
5133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 0, 2, S("abcdefghij12t"));
5134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 0, 4, S("abcdefghij1234t"));
5135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 0, 5, S("abcdefghij12345t"));
5136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 0, 6, S("abcdefghij12345t"));
5137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 1, 0, S("abcdefghijt"));
5138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 1, 1, S("abcdefghij2t"));
5139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 1, 2, S("abcdefghij23t"));
5140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 1, 3, S("abcdefghij234t"));
5141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 1, 4, S("abcdefghij2345t"));
5142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 1, 5, S("abcdefghij2345t"));
5143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 2, 0, S("abcdefghijt"));
5144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 2, 1, S("abcdefghij3t"));
5145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 2, 2, S("abcdefghij34t"));
5146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 2, 3, S("abcdefghij345t"));
5147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 2, 4, S("abcdefghij345t"));
5148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 4, 0, S("abcdefghijt"));
5149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 4, 1, S("abcdefghij5t"));
5150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 4, 2, S("abcdefghij5t"));
5151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 5, 0, S("abcdefghijt"));
5152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 5, 1, S("abcdefghijt"));
5153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), 6, 0, S("can't happen"));
5154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 0, 0, S("abcdefghijt"));
5155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 0, 1, S("abcdefghij1t"));
5156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 0, 5, S("abcdefghij12345t"));
5157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 0, 9, S("abcdefghij123456789t"));
5158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 0, 10, S("abcdefghij1234567890t"));
5159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 0, 11, S("abcdefghij1234567890t"));
5160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 1, 0, S("abcdefghijt"));
5161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 1, 1, S("abcdefghij2t"));
5162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 1, 4, S("abcdefghij2345t"));
5163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 1, 8, S("abcdefghij23456789t"));
5164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 1, 9, S("abcdefghij234567890t"));
5165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 1, 10, S("abcdefghij234567890t"));
5166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 5, 0, S("abcdefghijt"));
5167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 5, 1, S("abcdefghij6t"));
5168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 5, 2, S("abcdefghij67t"));
5169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 5, 4, S("abcdefghij6789t"));
5170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 5, 5, S("abcdefghij67890t"));
5171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 5, 6, S("abcdefghij67890t"));
5172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 9, 0, S("abcdefghijt"));
5173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 9, 1, S("abcdefghij0t"));
5174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 9, 2, S("abcdefghij0t"));
5175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 10, 0, S("abcdefghijt"));
5176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 10, 1, S("abcdefghijt"));
5177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), 11, 0, S("can't happen"));
5178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 0, 0, S("abcdefghijt"));
5179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 0, 1, S("abcdefghij1t"));
5180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890t"));
5181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789t"));
5182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890t"));
5183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890t"));
5184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 1, 0, S("abcdefghijt"));
5185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 1, 1, S("abcdefghij2t"));
5186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 1, 9, S("abcdefghij234567890t"));
5187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789t"));
5188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890t"));
5189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890t"));
5190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 10, 0, S("abcdefghijt"));
5191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 10, 1, S("abcdefghij1t"));
5192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 10, 5, S("abcdefghij12345t"));
5193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 10, 9, S("abcdefghij123456789t"));
5194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890t"));
5195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890t"));
5196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 19, 0, S("abcdefghijt"));
5197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 19, 1, S("abcdefghij0t"));
5198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 19, 2, S("abcdefghij0t"));
5199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 20, 0, S("abcdefghijt"));
5200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 20, 1, S("abcdefghijt"));
5201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), 21, 0, S("can't happen"));
5202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 0, S("abcdefghij"));
5203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 1, S("abcdefghij"));
5204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 1, 0, S("can't happen"));
5205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 0, 0, S("abcdefghij"));
5206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 0, 1, S("abcdefghij1"));
5207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 0, 2, S("abcdefghij12"));
5208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 0, 4, S("abcdefghij1234"));
5209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 0, 5, S("abcdefghij12345"));
5210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 0, 6, S("abcdefghij12345"));
5211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 1, 0, S("abcdefghij"));
5212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 1, 1, S("abcdefghij2"));
5213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 1, 2, S("abcdefghij23"));
5214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 1, 3, S("abcdefghij234"));
5215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 1, 4, S("abcdefghij2345"));
5216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 1, 5, S("abcdefghij2345"));
5217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 2, 0, S("abcdefghij"));
5218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
52209dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
5221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test49()
5222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 2, 1, S("abcdefghij3"));
5224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 2, 2, S("abcdefghij34"));
5225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 2, 3, S("abcdefghij345"));
5226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 2, 4, S("abcdefghij345"));
5227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 4, 0, S("abcdefghij"));
5228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 4, 1, S("abcdefghij5"));
5229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 4, 2, S("abcdefghij5"));
5230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 5, 0, S("abcdefghij"));
5231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 5, 1, S("abcdefghij"));
5232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), 6, 0, S("can't happen"));
5233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 0, 0, S("abcdefghij"));
5234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 0, 1, S("abcdefghij1"));
5235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 0, 5, S("abcdefghij12345"));
5236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 0, 9, S("abcdefghij123456789"));
5237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 0, 10, S("abcdefghij1234567890"));
5238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 0, 11, S("abcdefghij1234567890"));
5239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 1, 0, S("abcdefghij"));
5240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 1, 1, S("abcdefghij2"));
5241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 1, 4, S("abcdefghij2345"));
5242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 1, 8, S("abcdefghij23456789"));
5243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 1, 9, S("abcdefghij234567890"));
5244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 1, 10, S("abcdefghij234567890"));
5245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 5, 0, S("abcdefghij"));
5246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 5, 1, S("abcdefghij6"));
5247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 5, 2, S("abcdefghij67"));
5248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 5, 4, S("abcdefghij6789"));
5249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 5, 5, S("abcdefghij67890"));
5250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 5, 6, S("abcdefghij67890"));
5251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 9, 0, S("abcdefghij"));
5252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 9, 1, S("abcdefghij0"));
5253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 9, 2, S("abcdefghij0"));
5254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 10, 0, S("abcdefghij"));
5255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 10, 1, S("abcdefghij"));
5256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), 11, 0, S("can't happen"));
5257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 0, 0, S("abcdefghij"));
5258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 0, 1, S("abcdefghij1"));
5259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890"));
5260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789"));
5261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890"));
5262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890"));
5263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 1, 0, S("abcdefghij"));
5264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 1, 1, S("abcdefghij2"));
5265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 1, 9, S("abcdefghij234567890"));
5266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789"));
5267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890"));
5268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890"));
5269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 10, 0, S("abcdefghij"));
5270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 10, 1, S("abcdefghij1"));
5271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 10, 5, S("abcdefghij12345"));
5272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 10, 9, S("abcdefghij123456789"));
5273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890"));
5274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890"));
5275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 19, 0, S("abcdefghij"));
5276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 19, 1, S("abcdefghij0"));
5277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 19, 2, S("abcdefghij0"));
5278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 20, 0, S("abcdefghij"));
5279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 20, 1, S("abcdefghij"));
5280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), 21, 0, S("can't happen"));
5281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 0, S("abcdefghij"));
5282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 1, S("abcdefghij"));
5283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 1, 0, S("can't happen"));
5284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 0, 0, S("abcdefghij"));
5285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 0, 1, S("abcdefghij1"));
5286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 0, 2, S("abcdefghij12"));
5287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 0, 4, S("abcdefghij1234"));
5288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 0, 5, S("abcdefghij12345"));
5289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 0, 6, S("abcdefghij12345"));
5290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 1, 0, S("abcdefghij"));
5291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 1, 1, S("abcdefghij2"));
5292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 1, 2, S("abcdefghij23"));
5293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 1, 3, S("abcdefghij234"));
5294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 1, 4, S("abcdefghij2345"));
5295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 1, 5, S("abcdefghij2345"));
5296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 2, 0, S("abcdefghij"));
5297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 2, 1, S("abcdefghij3"));
5298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 2, 2, S("abcdefghij34"));
5299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 2, 3, S("abcdefghij345"));
5300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 2, 4, S("abcdefghij345"));
5301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 4, 0, S("abcdefghij"));
5302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 4, 1, S("abcdefghij5"));
5303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 4, 2, S("abcdefghij5"));
5304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 5, 0, S("abcdefghij"));
5305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 5, 1, S("abcdefghij"));
5306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), 6, 0, S("can't happen"));
5307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 0, 0, S("abcdefghij"));
5308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 0, 1, S("abcdefghij1"));
5309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 0, 5, S("abcdefghij12345"));
5310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 0, 9, S("abcdefghij123456789"));
5311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 0, 10, S("abcdefghij1234567890"));
5312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 0, 11, S("abcdefghij1234567890"));
5313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 1, 0, S("abcdefghij"));
5314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 1, 1, S("abcdefghij2"));
5315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 1, 4, S("abcdefghij2345"));
5316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 1, 8, S("abcdefghij23456789"));
5317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 1, 9, S("abcdefghij234567890"));
5318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 1, 10, S("abcdefghij234567890"));
5319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 5, 0, S("abcdefghij"));
5320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 5, 1, S("abcdefghij6"));
5321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 5, 2, S("abcdefghij67"));
5322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 5, 4, S("abcdefghij6789"));
5323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
53259dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
5326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test50()
5327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 5, 5, S("abcdefghij67890"));
5329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 5, 6, S("abcdefghij67890"));
5330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 9, 0, S("abcdefghij"));
5331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 9, 1, S("abcdefghij0"));
5332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 9, 2, S("abcdefghij0"));
5333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 10, 0, S("abcdefghij"));
5334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 10, 1, S("abcdefghij"));
5335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), 11, 0, S("can't happen"));
5336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 0, 0, S("abcdefghij"));
5337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 0, 1, S("abcdefghij1"));
5338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890"));
5339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789"));
5340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890"));
5341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890"));
5342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 1, 0, S("abcdefghij"));
5343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 1, 1, S("abcdefghij2"));
5344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 1, 9, S("abcdefghij234567890"));
5345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789"));
5346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890"));
5347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890"));
5348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 10, 0, S("abcdefghij"));
5349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 10, 1, S("abcdefghij1"));
5350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 10, 5, S("abcdefghij12345"));
5351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 10, 9, S("abcdefghij123456789"));
5352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890"));
5353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890"));
5354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 19, 0, S("abcdefghij"));
5355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 19, 1, S("abcdefghij0"));
5356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 19, 2, S("abcdefghij0"));
5357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 20, 0, S("abcdefghij"));
5358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 20, 1, S("abcdefghij"));
5359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), 21, 0, S("can't happen"));
5360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 0, S("abcdefghijklmnopqrst"));
5361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 1, S("abcdefghijklmnopqrst"));
5362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 1, 0, S("can't happen"));
5363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
5364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 0, 1, S("abcdefghijklmnopqrs1t"));
5365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 0, 2, S("abcdefghijklmnopqrs12t"));
5366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 0, 4, S("abcdefghijklmnopqrs1234t"));
5367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 0, 5, S("abcdefghijklmnopqrs12345t"));
5368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 0, 6, S("abcdefghijklmnopqrs12345t"));
5369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
5370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 1, 1, S("abcdefghijklmnopqrs2t"));
5371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 1, 2, S("abcdefghijklmnopqrs23t"));
5372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 1, 3, S("abcdefghijklmnopqrs234t"));
5373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 1, 4, S("abcdefghijklmnopqrs2345t"));
5374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 1, 5, S("abcdefghijklmnopqrs2345t"));
5375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
5376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 2, 1, S("abcdefghijklmnopqrs3t"));
5377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 2, 2, S("abcdefghijklmnopqrs34t"));
5378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 2, 3, S("abcdefghijklmnopqrs345t"));
5379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 2, 4, S("abcdefghijklmnopqrs345t"));
5380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
5381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 4, 1, S("abcdefghijklmnopqrs5t"));
5382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 4, 2, S("abcdefghijklmnopqrs5t"));
5383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
5384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
5385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), 6, 0, S("can't happen"));
5386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
5387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 0, 1, S("abcdefghijklmnopqrs1t"));
5388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 0, 5, S("abcdefghijklmnopqrs12345t"));
5389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 0, 9, S("abcdefghijklmnopqrs123456789t"));
5390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 0, 10, S("abcdefghijklmnopqrs1234567890t"));
5391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 0, 11, S("abcdefghijklmnopqrs1234567890t"));
5392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
5393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 1, 1, S("abcdefghijklmnopqrs2t"));
5394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 1, 4, S("abcdefghijklmnopqrs2345t"));
5395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 1, 8, S("abcdefghijklmnopqrs23456789t"));
5396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 1, 9, S("abcdefghijklmnopqrs234567890t"));
5397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 1, 10, S("abcdefghijklmnopqrs234567890t"));
5398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
5399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 5, 1, S("abcdefghijklmnopqrs6t"));
5400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 5, 2, S("abcdefghijklmnopqrs67t"));
5401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 5, 4, S("abcdefghijklmnopqrs6789t"));
5402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 5, 5, S("abcdefghijklmnopqrs67890t"));
5403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 5, 6, S("abcdefghijklmnopqrs67890t"));
5404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
5405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 9, 1, S("abcdefghijklmnopqrs0t"));
5406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 9, 2, S("abcdefghijklmnopqrs0t"));
5407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
5408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
5409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), 11, 0, S("can't happen"));
5410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
5411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 0, 1, S("abcdefghijklmnopqrs1t"));
5412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 0, 10, S("abcdefghijklmnopqrs1234567890t"));
5413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 0, 19, S("abcdefghijklmnopqrs1234567890123456789t"));
5414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 0, 20, S("abcdefghijklmnopqrs12345678901234567890t"));
5415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 0, 21, S("abcdefghijklmnopqrs12345678901234567890t"));
5416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
5417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 1, 1, S("abcdefghijklmnopqrs2t"));
5418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 1, 9, S("abcdefghijklmnopqrs234567890t"));
5419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 1, 18, S("abcdefghijklmnopqrs234567890123456789t"));
5420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 1, 19, S("abcdefghijklmnopqrs2345678901234567890t"));
5421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 1, 20, S("abcdefghijklmnopqrs2345678901234567890t"));
5422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
5423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 10, 1, S("abcdefghijklmnopqrs1t"));
5424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 10, 5, S("abcdefghijklmnopqrs12345t"));
5425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 10, 9, S("abcdefghijklmnopqrs123456789t"));
5426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 10, 10, S("abcdefghijklmnopqrs1234567890t"));
5427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 10, 11, S("abcdefghijklmnopqrs1234567890t"));
5428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
54309dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
5431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test51()
5432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
5434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 19, 1, S("abcdefghijklmnopqrs0t"));
5435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 19, 2, S("abcdefghijklmnopqrs0t"));
5436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
5437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
5438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
5439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 0, S("abcdefghijklmnopqrs"));
5440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 1, S("abcdefghijklmnopqrs"));
5441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 1, 0, S("can't happen"));
5442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 0, 0, S("abcdefghijklmnopqrs"));
5443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 0, 1, S("abcdefghijklmnopqrs1"));
5444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 0, 2, S("abcdefghijklmnopqrs12"));
5445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 0, 4, S("abcdefghijklmnopqrs1234"));
5446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 0, 5, S("abcdefghijklmnopqrs12345"));
5447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 0, 6, S("abcdefghijklmnopqrs12345"));
5448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 1, 0, S("abcdefghijklmnopqrs"));
5449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 1, 1, S("abcdefghijklmnopqrs2"));
5450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 1, 2, S("abcdefghijklmnopqrs23"));
5451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 1, 3, S("abcdefghijklmnopqrs234"));
5452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 1, 4, S("abcdefghijklmnopqrs2345"));
5453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 1, 5, S("abcdefghijklmnopqrs2345"));
5454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 2, 0, S("abcdefghijklmnopqrs"));
5455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 2, 1, S("abcdefghijklmnopqrs3"));
5456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 2, 2, S("abcdefghijklmnopqrs34"));
5457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 2, 3, S("abcdefghijklmnopqrs345"));
5458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 2, 4, S("abcdefghijklmnopqrs345"));
5459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 4, 0, S("abcdefghijklmnopqrs"));
5460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 4, 1, S("abcdefghijklmnopqrs5"));
5461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 4, 2, S("abcdefghijklmnopqrs5"));
5462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 5, 0, S("abcdefghijklmnopqrs"));
5463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 5, 1, S("abcdefghijklmnopqrs"));
5464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), 6, 0, S("can't happen"));
5465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 0, 0, S("abcdefghijklmnopqrs"));
5466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 0, 1, S("abcdefghijklmnopqrs1"));
5467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 0, 5, S("abcdefghijklmnopqrs12345"));
5468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 0, 9, S("abcdefghijklmnopqrs123456789"));
5469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 0, 10, S("abcdefghijklmnopqrs1234567890"));
5470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 0, 11, S("abcdefghijklmnopqrs1234567890"));
5471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 1, 0, S("abcdefghijklmnopqrs"));
5472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 1, 1, S("abcdefghijklmnopqrs2"));
5473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 1, 4, S("abcdefghijklmnopqrs2345"));
5474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 1, 8, S("abcdefghijklmnopqrs23456789"));
5475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 1, 9, S("abcdefghijklmnopqrs234567890"));
5476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 1, 10, S("abcdefghijklmnopqrs234567890"));
5477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 5, 0, S("abcdefghijklmnopqrs"));
5478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 5, 1, S("abcdefghijklmnopqrs6"));
5479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 5, 2, S("abcdefghijklmnopqrs67"));
5480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 5, 4, S("abcdefghijklmnopqrs6789"));
5481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 5, 5, S("abcdefghijklmnopqrs67890"));
5482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 5, 6, S("abcdefghijklmnopqrs67890"));
5483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 9, 0, S("abcdefghijklmnopqrs"));
5484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 9, 1, S("abcdefghijklmnopqrs0"));
5485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 9, 2, S("abcdefghijklmnopqrs0"));
5486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 10, 0, S("abcdefghijklmnopqrs"));
5487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 10, 1, S("abcdefghijklmnopqrs"));
5488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), 11, 0, S("can't happen"));
5489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrs"));
5490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 0, 1, S("abcdefghijklmnopqrs1"));
5491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 0, 10, S("abcdefghijklmnopqrs1234567890"));
5492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 0, 19, S("abcdefghijklmnopqrs1234567890123456789"));
5493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 0, 20, S("abcdefghijklmnopqrs12345678901234567890"));
5494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 0, 21, S("abcdefghijklmnopqrs12345678901234567890"));
5495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrs"));
5496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 1, 1, S("abcdefghijklmnopqrs2"));
5497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 1, 9, S("abcdefghijklmnopqrs234567890"));
5498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 1, 18, S("abcdefghijklmnopqrs234567890123456789"));
5499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 1, 19, S("abcdefghijklmnopqrs2345678901234567890"));
5500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 1, 20, S("abcdefghijklmnopqrs2345678901234567890"));
5501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrs"));
5502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 10, 1, S("abcdefghijklmnopqrs1"));
5503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 10, 5, S("abcdefghijklmnopqrs12345"));
5504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 10, 9, S("abcdefghijklmnopqrs123456789"));
5505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 10, 10, S("abcdefghijklmnopqrs1234567890"));
5506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 10, 11, S("abcdefghijklmnopqrs1234567890"));
5507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrs"));
5508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 19, 1, S("abcdefghijklmnopqrs0"));
5509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 19, 2, S("abcdefghijklmnopqrs0"));
5510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrs"));
5511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrs"));
5512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
5513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 0, S("abcdefghijklmnopqrs"));
5514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 1, S("abcdefghijklmnopqrs"));
5515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 1, 0, S("can't happen"));
5516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 0, 0, S("abcdefghijklmnopqrs"));
5517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 0, 1, S("abcdefghijklmnopqrs1"));
5518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 0, 2, S("abcdefghijklmnopqrs12"));
5519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 0, 4, S("abcdefghijklmnopqrs1234"));
5520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 0, 5, S("abcdefghijklmnopqrs12345"));
5521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 0, 6, S("abcdefghijklmnopqrs12345"));
5522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 1, 0, S("abcdefghijklmnopqrs"));
5523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 1, 1, S("abcdefghijklmnopqrs2"));
5524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 1, 2, S("abcdefghijklmnopqrs23"));
5525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 1, 3, S("abcdefghijklmnopqrs234"));
5526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 1, 4, S("abcdefghijklmnopqrs2345"));
5527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 1, 5, S("abcdefghijklmnopqrs2345"));
5528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 2, 0, S("abcdefghijklmnopqrs"));
5529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 2, 1, S("abcdefghijklmnopqrs3"));
5530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 2, 2, S("abcdefghijklmnopqrs34"));
5531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 2, 3, S("abcdefghijklmnopqrs345"));
5532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 2, 4, S("abcdefghijklmnopqrs345"));
5533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
55359dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
5536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test52()
5537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 4, 0, S("abcdefghijklmnopqrs"));
5539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 4, 1, S("abcdefghijklmnopqrs5"));
5540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 4, 2, S("abcdefghijklmnopqrs5"));
5541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 5, 0, S("abcdefghijklmnopqrs"));
5542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 5, 1, S("abcdefghijklmnopqrs"));
5543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), 6, 0, S("can't happen"));
5544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 0, 0, S("abcdefghijklmnopqrs"));
5545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 0, 1, S("abcdefghijklmnopqrs1"));
5546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 0, 5, S("abcdefghijklmnopqrs12345"));
5547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 0, 9, S("abcdefghijklmnopqrs123456789"));
5548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 0, 10, S("abcdefghijklmnopqrs1234567890"));
5549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 0, 11, S("abcdefghijklmnopqrs1234567890"));
5550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 1, 0, S("abcdefghijklmnopqrs"));
5551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 1, 1, S("abcdefghijklmnopqrs2"));
5552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 1, 4, S("abcdefghijklmnopqrs2345"));
5553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 1, 8, S("abcdefghijklmnopqrs23456789"));
5554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 1, 9, S("abcdefghijklmnopqrs234567890"));
5555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 1, 10, S("abcdefghijklmnopqrs234567890"));
5556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 5, 0, S("abcdefghijklmnopqrs"));
5557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 5, 1, S("abcdefghijklmnopqrs6"));
5558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 5, 2, S("abcdefghijklmnopqrs67"));
5559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 5, 4, S("abcdefghijklmnopqrs6789"));
5560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 5, 5, S("abcdefghijklmnopqrs67890"));
5561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 5, 6, S("abcdefghijklmnopqrs67890"));
5562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 9, 0, S("abcdefghijklmnopqrs"));
5563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 9, 1, S("abcdefghijklmnopqrs0"));
5564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 9, 2, S("abcdefghijklmnopqrs0"));
5565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 10, 0, S("abcdefghijklmnopqrs"));
5566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 10, 1, S("abcdefghijklmnopqrs"));
5567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), 11, 0, S("can't happen"));
5568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrs"));
5569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 0, 1, S("abcdefghijklmnopqrs1"));
5570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 0, 10, S("abcdefghijklmnopqrs1234567890"));
5571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 0, 19, S("abcdefghijklmnopqrs1234567890123456789"));
5572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 0, 20, S("abcdefghijklmnopqrs12345678901234567890"));
5573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 0, 21, S("abcdefghijklmnopqrs12345678901234567890"));
5574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrs"));
5575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 1, 1, S("abcdefghijklmnopqrs2"));
5576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 1, 9, S("abcdefghijklmnopqrs234567890"));
5577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 1, 18, S("abcdefghijklmnopqrs234567890123456789"));
5578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 1, 19, S("abcdefghijklmnopqrs2345678901234567890"));
5579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 1, 20, S("abcdefghijklmnopqrs2345678901234567890"));
5580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrs"));
5581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 10, 1, S("abcdefghijklmnopqrs1"));
5582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 10, 5, S("abcdefghijklmnopqrs12345"));
5583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 10, 9, S("abcdefghijklmnopqrs123456789"));
5584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 10, 10, S("abcdefghijklmnopqrs1234567890"));
5585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 10, 11, S("abcdefghijklmnopqrs1234567890"));
5586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrs"));
5587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 19, 1, S("abcdefghijklmnopqrs0"));
5588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 19, 2, S("abcdefghijklmnopqrs0"));
5589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrs"));
5590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrs"));
5591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), 21, 0, S("can't happen"));
5592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 0, S("abcdefghijklmnopqrst"));
5593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 1, S("abcdefghijklmnopqrst"));
5594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 1, 0, S("can't happen"));
5595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
5596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 0, 1, S("abcdefghijklmnopqrst1"));
5597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 0, 2, S("abcdefghijklmnopqrst12"));
5598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 0, 4, S("abcdefghijklmnopqrst1234"));
5599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 0, 5, S("abcdefghijklmnopqrst12345"));
5600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 0, 6, S("abcdefghijklmnopqrst12345"));
5601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
5602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 1, 1, S("abcdefghijklmnopqrst2"));
5603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 1, 2, S("abcdefghijklmnopqrst23"));
5604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 1, 3, S("abcdefghijklmnopqrst234"));
5605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 1, 4, S("abcdefghijklmnopqrst2345"));
5606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 1, 5, S("abcdefghijklmnopqrst2345"));
5607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
5608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 2, 1, S("abcdefghijklmnopqrst3"));
5609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 2, 2, S("abcdefghijklmnopqrst34"));
5610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 2, 3, S("abcdefghijklmnopqrst345"));
5611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 2, 4, S("abcdefghijklmnopqrst345"));
5612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
5613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 4, 1, S("abcdefghijklmnopqrst5"));
5614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 4, 2, S("abcdefghijklmnopqrst5"));
5615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
5616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
5617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), 6, 0, S("can't happen"));
5618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
5619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 0, 1, S("abcdefghijklmnopqrst1"));
5620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 0, 5, S("abcdefghijklmnopqrst12345"));
5621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 0, 9, S("abcdefghijklmnopqrst123456789"));
5622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 0, 10, S("abcdefghijklmnopqrst1234567890"));
5623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 0, 11, S("abcdefghijklmnopqrst1234567890"));
5624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
5625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 1, 1, S("abcdefghijklmnopqrst2"));
5626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 1, 4, S("abcdefghijklmnopqrst2345"));
5627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 1, 8, S("abcdefghijklmnopqrst23456789"));
5628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 1, 9, S("abcdefghijklmnopqrst234567890"));
5629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 1, 10, S("abcdefghijklmnopqrst234567890"));
5630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
5631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 5, 1, S("abcdefghijklmnopqrst6"));
5632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 5, 2, S("abcdefghijklmnopqrst67"));
5633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 5, 4, S("abcdefghijklmnopqrst6789"));
5634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 5, 5, S("abcdefghijklmnopqrst67890"));
5635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 5, 6, S("abcdefghijklmnopqrst67890"));
5636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
5637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 9, 1, S("abcdefghijklmnopqrst0"));
5638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
56409dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
5641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test53()
5642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 9, 2, S("abcdefghijklmnopqrst0"));
5644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
5645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
5646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), 11, 0, S("can't happen"));
5647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
5648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 0, 1, S("abcdefghijklmnopqrst1"));
5649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 0, 10, S("abcdefghijklmnopqrst1234567890"));
5650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 0, 19, S("abcdefghijklmnopqrst1234567890123456789"));
5651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 0, 20, S("abcdefghijklmnopqrst12345678901234567890"));
5652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 0, 21, S("abcdefghijklmnopqrst12345678901234567890"));
5653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
5654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 1, 1, S("abcdefghijklmnopqrst2"));
5655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 1, 9, S("abcdefghijklmnopqrst234567890"));
5656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 1, 18, S("abcdefghijklmnopqrst234567890123456789"));
5657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 1, 19, S("abcdefghijklmnopqrst2345678901234567890"));
5658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 1, 20, S("abcdefghijklmnopqrst2345678901234567890"));
5659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
5660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 10, 1, S("abcdefghijklmnopqrst1"));
5661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 10, 5, S("abcdefghijklmnopqrst12345"));
5662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 10, 9, S("abcdefghijklmnopqrst123456789"));
5663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 10, 10, S("abcdefghijklmnopqrst1234567890"));
5664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 10, 11, S("abcdefghijklmnopqrst1234567890"));
5665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
5666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 19, 1, S("abcdefghijklmnopqrst0"));
5667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 19, 2, S("abcdefghijklmnopqrst0"));
5668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
5669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
5670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
5671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 0, S("abcdefghijklmnopqrst"));
5672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 1, S("abcdefghijklmnopqrst"));
5673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 1, 0, S("can't happen"));
5674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
5675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 0, 1, S("abcdefghijklmnopqrst1"));
5676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 0, 2, S("abcdefghijklmnopqrst12"));
5677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 0, 4, S("abcdefghijklmnopqrst1234"));
5678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 0, 5, S("abcdefghijklmnopqrst12345"));
5679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 0, 6, S("abcdefghijklmnopqrst12345"));
5680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
5681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 1, 1, S("abcdefghijklmnopqrst2"));
5682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 1, 2, S("abcdefghijklmnopqrst23"));
5683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 1, 3, S("abcdefghijklmnopqrst234"));
5684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 1, 4, S("abcdefghijklmnopqrst2345"));
5685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 1, 5, S("abcdefghijklmnopqrst2345"));
5686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
5687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 2, 1, S("abcdefghijklmnopqrst3"));
5688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 2, 2, S("abcdefghijklmnopqrst34"));
5689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 2, 3, S("abcdefghijklmnopqrst345"));
5690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 2, 4, S("abcdefghijklmnopqrst345"));
5691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
5692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 4, 1, S("abcdefghijklmnopqrst5"));
5693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 4, 2, S("abcdefghijklmnopqrst5"));
5694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
5695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
5696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), 6, 0, S("can't happen"));
5697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
5698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 0, 1, S("abcdefghijklmnopqrst1"));
5699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 0, 5, S("abcdefghijklmnopqrst12345"));
5700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 0, 9, S("abcdefghijklmnopqrst123456789"));
5701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 0, 10, S("abcdefghijklmnopqrst1234567890"));
5702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 0, 11, S("abcdefghijklmnopqrst1234567890"));
5703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
5704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 1, 1, S("abcdefghijklmnopqrst2"));
5705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 1, 4, S("abcdefghijklmnopqrst2345"));
5706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 1, 8, S("abcdefghijklmnopqrst23456789"));
5707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 1, 9, S("abcdefghijklmnopqrst234567890"));
5708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 1, 10, S("abcdefghijklmnopqrst234567890"));
5709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
5710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 5, 1, S("abcdefghijklmnopqrst6"));
5711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 5, 2, S("abcdefghijklmnopqrst67"));
5712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 5, 4, S("abcdefghijklmnopqrst6789"));
5713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 5, 5, S("abcdefghijklmnopqrst67890"));
5714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 5, 6, S("abcdefghijklmnopqrst67890"));
5715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
5716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 9, 1, S("abcdefghijklmnopqrst0"));
5717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 9, 2, S("abcdefghijklmnopqrst0"));
5718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
5719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
5720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), 11, 0, S("can't happen"));
5721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
5722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 0, 1, S("abcdefghijklmnopqrst1"));
5723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 0, 10, S("abcdefghijklmnopqrst1234567890"));
5724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 0, 19, S("abcdefghijklmnopqrst1234567890123456789"));
5725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 0, 20, S("abcdefghijklmnopqrst12345678901234567890"));
5726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 0, 21, S("abcdefghijklmnopqrst12345678901234567890"));
5727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
5728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 1, 1, S("abcdefghijklmnopqrst2"));
5729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 1, 9, S("abcdefghijklmnopqrst234567890"));
5730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 1, 18, S("abcdefghijklmnopqrst234567890123456789"));
5731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 1, 19, S("abcdefghijklmnopqrst2345678901234567890"));
5732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 1, 20, S("abcdefghijklmnopqrst2345678901234567890"));
5733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
5734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 10, 1, S("abcdefghijklmnopqrst1"));
5735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 10, 5, S("abcdefghijklmnopqrst12345"));
5736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 10, 9, S("abcdefghijklmnopqrst123456789"));
5737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 10, 10, S("abcdefghijklmnopqrst1234567890"));
5738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 10, 11, S("abcdefghijklmnopqrst1234567890"));
5739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
5740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 19, 1, S("abcdefghijklmnopqrst0"));
5741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 19, 2, S("abcdefghijklmnopqrst0"));
5742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
5743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
57459dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
5746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test54()
5747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5748bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
5749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), 21, 0, S("can't happen"));
5750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 0, S("can't happen"));
5751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 1, S("can't happen"));
5752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 1, 0, S("can't happen"));
5753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 0, 0, S("can't happen"));
5754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 0, 1, S("can't happen"));
5755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 0, 2, S("can't happen"));
5756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 0, 4, S("can't happen"));
5757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 0, 5, S("can't happen"));
5758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 0, 6, S("can't happen"));
5759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 1, 0, S("can't happen"));
5760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 1, 1, S("can't happen"));
5761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 1, 2, S("can't happen"));
5762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 1, 3, S("can't happen"));
5763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 1, 4, S("can't happen"));
5764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 1, 5, S("can't happen"));
5765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 2, 0, S("can't happen"));
5766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 2, 1, S("can't happen"));
5767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 2, 2, S("can't happen"));
5768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 2, 3, S("can't happen"));
5769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 2, 4, S("can't happen"));
5770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 4, 0, S("can't happen"));
5771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 4, 1, S("can't happen"));
5772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 4, 2, S("can't happen"));
5773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 5, 0, S("can't happen"));
5774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 5, 1, S("can't happen"));
5775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), 6, 0, S("can't happen"));
5776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 0, 0, S("can't happen"));
5777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 0, 1, S("can't happen"));
5778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 0, 5, S("can't happen"));
5779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 0, 9, S("can't happen"));
5780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 0, 10, S("can't happen"));
5781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 0, 11, S("can't happen"));
5782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 1, 0, S("can't happen"));
5783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 1, 1, S("can't happen"));
5784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 1, 4, S("can't happen"));
5785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 1, 8, S("can't happen"));
5786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 1, 9, S("can't happen"));
5787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 1, 10, S("can't happen"));
5788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 5, 0, S("can't happen"));
5789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 5, 1, S("can't happen"));
5790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 5, 2, S("can't happen"));
5791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 5, 4, S("can't happen"));
5792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 5, 5, S("can't happen"));
5793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 5, 6, S("can't happen"));
5794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 9, 0, S("can't happen"));
5795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 9, 1, S("can't happen"));
5796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 9, 2, S("can't happen"));
5797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 10, 0, S("can't happen"));
5798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 10, 1, S("can't happen"));
5799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), 11, 0, S("can't happen"));
5800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 0, 0, S("can't happen"));
5801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 0, 1, S("can't happen"));
5802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 0, 10, S("can't happen"));
5803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 0, 19, S("can't happen"));
5804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 0, 20, S("can't happen"));
5805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 0, 21, S("can't happen"));
5806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 1, 0, S("can't happen"));
5807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 1, 1, S("can't happen"));
5808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 1, 9, S("can't happen"));
5809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 1, 18, S("can't happen"));
5810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 1, 19, S("can't happen"));
5811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 1, 20, S("can't happen"));
5812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 10, 0, S("can't happen"));
5813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 10, 1, S("can't happen"));
5814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 10, 5, S("can't happen"));
5815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 10, 9, S("can't happen"));
5816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 10, 10, S("can't happen"));
5817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 10, 11, S("can't happen"));
5818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 19, 0, S("can't happen"));
5819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 19, 1, S("can't happen"));
5820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 19, 2, S("can't happen"));
5821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 20, 0, S("can't happen"));
5822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 20, 1, S("can't happen"));
5823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), 21, 0, S("can't happen"));
5824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5826a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clowtemplate <class S>
5827a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clowvoid test55()
5828a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow{
5829a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 1, S("12345678901234567890"), 10, S("abcdefghi1234567890"));
5830a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 1, S("12345678901234567890"), 19, S("abcdefghi0"));
5831a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 1, S("12345678901234567890"), 20, S("abcdefghi"));
5832a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 1, S("12345678901234567890"), 20, S("abcdefghi"));
5833a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 1, S("12345678901234567890"), 21, S("can't happen"));
5834a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 2, S(""), 0, S("abcdefghi"));
5835a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 2, S(""), 1, S("can't happen"));
5836a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 2, S("12345"), 0, S("abcdefghi12345"));
5837a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 2, S("12345"), 1, S("abcdefghi2345"));
5838a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 2, S("12345"), 2, S("abcdefghi345"));
5839a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 2, S("12345"), 4, S("abcdefghi5"));
5840a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 2, S("12345"), 5, S("abcdefghi"));
5841a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test_npos(S("abcdefghij"), 9, 2, S("12345"), 6, S("can't happen"));
5842a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow}
5843a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow
5844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
5845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
58469dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    {
58479dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    typedef std::string S;
58489dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test0<S>();
58499dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test1<S>();
58509dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test2<S>();
58519dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test3<S>();
58529dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test4<S>();
58539dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test5<S>();
58549dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test6<S>();
58559dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test7<S>();
58569dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test8<S>();
58579dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test9<S>();
58589dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test10<S>();
58599dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test11<S>();
58609dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test12<S>();
58619dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test13<S>();
58629dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test14<S>();
58639dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test15<S>();
58649dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test16<S>();
58659dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test17<S>();
58669dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test18<S>();
58679dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test19<S>();
58689dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test20<S>();
58699dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test21<S>();
58709dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test22<S>();
58719dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test23<S>();
58729dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test24<S>();
58739dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test25<S>();
58749dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test26<S>();
58759dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test27<S>();
58769dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test28<S>();
58779dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test29<S>();
58789dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test30<S>();
58799dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test31<S>();
58809dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test32<S>();
58819dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test33<S>();
58829dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test34<S>();
58839dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test35<S>();
58849dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test36<S>();
58859dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test37<S>();
58869dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test38<S>();
58879dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test39<S>();
58889dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test40<S>();
58899dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test41<S>();
58909dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test42<S>();
58919dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test43<S>();
58929dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test44<S>();
58939dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test45<S>();
58949dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test46<S>();
58959dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test47<S>();
58969dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test48<S>();
58979dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test49<S>();
58989dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test50<S>();
58999dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test51<S>();
59009dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test52<S>();
59019dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test53<S>();
59029dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test54<S>();
5903a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test55<S>();
59049dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    }
59059dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant#if __cplusplus >= 201103L
59069dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    {
59079dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
59089dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test0<S>();
59099dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test1<S>();
59109dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test2<S>();
59119dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test3<S>();
59129dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test4<S>();
59139dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test5<S>();
59149dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test6<S>();
59159dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test7<S>();
59169dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test8<S>();
59179dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test9<S>();
59189dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test10<S>();
59199dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test11<S>();
59209dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test12<S>();
59219dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test13<S>();
59229dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test14<S>();
59239dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test15<S>();
59249dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test16<S>();
59259dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test17<S>();
59269dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test18<S>();
59279dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test19<S>();
59289dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test20<S>();
59299dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test21<S>();
59309dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test22<S>();
59319dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test23<S>();
59329dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test24<S>();
59339dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test25<S>();
59349dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test26<S>();
59359dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test27<S>();
59369dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test28<S>();
59379dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test29<S>();
59389dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test30<S>();
59399dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test31<S>();
59409dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test32<S>();
59419dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test33<S>();
59429dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test34<S>();
59439dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test35<S>();
59449dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test36<S>();
59459dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test37<S>();
59469dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test38<S>();
59479dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test39<S>();
59489dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test40<S>();
59499dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test41<S>();
59509dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test42<S>();
59519dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test43<S>();
59529dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test44<S>();
59539dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test45<S>();
59549dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test46<S>();
59559dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test47<S>();
59569dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test48<S>();
59579dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test49<S>();
59589dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test50<S>();
59599dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test51<S>();
59609dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test52<S>();
59619dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test53<S>();
59629dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test54<S>();
5963a93b5e27a8cea26a63c8272574900c9a376fe9aeMarshall Clow    test55<S>();
59649dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    }
59659dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant#endif
5966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5967