function permute($target, $path)
{
    foreach (range(0, 4) as $x1) {
        foreach (range(0, 4) as $x2) {
            if ($x2 == $x1) {
                continue;
            }
            foreach (range(0, 4) as $x3) {
                if (count(array_filter([$x1, $x2], function ($_) use($x3) {
                    return $_ == $x3;
                }))) {
                    continue;
                }
                foreach (range(0, 4) as $x4) {
                    if (count(array_filter([$x1, $x2, $x3], function ($_) use($x4) {
                        return $_ == $x4;
                    }))) {
                        continue;
                    }
                    foreach (range(0, 4) as $x5) {
                        if (count(array_filter([$x1, $x2, $x3, $x4], function ($_) use($x5) {
                            return $_ == $x5;
                        }))) {
                            continue;
                        }
                        $ra = new Regexp_Assemble();
                        $ra->insert($path[$x1])->insert($path[$x2])->insert($path[$x3])->insert($path[$x4])->insert($path[$x5]);
                        is_deeply($ra->__path, $target, 'join: /' . join('/ /', array(join('', $path[$x1]), join('', $path[$x2]), join('', $path[$x3]), join('', $path[$x4]), join('', $path[$x5]))) . '/\\n' . $ra->dump() . ' versus ' . $ra->_dump($target) . "\n");
                    }
                }
            }
        }
    }
}
ok(!$ra->mvar(), 'mvar() undefined');
$ra->add('bar\\d+');
like('foo12', "/{$ra}/", "match 2 ok foo12");
unlike('nfoo12', "/{$ra}/", "match 2 nok nfoo12");
like('bar6', "/{$ra}/", "match 2 ok bar6");
$ra->reset()->filter(function ($arr) {
    $r = [];
    foreach ($arr as $_) {
        if (preg_match("/\\d /", $_)) {
            $r[] = $_;
        }
    }
    return !count($r);
});
$ra->add('1 2 4');
$ra->insert('1', '2', '8*');
unlike('3 4 1 2', "/{$ra}/", 'filter nok 3 4 1 2');
like('3 1 2 4', "/{$ra}/", 'filter ok 3 1 2 4');
unlike('5 2 3 4', "/{$ra}/", 'filter ok 5 2 3 4');
$ra->add('2 3 a+');
$ra->insert('2', ' ', '3', ' ', 'a+');
unlike('5 2 3 4', "/{$ra}/", 'filter ok 5 2 3 4 (2)');
//unlike( '5 2 3 aaa', "/$ra/", 'filter nok 5 2 3 a+' );
$ra->reset()->filter(NULL);
$ra->add('1 2 a+');
like('5 1 2 aaaa', "/{$ra}/", 'filter now ok 5 1 2 a+');
$ra->reset()->pre_filter(function ($p1) {
    $r = [];
    if (preg_match("/^#/", $p1)) {
        return false;
    }
$ra = new Regexp_Assemble();
foreach ($list as $p) {
    $ra->insert(str_split($p));
}
$ra->_reduce();
is_deeply($ra->__path, ['t', ['' => 0, 'h' => ['h', ['' => 0, 'o' => ['o', 'r']]], 'r' => ['r']], 'o', 'u', 'g', 'h'], join(' ', $list));
$list = ['tough', 'though', 'trough', 'through', 'thorough'];
$ra = new Regexp_Assemble();
foreach ($list as $p) {
    $ra->insert(str_split($p));
}
$ra->_reduce();
is_deeply($ra->__path, ['t', ['' => 0, 'h' => ['h', ['o' => [['' => 0, 'o' => ['o', 'r']]], 'r' => ['r']]], 'r' => ['r']], 'o', 'u', 'g', 'h'], join(' ', $list));
$list = ['tit', 'titanate', 'titania', 'titanite', 'titano', 'tite', 'titi', 'titian', 'titien', 'tittie'];
$ra = new Regexp_Assemble();
foreach ($list as $p) {
    $ra->insert(str_split($p));
}
$ra->_reduce();
is_deeply($ra->__path, ['t', 'i', 't', ['' => 0, 'a' => ['a', 'n', ['a' => ['a', 't', 'e'], 'i' => ['i', ['a' => ['a'], 't' => ['t', 'e']]], 'o' => ['o']]], 'i' => ['i', ['' => 0, 'a' => [['e' => ['e'], 'a' => ['a']], 'n']]], 't' => [['' => 0, 't' => ['t', 'i']], 'e']]], join(' ', $list));
$ra = new Regexp_Assemble();
$ra->add('dasin');
$ra->add('dosin');
$ra->add('dastin');
$ra->add('dostin');
$ra->_reduce();
is_deeply($ra->__path, ['d', ['a' => ['a'], 'o' => ['o']], 's', ['' => 0, 't' => ['t']], 'i', 'n'], 'dasin/dosin/dastin/dosting');
/*
is( $_, $fixed, '$_ has not been altered' );
*/
echo "===OK===\n";
    print "1..1\nok 1\n";
    exit 0;
}

use Regexp::Assemble;

my $fixed = 'The scalar remains the same';
$_ = $fixed;

is( Regexp::Assemble->new->as_string(), $Regexp::Assemble::Always_Fail, 'empty' );
*/
foreach (array(['(?:)?', ['']], ['d', ['d']], ['dot', ['d', 'o', 't']], ['[dot]', ['d'], ['o'], ['t']], ['d?', ['d'], ['']], ['da', ['d', 'a']], ['da?', ['d', 'a'], ['d']], ['(?:da)?', ['d', 'a'], ['']], ['[ad]?', ['d'], [''], ['a']], ['(?:do|a)?', ['d', 'o'], [''], ['a']], ['.', ['x'], ['.']], ['.', ['\\033'], ['.']], ['.', ['\\d'], ['\\s'], ['.']], ['.', ['\\d'], ['\\D']], ['.', ['\\s'], ['\\S']], ['.', ['\\w'], ['\\W']], ['.', ['\\w'], ['\\W'], ["\t"]], ['\\d', ['\\d'], ['5']], ['\\d', ['\\d'], [5], [7], [0]], ['\\d?', ['\\d'], ['5'], ['']], ['\\s', ['\\s'], [' ']], ['\\s?', ['\\s'], ['']], ['[\\dx]', ['\\d'], [5], [7], [0], ['x']], ['[\\d\\s]', ['\\d'], ['\\s'], [5], [7], [0], [' ']], ['[.p]', ['\\.'], ['p']], ['\\w', ['\\w'], [5], [1], [0], ['a'], ['_']], ['[*\\d]?', ['\\d'], [''], ['\\*']], ['[\\d^]?', ['\\d'], [''], ['\\^']], ['a[?@]z', ['a', '@', 'z'], ['a', "\\?", 'z']], ['\\+', ['\\+']], ['\\+', [quotemeta('+')]], ['[*+]', ['\\+'], ['\\*']], ['[*+]', [quotemeta('+')], [quotemeta('*')]], ['[-0z]', ['-'], ['0'], ['z']], ['[-.z]', ['-'], ['\\.'], ['z']], ['[-*+]', ['\\+'], ['-'], ['\\*']], ['[-.]', ['\\.'], ['-']], ['(?:[0z]|^)', ['^'], ['0'], ['z']], ['(?:[-0z]|^)', ['^'], ['0'], ['-'], ['z']], ['(?:[-\\w]|^)', ['^'], ['0'], ['-'], ['z'], ['\\w']], ['(?:[-0]|$)', ['$'], ['0'], ['-']], ['(?:[-0]|$|^)', ['$'], ['0'], ['-'], ['^']], ['\\d', [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], ['[\\dx]', [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], ['x']], ['(?:b[ey])?', ['b', 'e'], [''], ['b', 'y']], ['(?:be|do)?', ['b', 'e'], [''], ['d', 'o']], ['(?:b[ey]|a)?', ['b', 'e'], [''], ['b', 'y'], ['a']], ['da[by]', ['d', 'a', 'b'], ['d', 'a', 'y']], ['da(?:ily|b)', ['d', 'a', 'b'], ['d', 'a', 'i', 'l', 'y']], ['(?:night|day)', ['n', 'i', 'g', 'h', 't'], ['d', 'a', 'y']], ['da(?:(?:il)?y|b)', ['d', 'a', 'b'], ['d', 'a', 'y'], ['d', 'a', 'i', 'l', 'y']], ['dab(?:ble)?', ['d', 'a', 'b'], ['d', 'a', 'b', 'b', 'l', 'e']], ['d(?:o(?:ne?)?)?', ['d'], ['d', 'o'], ['d', 'o', 'n'], ['d', 'o', 'n', 'e']], ['(?:d(?:o(?:ne?)?)?)?', ['d'], ['d', 'o'], ['d', 'o', 'n'], ['d', 'o', 'n', 'e'], ['']], ['d(?:o[begnt]|u[bd])', ['d', 'o', 'b'], ['d', 'o', 'e'], ['d', 'o', 'g'], ['d', 'o', 'n'], ['d', 'o', 't'], ['d', 'u', 'b'], ['d', 'u', 'd']], ['da(?:m[ep]|r[kt])', ['d', 'a', 'm', 'p'], ['d', 'a', 'm', 'e'], ['d', 'a', 'r', 't'], ['d', 'a', 'r', 'k']]) as $test) {
    $result = array_shift($test);
    $r = new Regexp_Assemble();
    foreach ($test as $_) {
        $r->insert($_);
    }
    $_temp_array = [];
    foreach ($test as $_) {
        $_temp_array[] = join('', $_);
    }
    $args = join(') (', $_temp_array);
    is($r->as_string(), $result, "insert ({$args})");
}
//my {$xism} = ($] < 5.013) ? '-xism' : '^:';
//$xism = '-xism:';
foreach ([["(?{$xism}(?:^|m)a)", '^a', 'ma'], ["(?{$xism}(?:[mw]|^)a)", '^a', 'ma', 'wa'], ["(?{$xism}(?:^|\\^)a)", '^a', '\\^a'], ["(?{$xism}(?:^|0)a)", '^a', '0a'], ["(?{$xism}(?:[m^]|^)a)", '^a', 'ma', '\\^a'], ["(?{$xism}(?:ma|^)a)", '^a', 'maa'], ["(?{$xism}a.+)", 'a.+'], ["(?{$xism}b?)", '[b]?'], ["(?{$xism}\\.)", '[.]'], ["(?{$xism}\\.+)", '[.]+'], ["(?{$xism}\\.+)", '[\\.]+'], ["(?{$xism}\\^+)", '[\\^]+'], ["(?{$xism}%)", '[%]'], ["(?{$xism}%)", '[\\%]'], ["(?{$xism}!)", '[!]'], ["(?{$xism}!)", '[\\!]'], ["(?{$xism}@)", '[@]'], ["(?{$xism}@)", '[\\@]'], ["(?{$xism}a|[bc])", 'a|[bc]'], ["(?{$xism}ad?|[bc])", 'ad?|[bc]'], ["(?{$xism}" . "b(?:\$|e))", 'b$', 'be'], ["(?{$xism}" . "b(?:[ae]|\$))", 'b$', 'be', 'ba'], ["(?{$xism}" . "b(?:\$|\\\$))", 'b$', 'b\\$'], ["(?{$xism}(?:^a[bc]|de))", '^ab', '^ac', 'de'], ["(?i:/)", '/', ['flags' => 'i']], ["(?i:(?:^a[bc]|de))", '^ab', '^ac', 'de', ['flags' => 'i']], ["(?im:(?:^a[bc]|de))", '^ab', '^ac', 'de', ['flags' => 'im']], ["(?{$xism}a(?:%[de]|=[bc]))", quotemeta('a%d'), quotemeta('a=b'), quotemeta('a%e'), quotemeta('a=c')], ["(?{$xism}\\^[,:])", quotemeta('^:'), quotemeta('^,')], ["(?{$xism}a[-*=])", quotemeta('a='), quotemeta('a*'), quotemeta('a-')], ["(?{$xism}l(?:im)?it)", 'lit', 'limit'], ["(?{$xism}a(?:(?:g[qr]|h)w|[de]n|m)z)", 'amz', 'adnz', 'aenz', 'agrwz', 'agqwz', 'ahwz'], ["(?{$xism}a(?:(?:e(?:[gh]u|ft)|dkt|f)w|(?:(?:ij|g)m|hn)v)z)", 'adktwz', 'aeftwz', 'aeguwz', 'aehuwz', 'afwz', 'agmvz', 'ahnvz', 'aijmvz'], ["(?{$xism}b(?:d(?:kt?|i)|ckt?)x)", 'bcktx', 'bckx', 'bdix', 'bdktx', 'bdkx'], ["(?{$xism}d(?:[ln]dr?t|x))", 'dldrt', 'dndrt', 'dldt', 'dndt', 'dx'], ["(?{$xism}d(?:[ln][dp]t|x))", 'dldt', 'dndt', 'dlpt', 'dnpt', 'dx'], ["(?{$xism}d(?:[ln][dp][mr]t|x))", 'dldrt', 'dndrt', 'dldmt', 'dndmt', 'dlprt', 'dnprt', 'dlpmt', 'dnpmt', 'dx'], ["(?{$xism}" . "(?:\\(scan|\\*mens|\\[mail))", '\\*mens', '\\(scan', '\\[mail'], ["(?{$xism}a\\[b\\[c)", '\\Qa[b[c'], ["(?{$xism}a\\]b\\]c)", '\\Qa]b]c'], ["(?{$xism}a\\(b\\(c)", '\\Qa(b(c'], ["(?{$xism}a\\)b\\)c)", '\\Qa)b)c'], ["(?{$xism}a[(+[]b)", '\\Qa(b', '\\Qa[b', '\\Qa+b'], ["(?{$xism}a[-+^]b)", '\\Qa^b', '\\Qa-b', '\\Qa+b'], ["(?{$xism}car(?:rot)?)", 'car', 'carrot', ['lookahead' => 1]], ["(?{$xism}car[dpt]?)", 'car', 'cart', 'card', 'carp', ['lookahead' => 1]], ["(?{$xism}[bc]a[nr]e)", 'bane', 'bare', 'cane', 'care', ['lookahead' => 1]], ["(?{$xism}(?=[ru])(?:ref)?use)", 'refuse', 'use', ['lookahead' => 1]], ["(?{$xism}(?=[bcd])(?:bird|cat|dog))", 'bird', 'cat', 'dog', ['lookahead' => 1]], ["(?{$xism}sea(?=[hs])(?:horse|son))", 'seahorse', 'season', ['lookahead' => 1]], ["(?{$xism}car(?:(?=[dr])(?:rot|d))?)", 'car', 'card', 'carrot', ['lookahead' => 1]], ["(?{$xism}(?:(?:[hl]o|s?t|ch)o|[bf]a)ked)", 'looked', 'choked', 'hooked', 'stoked', 'toked', 'baked', 'faked'], ["(?{$xism}(?=[frt])(?:trans|re|f)action)", 'faction', 'reaction', 'transaction', ['lookahead' => 1]], ["(?{$xism}c(?=[ao])(?:or(?=[np])(?:pse|n)|ar(?=[de])(?:et|d)))", 'card', 'caret', 'corn', 'corpse', ['lookahead' => 1]], ["(?{$xism}car(?:(?=[dipt])(?:[dpt]|i(?=[no])(?:ng|on)))?)", 'car', 'cart', 'card', 'carp', 'carion', 'caring', ['lookahead' => 1]], ["(?{$xism}(?=[dfrst])(?:(?=[frt])(?:trans|re|f)a|(?=[ds])(?:dir|s)e)ction)", 'faction', 'reaction', 'transaction', 'direction', 'section', ['lookahead' => 1]], ["(?{$xism}car(?=[eir])(?:e(?=[flst])(?:(?=[ls])(?:le)?ss|ful|t)|i(?=[no])(?:ng|on)|r(?=[iy])(?:ied|y)))", 'caret', 'caress', 'careful', 'careless', 'caring', 'carion', 'carry', 'carried', ['lookahead' => 1]], ["(?{$xism}(?=[uv])(?:u(?=[nr])(?:n(?=[iprs])(?:(?=[ip])(?:(?:p[or]|impr))?i|(?:sea)?|rea)|r)|v(?=[ei])(?:en(?=[it])(?:trime|i)|i))son)", 'unimprison', 'unison', 'unpoison', 'unprison', 'unreason', 'unseason', 'unson', 'urson', 'venison', 'ventrimeson', 'vison', ['lookahead' => 1]], ["(?{$xism}(?:a?bc?)?d)", 'abcd', 'abd', 'bcd', 'bd', 'd'], ["(?{$xism}(?:a?bc?|c)d)", 'abcd', 'abd', 'bcd', 'bd', 'cd'], ["(?{$xism}(?:(?:a?bc?)?d|c))", 'abcd', 'abd', 'bcd', 'bd', 'c', 'd'], ["(?{$xism}(?:(?:a?bc?)?d|cd?))", 'abcd', 'abd', 'bcd', 'bd', 'c', 'cd', 'd'], ["(?{$xism}(?:(?:ab?|b)c?)?d)", 'abcd', 'abd', 'acd', 'ad', 'bcd', 'bd', 'd'], ["(?{$xism}(?:(?:ab)?cd?)?e)", 'abcde', 'abce', 'cde', 'ce', 'e'], ["(?{$xism}(?:(?:(?:ab?|b)c?)?d|c))", 'abcd', 'abd', 'acd', 'ad', 'bcd', 'bd', 'c', 'd'], ["(?{$xism}(?:(?:(?:ab?|b)c?)?d|cd?))", 'abcd', 'abd', 'acd', 'ad', 'bcd', 'bd', 'c', 'cd', 'd'], ["(?{$xism}" . "^(?:b?cd?|ab)\$)", '^ab$', '^bc$', '^bcd$', '^c$', '^cd$'], ["(?{$xism}" . "^(?:(?:ab?c|cd?)e?|e)\$)", '^abc$', '^abce$', '^ac$', '^ace$', '^c$', '^cd$', '^cde$', '^ce$', '^e$'], ["(?{$xism}" . "^(?:abc|bcd)e?\$)", '^abc$', '^abce$', '^bcd$', '^bcde$'], ["(?{$xism}" . "^(?:abcdef|bcdefg)h?\$)", '^abcdef$', '^abcdefh$', '^bcdefg$', '^bcdefgh$'], ["(?{$xism}" . "^(?:bcdefg|abcd)h?\$)", '^abcd$', '^abcdh$', '^bcdefg$', '^bcdefgh$'], ["(?{$xism}" . "^(?:abcdef|bcd)h?\$)", '^abcdef$', '^abcdefh$', '^bcd$', '^bcdh$'], ["(?{$xism}" . "^(?:a(?:bcd|cd?)e?|e)\$)", '^abcd$', '^abcde$', '^ac$', '^acd$', '^acde$', '^ace$', '^e$'], ["(?{$xism}" . "^(?:bcd|cd?)e?\$)", '^bcd$', '^bcde$', '^c$', '^cd$', '^cde$', '^ce$'], ["(?{$xism}" . "^(?:abc|bc?)(?:de)?\$)", '^abc$', '^abcde$', '^b$', '^bc$', '^bcde$', '^bde$'], ["(?{$xism}" . "^(?:b(?:cd)?|abd)e?\$)", '^abd$', '^abde$', '^b$', '^bcd$', '^bcde$', '^be$'], ["(?{$xism}" . "^(?:ad?|bcd)e?\$)", '^a$', '^ad$', '^ade$', '^ae$', '^bcd$', '^bcde$'], ["(?{$xism}" . "^(?:a(?:bcd|cd?)e?|de)\$)", '^abcd$', '^abcde$', '^ac$', '^acd$', '^acde$', '^ace$', '^de$'], ["(?{$xism}" . "^(?:a(?:bcde)?|bc?d?e)\$)", '^a$', '^abcde$', '^bcde$', '^bce$', '^bde$', '^be$'], ["(?{$xism}" . "^(?:a(?:b[cd]?)?|bd?e?f)\$)", '^a$', '^ab$', '^abc$', '^abd$', '^bdef$', '^bdf$', '^bef$', '^bf$'], ["(?{$xism}" . "^(?:a(?:bc?|dd)?|bd?e?f)\$)", '^a$', '^ab$', '^abc$', '^add$', '^bdef$', '^bdf$', '^bef$', '^bf$'], ["(?{$xism}" . "^(?:a(?:bc?|de)?|bc?d?f)\$)", '^a$', '^ab$', '^abc$', '^ade$', '^bcdf$', '^bcf$', '^bdf$', '^bf$'], ["(?{$xism}" . "^(?:a(?:bc?|de)?|cd?e?f)\$)", '^a$', '^ab$', '^abc$', '^ade$', '^cdef$', '^cdf$', '^cef$', '^cf$'], ["(?{$xism}" . "^(?:a(?:bc?|e)?|bc?de?f)\$)", '^a$', '^ab$', '^abc$', '^ae$', '^bcdef$', '^bcdf$', '^bdef$', '^bdf$'], ["(?{$xism}" . "^(?:a(?:bc?|e)?|b(?:cd)?e?f)\$)", '^a$', '^ab$', '^abc$', '^ae$', '^bcdef$', '^bcdf$', '^bef$', '^bf$'], ["(?{$xism}" . "^(?:b(?:cde?|d?e)f|a(?:bc?|e)?)\$)", '^a$', '^ab$', '^abc$', '^ae$', '^bcdef$', '^bcdf$', '^bdef$', '^bef$'], ["(?{$xism}\\b(?:c[de]|ab)\\b)", 'ab', 'cd', 'ce', ['anchor_word' => 1]], ["(?{$xism}\\b(?:c[de]|ab))", 'ab', 'cd', 'ce', ['anchor_word_begin' => 1]], ["(?{$xism}" . "^(?:c[de]|ab)\$)", 'ab', 'cd', 'ce', ['anchor_line' => 1]], ["(?{$xism}(?:c[de]|ab))", 'ab', 'cd', 'ce', ['anchor_line' => 0]], ["(?{$xism}" . "(?:c[de]|ab)\$)", 'ab', 'cd', 'ce', ['anchor_line_end' => 1]], ["(?{$xism}\\A(?:c[de]|ab)\\Z)", 'ab', 'cd', 'ce', ['anchor_string' => 1]], ["(?{$xism}(?:c[de]|ab))", 'ab', 'cd', 'ce', ['anchor_string' => 0]], ["(?{$xism}x[[:punct:]][yz])", 'x[[:punct:]]y', 'x[[:punct:]]z']] as $test) {
    $result = array_shift($test);
    $param = is_array($test[count($test) - 1]) ? array_pop($test) : [];
    $r = new Regexp_Assemble($param);
    $r->add($test);