diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ac80646 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,70 @@ +# Code style rules for enforcing the endjin house style +# See: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference +[*.cs] + +# Core editorconfig formatting - indentation + +# use soft tabs (spaces) for indentation +indent_style = space + +# Formatting - indentation options + +csharp_indent_case_contents = true +csharp_indent_switch_labels = true + +# Formatting - new line options + +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_open_brace = object_collection, object_collection_array_initalizers, accessors, lambdas, control_blocks, methods, properties, types + +# Formatting - organize using options + +dotnet_sort_system_directives_first = true + +# Formatting - spacing options + +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_parameter_list_parentheses = false + +# Formatting - wrapping options + +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + + +# Style - expression bodied member options + +csharp_style_expression_bodied_accessors = false:none +csharp_style_expression_bodied_constructors = false:none +csharp_style_expression_bodied_methods = false:none +csharp_style_expression_bodied_properties = false:none + +# Style - expression level options + +csharp_style_inlined_variable_declaration = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Style - implicit and explicit types + +csharp_style_var_for_built_in_types = false:warning +csharp_style_var_when_type_is_apparent = true:warning +csharp_style_var_elsewhere = false:warning + +# Style - language keyword and framework type options + +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion + +# Style - qualification options + +dotnet_style_qualification_for_field = true:suggestion +dotnet_style_qualification_for_method = true:suggestion +dotnet_style_qualification_for_property = true:suggestion +dotnet_style_qualification_for_event = true:suggestion diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3396944 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,54 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just comment the entries below and +# uncomment the group further below +############################################################################### + +*.sln text eol=crlf +*.csproj text eol=crlf +*.vbproj text eol=crlf +*.vcxproj text eol=crlf +*.vcproj text eol=crlf +*.dbproj text eol=crlf +*.fsproj text eol=crlf +*.lsproj text eol=crlf +*.wixproj text eol=crlf +*.modelproj text eol=crlf +*.sqlproj text eol=crlf +*.wmaproj text eol=crlf + +*.xproj text eol=crlf +*.props text eol=crlf +*.filters text eol=crlf +*.vcxitems text eol=crlf + +*.json text + +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +#*.xproj merge=binary +#*.props merge=binary +#*.filters merge=binary +#*.vcxitems merge=binary \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fa1aba5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,195 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates +local.settings.json +Configuration.json + +# Build results +Drops/ +BuildArtefacts/ +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +#build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Endjin .d.ts +Endjin.*.d.ts +Vellum.*.d.ts + +# Roslyn cache directories +*.ide/ +*.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +#NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding addin-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# If using the old MSBuild-Integrated Package Restore, uncomment this: +#!**/packages/repositories.config +# except solution packages projects +!**/Cms/Packages/* +/ +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +# [Ss]tyle[Cc]op.* <-- We want the stylecop config files +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +MSDeploy/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ diff --git a/AdventOfCode2018.sln b/AdventOfCode2018.sln new file mode 100644 index 0000000..bee28a0 --- /dev/null +++ b/AdventOfCode2018.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28306.52 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AoC2018.Solutions", "AoC2018.Solutions\AoC2018.Solutions.csproj", "{875441A6-700B-4CD1-BDEB-FF84A5ACFC47}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AoC2018.Tests", "AoC2018.Tests\AoC2018.Tests.csproj", "{40846808-9418-4723-A857-4580585942DD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AoC2018.Runner", "AoC2018.Runner\AoC2018.Runner.csproj", "{B3438CDA-5A64-451D-B446-F0778FD0F597}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {875441A6-700B-4CD1-BDEB-FF84A5ACFC47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {875441A6-700B-4CD1-BDEB-FF84A5ACFC47}.Debug|Any CPU.Build.0 = Debug|Any CPU + {875441A6-700B-4CD1-BDEB-FF84A5ACFC47}.Release|Any CPU.ActiveCfg = Release|Any CPU + {875441A6-700B-4CD1-BDEB-FF84A5ACFC47}.Release|Any CPU.Build.0 = Release|Any CPU + {40846808-9418-4723-A857-4580585942DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40846808-9418-4723-A857-4580585942DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40846808-9418-4723-A857-4580585942DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40846808-9418-4723-A857-4580585942DD}.Release|Any CPU.Build.0 = Release|Any CPU + {B3438CDA-5A64-451D-B446-F0778FD0F597}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B3438CDA-5A64-451D-B446-F0778FD0F597}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B3438CDA-5A64-451D-B446-F0778FD0F597}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B3438CDA-5A64-451D-B446-F0778FD0F597}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1940F7C8-FECC-4F11-8FEB-19EC03C47C37} + EndGlobalSection +EndGlobal diff --git a/AoC2018.Runner/AoC2018.Runner.csproj b/AoC2018.Runner/AoC2018.Runner.csproj new file mode 100644 index 0000000..ccd34a8 --- /dev/null +++ b/AoC2018.Runner/AoC2018.Runner.csproj @@ -0,0 +1,45 @@ + + + + Exe + netcoreapp2.1 + ..\AoC2018.Solutions.ruleset + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + diff --git a/AoC2018.Runner/Input/day01.txt b/AoC2018.Runner/Input/day01.txt new file mode 100644 index 0000000..2fdd637 --- /dev/null +++ b/AoC2018.Runner/Input/day01.txt @@ -0,0 +1,1021 @@ ++3 ++13 ++4 +-2 +-4 ++15 +-1 ++6 ++3 +-10 ++9 +-5 +-7 +-15 ++8 +-11 ++19 ++7 ++6 ++1 +-13 ++19 ++7 ++13 +-18 ++2 ++6 ++5 ++8 ++17 +-11 ++14 +-10 +-7 +-9 +-9 ++11 ++15 +-4 ++6 ++13 +-18 ++7 ++4 ++16 +-6 +-7 ++14 ++3 +-15 ++1 +-9 +-21 +-2 ++9 +-11 +-8 +-10 +-11 ++16 ++8 +-12 ++8 ++7 ++1 ++19 +-5 +-3 +-29 +-7 ++11 ++22 ++14 +-13 ++19 ++19 +-6 ++15 ++20 ++6 ++9 ++4 +-9 +-8 +-19 ++14 +-5 ++7 +-8 ++17 +-4 +-3 ++6 ++14 +-16 +-18 ++1 +-12 +-4 +-15 ++24 ++3 +-5 ++11 +-16 ++4 +-14 +-3 ++6 ++19 ++3 +-23 ++19 +-8 ++21 ++13 ++11 ++5 +-18 +-13 ++21 +-14 ++9 ++21 ++12 +-5 +-16 ++14 +-13 ++6 +-18 +-20 ++27 ++9 +-6 ++18 ++8 +-3 +-3 +-4 ++8 ++1 ++7 ++15 ++13 +-2 +-4 +-16 ++7 +-10 +-7 ++12 +-6 +-1 ++13 ++2 +-6 ++2 +-7 ++6 ++14 +-18 ++2 ++15 +-3 +-3 ++5 ++15 +-4 ++19 +-14 ++18 ++1 +-2 +-5 +-18 ++10 +-3 ++15 ++10 ++17 ++9 ++5 ++18 ++1 ++15 ++9 +-14 +-3 ++9 ++6 +-9 ++5 ++3 +-10 +-15 +-12 ++3 ++14 +-6 ++17 +-19 +-1 +-20 ++1 ++18 ++7 ++5 +-9 +-15 ++4 ++19 ++6 ++1 ++14 ++3 ++3 ++16 ++12 ++2 ++13 ++19 ++13 +-9 ++11 ++1 +-8 ++17 ++2 ++13 +-7 +-19 +-19 +-13 ++19 +-2 ++12 +-9 +-12 ++15 +-9 +-17 ++15 +-7 +-12 ++8 +-6 +-19 +-7 +-12 ++6 +-17 ++22 ++13 +-6 ++4 +-1 ++2 +-18 +-15 ++18 +-1 ++13 ++15 +-19 +-19 ++4 +-3 ++11 ++17 ++6 ++1 ++4 ++4 ++17 +-5 ++15 ++10 ++4 ++15 +-13 ++6 ++9 +-12 +-20 ++16 +-12 +-19 ++12 ++21 ++6 +-12 +-20 +-20 ++10 +-21 ++3 +-21 +-15 +-11 +-8 +-18 +-2 ++4 +-5 ++4 +-15 ++3 +-2 +-21 +-6 ++3 +-17 ++1 ++4 ++7 ++19 +-10 +-8 ++9 ++13 ++2 ++11 +-33 ++9 ++4 +-9 ++10 ++1 ++6 +-18 +-8 +-24 ++7 +-23 ++1 ++11 ++17 +-19 ++1 +-13 ++19 ++16 +-15 ++7 +-17 ++5 ++15 ++13 ++12 ++9 +-7 ++1 +-29 +-5 ++42 ++10 ++19 ++20 ++17 ++13 +-4 ++1 ++11 ++5 ++20 ++23 ++20 ++17 ++1 +-3 +-6 +-6 ++28 +-24 +-19 ++31 +-32 +-46 ++11 ++9 +-8 ++1 ++23 ++34 ++74 ++20 ++19 ++1 +-13 +-34 ++14 ++6 ++48 ++18 ++20 ++5 +-15 ++6 +-14 ++17 +-11 +-24 ++19 ++15 +-17 +-21 ++12 ++2 ++2 ++2 ++143 +-1 +-24 ++52 ++135 ++8 +-13 ++30 ++192 ++72 +-526 ++60476 +-14 ++17 +-16 ++15 +-9 ++11 ++13 +-5 +-6 ++5 +-4 +-8 +-10 ++12 ++19 ++15 ++16 ++11 +-15 ++18 ++14 ++1 +-10 ++14 ++11 ++3 ++13 +-2 ++12 ++13 +-8 +-14 ++7 +-15 +-5 ++15 ++18 ++16 ++16 ++2 ++5 +-4 +-5 +-8 ++14 ++18 +-9 ++4 +-16 +-14 ++8 ++4 +-5 ++3 ++11 ++6 ++19 ++9 +-18 ++12 ++10 ++2 ++1 ++1 ++19 ++15 ++1 +-13 +-13 ++6 ++9 +-11 +-12 +-21 +-19 ++4 ++10 ++18 ++12 ++12 +-1 ++14 +-2 ++1 ++18 ++9 +-15 +-16 +-14 ++1 +-5 +-5 +-7 +-19 ++8 ++6 +-5 ++23 ++13 +-7 ++12 ++1 ++6 ++21 ++14 ++8 ++17 ++13 ++13 ++18 ++16 +-3 +-18 +-8 +-1 +-8 +-1 +-2 +-18 +-9 +-8 ++10 +-5 ++2 +-18 +-16 +-4 +-14 +-12 +-17 ++20 ++15 +-1 ++8 ++7 ++15 +-12 +-6 +-9 ++3 ++14 ++5 +-4 ++11 ++4 ++2 ++11 ++12 ++11 +-8 ++10 +-1 +-19 ++12 ++1 +-14 +-2 ++19 ++15 ++14 ++3 +-18 +-3 ++9 ++3 +-13 +-4 ++15 ++1 ++14 +-3 ++20 ++13 +-11 +-4 +-11 ++2 ++16 ++1 ++2 ++13 ++18 +-12 +-9 ++2 ++17 +-13 +-1 ++9 +-6 +-14 ++5 +-6 +-10 ++3 +-10 +-6 +-3 ++7 ++17 +-6 +-6 +-22 +-2 ++9 +-17 ++13 ++13 ++4 +-14 ++5 +-15 ++13 +-18 ++8 ++51 +-3 ++9 +-17 ++5 +-4 +-16 ++29 ++5 ++1 ++9 ++19 +-16 ++8 ++18 ++9 ++13 ++8 +-11 ++8 ++19 ++6 +-15 +-12 ++4 +-11 +-17 +-6 +-20 ++17 ++11 ++17 +-14 +-10 +-10 +-18 +-10 ++15 +-1 ++15 ++17 ++13 ++17 +-3 ++2 +-1 ++4 ++19 ++14 +-16 ++5 +-10 +-13 ++15 ++20 +-10 +-1 ++19 +-5 ++4 +-12 ++20 ++17 +-15 ++10 +-18 ++16 ++12 ++5 +-12 ++5 +-4 ++20 ++1 ++4 +-3 +-15 +-18 ++20 ++7 +-2 ++12 ++3 +-1 +-10 ++15 ++13 ++17 ++8 ++1 ++7 +-11 +-8 +-8 +-21 +-19 +-21 +-9 +-15 +-14 +-16 ++7 +-5 ++22 ++18 ++14 +-10 +-21 ++11 +-30 ++5 +-6 ++24 +-26 +-18 +-9 ++1 +-5 +-8 ++14 +-17 ++9 +-1 +-2 +-20 ++6 ++7 +-5 ++20 +-2 ++15 ++25 ++20 ++28 ++15 +-32 +-16 +-2 ++54 ++15 ++17 ++18 +-8 ++2 ++20 ++6 ++7 +-10 +-6 ++30 +-12 ++36 ++6 +-4 ++7 ++9 ++14 +-9 +-1 ++14 +-7 +-10 ++18 ++17 ++3 ++1 +-3 +-17 ++3 +-11 ++17 ++3 ++24 +-11 ++15 +-25 ++13 +-6 +-39 +-10 ++17 ++11 +-22 +-28 ++5 ++3 +-29 +-23 +-8 +-19 ++8 +-22 +-17 +-16 ++20 +-18 ++10 ++41 +-11 +-202 +-6 +-14 ++11 ++34 +-12 ++487 ++495 ++60020 +-18 ++2 ++7 ++7 +-8 +-19 +-16 ++7 ++10 +-2 ++19 +-14 +-15 +-11 ++16 ++8 +-16 +-13 +-6 ++12 ++18 ++15 ++4 +-11 ++20 +-4 ++3 ++9 ++5 +-16 ++6 +-19 ++17 ++18 +-2 +-2 +-9 ++16 +-15 ++2 ++19 ++3 +-10 +-1 ++19 +-6 +-8 +-20 ++19 ++12 ++16 +-12 ++15 +-4 +-7 ++4 ++1 +-19 +-1 +-19 ++1 +-13 +-17 +-13 +-17 +-11 +-19 +-5 ++9 +-6 ++18 ++9 ++4 +-11 +-1 +-3 ++8 ++13 +-9 ++16 ++20 +-1 ++10 +-19 +-6 ++18 ++5 +-1 +-18 +-16 +-11 ++16 ++2 +-17 ++4 ++3 ++18 +-13 +-25 +-12 +-17 +-18 +-10 +-12 +-15 ++19 +-14 ++6 ++10 ++14 ++16 +-11 +-2 +-16 +-13 +-11 ++9 ++10 +-18 +-12 +-6 +-1 +-13 ++17 +-6 ++12 ++2 ++12 ++9 ++19 ++20 +-11 ++5 ++13 +-9 +-5 ++3 +-5 +-15 +-16 +-4 ++8 +-14 +-8 +-8 ++10 +-7 +-14 +-12 +-10 ++8 ++3 +-19 ++20 +-15 +-18 ++22 ++14 +-6 +-16 +-2 +-10 ++9 +-12 ++4 +-12 ++10 +-15 +-18 +-8 ++9 ++1 +-11 ++8 +-121858 \ No newline at end of file diff --git a/AoC2018.Runner/Input/day02.txt b/AoC2018.Runner/Input/day02.txt new file mode 100644 index 0000000..3120fb1 --- /dev/null +++ b/AoC2018.Runner/Input/day02.txt @@ -0,0 +1,250 @@ +bpacnmelhhzpygfsjoxtvkwuor +biacnmelnizqygfsjoctvkwudr +bpaccmllhizyygfsjoxtvkwudr +rpacnmelhizqsufsjoxtvkwudr +bfacnmelhizqygfsjoxtvwwudp +bpacnmelhizqynfsjodtvkyudr +bpafnmelhizqpgfsjjxtvkwudr +bpackmelhizcygfsjoxtvkwudo +bmacnmilhizqygfsjoltvkwudr +bpafnmelhizuygfsjoxtvkwsdr +boacnmylhizqygfsjoxtvxwudr +bpbcjmelhizqygfsjoxtgkwudr +bpacnmglhizqygfsjixtlkwudr +bpacnmclhizqygfsjoxtvkwtqr +bpacnmelhczqygtsjoptvkwudr +bpacnmelhizqywfsaoxtvkbudr +apacnmelhizqygcsjoxtvkwhdr +bpacnmelrizqygfsbpxtvkwudr +tpkcnmelpizqygfsjoxtvkwudr +bpacnmelhizqlgfsjobtmkwudr +npacnmelhizqygffjoxtvkwudf +bpacnmeehqzqygqsjoxtvkwudr +bpecnmelhizqigfsjvxtvkwudr +bpacnmelhizqysfsjoxtvkdfdr +bpacnfelhkzqygfsjoxtvkwfdr +bpacnbelvizqygfsjoxthkwudr +bpacnoelhizqygfejoxtvkwudn +bpacnmelhizqygfzpkxtvkwudr +bpahnmelhizqyufsjoxmvkwudr +bpacnmelhizqygfsnoxtvkwmmr +bpacnmelhizqygfsjoatvkludf +bpacnmylhizqygfsjlxtvksudr +bpacnmekhpzqygysjoxtvkwudr +bpacnselhizqogfswoxtvkwudr +bpacnmelhizqprfsjoxwvkwudr +bpatnmelhinqygfsjoctvkwudr +bpacnqelhqzqygfsxoxtvkwudr +bpabnmelhiyqygfsjoxtykwudr +bpacnivlhizqygfsjoxtviwudr +bpkcnmylhizqygfsjoxtvkwcdr +bpafnmflhizqygtsjoxtvkwudr +bpachmelhizqygfsjixtvkwudg +bpacymelhizqygfsjoxtykwuar +bpacnkelhizqdgfsjoxtskwudr +bpacnmezhizqggbsjoxtvkwudr +bpacnmqlhizqygrsjoxzvkwudr +bpaczmelhizqyhfsjoxfvkwudr +bdacnmelhyzqygusjoxtvkwudr +bpacbmelhizqywfsjostvkwudr +bpacnmelhihzygfstoxtvkwudr +bpactmelhizqygfsjcxtvkwydr +bkacnmethizqytfsjoxtvkwudr +bpacnmalhizqydfskoxtvkwudr +spacnmelbizqygfsjoxdvkwudr +lpalnmelhizoygfsjoxtvkwudr +bpacjmeghizqygfsjoxtviwudr +bpacnmeqhizxygfsjoxgvkwudr +bpacnmelhizqygosjoxtvkkuhr +bpacnmelhiznbxfsjoxtvkwudr +bgacnmelhizqygfsjbxivkwudr +bpacnmelhizqygfjjowtvswudr +bpacnmelhizqygfsjovtgkmudr +bpacnmelcmzqygfspoxtvkwudr +bpvcnmelhizqyvfcjoxtvkwudr +bpacnmeahizqjgfsjoxtvkwukr +bpacnoelwizqygfsjoxtvkaudr +xpacnmelhizqygfsjoxdvkwedr +mpacnmelqizqygfsjoxtvkwudx +bppcnmelhizqygfsjfxtvkhudr +bpacnmclhizqyhfsjaxtvkwudr +opacsmelhizqygfsjmxtvkwudr +bpafnmelhizqjgfsjoxtvkrudr +bpdcnmilhizqygfsjoxtvkludr +bpainmelhizqygfsjtntvkwudr +bradnmelhizqygfsjextvkwudr +bpacnmelhizqygfmsoxtvkwudg +bpacneelhizqygvrjoxtvkwudr +bpacnpelhizqygfsjoxyvkwudf +bpacnmelhizqygfsqoqtvkwodr +bpacnmelhizjyghsjoxcvkwudr +bpacnmelmibqygfsjoxtvnwudr +jpacnmelaizqygfwjoxtvkwudr +zpachmelhizqygfsjsxtvkwudr +bpacnmelfizqykfsjomtvkwudr +bpacnmllwizqygfsjoxtvkwusr +bpaynmelhizqygfsjoxtvowcdr +jpacnmqlhizqygfsjoxtvknudr +bpacxmelhizqyffsjoxtvkwugr +apawnmelhizqygfsjtxtvkwudr +mpacnmelhitqigfsjoxtvkwudr +bpacnmelhhzqygfsjoxtvkyzdr +gpacnmelhizqynfsjoxtvkwudm +bnacnkelhizqygfsjoxtpkwudr +bpacnmelfizqygfsumxtvkwudr +bpacnmelhisqygfsjohtvowudr +bpacnmelhimqygxsjoxtvkwudn +bpscnmeliizqygfsjoxtvkwunr +qpacnmelhizqycfsjoxtvkwndr +bpacnmelhijqygfsjohtvkyudr +bpacnmelhizqykfsjkxtvknudr +bpacnqilhizqygfsjoxtvkoudr +bpacnmelhizqzgmsjoxtvkwurr +bpdcnmelhizqygfsjoutukwudr +bpecnmeghizqygfsjoxgvkwudr +bpicnmelhizqygfrjoxtvlwudr +bpacnmelhizfygfsroxtvkwodr +buacnmelhizqygjsjoxtvkvudr +bpacnmelhixqykfsjoxtvrwudr +bpacnmelhizqygvejcxtvkwudr +bpacnmjlhizqylfsjoxtvkwuor +qpacnmelhizqygfsjoxfdkwudr +bpfcnmemhizqygfsjoxtvknudr +bpacnmelhizqoffsjqxtvkwudr +hpacnielhiqqygfsjoxtvkwudr +gpacnmelhizqygfsewxtvkwudr +bpacnmellizqylxsjoxtvkwudr +bpacnmenhizqymfsjoxtvkmudr +bpacnfelhizqygcsjoltvkwudr +bpacnmelhqqqygfsjoxtvkuudr +bplgnmelhiqqygfsjoxtvkwudr +bpacnzelhizqygfgjoxtvnwudr +bpacnmelhizqygfsjoktvknunr +bpacnmdlhioqygfnjoxtvkwudr +epacnmelwizqyjfsjoxtvkwudr +bpacxmelhazfygfsjoxtvkwudr +bpacnmejhezqygfsjoxtskwudr +bpacnqelhihqyzfsjoxtvkwudr +bpacnbelhizqyrfsjoxtvkmudr +bpacnmelhizqygfsjoxtylwzdr +bpacnmelwizqygfsjodtvkhudr +bpacnnelhizqygfsjoxtwkwadr +bpacimelhizqygfsnoxtvkwuor +bpacnmelhizqyaasjoxtlkwudr +bpacnmelhizqyeffjoxtvkwuds +bpacnmenhizqygxscoxtvkwudr +bpacnmelhidqygfsjowtskwudr +bpacnmeliizqygfsjoxhvkwucr +bpacimelhizqygfsjoxtvktuwr +bpainmelhhzqygfsjzxtvkwudr +bpacamelhizqygfsjogtvkwbdr +bpccnmelgizqygfsjoxtykwudr +bpacnmelhizwegfsjoxtvkwadr +bpackmelhbzqygqsjoxtvkwudr +bpacymeihizqyffsjoxtvkwudr +bpacnielhczqygfsjoxtvkwudk +bpacnmejhizqygffjoxjvkwudr +ppacnmelhizqygfsjoxtigwudr +bpjcnmolhizqygfsjoxtvkwndr +bpacnmelcizqygrsjoxtakwudr +cpawnmelhizqygfsjoxmvkwudr +bwacnmelhizqygesjoxtakwudr +bpacnmelhizqygfsjexsvkwddr +bpaunmelhiuqygfsjoxtvkwtdr +bpacnmellimqygfsjextvkwudr +bpacnmerhizqygfsaoxvvkwudr +bpacnmglhizqygfsjixtukwudr +ppacnmelhizqygfsjoxtvkdudp +bpacnmedhizqygukjoxtvkwudr +bpccnmelhizqngfsjoxtvkwadr +bgacnmeldizqygfscoxtvkwudr +bpacngelhizsygfsjoxtvkwkdr +bpacnpelhizqygfsjoxctkwudr +bpacnmylhizqygfcjoxtvkwmdr +npacnmelhizqygfsjoxtwkwuds +bpaxnmelhizqydfsjoxyvkwudr +bpacnhelhizjygfsjoxtvkmudr +bpacnkelhczqygfnjoxtvkwudr +bfacnmelhizrygfsjoxtvkwodr +bpycnmelhizqygfofoxtvkwudr +qpacpselhizqygfsjoxtvkwudr +bpvcnmelhezqygfsjoxttkwudr +bpacnmwlhizqygfijoxtmkwudr +bsacnmelhikqygfsjoxttkwudr +bpccnxelhizqyafsjoxtvkwudr +bpacnmelhizqygfswhxtvewudr +vpacnmzlhizqygfsvoxtvkwudr +bpacnmelhihqygfsjoxtvkqurr +bpacnmelhixqygazjoxtvkwudr +bpavnmelhizqygfsjozpvkwudr +bpacnmclhizuygfsjoxmvkwudr +bpacnmelhizryufsjoxtkkwudr +bpacnmelhtzqygfsjobtvkwufr +bpacnmelhizqmlfsjoxtvkwudq +bpaaneelhizqygfsjlxtvkwudr +bpacnmelhxzqygfsjoxthkwuhr +bpacnmeshizqygfcjoxtvkwude +bpacnzqlhizqygfsxoxtvkwudr +bgaanmelhizqycfsjoxtvkwudr +bpacnmexhizqygfsroxtvkwudn +bpmmnmelhizqygfajoxtvkwudr +bpacnmelhizqylfsjoxtckwhdr +bpicnmelhizqyrfsjoxtvkwudi +zpacnmelhizvycfsjoxtvkwudr +bpamnmkllizqygfsjoxtvkwudr +bpacnmelhrzqyrfsjoxgvkwudr +bpadnmelhczqygfsjoxtlkwudr +bpacrmelhizqygrsjoxtvkiudr +lpacnmelhizqygfsjoxtgkwxdr +fpacnmalhiuqygfsjoxtvkwudr +bpacnmelhizqygfsjixtvfwcdr +bpccnmelhxzqygfkjoxtvkwudr +bpacnmepaizqygfsjoctvkwudr +tpacnmelhivqygfsxoxtvkwudr +kpacnfelhitqygfsjoxtvkwudr +baacnzelhizqygfsjoxtvkwudx +bcycnmeghizqygfsjoxtvkwudr +wpacotelhizqygfsjoxtvkwudr +bpacnmsshizqygrsjoxtvkwudr +blacnmelhizqygfsjoxtykwvdr +bkacnmelhizqygfsjoxuvkludr +bpacnmelhizaugfsjoxtvhwudr +fpavnmelhizqygfsgoxtvkwudr +bpachmelnizqygfsjextvkwudr +bpacnmelhizqpgfsjoxtvkwldu +bpacnmelhizqygfsloftvywudr +bpacntelhvzqygfejoxtvkwudr +bpacnmeldizqygfsjmxtvkdudr +byacnmelhizqygfsjsxtvkwudh +bpacnmellizqygssxoxtvkwudr +bpacnmelhizqygfsjootvknuir +bpacnmelhitqjgfsjoxivkwudr +bpacnmelhazaygfsjoxtvfwudr +bpacnzenhizqygfsjzxtvkwudr +bpacnmelhizqypfsdoxtvkwuar +bpannmelhizqygnsjoxtvkwndr +bracnmeldizsygfsjoxtvkwudr +bpacnmelhizwygfsjugtvkwudr +bpatnmelhizqygfsjoytvkwulr +upacnmelhizqygfsjurtvkwudr +bpaenmezhizqygfsjostvkwudr +bpacnmelhizpygfsjodhvkwudr +bpacnmelhizqygfsjogtvkguwr +bpacnmelhisqygfsjoxtpkuudr +bxacnmelhizqygfsjdxtvkfudr +bpacnmelhizqygfsjohqvkwudu +bzacnmtlhizqygfsjoxsvkwudr +bpacnmplhixrygfsjoxtvkwudr +bpacnmelhizqhgfsjomtvkwudg +bpacnmezhizqygfsjxxtykwudr +bpacnmwlhizqygfujoxtzkwudr +tpacnmelhizqygfsjoxkvpwudr +bpawsmenhizqygfsjoxtvkwudr +bpacnmelhizqtgfsjoxttkwuqr +bpkcbmelhizqygfsjoxtvkwucr +bpacfmekhizqygfsjoxtvkwuds +bpacnmethizqynfajoxtvkwudr +bpocnmclhizqygfsjoxtvkwukr +zpacnmwlhizqygfsjoxzvkwudr +bpacpoelhqzqygfsjoxtvkwudr +bpacnlelhizqyzfsjoxtvkwukr \ No newline at end of file diff --git a/AoC2018.Runner/Input/day03.txt b/AoC2018.Runner/Input/day03.txt new file mode 100644 index 0000000..1ff7bdc --- /dev/null +++ b/AoC2018.Runner/Input/day03.txt @@ -0,0 +1,1311 @@ +#1 @ 258,327: 19x22 +#2 @ 553,11: 13x13 +#3 @ 619,175: 17x20 +#4 @ 965,962: 26x16 +#5 @ 389,618: 23x28 +#6 @ 232,720: 14x20 +#7 @ 548,695: 10x20 +#8 @ 149,242: 16x17 +#9 @ 628,301: 22x25 +#10 @ 229,298: 21x11 +#11 @ 315,784: 25x19 +#12 @ 557,444: 27x26 +#13 @ 510,120: 20x22 +#14 @ 616,929: 20x17 +#15 @ 779,957: 23x16 +#16 @ 576,682: 22x15 +#17 @ 16,205: 20x23 +#18 @ 954,514: 28x10 +#19 @ 238,149: 20x14 +#20 @ 353,669: 12x24 +#21 @ 70,916: 24x10 +#22 @ 264,505: 25x16 +#23 @ 559,307: 26x22 +#24 @ 52,959: 11x24 +#25 @ 713,889: 17x25 +#26 @ 746,433: 20x11 +#27 @ 117,775: 27x11 +#28 @ 925,830: 20x13 +#29 @ 456,760: 19x23 +#30 @ 88,39: 17x20 +#31 @ 851,79: 16x24 +#32 @ 330,230: 25x10 +#33 @ 743,816: 16x12 +#34 @ 518,637: 26x25 +#35 @ 267,330: 25x28 +#36 @ 745,665: 14x28 +#37 @ 627,965: 19x13 +#38 @ 278,558: 11x14 +#39 @ 742,755: 11x14 +#40 @ 638,758: 23x25 +#41 @ 766,736: 17x21 +#42 @ 675,276: 26x21 +#43 @ 679,841: 26x15 +#44 @ 748,43: 26x23 +#45 @ 961,273: 15x14 +#46 @ 361,955: 17x11 +#47 @ 192,552: 17x26 +#48 @ 874,580: 14x20 +#49 @ 672,284: 29x12 +#50 @ 470,772: 12x12 +#51 @ 260,350: 27x10 +#52 @ 855,96: 18x24 +#53 @ 725,302: 19x26 +#54 @ 646,826: 15x18 +#55 @ 902,116: 17x10 +#56 @ 251,767: 17x24 +#57 @ 781,274: 17x12 +#58 @ 284,168: 13x13 +#59 @ 808,592: 11x10 +#60 @ 497,656: 13x11 +#61 @ 230,279: 17x28 +#62 @ 557,324: 21x13 +#63 @ 447,213: 23x19 +#64 @ 333,55: 29x19 +#65 @ 618,151: 23x12 +#66 @ 514,584: 29x21 +#67 @ 496,832: 19x29 +#68 @ 791,909: 26x23 +#69 @ 889,104: 28x10 +#70 @ 156,263: 9x10 +#71 @ 590,904: 20x15 +#72 @ 45,307: 20x21 +#73 @ 714,305: 10x11 +#74 @ 893,437: 22x17 +#75 @ 134,482: 29x16 +#76 @ 360,352: 28x26 +#77 @ 530,302: 26x23 +#78 @ 171,895: 18x18 +#79 @ 876,371: 21x29 +#80 @ 84,835: 14x20 +#81 @ 978,486: 21x21 +#82 @ 900,664: 24x16 +#83 @ 807,267: 10x21 +#84 @ 104,792: 19x29 +#85 @ 55,608: 18x13 +#86 @ 25,623: 14x26 +#87 @ 711,878: 16x25 +#88 @ 357,315: 11x14 +#89 @ 90,170: 28x15 +#90 @ 377,81: 13x19 +#91 @ 154,261: 14x15 +#92 @ 551,287: 20x20 +#93 @ 871,690: 24x15 +#94 @ 193,681: 24x14 +#95 @ 549,568: 27x18 +#96 @ 400,832: 19x27 +#97 @ 411,476: 25x11 +#98 @ 909,90: 15x21 +#99 @ 418,358: 18x28 +#100 @ 466,213: 21x18 +#101 @ 293,183: 19x21 +#102 @ 430,402: 27x10 +#103 @ 424,60: 17x24 +#104 @ 657,906: 14x23 +#105 @ 326,650: 17x27 +#106 @ 886,105: 22x19 +#107 @ 454,399: 15x24 +#108 @ 185,415: 21x19 +#109 @ 645,789: 17x25 +#110 @ 649,889: 18x14 +#111 @ 824,149: 11x27 +#112 @ 948,282: 27x18 +#113 @ 632,645: 27x19 +#114 @ 530,545: 10x29 +#115 @ 43,961: 13x12 +#116 @ 709,758: 24x17 +#117 @ 480,942: 10x29 +#118 @ 289,208: 29x13 +#119 @ 277,928: 18x25 +#120 @ 503,832: 15x28 +#121 @ 126,109: 27x19 +#122 @ 369,106: 22x17 +#123 @ 620,137: 18x15 +#124 @ 268,978: 12x14 +#125 @ 180,553: 27x26 +#126 @ 71,419: 29x17 +#127 @ 21,958: 28x10 +#128 @ 661,826: 18x19 +#129 @ 922,56: 11x28 +#130 @ 735,89: 14x15 +#131 @ 486,271: 17x11 +#132 @ 760,69: 11x20 +#133 @ 328,665: 13x18 +#134 @ 53,71: 25x13 +#135 @ 60,178: 8x3 +#136 @ 64,913: 28x14 +#137 @ 757,367: 11x25 +#138 @ 60,247: 18x14 +#139 @ 418,224: 12x20 +#140 @ 899,48: 26x29 +#141 @ 393,633: 28x25 +#142 @ 868,142: 12x24 +#143 @ 83,900: 24x16 +#144 @ 312,942: 13x13 +#145 @ 136,104: 10x29 +#146 @ 674,780: 21x24 +#147 @ 133,932: 10x27 +#148 @ 267,827: 24x17 +#149 @ 545,344: 13x10 +#150 @ 760,897: 11x23 +#151 @ 242,660: 10x20 +#152 @ 802,758: 25x25 +#153 @ 919,55: 13x21 +#154 @ 850,317: 29x15 +#155 @ 55,176: 20x10 +#156 @ 278,852: 29x11 +#157 @ 931,318: 29x26 +#158 @ 74,351: 21x25 +#159 @ 712,305: 25x24 +#160 @ 605,363: 24x13 +#161 @ 719,887: 20x10 +#162 @ 730,172: 8x7 +#163 @ 468,572: 13x10 +#164 @ 541,74: 29x13 +#165 @ 402,206: 27x18 +#166 @ 310,147: 17x25 +#167 @ 243,145: 21x14 +#168 @ 441,640: 23x11 +#169 @ 680,331: 16x11 +#170 @ 22,446: 9x6 +#171 @ 685,327: 19x21 +#172 @ 52,872: 29x27 +#173 @ 723,39: 13x15 +#174 @ 522,799: 16x19 +#175 @ 335,529: 18x10 +#176 @ 663,304: 15x22 +#177 @ 921,704: 24x15 +#178 @ 874,492: 23x21 +#179 @ 810,939: 18x21 +#180 @ 119,80: 12x29 +#181 @ 780,446: 27x22 +#182 @ 295,32: 17x26 +#183 @ 341,833: 23x11 +#184 @ 115,773: 27x15 +#185 @ 752,644: 17x29 +#186 @ 767,636: 15x19 +#187 @ 296,211: 10x11 +#188 @ 474,347: 27x25 +#189 @ 593,333: 17x18 +#190 @ 859,571: 18x15 +#191 @ 434,404: 17x10 +#192 @ 803,621: 26x27 +#193 @ 737,39: 19x18 +#194 @ 245,301: 23x23 +#195 @ 457,478: 27x18 +#196 @ 450,939: 24x25 +#197 @ 918,64: 12x10 +#198 @ 679,921: 12x12 +#199 @ 549,615: 29x23 +#200 @ 874,415: 22x18 +#201 @ 232,280: 24x29 +#202 @ 729,379: 17x20 +#203 @ 813,740: 11x20 +#204 @ 659,216: 17x29 +#205 @ 303,899: 10x27 +#206 @ 934,694: 24x20 +#207 @ 185,621: 16x18 +#208 @ 856,708: 23x25 +#209 @ 799,914: 29x20 +#210 @ 890,702: 25x13 +#211 @ 517,104: 16x29 +#212 @ 981,593: 12x18 +#213 @ 807,56: 29x24 +#214 @ 57,464: 24x21 +#215 @ 356,831: 17x17 +#216 @ 55,420: 17x28 +#217 @ 29,583: 17x15 +#218 @ 740,868: 10x10 +#219 @ 793,643: 29x23 +#220 @ 255,573: 25x24 +#221 @ 738,897: 25x29 +#222 @ 859,823: 10x17 +#223 @ 427,211: 15x21 +#224 @ 882,476: 13x26 +#225 @ 374,969: 28x19 +#226 @ 138,478: 10x21 +#227 @ 58,623: 19x19 +#228 @ 436,238: 16x25 +#229 @ 590,907: 23x29 +#230 @ 950,508: 11x13 +#231 @ 969,646: 20x19 +#232 @ 470,473: 28x20 +#233 @ 976,604: 15x24 +#234 @ 808,53: 26x24 +#235 @ 71,260: 24x14 +#236 @ 841,81: 29x11 +#237 @ 944,963: 21x24 +#238 @ 632,235: 12x14 +#239 @ 768,494: 14x25 +#240 @ 788,437: 8x3 +#241 @ 474,164: 25x29 +#242 @ 93,903: 18x20 +#243 @ 235,752: 26x13 +#244 @ 478,414: 13x18 +#245 @ 294,930: 14x17 +#246 @ 932,897: 21x13 +#247 @ 300,916: 29x19 +#248 @ 762,98: 11x21 +#249 @ 746,629: 29x21 +#250 @ 279,179: 26x11 +#251 @ 426,338: 21x17 +#252 @ 859,811: 12x24 +#253 @ 722,751: 29x15 +#254 @ 55,253: 28x19 +#255 @ 739,434: 11x22 +#256 @ 61,309: 14x27 +#257 @ 669,273: 14x10 +#258 @ 413,506: 12x12 +#259 @ 47,812: 19x21 +#260 @ 846,580: 18x22 +#261 @ 281,841: 19x20 +#262 @ 761,360: 25x29 +#263 @ 245,972: 14x18 +#264 @ 637,266: 16x24 +#265 @ 167,304: 14x24 +#266 @ 438,331: 11x12 +#267 @ 525,912: 12x21 +#268 @ 249,139: 25x17 +#269 @ 956,389: 15x26 +#270 @ 153,977: 17x15 +#271 @ 226,692: 19x22 +#272 @ 717,894: 26x22 +#273 @ 100,838: 13x10 +#274 @ 81,113: 24x25 +#275 @ 231,150: 25x20 +#276 @ 882,200: 29x26 +#277 @ 890,380: 16x25 +#278 @ 655,893: 18x29 +#279 @ 125,481: 26x19 +#280 @ 975,198: 18x18 +#281 @ 332,332: 28x28 +#282 @ 902,352: 12x18 +#283 @ 123,904: 18x19 +#284 @ 38,447: 29x27 +#285 @ 142,34: 19x27 +#286 @ 513,810: 12x23 +#287 @ 270,494: 28x13 +#288 @ 940,409: 10x19 +#289 @ 656,8: 19x25 +#290 @ 436,263: 14x29 +#291 @ 344,694: 19x11 +#292 @ 541,838: 22x26 +#293 @ 910,958: 13x16 +#294 @ 870,224: 23x20 +#295 @ 483,431: 22x23 +#296 @ 170,402: 6x10 +#297 @ 549,116: 15x22 +#298 @ 901,689: 16x11 +#299 @ 84,344: 19x16 +#300 @ 60,293: 16x15 +#301 @ 724,473: 20x23 +#302 @ 693,46: 22x27 +#303 @ 616,62: 20x17 +#304 @ 857,973: 12x11 +#305 @ 688,201: 28x20 +#306 @ 14,790: 21x16 +#307 @ 304,441: 26x14 +#308 @ 272,623: 24x15 +#309 @ 746,139: 24x10 +#310 @ 218,844: 14x15 +#311 @ 837,881: 10x27 +#312 @ 643,14: 15x21 +#313 @ 366,487: 20x23 +#314 @ 487,720: 14x29 +#315 @ 526,534: 24x20 +#316 @ 348,883: 28x11 +#317 @ 646,93: 27x27 +#318 @ 739,805: 11x23 +#319 @ 946,619: 15x10 +#320 @ 778,77: 20x11 +#321 @ 150,845: 11x26 +#322 @ 952,671: 10x17 +#323 @ 910,418: 15x14 +#324 @ 404,644: 13x10 +#325 @ 21,506: 12x13 +#326 @ 93,493: 17x12 +#327 @ 19,618: 15x18 +#328 @ 505,736: 22x27 +#329 @ 526,953: 21x20 +#330 @ 485,794: 13x20 +#331 @ 515,977: 9x5 +#332 @ 889,373: 15x17 +#333 @ 532,536: 9x14 +#334 @ 431,353: 10x22 +#335 @ 846,794: 14x11 +#336 @ 946,677: 13x14 +#337 @ 670,110: 10x15 +#338 @ 889,322: 14x20 +#339 @ 311,23: 3x13 +#340 @ 51,663: 28x20 +#341 @ 925,828: 29x17 +#342 @ 177,376: 27x15 +#343 @ 384,620: 27x12 +#344 @ 338,394: 29x16 +#345 @ 744,933: 13x9 +#346 @ 665,21: 25x10 +#347 @ 533,588: 20x12 +#348 @ 115,425: 22x22 +#349 @ 823,400: 11x11 +#350 @ 38,351: 19x25 +#351 @ 548,278: 15x24 +#352 @ 27,234: 29x11 +#353 @ 125,93: 18x17 +#354 @ 262,867: 26x25 +#355 @ 223,867: 19x17 +#356 @ 10,556: 18x27 +#357 @ 631,849: 22x26 +#358 @ 529,878: 22x24 +#359 @ 276,292: 22x27 +#360 @ 882,678: 15x17 +#361 @ 828,743: 21x10 +#362 @ 729,522: 17x24 +#363 @ 836,75: 25x12 +#364 @ 221,875: 15x11 +#365 @ 507,247: 24x21 +#366 @ 331,733: 15x29 +#367 @ 766,746: 25x26 +#368 @ 426,205: 15x25 +#369 @ 357,181: 23x17 +#370 @ 461,549: 15x23 +#371 @ 673,322: 12x12 +#372 @ 295,586: 17x14 +#373 @ 58,819: 15x9 +#374 @ 484,957: 20x21 +#375 @ 676,497: 25x15 +#376 @ 929,32: 18x23 +#377 @ 157,783: 27x28 +#378 @ 462,465: 11x29 +#379 @ 701,24: 22x28 +#380 @ 196,258: 29x18 +#381 @ 159,234: 26x17 +#382 @ 487,279: 26x16 +#383 @ 483,804: 28x27 +#384 @ 348,683: 17x21 +#385 @ 806,815: 20x20 +#386 @ 625,234: 18x26 +#387 @ 744,562: 19x20 +#388 @ 362,708: 11x21 +#389 @ 444,587: 24x20 +#390 @ 435,411: 29x21 +#391 @ 969,188: 22x23 +#392 @ 332,786: 24x19 +#393 @ 659,969: 24x13 +#394 @ 424,393: 19x18 +#395 @ 972,484: 19x12 +#396 @ 963,242: 20x28 +#397 @ 664,630: 12x10 +#398 @ 567,72: 23x12 +#399 @ 935,200: 25x15 +#400 @ 750,568: 11x13 +#401 @ 775,113: 13x11 +#402 @ 687,441: 11x23 +#403 @ 623,335: 10x25 +#404 @ 542,946: 13x18 +#405 @ 503,59: 16x16 +#406 @ 578,846: 26x18 +#407 @ 380,261: 17x16 +#408 @ 462,208: 20x26 +#409 @ 548,329: 13x23 +#410 @ 858,722: 25x29 +#411 @ 368,722: 24x11 +#412 @ 970,671: 13x29 +#413 @ 326,701: 18x11 +#414 @ 74,22: 25x14 +#415 @ 456,85: 12x24 +#416 @ 696,79: 18x29 +#417 @ 942,745: 29x15 +#418 @ 906,491: 29x12 +#419 @ 700,813: 11x29 +#420 @ 250,296: 13x10 +#421 @ 465,52: 28x28 +#422 @ 147,538: 21x12 +#423 @ 360,300: 11x27 +#424 @ 942,248: 22x10 +#425 @ 819,708: 10x22 +#426 @ 745,563: 17x16 +#427 @ 393,608: 11x12 +#428 @ 116,526: 17x14 +#429 @ 470,155: 13x10 +#430 @ 357,534: 13x29 +#431 @ 330,962: 20x20 +#432 @ 462,4: 22x26 +#433 @ 853,807: 27x17 +#434 @ 671,971: 28x21 +#435 @ 537,4: 20x26 +#436 @ 656,324: 13x13 +#437 @ 90,822: 25x29 +#438 @ 764,355: 15x10 +#439 @ 61,978: 27x20 +#440 @ 520,194: 19x22 +#441 @ 553,293: 19x18 +#442 @ 654,264: 25x22 +#443 @ 368,182: 29x11 +#444 @ 433,613: 21x17 +#445 @ 727,68: 11x10 +#446 @ 250,457: 14x13 +#447 @ 289,122: 15x20 +#448 @ 262,922: 24x14 +#449 @ 824,657: 19x21 +#450 @ 786,265: 19x22 +#451 @ 900,457: 23x12 +#452 @ 148,975: 10x13 +#453 @ 44,59: 18x28 +#454 @ 82,753: 24x25 +#455 @ 298,860: 28x20 +#456 @ 145,106: 28x16 +#457 @ 160,511: 17x25 +#458 @ 579,673: 10x18 +#459 @ 412,728: 27x17 +#460 @ 440,340: 24x21 +#461 @ 548,214: 10x15 +#462 @ 27,754: 24x18 +#463 @ 135,86: 18x20 +#464 @ 840,729: 26x27 +#465 @ 9,613: 11x15 +#466 @ 862,380: 24x29 +#467 @ 142,927: 27x11 +#468 @ 570,414: 16x26 +#469 @ 946,509: 17x28 +#470 @ 81,426: 13x27 +#471 @ 786,434: 18x11 +#472 @ 899,350: 27x12 +#473 @ 105,502: 20x27 +#474 @ 238,758: 26x14 +#475 @ 420,601: 26x26 +#476 @ 646,810: 22x29 +#477 @ 343,259: 14x13 +#478 @ 676,974: 24x18 +#479 @ 951,259: 25x26 +#480 @ 219,781: 21x27 +#481 @ 601,64: 19x25 +#482 @ 647,903: 18x23 +#483 @ 832,908: 24x14 +#484 @ 177,320: 21x16 +#485 @ 312,929: 12x24 +#486 @ 83,437: 5x7 +#487 @ 540,333: 22x27 +#488 @ 936,895: 14x11 +#489 @ 936,698: 29x13 +#490 @ 217,809: 21x13 +#491 @ 188,895: 27x24 +#492 @ 635,204: 12x24 +#493 @ 484,820: 21x23 +#494 @ 133,583: 25x18 +#495 @ 129,426: 19x26 +#496 @ 316,937: 18x18 +#497 @ 303,440: 29x11 +#498 @ 967,662: 18x29 +#499 @ 970,51: 21x15 +#500 @ 90,833: 9x15 +#501 @ 440,430: 19x20 +#502 @ 657,117: 10x18 +#503 @ 606,372: 10x5 +#504 @ 57,870: 11x27 +#505 @ 940,663: 29x12 +#506 @ 360,582: 22x19 +#507 @ 810,88: 11x20 +#508 @ 626,668: 25x24 +#509 @ 392,266: 12x16 +#510 @ 919,290: 19x23 +#511 @ 922,221: 18x19 +#512 @ 804,532: 25x25 +#513 @ 558,467: 28x16 +#514 @ 438,970: 10x13 +#515 @ 162,322: 12x19 +#516 @ 101,267: 27x27 +#517 @ 752,347: 29x13 +#518 @ 693,751: 22x15 +#519 @ 753,101: 13x13 +#520 @ 559,948: 23x28 +#521 @ 36,581: 22x11 +#522 @ 457,637: 29x22 +#523 @ 421,419: 28x23 +#524 @ 289,810: 10x21 +#525 @ 31,600: 27x18 +#526 @ 48,298: 21x23 +#527 @ 428,194: 23x22 +#528 @ 745,77: 21x16 +#529 @ 764,493: 18x12 +#530 @ 523,124: 19x21 +#531 @ 762,936: 12x18 +#532 @ 925,74: 14x11 +#533 @ 684,936: 17x19 +#534 @ 230,175: 11x15 +#535 @ 331,442: 12x22 +#536 @ 929,945: 22x21 +#537 @ 274,966: 13x29 +#538 @ 96,418: 28x19 +#539 @ 445,961: 26x14 +#540 @ 451,198: 24x22 +#541 @ 607,359: 12x21 +#542 @ 467,484: 26x10 +#543 @ 229,392: 15x16 +#544 @ 472,371: 13x27 +#545 @ 733,813: 13x19 +#546 @ 58,594: 23x24 +#547 @ 954,588: 17x25 +#548 @ 283,301: 18x20 +#549 @ 29,203: 27x23 +#550 @ 440,68: 17x15 +#551 @ 14,738: 29x18 +#552 @ 379,694: 12x16 +#553 @ 666,126: 19x15 +#554 @ 858,560: 22x19 +#555 @ 939,87: 14x25 +#556 @ 429,707: 24x29 +#557 @ 675,908: 15x11 +#558 @ 790,821: 19x26 +#559 @ 370,469: 29x24 +#560 @ 109,122: 27x29 +#561 @ 526,358: 19x19 +#562 @ 297,282: 12x27 +#563 @ 530,927: 25x10 +#564 @ 3,189: 26x15 +#565 @ 657,755: 29x25 +#566 @ 580,419: 23x14 +#567 @ 392,633: 25x13 +#568 @ 408,481: 23x20 +#569 @ 243,965: 25x25 +#570 @ 477,69: 29x29 +#571 @ 814,923: 27x19 +#572 @ 896,68: 16x18 +#573 @ 968,582: 10x16 +#574 @ 787,767: 25x16 +#575 @ 569,668: 25x18 +#576 @ 134,847: 24x14 +#577 @ 210,447: 11x22 +#578 @ 427,266: 20x13 +#579 @ 210,305: 27x19 +#580 @ 811,694: 28x17 +#581 @ 6,32: 27x20 +#582 @ 44,241: 15x29 +#583 @ 32,749: 25x20 +#584 @ 468,277: 25x26 +#585 @ 569,952: 26x10 +#586 @ 954,736: 14x11 +#587 @ 797,233: 19x13 +#588 @ 300,577: 19x12 +#589 @ 228,110: 21x17 +#590 @ 480,763: 15x10 +#591 @ 345,838: 14x10 +#592 @ 329,253: 27x13 +#593 @ 271,287: 13x18 +#594 @ 874,131: 28x13 +#595 @ 520,243: 21x27 +#596 @ 940,226: 11x29 +#597 @ 1,931: 11x14 +#598 @ 874,562: 13x29 +#599 @ 325,175: 28x16 +#600 @ 728,891: 15x13 +#601 @ 785,625: 25x28 +#602 @ 125,920: 20x28 +#603 @ 276,116: 16x28 +#604 @ 655,965: 29x23 +#605 @ 233,230: 23x16 +#606 @ 874,850: 15x17 +#607 @ 621,454: 12x18 +#608 @ 738,10: 27x23 +#609 @ 908,493: 21x7 +#610 @ 271,410: 26x11 +#611 @ 734,135: 19x13 +#612 @ 591,883: 15x10 +#613 @ 151,722: 22x11 +#614 @ 485,829: 28x25 +#615 @ 662,482: 24x16 +#616 @ 392,613: 19x11 +#617 @ 45,137: 20x24 +#618 @ 949,145: 18x25 +#619 @ 674,134: 11x11 +#620 @ 157,120: 10x18 +#621 @ 491,935: 16x11 +#622 @ 39,881: 22x25 +#623 @ 632,183: 12x22 +#624 @ 398,293: 13x18 +#625 @ 434,69: 27x14 +#626 @ 70,633: 15x16 +#627 @ 667,639: 18x23 +#628 @ 552,695: 15x24 +#629 @ 385,153: 19x26 +#630 @ 750,85: 19x12 +#631 @ 968,877: 18x16 +#632 @ 759,948: 15x17 +#633 @ 901,324: 23x13 +#634 @ 753,709: 23x26 +#635 @ 788,663: 10x11 +#636 @ 270,158: 21x11 +#637 @ 908,72: 19x11 +#638 @ 204,216: 13x24 +#639 @ 241,461: 21x28 +#640 @ 791,76: 17x24 +#641 @ 199,727: 10x20 +#642 @ 553,139: 25x24 +#643 @ 53,666: 15x19 +#644 @ 55,326: 26x11 +#645 @ 286,583: 19x16 +#646 @ 897,320: 22x13 +#647 @ 116,494: 26x14 +#648 @ 342,32: 27x17 +#649 @ 545,307: 18x21 +#650 @ 933,188: 12x23 +#651 @ 592,473: 14x11 +#652 @ 948,426: 13x23 +#653 @ 468,296: 25x14 +#654 @ 716,276: 14x29 +#655 @ 326,645: 18x22 +#656 @ 263,621: 13x17 +#657 @ 970,57: 19x11 +#658 @ 751,564: 17x23 +#659 @ 411,204: 20x19 +#660 @ 831,366: 27x27 +#661 @ 70,367: 21x12 +#662 @ 636,824: 28x20 +#663 @ 848,568: 18x18 +#664 @ 508,846: 17x23 +#665 @ 762,142: 20x26 +#666 @ 846,104: 17x25 +#667 @ 37,3: 13x15 +#668 @ 505,826: 23x14 +#669 @ 617,653: 13x18 +#670 @ 829,657: 26x14 +#671 @ 666,65: 16x29 +#672 @ 580,841: 25x27 +#673 @ 221,441: 12x24 +#674 @ 231,390: 28x20 +#675 @ 497,846: 17x18 +#676 @ 449,581: 19x12 +#677 @ 525,632: 22x27 +#678 @ 875,485: 12x15 +#679 @ 840,789: 23x15 +#680 @ 651,302: 10x24 +#681 @ 410,801: 26x29 +#682 @ 918,67: 28x28 +#683 @ 738,587: 17x16 +#684 @ 237,523: 26x27 +#685 @ 360,835: 24x18 +#686 @ 36,238: 14x10 +#687 @ 135,101: 26x29 +#688 @ 711,296: 14x18 +#689 @ 222,699: 24x25 +#690 @ 905,331: 18x29 +#691 @ 801,78: 17x21 +#692 @ 943,680: 24x12 +#693 @ 103,456: 13x25 +#694 @ 678,587: 14x17 +#695 @ 559,705: 27x28 +#696 @ 294,817: 20x11 +#697 @ 532,783: 21x24 +#698 @ 209,827: 13x18 +#699 @ 64,40: 29x14 +#700 @ 443,959: 10x13 +#701 @ 589,886: 22x14 +#702 @ 635,815: 25x25 +#703 @ 673,911: 13x23 +#704 @ 491,959: 14x24 +#705 @ 459,317: 23x10 +#706 @ 491,822: 22x27 +#707 @ 534,670: 21x22 +#708 @ 401,367: 12x27 +#709 @ 342,37: 14x24 +#710 @ 692,724: 28x13 +#711 @ 365,291: 13x23 +#712 @ 111,674: 21x13 +#713 @ 373,573: 25x12 +#714 @ 545,965: 12x16 +#715 @ 454,6: 29x16 +#716 @ 263,426: 17x12 +#717 @ 631,862: 23x19 +#718 @ 927,673: 14x28 +#719 @ 770,688: 23x25 +#720 @ 70,269: 14x25 +#721 @ 271,512: 14x25 +#722 @ 433,749: 25x29 +#723 @ 918,404: 13x27 +#724 @ 529,762: 23x26 +#725 @ 684,593: 18x25 +#726 @ 314,627: 11x21 +#727 @ 853,81: 10x16 +#728 @ 261,513: 29x19 +#729 @ 892,705: 16x6 +#730 @ 654,796: 27x15 +#731 @ 935,598: 23x18 +#732 @ 365,515: 17x29 +#733 @ 761,574: 27x20 +#734 @ 868,969: 28x20 +#735 @ 594,341: 17x22 +#736 @ 803,754: 17x10 +#737 @ 967,484: 27x16 +#738 @ 84,631: 13x12 +#739 @ 195,141: 28x13 +#740 @ 227,736: 24x17 +#741 @ 235,494: 12x10 +#742 @ 563,852: 12x18 +#743 @ 700,314: 4x21 +#744 @ 129,207: 25x22 +#745 @ 301,905: 24x27 +#746 @ 572,116: 14x10 +#747 @ 575,935: 22x26 +#748 @ 443,21: 23x27 +#749 @ 105,271: 15x19 +#750 @ 827,885: 23x11 +#751 @ 439,585: 16x20 +#752 @ 822,399: 12x28 +#753 @ 638,817: 28x18 +#754 @ 725,170: 17x12 +#755 @ 775,445: 11x16 +#756 @ 1,11: 13x26 +#757 @ 967,399: 15x11 +#758 @ 374,194: 25x13 +#759 @ 521,733: 20x25 +#760 @ 356,810: 12x24 +#761 @ 570,935: 16x22 +#762 @ 730,830: 17x12 +#763 @ 310,885: 21x23 +#764 @ 811,690: 27x20 +#765 @ 930,403: 26x23 +#766 @ 400,495: 16x19 +#767 @ 911,677: 21x12 +#768 @ 703,16: 25x15 +#769 @ 70,245: 16x20 +#770 @ 118,518: 13x13 +#771 @ 686,455: 12x18 +#772 @ 600,648: 21x20 +#773 @ 77,404: 26x19 +#774 @ 16,179: 14x19 +#775 @ 308,950: 25x14 +#776 @ 610,322: 15x20 +#777 @ 939,204: 17x29 +#778 @ 271,882: 14x29 +#779 @ 539,700: 14x10 +#780 @ 858,601: 10x20 +#781 @ 395,816: 18x27 +#782 @ 350,234: 11x17 +#783 @ 945,520: 11x25 +#784 @ 18,516: 13x21 +#785 @ 305,194: 14x11 +#786 @ 72,324: 19x10 +#787 @ 367,309: 18x26 +#788 @ 35,145: 20x13 +#789 @ 711,821: 28x26 +#790 @ 823,40: 24x24 +#791 @ 215,121: 19x10 +#792 @ 513,885: 28x15 +#793 @ 765,87: 14x21 +#794 @ 95,179: 23x12 +#795 @ 496,813: 19x16 +#796 @ 860,850: 26x18 +#797 @ 204,706: 16x28 +#798 @ 429,621: 14x21 +#799 @ 310,320: 24x22 +#800 @ 630,110: 21x19 +#801 @ 714,50: 21x26 +#802 @ 462,553: 13x27 +#803 @ 452,10: 13x18 +#804 @ 869,575: 15x11 +#805 @ 519,544: 22x11 +#806 @ 758,906: 16x10 +#807 @ 147,49: 17x11 +#808 @ 19,546: 13x26 +#809 @ 141,433: 15x14 +#810 @ 688,390: 13x24 +#811 @ 929,611: 21x20 +#812 @ 724,15: 13x16 +#813 @ 275,501: 27x17 +#814 @ 417,260: 24x10 +#815 @ 833,888: 24x17 +#816 @ 481,309: 25x26 +#817 @ 6,942: 29x24 +#818 @ 636,811: 24x21 +#819 @ 199,939: 5x19 +#820 @ 69,358: 18x21 +#821 @ 221,805: 14x17 +#822 @ 255,568: 24x26 +#823 @ 486,554: 19x25 +#824 @ 490,860: 29x14 +#825 @ 679,976: 23x13 +#826 @ 297,20: 29x24 +#827 @ 496,797: 18x27 +#828 @ 152,118: 20x26 +#829 @ 646,277: 23x27 +#830 @ 565,291: 18x26 +#831 @ 434,932: 11x27 +#832 @ 117,22: 20x14 +#833 @ 639,800: 18x22 +#834 @ 760,683: 16x28 +#835 @ 250,941: 18x16 +#836 @ 176,714: 12x21 +#837 @ 958,314: 17x16 +#838 @ 913,30: 21x21 +#839 @ 878,493: 26x10 +#840 @ 545,745: 22x20 +#841 @ 302,630: 26x18 +#842 @ 364,177: 18x26 +#843 @ 279,682: 11x21 +#844 @ 348,370: 18x27 +#845 @ 551,961: 14x14 +#846 @ 691,919: 12x17 +#847 @ 966,955: 26x14 +#848 @ 728,392: 23x14 +#849 @ 298,930: 19x11 +#850 @ 242,944: 15x20 +#851 @ 535,668: 17x23 +#852 @ 554,105: 19x17 +#853 @ 529,559: 13x10 +#854 @ 314,742: 28x17 +#855 @ 635,321: 29x24 +#856 @ 537,842: 27x29 +#857 @ 315,282: 11x13 +#858 @ 15,3: 24x25 +#859 @ 955,424: 17x14 +#860 @ 630,470: 17x27 +#861 @ 507,934: 25x11 +#862 @ 422,359: 20x12 +#863 @ 781,484: 15x19 +#864 @ 769,77: 10x29 +#865 @ 388,277: 14x22 +#866 @ 682,764: 18x13 +#867 @ 170,869: 14x16 +#868 @ 796,842: 26x25 +#869 @ 498,232: 16x24 +#870 @ 640,772: 18x27 +#871 @ 141,89: 10x10 +#872 @ 294,158: 21x14 +#873 @ 698,312: 10x27 +#874 @ 892,408: 21x29 +#875 @ 843,805: 12x29 +#876 @ 52,496: 21x11 +#877 @ 689,776: 17x11 +#878 @ 256,762: 10x29 +#879 @ 744,584: 17x19 +#880 @ 510,369: 17x10 +#881 @ 943,242: 29x11 +#882 @ 688,217: 21x24 +#883 @ 528,648: 12x29 +#884 @ 217,258: 10x28 +#885 @ 811,447: 15x19 +#886 @ 844,797: 12x18 +#887 @ 913,207: 15x17 +#888 @ 824,534: 21x16 +#889 @ 77,768: 16x24 +#890 @ 139,473: 22x13 +#891 @ 355,51: 24x28 +#892 @ 201,544: 13x20 +#893 @ 449,15: 12x20 +#894 @ 831,218: 20x25 +#895 @ 798,126: 25x19 +#896 @ 772,475: 11x25 +#897 @ 641,785: 26x16 +#898 @ 276,393: 13x18 +#899 @ 487,319: 19x28 +#900 @ 675,952: 29x21 +#901 @ 468,753: 28x18 +#902 @ 535,376: 16x9 +#903 @ 39,898: 17x23 +#904 @ 99,629: 22x16 +#905 @ 806,446: 21x12 +#906 @ 597,333: 10x14 +#907 @ 916,680: 10x19 +#908 @ 297,502: 13x19 +#909 @ 414,728: 25x26 +#910 @ 607,642: 22x25 +#911 @ 724,9: 23x22 +#912 @ 637,266: 26x21 +#913 @ 880,429: 27x11 +#914 @ 707,289: 18x29 +#915 @ 402,625: 12x23 +#916 @ 297,40: 10x13 +#917 @ 470,220: 16x10 +#918 @ 89,628: 17x21 +#919 @ 785,748: 21x21 +#920 @ 981,482: 12x26 +#921 @ 789,645: 23x18 +#922 @ 898,691: 29x18 +#923 @ 630,922: 20x13 +#924 @ 19,444: 25x13 +#925 @ 377,695: 23x13 +#926 @ 119,12: 13x19 +#927 @ 941,593: 12x25 +#928 @ 280,511: 11x29 +#929 @ 454,116: 14x29 +#930 @ 681,915: 19x10 +#931 @ 202,565: 28x27 +#932 @ 306,934: 21x28 +#933 @ 837,120: 17x17 +#934 @ 761,514: 12x27 +#935 @ 656,112: 28x21 +#936 @ 470,486: 29x25 +#937 @ 572,635: 11x15 +#938 @ 139,108: 12x16 +#939 @ 352,517: 25x20 +#940 @ 696,339: 28x23 +#941 @ 914,85: 18x23 +#942 @ 161,522: 16x29 +#943 @ 869,823: 20x18 +#944 @ 451,333: 21x20 +#945 @ 921,699: 27x14 +#946 @ 637,312: 17x14 +#947 @ 632,177: 12x16 +#948 @ 34,606: 19x23 +#949 @ 316,345: 28x15 +#950 @ 101,841: 13x21 +#951 @ 506,655: 28x12 +#952 @ 375,282: 20x18 +#953 @ 397,612: 28x24 +#954 @ 680,894: 22x21 +#955 @ 18,701: 24x17 +#956 @ 120,10: 10x13 +#957 @ 30,805: 17x24 +#958 @ 309,659: 27x24 +#959 @ 153,716: 13x11 +#960 @ 54,180: 23x12 +#961 @ 530,955: 17x10 +#962 @ 959,734: 17x12 +#963 @ 168,400: 25x16 +#964 @ 186,558: 16x25 +#965 @ 454,85: 11x10 +#966 @ 597,643: 23x11 +#967 @ 439,427: 13x22 +#968 @ 813,243: 22x13 +#969 @ 135,900: 21x22 +#970 @ 846,745: 13x19 +#971 @ 871,385: 24x25 +#972 @ 521,642: 8x15 +#973 @ 604,353: 24x28 +#974 @ 234,756: 25x29 +#975 @ 435,952: 10x19 +#976 @ 459,207: 10x19 +#977 @ 977,487: 22x15 +#978 @ 463,571: 24x10 +#979 @ 216,228: 12x12 +#980 @ 198,115: 19x15 +#981 @ 155,469: 25x20 +#982 @ 419,605: 11x16 +#983 @ 197,936: 14x28 +#984 @ 518,561: 13x21 +#985 @ 556,951: 28x25 +#986 @ 316,446: 24x25 +#987 @ 271,194: 23x25 +#988 @ 844,694: 20x29 +#989 @ 977,651: 20x17 +#990 @ 232,777: 28x15 +#991 @ 722,42: 11x27 +#992 @ 903,340: 10x29 +#993 @ 857,557: 10x23 +#994 @ 858,575: 14x21 +#995 @ 97,496: 8x5 +#996 @ 508,98: 17x26 +#997 @ 71,401: 28x27 +#998 @ 941,717: 21x20 +#999 @ 486,748: 29x28 +#1000 @ 367,319: 22x13 +#1001 @ 63,671: 9x8 +#1002 @ 636,786: 29x17 +#1003 @ 602,645: 14x4 +#1004 @ 359,826: 16x23 +#1005 @ 799,73: 12x12 +#1006 @ 532,367: 23x28 +#1007 @ 656,823: 17x10 +#1008 @ 113,477: 21x24 +#1009 @ 273,812: 17x17 +#1010 @ 544,941: 15x23 +#1011 @ 226,181: 13x10 +#1012 @ 42,750: 10x22 +#1013 @ 940,489: 26x22 +#1014 @ 920,348: 12x16 +#1015 @ 400,818: 12x14 +#1016 @ 427,390: 24x29 +#1017 @ 26,238: 29x12 +#1018 @ 731,132: 16x12 +#1019 @ 687,971: 26x21 +#1020 @ 555,864: 14x24 +#1021 @ 759,345: 24x13 +#1022 @ 27,329: 18x23 +#1023 @ 683,948: 26x27 +#1024 @ 638,29: 28x23 +#1025 @ 574,64: 12x14 +#1026 @ 196,148: 16x11 +#1027 @ 107,497: 21x29 +#1028 @ 425,211: 19x28 +#1029 @ 437,593: 22x27 +#1030 @ 144,516: 28x28 +#1031 @ 28,601: 11x25 +#1032 @ 958,725: 18x29 +#1033 @ 777,648: 27x22 +#1034 @ 299,576: 16x10 +#1035 @ 6,916: 16x22 +#1036 @ 114,894: 16x19 +#1037 @ 265,683: 23x26 +#1038 @ 271,420: 10x20 +#1039 @ 204,106: 29x11 +#1040 @ 809,242: 23x10 +#1041 @ 158,848: 24x14 +#1042 @ 55,202: 29x13 +#1043 @ 405,220: 24x22 +#1044 @ 844,900: 15x16 +#1045 @ 558,269: 18x29 +#1046 @ 944,123: 18x26 +#1047 @ 561,754: 14x24 +#1048 @ 648,427: 16x11 +#1049 @ 957,204: 28x17 +#1050 @ 246,285: 21x26 +#1051 @ 463,398: 28x27 +#1052 @ 925,306: 22x13 +#1053 @ 286,630: 24x21 +#1054 @ 687,860: 10x18 +#1055 @ 178,479: 10x20 +#1056 @ 273,150: 19x20 +#1057 @ 26,686: 16x24 +#1058 @ 245,71: 28x29 +#1059 @ 140,794: 21x18 +#1060 @ 733,490: 27x20 +#1061 @ 661,574: 16x17 +#1062 @ 487,330: 27x13 +#1063 @ 787,621: 14x29 +#1064 @ 175,871: 5x11 +#1065 @ 286,512: 10x18 +#1066 @ 497,258: 16x28 +#1067 @ 56,296: 25x16 +#1068 @ 790,964: 22x27 +#1069 @ 345,360: 16x21 +#1070 @ 487,262: 17x19 +#1071 @ 813,130: 26x22 +#1072 @ 492,922: 11x16 +#1073 @ 275,150: 12x10 +#1074 @ 907,307: 17x28 +#1075 @ 417,822: 14x15 +#1076 @ 737,423: 20x21 +#1077 @ 183,610: 29x22 +#1078 @ 172,334: 28x10 +#1079 @ 231,265: 15x18 +#1080 @ 584,971: 10x25 +#1081 @ 863,802: 10x8 +#1082 @ 551,563: 20x21 +#1083 @ 612,208: 24x11 +#1084 @ 857,384: 12x15 +#1085 @ 698,767: 28x23 +#1086 @ 54,183: 12x26 +#1087 @ 391,555: 15x28 +#1088 @ 428,382: 21x13 +#1089 @ 908,69: 16x12 +#1090 @ 785,632: 16x22 +#1091 @ 51,654: 11x21 +#1092 @ 459,457: 18x17 +#1093 @ 352,369: 15x15 +#1094 @ 564,724: 13x25 +#1095 @ 420,706: 23x14 +#1096 @ 371,953: 18x15 +#1097 @ 131,8: 13x19 +#1098 @ 515,825: 25x22 +#1099 @ 660,828: 21x20 +#1100 @ 567,664: 29x11 +#1101 @ 75,479: 24x18 +#1102 @ 901,708: 27x12 +#1103 @ 170,468: 15x19 +#1104 @ 562,722: 16x14 +#1105 @ 746,554: 18x29 +#1106 @ 523,228: 27x22 +#1107 @ 505,930: 26x20 +#1108 @ 164,531: 14x23 +#1109 @ 451,71: 25x17 +#1110 @ 559,480: 18x27 +#1111 @ 567,320: 13x22 +#1112 @ 701,36: 16x16 +#1113 @ 357,114: 24x27 +#1114 @ 927,88: 25x10 +#1115 @ 622,744: 17x16 +#1116 @ 160,379: 22x19 +#1117 @ 320,188: 25x16 +#1118 @ 88,341: 12x13 +#1119 @ 590,321: 21x26 +#1120 @ 957,505: 24x23 +#1121 @ 901,677: 16x17 +#1122 @ 85,829: 18x26 +#1123 @ 651,580: 16x14 +#1124 @ 168,538: 19x28 +#1125 @ 930,250: 29x11 +#1126 @ 355,367: 21x21 +#1127 @ 861,800: 17x14 +#1128 @ 622,306: 16x16 +#1129 @ 543,951: 11x13 +#1130 @ 122,950: 16x11 +#1131 @ 264,695: 17x11 +#1132 @ 132,0: 26x17 +#1133 @ 971,300: 28x19 +#1134 @ 742,98: 20x23 +#1135 @ 807,370: 13x21 +#1136 @ 154,954: 18x28 +#1137 @ 803,285: 26x25 +#1138 @ 422,393: 14x15 +#1139 @ 513,572: 11x20 +#1140 @ 530,301: 16x24 +#1141 @ 633,177: 26x15 +#1142 @ 389,624: 15x26 +#1143 @ 911,83: 14x17 +#1144 @ 629,408: 23x21 +#1145 @ 769,692: 11x17 +#1146 @ 80,113: 23x29 +#1147 @ 811,912: 26x22 +#1148 @ 891,246: 10x10 +#1149 @ 731,877: 13x14 +#1150 @ 210,784: 10x29 +#1151 @ 233,647: 25x24 +#1152 @ 771,463: 15x20 +#1153 @ 450,117: 27x16 +#1154 @ 932,704: 18x16 +#1155 @ 792,915: 10x17 +#1156 @ 542,686: 24x27 +#1157 @ 335,704: 21x22 +#1158 @ 203,399: 14x21 +#1159 @ 911,460: 18x12 +#1160 @ 963,475: 25x26 +#1161 @ 291,514: 23x13 +#1162 @ 30,811: 23x13 +#1163 @ 947,274: 18x21 +#1164 @ 222,471: 22x24 +#1165 @ 443,588: 25x10 +#1166 @ 666,874: 28x21 +#1167 @ 518,828: 27x16 +#1168 @ 108,443: 11x21 +#1169 @ 446,539: 27x29 +#1170 @ 514,224: 25x22 +#1171 @ 258,91: 11x11 +#1172 @ 326,28: 24x12 +#1173 @ 253,550: 24x26 +#1174 @ 580,824: 17x25 +#1175 @ 766,705: 10x14 +#1176 @ 976,892: 19x17 +#1177 @ 806,955: 14x16 +#1178 @ 561,770: 15x27 +#1179 @ 819,136: 10x14 +#1180 @ 431,616: 20x27 +#1181 @ 676,979: 16x21 +#1182 @ 648,742: 16x14 +#1183 @ 650,106: 27x22 +#1184 @ 515,539: 18x13 +#1185 @ 22,952: 14x22 +#1186 @ 185,332: 23x22 +#1187 @ 155,769: 14x21 +#1188 @ 908,75: 26x10 +#1189 @ 849,229: 18x16 +#1190 @ 795,814: 26x19 +#1191 @ 346,233: 25x17 +#1192 @ 696,77: 22x10 +#1193 @ 213,437: 18x23 +#1194 @ 403,724: 17x23 +#1195 @ 35,503: 23x25 +#1196 @ 131,593: 11x15 +#1197 @ 41,894: 21x27 +#1198 @ 380,87: 29x13 +#1199 @ 786,759: 12x20 +#1200 @ 801,43: 27x26 +#1201 @ 465,412: 21x14 +#1202 @ 548,691: 26x22 +#1203 @ 812,235: 11x14 +#1204 @ 762,17: 26x14 +#1205 @ 897,241: 20x20 +#1206 @ 319,291: 11x29 +#1207 @ 88,800: 29x27 +#1208 @ 385,915: 17x26 +#1209 @ 113,10: 24x21 +#1210 @ 227,220: 24x26 +#1211 @ 728,821: 19x19 +#1212 @ 392,571: 17x16 +#1213 @ 157,983: 8x3 +#1214 @ 572,429: 16x29 +#1215 @ 393,348: 11x20 +#1216 @ 373,884: 14x11 +#1217 @ 905,711: 27x25 +#1218 @ 310,872: 12x12 +#1219 @ 194,322: 11x26 +#1220 @ 802,261: 13x18 +#1221 @ 543,284: 18x21 +#1222 @ 689,408: 24x20 +#1223 @ 544,148: 13x29 +#1224 @ 673,69: 21x13 +#1225 @ 810,368: 22x25 +#1226 @ 304,626: 23x15 +#1227 @ 793,73: 21x15 +#1228 @ 635,931: 22x28 +#1229 @ 303,193: 20x19 +#1230 @ 65,20: 27x26 +#1231 @ 497,253: 16x19 +#1232 @ 441,245: 6x13 +#1233 @ 482,973: 16x21 +#1234 @ 341,664: 17x27 +#1235 @ 299,193: 23x14 +#1236 @ 392,906: 16x28 +#1237 @ 711,715: 24x14 +#1238 @ 624,279: 18x16 +#1239 @ 855,298: 16x23 +#1240 @ 616,211: 13x13 +#1241 @ 268,675: 25x12 +#1242 @ 287,925: 16x15 +#1243 @ 184,561: 28x11 +#1244 @ 855,829: 27x15 +#1245 @ 446,241: 10x25 +#1246 @ 526,758: 18x10 +#1247 @ 776,260: 28x23 +#1248 @ 946,208: 26x12 +#1249 @ 762,707: 11x26 +#1250 @ 177,715: 16x26 +#1251 @ 737,72: 11x11 +#1252 @ 638,166: 12x13 +#1253 @ 347,956: 29x19 +#1254 @ 597,457: 26x23 +#1255 @ 194,552: 12x25 +#1256 @ 572,968: 16x23 +#1257 @ 347,60: 10x16 +#1258 @ 128,666: 17x16 +#1259 @ 334,232: 15x3 +#1260 @ 465,315: 15x23 +#1261 @ 738,533: 12x22 +#1262 @ 25,208: 27x27 +#1263 @ 431,71: 13x27 +#1264 @ 168,784: 23x17 +#1265 @ 848,386: 21x13 +#1266 @ 740,331: 15x24 +#1267 @ 513,743: 20x18 +#1268 @ 698,60: 10x20 +#1269 @ 56,816: 23x16 +#1270 @ 379,162: 18x22 +#1271 @ 194,694: 24x11 +#1272 @ 383,827: 20x11 +#1273 @ 435,600: 20x29 +#1274 @ 736,928: 27x18 +#1275 @ 583,832: 23x11 +#1276 @ 775,114: 19x15 +#1277 @ 549,348: 20x26 +#1278 @ 511,967: 29x25 +#1279 @ 39,885: 19x17 +#1280 @ 437,4: 15x23 +#1281 @ 752,17: 29x18 +#1282 @ 570,125: 19x10 +#1283 @ 898,955: 19x19 +#1284 @ 758,432: 17x22 +#1285 @ 797,588: 17x28 +#1286 @ 125,894: 14x23 +#1287 @ 56,630: 25x17 +#1288 @ 851,111: 11x14 +#1289 @ 642,806: 11x11 +#1290 @ 80,813: 12x19 +#1291 @ 633,952: 10x28 +#1292 @ 230,425: 12x17 +#1293 @ 867,811: 22x26 +#1294 @ 80,346: 20x25 +#1295 @ 713,338: 16x26 +#1296 @ 377,946: 26x28 +#1297 @ 274,335: 19x14 +#1298 @ 798,698: 22x18 +#1299 @ 149,195: 12x26 +#1300 @ 339,57: 22x20 +#1301 @ 652,225: 11x14 +#1302 @ 936,759: 17x29 +#1303 @ 162,489: 18x26 +#1304 @ 551,78: 11x17 +#1305 @ 606,914: 27x16 +#1306 @ 83,815: 5x13 +#1307 @ 139,844: 28x10 +#1308 @ 515,187: 29x10 +#1309 @ 320,358: 14x15 +#1310 @ 336,21: 19x16 +#1311 @ 420,598: 20x26 \ No newline at end of file diff --git a/AoC2018.Runner/Input/day04.txt b/AoC2018.Runner/Input/day04.txt new file mode 100644 index 0000000..1c482a2 --- /dev/null +++ b/AoC2018.Runner/Input/day04.txt @@ -0,0 +1,1057 @@ +[1518-07-03 23:58] Guard #2437 begins shift +[1518-09-23 00:54] falls asleep +[1518-05-08 00:02] Guard #659 begins shift +[1518-06-09 00:52] falls asleep +[1518-07-27 00:59] wakes up +[1518-03-04 00:14] falls asleep +[1518-10-28 00:45] falls asleep +[1518-11-14 00:02] Guard #3011 begins shift +[1518-05-15 23:58] Guard #1447 begins shift +[1518-07-29 00:07] falls asleep +[1518-05-20 00:14] falls asleep +[1518-10-18 00:50] wakes up +[1518-09-24 00:02] Guard #1901 begins shift +[1518-10-31 00:20] falls asleep +[1518-08-23 23:49] Guard #3307 begins shift +[1518-09-19 23:52] Guard #2083 begins shift +[1518-02-25 00:51] wakes up +[1518-02-28 00:34] wakes up +[1518-04-29 00:54] wakes up +[1518-07-10 23:59] Guard #1901 begins shift +[1518-10-01 00:52] wakes up +[1518-08-01 00:49] falls asleep +[1518-03-14 00:12] falls asleep +[1518-09-03 00:15] falls asleep +[1518-07-19 00:06] falls asleep +[1518-07-22 00:03] Guard #1307 begins shift +[1518-03-22 00:15] wakes up +[1518-07-08 00:02] falls asleep +[1518-07-06 00:42] wakes up +[1518-03-26 00:58] wakes up +[1518-05-06 00:21] wakes up +[1518-06-07 00:55] wakes up +[1518-10-14 00:37] wakes up +[1518-10-18 00:00] Guard #1009 begins shift +[1518-08-05 00:01] Guard #3307 begins shift +[1518-10-27 00:58] wakes up +[1518-05-27 00:42] falls asleep +[1518-10-05 00:51] wakes up +[1518-06-04 00:39] falls asleep +[1518-06-13 00:21] falls asleep +[1518-09-03 00:01] Guard #991 begins shift +[1518-05-20 00:55] wakes up +[1518-04-19 00:58] wakes up +[1518-10-24 00:02] Guard #991 begins shift +[1518-10-31 00:00] Guard #2269 begins shift +[1518-05-02 00:00] Guard #2437 begins shift +[1518-08-15 00:59] wakes up +[1518-09-12 00:33] wakes up +[1518-08-08 23:56] Guard #3323 begins shift +[1518-11-04 00:16] falls asleep +[1518-07-14 00:57] wakes up +[1518-06-11 00:19] falls asleep +[1518-04-06 23:58] Guard #1307 begins shift +[1518-05-04 00:33] wakes up +[1518-06-30 00:19] falls asleep +[1518-09-14 00:00] Guard #3251 begins shift +[1518-05-13 00:37] wakes up +[1518-08-12 23:50] Guard #3307 begins shift +[1518-07-14 00:18] wakes up +[1518-05-26 00:20] falls asleep +[1518-07-17 00:48] wakes up +[1518-06-15 00:58] wakes up +[1518-07-22 00:29] wakes up +[1518-10-20 00:39] wakes up +[1518-07-12 00:27] falls asleep +[1518-03-17 00:14] falls asleep +[1518-04-28 00:33] falls asleep +[1518-06-12 00:55] falls asleep +[1518-03-08 00:39] falls asleep +[1518-09-05 00:28] wakes up +[1518-05-23 00:49] falls asleep +[1518-07-07 00:02] Guard #1447 begins shift +[1518-11-18 00:56] falls asleep +[1518-09-03 00:40] wakes up +[1518-11-10 00:54] falls asleep +[1518-02-23 00:00] Guard #3323 begins shift +[1518-07-01 00:46] wakes up +[1518-04-24 00:44] wakes up +[1518-09-27 00:14] falls asleep +[1518-09-26 00:04] Guard #2083 begins shift +[1518-05-08 00:31] falls asleep +[1518-05-03 00:19] falls asleep +[1518-07-15 00:01] Guard #991 begins shift +[1518-07-09 00:00] Guard #2437 begins shift +[1518-10-10 00:20] falls asleep +[1518-05-06 00:55] wakes up +[1518-06-13 00:54] falls asleep +[1518-11-06 00:26] falls asleep +[1518-07-16 00:51] wakes up +[1518-08-28 00:10] falls asleep +[1518-06-07 00:35] falls asleep +[1518-07-13 00:41] wakes up +[1518-11-01 00:38] falls asleep +[1518-07-15 00:14] falls asleep +[1518-08-18 00:44] falls asleep +[1518-09-21 23:57] Guard #991 begins shift +[1518-05-30 00:50] wakes up +[1518-09-30 00:47] wakes up +[1518-09-07 00:05] falls asleep +[1518-06-08 00:35] falls asleep +[1518-03-12 23:53] Guard #1901 begins shift +[1518-05-05 00:55] falls asleep +[1518-07-21 00:48] falls asleep +[1518-09-11 00:44] falls asleep +[1518-10-24 23:53] Guard #1307 begins shift +[1518-11-19 00:58] wakes up +[1518-04-03 00:57] wakes up +[1518-04-06 00:54] wakes up +[1518-10-09 23:57] Guard #1447 begins shift +[1518-09-19 00:54] wakes up +[1518-11-10 00:58] wakes up +[1518-08-26 00:42] wakes up +[1518-09-11 00:53] wakes up +[1518-03-18 23:56] Guard #2083 begins shift +[1518-08-01 00:57] wakes up +[1518-07-12 00:01] Guard #1447 begins shift +[1518-10-12 00:34] wakes up +[1518-05-23 00:59] wakes up +[1518-04-16 00:51] wakes up +[1518-03-11 00:04] Guard #1901 begins shift +[1518-08-17 00:40] falls asleep +[1518-10-21 00:17] falls asleep +[1518-07-09 00:15] falls asleep +[1518-08-01 00:01] falls asleep +[1518-03-01 00:45] wakes up +[1518-05-26 00:09] falls asleep +[1518-06-03 00:04] Guard #3307 begins shift +[1518-10-27 00:02] Guard #3307 begins shift +[1518-10-13 00:01] Guard #991 begins shift +[1518-05-04 00:26] falls asleep +[1518-09-10 00:55] wakes up +[1518-07-21 00:25] falls asleep +[1518-07-02 00:45] falls asleep +[1518-04-03 00:17] falls asleep +[1518-10-14 00:32] falls asleep +[1518-07-28 00:03] Guard #127 begins shift +[1518-11-11 00:39] wakes up +[1518-07-16 00:00] Guard #659 begins shift +[1518-06-17 00:01] Guard #2269 begins shift +[1518-05-17 23:53] Guard #3307 begins shift +[1518-07-31 23:49] Guard #1831 begins shift +[1518-03-30 23:59] Guard #467 begins shift +[1518-10-23 00:40] wakes up +[1518-06-25 00:35] wakes up +[1518-04-27 00:44] falls asleep +[1518-08-10 00:22] falls asleep +[1518-05-29 00:50] wakes up +[1518-10-09 00:11] falls asleep +[1518-02-23 23:59] Guard #1303 begins shift +[1518-06-12 00:58] wakes up +[1518-10-12 00:28] falls asleep +[1518-03-07 00:55] wakes up +[1518-10-19 00:50] wakes up +[1518-06-13 00:01] Guard #1307 begins shift +[1518-10-16 00:52] wakes up +[1518-04-26 00:23] falls asleep +[1518-08-08 00:04] falls asleep +[1518-09-14 00:42] falls asleep +[1518-10-12 00:13] falls asleep +[1518-09-20 00:20] wakes up +[1518-09-14 00:57] falls asleep +[1518-07-25 00:02] Guard #2437 begins shift +[1518-07-08 00:56] wakes up +[1518-09-02 00:04] Guard #3307 begins shift +[1518-09-18 00:06] falls asleep +[1518-10-22 00:01] Guard #3011 begins shift +[1518-04-25 00:42] falls asleep +[1518-09-02 00:57] falls asleep +[1518-02-21 23:56] Guard #2239 begins shift +[1518-05-10 00:29] falls asleep +[1518-04-04 23:56] Guard #127 begins shift +[1518-09-28 00:59] wakes up +[1518-10-17 00:12] falls asleep +[1518-04-24 00:01] Guard #1901 begins shift +[1518-09-08 00:16] falls asleep +[1518-11-03 00:47] wakes up +[1518-11-04 00:55] falls asleep +[1518-03-03 00:40] falls asleep +[1518-10-08 00:57] wakes up +[1518-09-14 00:32] falls asleep +[1518-06-25 00:58] wakes up +[1518-09-15 00:33] wakes up +[1518-06-24 00:04] falls asleep +[1518-03-15 00:36] falls asleep +[1518-06-24 23:52] Guard #1447 begins shift +[1518-06-11 00:36] falls asleep +[1518-10-21 00:58] wakes up +[1518-06-17 00:29] wakes up +[1518-08-21 23:59] Guard #467 begins shift +[1518-05-16 00:40] wakes up +[1518-10-07 00:24] falls asleep +[1518-11-04 00:00] Guard #2239 begins shift +[1518-08-30 00:03] Guard #127 begins shift +[1518-05-26 00:04] Guard #2239 begins shift +[1518-05-08 00:52] wakes up +[1518-07-31 00:04] Guard #991 begins shift +[1518-10-11 00:00] Guard #353 begins shift +[1518-09-29 00:38] falls asleep +[1518-04-05 00:48] wakes up +[1518-09-19 00:52] falls asleep +[1518-07-18 00:02] Guard #3323 begins shift +[1518-08-11 23:57] Guard #3011 begins shift +[1518-08-07 23:46] Guard #1307 begins shift +[1518-07-20 23:58] Guard #2083 begins shift +[1518-06-25 00:12] wakes up +[1518-06-12 00:17] falls asleep +[1518-07-23 23:56] Guard #467 begins shift +[1518-03-09 00:17] falls asleep +[1518-07-20 00:35] falls asleep +[1518-05-25 00:22] wakes up +[1518-09-27 00:52] falls asleep +[1518-09-21 00:54] falls asleep +[1518-09-10 00:42] falls asleep +[1518-05-02 00:19] falls asleep +[1518-10-09 00:43] wakes up +[1518-07-11 00:46] wakes up +[1518-06-16 00:51] wakes up +[1518-10-28 00:00] Guard #1303 begins shift +[1518-06-30 00:39] wakes up +[1518-10-14 00:48] wakes up +[1518-11-06 00:37] wakes up +[1518-03-17 00:00] Guard #1831 begins shift +[1518-04-04 00:26] falls asleep +[1518-06-08 00:18] wakes up +[1518-04-23 00:25] falls asleep +[1518-03-25 00:52] wakes up +[1518-09-19 00:01] Guard #659 begins shift +[1518-11-09 00:48] wakes up +[1518-09-17 23:59] Guard #1979 begins shift +[1518-06-01 23:50] Guard #2617 begins shift +[1518-07-22 00:46] falls asleep +[1518-08-06 23:58] Guard #1901 begins shift +[1518-11-23 00:56] wakes up +[1518-05-10 00:37] wakes up +[1518-04-29 00:35] falls asleep +[1518-11-13 00:02] Guard #1307 begins shift +[1518-07-29 00:01] Guard #3323 begins shift +[1518-10-30 00:02] Guard #3251 begins shift +[1518-10-25 00:34] wakes up +[1518-07-08 00:27] falls asleep +[1518-10-16 00:30] falls asleep +[1518-07-03 00:03] Guard #1307 begins shift +[1518-10-16 23:56] Guard #2437 begins shift +[1518-02-22 00:44] falls asleep +[1518-07-25 23:59] Guard #1901 begins shift +[1518-03-15 00:00] Guard #2617 begins shift +[1518-07-07 00:58] wakes up +[1518-02-24 00:59] wakes up +[1518-09-06 23:48] Guard #3251 begins shift +[1518-10-07 00:02] Guard #1979 begins shift +[1518-06-05 00:10] falls asleep +[1518-05-08 23:52] Guard #2269 begins shift +[1518-06-19 23:57] Guard #3307 begins shift +[1518-07-18 00:51] falls asleep +[1518-02-25 00:10] falls asleep +[1518-06-02 00:41] wakes up +[1518-08-27 00:44] wakes up +[1518-07-26 00:08] falls asleep +[1518-10-15 00:10] falls asleep +[1518-04-13 00:17] wakes up +[1518-09-29 23:59] Guard #2437 begins shift +[1518-11-05 00:37] falls asleep +[1518-09-04 00:03] falls asleep +[1518-09-26 23:59] Guard #523 begins shift +[1518-11-09 00:30] falls asleep +[1518-10-28 00:41] wakes up +[1518-03-14 00:53] falls asleep +[1518-05-29 00:08] falls asleep +[1518-04-16 00:32] falls asleep +[1518-11-21 00:16] falls asleep +[1518-11-15 00:01] falls asleep +[1518-08-23 00:52] falls asleep +[1518-03-04 23:59] Guard #2269 begins shift +[1518-05-16 00:19] falls asleep +[1518-07-31 00:53] wakes up +[1518-05-05 00:48] wakes up +[1518-09-27 00:46] wakes up +[1518-05-23 00:44] falls asleep +[1518-09-11 00:03] Guard #2617 begins shift +[1518-05-10 00:02] falls asleep +[1518-03-30 00:37] wakes up +[1518-04-24 00:58] wakes up +[1518-06-20 00:57] wakes up +[1518-11-02 00:34] wakes up +[1518-04-21 00:55] wakes up +[1518-08-30 00:34] falls asleep +[1518-10-09 00:20] wakes up +[1518-03-02 00:19] wakes up +[1518-08-18 00:29] falls asleep +[1518-11-16 00:42] falls asleep +[1518-06-16 00:00] Guard #523 begins shift +[1518-05-18 00:44] falls asleep +[1518-09-05 23:59] Guard #2083 begins shift +[1518-09-19 00:46] falls asleep +[1518-11-16 00:00] Guard #1303 begins shift +[1518-04-27 00:33] wakes up +[1518-07-30 00:04] Guard #2437 begins shift +[1518-08-24 00:54] wakes up +[1518-03-10 00:43] falls asleep +[1518-10-06 00:03] Guard #1979 begins shift +[1518-08-10 00:02] Guard #2437 begins shift +[1518-09-10 00:07] falls asleep +[1518-07-31 00:29] falls asleep +[1518-05-19 00:31] wakes up +[1518-02-28 00:00] Guard #991 begins shift +[1518-03-14 00:50] wakes up +[1518-09-20 23:46] Guard #1901 begins shift +[1518-06-26 00:17] falls asleep +[1518-07-04 00:49] wakes up +[1518-07-04 23:58] Guard #2437 begins shift +[1518-04-11 00:55] wakes up +[1518-08-05 00:49] wakes up +[1518-11-01 00:49] falls asleep +[1518-04-25 23:59] Guard #2437 begins shift +[1518-04-28 00:27] falls asleep +[1518-05-27 00:21] falls asleep +[1518-03-14 00:58] wakes up +[1518-07-04 00:39] falls asleep +[1518-10-22 00:53] wakes up +[1518-05-19 00:57] wakes up +[1518-11-12 00:57] wakes up +[1518-07-21 00:58] wakes up +[1518-04-28 00:42] wakes up +[1518-08-04 00:15] falls asleep +[1518-10-24 00:27] falls asleep +[1518-09-18 00:53] falls asleep +[1518-03-19 00:44] falls asleep +[1518-11-11 00:54] wakes up +[1518-03-10 00:57] wakes up +[1518-08-01 00:20] wakes up +[1518-03-07 00:08] falls asleep +[1518-03-09 00:53] wakes up +[1518-06-13 00:22] wakes up +[1518-06-29 00:54] wakes up +[1518-09-21 00:05] falls asleep +[1518-08-26 00:14] falls asleep +[1518-04-23 00:54] falls asleep +[1518-07-22 00:58] wakes up +[1518-07-03 00:46] falls asleep +[1518-04-17 00:29] wakes up +[1518-06-22 00:34] falls asleep +[1518-03-13 00:01] falls asleep +[1518-08-11 00:58] wakes up +[1518-09-01 00:25] falls asleep +[1518-09-01 00:53] wakes up +[1518-06-12 00:02] Guard #3307 begins shift +[1518-05-01 00:56] wakes up +[1518-04-11 00:04] Guard #127 begins shift +[1518-05-29 23:59] Guard #2083 begins shift +[1518-03-18 00:03] falls asleep +[1518-10-05 00:04] Guard #991 begins shift +[1518-06-14 23:57] Guard #659 begins shift +[1518-10-28 00:15] falls asleep +[1518-03-10 00:02] Guard #1307 begins shift +[1518-04-15 00:21] falls asleep +[1518-08-31 23:56] Guard #1447 begins shift +[1518-06-22 00:57] wakes up +[1518-08-24 00:59] wakes up +[1518-09-08 00:46] falls asleep +[1518-08-24 00:05] falls asleep +[1518-09-09 23:56] Guard #1447 begins shift +[1518-10-02 00:59] wakes up +[1518-11-17 00:33] falls asleep +[1518-04-19 00:34] wakes up +[1518-04-30 00:45] falls asleep +[1518-08-02 00:27] wakes up +[1518-11-05 00:47] wakes up +[1518-05-24 00:43] wakes up +[1518-06-25 00:25] wakes up +[1518-10-09 00:23] falls asleep +[1518-09-16 00:51] wakes up +[1518-06-29 00:57] falls asleep +[1518-11-12 00:03] Guard #3011 begins shift +[1518-07-14 00:00] Guard #3251 begins shift +[1518-06-20 00:51] falls asleep +[1518-11-04 00:32] wakes up +[1518-05-19 00:00] Guard #3323 begins shift +[1518-04-19 00:15] falls asleep +[1518-07-21 00:44] wakes up +[1518-05-30 00:23] falls asleep +[1518-05-15 00:00] Guard #353 begins shift +[1518-08-05 23:58] Guard #2269 begins shift +[1518-09-15 00:52] wakes up +[1518-07-01 00:18] falls asleep +[1518-05-18 00:38] wakes up +[1518-03-02 23:58] Guard #3307 begins shift +[1518-09-23 00:58] wakes up +[1518-05-20 00:35] falls asleep +[1518-05-05 00:30] falls asleep +[1518-09-23 00:44] wakes up +[1518-08-25 00:03] Guard #3011 begins shift +[1518-04-22 00:00] falls asleep +[1518-05-10 00:24] wakes up +[1518-06-27 00:43] wakes up +[1518-03-05 00:45] wakes up +[1518-11-19 00:18] falls asleep +[1518-09-24 00:08] falls asleep +[1518-06-29 00:10] falls asleep +[1518-04-11 00:29] wakes up +[1518-06-23 23:52] Guard #1303 begins shift +[1518-04-20 00:13] wakes up +[1518-06-03 00:40] falls asleep +[1518-03-23 00:59] wakes up +[1518-05-03 00:04] Guard #2437 begins shift +[1518-11-11 00:19] falls asleep +[1518-09-21 00:50] wakes up +[1518-07-12 00:47] wakes up +[1518-06-01 00:37] wakes up +[1518-06-03 00:58] wakes up +[1518-07-18 00:47] wakes up +[1518-07-02 00:39] wakes up +[1518-11-06 00:02] Guard #3323 begins shift +[1518-03-02 00:02] falls asleep +[1518-07-03 00:53] wakes up +[1518-06-06 00:38] wakes up +[1518-04-27 23:56] Guard #2437 begins shift +[1518-06-28 00:23] falls asleep +[1518-11-06 00:42] falls asleep +[1518-03-27 00:30] falls asleep +[1518-11-11 00:31] falls asleep +[1518-04-20 00:24] falls asleep +[1518-06-26 00:49] wakes up +[1518-08-01 00:54] falls asleep +[1518-05-03 00:40] wakes up +[1518-08-23 00:57] wakes up +[1518-10-07 00:44] wakes up +[1518-09-20 00:04] falls asleep +[1518-09-04 00:48] wakes up +[1518-07-18 00:59] wakes up +[1518-06-18 00:56] wakes up +[1518-11-01 00:46] wakes up +[1518-10-28 00:28] falls asleep +[1518-05-04 00:01] Guard #2239 begins shift +[1518-02-24 00:27] falls asleep +[1518-04-30 00:02] Guard #127 begins shift +[1518-09-22 00:45] falls asleep +[1518-06-15 00:44] falls asleep +[1518-08-16 00:45] falls asleep +[1518-07-02 00:50] wakes up +[1518-05-31 00:24] wakes up +[1518-02-27 00:24] falls asleep +[1518-07-30 00:20] falls asleep +[1518-05-16 00:46] falls asleep +[1518-05-25 00:00] falls asleep +[1518-11-13 00:23] falls asleep +[1518-05-22 00:00] Guard #467 begins shift +[1518-04-08 23:50] Guard #1901 begins shift +[1518-05-06 00:42] falls asleep +[1518-03-25 00:43] falls asleep +[1518-04-07 00:56] wakes up +[1518-11-19 00:00] Guard #991 begins shift +[1518-05-20 23:51] Guard #1901 begins shift +[1518-03-10 00:51] wakes up +[1518-10-12 00:38] falls asleep +[1518-06-26 00:02] Guard #3011 begins shift +[1518-09-11 00:17] falls asleep +[1518-05-18 00:55] wakes up +[1518-10-02 00:08] falls asleep +[1518-11-05 00:00] Guard #3251 begins shift +[1518-05-09 00:46] wakes up +[1518-06-26 23:59] Guard #1009 begins shift +[1518-06-27 00:14] falls asleep +[1518-06-29 00:23] wakes up +[1518-04-13 23:58] Guard #1307 begins shift +[1518-09-13 00:00] Guard #467 begins shift +[1518-08-04 00:35] falls asleep +[1518-04-08 00:54] wakes up +[1518-05-24 23:52] Guard #523 begins shift +[1518-02-24 00:35] wakes up +[1518-08-08 00:51] wakes up +[1518-05-28 00:59] wakes up +[1518-11-14 00:18] falls asleep +[1518-04-09 00:32] wakes up +[1518-05-17 00:46] wakes up +[1518-11-03 00:28] falls asleep +[1518-09-27 00:57] wakes up +[1518-08-24 00:16] wakes up +[1518-03-20 00:01] falls asleep +[1518-06-16 00:42] wakes up +[1518-08-14 00:22] falls asleep +[1518-08-18 00:53] wakes up +[1518-04-27 00:01] Guard #2437 begins shift +[1518-03-29 00:00] Guard #3251 begins shift +[1518-08-02 00:08] falls asleep +[1518-06-21 00:26] falls asleep +[1518-03-22 00:12] falls asleep +[1518-11-10 23:58] Guard #1447 begins shift +[1518-03-29 23:59] Guard #2617 begins shift +[1518-06-09 00:18] falls asleep +[1518-04-25 00:59] wakes up +[1518-03-29 00:32] falls asleep +[1518-03-17 00:25] wakes up +[1518-04-10 00:07] falls asleep +[1518-08-03 00:57] wakes up +[1518-08-12 00:48] wakes up +[1518-07-29 00:56] wakes up +[1518-05-27 00:11] falls asleep +[1518-06-21 00:22] wakes up +[1518-04-28 00:30] wakes up +[1518-06-08 00:39] wakes up +[1518-11-01 00:56] wakes up +[1518-08-18 00:36] wakes up +[1518-08-17 00:51] wakes up +[1518-06-22 00:01] Guard #523 begins shift +[1518-04-13 00:13] falls asleep +[1518-07-28 00:53] falls asleep +[1518-05-14 00:01] Guard #1831 begins shift +[1518-10-02 00:34] wakes up +[1518-05-19 00:25] falls asleep +[1518-07-14 00:36] falls asleep +[1518-04-17 23:46] Guard #2269 begins shift +[1518-09-20 00:33] falls asleep +[1518-04-22 00:41] wakes up +[1518-03-17 23:53] Guard #2083 begins shift +[1518-08-13 00:03] falls asleep +[1518-03-10 00:23] falls asleep +[1518-03-30 00:08] falls asleep +[1518-08-31 00:42] wakes up +[1518-11-18 00:00] Guard #3307 begins shift +[1518-03-14 00:49] falls asleep +[1518-08-17 23:58] Guard #2083 begins shift +[1518-11-14 23:48] Guard #1307 begins shift +[1518-05-18 00:12] wakes up +[1518-07-13 00:18] falls asleep +[1518-08-23 00:04] Guard #3307 begins shift +[1518-08-20 00:32] falls asleep +[1518-06-14 00:16] falls asleep +[1518-09-21 00:56] wakes up +[1518-06-22 23:50] Guard #2437 begins shift +[1518-09-23 00:39] falls asleep +[1518-10-04 00:08] falls asleep +[1518-04-17 00:27] falls asleep +[1518-09-14 00:52] wakes up +[1518-06-13 00:47] wakes up +[1518-08-17 00:04] Guard #127 begins shift +[1518-07-22 00:24] falls asleep +[1518-09-09 00:57] wakes up +[1518-07-13 00:01] Guard #2083 begins shift +[1518-03-27 00:45] wakes up +[1518-04-04 00:16] falls asleep +[1518-11-11 00:53] falls asleep +[1518-06-30 23:56] Guard #523 begins shift +[1518-04-18 00:02] falls asleep +[1518-10-25 00:01] falls asleep +[1518-09-14 00:39] wakes up +[1518-04-09 00:02] falls asleep +[1518-03-10 00:54] falls asleep +[1518-10-23 00:13] falls asleep +[1518-04-22 23:57] Guard #1307 begins shift +[1518-06-17 00:12] falls asleep +[1518-04-15 00:47] wakes up +[1518-09-05 00:50] wakes up +[1518-10-31 00:45] wakes up +[1518-06-21 00:58] wakes up +[1518-03-16 00:51] wakes up +[1518-07-25 00:43] falls asleep +[1518-08-29 00:51] falls asleep +[1518-06-28 23:58] Guard #1979 begins shift +[1518-08-16 00:53] wakes up +[1518-09-12 00:20] falls asleep +[1518-06-29 00:48] falls asleep +[1518-09-19 00:48] wakes up +[1518-09-15 00:24] falls asleep +[1518-03-01 00:26] wakes up +[1518-08-24 00:57] falls asleep +[1518-03-01 00:21] wakes up +[1518-04-07 00:25] falls asleep +[1518-11-23 00:49] falls asleep +[1518-07-16 23:59] Guard #2083 begins shift +[1518-07-08 00:24] wakes up +[1518-05-13 00:19] falls asleep +[1518-10-20 00:47] falls asleep +[1518-05-27 00:26] wakes up +[1518-09-03 23:46] Guard #1901 begins shift +[1518-05-24 00:20] falls asleep +[1518-03-06 00:17] falls asleep +[1518-10-12 00:51] wakes up +[1518-03-20 00:31] falls asleep +[1518-08-02 00:48] wakes up +[1518-05-12 23:58] Guard #523 begins shift +[1518-09-17 00:06] falls asleep +[1518-07-02 00:33] falls asleep +[1518-06-06 00:16] falls asleep +[1518-02-28 23:57] Guard #2239 begins shift +[1518-04-13 00:22] falls asleep +[1518-08-31 00:03] falls asleep +[1518-03-06 00:00] Guard #1979 begins shift +[1518-05-21 00:41] falls asleep +[1518-11-07 00:12] falls asleep +[1518-07-25 00:17] falls asleep +[1518-06-09 00:53] wakes up +[1518-10-30 00:06] falls asleep +[1518-06-25 00:44] falls asleep +[1518-10-22 23:56] Guard #2239 begins shift +[1518-08-21 00:54] wakes up +[1518-04-15 23:58] Guard #659 begins shift +[1518-08-29 00:53] wakes up +[1518-09-29 00:01] Guard #1901 begins shift +[1518-03-18 00:56] wakes up +[1518-06-11 00:31] wakes up +[1518-11-20 23:59] Guard #1831 begins shift +[1518-04-16 23:58] Guard #1447 begins shift +[1518-02-28 00:15] falls asleep +[1518-06-04 00:54] wakes up +[1518-04-18 00:53] falls asleep +[1518-11-16 00:59] wakes up +[1518-04-08 00:03] Guard #2617 begins shift +[1518-06-17 23:56] Guard #1447 begins shift +[1518-05-06 00:04] Guard #1979 begins shift +[1518-08-13 00:53] wakes up +[1518-04-03 23:57] Guard #1447 begins shift +[1518-10-12 00:00] Guard #3323 begins shift +[1518-11-09 23:48] Guard #2269 begins shift +[1518-07-09 00:51] wakes up +[1518-11-02 00:27] falls asleep +[1518-03-13 00:22] wakes up +[1518-09-05 00:45] falls asleep +[1518-11-17 00:00] Guard #2239 begins shift +[1518-10-14 00:44] falls asleep +[1518-09-25 00:06] falls asleep +[1518-05-31 23:59] Guard #2083 begins shift +[1518-05-10 23:57] Guard #127 begins shift +[1518-07-31 00:58] wakes up +[1518-03-23 00:04] Guard #2269 begins shift +[1518-11-21 23:56] Guard #1901 begins shift +[1518-08-27 00:17] falls asleep +[1518-08-07 00:48] wakes up +[1518-05-23 00:45] wakes up +[1518-06-09 00:49] wakes up +[1518-05-02 00:53] falls asleep +[1518-03-05 00:37] falls asleep +[1518-06-18 00:21] falls asleep +[1518-05-31 00:45] wakes up +[1518-09-06 00:38] falls asleep +[1518-11-16 00:52] wakes up +[1518-03-16 00:03] Guard #991 begins shift +[1518-05-12 00:32] falls asleep +[1518-10-07 23:58] Guard #2239 begins shift +[1518-07-03 00:26] falls asleep +[1518-07-28 00:48] wakes up +[1518-05-28 00:14] falls asleep +[1518-10-31 00:42] falls asleep +[1518-09-11 23:59] Guard #991 begins shift +[1518-07-17 00:20] falls asleep +[1518-03-19 00:53] wakes up +[1518-04-03 00:00] Guard #991 begins shift +[1518-10-01 00:04] falls asleep +[1518-07-03 00:31] wakes up +[1518-02-25 00:40] falls asleep +[1518-03-04 00:04] Guard #1307 begins shift +[1518-09-18 00:08] wakes up +[1518-11-06 23:58] Guard #3011 begins shift +[1518-08-24 00:46] falls asleep +[1518-06-13 00:39] falls asleep +[1518-05-23 23:58] Guard #3323 begins shift +[1518-05-16 23:57] Guard #3011 begins shift +[1518-08-03 00:24] falls asleep +[1518-05-03 00:58] wakes up +[1518-10-06 00:53] wakes up +[1518-11-01 23:59] Guard #2239 begins shift +[1518-06-02 00:05] falls asleep +[1518-04-28 23:58] Guard #127 begins shift +[1518-07-27 00:02] Guard #1979 begins shift +[1518-04-19 00:53] falls asleep +[1518-08-04 00:00] Guard #1831 begins shift +[1518-04-05 00:36] falls asleep +[1518-03-08 00:49] wakes up +[1518-03-26 00:51] falls asleep +[1518-05-18 00:18] falls asleep +[1518-04-24 23:59] Guard #3251 begins shift +[1518-11-09 00:14] falls asleep +[1518-08-25 00:27] falls asleep +[1518-10-29 00:04] Guard #1979 begins shift +[1518-02-26 00:22] falls asleep +[1518-07-07 23:46] Guard #1307 begins shift +[1518-09-30 23:52] Guard #1901 begins shift +[1518-03-31 23:56] Guard #467 begins shift +[1518-08-06 00:46] falls asleep +[1518-11-19 23:59] Guard #467 begins shift +[1518-04-15 00:03] Guard #991 begins shift +[1518-04-19 23:46] Guard #523 begins shift +[1518-07-10 00:30] falls asleep +[1518-07-31 00:43] falls asleep +[1518-09-07 00:51] wakes up +[1518-06-18 23:46] Guard #127 begins shift +[1518-04-08 00:18] falls asleep +[1518-04-02 00:58] wakes up +[1518-05-19 00:41] falls asleep +[1518-10-18 00:37] falls asleep +[1518-10-22 00:16] falls asleep +[1518-06-26 00:36] falls asleep +[1518-03-20 00:21] wakes up +[1518-03-01 23:48] Guard #3251 begins shift +[1518-09-08 00:55] wakes up +[1518-10-08 00:44] falls asleep +[1518-06-08 00:01] falls asleep +[1518-10-05 00:24] falls asleep +[1518-02-23 00:43] falls asleep +[1518-03-23 00:37] falls asleep +[1518-07-28 00:58] wakes up +[1518-05-17 00:36] falls asleep +[1518-08-11 00:06] falls asleep +[1518-04-13 00:37] wakes up +[1518-03-11 23:59] Guard #353 begins shift +[1518-08-23 00:24] falls asleep +[1518-04-19 00:50] wakes up +[1518-06-05 00:54] wakes up +[1518-07-31 00:57] falls asleep +[1518-07-25 00:58] wakes up +[1518-06-12 00:26] wakes up +[1518-08-19 23:57] Guard #1009 begins shift +[1518-08-15 00:51] wakes up +[1518-02-27 00:01] Guard #1979 begins shift +[1518-09-16 00:31] falls asleep +[1518-06-20 23:46] Guard #991 begins shift +[1518-09-14 00:59] wakes up +[1518-04-21 23:48] Guard #1307 begins shift +[1518-09-16 23:58] Guard #1979 begins shift +[1518-03-11 00:59] wakes up +[1518-04-13 00:02] Guard #3307 begins shift +[1518-09-20 00:59] wakes up +[1518-02-25 23:57] Guard #1901 begins shift +[1518-10-02 00:00] Guard #1009 begins shift +[1518-08-16 00:00] Guard #991 begins shift +[1518-09-17 00:27] wakes up +[1518-06-09 00:58] wakes up +[1518-04-25 00:09] falls asleep +[1518-03-17 00:32] falls asleep +[1518-07-15 00:27] wakes up +[1518-09-10 00:32] wakes up +[1518-05-02 00:58] wakes up +[1518-09-25 00:44] wakes up +[1518-06-01 00:36] falls asleep +[1518-07-16 00:40] falls asleep +[1518-11-18 00:59] wakes up +[1518-11-17 00:09] falls asleep +[1518-05-01 00:30] falls asleep +[1518-08-10 00:53] wakes up +[1518-11-08 00:58] wakes up +[1518-05-31 00:00] falls asleep +[1518-03-15 00:42] wakes up +[1518-07-05 00:58] wakes up +[1518-03-27 00:04] Guard #2239 begins shift +[1518-10-06 00:16] falls asleep +[1518-07-10 00:54] wakes up +[1518-04-12 00:38] wakes up +[1518-07-05 00:23] falls asleep +[1518-11-19 00:37] wakes up +[1518-06-30 00:00] Guard #3011 begins shift +[1518-10-27 00:43] falls asleep +[1518-04-01 23:56] Guard #991 begins shift +[1518-04-04 00:28] wakes up +[1518-05-22 23:59] Guard #3307 begins shift +[1518-05-06 00:06] falls asleep +[1518-04-25 00:35] wakes up +[1518-04-24 00:07] falls asleep +[1518-07-05 00:35] wakes up +[1518-10-26 00:02] Guard #2753 begins shift +[1518-05-31 00:34] falls asleep +[1518-10-17 00:55] wakes up +[1518-04-19 00:49] falls asleep +[1518-03-13 23:57] Guard #2239 begins shift +[1518-11-21 00:46] wakes up +[1518-03-22 00:04] Guard #3307 begins shift +[1518-05-09 23:50] Guard #991 begins shift +[1518-03-03 00:59] wakes up +[1518-03-02 00:59] wakes up +[1518-04-20 00:48] wakes up +[1518-05-18 00:01] falls asleep +[1518-08-02 00:55] falls asleep +[1518-08-30 00:57] wakes up +[1518-05-27 00:52] wakes up +[1518-06-07 23:46] Guard #127 begins shift +[1518-08-02 00:57] wakes up +[1518-10-10 00:55] wakes up +[1518-02-24 00:53] falls asleep +[1518-04-11 23:56] Guard #1979 begins shift +[1518-10-19 00:00] Guard #1979 begins shift +[1518-09-11 00:29] wakes up +[1518-05-27 00:01] Guard #1831 begins shift +[1518-06-19 00:40] falls asleep +[1518-05-28 00:00] Guard #3011 begins shift +[1518-10-15 00:01] Guard #3011 begins shift +[1518-06-07 00:00] Guard #2239 begins shift +[1518-09-29 00:45] wakes up +[1518-06-29 00:58] wakes up +[1518-10-30 00:45] wakes up +[1518-06-10 00:10] falls asleep +[1518-05-09 00:32] wakes up +[1518-05-28 23:57] Guard #3011 begins shift +[1518-05-09 00:35] falls asleep +[1518-10-09 00:01] Guard #1979 begins shift +[1518-06-24 00:36] wakes up +[1518-07-22 23:59] Guard #3323 begins shift +[1518-11-06 00:46] wakes up +[1518-03-16 00:16] falls asleep +[1518-05-14 00:41] falls asleep +[1518-07-06 00:00] Guard #2239 begins shift +[1518-08-17 00:56] falls asleep +[1518-07-02 00:02] Guard #1009 begins shift +[1518-03-17 00:50] wakes up +[1518-09-15 00:04] Guard #1009 begins shift +[1518-06-14 00:03] Guard #3323 begins shift +[1518-05-16 00:24] wakes up +[1518-10-25 00:57] wakes up +[1518-04-10 00:04] Guard #1303 begins shift +[1518-05-05 00:56] wakes up +[1518-06-03 00:46] wakes up +[1518-05-05 00:02] Guard #1901 begins shift +[1518-05-20 00:29] wakes up +[1518-10-21 00:00] Guard #3251 begins shift +[1518-11-17 00:19] wakes up +[1518-02-27 00:48] wakes up +[1518-11-07 23:57] Guard #659 begins shift +[1518-06-11 00:01] Guard #2239 begins shift +[1518-06-28 00:41] wakes up +[1518-04-30 00:57] wakes up +[1518-11-10 00:40] wakes up +[1518-11-22 00:38] falls asleep +[1518-04-12 00:31] falls asleep +[1518-07-27 00:46] falls asleep +[1518-04-07 00:48] falls asleep +[1518-05-03 00:48] falls asleep +[1518-05-07 00:39] wakes up +[1518-06-26 00:30] wakes up +[1518-07-12 00:59] wakes up +[1518-06-03 23:59] Guard #127 begins shift +[1518-10-15 00:41] wakes up +[1518-08-05 00:17] falls asleep +[1518-05-16 00:47] wakes up +[1518-07-06 00:21] falls asleep +[1518-07-26 00:29] wakes up +[1518-07-19 00:48] wakes up +[1518-10-29 00:49] wakes up +[1518-09-22 00:55] wakes up +[1518-07-20 00:57] wakes up +[1518-08-15 00:00] Guard #2269 begins shift +[1518-09-05 00:01] Guard #1307 begins shift +[1518-08-02 00:02] Guard #2437 begins shift +[1518-10-29 00:42] falls asleep +[1518-03-23 23:54] Guard #1303 begins shift +[1518-05-12 00:44] wakes up +[1518-09-24 00:34] wakes up +[1518-08-13 23:57] Guard #1447 begins shift +[1518-06-16 00:48] falls asleep +[1518-06-08 23:58] Guard #127 begins shift +[1518-10-24 00:48] wakes up +[1518-03-26 00:07] falls asleep +[1518-10-28 00:23] wakes up +[1518-07-31 00:38] wakes up +[1518-08-27 23:58] Guard #1307 begins shift +[1518-08-04 00:47] wakes up +[1518-09-02 00:58] wakes up +[1518-09-23 00:02] Guard #2617 begins shift +[1518-02-22 00:19] falls asleep +[1518-05-16 00:35] falls asleep +[1518-10-04 00:51] wakes up +[1518-03-27 23:51] Guard #1009 begins shift +[1518-08-23 00:32] wakes up +[1518-08-11 00:00] Guard #1447 begins shift +[1518-06-25 00:22] falls asleep +[1518-05-11 00:35] wakes up +[1518-07-19 00:02] Guard #1447 begins shift +[1518-09-15 00:42] falls asleep +[1518-05-21 00:29] wakes up +[1518-05-12 00:01] Guard #3011 begins shift +[1518-08-29 00:27] falls asleep +[1518-02-23 00:50] wakes up +[1518-08-30 23:54] Guard #1831 begins shift +[1518-06-28 00:01] Guard #1307 begins shift +[1518-07-19 23:59] Guard #659 begins shift +[1518-04-06 00:04] Guard #523 begins shift +[1518-06-10 00:16] wakes up +[1518-06-09 00:56] falls asleep +[1518-02-26 00:58] wakes up +[1518-02-23 00:31] falls asleep +[1518-08-21 00:16] falls asleep +[1518-04-14 00:58] wakes up +[1518-11-10 00:05] falls asleep +[1518-03-09 00:00] Guard #1447 begins shift +[1518-06-23 00:04] falls asleep +[1518-09-09 00:05] falls asleep +[1518-07-05 00:50] falls asleep +[1518-10-12 00:24] wakes up +[1518-04-06 00:37] falls asleep +[1518-08-02 00:42] falls asleep +[1518-02-25 00:36] wakes up +[1518-03-28 00:00] falls asleep +[1518-09-25 00:00] Guard #2239 begins shift +[1518-11-18 00:52] wakes up +[1518-11-07 00:55] wakes up +[1518-10-20 00:00] Guard #3323 begins shift +[1518-05-21 00:46] wakes up +[1518-08-20 23:59] Guard #2437 begins shift +[1518-11-17 00:34] wakes up +[1518-04-27 00:19] falls asleep +[1518-06-10 00:00] Guard #3307 begins shift +[1518-03-14 00:44] wakes up +[1518-05-25 00:39] wakes up +[1518-10-17 00:36] falls asleep +[1518-11-09 00:02] Guard #523 begins shift +[1518-08-09 00:38] wakes up +[1518-09-26 00:53] wakes up +[1518-03-01 00:25] falls asleep +[1518-03-28 00:44] wakes up +[1518-11-11 00:27] wakes up +[1518-06-19 00:34] wakes up +[1518-05-11 00:33] falls asleep +[1518-05-26 00:39] wakes up +[1518-08-19 00:30] falls asleep +[1518-06-13 00:59] wakes up +[1518-04-11 00:06] falls asleep +[1518-06-05 00:02] Guard #1447 begins shift +[1518-02-22 00:37] wakes up +[1518-07-30 00:57] wakes up +[1518-03-26 00:46] wakes up +[1518-06-23 00:34] wakes up +[1518-08-14 00:57] wakes up +[1518-06-06 00:03] Guard #1979 begins shift +[1518-10-03 00:02] Guard #467 begins shift +[1518-09-15 23:57] Guard #1901 begins shift +[1518-03-24 00:35] wakes up +[1518-04-14 00:24] falls asleep +[1518-07-23 00:45] wakes up +[1518-04-11 00:50] falls asleep +[1518-08-15 00:54] falls asleep +[1518-02-25 00:03] Guard #1307 begins shift +[1518-07-17 00:59] wakes up +[1518-10-04 00:03] Guard #1831 begins shift +[1518-07-11 00:32] falls asleep +[1518-08-25 00:49] wakes up +[1518-03-08 00:00] Guard #1901 begins shift +[1518-11-16 00:56] falls asleep +[1518-08-19 00:03] Guard #1009 begins shift +[1518-08-12 00:27] falls asleep +[1518-11-09 00:27] wakes up +[1518-04-10 00:48] wakes up +[1518-11-14 00:32] wakes up +[1518-10-28 00:50] wakes up +[1518-10-15 23:56] Guard #1901 begins shift +[1518-07-14 00:10] falls asleep +[1518-09-18 00:54] wakes up +[1518-07-10 00:00] Guard #3323 begins shift +[1518-08-28 00:31] wakes up +[1518-06-21 00:05] falls asleep +[1518-04-02 00:27] falls asleep +[1518-10-20 00:33] falls asleep +[1518-05-09 00:01] falls asleep +[1518-03-26 00:02] Guard #1901 begins shift +[1518-10-13 00:41] wakes up +[1518-06-03 00:55] falls asleep +[1518-04-18 00:58] wakes up +[1518-07-25 00:20] wakes up +[1518-08-04 00:30] wakes up +[1518-05-30 23:51] Guard #2617 begins shift +[1518-08-01 00:50] wakes up +[1518-11-12 00:26] falls asleep +[1518-04-21 00:00] Guard #991 begins shift +[1518-11-14 00:55] wakes up +[1518-07-12 00:57] falls asleep +[1518-08-09 00:36] falls asleep +[1518-08-19 00:34] wakes up +[1518-04-23 00:30] wakes up +[1518-02-22 00:54] wakes up +[1518-09-26 00:51] falls asleep +[1518-03-20 00:56] wakes up +[1518-11-08 00:25] falls asleep +[1518-11-19 00:51] falls asleep +[1518-10-13 23:56] Guard #1979 begins shift +[1518-04-07 00:36] wakes up +[1518-05-25 00:28] falls asleep +[1518-04-23 00:58] wakes up +[1518-04-18 00:46] wakes up +[1518-09-11 00:57] falls asleep +[1518-04-27 00:52] wakes up +[1518-11-18 00:35] falls asleep +[1518-09-05 00:26] falls asleep +[1518-11-15 00:58] wakes up +[1518-02-23 00:40] wakes up +[1518-10-02 00:37] falls asleep +[1518-08-27 00:00] Guard #3011 begins shift +[1518-04-13 00:49] falls asleep +[1518-07-28 00:20] falls asleep +[1518-03-04 00:47] wakes up +[1518-03-24 00:04] falls asleep +[1518-03-20 23:58] Guard #2753 begins shift +[1518-11-14 00:45] falls asleep +[1518-09-11 00:59] wakes up +[1518-06-16 00:40] falls asleep +[1518-05-27 00:12] wakes up +[1518-11-01 00:00] Guard #1447 begins shift +[1518-08-28 23:58] Guard #1307 begins shift +[1518-05-21 00:04] falls asleep +[1518-07-23 00:38] falls asleep +[1518-05-02 00:49] wakes up +[1518-03-24 23:57] Guard #2269 begins shift +[1518-06-25 00:30] falls asleep +[1518-08-02 23:56] Guard #3011 begins shift +[1518-05-07 00:00] Guard #2617 begins shift +[1518-04-26 00:57] wakes up +[1518-04-21 00:19] falls asleep +[1518-04-04 00:18] wakes up +[1518-04-18 23:57] Guard #659 begins shift +[1518-07-18 00:41] falls asleep +[1518-09-08 00:40] wakes up +[1518-09-28 00:33] falls asleep +[1518-11-03 00:04] Guard #3323 begins shift +[1518-08-15 00:26] falls asleep +[1518-10-19 00:14] falls asleep +[1518-03-01 00:10] falls asleep +[1518-06-14 00:45] wakes up +[1518-06-19 00:55] wakes up +[1518-06-11 00:41] wakes up +[1518-03-02 00:29] falls asleep +[1518-09-18 00:40] falls asleep +[1518-07-17 00:54] falls asleep +[1518-11-13 00:33] wakes up +[1518-09-30 00:15] falls asleep +[1518-11-04 00:59] wakes up +[1518-04-24 00:57] falls asleep +[1518-09-06 00:40] wakes up +[1518-10-20 00:59] wakes up +[1518-05-26 00:10] wakes up +[1518-08-20 00:56] wakes up +[1518-06-19 00:04] falls asleep +[1518-05-07 00:33] falls asleep +[1518-10-31 00:21] wakes up +[1518-04-13 00:55] wakes up +[1518-11-22 00:42] wakes up +[1518-10-17 00:20] wakes up +[1518-03-19 23:47] Guard #2083 begins shift +[1518-08-26 00:01] Guard #523 begins shift +[1518-04-20 00:01] falls asleep +[1518-11-23 00:00] Guard #3307 begins shift +[1518-03-10 00:28] wakes up +[1518-09-18 00:45] wakes up +[1518-07-07 00:19] falls asleep +[1518-09-23 00:14] falls asleep +[1518-08-17 00:59] wakes up +[1518-10-13 00:32] falls asleep +[1518-03-01 00:31] falls asleep +[1518-10-25 00:49] falls asleep +[1518-08-07 00:27] falls asleep +[1518-03-06 00:58] wakes up +[1518-08-29 00:32] wakes up +[1518-09-23 00:17] wakes up +[1518-03-07 00:01] Guard #3251 begins shift +[1518-08-06 00:53] wakes up +[1518-09-27 23:56] Guard #3011 begins shift +[1518-04-30 23:57] Guard #3323 begins shift +[1518-03-11 00:13] falls asleep +[1518-05-20 00:00] Guard #1979 begins shift +[1518-03-29 00:47] wakes up +[1518-09-08 00:02] Guard #127 begins shift +[1518-09-08 23:47] Guard #2437 begins shift +[1518-05-14 00:53] wakes up +[1518-06-25 00:02] falls asleep \ No newline at end of file diff --git a/AoC2018.Runner/Input/day05.txt b/AoC2018.Runner/Input/day05.txt new file mode 100644 index 0000000..13e348e --- /dev/null +++ b/AoC2018.Runner/Input/day05.txt @@ -0,0 +1 @@ +xPGgpXlvVLLPplNSiIsWwaAEeMmJjyYfFWfFwpPqcCYvVySsAUuaCcDdHlLSshxKkMmXQnNKkrRptBbTqQEevKkkKVsSmMmMvqFfGFSsfZzgQTtFLlfsSFBTtbfbBiIAHhzZaVNbBOonsfFSBYGgRryvaAVTtbFfqaAEetqQUubBTyYAWwzZeENRrgGaAfFnNnpPJjulLEeUaQqnNJjQtTPTaqQAoOEerRtnVaALlhDdPpHvvVrRsFVvfsMcCvkPZzpKbBOofZzyYFzZsAjJavGgkKRrVwWSYygFfGLrRLlgGlVaAXZzHuULDpPdoOlhgGVoOKkVvaAhOoHIiBNnxsSXbBbvVFfvtTUvVlaALPptTGguPpjJFmRrMqjJOOqQZzooQRVvrKkpVvPOopPKKbBkYykYQqPpPpoKkOihHIECcJjeyvsSVpbBPGKkgfVvHhiIvGgViXxlLdDIgGKMCncCNcmfFDDdSsXxqQtTaAdenNdDVvPuUpVvtTZzEQqyoOvVTxXtbBnDdcCZWwrRzNaeEAlDZzeEdJlelLEzZhHhOoHYyKkLjWwNnLAjJaiHhIvhHHhEhHeSsSKksXxVvzZEevVzpliIRPprLPcOHhsSoRSsTtrlLCiISsJjMmZvnNoOVclLCVzZMmKhHkqWufFmMSmMkKsiFfoRrOIUozZyYNnSNnqQsTrRtSHhNniIbGgCcnNBxXSFYyWwfgFRrfaROorAsxXSGsSKBbkspPIeoOHhEiXxVvpPUfFuyYypPynNYpPSskdDKjJCeErRtxXTHIzjJZihoOZvoOGfFWwgVzCUuaXxAeEnBVvbNiIAaRdDxXrmMcgCyYceyYyYEEMmgWwGOoKkqQkeEVvGgrRJjrYyEeRKYyOPZzJjpooOcCrgGtTOoRNneHiIXxnNIQqzZiHhZgGZzyYeEuUOmMbZzUjaAJuPpBozZzlfFLiIphHsvVSvVUTtuDdPhPVDdPpvYyvDgGCcdTSstaHhcCHhAJgGLOOoaARVCclgGLvrsSolAPpUuaXxaAkoOPpeEzGgZcCjJHhKkKlYUuyMQIiqSiqQBbIsGLLGgvWwTtVlpyTtYgAaGPSeEfFsDdgGkVbBNnvQrLlRqYWwyEqQLlsSSVvstTghHGeKkKQqhHHhmMoYyhsSAaHdDuUKkOMmDdMmgGgQqRnNTtVvryYlDdrnNLlRUcCurRgGZuUWwMmbBTtjJzjJbBdDaAwWLjJKDpPpcCDdHhPRrhHRzjeEJZmMcNfVvlLvtTVSsxXFnVvTxtTKkjkAaKhzZxXfFHuBbkKTeEyrRcCYTtGgtuZDdjJzUUcSsCqQgGuUqUulLRrwWQeHOohSXxNnisSIWHhwiuUIfFVMxUaAuGdDgXmdHhDUuTFWwftbBvVKAakvrqQAayYWwRCcIvVijJhHrSNnsDaAdBbHLlhRPpAqZzQSsaQmOpPozQLlqhHZIDdisdDSyFpPfEJjeYowWhHrnNRRUuhHLeEdDlkKyYkKqQCcEexXifFIYfFqQyFzDdZcCorRgGzqQZDdzIiMmwWrRIIjJihlLHoOyYDzrRuUKbBvMmeEKkFffFsSVcYJuUjQqMHEeeEhbBYyucCfFGDdqQRmMHhhHqWwoOQTtrBhHxXCcbggGGpgGPgEecCYyEeEesSisSeOovVcwWCEIPJjnlLTtyYNLtfFHzZQCcqLlyxXYSqvGgVQzZsBvVDoOdlLbfFGxphHqQPHhmMdDGgHszjJZShXxXYysbBifrRFiIxcChIiHgGQqqvVbBEewWQxjJZmPpUuMzXlYyHhLXDvVBbdEsSexsSvtTrReEVnNmMTtXuKkjxXJMyYmZFfzUMmyVvTtFfYdDExEeXvVooOOjJTtCcUrRSwWsbBbhHtTBGVvgNDdnQqukKGgJOYHFfhKfFkSnNkKOoOohHsSnNsmmMMvVFGglHxXhLfFPsKkSpfyBbqQqaxXfpPZzbBCggGdDPlBbLaAZzKeEkYJiIemMtYyTlLjJEjXxsSyLlXxCckKeEuUZzrqQlLxXafFeEVvAiRrIRpmiRrFfbBzZvHhVICcoOMXxiWwNIinkkKBbgQqGPpLlKWhHwszZSQuUjKkfFJcZzCVvWeEYywtXxTjJzZkSsKfFeEcCrDhXxMmrRjUuOoYyJQDdqHwWMmLlOodqQMmqGCcgwWpJjqMmQKkPMmpPBbxnNzZyYySscTcCFftwWOeEoOobSsBSsOoaAGoOgRWwcQUWOokKwuTdUuDtYyYiJjYyIyquqaFfwWAQUZtKkTBbzndDXxjJLlJjyxWjJDdLlsSMmGgtiGgIqQpgGTtDdPClLAasyYFlLKoOkfMmFUuBEerRYyGflLFDdnNFfgFLlXJjxWHhwDOoOodOokKPpMmfoOzZupPUvVjJSBRrbYLlyuUNTXxnNtUuvVVvpPQqQqUuaqQAlLMBbHhxOfFozZJjXzZhHgqQEPpeVvSsEgGAaeUucCItTiLuUlGSsyYEeRrBbZiIAPpvRrhHzqEeQqvVBbGgIhHRXxrishHSQNnyYZzxXZpdDPVWXxwMvVmmMByYcCaAEebxXVvKfFlLcCcCkZzzQqGgFIifPpZNnjJMwsSWwRrWmvHosSOhVIibMmyYQqTtBMoOYOoSsZFKuUkKZzZzxXPpbqAanNNnQyYsZzShHUuGgSiIsYgGyeeECcsAadGgDOojqQGgSstTPpJSQRrGgUunNqpkKdDZzPhHkSsrRQwtTXyYxsSZzAaRcUgGvVufNSfFsnFCrXeogGWwQqlLOKbBuUkvWwzZUuEoOKkNneseECcwWwzbBWiIwDQqdAawWiIwWNnLiQDdqIAatTEOdDoeVkOopPKvQmbBKkvVbyhHYBWwbzZrQqRZDdhpCcOoXxnayYizZIFfANPKkeELKDdHhvyYVCckkvVKTAadDsSHhAjBbeQqEJpPaJjXxaAAFfXxRrVpuFWwWwfFoOZRrzPpxHJjhIqQiXfrRkKkKkNnLlKqhhHLNWWKkwwZznvOIioMwWXxeEmYyzZXcCxVZzmMUuPKYykKyYkpiIlSAaYcCyBCwDwWdWPpcbsghHnNbBsSMlLbBTpPtEeVuUZzfciICEmMMfFmlLeuwWoOnNUgGJjiybBCJZziZzAaIjQqhHCcaAcnGgjUuPpQqpPhXxHUjJuuxNnXUYyJCcLOoImMilBbLlkKGkKPwWEeuUzZHoOqQjJFfGgCckBbKzlwKpQqsSsSViIIirRvbBiZzIZiplxXLPTjnNJVpPyYvtDyYwqQWdYyarRxXDdALlIDdTtTcClZyYzvVRvVrLtmMkKvTDdxXtVqQlVvLPNnpoaAdDeELUwWuwxXWlOxXGgiaAITtgGyYuUzZdDynNYGwzZPkqQOoKklLxBbdQqDGyYgXKzHhRDhHdWzZwbBhvYyVHLHXxhlcaACIidDVbjJxeMmEXJBbtTjBVDdpPsNnSvrRbbBMmyoBbONnwWJTtOoQqIiVhsSHLlQqHhXxAoOHhTjCcJwWLltFfetTEFWwtTIyYiYyzZvVzZTOobchHCBQSiIsBbRDAamMJZzjoOJjyYIidHhQqOuUWwOovIiuUCcVoWPhHpwdDJjIvTufFUtWQqvVuUXxwtTiIVisqyYQiISHLjJGkKcCBAabhHiIKkWCcwpPcChfFHCnNlLcZSBbfFbBgwWzWwZaAZIizGcCmSsGxpNnPXQhHgGgGFfuJRraAjOouaUuTtAbRBbrjJlUtuUEeTCcwxXrROioZreOlnncKXxkCNKZzaAkpKkRcCrRVvrPNuULfCcxdZzDZvVCfFsUuSreFdDafFAfqQWPpTeINniEBArbBRaeJjEbZnNsSFflLzZztsPpEeBbwQqwWGgQqoOFfZzWnNSyYsXKkxWwKkkcCONnoNVvGgXxFuQqUkKfjJYyFeGgEcCnNFfLldyikbiIBhHKjOoJaAIYpPIMmHLlhibBIaJjyrRYbBjJAaASsVvFuUfTMNTtnnNmFfqQBbJOoCcXIhHgGCciTtSBMiImBYybxLgGlwWXNljuUJjJbBdDyYhHLQqxXmtTMwWqQnxXWwzSsmMkBbJjeRrsSEDdTtGAagXxKeEJjwuUDdpPdDWTCcKktjmMJjlLXybBYnNMmwoOfTtixXjJDduMmdzZJjclLqiIQciqQfjJvVFOJHhnNjUuoOoFfDdpkKPHbBhwWLYGvVgSXHsSFfxNnXhpvVAaSsFZtTFfzXoOxfUJjuYyRrYyqQvVSslLPMbYyBmpIiCdkTtKDcDmiIoOQxXBfSsFHhVtTvKcwWvVdDlOoHhuUQaTtAqLtTCkQXxEFfeoUunNHhtkKOobBEisSIetTWwTzrlLGgdDRiIelLmcOoSsYyzOoZPpdgGZzDenNEnyYXbBoUuOwHOYyplLPSsoUuSECdvPpcCVmvVLdDlDdoOUuRpPUYyurxXleKkeEEAaWwHhOoDrReXxEuULEelCNVvnjJIivVPpmwWeEAabBCcwZSwWsXxyxUuXYuUdXxoOhHhHggGIPpkKiNQqnSsrReRrEGXxrRfFgQqYyAZLllLzaAxbBNnXRrtTNcyPUumMIipSsTtYzOnNMmxXwVQsSvVqvJjVBbTtvoOQcCcCVvqWbmMBSkKsoOvVUCTtcuDxiTtIXxCcdlLDxXBFbBfbpPNfFnfFHhdDBkKowWObUUuuxOrRoDUuQqQHhHhBbqrRdiNnUuFfoOINEenNOAzZakoOhHJMhHmOoCcaAQIMmiqhHmDYwWdDjJXTtnNTnNpPtCcQqiInNnNXiYtWOYyNoOmRtVvlIiLIpiIPigetuqQUPqaAUrRvVugGuUsCcYySQzToOwgDdGaiIAWdeAaFfuUtuUequUQZzBbEpbBhHvVFfWpPXryoOYUcCASsauofnNFiHhInNKfFgGWwWVBSsbBbvMmWNnwQqDdnNDywWWNnwrveEVRgvVFfGgGfJKkjRgEeYyXxWRrwfFWhHwPIKCcsytTYyYAazXxTtEHheCjJQqoODWwgGdVahHAvcZgdDEhHuUSsYxXKkyXuGgUsGuUgLjJYRrsqJmMHhjQSfwWFrRaJKkRxXGglLrRDdHhIizZBYyJjbFfeEmvRPprXxYDdFfyrRMdDQqaAnNKsLpPjJleEctfTtFonNOVENnpnNZAaPjJhrREeVvbBCctEeIioOuKdDkXxYyJHfPpvVHlLAayaAYhVvZzFfFlWwBLlwWQqyYFPnNpPOopPoyYiIOpJpNiIJjkKnTcCEuVvtTtSsStjVjpPTCcfFteEtTxJjnxlLgGlLdDwWtLlrRTyIiYMmMmXmdDMDDddHhNuUvUuJjjJlLWAauUwmUppqQPAaHhtTUuwWJjYydXeELVNneuiqQkkaAaOoKtTkaQEyYeqAdDaTIiKqQkwWcCGaAQqUuIigGiIRrTLDVvCcdbBJIijhnNHsyYcChHmMSqQcCiIiDkgcCGOomMDkGIiwWSoOwdjJDLlsZYyzlLIkKivXxrRnNKkMmXmMPpkBrRoOIiHaAxbBXZrRoOzQqwWhXxbQHhqAoPBbZzQqCcpzFfJcCaAjuUzZZUuzqiIQwGgWjJWwFdDfQaAtTHlLFgGfBbBMmycqQHhSyYdMmyYmMgUuzZujJhvcnNCPpVPpHgiIGFHhOMmNnfFoGmMvIiHXzZDdnNZzxoiIBbIihUuDmMBbdXxXcCKkatTAzZFfmCUucTtUuhHCNnjeEoOVIbBjJbBXxYDdXxJjyzZNnVvApPpxXPfFtxXYBbKRrkyTjiQzOoEoOeSsLtTlZqyhxgGOqQTtOSaAskiWwqGlonNTtfVvvVFOLEegaXxAQRrJztTrROoQqZjZzZhHBHhbeXxYQqyxEEexXYYZzyFfDcKkWaAkKwwWOozZIiBuUTtxXoOAHhsSWLCcLlrSssPpSIbBlkYyXOFCcfxXlfFLOoMmuUohHOmMoGCcgSsJWwjDdLlcpCcPidDwcOoCVvLbpPBEebmMSDyYeEdnlcCHhPzZtOozZdDhkKHTWwZzwhHBbtDdinyYNjpPJccZzVvYyChHRrDGkKUuxXUuaDdwQqKuUkLleSsERrRxXnNTxXggGGnNmMSsmpPBGgyYFyiYymMnNeTkKcIiCkKELleLmMgKkcClnFfEeSsdKLmMlkHDdjJuUiPdoOLlBbXsSxbBojcCJmMOCcUxXnaikwMmMhcZYysiIHhRrCcZzxXnNyYbQqAajJUurRQuUutTkKUnaAJsSjXRrpPeHJjoOhYyEoOeEUeOFCLAaRrloOFyoOYfWwwSrRsWwWMiwWQqWwIlLmAaHhRriIOVvQvqQIiotTcCVChKcCsSbBkKkeEFfEePdUwWuDRSiIsCcJAbHhBeFLlfjkKJqVZtiNnPpiNJjnvVxWwSsXpPINnKEyYpPpPjbnNTtaAWfFwBtTvVJrReOoEcOmrNnRuUoUuLlnNcYdDMmcCDdLlAiBOoNnbcCZzbENneIiwWsSDgmMGkKwGgEeHxXhyMzZrMmRmnepoOdDPENIMmiZzYfFVvAnLloONhHaFPKkpHhdjzZJNKkcmMCsSKkLWwKkRrdDlQqHobddDlUuoajWwmhHMXxLLlnTpSsTtPtTtNeSNnsalLAEjBbGgatTAtTJjJDAnNkinmMNrRSsIkRrtZkKzBbMmVQDdqvmMuBWkEeEexXKwwPpzZYydxXyYxmoONcCKkRWNnwZzrljJLCVPpvaAtlLwkKWTcbFfBdrRguUVXdVMLlmvwWVMyeEYmHRuUOcAaCoGoOgyxiBbIXFfuUroAOaAcClLoaeEODdRVvrHCZUuzcDWdoOaAUuDOQquLOolUojJSsxXoGgOxMmiIDpPdGguUIidDIixXlLLlmVvpPHhQPaYyAkKptTXxXjJwLlrRPpCcWwZzqodDPtToOXxPporRMmHdDsSmMsHjJlCxXdyYDzvbBPkKpVvLEekKeEkSPpZzLlOVvHhCcosbBSJmsOoSNnNnPHhKkaVvZzoOoOaAeoOoAIiaUutTgVvGtTOhHGcCxOoexXKjJLlkiJqQjDdtTeqdDzQqAaGgZoOMmDyYdIisnyYnuUNWrTvVgLSsllLGgkCcTtoUugGOKGtCcZzKlLbAXUuWwrRxaexXEUuVqQvBYyYyrRzxXZvNNyYrsSRPpHhChpdDJjPIiKkHhrRHiISswCcWwXgKkcCGxUukaAKkKszfBbDdiICSsbBZzwicCjJIfqQbBFZzBbRrJVDoOdEevjuUyYTtwGBoqQSjJsgGObtDdEeVrfkgGKFUuMmNJjWwHnNtFfTsDdtSsTZxXzWwSYmCcMIiyhnkPpsSOoKNVwWGgvFUuOofSAHhlLaIiuUAVsSvcBbCVQficoOjJVvCBbUKkdDugGjJPkacCAgkMdDmEeLlSsKBbKkXevVEZFfbHheTvpPRjJdGasrRSJjAgTJjoObBUurRcWwNnCMmFQquUvbqQBymMYVsOEeozIiLlZkDSsZzEYyhDuCcxXUOUDduKjJgGzZhHkoddDsSjGzZggJcCSsbrqQReEBPKrRHhkeEpjIioOowWOAaoOkKhHqGiIkKjJdMkjhalLAHaAlLxvaluLljJLlVvrQqrPwWwWzQqXxkwWXxKZtSsTfFuxQqdDfHhFXpPFEembBbEqQeERCcDdxXaAPpsStuBAabGHhgwzZPpxipvVkKeEfoOjtCcFgGFfdnNoOKVvefFEBbHhkNTtKkrAaZzdDrbBRwwWyYMmdBbjbBfMInvVNEeGnNgiIdDDdRrUugxXTtScAaCsuJRrjHhpPUGKZPpzXjXxuWwUcdDCyfFCrRcoORrDQqDdBfSsscCaLliCgGPraivxXFfVIAJjRuUEDdepgGZyYzQNVzZvUkKZPxpPXGgRrpzwKsSlLkMmaalLmMDEelLcCTAuUfcCFoNvVnCcNcbrRSsRTtIiqeEeENnTRrdDkLlJMmjoqhHqQqmMQWBbwEqFaJjIiWwAbzZzCtTgGcqFtTfGgSswWAnhHNhaAHMKbByYKaAJEzmMdEbBeKkcjoOUTgGtuMmJNZznCvvTtQcCqVitFffFyhTtTtpZAdDaXqQxWwCvJzaAQqAauUZwGgWjjJnNDMmDdgEUaAsSaeEMmAubBFRrgGHqlGgLyYNnEiIrBbHhiIKktRrTRNgsIMmMZzmTtnWkKQOohHGgDdbBLlxXqwemjFvgGJjhDiINnHyeKeEmMaAxXhqQQAaqrRHtTMkKLbBlFfFMmfXhLQqzZMmtKSskDiIbBcClLdpPBbWECUuqQceLRrgqVvgGQezDdinJDdNPpRrAVvOoaZefsSsdDMmHGFCcfPsaoOAbBVePIgGYVaAOoAdDDTtdIiavAeeGgGpSscwWCYlLeEyexXIiEPKkeEdDAxRrXaGgsJvxhHHxXllLLhdDPiIUQlLSsqVvflLFVEXsSoJKkUWwukKjwWsNnrRsQqSStjJdDdDFfdcCAsvSsiMmIlLDfFuUIQIicCqtTRCnNcriVHKVvkhZedDERryYyYnNzSqQsTYiHhIXxiqiIgYyoIinQxOoXxiIXVvdDIwWmUuyyYAaJjYGgdDrRSsAZTtzDdaNYyDXxdxgGgcqyYmMlVsSwnNWQTtTtqvnNqQbBqJZziHyYNnCyYIJjBbDdBDdTzZtuldDLjbfrRQjJqFBUNnujmHhcIocVnNdDaAtTvCRrgaAGHhOBbsZoOPiIprRksSKLWwXxIioOdHiIGgLExyYXmOoInNiZzMeGgfFyYIiEgGaAPpVvIYJjbncCNBTtyErRAkKasSeoZzOMUuAmNWwWFAaYyiIfRxBboOQqeqQluUwzZTMmDHhNbBnzZcCHMmhPIsSiAapDNnqQcfXxxNnrRZzXTtCGmRrtKkTMZOKknWyeNdJtlLyYgGEDdsSsYyCciTIgbBgGGstefzZZzZzhIijcrRCTtboDdOQqWwWmMSsuuNkCcDdXxiIHoRMmrENneDdIiVvxUuohHUuOaOolGgYUuyJqQVKkVUGBbgMlLmTtwWWwYyTEdDeaANnNnRrBAavRrVbHhhbBiFZzfIHtMQWwVXqvTtRrVksSjJDRrPMmhnNaApPtAaXxnNqsSKMZcCzYyEjJedDBdDIKtEepPKkQqXxNdDnocGSsgVsmMVveESfUUuuFSvVgGrVvxXvVaFfiaAIkuTtUqQjMmkwRrQqkbBKxZztPbmJSsXpGgHhPnNcJjpdYyDyqTJjeeEdrRJjDXYdDxXAaFxglLfFmRreEvpPuUtBbUusSPfHhydDYfRrXxqVvQKkYsSyMSSssZbBMUuwBRrrRbiuURrRIxQqwpPKvVkWfFEFgGpPlGqyEebUuBqZzWEuUYEQdDqLUhKkHRrXCoOwypPJjOoFfzGgaAAaZuFoYygGGgWDIskKvDdwScGgXwPTwWthjhVAaAakKvnbrRXxysSiUXMmxiIxoOmMweoWyhrBbRVvHYvrcCiIkKZiIwVkKvZDdDCiutTUIoOIicdzkKzZhrRMmAaeQqkKBbSsOFfoVvEoOHGDmMKkdiJjuUUeTtimwWTJoOfSsFjWTtxXwuUuqfFiIQUhmMGgtTHllaAZzpLVOzZHxvhHtTdNnNdPwWLMNnRruUwPpWOogGVvDeEdnNzZkKkMmDdKnqQhFNYwWgGNqcYyZzRLlrpPkKsSLlLaAAaQsSVuVHhvjJUdVvDqHiUpsPpSKkNnyZDdAJjaYyYnZzKYyCcvNneEVwWTtdDkNrRXxaInNuxBOUUuuZSPpsSVHhPpjNnKjqQJuUCtTCcKuFfUNaAxMmgPpDdSEeszZGaAMrqQRvmONdDnpWwNnjJEePvGEewFwZzWjGgcCIiDkKXxmMGgcCZzkKdCcdDGGSobBvNnVKvVVqQUznlLZzZqQCzZvVmMaLlGgCcJjFMmfvVFsoOSuCcyIzvVqQrCcRNQGDRFfYGJkoDdZzjJToNQqSNnsnDpPdqQTNMmvVfFcwWqTtCDdqaAQGgWCctTxXCqeEFfVsSaAULrBblnNmMpxXZOozxXPRrSJfFqZzIiwWnYycClYfFrRSsjJyLRrnNFtCczakYyrkKgGCkKtTcTtQqhwjJjJftYyqQJvVjTTtFOVwWAWwaPbVvyYdDWwrRBoOJjgGRKkUvMmVurhHyYHuUBfySsYyYqrRwWQTtepmMQikZfFzrRIVwWjoOJhHPpuUawzZWbjqQJdiIDBfFAhSgfFYlLLhoHhOZzmMoOgGDyYdpPFKkpPgGuUfkKEJrgGUuCEecRJbCcBEuUevmMSsVJwWCchdpPDYyYtZPpNKIikSslLcCfGqQrRvVQYuUxYpPUUuzHhUuTfFxquRSsdEtlduUDtTMrjJRhHPvJjIaAQqilbwKrRAaFnuUVvNfYhjcCckKcCcbBCaACmEehHgGQqHBbDdhpPHhnNqQHhcCIizZEespPSyYtDIeBOorxBXxbJjXKkYyYegYyyCsHhEeSGkKgXxGdCOOOuUobBbnNBVvxXiIFjJxXjqnNkKOojRrSsJQXxDdrRBRWJjFTyYtfZzTMGqQeEFfNnRrRDPpRrITWwWFdgGDfnBbyYfFBbReEhHfDdUAaJjkKQvVzZcCquyYvzZRrMgsKWNnwkkKvVPpCcAaFcgRYyrGqfZzzZLlGqMPqQmbFxXaJkKjFgDpuUbBXxPdGTyYqWwQBAaUtTucFfCACcSsakLMDdykdDfFUuRkKtTvQsKPRuUcFfkOoPpLlWwmTtiIQqMbIiwWBPCmlLMqQVagGAZzaJsSUQqbXrRTtGOogxrRlJjnNxXBcCaAsSsvgxXGPpVYyqtTxdixzZXGpNmrRMvHhEeVFzgBbGZBbnOgkIQqiKFfgAadDGBcoOEeCbWLlKkwXoRrcFfHhYyfyYFGLIKkBeELNNnbnNBbBbztTZtTnNUuBSslcyYnTtEeNHhRrpmMPxWwXGwWokFYyomWwmxXzZOxdmiTpemCcZzHZzyYetTleELEhjJHsSLlvMneElLBZFaejJxXEKRKkMmAatTrciXMvVUumxByWwYVaArFiIsSSNSSIiPAgAaRrRXKZdApPaNnDkBbIiCZqBwcCWvVcbnrCcHIigMmgGAabRrBLlZdDZzhHzOPmMCccamLTtYyTJjWMGgCcCCDdZkKlLtTvVNNnnzBvYyGgPpPAasdHhcCfFsSXxqQYyOoxrIizZPxXtTdUuDUKkLuRrBbUluUISIisifhHqhHGgWwSDdsDVvwWTrRsStpEcCuxwRwSsYJjndDCuUcCoMmOIeEisSUuiuUfuBbYdDyHhLvJjxXvVVlUoOZOGBhBbHbLsSlBYyLaAlYyizjJRrsLxhHIiXcCxvdDjJVGgSLVCcvAalsxXPsSpBbXeiwxNnXsmMhVvHZpcjjJDPpXEcCexgERkZzKCNFfSAatNnTqQuOoCcUEeEeCcYPwWVvtdrRHhrRDkKVvNnQqoOIaAUuNeDCKGgkcQqAaJjmMKuxXzLGgRrvVvVPHhvVwWMwQrnsFYfFaAbDlDvVtXbBpPFfXxxaATnNuUfFhzbSVFfDCgqfFQpjJLlPynNoMmNNmMwWNQqsSDdnBbnYGSsjJgKOoPQDdsGgSqmMpBbkdDsShTDdtrROJvWwWpSsuUPwZMvVmzGgLlqQduhUuHYWmrfFnNyqQiiIIYkKRaBXTkKNubUWnNycaACCNSjkflLAdnRHhaANnqAxUuXMmaSTtsCcIiKkeEAjJaFBLlQPpgOlLsSrzYyEeeEzfFRRXyVoJjOvYtTPpBYzBDYyhAtGBbMmtTcfFZGfKkWwFWwgzIhZzFBGgxXxUaAiqQRzNLPgGUupBbGglTtcxXxvPGsIaKkmAaiBEBbnNhxBbZLlwLyYllspwWTEmMmMZmjJMKmXDdxvVHhDddkirRfxFfXrDdkkAalLvVUmnNHhCcrMjGnEeNSsgYybfSHhpqQUunNMEiRrIeEeqaAeEpqQGMmgVtTvPzZXdDxpaAPVVZzcCRiIIiryYQqfRcUUIiuohBMmRrfTZgtFvsScqSsgGQQOvBWmzZffFFtiIlEeoOUpPlvVLZjJHhyYxZtiIOotTHaAcPXxpCdcCDzZicCXVvGbhGgZOoHhWoOJjPfFBSoOsfIsSiEeFVWnNKTcCeExliIaAqNTtnPnOvZpAaHyYsSUuCcAVvYBbyaWsSSBbQqshBbgGTNntHiIHJoOjicfFYymMCIhkKuHGgQoOUzvVKbBKAacuUCAANjJvVnzZwMOkKhHnYiSsqsSuUUujHfFhsgGXxGWwOUapcNmMnTtYTtXYwglAagwYWwNBZzblEeLGTtgOrljJLOoxsNnQEslfFSsgRrExaAWwaAMxXPbBHdaPpmMjJeBbZzExXEezHRrNqOKkExrpZzPNoOnSsfFwMUFfCgPpGtEbVIiIkKoOiaAiZzBHnEuiIUxXQdDCbBcezsSZQqfodLlQoOkKdDDdiIyqQIaAkxtiXxaaAATnfFUuNVCctQqzZTnkKyesSOlLFfBbkVVeEXqYyYpkiILEEyYecCAhrRHHhYuQqUyxXFfaNnxXaAHlLBhHbBEqQRrMmetTWwbWwCEtLloKkOtxcCXTpPTecSuUppeEnOoNAaEUueCWDdwckOaysSMuUlskAGgaKXazZIBbHivVIHhtlMqQlGgLFqBbQVCcOhHMmOcLlnslLaASYyNCxtSsUuWCciCcSsmwWnhWkZzYcCWGgwQAaEePcnNaAtTpPNQqRrnUuIOuULlTtJaBJjNRsPBcCIGwNnWCsSGgxoOlDuBbqkKKkHdDgGeNnlLROLoOlXFSIisYynNSsNOjzoSTzZbBQfVaAvFxXiMuUbBOBIiLyfFIqQiiWwAaEFfuUCVLDdlvOOEpPgxXZzcwWeEnNhHCUcCUuAatnKkWwRriINUwlRrLWuwzRrZToOtWZggIiGmJjVvMSaAXiKeEkIxivVQqSLlslLSsQtTqXxtjLNnkKxNnzqQvVOoNxIivlLpdeFfExXDGHdwwWJjWnXgrRGqQlLxTtIiLlhRrMmVNNEeAQqaXBMcCfrWtFfNDdNSscIwDmMsYtDdTACOfFolUDdszHSseEOJevJxXjbGSsgTtSWwHRGglLXFfTtcCaAZKKNnVvEeQsRuvPplLfFTtHhyJjHhEzuUiIZYhSGgYVTaATTuUttfFLluUbZzBCngGUxwxTRrHmfFeEfWwVvrvDEMmuUuLHCwWYyNncJjHhOoRXxvsShHVrQqiICbBPpIpZjOIAaibFpPZtTKGMHhwAiIKsSsQzZliPuGgwjAWyYoOwFIAOoFgxbTHbBhtHhuUIiGTkcXNpPQqnLSsGDagGABbdSsKkNMmnzMNRrzFjJhHfIeEeEGgHhFfZzexLlXNZJrRkQWkiILlFfPCcJQqgFiDSWICaAObSMmsAatHhTaMjJkGbBvDdVgkeEhkLZfzxXnNaAlNnhMVvdFfbBHhgBwWeEbBbUucCWwbBeqQEyPpYFMmFFfhHLVvzZAGzbgGBSQqQvPqJjKAanZzwPIxXUHrRtJjaGgEesSgGIPsztpesSMmgGwWezlLnnNSsogGOTBCqFkKaHhSgGqlLGgNrVxXpbBbbaALgQqOoVCSslLPprgaZzHhgwUEeuDUKeEEekcuUAacwKdDHqQhVvsHmMtThIUWFfwEMdDGXxhZGcFuyAaYdDXVfFnnNmMnNXxpPpPVvAgGfFaNSsWtAapPTAaNqQZznyDPcyYJtUZzhDJIiKkjIifyYFtveCXxuUcCiYyxUuXcBoellNnWPpPpFfnLlNIUWXjikKRrCYycfFjqQkKWaZzQqbHhUalLAbCcBGhKwWkWlLcmMClUuLEeTtVVzBdKwsSWmjlLosSOKkBOogXbzRIYNnNNNHhnWwJHhfunVjJjnNDLlUeEilLSmJAZvVVvzaYzZLlyDdzIFfyVvVCchHgGQqevVEpPnNhrgGWhHwlLQqsDdSYxVvvXxTEbiIBePptlVvajJFfGgskKmlLeDHcCfFhtuknEomHhMmZbdDBtTLsdGqQXWVvwrRxggxXxqQQqXGxXkKInNBazDvVbBtaRrUmNnLiIgGrdjECiyGWLsSmeOuUoluvcCVcthHDMmIgGeRrMmXjYyQMJYyYDwwXxWhjCdFJjrzZpPhHpVvSsfeHhWGgMZzmbBlLHhUeEuHiIRDdqpPQkKliIKkpPQjlLyCmpPcIiUuQqjKwKYykDduUiEgGZpPtpeEPNnTlokRrKmMOyYQBYMZzyAaboOLZKfyYFXSaAmMYHhxXgZzGySgqbBgGoBJjbOkKYyaKfPpOoxXyUuVRrvYQqFmMeEYyWwmrRhivoCcwWOQaHhArRBEKkelLOodDRrgzZiIuBbUNnLfVooOVXxvOvAaRrBbFBbkXqQrKBEOoebkgyYKnNkuUWwGRoOsSTtKmZzAaoGguBNnBbmMVwvVPlgHFZIiSTtwWsxXXxUuWrRvLlUtTfhHUuSsIYReEUurCUPIgIzlLJjZiPwWeETthrUicWwJjFvLGPpDdcCZtTzhHcrcCRCfHhFlLMbtaAgiBDdlGJoOOoEeeVUbBKkMHjYywgQqGWveEpPCGgHWNnATtitTPQkkKKaAmxXdDMgGqRrmMKkprhHXxRCWwBqQdjJMBbiIOoSsCcSgvGgXSstdDTZzqfNnFQeETiuPpPpkyYnElDaPpyYAdsKpfOPpoUuJLludDCyYlxuUXeIhHXTZViIEecCviVvIzZzfZzsUuSNnqLXjJZUuNmMbBiInzxhwWpmXYynSrRxXgyjJYOopPGsaAxMmGQGNOSgeEMOEeEfoTtOlEeWNWwLlaRfMdDwIlLTxyYXBbWcyWAaXuUxszZSaoOAZjJBSkKsgbUuDDNKumYxXmNnLiNnFfIhRvzQZzjBKkbJmOVBbDpPdtTWYKdeEjJuePmMpOoVvDdbJjLlzZFwzlWuUwLnhHpPOomMcAxGLlOLdDsSlkKiZzwiZzTBEeqQbrRPplnSsNLUuBZxOBiIDdoOjJLlugyQgfjiSoBbOmMYeJEejrREZnNCczMJxSsbeEvVaVahHynNuNEeqQWtsSTbIAaYyMXiJjIRryYOoWsOpPPIdRAusEbpEcCrRrjJpPBYPpLUeEtfBbFrRZHoxKsSfFvFBbfVaAmMZzaAbByMtTGgQqZzTiItqMmxnqNXxknjkcCFDdJjVEeAmMbBSsavhvVHUCOoOJZpHlLvVhHHhPpQlLeKQLlqkQOouUkvVEeeESsHQVvZwWEezUVQAQqNlEHlLhewBYSDCUuNUuLlAQqKkBmQAVZWUdDyXxmTtYyRGgTGwWBKkGgHhhKkbBHGgCMkKmHMEemcxXoJxedDEXsSBqQRLlYyMGgmeERkXxzZUvDMnNJjmWwhlphsHAigNnSsRrNUQLcCbBkuHhgGtTUNpVWtKkTwivVIGdrFpWwPnLlMmFgGvVDMmqQdpleEaLlAfFKkwWLxXxXiIzsTYymCyernsBOAaobBRFfayYwwoOvSsSsVWNLYylnNHhFhvksHicpOcaegGHhevxyjjJaaAfPmOcivaqQfhAagGHEiKrRFuuedDfWwHhKVgdDvVUJjlLTtxgJhdDVhHhHyDdYVHhxAVvVDdvafFfFKUuTGRLqQRrMmrzQquUMmzZZkgGvNrRZWxHhXWmGoRraAxXOmMXqQKCfLVvzvVNnpPZlUuhkXukKUZzXbNnnAcdIGioOaAjHhpXxdDRruquUOlLoVTtvTRGRNgGLkKhHJzcUrqQRNcCnDrTsUzLloKmJjThnNPEeptTHUurVedcCMpPHhCcoOAaNMiILlyYOsSjJqQqQfbBMwtpPKjJkWwvVTCcDiIjEwfkWwLiIiNnBSkrkIiEejUqQiKkicTeEdDPPpBbhHpBbGZzgJaAMmUxCcPPlKkLKkjJKkzZUsSCXxhHcbkKmzYpPyCIiWwcZzSsUAkQYqQEfrWcVLlvyVutTUoJpPibSZzQqYdUukGgKKMQoOqaAwRrlLiIGHhkKxjJXXKQNnuUxhyYopUZzZzKIiYyFXxWwfKxXwWqsSuVvUseEMmGqFfGJAaPgxyhHYhquUQWwAAaXfFxEecJyZKkKqQdwxXWPppYCcyPqzbiIunxXfRiJjIebiMmYyABFIizBbEeDdZMoOmfgxTdoBdwcXxgNnxXOhHVynwWVjOBbVIiMmYggOiHhIbntCosSOsSGSsgGgUuIqoCaUuwaAPpWAchWaAgGwHOqsXKyPdHhkKcCDdCiIvxxXEgfmMFaDwWghHMmvrbtJjTINnlIAgGuRrLlUiIMmairxLaQQuUqQZvVzKhtTkVuUuUvKbBUulKXAKuUkaMGgmonZzOoUuXxyYGELlZmMlLWmPUuMmuUAaSiwGzgEwvcLlEeTtCYybZznSsNZiImMwXxWgxNnqQJDnUIbqsWDdqdJffEzZeQqEfCcFpPtKkTkiIUkqrRXywWwxmyYqQCjJBlJtuUoZjuQdlLdzkKEGgqQsmgGgKkZzxXkxlJjKkLXKdsSUuDEqDnUsSfEmtYyfQqmMhfFHCQpEvVeqQMDjhODtaBvVAJjadaQCcqVWwpPsNkKUqQJoOvzZSswWPpOozUijzZyzRQqsAxXQpPhDdDKkfiIFsoUSoCgWwwltreEOoRcCgGweEuUrVfsoVvaoCcONaMmaAFMhepXVnQqiIlLNtlLCvSUuIiskKZUuLqQrgGzuUVvspSalLDPpfFKDdkdrerXWwTMaAmvWtTdDhHwnUuNXJFfjyYIRrDNniIdZzoOXcQqczZxfFXERrheJjAPGgQqmMXLOolUulZzdqQalfGtduUPAUuAWzwWwHULIiluAbBavqQuMmguuNnyYUysqfUGgCUvZRwMmpjvVvKkiAaNmkOVPFQqiUhtTVVvvBbjJGbDwWdwkWIxhyaFIifAGTnwQxXWDfjFVvqFgXxdhHDGrRJjHvknNKkLVvlCpPcBjJrjJRrbBRhHZCkQJjqKtoDdPnCSnNsCcEjzhnYyEeKkNdDIUyFLosSkKOlBsSSKFKkKkVgQqRrMcClCVvhHcozlLXxXOoWwqQuOWwWmtTIiyYyaAPpYuOiepPEIoquUgGuRvVGTFfvSsVxPIirVvVKFMmVCIyZGJlLjwHmMctTldDJDMmFfuMMIHdLemRhHrSsrfYNEjcjHwWWHSGghZznNSsHDvVdWwBIiTuwWDaLlkKyYbBTERgANnaEelLzGghCaZAabBhTtLUGguDFRrGTtgfGzYyZzxgGXZgFfKQnGOoRrqQxXiItMhSIzZNniObvVvVRroRrqaAQBUvVdCtTcjJkKFFpCcCcbBlLPsSHhLnNzNTStPXIWwitCWlLNnweEcrkHhYPqQtTpXcKwFWqQxcCVulOmvDawWAzNcDvVdEWwQPpqWwjnuUIdDiCupUBbRoOrpPPvVpFLRcnLJjlqQTVhHAHfAncCNhHIiaoMmpuUApPaPADrpgwIBbMGgvzZVstTSmAtTivnmuEeZzUbBnDQfFSsqoOHhHHLvVlrOoRbBLSsUuUtThnNLUulMmHkKuGMmPqSwWwqEKkegeEODqYkMmKbjvRrfFYyVfFeFqQfWoOpPjzjPihXiHhPpHhWqdLlDrRKNnXxlvvVCuUcZaADdzUUaAuKkGiwxXYyCcWIuvQiXiEELEekbBzZKaEPZfdrKiIWrxXovVZZAZzxQquULeMjPHRXdqplLPqQQdkgejJxeEyYXYyIJJladTDoOpapEeslTtkmMYatwQqeEbgGgGsSPpbuBgFLOolSwEpRrENEWwteZCczPNnHRrjEeAafFSkKZzESOokUDAfFVvfwAaWIiUPpzgGuAantlHKiLDdnNXFXxfxbBoKdDkOSsHhSTMLURrTtucePRrmMPpoORrhHWwUTkzKRGYqhHQzcChOHkcyoOEjiQqnEegdDNnGOoRjdDpMTwaArSsWWwnzXZzAMmmMaDdxFqbBiIgGlEPpXZzpPDLkKVvlmPpobeaAfNkKDbnISDdYSsnNRrvOoToIZoVvGjxRrwVPpPpmPCAvjJZzAlCcMmYtXZWrVvWzMUIiVVfZzsSFQjJhHqQNRrkKKUOouIijMCcXxtCcrbTtCQqXeIiEDEedstDdHSsfvVTtZyYbHhHdDMTtovNWwPaXoGHyYFlLNjJJjnLlRrJssvVSniINScCEoeRrAWTtoOYKzVvdxRPZSDdsKqQacCcuHhCGgcHHsqiZzIKkJvnNjgUuGFUVvufoiCIBIkKRvVmtlBbeExEqoFUumMJHxcZhHJcdjbBJDwWdDZqsSXLJjuLzMZwGglVqSIimMkOgmQOCRrcCcnLwELltWUuYRuDtLlTsSeakipPYsSvVyIPpKGdVEenNvxhHXXgeECpiIqdDFxLGRraZzEfFeEeTzxQkwaAWsgGhHeCHhpvwYWDdPpuUgGWSsbBwtTwuNnNZzuEJjJNdDVvyVvYneEcaNnAZOBbmMpzXxWkKwOdizMTACuOiIoUQqXoOwyyZzJjUvkZhHpPkVtTnqmAaMyxSffJMmZbBrUuRuUCJjpPPcRXiISnEAaDdednqLlLOMmJnNWIuqqQYuUyZCclLzZfjJoXxORdpPaADQqrUnYxXjkKrAaRJNoOnJdDjyUuPAapXxNuBvzmfMpTfuUiNFNnmxoFBbfOcCDtmMTnmaQRqbrxOgGgGHiIUCcXzqJWvcCBhHfzZpPGqQbqQFLNHhIinNwWbtTxqQuUuUIdrpPRHHhRrRxlXtfFHhlzZxcgGxXGgxKkYqQdDyQxjJjuNnhIodwVfjJfFmYyBPpPoOwVIeEiezpbkBbaALBbWwllCvfSsdZOoJjWuDdUrRvVwlLzyYvYpPjJsSUiIfukuUfFmtTnfKFNZgHnPpvEezcbSHXxhsBihZzByYeHhUeuUVvJTtmyrVkEkbgDdwWfPnNfFppvVluTVLlhDdiIbBDbBqHCcCcKAWwXnCMkKoyjTKsSAtFfZoOziITtNmJQqTnNigkWuUTtwKYeDdECcVXqQdBbhHQsBWXxmMaDdtTSnyYOAQuJzUCweRrmKFrjxrNNfFnndYeEKkrpPlfFfaAxmMXxPCthHwbcCBEKLevGLNTDihkKIvQdnXcaAxXCVtaFleMDoOTtQqxXRpbBPRcQdyYZxFSsnNckwWQTQWwdDAafHnFNyCVvdRrDPWwwZeujJVvwBbWHhkRBVpPVoeEOPpPkKgGrLnLltlLTcCeYyQdgGjqSfBGgVkKTWQEnNuBbHLVvCcVzZJjNZzAkKVvcJjCcvifwIDdivtTAtNndDFwlOolLjJzAbvjNPxXuFYDdyDdrhtojCfFcuUUuoOTIjBbxxXXSbBCciZuxkJkKxNDdDNnbBeEdnRHuUsSbBTthHcPWhHsAaSZzZxAaiqzZfFjJeFxXrnWTtaAIiiScqQuQGgqQDrWwRlyPpYLtTEoBbOpPlLNrDsSdzoWwfEeQDdqsCcSEkeEBjIhHFssapPtTcxXlMhHmRrMmgRrOohHYKFfvlLmEeBnzJVRxTGHkkKKeEqRrSZPzGgGaAgZplIyqAamMVvWdddDDKrpdGCeEeVZWwyYzKrLLrWMLNRzAoOagiIAaGNPdLlKLENsRDGwVVgxXGdAuLlOOnDdLlaUSSssItTmwJVRfcKkCIimMxNnoUhGgSpPjwuceEeaKkrRSscCuUUcZPpSjjQBvFfSLlHtrRrpffZzLoSNACcnNTtagsrRSJPJTVqQvYyCqjJQRAaBblTVvpEetbBwWLHGZzLPvVtThHgGCqLzuJjUOCBbDHhHCaXmDsSMJvVAbqQUHhuQqdDGClLwDEedWOoIYwQbQcuJkmxXMKPUuchHyYhTxTtSsldRrkKDXqQEuMBTpPtJedStTjtTAwWvVLOQZElsSoSbTToJjtTkFYyAaZzOyVvVkdDKJKSCcIYtTzZhDPYTUuBboOcmvzzZmdhHGajteEQWwMmMmpPLJjudlLFfHnTxXzZSbSERrehbKkbdDgGElRKDcxQqXhnBJjQkbvVvqQuFDdfCctHwPSspsSMLxnQboInUAMNnLxPXxbBXTrgTqLluwZzqQWzbDdsSxXMguTjJstTioOdfFDIRAvhWwnGOzioOIJQqJGeEihTtVNnvfFtBbwWLxfFhjJHLFyuHKmjaHozLlZNnaFlLWwrtQybBkKerBbXiIgxXAQYxrRxkOqpPbBCcgedDxWvVhNpBbjJgGfpOoPjUqYjJxhHXtCdvBaAuTzZKpPJkKLFflIatJgGoOrmMRYgGPAJxRlLYrRUuiILpwQqcCgXxLqQvlYEQBTttRroOCOGPpJaAgDWxAmPhnQqNHfFRjEeGBbCQTtqlUuqQhHAaVqQnSsNvxXSsuJjURrMmxJjPWYywlLpFfuUwpLlHeJbBjVyYOokQBjzaABvVGIiSdDTtvVhCqSwrRRRrZzZzonuUNolZymhZqbTtTbBjJVvYyXxoGgzZDdXOhHfFoPwWponlLAUNlJbBjLYXAUuvsSOYypwsLFfNktkKwBbIioKtBtYyhiIkKHKkThLkjJFaAEzZjJlKMmkKXBJjmjJqGzfyWwnAkDaAseEUuTtwWsRcCFiINnjJIrsSLlrakfgGPpnTtMfcnaQygGRIiRWwWcKkflkKLBbYyFQUuqJjgGpPvLlBmFWwpPgGxRKQzuFBcwWRUfePbCcBAquUngGgBVcEiQUuPpDMmyxXYyqpwWiJOoNnwdNVvSLOaEiIqQezeEZHcQoPClLLuUlcuuqQOoVvsUVvRIVvWdDwwgGaAbXxIKyMmYeDOrRDrOyGgYaAuzLlNZzAMmpkasSQqNnAxCcXmycCgkZzKvVAYmwRUuKyqytAaDWCqoNiIKkSsnJoOTXIitrdDRhboDxaAaUuhzfJjQqDDdxhkrbhAaHJjuUGUlVzcMmKIJjiQRrqkdRYQTuZeBMqPvzZOrRMjdSCDEeVCcEEeULeEEwXxGgXhWeiMmIvVbBJjnsSEXpjJeEOocCXpMaAtTmPaQrOkKoRosXbBXxxCjJcmMNWwnlgeLQHcCCeETtcRrPzWwsXHjKkqRGouUOoFSTBbbTtBBjvOormMRDdOoVwSZasqsSJqQNVnMmepXFcCXMdDTHgfFrBJjEQNRrRrhHoOoQCDAaCcdygdRrsCUNwWnXwWxrRoBbiAaIkaYyTyAaZZhHDVmLuUtPpTmVxXLyYlLohmJQqXkziDpLSYAaynNuDdTtVvEeMmDcCNfFJLljZHhAaqQWwLlxLlWneErxgnNoNnsIzdtTjJUEOtFduUwWDyoSshLrPbVvoOEeHhvVyMmYSpzsSZPKiIbBkNnZzLItMzZhUuSsQqHfnLIilYLsmMmYyHhazcmUuswtsKkBbvuUJzKOofFaApEjJgGUBbXxeEuvSdDsxhHqQXVeeELubBjAFTtfaeEgGtEGzQQryWlLwQYoOcyvzZRXxratmdgGDdmMDMFfmAFiXxrRwTtzoshjJHSuuiodDOIyYWAYZudzrqujtTmFlNXxABbzZCcdNnQqgriIGkLlPpzdtjlLPWwkpJjBbawLlUYLzbRTrtTxiPoVGgWrRlndDNEMDRrEpSauLwYcCyWyYtjJTiKkIPpAOokSsKHMmwtkKoMvWUulLMmeEnNevMGCeYsSJjPqNDdnKkGwWakJPdhbzIZzFIiMXLlhhNmkCVvZMBEcCvaQXhHKBzpDJmcCMmMaAHhZLsShMmrkKRuHhRChNnHsxMJcwWDdFUuPpJWwHyYGqjzZnNcWPlgtXxjNSjfNcCjJnPklMXGgkEsSeKSdvVmMDrPiItTpDqQAAagPHxXqCcALlZTtkEGnOaqzHxXsEeSUMmRrzZgGMmQqdbrsIzcbBClaAHggpEsdDqQwWSHSRraADXHhhHsZpPndDdDllvHEhHehVMzcCkKZcMJiIAFPpxAaeUlBbbBzVcatHhpgihRwDhHrjJcmTvlMNCQqwmXxMTPpEdCqQcQrXxPQoOqpDlGgLkKIiXkvasSAVKhNxNnjzWwnNZVvLgGHhlzTULoQqJbedDZZyHhAPVvVnYxYSOeCPJdDdDpEWwenrRQGxXMOoZziCcIsaAIfBHhkrRSsYyhHCMzeAaeRvVqRGNnuJjUgrQFlLOWTHhjJuvVGSpDdYZIiXntTNcCAtTrRwikKiwWIzdDZqLZQqvVvIimRCQqnNqaZzgEzAhHcCkGIiaDdNNnmMSsmMrkpPcCKdfWZYZRrsFfwSFpAuvWRYNbCMgGmKIXFfkEXJTXFPUNzkaZzAKeLEdDPpVUKrKmMgpVuUnNpaeEgGzQYLloOpPpghFftaZFfVKapWPpwijYyJdZztXywWYxjSspPCAaJWSxcPpCXlLUhHuJVcsSCBXUuWUlLhQLlUTtOZODdLdwLhxnDCcdVXwlLoaoCtNHhKsSDdkKRykqvQqWUuUuyclfFLlFACzLtTlWKZpSHbaInbUurSsUuxCcXRJFJlRrLhigFmJYhHdvXlVliIvbHvaAdeXFfGhKWNpPnpPNttTttITtwWijeYysxXLGPvImmtnNDdTLimyLuSptqfFkIYKPMEWUApPaLRoYTHfFIMGgMyjPprJPpiyvVtFfTXxrRjhloOrkPpUdyqQsETLlqTrJjLQqvosSyYHhWYFCiaPfWwgGZzFpAIwPdOPhgUuXKkxbOpPuQAaqFQbBzZqUgMmBUrRxsSwlLUuTttHhTHOGgFGgfnRaAeEnqgGlsSPKCckYyVxXXcdDCxQqvpqQZftWhnSsWDtAlLaTgOoxnxVlurzZCcsSvhHVaApPmuzZuuUrHwXHPFlOzoJSufFPHAaiZZUWoOvMpcYwWOCUmMuqzbBZWJYyBbjaAzZpreEuUoeyKkcCSeEcmMFslLYykjJKWQyYBnpMOvlLFOrznEYPyrkwJuUjQhEhqSspPNnKfdksLaAVJfFWbUSDJJdNJoOTNxdTtEvVBXhTtwbeXkKPpuUYVNNnDYxUuoFyYMGVvQqOSOFWtORAaYqQfRXxrHhoOYYyOhrMKkSmMjJFdFfnBhynqmMiXYQqyxAouRnLxvVNnPSEOiZiIcBILKBbkLyYBdZzDDSkKHhHygvUltuUxTtCCcKXnOdIwWONnJyMOKPNlxZzpwdDwfSAHuUhCXxtTJsZrkbBjJxlRrUjJPlIjBbJxXMmjJizZRrETtUaAfFJjAJLvVFfVAuUbNnSAOENGToFfuhHgDVYyYmMaKkeQbdzZGgPIrbsmeEpPMMmLoOomxuWJNnFfcoYsSgGyxHhCjJttTxwowRmMzZrTJbBDlNVsiZOoAXJjKOOonIyYiwWRyYIaupGOPTWfjqQBJbBjKiICFfdHGzFNnssSCdthKSoyIUSUurhebMDdTtINnAsSsmaAQaGQqgAiCqdXZGsSUcHhItTkKKqpLszXgGxYlcCGEesvUHVyRaArPCAwwWKfgMnsiIXxQqmMUubtSOPVSZGXxgwPpWMzhMmqQbZzuUbTtYmWwMydtzFvVxXflTJvttTTPpDNThHIhJjHTzpcfojHAvbCBqCFIjJipPiGKAKkaSskgYoOuYeQhHCcSWTmnIZyhHainyGgZqQqQeVXfAzChHcZyYwDdZiIWwzOkIHyYnkkYdmhGPxVQXxqJjMmJjlSvHhJSFtNnWKEejfyYFAjJaWJMdgGDHpUWOocBbhPRYyZDafMTtAHuBWyNMlLfFepPsSbQqdDLADQPBrJjsxcVvlLOeEoxkWeEVJjvVMxXEVOhqQDdFamhHFXbPmRrsSSVYZFEeONnoQZeZgSsOodzKTtTmMpwWApMIurMHheKOEoOefFokEHHhPpAeEVvOuPRoYLIkKiQNgFnNKwMDdRNfFRrcKZhUiIUTgJNLxpnjJrKkjJiGkJbBzZMmjkKocCOgGNNLzZlXYLPoOANcGbWKhoRPprSZaAzLlzZuexmMVNnsLlSMmaBbFfAvXEvNhgbTkQPaAhnCcNnOoNcwnqyYkcAIGjcbRrMmdvaOFfogvuqrsdxywKLCCcVvFfMwMdLCcPaHboaAXIOWpPJjIDdQyxZvViMZzPpkRNnwbBRXLGgXzZHhqhUbJVvtTsSGIfFLdQuUqFfzTZJnNjzrRGgtHVRrFwJyFpPeWzZfcZMmEYztWlLvwWrlafPRouUOKVGpZznNPeJwbATyAadLRRWmFfMWTFgGqQERYyitBbgJjSRICQJAawWjwWORYsgReQSsnNqxYxXLlSKksObBVaAdfFDOowoOxfHhXxFUsZgtzZTgIyPrRUuFpPAafpyMsSrJphVbBwPIYQqmDvaDZpMmMnNmzZLJaCDQbzZpPWXWGgwXVRVMAasOFynRreBbPQqfZvgjiIJOoaAhTtaAKAakyoNnOBbIiJjVvVuVElcSsCmdDYyhuaysKmbDqQmMVFfTtGgXxnNodHhiqkiMmYRmMkbIiqLaUhiyYmXBbgGPwtTqYyQWpwWYyLlYbfkeiHIsSsSyLlVvVGmMXeQkHMGgGaAkvVWworZpPzmnSCFbAExaAuNzetvVTDmEWJoqmMhHYcCrcymTNDJroZfArRzZecaRrcCVkKzaLwAqAaQNlVvykDqQqlLlQxikzTwPNBbXxUuxXnprRWtnfXxDhaFaQqCHhDCctBeEknLnBhRrMzZiqQInLlHVmMoEeSsCzGLHOADuUkVvcCBbEhhQqHMvVTOvVRIEsjCcgGrEDvVdMmPpKJLuLBCJjcfTtsTUZUVdnUAgpcCPGcCaTYSsgGXInUueFzCVVtcCcZJyKaAdYYvAajmOEWTFEeJjfdhHMyZvVzWMvVmWTgbLlqQfcJhcJjFfCBbwWFDdvKBbKkkFFfDlLdfvVJdLkAtZzTbchHCcEWpibgWIYyjobBKtpUuxXZzPOadpPpPzZbSaMwEgaAWDUPpusVIQqiBaAlCUFRSCcUtVXxrRBbLlvICEnTUHhhsAavVSHctzVvZDaVvYyiMfjSsJFtTasOoSKkbPpUrLuHCchFvKNnCNnFdDGBhvVZlzZLzHbpPgfcNnkAaPpVfUlRubBBPMmZzpAfFmIUuVvYyjJAdxuUXTCyGgYutNeceEiTusrfdDucLbvSFfdwGeWmAGSsgsBDAoTkOsSJVLlvZIiziJjyYwGBIPlLweCBaKlDRrjVDdMbBPpmfHuUjCFqQBGtzZwmMwYmDnNtweoMJVyyDmNnMlLkYjXkKxzCGgTvvcZsStTfEbBNixSswWFfytuNDvuvVmVvMzFfBbuGgtLlSJjFblcCUKenMmNjJTtEkgGljbpPBkDdeRJSeirotmasSAqgGQHeKdaTtohVvoOlgRrZMmYycOvhNBbmHbNcClNKMmkKJrRjbnNTdjJcAfiIAHdFNFDhHdfZKvuUrRVIXDdqLQdKYLnSsaTtWlATmMtZvACEaFzORjdntfFMYCRQqyQEeOmGgMjwePpMdtEeTEZnUXeaBfcsNMROKgmhKqMmExGgQaAoOJjqgvYihIEhOoHKbBfFFByftTFWwxMIqQLlHuAlnNQBKryIKQIDOAavdBMkSIxXiYAUHMLhsMmSHUbfFBuevUvOoUVvuLloOYlLcCHlsRrLlSLGVzFpwWEvVNYcCfCcoSmvrvxFfWwgXxGxwCcBqdVvcAbBjloOPzdAVdcCMmyYMyiQqpWvHPjRlLmYmMsSyfPpFYYiGnDdNGzSuXWvoyXEraAGPpSyroqcQlLqirsGfFTRrTtIOorefEFfeMmtwwrrlDxXYtayAaYBWRrjZzEVZzvpPgvCckiIrpFALRVwWwTZyezOowWQqCFwEfYjWfSsSsvhJjZQAdDaqDligsSgGBbXxjBuHQxlxrWrKmIchHMmCtTzXYqiuUpPPpwnNoZzixOBhApNnNpPnlDmWmBbBbclkWYXDSRQUuhHUVZzGAVDBCJgiaCKQNWCHpqKtHhBGHBbnYmrRMyVUBbOzZoJiywWYIEejspPYyOHZvVzkwBgCnaplyxnngGKgICcRFWwfNYyQqPXlnjGtuuHlLaAzkPpCnrmWkfGnqlyOrRCcrHhpUYyoaQqpPhmRMmUimPIiaoOtTPtgGkSsZMxXmWwDGzEzqpPfzyvkpPuUKsnDdLlNMdDwWpBxfhHMAeEfHovebBPQqpmkKDdxXnNvwKXCXSTtRbpMmZEezqdaCclgGmMvVBEmnYtTwbUhaKkmFAdzrMmpHCXxwuiFfIPSRrFfsxXhmjwJPpYykLlyYwTucCUfsjVsLBbvkKXpgHMDLliIyKGgKNhiKoWDdVvxXdDyYaFxvwWEiLlIQqwWztTYNIAYzaAiNnNMMmYytwsZzoOqEyUyIfcQbzZcBVahJOFCsSPZtitndVjzZtLWwZTDrRBBUuYyXxZzHZaAmODdSsozEeWJjwsTtsSvppPosTBrRSEeNmGFkWacpYmMCcvhAaumMVdDSgLSsyXxQqQqZSlOoKkPewWEQkiCugzxDQcIagLlGAlLnNpPqMSaelLWgGwEimBEHRUusuiYONpPPpnskHTDVvcSfZghDJjckbJjCcJFoOwqQtpofFgPUAirvSsVrRNMmokxazrgGRISvnLdjtWOWXxQqXTczZQqXTTttWwOCjPpwUeEXMOlmMmMmMIiSBNnRiHhpDBqEAyQCcqvdSseEmCcMtTGgGUOtEegneoasBavljauewWLplPpLXxuLQqXKRzSfFUujctTXxasFWdDZzjJdDWPXLnCcpkomYjowWinNDlLoNxBkKPnNpbkcXTLuuUVGTtYiIhsdbllibCYyzIoTtespDdXlNrUOkKgGaEeIpPQKkNYHNsSnbDdNDbBfsmRHoyofFOFqQyroTwEefosoKkgmNlLndDvVeEfOrqQRXydnvyxmMEBjJWcCzZHxbuUWwenNDXntjnMYymDjOojdqQEesuogGUuOBwPpjvlSYyKDFiIkQHeHqSsHhWKRYpEeyeNZRofDdEGgeVomPZzeENrRbVvBbqkKwcCSfkKCsdDYGgEORPwQcoyAaCPfFmVwOMmouJmMjzzIXxRrbJjBfFhpUSssjnNOQqZoLfphMmxWhRUJrRjvVsLlSUMJjGgzZRULvXNXGdwxXNHwTFzkKEeLQNrmMNohGgWQqXSsubGufUkKoBzZbBGHpoyYDpWjJZzcfSsywOVVvlfgjJGyzEzZeZYFHhRtQteSDdFfYDuKRjJLHJWMmwbBYIjRyYJYmbBEemqQiIkKihtZzyOrluOowehHmpkyiKmMmMwWQTiIPsUlYBbMIlMMpPOoiVpglSTtEJTTTndaADwkeEHgxdDEYyMmDVhBVLvbBLxQqVDyGgjMfGIHTtjfHhAajUuOoBNzZZzdDbBiWwyYLlAgGBhsCcBbDQYxXyqdPzkwaAIiRrBZzbFfoOZcCcafBbLnNCYwHhVQKYroOkOolLnEeTcOAOWxXxvNIiXRrHlWUuSsDlozouqsSHuwxbvjTtsdDZGgzwpHhPjcJTDIVBbvPAkvzATHGPhHyqZJjAPGgvPGkRjJjgGeEJkuvCceUWwulEZnPpupfxFcCftjxeKxikLGSoOsglaALlcBnyFPpqfFQfrlXHhxLEewVjJwWNnUsSyYaPrFfRfsWcCSzyzwlLFDcRrNVtTvfFnCRlLnAgXxKaZenOxXodDmxXkTtKMNGAQcrMVPpxXOozlQkKtTZzBbiIIMmKkWauUAzZPpaYyTnNtxRKkqQrzPhHpyJjhHPszZgUTttwoqQfYyrEOoEWwZFfmceEKLlbFWwizZSsShHmgqqQPpNPGgjpcEBbosyXyNoOFfvpaNnYvVwWzzVqQvEBwiIWjOhHlutOoWwqQZJXnHXxPpxQqdmMdDRhHqDetWcnmLGgLhHlVFflLeEtMCRdWrHIGPTNnACvZxXhHZzLuEXfajIimCmLLuUNzSVvxdFfshTteobBOHhPGyYGhnNuULZJYyjiSRBDuQvVqhZQsSAoNgeKzaQhDdpvVGJbBjeElLaYydhHmMRkKsxmLKpNnFJzZsnJPpTGLpDdwFfoOCJQghEejKkfNnSsChHtTjmoOXSbBcrUVvHJjlzaAjdPZqQbjJkKkxqAVoOebmzcKMnfFHHGgxmfiZBHdDDpjKAgoOQpyEwWcgmVEuUwXxgGVCcmOQIikKqTSsWqQoOhalUAsPedmksSKeLwvOpIOoXRtrBZRruUlyuJjWAPKplLJTDZeEKgRZzGDanmMLfmMMJUQKeEzZknNbBNnRZDUzyJjawlLUUOZWIDxXdfUjJwWuMzHhZmaEeMTObBoOopPEeAPpVYCoOyqYHhRSsbBqXxqLlZgeTAauUKUOxFfXouBbRrkUgGuJBbUDdlzZeEPbDdZzvVBmMkZjFfVeQqaALsSrRlrRSTWZzSMCZAOokKMSlMmRrIiyNFsSmTilUuvVssZzSBpRlHOYPpkKfToeuDZPpiSaAOgGGXRNwXMmqRpPUuUurQAazHhqQdHhDNnndUAaoORraSsAslPyYdkKMmIZKxjNnMHOZzlvheNnEHMjJUulMvpsSPEedwWhcCHVvDdzDdzYtAKuyYUOxXnnCfFcNNucpPSRrDSsGYcqOnqebRzZGaAhtmmMFfxpPdhwWzZmFfMHKkDfxPEgGdDNvRroOwWEeUunjQDdSAZzzsiIWSmMsJboOtsOkKofOfFgRsSrrQJBbhBbxOPpoSZpPphnIiNqlEGMmLpaAPIiSOJjqAlLLlxSsHhnQlLqNGgPJjxeNatTApPWwEwyYHzZxWeluzZeRPprvcCdcsDJeyYEmoVmMpZPpzQmbEzUtqyrDVjJvCZZzvyYLfFugBRKZzzZIiHXhHDddFUuZHAPpUnNjJuXdOBNnHTxtWEewjOfFQdDcwgGdTYnNQYZzAaUukrWQqMyzYiIyZaGYMKPaUlufFULunZVvUoRbBdodpPEyUpPuaAYkiBWuUirnyyYYkKNqQuqQSUeEUUupOsSqCVJjmMvQQqLlqhAolsnDWaAjOaACcoIPQFMmfTtvhHVYdGgqIefFCvfOoCFOofcqQyYFbGNQapcCEFMmGgurCbWcCwfUZyYqrRkrXeEfMHhbVyYCQqwrrQqYqANqQCFmGgCcNFKARwWxXRfFijJfrSsSTtzZnNSHhdKhHaeENYTtFZgAaQMbxFsCcSfqQkRrXPpxLevViIfVvKlIiHcCbSvVsTkOWwHCPpchWcCTKnlSWPorRcCVaxynuaNOxOzZDdaAAcCaHhtBQzHMYTtzLOOrgGbBWsQcHLlsKWwkgvVbxXZJPpbqKvNnEYPpkKyhPWQqXnNLzZjJcgJrpMafFVvXxgGXwdGGgjgYcCyochHTbqeyxXLVlGaAWPlyrXjSsSsapyjTAiVvUujMmkBbIiFftUAawWiIJjwWbJCcjVDnNcTyQuJFPnHwXYyEGQoKXXyqaGTtBzZbxRFfEsSYqiIfFjJTRsSfWwAlLdDGgOhAMmdDJMvVkhUYRrflXleEwSsWTHIgjBbSsjYyZoVvgNwVvWmMQqCcHVpParStUGmBiIIiZUQtGRtxwWpXQqlBLlbmadDuNiOBqNXlmbBpPWhAaqQTUVBKqoObNYyHMmCdkIirLFfUueSshSQqsHBBHsPpBstqQNhXxDUlMmrRqnNTJAghHDnNqQMZEScCseVMCtyTtptTdscCSlGgUuLHIiyPhHqZzqQQpiskjYyuUvYofkKvaeEaUuAAVKOroORHhtkKtBsOxXfFLWwezqvVoFBaoMmVTtvOAbRrflaJsDEjbmUexdCcOoDRPprLXtHGgCpjGLlgUwWCqBqWyicgkKOoBaIijwOoWmdMxTEtAchdfFRrcJjoZeElEZzKkeQHhcCfFcmMZzjJpRrlAYyaghpPlBbTPQqpgGPyYtLPpqQrkKciIAuUatjpBXxbOojGnsgGOjJliFFYyffIFFPRThsVbwWAFsSOofaqFEeXxfEeJJszCxqYymMQXSsJjVvuuUcUuQqCeEmMAgaAGEdDCSsBbUWJsHHHNnhhuMmaAOHhjJXFfFrvjyYQquUaAWMhHUuiybBYuANozZomMUUuaMmDvSXPpAlLEeaxsvWgdrSneEfFMmYyelkDxXpnZrZmMSLlsznuiIUlQqmCcwgGRSslldDfFnNRkHhvEcgDPRRrkDTtOrRoYywLzZlQYSsieELYyzsQhgtlLXrtTvjZNbMlLVFMmfZWwzgGkyGuURrLStTsCRyYbSsgGBrAdaADScHBcCbhvVAauUbkKBCwWSfQMmqiJkKbTtKevVpPKkFoOOZnNOoRnelIiwWLdqUCsIlLyYwoONIZziRfEzYySsZQIXzEemoOMwBbpHhEeCvVYyhJjrXtbBTUujKXUzIBpPbsJitvvVVCcJOTHQqfFRfZzXtiITxUMmpnJVBaeEUuZuUeJjELWfZzNztcCTZnTLlaVWFIVPpCanvlhhHUeUuEePpqwtvbbBFgGshHQJHhcCkKDIwWSdviIVVvDsinKkNqErHhRNlRBbpvvbrKUEzWbMmBvkKVpcEeYnfNGghUUuuFEedDNnjYyJbBqtqKvVCaKkAfqcCQVvqQXzDqCwWrrVhHaArRvcCdmEQqLbBKkHhHhfAZhHzTvxKkNDqGPpgViJjHIdtBzZbndDllLcCgUuVEJjSAaslkKaAeEkeUJNnjuEeWmMTcpiINngGXFYyLfFRyDlLHfFhRXJRfkMEWiIUumMcukKkQqKZjUqaoNsAXxwPpbSqDUuzZVvxvyGnNIQqtjMnTaktJYOmcNxazZkhvVYyQdmHhHrUuRhMgGPpDdHvMUumtULPrRFGTXxtTtBKLlzZeKvRYMTfFDnNUudoOtjIiuUNyYtTnvVEufFHhEbYYyPpyHIjCZzMtTmcuUJwWCBbqQZVNhhHGznfkFNdMmdDDuDdUMKUFnNuLlyVCcdDEpPeDyYFVLlcLJjzZUuZzuUHhwWZzKBeEPuUZUuEvWpbMFVvvWhHFflLDrROYyiQqHLlUgGJXqQqXCbTtrRBXuUEQqeADdLlaLLlTxLXpDDddWwPyhQqHYrhDiiIODdoXlLBnlTtfFfBgzZUuFRrwWFfbZzVDdwjQZONnQqoxuhzZoXRBQrqAMYyNdUUuuXbBMfnCShHscIFxXzZynNKkFwWfuUtTXxYtRrPmGgFkKMZVbFzQekKEUiwlLjolQNjJDNsxwWrCpgFfGPtTpczZziIjFFsXYmMQQqNvKzKVuyYUueEYYWxuUcatmZIDaAoYyZPomMzCNQeRrqQEqnjeUxXiInaAUVyYvyjJBkKbWVPDvkKVdVXxvcZzErRaASCcKqVvXnNZFiIFfftJkKjxXAUuggGlXfQyYGgPcGdDxDgAEzZMmMmdUrywTcCFfSsegGiIWzZlNeEbBCcoqMGoRrKiIsQvsSLWzmTGgtZOoEelUlxtTsSRrQzsSCjmTtMzCXyYhTtjThHtsSfrRrROQDdeJjMmGgXmMLThlLHMaAribicIrROhHMOoGgPcCCcpmJVjQAYyLxXlacCShsShUCSsAkzprXDZZzkywqQbBaEUuOeVkKvbIiBjBcCbfhTtLlFfgYyJRYoCcCOoTtYycOyrkGiIAagKjfFOAaxApnVOmhaABKkzZzGgiIsaYyASFAahTSDfFPpkKDddmMxpPcbBBtTmMRTmJNnkfFnqvvuCcwWmZwkKkKRwzxcCxXTyLzZaVcCalLpPcpMSsvWXJgPpOziOwWtOoKnNkVfFyIyYisiNBdYqQyxXUunFnNEtTcCBuEeLlUPpOpPMEedoOxUuFfeLQfZNwRWtKkmcCAHEehacCPJrNIVvJeYCKhoHZyKkKkjJgaArkZeEKrRtuKkpEfFmuxXCcUMCjJlmUutscCYyOoSsQqIiOmMlLoFfYylIkhLKaAkTvzZVqQNEeWwsSUZLlSsHdDhuFasSpPduKNnsekKsDdJhpEKkThHeHhneBbPXxeTaAtWsWLldDTtwfGoOeEbUBBwWuUuUXxHhoTtOWTAyMmZHhzKLSPAPdgGtDzZAXxLjjiELlOoMmGKDDxrhHWwWwJvjOoJaAVjhpJmNnEcdDBbChHOoQqYyuHhUlQqXazzOJYyjRZzzZwkRDFxXzpeArRBsYIiySblXxeeIxIqVvVaHhARrUgvVuIhHaALliVYyLTIihRrHtkJjQwIxHITtpJpwWPZSuUsJjJZaDZzDddAzwiIEgGJRPprByWwAaZaAzQdBhHFffFMmboMljJLmGWwEFfeQWHhsQsSAapgllLvVXxdDhhdNMoOmMNVIaoOnNiWGPRdYyaSsUlLrDYGgylLzZdRuhHOAKkaWwFfFhaAUuDdaPwWvVpvPptdfCcFDfFNCrlfKkgYyLpPlGUusSHhqQuPUcOogGNJeCyYnZaSsFdDfTtAdgGIiVMoLlLpbBPUvVvMxXmMmkKXaNnrRKkAwdDfYcCLlfFEeyWkLlmcCMCxGhHgyKdHhDRBbTrRxeEppPTstnZAalffEeFfDubOBosIisSavVAHNnmTbBgNqgcCGkEeyYTtuUnYXxeEfFyNHhoOdlHzZzgGAcNnHGgZGretQqAdcClLUkKtbMXxmkKshvVwSshJCnNJtTenyFRMNnElDhWwimhHQqvVjJmUFgGfSsdjLChWjJgzYijlLJEecvfkvRQlSsDdLqpXtgrGgUQUyYMwcCoUxZOLmGGgvTtfFfpPksbfYqQuiHZJeAacNpRrOTuUczYhHybCcFfjpPPpJKVyYGghrXxRfuUQyYiIfOoJFdwqWmgGMNtgYHXiwKWkDUudKqyYQBMmgGvhHVYFfRrhHzqQZyIiggGHwWuSpQqPsIfpvoicsSpPCIpPKMnIVIivVJIiPWrzVujJcuFgGNnQSYUGUQqVQqhWWwZwauUapDpPTNngFSsLlLAfFcCRrZztTDLxiIdDpaEKkHeCEefFCxbBiRrxoOVuUttTxYyRERbBMVvmqQGgXxRrAsLlbBPSjJZRVwWvlwDdWzAaVVvzZKkcHhnNTvxPEuUepPEHhHnNmfKSlLsYykALaAaAlnAEeuUOslLSVvSFfDdFvRWSsqiIQdDSsTaALWGcOsuOSdHqaCcSrOoZYpPLlJGgwWWwIuKkYyZnNWwVgGpPJjiIjungyYmMGhHSviIVTtvALlDbATdKkXxqnNQoHJdmPFpPfOoqcFTMbBeFumMCcNdRrIieEpPQtTeiIzZGMSMlLmeuUZDDdesHhSEDqUJSszOXxTjLSsbLHKuUkhlcqQMXgGWwmMjJHhuUWhHYxMmQVvIicKMjiIJmkAaCKxXuKQqcwWCeQqFFjDQwSQBtFfBbTiuRrUueEXxNncCXxNKkPTtpsRrwWScCYydjXGzBVWeGgGZgCcWIsQZzqDrGgRdTxXHhEetpYyYyMwNnEevVzebZzBgGXxgEetTyYBblLNOVvVLlvxkSsoOLGgoKBbkOHfFIOoinNiIkezZkKERwWMmVvpPeErqPpqqQAlXRLtTinNcCBRJjVIiGdIiAGecCXVcyYFfJjDpYkxSjJnNtTQQicYQqVvyDxXdTNBLloGGyvoOpPvVoJvNlNnLGgIiwBbWYvoGkKpPCWDbODjJtiIJjXGtpPvVTrRbauUIBErFNThHPuFEeiIfUPppgRrGPptSsUIZzFfiDPpWwQqdaAKqQkAaVveElLBUuZFfQpPoODgaAgGGkHhrRtTzvVYXxXZzxuUrRCcjCaHCuUcQtTUuqTtXGpAajgQgSQxXkJjArRakuPwWOHjJFfhHXjYyUuJqkxgWmGiIgkZzdDDysBIjDdOvYOoJjZzYKkJjyCcCwRFeyqKyYauAazZZMyYBupjTtbBTtJpvVXuwWZwWzjGgxXZzGgPItTPpiptWwuUCxXIaegGEAyYzSHhbBsZHhIwWuJKRugHhGUDdgXxGGNngpPfFiIdDKcQqGgCvVsPpboODsSMmdDlLdIlKFWeJOoddDWmFnNEIRrieouUHhgGfVvGgLlYyAaFgGYxXJYQqyjymLlPpJjnBYhHybDTtdvVtTvVcCIiqbBQmDEvRaAtdDMkOZuoOStRdiIuCZjlRrUvVuPprRnNnrgrtVvCcQCXxcUPnNYyJIPpgiDCdDaYyNCcBGgxxSBbsKHFckYhHyEpPQqexdFfDGgEeKkgMwwznVKRlFfvVExRYyrdDoOGgtTiLbBlIXergvVtwWHhkIirHhRXvhHvMmHjGXYuUNnyuGvsSWwrRkFnNEfFUUkKBbmMfkIeFAVIsSuUcCRrCbgGhHBuUqQoMrRpFRrAJfFYtTXVpPhHEEACniINoPCIDdhSsSKVHzZfJjqQKknyYmSsMWANaAnhHrbSAarRNREvVYLlqQcPpiIMHVvhtMmRrTtSAaZlvVLPfOoNfRtWwyZSszYTcCDVvbBYoOyKkgvPnaLlAKlqdDunGIahnNSDdHXxPLHIidSsVurRKmMrrbjeEOChTtcbwWgtrMYuwzvuUHhaqMIibQqaaAncdsybWLwWnVaqvxXuiIqhMJjmKKkJjqtXxTEqhPZzgqeEQGzjocCuUcrRKJjkuTuUtRrfHhKJqQLlrRNRXxrRrLlKqQFfnQoOZzPXxoOfTtFgGpNjJXVvQeEmXDGgdaAeEeyYExYkIXxyYeEiXOkKhzLZztTNnleETqQuloOyZzbeERQqePBpPlLelLSULlZzarDGejEUNnoXxWwOugiGgFfpBboSIikKwWwxmiBOlLiIVvXGgxouUwnUYWwtTmtTMAqQvoBbFWwfogGIXhnNHxiOOABZzXjmyswVvWGgIJaAPpFbBGqYGUbnNoXzbxXtcCvVvVIPpzZWJHhjIfFaELleAhHLxWYywXVvPplHhogxXOoCcXaCNZWfBMmEUIhHihHDkywQrRqvoyYMqZVrHlMFfyMUknddBGVvbzrRwkTtKYCiIwLTtlKktirREeHhgGWmFrAxZzAalLXoOnwLSdDIisKkFlLeomGsowzZWpFfPngqBbgXNxMPHaASshHvvVVRsSrhHlQFWeEwtSzVvCcZJgxXGGgVvjoOsxFfHhicAaCFfELPkKpcqyRrYQUjAaFbBPkSzZLeZNbBnzNIihHwWoSsATWPpmMwtaDFfZzMmMmdOKVvrnNRhHUItxYyoOVGsIVvBcCbiyYvVOomDYybcGoVvOghHPmMpIzZmuUMawhcVpPJhQqXtTxZzmdDnNCTtcuIcCibBvEEejgLbBGgbIGbbBBTKkFfBiIXvVKVvYykxmglVfCeEipNnPrRIzZcCpPNnINniIuoOSsRWwlGgLHpGipucyiYyFQquCxXcVXxGgwIdDiKLVvlFfkftTFEezfhBbGxXLJjpWvblLGgUOhHPpoOZzMkEbBexWwKLjJlNnfrRWQXxqEDdefaAFwFlzZGjBbJRrmMNntPpTtTbqDnNdxFfXdDVIHqQrvVRMkBbszZwWJGgVFfvjSAaaAJjBbAQGfFQqMmsUuEdDesxgGOobBZXxzkzlxXBTtYIimjJyeEbJZzsSjqJjhHcCLzeGgIvVqQWkvVJoOCjJCcSsUuQqMuRrgHfFqQRrhGUcYKkuZzzZQqJjUJDdlLkKqLrhYyluyYULYywHhtTbBElLYyaAnNFOotgGObBoTKkPRrOpPotTkXxKRfLlFfDWwcJOqRrQoHdxXDWlLqQDXxddyjmQqqQYyYyqJMmxCcdoODVvbBlLFfIiuUEYyoOpPwrRIiWJjidHhTCULcbBCxXEMlwgYqumMBbpPYyUQIInNiMZzmsSegGeEvVEceRrqQPpJDRlMuATGTCyYcWwzZtgdjJZAbiSsCiIcdDDSlzsSMOeNKUTTkKEetzZLlUudFIifTttcCTEeyYEBbMIiPpSpPALjJVXyRHpPvYioOZNnvhHVRrjMsItTudFfJjJvdDNUlLFjnUDdunyiMmcCrWwBdtTDbZBxCcGbJomMhHOMkbmMBVAavBbDbZoORsSrwWqQvUgGubBqQztTZMmSsvYyFfwUuHghkKHuBAjJwXxJIJvVxPpwPpKlZzLLlkuiCciNnIwNnLLEObCIcENnVTyYdoOnNIRriHuTjCDdpzuUZJjdYDBbdLlwvQqDdmMxUgGfCgzHrRgmePrRpuKkigGSQqQqkWCjJrNPpZznRBbYyCSsudWGmMzZAGRQqcvGmMLlldDBBUQquPvfFRnQsAnNfqQQMmcgpPGbtyWwMmYNkKiIQyYcLbBlCqvVZEEsSZzPTZSJjVcCvpleEZzLisSAEhHeThRrrRWwjoOLlNnJuiKvVkpWNkQMmEeHhpVUuqQqsRKCckrGgoOZbnNwWBpPgOJjoLlWwaJjIilffsbBMmSGDCcgGmpPKEeQvVqkHLZBbaRrAFzdDeElKDdHKMmKJBbjPpnNmAVtTvBoUpPHMmVvhfFqQuqQEeoOsSciXtTxwsdIfGjpKwqKjaAzxXnEiZAtTvVanEemZAaVvKXxkTtgWwlxCFAaYykKfKtlLWwfFBbgTtBXuUGfcCaiuFJMmVvjfUgHhGOofaJWFfatoOTAUdDpILcCwCIicWBFfoBHhbObKEekqSkzZjJaCcpIiMmPpPWmguUkzfdDBxXtToJYyzPichlyYAaJjUeHhdfFHhlLEeVRvVFmMJSsjMgGhtXtQqJjTWXPjJphHuvBbpPqQVSsNctvyTdDtsPpHCgGcwWWwybBeYNnYOoSsyVUIirSqvVoOoOjVjJvJkkzDqSzZsDMmdQdSsejtTGgJEfFxrhsSsBqQVEpPjJjJjwWohvVZvVAaSuHhLcaNNnnmMyMmkqQYDdyzOoPpnPpNZKSdWiCSstJjTkKcCncCneExXTpPOsSoUuHhJzZjpPwRFCcJjHhHhmEeYycCbxpPnnEjkKJevHRrNlLDhgyYPlyYLVXnnNvVcCZpPkkKKJlLqQjzZXGglFfJTFeQqhfFHEHbBTtGgKkhRQqrfKwWrRsSWwkIcCDdfFBbAacCgEeGsqQGzTrRujJqQGeoopPceIYHhuUlIywWYQqiQqbompPwWLlBbIeEqILlitsONnZZzJonfkKxtTRroHhrEkKePdgFfGDpEdDhUukKQUdrRLFfXcgeEibpSrqQdDJjwTtWnbAjoKOocCkiCcCpUuqIaAiyoDdOsGgEeSKwHHhNMIwTXoZzaAociQqIufFKkUCvfmLTwWVgeEGvjJfFhjJiBbAnhMvVjJmHNxwWsmMSSLZDdzKkmQqYcCAsSoUuKlLPPshPpGRrBxXbgEoOcCRreoOelcCBSsbKPyQpPxtXxTvvbZzBKoWwEtTGMmEegkKHhFfYnNcCAsSJhHjaRrjJkKNLaBQKkkKqbAlvBTtbnNtywWYuUpPpPITQqoOXzZKiYqQYTtyqDOFEqlLWKkkKzZzRrZMRrXxmwmMdDLleNcChuMmDdUAabIKkeEvBFfTteqQSsRrRrToOcuDdmkKWNnRPpjJBbvVXesoOSTtUuoRrQnHhhZfFAgGDPphpuUmQqdDXkKnNeGLvVeExXSAaieEIeiIqNnUujJSBbUwWuKkoObBXRvVoGgnklLKOoYyGgSVdDLlGBbBbgZzvsnNLRJjBmMDdMmAarRDdbrlyWPpKCckbBDqQduUtTGFrRMmfaAoOLGWysSxyCPrLKkAabBoOlsSrRRANQqnuogYyCcSkKdfFDJLIOoiCcKklDdQpPHhJjIvVyjJNtToeEOoBbmoOZzWLliQqaAIaxlLQqXakkZuqhUBoOFfXxcKkCiISsDdbwhAoOKkwWaPzrRBXSseEuUxbVoQqNpQLXtLlkuUwRrvfJjXxSDdsFaAbFfpjJJjwOoEezHxXBgcCJjsSxIHhdqQDhTzXYyaAzXxuLOoCcwWnNTVvMwDdbVoqNnCYVvyIiSFfsVOVdDvofTGztFbiIMmOowWHOaAuCUurIiSsuUFVvIivdDvRpPdIkKiDrlLHaARrjJlLhnNeEBbfFQuUBbmSsPsFBJRrmRCvVRGsSgrpPcOowQqFfWMuKKRFIKDHhMfFkzetPSGgLDdgGWUuzcCXHeDtTdbIMARrIiiSgpVSsXCnZrIuXZzbycjkKJCYCcfaAKkHDXxdiBLlbNnCgXxTOoavVHVvuUdbZnfFNwWyiIRiIpbBgGPUusSrrhEeHRbXxBbiItUHhuIiTgGfFhHqHKoOtTkhQxrrZjJZRoGqbKkfaAEeQrNDaaAMCXqQxcmFyYKJsncRLlCRQqsSrcoOrAasSYwuBRrFfHDHhdhUntgGkKxbPzpPZpkKiIiItTAZzqQJAarRXxjMrRwBbyepPFfEYyZzwWrRTtUDdDVjoHfFyDdhHQqnqQGgAaHQqhOYGcUudCcvsCiIxXczZkKoDdOBZHwWEPDdpeYyPpwWdDmFRrfMjJYAayqKkQdtTLdByfSNeEjlLJwWRzZrRqfFWmFfKkOopEelZUktTqQdEeEndDrRKsSkiTpyELlhHeoOsncreaUuAGrJjRIidJChlLHPhHzSrRqlLsSXxzZQWQqIuajJAUkKwWlLEvDdVkWuUEewKlSzZOoZIYyzZbwWDdMmgrRozOoovVOUuFIcNwWOoyhcCHWrWcCjJXUpPrReXxWxXgGwPTlLhHoAoOaOUuuUtdiIQFFfNntLlaHhxXASsTupenNERMmXdDDSpdwgGWDSJjsNnrRrRVLlbBbccmwtUudDcClMTtACWwjJsSpPpLWwsSloWwrRSsCcRrGnNgGuUhgDdGPpRzZNPpBoKkOCbQzFfsKkDdSPpchHKxXzUUdDuuYyaAsSkxKkrRrNaAnXTtxGnNCcxXaaAOopdDOowWCcssSsnVvsfpPRvbeEIbBCkaADdxWDdNEenwRrKkEeXAZFfDtpPWwTdzGgOobBfEezZYyzbhHtTNmEtTecCqQVPphRBnNbryYMpPSsrREAaAaPtKkQqIRJjrsgpPGSMfFpfHhFMmVfFMmvVWIZtTzaAiwkKvBbPDnNdDQqWWwwhHXZzoHhCsScFIiXxfzZMWwHUuhMOSJjsySsYfKlLHhOweEdDWWwgCLbBNnnLllbiUXxulvVgCOMmgIiGqQUuxGbBAaGgoNmMfMmnPWwgnNIqsLlLlUJjuSQCcDXqQHzZgCcnNGHhhVvQSbLBuOfYyBbQsSqFXxojAgGvrRqdDQcvlLVxXpKGgEUuekGgKCrpXxMmkSLlNHFfVvhnqVrbBtTaAZjkcCKJEemijJIMzKYJjJjEeVXTtxAavmlCcKwWnPJjpNCcvVbqGwWgQSWwaloOLAstfAxXWwfWwBDdSsfFUuMqQpmQgFwWZzQCkKxGbBcCgWwnNAaXSsfSGmwWiIVFfFuUeiIEpPZzrpPTtNwaAuUGyYJjgeZzEfQTtqWwFTtAatiAaSMmGgoOsNndrtTsSQqgKkmwWXuUlLxmMlLAaHhCctXxwWwrRriIEeJjbfFOofFJMmqqLKklQQQqfOoCcWwoocDgSscYGEyRbEidTEJjebbBBjJWwMILlivVJHXxyFflxXPUGrdYyDcRrCUKkuNnoORgIiuIipjJPpLkqRrQWPpBzZpPLlLlLZzVDdpLlmsSNnuUiILTqQeMmCcsSmMDfFrIFfivnjJjJNtTjJiIjnNsSJVUGgQXZztDdZFfSsHhqrgGRQvOoxXSCcsVuGZqQxXzgEeNnSsyXERrdDDdqQWweMmVDdLltTvkyYKiIGgbBSsKkcUutTHhOoCuaAUkKyvdDVgvVGqkBbCcKiIvVxNnuUdeEDXglLFnPVvpzAaZzSspHhCcPHhPpXNnfFZzzZxjJaWwATFfbByHLljUuGjJzZuUguUfLlFBbOvVoPBbdDpjjlaALejJPpHTtQqCcRVvrlyeExXGHfMHhmgGFhvVsHMmviPpKIqRrPiIIiEFuUaxXwWAbhCcpvpvVPooOWBrRbHyYRKwhHWbBAZTfkKNhHwWkXpmMPKkxKQjsLUumoOMzZRlxbBXbBuvrfFRBEebQPpcwcbpeEPBQCPpgGrnNRntOHfFrCcRgGhtbiIBOdxXNnDgoOVvUujJGKjgyrdGgMmgqmMnRrZpPjvCcVXxeEJgEeSsGihHYcCUfAFfxYyXcziIuUoONZuJjzZvkOsgeEzZVviIBfFoObnNglxXwLlWFfIiLlJeEjFftTZzLLlIrkzZKRcaACiuUdpzZPVhHqwWQvqQDJPpfWgFfVBbNnoMVmXqNnRrAaQOonQqMLlmUukckJvszobXtTmMjJeEUiAVMmvyziIUoOuzZYPuICrRchTdDtbBTtXxQvHhbBQqGRrgAaqjJlOocfFCCbCcBQnyndDFvVffHNbxHhhHIiTtlLXMmBmqQlnSsIhHitTNBbHhpSsDnDVXIisShovlqQPEeLLdtTOoZoOzDoZzOtMIhHchzZHLlDdCEuoNnOIOozZgWwvVvVWzdDvVRSsVwWwbByrRYVvrRvVfFONnzZEtTEeWXDNndcCuLlrRoOpZzGgbBChHcPTtWzBbwWGFfgZUGguwIDdsSsSFfYLlsSrkKRzZBNUuVsSLGglSsnNvHJHpfFWeEjJxCMhHmMmRruUuonNrRjuUJOUXxSsgGPAaBbCcZzpsQqoOLlWVwWyLlIiYSxXidtrxXRTDKkDdkKdwwWUuOfUXXxxJwWOojYWQqOoOocNVvnwWxpPrRueEwWsPpYySFfwWBblKaAkjJZOVvozDdYaARCccCreEyRrARraepiIPoOjJHhEeRryUuwWeoOfFwkKGGggPpQYGgQgBbLFffhKkHkKeysSYGgQPpnNqXkKqQwWirzZCwacdDeECAOoWcTtgbBGeEIWwWmzmFHhsSFfsSFnNFYCcaAyfpwWdiIDTBbhHWwdDVCiItTcHhMgoOjJtRAnNlLarTGGXHhfgGlLyxESswWFftSQqsQYJjlrRLIiPCjJxiItTuUjxdDXMcCBUurRTtpTXEZzeaAYEeyWDdKMmJiDdIUuEeVvkKHhVvKVvAQKkqfuUxXFRWyYwvUudDVslLvCcZzVvwsSWCOTDdkzYKkyZibKkmZkcCKzOoQqrRvVkQQqpTtFfZzkKNnPpMmPnNTHWErReXxrRwpdToOoOtKpghuUsSHGLlwWPiITiItQxvdvKkVOoxnNXDqmuyYvvjqQvVhHLAXzZfFGgWwpPHhOKkmMKkhpPEeTtXxKngGVvUUEewBJUuZmMzxXHFIifdDFbBsSiIRqqQQruUEDKkdTyoOYSSsSsvVidsSrRcFfCPplLDVvZzNntJAAaajrnNRecCEISeTlLjZzXyYxDnEYUhHNAanuwfBbjJFNZzoEaAhHezgcpMDdmnNPHGguUhwWLlcCcCFCLlddtWvVLLsSlJjGgEXdDoOLwWjBbJjjCcJDdJWWwwlVvkKUurXOGEeIigoNiInVMmvxCcbWwBwnbMmbHhBBMaPpmyYvVrRiOAZzaogVvkKrRGWwZzWqQpPpPweHhybWwKdDkBzZLlNneEMsSxXmYlhTbBtxXDlIiONnozSGgfFPyYcjJCXxpiuKOokUCWvVwcCTtnbBNbHhBPpMMmJJYyTtrXxTtzZRUIibicusSUhIKkaAoOuUjQLyjJYQCsSGXsxXSnuVvUKkyYxXWAEeazZwXxEejLpaAPlMmbBhHAlLPpaSsJMwGrRGggXxpaAPWiPpUDdvVFfubBqNkKlxXeEeEDfFdirRIDdgGeEveEVpPCcrUpPlkKLuNnRjJmIiAnNtTaMDdbBLIiVvOGSsLloOaAQLlIwWyOocCtLzZlvdVmMSAaaDTORxXaRrArxevuzZpvVXcCIeEiVhHCaAcbBjSoKkDdOBbgEFQqfEaJjfYtwQqWTzZzZyFAcCyYjJarRqsSQywWilKkLpJjEQqmMdDaAvaASpEebBhHXPpsSxgqQUuhKkFfvVhHSxXmMYyFEzEenNJjazZAIWwhHSsWwZxkKiIXEyYeEKkGwIiWNncCAlLtyYTalzRrZbBVvcCuxXUHhwEwWeBnNbLlXxDTQqbBtrRgnNGdWwTVvdDlUuHxmkkKyYEYhkKsXxSKCckdzZmMHhHqQVFlLJjXxzZfUXAauURNnrxXxyYoOuMmVvmMHhfSsdeEDNnJrRMsSENnUueEMmNnWWwKNVvngGkkKwwWZzNQqivVQjJqtTYySGZzncpWwPCeuNnUFaAcCfQSsLxXefFELllqmMUujJHhhHQnNlmPwWpMnuUNRrEeVvAaLnNoOhfoOeGdqQVJjpPcbByYDdzrRPpRrHhfKhcCwWHFfQqjJkFPHZzYXZzjJeExpPTIVGgRrHRrOohUutWwTDPplNnLvVZejkvGgVyXxNEenHrRhNZzXxnwWWwYkNFfnmITtinIiNqQaGgQZqGgQRrBvkKvVJKkjVfiIQezZpPQOKkKqQoEAIiDdaGgYyoOeOtQKknhHNhHrjJfFBfFHWwCchCnOGgLljJadMmDtCcDdGgeEnNkCcKdAAmDdiIMZzKkWQquOoSsxXOogGXAaQqxoOhHEenNnqlLcIcCAlLHhtTzBbyYDdZfFtTzGgZYyEeSFPxXpaAgGbdWwSsyYYJpHgjJGhVvHhPEexyYMmkSsnRrLlNxXVVytTeEbBYTtiIAaQLlkKqjJOovveGgEfFIpPizZimFZzJoODDdJjWdGgDgGRnkDdByYbKDfuUQqTJwWFPIIiXWbzZByaAYwWxXUuIiSsUsCAOoWwaWwcSyeEYLlTWwlLreBMKkrRLlakKAfNnoOjJUiIpPCcrRQqvZzgGVwWpRnNRULAmMBzZPpbVWwXwWJRBbrEesSHKkhjJqQKmDrRAagjJkweEWKQuUGvVmAaMHpPhJvVHcCekKdbBKcCyFfAaAaYSftXxDkKrKeEcCWwMmkVsRrStEBmMovVMmdDOzxGMmKpgDdGHcChaAIrRFqbBbBdDsSBbQqDrCcRIIiqQiiIxXdvVvavVmlLMgZzsSEegGGTJjMHRrhmYJjyFftTtsfFSCcsnlLiOoIKkvwjJWgGmMOoRrVVvfYyrQqROoZzFRgGvTgxKBbNnkbxXBBbOoUXxubBTtgnNGXYyJjWSbBiIsWEecPpFZSsSzZWHhSeEJjJCcjsDdzZcnnVAakeERUunNQUuqRrwNSeEHhwWQqQRrEuUfFIdDBkKbNUungGoOwoOWQqlLEQiIqXgtTEApfFMiIjPDdpRrsOfFlLoWwKvVlByYbVmfFMMmZcvbBVIiTtLlLbBCcHXxoOhhpPShyLtTOolYOpOQiIWTtxjJJjTtyFfYAaAEeQqSszIiZaRvVUurvVvMmVYyqMYVtgcCGTvyXwAaqqQQdhdeEDCfFcRIiYoODdAarWwMmhnNjJJjeEpPICciMVcCvmhHGgvEevVDxvGDSkKsnMXDWlLwWbDCcdUPpmFdDfDdMbBRrTKTtUQquCczZlLTtiKkIEeKwobBOWadrRpPlHhJZfRrFzBbAOlqQLKkXxYyLSsMmIzZiDFfpPoOEeBOiIhIiOonDfOoOoqQDdWqQdBJjAaIayCVjJvyYOAalLoyYOnNAaFnNvVflLMowWLlNnKkjJKkKknNCiIekIZzwEeWjJiHRrhIeETiwWIOhHozDdvVvWwXxokxXKOQEbBajyYrqQpXNVvmMnxElgGTtLeGgiIHNncUuvDdbBOVqaTteEAwWUuQqQqGPpOogGgLlhmMhHHqQowfFHhWXxcBbYyfopPEEeuUuuUxNsSAaAzZUufFdDaKWwbBWwkqrTtRIZziiIgGCmMhHpPcKkBJjxEeDhbBHfFdAhHMmalLsoOIiSXyYSvVzoOlcCLUuhHWwCHxXWwhLlVOovWKkwHmdDWKmMIeEANOouDpmMaAIhldDlLLDCcNLvVcCcyhoOHYRrMmCIiGlbBXxtElLIYwWwWuUfzBbZTtgGbMCcqQtPpWgGkKwrWAaxXvVIiDhthlLgaAGHzZnNBbwWTHlCczhHFZzfCczZZMKkmqQXFOofxEeGQqgLdAgdAaCIiXKkcCZzxjYyTtJITiISwWscEeCWaAOotTzRrPpZtTlWwLmMpUuLtTtJjTNkKszZAMmaBtHcOhHLloCglLGcChTlWOohHzZIiITtCxLlPpfFtTKLiEeMmeEUlLdDuuUoTtnNOfFRlSswzZcGgCamMfMmFHhbIiCugGvVtTUuPXxpUBbjJwWzIiEeZdVCuUcvkKGgyXxIiXxhHzZEeeKkcCXEeEXxzXxYyjJseESIlLEeVvIiKohHxXBvVboOGgQHhqgGoNnQqXWbBwCcHHDdhRrYlLyYYgGyIJLAaXxlcCaYyisSDeEaAbBdMmoOvAaJcbBDdMxvVjJHDzZABbJFfIijatTdOcChqQjJPqOoQpOozZVgfzZXeExUAaUyYXbPpBxuBbMmWwGfFDgGZzbFfBuUsXxCDkKdYmMlbBEeLJjbhLlUuJjOoqZdDiItTOaeBbLlEhHJvVjXxKxvVVmUuxXMuUTtpZzPSUuWcCfFFuUfoOgTtGUuJjgGkAajJKTEetsAagKcCbBdOhHoKhtBbwWrRTHIiDddIltfoOFgWwtAAKKIUZkKzHjJduUDGgNnyYjJWwYdDyRrxGgpQgGqPmMVvXrRGgQqhKwnNWRUurbGgBaZQqRpPrzAeEkxXEvnNpcMmnNeECPdDRrlCcxVvXxDPMmvVNLKuUxXFfIiklnofFgGWwOPpdDGgyYpPsSYyuUhHTtFfOiIomOohHcyYCMoOhHmYZzyOgGaAOoYyohHMnNUuSfFsPxXpnmMNnGgLlNMmuwWZzKkZzMVzZqQcCjJRJjrWYHaAhVvywXvVaAMmMmHhUuJIiqQwuUWvJTssSHkvVKCchTUNAaDsDdbBSdnXxRresStNnPLljTtfbsSkKEejJLbBOoLCuUcaARrlDdXGNngxHtThkKhbBjZzugGUUTCsSgGckKHrRHhpbBzZzPeEeNLloOZzneEvrQqWwRyYNDdJjnRrTaAuUOiIocDdjJCNnCSgGDPGgpdkmLUulVngGNMgGrFfjAykKHhlLuUoOAaetTElSxeIHhiWwpPHzZwWjJaAhGzZSWgGIGpPgsSiLlEewcjJCUVvuBbAasSqAaQpPkuUUlLuKkXxEelLiNnMSsCcTtJjDdwWDdmBbIwWiyYDdpGrFYdYyNnDBhHdDOobdPsqQSKsSdDHhkgGZztTiDmMjvVJjJTtdIsSFfphHOowkGSsgOsSbBRxzZNnJjUTtuqQIiwvVBbJjVvfFEeNkKnoTtfFqfjJLlFQOtgGTPTEGgaACcHhDYytTtUuZlLHhpmuUMKkWwTlRrXxMaAmeEQqyYXxLWwEMwWwWmBfFDdbGiITQqriIBbMnbBYJjMmSsbByolLmhHMWwHwWhxKkXKOokkOoXxxXKwIiTyjJUWKkwuBbIxyYuUxytkKBbhHTdaABmLlwWMpPMyYTtmVveEbsMmSFfMMmcCzZjMhHmPpKuzZUVvkSQqsiIXxuUMmKuUSshyYrRHPpXxongGMmilksSKLYyovVOIXiIMmNnVvCGxXgVvrPpRpPcxXYFfyXdpPQqIioHoOqQhgNvVsSnGyYZAabBmPpyYzMmZGgwWMdDoOCnaeEGDfFziaAXYyxICcWMlLcEetTUHhUuSsuuUfiIVAavFNvVnrRLIiliIduUnNLDhEeHzZNnXxdTtMGjJWwgDcyYejJshfFMLlmPpWXxRryYxBrRbUuDRrhHdNUujAaJAdDaCxvVXxSsXsSMENnZOSsqYynvVNBbMyYEeDdhEeHmBbblLVvqeEYyOobBuUCcCcCjJcSjJsuaAUMjJyYRrdPMUumYJjyxMihHIHhkpPPpKeXoOxEIigKkGgGmaAsylwWMmIMmNnCIfFiCJjMcCmDYyUKRrkWwRrsShHIhHFWxNnPpuRrMMmmMUAaumXlLHhKSsvVSskxUkdDKqBbQpSstUuTvVokKOPkKrUuRgGJZvVtTbsbBvVUuHhhHxUWwiIhHFfKkumMjAatMmlLKkiDfdDLkKAaevVZzZzpVvGgboOBPEliInKiISTtXqnNQxBNnVvbWwBboOwERcnNzfFZzhFfHPrUUuuRpDDHhddRrXFNncCoEWwEeRzEeEOoCqQcTjJtUuKkFfeOZzRrIDdGZzkKgUpVvPGgvVHhuotTLlHAahAaOoxXlUuLYyBViouUOIvbPpWuUuROorUiIuLdDQqTtLlVvXxBOocCkjJKzZGgJjbBDdUDPpdBbjJHhUqgMTQqiIvVtRtTrsRrzUuhmMHvVHhglxXQgGjxXMmyLlYlLPpyYJqJfFjhgGsSxXrWwFfyYLlVvqdTtxXeEgGihHfFIIitTjJpPwWBbYySsbBrRDjJgGNnfFvxXgGfwWSsFSsjyYJVaAtxXfeEeEkKaNnUfFuvOosGgSjYsSaAnNBfFvrZPpwWnNTtSsgMmGgqQTtRrMmwPpSsWhRrvViEeIHhHHhqaAQGJjzkKppPBbPZpaAZzMmUuWgsVvmMcCgGLlbbdDBdEeGgDbvVhAaHdDGgBBlWprRPEewEsSYyEepPeEeLSrRuUIWwXxizsQpPkKqfFSeEUdDZlHhLNnzuPWwcCnNmMJjrRkWLqQJjYyixXvVIVvPpOcQqjoOiEeIeEJCoZhyYpgxUVvugjJGXbBkKLqQlETBuUbteUroOVvRBbiIdDZWwznNBGgDdsSbuNvVsSIieKiIGgjJdPoOpWwDyfFpPYIikdDTtpPEaUuAIizZUpPuYsSCcYyIFvNOoutTUfFyYHhWxXqQoyYOwaAvVyYKkngGJjmGHAaiICcSRApPJjeEaSsiIeIiEdDrsQHhWwKkYyuUscCFVvfSAwoOyYWaYyeEUnNCBbsLIilSvZNnzUuVuUpqQZzLlPcCsScpEBbNdDnegBbTtGPyOoYyYPvawDdWtJjlkKQlLKkhHqWwSsLlfjPpKkJFjJRrEeHvFfVEQKkqdDJjXLhHlTtJjxLlWtRrTIlLiZhJjiIHzwxXjJKcMyYmCCcHhksSLlenNWRrwScZzCDdsrqQRgGzPsSpBALlFfacCEzZOomMiIejGgtTJoOlLBbsSbzZpPBZzTtJWwjLSslbBMsqQSsqGgQGgSqlayYeEAQFNnfqhHJjPpAadDvEeVcCbBpPKgGoOkRQqrerREGwWfZzFeEgwmMZpPIiUWwuAazpbBvVqQPtTWStEeTvVaAskXRrxHhKbNnqQBIpPiebIgGasSACciEwOoSsWiIZzeBMcCmpCcPEFEefrRCZzcVqAaQJjvJjKZznaAaANAakoOPpbJjBDUvVudDdYsSyIiBbZWSAaAaHhValLAwWAavLlHxXheEeEVixXjJIEyYxXiIxkKwvVRrOorRWwWQlLqLlUusSJjbBhlLZgGzGgncPpCNjlXKkxLoORrJHnPVEekKvpNWqKvVTJjtEuiIUwWwWCcyYPWwpcCjiITtYcCyECceJjpnNPJBkhHfBbzkKMDHhdmJHhjtTFfyJjHhdUujyYXxJKkQqDMwWuUmmukKUZzjJuUHOoOoDdqQqQaAUuyYrHhRkKbBWwhazloiIhHRrOLPpDNnZZzLzgGZYNnqQylfFaAeEiICczdmoOLeElmMnWLlwvvrRVaAVPsSqQpuUzYyRrZBboOKkgGTNGgntMmssSbtLfmMFciICdDloOTfYyPpSNFfnWwiuUIBwNnAaWkZUuIiQqzKXxvoOtTmMbGgcTYydDRHtThrQqlLwAaalLALAalvVXYNnNPpuUKkNLlpPkKnhtTHtTXxlEnNeAHhaUuVAavLHhBbzTtFfZGBbaAJjvEeVxXZzgKHhkgpPxXPfFeEpGcCCDdDdreJjErRHhxBbzZXxXCaAyYclLDvPpVtTdCkDdJjKmmMlIiLMmMKkYXmMQVvXxUuREeJVvqQLlBVvZzbjOGgSSsoOsGgHheEdDoRtTrXxWoOwOjJoYyMmVvAaFBbfEeTtqKzZkIEepPNuUnEeGbBlLcFrEeREwWqhHQmOoMXxeAQPjJpJjCcoBbYypNYynWwIiaVvAcjJeEApPRrNnICcxXiaANnakKEehHRrgGCPoOsEeStTdfFDpPAaNnNIiTtZznPoOpiISsXxjIMpPmtcCTieIHhSlLgBbGglLLlheEtspPxXSTTrRlUDdupyYYyhHUNnFfpiIxXTMmtfXxxXFPeEmxXVKkfFvCcrWLVvlwRqRrQFfPVvFfFlLZzdDfpHhbBWwyxQqXZmMVgbBGvlUuLxXYyzAabBCkQqZqQiImRnNrRhcCHrMpPQIiHDdhqdqQMmigGrRIiTtlLZwWYyEPpekHOohVvKDdRfSspiIPZLlzFrNnmwWtTMnNrReXxifFIsSwuUWEOYyKrRkfrfcCFtTCcwNSsnWJOojOUXsSxBbjXxjJJuFfYMmCcyGtWwTbBLnNyYlOohHSsLlgSDdoOHhhHsMQqYytTHtTjJOoLlhKkowWUbBTtsWwSuNnLlxXrROcyYZfFzvVCZzHhqHhNeiIckKVvuUuJjiIJjUXxzZCEGHiIyYhgDsSHLlfFUuhrNnRaApAsSaPXxdkdDGgKzZntWwTkKbpvVuUGgPQcCqUHhuWwNnuUEelLYVvhHyBvGgVrRBbreEWwRsiIHYJjAIiatDdaATWwyOohEdmMDYyTtYyDdJKkKGgkXLFflwEeWUuGgfVqQvBbFYyeEtrRCTHhvVTtpPtdMmDiINnrHhQqfFrcCRdQqkCmMtTYyeEcGWwtTlgSrDdVvRsGgaARrOAaTtEjJQHhqeoWffFFuUwRJtTcuUCjruUmCcLjfFVhHXxrsSRnNuUVvaTtBnRrNiIbBbAxBbpPGuUgBbXbByYqQkKqQaDdALlIiprTtROoPwDdGbBpPIigWxCcCtTcImSsYyMJjuJjUmMpPtMmhHpPTGgjJpPaAcHhCiTfFEcCetVwWvKTtkKkiItKkIiyYQqOoTVxXgGJXsSxWwrREeJzZjpRoOrPnNjvoOqQruURNnhHmJjMKkXFOMmofFfNnbBZzJjpwWBbxXPYytTzZuUYEeyraARNnpKVSsvkFfVvAQnNqBbitTfFgmMGIoOPphHaTtTtMidDIWwRDdrRrcCvVqQqyYmeEMWeErRwcCXxBbryYKkRxXRHhmeEMmsSMSsruUFAFfmtTMabIilLFWRrwfkIiYyeEPpKfFGgFffFTtBaAQLEelPyVvYpXlLPpYyxqxXVgGwIiWkLlKfkKzZFZzwWVwWLlvvgUDduaAdWwDWDdwDdDqQdsSlLvVvVqQCcuUkKsSzZGjJoOfMOojJmlLjqQJjJQtTVvapPCcAJXxjXxerRhHESsmxJjnNWhHyYwXOoSsYyxXeSsxXZzZzLlhXxHEGjJgjiIJGhaAsbBvVeuUFzZfZzESgaZzAzzZvVZbAaBGtTHrGgRrRBhHnaANbcsxXSApPonNObmMBanNtTkKYWwaArKuUmMoOyYKkkbBWwfFRrRTtGgTpPeEtsWNNnnRroOjrRJwNcDduUCnORBbrGguUoZzsSsSUNnuAaPpIYysSiNnhHdDFfkKSsQCXxaAEUuecxrHkKMmhHaAhQqtxXaAOHGghZTtzoTFfOoiIcChHnNUmMuYyRJjdMmDPsSXxTtppPqQJjlLZCcHhqQgGzXPTtpMbBmqqQQAuUTdrRDnNxXWwtvVYyiIIigGOoVvYyHhagGZzKkqVvrlLdDROGgovVKpPkBbwWOotTOrRgGWwHhfFKkgTtGWwNnwiUiIuIQDdKkSsSsYQOoVvHhaABbsSDGguUsSCzZcIxXidziYyrrRRIqrRGgQWwMjJmFfZJjnNhqQmiIYyAaMhnNHiInNMyqQkKIGgiYQXxqoOTpPtmyAaYpPqcbBCQqXxpPQExXexXiIHLzZSswWlLlJUugGjoOrRJjqYyrxXRkoObFfDdBWwKkkKnBgGUubsSNqQpkcCKgGPdDgfFGxuUmCcfFmMSBLlDdPRrkzZKIigGfNiInFYyGtTbBgnsSzZhHoONgOoGbBTFfrRzZFfgQqGyYmsSMtnNCwpPWwWrQqRcoOBbhnNHjJpTtTtdbBfFSsDEebfFLlBbmGTtgMHhaAhHS \ No newline at end of file diff --git a/AoC2018.Runner/Input/day06.txt b/AoC2018.Runner/Input/day06.txt new file mode 100644 index 0000000..55d6ab2 --- /dev/null +++ b/AoC2018.Runner/Input/day06.txt @@ -0,0 +1,50 @@ +194, 200 +299, 244 +269, 329 +292, 55 +211, 63 +123, 311 +212, 90 +292, 169 +359, 177 +354, 95 +101, 47 +95, 79 +95, 287 +294, 126 +81, 267 +330, 78 +202, 165 +225, 178 +266, 272 +351, 326 +180, 62 +102, 178 +151, 101 +343, 145 +205, 312 +74, 193 +221, 56 +89, 89 +242, 172 +59, 138 +83, 179 +223, 88 +297, 234 +147, 351 +226, 320 +358, 338 +321, 172 +54, 122 +263, 165 +126, 341 +64, 132 +264, 306 +72, 202 +98, 49 +238, 67 +310, 303 +277, 281 +222, 318 +357, 169 +123, 225 \ No newline at end of file diff --git a/AoC2018.Runner/Program.cs b/AoC2018.Runner/Program.cs new file mode 100644 index 0000000..ed77b3e --- /dev/null +++ b/AoC2018.Runner/Program.cs @@ -0,0 +1,36 @@ +namespace AoC2018.Runner +{ + using System; + using System.Diagnostics; + using System.IO; + using System.Reflection; + using AoC2018.Solutions; + + public static class Program + { + private static void Main(string[] args) + { + int day = int.Parse(args[0]); + int part = int.Parse(args[1]); + + ISolution instance = SolutionFactory.GetSolution(day, part); + + // Load the data + var locationUri = new UriBuilder(Assembly.GetExecutingAssembly().CodeBase); + string location = Uri.UnescapeDataString(locationUri.Path); + string locationDirectory = Path.GetDirectoryName(location); + string inputFileName = Path.Combine(locationDirectory, "Input", $"day{day:D2}.txt"); + string data = File.ReadAllText(inputFileName); + + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + string result = instance.Solve(data); + + stopwatch.Stop(); + + Console.WriteLine(result); + Console.WriteLine($"Result obtained in {stopwatch.ElapsedMilliseconds}ms"); + } + } +} diff --git a/AoC2018.Runner/Properties/launchSettings.json b/AoC2018.Runner/Properties/launchSettings.json new file mode 100644 index 0000000..f991d3b --- /dev/null +++ b/AoC2018.Runner/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "AoC2018.Runner": { + "commandName": "Project", + "commandLineArgs": "5 2" + } + } +} \ No newline at end of file diff --git a/AoC2018.Solutions.ruleset b/AoC2018.Solutions.ruleset new file mode 100644 index 0000000..21992e0 --- /dev/null +++ b/AoC2018.Solutions.ruleset @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AoC2018.Solutions/AoC2018.Solutions.csproj b/AoC2018.Solutions/AoC2018.Solutions.csproj new file mode 100644 index 0000000..97a6af7 --- /dev/null +++ b/AoC2018.Solutions/AoC2018.Solutions.csproj @@ -0,0 +1,19 @@ + + + + netstandard2.0 + ..\AoC2018.Solutions.ruleset + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + diff --git a/AoC2018.Solutions/Day01/Part01.cs b/AoC2018.Solutions/Day01/Part01.cs new file mode 100644 index 0000000..63ae21a --- /dev/null +++ b/AoC2018.Solutions/Day01/Part01.cs @@ -0,0 +1,13 @@ +namespace AoC2018.Solutions.Day01 +{ + using System; + using System.Linq; + + public class Part01 : ISolution + { + public string Solve(string input) + { + return input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x)).Sum().ToString(); + } + } +} diff --git a/AoC2018.Solutions/Day01/Part02.cs b/AoC2018.Solutions/Day01/Part02.cs new file mode 100644 index 0000000..9e04ddd --- /dev/null +++ b/AoC2018.Solutions/Day01/Part02.cs @@ -0,0 +1,32 @@ +namespace AoC2018.Solutions.Day01 +{ + using System; + using System.Collections.Generic; + using System.Linq; + + public class Part02 : ISolution + { + public string Solve(string input) + { + int[] items = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x)).ToArray(); + var seenFrequencies = new Dictionary(); + + int i = 0; + int currentFrequency = 0; + + while (true) + { + seenFrequencies[currentFrequency] = true; + + currentFrequency += items[i]; + + if (seenFrequencies.ContainsKey(currentFrequency)) + { + return currentFrequency.ToString(); + } + + i = (i + 1) % items.Length; + } + } + } +} diff --git a/AoC2018.Solutions/Day02/Part01.cs b/AoC2018.Solutions/Day02/Part01.cs new file mode 100644 index 0000000..66a0b87 --- /dev/null +++ b/AoC2018.Solutions/Day02/Part01.cs @@ -0,0 +1,19 @@ +namespace AoC2018.Solutions.Day02 +{ + using System; + using System.Collections.Generic; + using System.Linq; + + public class Part01 : ISolution + { + public string Solve(string input) + { + IEnumerable>> boxIds = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.ToCharArray().GroupBy(c => c).ToList()); + + int exactlyTwo = boxIds.Count(x => x.Any(c => c.Count() == 2)); + int exactlyThree = boxIds.Count(x => x.Any(c => c.Count() == 3)); + + return (exactlyThree * exactlyTwo).ToString(); + } + } +} diff --git a/AoC2018.Solutions/Day02/Part02.cs b/AoC2018.Solutions/Day02/Part02.cs new file mode 100644 index 0000000..38e7ff5 --- /dev/null +++ b/AoC2018.Solutions/Day02/Part02.cs @@ -0,0 +1,33 @@ +namespace AoC2018.Solutions.Day02 +{ + using System; + using System.Linq; + + public class Part02 : ISolution + { + public string Solve(string input) + { + var boxIds = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); + + foreach (string outer in boxIds) + { + foreach (string inner in boxIds) + { + if (outer == inner) + { + continue; + } + + var differences = Enumerable.Range(0, outer.Length).Where(x => outer[x] != inner[x]).ToList(); + + if (differences.Count == 1) + { + return outer.Substring(0, differences[0]) + outer.Substring(differences[0] + 1); + } + } + } + + return "Failed to find a solution"; + } + } +} diff --git a/AoC2018.Solutions/Day03/Claim.cs b/AoC2018.Solutions/Day03/Claim.cs new file mode 100644 index 0000000..b0e2d7e --- /dev/null +++ b/AoC2018.Solutions/Day03/Claim.cs @@ -0,0 +1,33 @@ +namespace AoC2018.Solutions.Day03 +{ + using System.Drawing; + using System.Text.RegularExpressions; + + public class Claim + { + private static readonly Regex ParserRegex = new Regex(@"#(\d*) @ (\d*),(\d*): (\d*)x(\d*)", RegexOptions.Compiled); + + public int Number { get; set; } + + public Point Position { get; set; } + + public Size Size { get; set; } + + public static Claim FromString(string input) + { + Match matches = ParserRegex.Match(input); + + int x = int.Parse(matches.Groups[2].Value); + int y = int.Parse(matches.Groups[3].Value); + int width = int.Parse(matches.Groups[4].Value); + int height = int.Parse(matches.Groups[5].Value); + + return new Claim + { + Number = int.Parse(matches.Groups[1].Value), + Position = new Point(x, y), + Size = new Size(width, height), + }; + } + } +} diff --git a/AoC2018.Solutions/Day03/ClaimExtensions.cs b/AoC2018.Solutions/Day03/ClaimExtensions.cs new file mode 100644 index 0000000..3a5191b --- /dev/null +++ b/AoC2018.Solutions/Day03/ClaimExtensions.cs @@ -0,0 +1,23 @@ +namespace AoC2018.Solutions.Day03 +{ + using System.Drawing; + + public static class ClaimExtensions + { + public static Point BottomRight(this Claim claim) + { + return new Point(claim.Position.X + claim.Size.Width - 1, claim.Position.Y + claim.Size.Height - 1); + } + + public static bool OverlapsWith(this Claim claim, Claim otherClaim) + { + Point claimBottomRight = claim.BottomRight(); + Point otherClaimBottomRight = otherClaim.BottomRight(); + + bool overlapsX = (claim.Position.X >= otherClaim.Position.X && claim.Position.X <= otherClaimBottomRight.X) || (claimBottomRight.X >= otherClaim.Position.X && claimBottomRight.X <= otherClaimBottomRight.X) || (claim.Position.X < otherClaim.Position.X && claimBottomRight.X > otherClaimBottomRight.X); + bool overlapsY = (claim.Position.Y >= otherClaim.Position.Y && claim.Position.Y <= otherClaimBottomRight.Y) || (claimBottomRight.Y >= otherClaim.Position.Y && claimBottomRight.Y <= otherClaimBottomRight.Y) || (claim.Position.Y < otherClaim.Position.Y && claimBottomRight.Y > otherClaimBottomRight.Y); + + return overlapsX && overlapsY; + } + } +} diff --git a/AoC2018.Solutions/Day03/Part01.cs b/AoC2018.Solutions/Day03/Part01.cs new file mode 100644 index 0000000..47c2de3 --- /dev/null +++ b/AoC2018.Solutions/Day03/Part01.cs @@ -0,0 +1,31 @@ +namespace AoC2018.Solutions.Day03 +{ + using System; + using System.Collections.Generic; + using System.Linq; + + public class Part01 : ISolution + { + public string Solve(string input) + { + var claims = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(Claim.FromString).ToList(); + + var locations = new Dictionary(); + const int yOffset = 1000; + + foreach (Claim claim in claims) + { + for (int x = 0; x < claim.Size.Width; x++) + { + for (int y = 0; y < claim.Size.Height; y++) + { + int target = (claim.Position.X + x) + (yOffset * (claim.Position.Y + y)); + locations[target] = locations.ContainsKey(target) ? locations[target] + 1 : 1; + } + } + } + + return locations.Values.Count(x => x > 1).ToString(); + } + } +} diff --git a/AoC2018.Solutions/Day03/Part02.cs b/AoC2018.Solutions/Day03/Part02.cs new file mode 100644 index 0000000..215f479 --- /dev/null +++ b/AoC2018.Solutions/Day03/Part02.cs @@ -0,0 +1,34 @@ +namespace AoC2018.Solutions.Day03 +{ + using System; + using System.Collections.Generic; + using System.Linq; + + public class Part02 : ISolution + { + public string Solve(string input) + { + var claims = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(Claim.FromString).ToList(); + var overlaps = claims.ToDictionary(x => x, _ => new List()); + + foreach (Claim outer in claims) + { + foreach (Claim inner in claims) + { + if (outer == inner || overlaps[outer].Contains(inner)) + { + continue; + } + + if (outer.OverlapsWith(inner)) + { + overlaps[outer].Add(inner); + overlaps[inner].Add(outer); + } + } + } + + return overlaps.Keys.Single(x => overlaps[x].Count == 0).Number.ToString(); + } + } +} diff --git a/AoC2018.Solutions/Day04/Part01.cs b/AoC2018.Solutions/Day04/Part01.cs new file mode 100644 index 0000000..38dd1e9 --- /dev/null +++ b/AoC2018.Solutions/Day04/Part01.cs @@ -0,0 +1,77 @@ +namespace AoC2018.Solutions.Day04 +{ + using System; + using System.Collections.Generic; + using System.Linq; + + public class Part01 : ISolution + { + public string Solve(string input) + { + var timeRecords = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(TimeRecord.FromString).ToList(); + timeRecords = this.SortAndPopulateGuardNumbers(timeRecords); + + int[] guardIds = timeRecords.Where(x => x.GuardNumber.HasValue).Select(x => x.GuardNumber.Value).Distinct().ToArray(); + var guardMinutesAsleep = guardIds.ToDictionary(x => x, _ => new int[60]); + DateTime[] uniqueDates = timeRecords.Select(x => x.DateTime.Date).Distinct().ToArray(); + DateTime currentDate = DateTime.MinValue; + int? currentGuard = null; + int minuteLastFellAsleep = -1; + + foreach (TimeRecord current in timeRecords) + { + // Have we changed day or guard? + if (currentDate != current.DateTime.Date || currentGuard != current.GuardNumber) + { + currentDate = current.DateTime.Date; + currentGuard = current.GuardNumber; + } + + // Has the sleeping status changed? + if (current.Activity == TimeRecordActivity.FallsAsleep) + { + minuteLastFellAsleep = current.DateTime.Minute; + } + else if (current.Activity == TimeRecordActivity.WakesUp) + { + // Record the minutes they were sleeping and reset. + for (int minute = minuteLastFellAsleep; minute < current.DateTime.Minute; minute++) + { + guardMinutesAsleep[currentGuard.Value][minute]++; + } + } + } + + // Now we know which minutes each guard was asleep... find out which guard + // slept the most + var totalGuardSleepTime = guardMinutesAsleep.ToDictionary(x => x.Key, x => x.Value.Sum()); + IOrderedEnumerable guardsBySleepTime = guardIds.OrderByDescending(x => totalGuardSleepTime[x]); + int sleepiestGuard = guardsBySleepTime.First(); + + int guardMaximumMinuteSleeps = guardMinutesAsleep[sleepiestGuard].Max(); + int guardSleepiestMinute = Array.IndexOf(guardMinutesAsleep[sleepiestGuard], guardMaximumMinuteSleeps); + + return (sleepiestGuard * guardSleepiestMinute).ToString(); + } + + private List SortAndPopulateGuardNumbers(List timeRecords) + { + var result = timeRecords.OrderBy(x => x.DateTime).ToList(); + int? currentGuardNumber = null; + + foreach (TimeRecord current in result) + { + if (current.GuardNumber.HasValue) + { + currentGuardNumber = current.GuardNumber; + } + else + { + current.GuardNumber = currentGuardNumber; + } + } + + return result; + } + } +} diff --git a/AoC2018.Solutions/Day04/Part02.cs b/AoC2018.Solutions/Day04/Part02.cs new file mode 100644 index 0000000..c4c971d --- /dev/null +++ b/AoC2018.Solutions/Day04/Part02.cs @@ -0,0 +1,79 @@ +namespace AoC2018.Solutions.Day04 +{ + using System; + using System.Collections.Generic; + using System.Linq; + + public class Part02 : ISolution + { + public string Solve(string input) + { + var timeRecords = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(TimeRecord.FromString).ToList(); + timeRecords = this.SortAndPopulateGuardNumbers(timeRecords); + + int[] guardIds = timeRecords.Where(x => x.GuardNumber.HasValue).Select(x => x.GuardNumber.Value).Distinct().ToArray(); + var guardMinutesAsleep = guardIds.ToDictionary(x => x, _ => new int[60]); + DateTime[] uniqueDates = timeRecords.Select(x => x.DateTime.Date).Distinct().ToArray(); + DateTime currentDate = DateTime.MinValue; + int? currentGuard = null; + int minuteLastFellAsleep = -1; + + foreach (TimeRecord current in timeRecords) + { + // Have we changed day or guard? + if (currentDate != current.DateTime.Date || currentGuard != current.GuardNumber) + { + currentDate = current.DateTime.Date; + currentGuard = current.GuardNumber; + } + + // Has the sleeping status changed? + if (current.Activity == TimeRecordActivity.FallsAsleep) + { + minuteLastFellAsleep = current.DateTime.Minute; + } + else if (current.Activity == TimeRecordActivity.WakesUp) + { + // Record the minutes they were sleeping and reset. + for (int minute = minuteLastFellAsleep; minute < current.DateTime.Minute; minute++) + { + guardMinutesAsleep[currentGuard.Value][minute]++; + } + } + } + + // Now, for each guard, find the minute they slept most during + IEnumerable<(int GuardId, int MinuteWithMostSleeps, int MaximumTimesAsleep)> guardSleepiestMinutes = guardMinutesAsleep.Select(x => + { + int maximumTimesAsleep = x.Value.Max(); + int minuteWithMostSleeps = Array.IndexOf(x.Value, maximumTimesAsleep); + return (x.Key, minuteWithMostSleeps, maximumTimesAsleep); + }); + + // And find the guard most often asleep on the same minute + (int GuardId, int MinuteWithMostSleeps, int MaximumTimesAsleep) guardMostOftenAsleepOnSameMinute = guardSleepiestMinutes.OrderByDescending(x => x.MaximumTimesAsleep).First(); + + return (guardMostOftenAsleepOnSameMinute.GuardId * guardMostOftenAsleepOnSameMinute.MinuteWithMostSleeps).ToString(); + } + + private List SortAndPopulateGuardNumbers(List timeRecords) + { + var result = timeRecords.OrderBy(x => x.DateTime).ToList(); + int? currentGuardNumber = null; + + foreach (TimeRecord current in result) + { + if (current.GuardNumber.HasValue) + { + currentGuardNumber = current.GuardNumber; + } + else + { + current.GuardNumber = currentGuardNumber; + } + } + + return result; + } + } +} diff --git a/AoC2018.Solutions/Day04/TimeRecord.cs b/AoC2018.Solutions/Day04/TimeRecord.cs new file mode 100644 index 0000000..86b8e61 --- /dev/null +++ b/AoC2018.Solutions/Day04/TimeRecord.cs @@ -0,0 +1,39 @@ +namespace AoC2018.Solutions.Day04 +{ + using System; + using System.Globalization; + + public class TimeRecord + { + public DateTime DateTime { get; set; } + + public int? GuardNumber { get; set; } + + public TimeRecordActivity Activity { get; set; } + + public static TimeRecord FromString(string input) + { + var result = new TimeRecord + { + DateTime = DateTime.ParseExact(input.Substring(1, 16), "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture), + }; + + string log = input.Substring(19); + if (log == "wakes up") + { + result.Activity = TimeRecordActivity.WakesUp; + } + else if (log == "falls asleep") + { + result.Activity = TimeRecordActivity.FallsAsleep; + } + else + { + result.Activity = TimeRecordActivity.StartsShift; + result.GuardNumber = int.Parse(log.Split(' ')[1].Substring(1)); + } + + return result; + } + } +} diff --git a/AoC2018.Solutions/Day04/TimeRecordActivity.cs b/AoC2018.Solutions/Day04/TimeRecordActivity.cs new file mode 100644 index 0000000..409734c --- /dev/null +++ b/AoC2018.Solutions/Day04/TimeRecordActivity.cs @@ -0,0 +1,13 @@ +namespace AoC2018.Solutions.Day04 +{ + using System; + + public enum TimeRecordActivity + { + StartsShift, + + FallsAsleep, + + WakesUp, + } +} diff --git a/AoC2018.Solutions/Day05/Part01.cs b/AoC2018.Solutions/Day05/Part01.cs new file mode 100644 index 0000000..9f5c43a --- /dev/null +++ b/AoC2018.Solutions/Day05/Part01.cs @@ -0,0 +1,13 @@ +namespace AoC2018.Solutions.Day05 +{ + using System.Linq; + + public class Part01 : ISolution + { + public string Solve(string input) + { + string result = PolymerReactor.React(input); + return result.Length.ToString(); + } + } +} diff --git a/AoC2018.Solutions/Day05/Part02.cs b/AoC2018.Solutions/Day05/Part02.cs new file mode 100644 index 0000000..8573db8 --- /dev/null +++ b/AoC2018.Solutions/Day05/Part02.cs @@ -0,0 +1,21 @@ +namespace AoC2018.Solutions.Day05 +{ + using System.Linq; + using System.Text.RegularExpressions; + + public class Part02 : ISolution + { + public string Solve(string input) + { + int bestResult = input.Length; + + // TODO: What can we learn about the Visual Studio Concurrency Visualiser + // from this code? + return ParallelEnumerable.Range('a', 26) + .Min(c => PolymerReactor.React( + Regex.Replace(input, ((char)c).ToString(), string.Empty, RegexOptions.IgnoreCase)) + .Length) + .ToString(); + } + } +} diff --git a/AoC2018.Solutions/Day05/PolymerReactor.cs b/AoC2018.Solutions/Day05/PolymerReactor.cs new file mode 100644 index 0000000..9aca712 --- /dev/null +++ b/AoC2018.Solutions/Day05/PolymerReactor.cs @@ -0,0 +1,40 @@ +namespace AoC2018.Solutions.Day05 +{ + using System.Collections.Generic; + using System.Linq; + + public static class PolymerReactor + { + public static string React(string polymer) + { + bool changed = false; + var current = polymer.ToCharArray().ToList(); + + do + { + changed = false; + + int i = 1; + + while (i < current.Count) + { + char first = current[i - 1]; + char second = current[i]; + + if (first != second && char.ToUpper(first) == char.ToUpper(second)) + { + current.RemoveRange(i - 1, 2); + changed = true; + } + else + { + i++; + } + } + } + while (changed); + + return new string(current.ToArray()); + } + } +} diff --git a/AoC2018.Solutions/Day06/Part01.cs b/AoC2018.Solutions/Day06/Part01.cs new file mode 100644 index 0000000..29446fe --- /dev/null +++ b/AoC2018.Solutions/Day06/Part01.cs @@ -0,0 +1,53 @@ +namespace AoC2018.Solutions.Day06 +{ + using System; + using System.Collections.Generic; + using System.Drawing; + using System.Linq; + + public class Part01 : ISolution + { + public string Solve(string input) + { + var points = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(PointBuilder.FromString).ToList(); + + // Find the extent of the board that contains points + var topLeft = new Point + { + X = points.Min(x => x.X), + Y = points.Min(x => x.Y), + }; + + var bottomRight = new Point + { + X = points.Max(x => x.X), + Y = points.Max(x => x.Y), + }; + + var ownership = points.ToDictionary(x => x, _ => new List()); + + // Theory: if we find the grid that contains all the points, + // then calculate the ownership of every cell in the grid, + // then assume any areas that touch the edge will be infinite, so we + // should discount them, then we should get the answer. + foreach (Point gridLocation in topLeft.BuildRangeTo(bottomRight)) + { + Point[] closestPoints = gridLocation.FindClosest(points); + + if (closestPoints.Length == 1) + { + ownership[closestPoints[0]].Add(gridLocation); + } + } + + // Now get all the points whose areas don't touch the edge of the grid. + var pointsWithBoundedAreas = ownership.Where(x => x.Value.All(p => p.X != topLeft.X && p.X != bottomRight.X && p.Y != topLeft.Y && p.Y != bottomRight.Y)).Select(x => x.Key).ToList(); + + // Now work out the size of the area for each point + IEnumerable areaSizes = pointsWithBoundedAreas.Select(x => ownership[x].Count); + int largestAreaSize = areaSizes.Max(); + + return largestAreaSize.ToString(); + } + } +} diff --git a/AoC2018.Solutions/Day06/Part02.cs b/AoC2018.Solutions/Day06/Part02.cs new file mode 100644 index 0000000..bac6df0 --- /dev/null +++ b/AoC2018.Solutions/Day06/Part02.cs @@ -0,0 +1,46 @@ +namespace AoC2018.Solutions.Day06 +{ + using System; + using System.Collections.Generic; + using System.Drawing; + using System.Linq; + + public class Part02 : ISolution + { + public string Solve(string input) => this.Solve(input, 10000); + + public string Solve(string input, int targetDistance) + { + var points = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(PointBuilder.FromString).ToList(); + + // Find the extent of the board that contains points + var topLeft = new Point + { + X = points.Min(x => x.X), + Y = points.Min(x => x.Y), + }; + + var bottomRight = new Point + { + X = points.Max(x => x.X), + Y = points.Max(x => x.Y), + }; + + var pointsInRange = 0; + + // Theory: if we find the grid that contains all the points, + // then calculate the ownership of every cell in the grid, + // then assume any areas that touch the edge will be infinite, so we + // should discount them, then we should get the answer. + foreach (Point gridLocation in topLeft.BuildRangeTo(bottomRight)) + { + if (points.Sum(x => x.ManhattanDistanceFrom(gridLocation)) < targetDistance) + { + pointsInRange++; + } + } + + return pointsInRange.ToString(); + } + } +} diff --git a/AoC2018.Solutions/Day06/PointBuilder.cs b/AoC2018.Solutions/Day06/PointBuilder.cs new file mode 100644 index 0000000..efbbeb9 --- /dev/null +++ b/AoC2018.Solutions/Day06/PointBuilder.cs @@ -0,0 +1,18 @@ +namespace AoC2018.Solutions.Day06 +{ + using System; + using System.Drawing; + + public static class PointBuilder + { + public static Point FromString(string input) + { + string[] components = input.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); + return new Point + { + X = int.Parse(components[0]), + Y = int.Parse(components[1]), + }; + } + } +} diff --git a/AoC2018.Solutions/Day06/PointExtensions.cs b/AoC2018.Solutions/Day06/PointExtensions.cs new file mode 100644 index 0000000..1a73699 --- /dev/null +++ b/AoC2018.Solutions/Day06/PointExtensions.cs @@ -0,0 +1,33 @@ +namespace AoC2018.Solutions.Day06 +{ + using System; + using System.Collections.Generic; + using System.Drawing; + using System.Linq; + + public static class PointExtensions + { + public static int ManhattanDistanceFrom(this Point point, Point other) + { + return Math.Abs(point.X - other.X) + Math.Abs(point.Y - other.Y); + } + + public static Point[] FindClosest(this Point origin, IEnumerable points) + { + (Point point, int distance)[] distances = points.Select(x => (x, x.ManhattanDistanceFrom(origin))).ToArray(); + int closestDistance = distances.Min(x => x.distance); + return distances.Where(x => x.distance == closestDistance).Select(x => x.point).ToArray(); + } + + public static IEnumerable BuildRangeTo(this Point start, Point finish) + { + for (int x = start.X; x <= finish.X; x++) + { + for (int y = start.Y; y <= finish.Y; y++) + { + yield return new Point { X = x, Y = y }; + } + } + } + } +} diff --git a/AoC2018.Solutions/ISolution.cs b/AoC2018.Solutions/ISolution.cs new file mode 100644 index 0000000..700acc5 --- /dev/null +++ b/AoC2018.Solutions/ISolution.cs @@ -0,0 +1,7 @@ +namespace AoC2018.Solutions +{ + public interface ISolution + { + string Solve(string input); + } +} diff --git a/AoC2018.Solutions/SolutionFactory.cs b/AoC2018.Solutions/SolutionFactory.cs new file mode 100644 index 0000000..f054bec --- /dev/null +++ b/AoC2018.Solutions/SolutionFactory.cs @@ -0,0 +1,16 @@ +namespace AoC2018.Solutions +{ + using System; + + public static class SolutionFactory + { + public static ISolution GetSolution(int day, int part) + { + string className = $"AoC2018.Solutions.Day{day:D2}.Part{part:D2}"; + Type targetType = typeof(ISolution).Assembly.GetType(className); + var instance = (ISolution)Activator.CreateInstance(targetType); + + return instance; + } + } +} diff --git a/AoC2018.Tests/AoC2018.Tests.csproj b/AoC2018.Tests/AoC2018.Tests.csproj new file mode 100644 index 0000000..d2c3a7e --- /dev/null +++ b/AoC2018.Tests/AoC2018.Tests.csproj @@ -0,0 +1,27 @@ + + + + netcoreapp2.1 + ..\AoC2018.Solutions.ruleset + false + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + + + + + \ No newline at end of file diff --git a/AoC2018.Tests/AoCTestCases.cs b/AoC2018.Tests/AoCTestCases.cs new file mode 100644 index 0000000..27c562b --- /dev/null +++ b/AoC2018.Tests/AoCTestCases.cs @@ -0,0 +1,48 @@ +// +// Copyright (c) Endjin. All rights reserved. +// + +namespace Tests +{ + using AoC2018.Solutions; + using NUnit.Framework; + + public class AoCTestCases + { + [TestCase(1, 1, "+1\r\n-2\r\n+3\r\n+1", "3")] + [TestCase(1, 1, "+1\r\n+1\r\n+1", "3")] + [TestCase(1, 1, "+1\r\n+1\r\n-2", "0")] + [TestCase(1, 1, "-1\r\n-2\r\n-3", "-6")] + [TestCase(1, 2, "+1\r\n-1", "0")] + [TestCase(1, 2, "+3\r\n+3\r\n+4\r\n-2\r\n-4", "10")] + [TestCase(1, 2, "-6\r\n+3\r\n+8\r\n+5\r\n-6", "5")] + [TestCase(1, 2, "+7\r\n+7\r\n-2\r\n-7\r\n-4", "14")] + [TestCase(2, 1, "abcdef\r\nbababc\r\nabbcde\r\nabcccd\r\naabcdd\r\nabcdee\r\nababab", "12")] + [TestCase(2, 2, "abcde\r\nfghij\r\nklmno\r\npqrst\r\nfguij\r\naxcye\r\nwvxyz", "fgij")] + [TestCase(3, 1, "#1 @ 1,3: 4x4\r\n#2 @ 3,1: 4x4\r\n#3 @ 5,5: 2x2", "4")] + [TestCase(3, 2, "#1 @ 1,3: 4x4\r\n#2 @ 3,1: 4x4\r\n#3 @ 5,5: 2x2", "3")] + [TestCase(4, 1, "[1518-11-01 00:00] Guard #10 begins shift\r\n[1518-11-01 00:05] falls asleep\r\n[1518-11-01 00:25] wakes up\r\n[1518-11-01 00:30] falls asleep\r\n[1518-11-01 00:55] wakes up\r\n[1518-11-01 23:58] Guard #99 begins shift\r\n[1518-11-02 00:40] falls asleep\r\n[1518-11-02 00:50] wakes up\r\n[1518-11-03 00:05] Guard #10 begins shift\r\n[1518-11-03 00:24] falls asleep\r\n[1518-11-03 00:29] wakes up\r\n[1518-11-04 00:02] Guard #99 begins shift\r\n[1518-11-04 00:36] falls asleep\r\n[1518-11-04 00:46] wakes up\r\n[1518-11-05 00:03] Guard #99 begins shift\r\n[1518-11-05 00:45] falls asleep\r\n[1518-11-05 00:55] wakes up", "240")] + [TestCase(4, 2, "[1518-11-01 00:00] Guard #10 begins shift\r\n[1518-11-01 00:05] falls asleep\r\n[1518-11-01 00:25] wakes up\r\n[1518-11-01 00:30] falls asleep\r\n[1518-11-01 00:55] wakes up\r\n[1518-11-01 23:58] Guard #99 begins shift\r\n[1518-11-02 00:40] falls asleep\r\n[1518-11-02 00:50] wakes up\r\n[1518-11-03 00:05] Guard #10 begins shift\r\n[1518-11-03 00:24] falls asleep\r\n[1518-11-03 00:29] wakes up\r\n[1518-11-04 00:02] Guard #99 begins shift\r\n[1518-11-04 00:36] falls asleep\r\n[1518-11-04 00:46] wakes up\r\n[1518-11-05 00:03] Guard #99 begins shift\r\n[1518-11-05 00:45] falls asleep\r\n[1518-11-05 00:55] wakes up", "4455")] + [TestCase(5, 1, "aA", "0")] + [TestCase(5, 1, "abBA", "0")] + [TestCase(5, 1, "abAB", "4")] + [TestCase(5, 1, "aabAAB", "6")] + [TestCase(5, 1, "dabAcCaCBAcCcaDA", "10")] + [TestCase(5, 2, "dabAcCaCBAcCcaDA", "4")] + [TestCase(6, 1, "1, 1\r\n1, 6\r\n8, 3\r\n3, 4\r\n5, 5\r\n8, 9", "17")] + public void Tests(int day, int part, string input, string expectedResult) + { + ISolution solution = SolutionFactory.GetSolution(day, part); + string result = solution.Solve(input); + Assert.That(result, Is.EqualTo(expectedResult)); + } + + [Test] + public void Day06Part02() + { + var solution = new AoC2018.Solutions.Day06.Part02(); + string result = solution.Solve("1, 1\r\n1, 6\r\n8, 3\r\n3, 4\r\n5, 5\r\n8, 9", 32); + Assert.That(result, Is.EqualTo("16")); + } + } +} \ No newline at end of file diff --git a/AoC2018.Tests/Day03/ClaimTests.cs b/AoC2018.Tests/Day03/ClaimTests.cs new file mode 100644 index 0000000..f467f47 --- /dev/null +++ b/AoC2018.Tests/Day03/ClaimTests.cs @@ -0,0 +1,19 @@ +namespace AoC2018.Tests.Day03 +{ + using AoC2018.Solutions.Day03; + using NUnit.Framework; + + public class ClaimTests + { + [TestCase("#1 @ 1,3: 4x4", 1, 1, 3, 4, 4, 4, 6)] + public void CreationFromClaimString(string input, int expectedNumber, int expectedX, int expectedY, int expectedWidth, int expectedHeight, int expectedMaxX, int expectedMaxY) + { + var claim = Claim.FromString(input); + Assert.That(claim.Number, Is.EqualTo(expectedNumber)); + Assert.That(claim.Position.X, Is.EqualTo(expectedX)); + Assert.That(claim.Position.Y, Is.EqualTo(expectedY)); + Assert.That(claim.Size.Width, Is.EqualTo(expectedWidth)); + Assert.That(claim.Size.Height, Is.EqualTo(expectedHeight)); + } + } +} diff --git a/AoC2018.Tests/Day04/TimeRecordTests.cs b/AoC2018.Tests/Day04/TimeRecordTests.cs new file mode 100644 index 0000000..546b56d --- /dev/null +++ b/AoC2018.Tests/Day04/TimeRecordTests.cs @@ -0,0 +1,39 @@ +namespace AoC2018.Tests.Day04 +{ + using System; + using AoC2018.Solutions.Day04; + using NUnit.Framework; + + public class TimeRecordTests + { + [Test] + public void CreationFromStartsShiftTimeRecordString() + { + var result = TimeRecord.FromString("[1518-11-14 00:02] Guard #3011 begins shift"); + + Assert.That(result.DateTime, Is.EqualTo(new DateTime(1518, 11, 14, 0, 2, 0))); + Assert.That(result.Activity, Is.EqualTo(TimeRecordActivity.StartsShift)); + Assert.That(result.GuardNumber, Is.EqualTo(3011)); + } + + [Test] + public void CreationFromFallsAsleepTimeRecordString() + { + var result = TimeRecord.FromString("[1518-11-01 23:58] falls asleep"); + + Assert.That(result.DateTime, Is.EqualTo(new DateTime(1518, 11, 01, 23, 58, 0))); + Assert.That(result.Activity, Is.EqualTo(TimeRecordActivity.FallsAsleep)); + Assert.That(result.GuardNumber, Is.Null); + } + + [Test] + public void CreationFromWakesUpTimeRecordString() + { + var result = TimeRecord.FromString("[1518-06-09 00:52] wakes up"); + + Assert.That(result.DateTime, Is.EqualTo(new DateTime(1518, 06, 09, 0, 52, 0))); + Assert.That(result.Activity, Is.EqualTo(TimeRecordActivity.WakesUp)); + Assert.That(result.GuardNumber, Is.Null); + } + } +} diff --git a/AoC2018.Tests/Day06/PointExtensionTests.cs b/AoC2018.Tests/Day06/PointExtensionTests.cs new file mode 100644 index 0000000..5d46568 --- /dev/null +++ b/AoC2018.Tests/Day06/PointExtensionTests.cs @@ -0,0 +1,49 @@ +namespace AoC2018.Tests.Day06 +{ + using System.Drawing; + using AoC2018.Solutions.Day06; + using NUnit.Framework; + + public class PointExtensionTests + { + private static readonly Point[] Points = new[] + { + new Point { X = 1, Y = 1 }, + new Point { X = 1, Y = 6 }, + new Point { X = 8, Y = 3 }, + new Point { X = 3, Y = 4 }, + new Point { X = 5, Y = 5 }, + new Point { X = 8, Y = 9 }, + }; + + [Test] + public void FindClosestWithSingleMatch() + { + var testPoint = new Point { X = 2, Y = 2 }; + + Point[] closest = testPoint.FindClosest(Points); + + Assert.That(closest.Length, Is.EqualTo(1)); + } + + [Test] + public void FindClosestWithExactMatch() + { + var testPoint = new Point { X = 1, Y = 1 }; + + Point[] closest = testPoint.FindClosest(Points); + + Assert.That(closest.Length, Is.EqualTo(1)); + } + + [Test] + public void FindClosestWithMultipleMatches() + { + var testPoint = new Point { X = 1, Y = 4 }; + + Point[] closest = testPoint.FindClosest(Points); + + Assert.That(closest.Length, Is.EqualTo(2)); + } + } +} diff --git a/stylecop.json b/stylecop.json new file mode 100644 index 0000000..6c38a55 --- /dev/null +++ b/stylecop.json @@ -0,0 +1,20 @@ +{ + // ACTION REQUIRED: This file was automatically added to your project, but it + // will not take effect until additional steps are taken to enable it. See the + // following page for additional information: + // + // https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/EnableConfiguration.md + + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "documentationRules": { + "companyName": "Endjin", + "copyrightText": "", + "documentInterfaces": false, + "documentExposedElements": false, + "documentInternalElements": false, + "documentPrivateElements": false, + "documentPrivateFields": false + } + } +}