使用 .NET 正则表达式你不会有任何运气。你最好的选择是为它写一个算法。正则表达式不是这项工作的正确工具。
也就是说,您可以使用 PCRE 正则表达式来做到这一点,而我这样做只是为了好玩;)
免责声明:我是我在这篇文章中使用的库的作者。
首先,安装PCRE.NET:
Install-Package PCRE.NET
然后,构建一个这样的模式:
h.*?e.*?l.*?l.*?o.*?\ .*?w.*?o.*?r.*?l.*?d(?C1)
那(?C1)
件事在 PCRE 用语中称为标注。它指示正则表达式引擎在匹配时调用您的自定义函数。然后,您可以说该部分是否应被视为匹配。
计算调用调用函数的次数,并告诉引擎模式应该失败,这将迫使它回溯。任务完成。
public static int GetMatchCount(string searchFor, string searchIn)
{
if (string.IsNullOrEmpty(searchFor) || string.IsNullOrEmpty(searchIn))
return 0;
var patternBuilder = new StringBuilder();
foreach (var searchChar in searchFor)
patternBuilder.Append(Regex.Escape(searchChar.ToString())).Append(".*?");
patternBuilder.Length -= 3;
patternBuilder.Append("(?C1)");
var pattern = new PcreRegex(patternBuilder.ToString());
var count = 0;
pattern.Match(searchIn, callout =>
{
++count;
return PcreCalloutResult.Fail;
});
return count;
}
调用GetMatchCount("hello world", "hheelloo wwoorrlldd")
返回512
。
哦,顺便说一句,如果您想实际查看字符在输入字符串中的位置,这里有一些代码:
public static void PrintMatches(string searchFor, string searchIn)
{
if (string.IsNullOrEmpty(searchFor) || string.IsNullOrEmpty(searchIn))
return;
var patternBuilder = new StringBuilder();
foreach (var searchChar in searchFor)
patternBuilder.Append("(").Append(Regex.Escape(searchChar.ToString())).Append(").*?");
patternBuilder.Length -= 3;
patternBuilder.Append("(?C1)");
var pattern = new PcreRegex(patternBuilder.ToString());
var outputBuilder = new StringBuilder();
Console.WriteLine(searchIn);
pattern.Match(searchIn, callout =>
{
outputBuilder.Clear();
outputBuilder.Append(' ', searchIn.Length);
foreach (var group in callout.Match.Groups.Skip(1))
outputBuilder[group.Index] = '^';
Console.WriteLine(outputBuilder);
return PcreCalloutResult.Fail;
});
}
结果如下:
hheelloo wwoorrlldd
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^ ^ ^ ^^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^ ^^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^ ^^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^^ ^
^ ^ ^^^ ^ ^^ ^^ ^
^ ^ ^^^ ^ ^^ ^ ^^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^ ^^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^^ ^ ^ ^ ^
^ ^ ^^^ ^^ ^ ^ ^ ^
^ ^ ^^^ ^^ ^ ^ ^^
^ ^ ^^^ ^^ ^ ^ ^ ^
^ ^ ^^^ ^^ ^ ^^ ^
^ ^ ^^^ ^^ ^ ^^ ^
^ ^ ^^^ ^^ ^ ^ ^^
^ ^ ^^^ ^^ ^ ^ ^ ^
^ ^ ^^^ ^^ ^^ ^ ^
^ ^ ^^^ ^^ ^^ ^ ^
^ ^ ^^^ ^^ ^^ ^^
^ ^ ^^^ ^^ ^^ ^ ^
^ ^ ^^^ ^^ ^ ^^ ^
^ ^ ^^^ ^^ ^ ^^ ^
^ ^ ^^^ ^^ ^ ^ ^^
^ ^ ^^^ ^^ ^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^^ ^
^ ^ ^^^ ^ ^^ ^^ ^
^ ^ ^^^ ^ ^^ ^ ^^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^ ^^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^ ^ ^^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^ ^^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^ ^^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^^ ^ ^ ^
^ ^ ^^ ^^ ^^ ^ ^ ^
^ ^ ^^ ^^ ^^ ^ ^^
^ ^ ^^ ^^ ^^ ^ ^ ^
^ ^ ^^ ^^ ^^ ^^ ^
^ ^ ^^ ^^ ^^ ^^ ^
^ ^ ^^ ^^ ^^ ^ ^^
^ ^ ^^ ^^ ^^ ^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^ ^^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^ ^ ^^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^ ^^ ^
^ ^ ^^ ^ ^^ ^ ^^ ^
^ ^ ^^ ^ ^^ ^ ^ ^^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^^ ^ ^
^ ^ ^^ ^ ^^ ^^ ^ ^
^ ^ ^^ ^ ^^ ^^ ^^
^ ^ ^^ ^ ^^ ^^ ^ ^
^ ^ ^^ ^ ^^ ^ ^^ ^
^ ^ ^^ ^ ^^ ^ ^^ ^
^ ^ ^^ ^ ^^ ^ ^ ^^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^ ^^ ^ ^ ^
^ ^ ^^ ^ ^ ^^ ^ ^ ^
^ ^ ^^ ^ ^ ^^ ^ ^^
^ ^ ^^ ^ ^ ^^ ^ ^ ^
^ ^ ^^ ^ ^ ^^ ^^ ^
^ ^ ^^ ^ ^ ^^ ^^ ^
^ ^ ^^ ^ ^ ^^ ^ ^^
^ ^ ^^ ^ ^ ^^ ^ ^ ^
^ ^ ^^ ^ ^ ^ ^^ ^ ^
^ ^ ^^ ^ ^ ^ ^^ ^ ^
^ ^ ^^ ^ ^ ^ ^^ ^^
^ ^ ^^ ^ ^ ^ ^^ ^ ^
^ ^ ^^ ^ ^ ^ ^ ^^ ^
^ ^ ^^ ^ ^ ^ ^ ^^ ^
^ ^ ^^ ^ ^ ^ ^ ^ ^^
^ ^ ^^ ^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^^ ^^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^^ ^
^ ^^^ ^^ ^^ ^^ ^
^ ^^^ ^^ ^^ ^ ^^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^^ ^^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^^ ^
^ ^^^ ^ ^ ^^ ^^ ^
^ ^^^ ^ ^ ^^ ^ ^^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^ ^^ ^
^ ^^^ ^ ^ ^ ^ ^^ ^
^ ^^^ ^ ^ ^ ^ ^ ^^
^ ^^^ ^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^ ^ ^ ^^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^ ^^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^ ^^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^^ ^
^^ ^^^ ^ ^^ ^^ ^
^^ ^^^ ^ ^^ ^ ^^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^ ^^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^^ ^ ^ ^ ^
^^ ^^^ ^^ ^ ^ ^ ^
^^ ^^^ ^^ ^ ^ ^^
^^ ^^^ ^^ ^ ^ ^ ^
^^ ^^^ ^^ ^ ^^ ^
^^ ^^^ ^^ ^ ^^ ^
^^ ^^^ ^^ ^ ^ ^^
^^ ^^^ ^^ ^ ^ ^ ^
^^ ^^^ ^^ ^^ ^ ^
^^ ^^^ ^^ ^^ ^ ^
^^ ^^^ ^^ ^^ ^^
^^ ^^^ ^^ ^^ ^ ^
^^ ^^^ ^^ ^ ^^ ^
^^ ^^^ ^^ ^ ^^ ^
^^ ^^^ ^^ ^ ^ ^^
^^ ^^^ ^^ ^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^^ ^
^^ ^^^ ^ ^^ ^^ ^
^^ ^^^ ^ ^^ ^ ^^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^ ^^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^ ^ ^ ^^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^ ^^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^^ ^^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^ ^^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^^ ^ ^ ^
^^ ^^ ^^ ^^ ^ ^ ^
^^ ^^ ^^ ^^ ^ ^^
^^ ^^ ^^ ^^ ^ ^ ^
^^ ^^ ^^ ^^ ^^ ^
^^ ^^ ^^ ^^ ^^ ^
^^ ^^ ^^ ^^ ^ ^^
^^ ^^ ^^ ^^ ^ ^ ^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^^ ^^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^ ^^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^ ^^ ^ ^ ^ ^
^^ ^^ ^ ^^ ^ ^ ^ ^
^^ ^^ ^ ^^ ^ ^ ^^
^^ ^^ ^ ^^ ^ ^ ^ ^
^^ ^^ ^ ^^ ^ ^^ ^
^^ ^^ ^ ^^ ^ ^^ ^
^^ ^^ ^ ^^ ^ ^ ^^
^^ ^^ ^ ^^ ^ ^ ^ ^
^^ ^^ ^ ^^ ^^ ^ ^
^^ ^^ ^ ^^ ^^ ^ ^
^^ ^^ ^ ^^ ^^ ^^
^^ ^^ ^ ^^ ^^ ^ ^
^^ ^^ ^ ^^ ^ ^^ ^
^^ ^^ ^ ^^ ^ ^^ ^
^^ ^^ ^ ^^ ^ ^ ^^
^^ ^^ ^ ^^ ^ ^ ^ ^
^^ ^^ ^ ^ ^^ ^ ^ ^
^^ ^^ ^ ^ ^^ ^ ^ ^
^^ ^^ ^ ^ ^^ ^ ^^
^^ ^^ ^ ^ ^^ ^ ^ ^
^^ ^^ ^ ^ ^^ ^^ ^
^^ ^^ ^ ^ ^^ ^^ ^
^^ ^^ ^ ^ ^^ ^ ^^
^^ ^^ ^ ^ ^^ ^ ^ ^
^^ ^^ ^ ^ ^ ^^ ^ ^
^^ ^^ ^ ^ ^ ^^ ^ ^
^^ ^^ ^ ^ ^ ^^ ^^
^^ ^^ ^ ^ ^ ^^ ^ ^
^^ ^^ ^ ^ ^ ^ ^^ ^
^^ ^^ ^ ^ ^ ^ ^^ ^
^^ ^^ ^ ^ ^ ^ ^ ^^
^^ ^^ ^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^^ ^^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^^ ^
^ ^^^ ^^ ^^ ^^ ^
^ ^^^ ^^ ^^ ^ ^^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^^ ^^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^^ ^
^ ^^^ ^ ^ ^^ ^^ ^
^ ^^^ ^ ^ ^^ ^ ^^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^ ^^ ^
^ ^^^ ^ ^ ^ ^ ^^ ^
^ ^^^ ^ ^ ^ ^ ^ ^^
^ ^^^ ^ ^ ^ ^ ^ ^ ^