diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f2e5b97 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,145 @@ +# top-most EditorConfig file +root = true + +# Don't use tabs for indentation. +[*] +indent_style = space +# (Please don't specify an indent_size here; that has too many unintended consequences.) + +# Code files +[*.{cs,csx,vb,vbx}] +indent_size = 4 +insert_final_newline = true +charset = utf-8 +end_of_line = crlf + +# Xml project files +[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}] +indent_size = 2 + +# Xml config files +[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}] +indent_size = 2 + +# JSON files +[*.json] +indent_size = 2 + +# Dotnet code style settings: +[*.{cs,vb}] +# Sort using and Import directives with System.* appearing first +dotnet_sort_system_directives_first = true + +# Avoid "this." and "Me." if not necessary +dotnet_style_qualification_for_field = false : error +dotnet_style_qualification_for_property = false : error +dotnet_style_qualification_for_method = false : error +dotnet_style_qualification_for_event = false : error + +# Use language keywords instead of framework type names for type references +dotnet_style_predefined_type_for_locals_parameters_members = true : error +dotnet_style_predefined_type_for_member_access = true : error + +# Suggest more modern language features when available +dotnet_style_object_initializer = true : suggestion +dotnet_style_collection_initializer = true : suggestion +dotnet_style_coalesce_expression = true : error +dotnet_style_null_propagation = true : error +dotnet_style_explicit_tuple_names = true : error + +# Naming rule: private static fields should use pascal casing +dotnet_naming_symbols.private_static_field.applicable_kinds = field +dotnet_naming_symbols.private_static_field.applicable_accessibilities = private +dotnet_naming_symbols.private_static_field.required_modifiers = static +dotnet_naming_style.private_static_field.capitalization = pascal_case +dotnet_naming_rule.private_static_field.severity = error +dotnet_naming_rule.private_static_field.symbols = private_static_field +dotnet_naming_rule.private_static_field.style = private_static_field + +# Naming rule: private fields should use camel casing and use underscore as a prefix +dotnet_naming_symbols.private_field.applicable_kinds = field +dotnet_naming_symbols.private_field.applicable_accessibilities = private +dotnet_naming_style.private_field.capitalization = camel_case +dotnet_naming_style.private_field.required_prefix = _ +dotnet_naming_rule.private_field.severity = error +dotnet_naming_rule.private_field.symbols = private_field +dotnet_naming_rule.private_field.style = private_field + +# Naming rule: non-private fields should use pascal casing +dotnet_naming_symbols.non_private_field.applicable_kinds = field +dotnet_naming_symbols.non_private_field.applicable_accessibilities = public,internal,friend,protected,protected_internal,protected_friend +dotnet_naming_style.non_private_field.capitalization = pascal_case +dotnet_naming_rule.non_private_field.severity = error +dotnet_naming_rule.non_private_field.symbols = non_private_field +dotnet_naming_rule.non_private_field.style = non_private_field + +# Naming rule: parameters should use camel casing +dotnet_naming_symbols.parameter.applicable_kinds = parameter +dotnet_naming_style.parameter.capitalization = camel_case +dotnet_naming_rule.parameter.severity = error +dotnet_naming_rule.parameter.symbols = parameter +dotnet_naming_rule.parameter.style = parameter + +# Naming rule: interface types should use pascal casing with I as a prefix +dotnet_naming_symbols.interface_type.applicable_kinds = interface +dotnet_naming_style.interface_type.capitalization = pascal_case +dotnet_naming_style.interface_type.required_prefix = I +dotnet_naming_rule.interface_type.severity = error +dotnet_naming_rule.interface_type.symbols = interface_type +dotnet_naming_rule.interface_type.style = interface_type + +# Naming rule: non-interface types should use pascal casing +dotnet_naming_symbols.non_interface_type.applicable_kinds = class,struct,enum,delegate +dotnet_naming_style.non_interface_type.capitalization = pascal_case +dotnet_naming_rule.non_interface_type.severity = error +dotnet_naming_rule.non_interface_type.symbols = non_interface_type +dotnet_naming_rule.non_interface_type.style = non_interface_type + +# Naming rule: methods, properties and events should use pascal casing +dotnet_naming_symbols.member.applicable_kinds = method,property,event +dotnet_naming_style.member.capitalization = pascal_case +dotnet_naming_rule.member.severity = error +dotnet_naming_rule.member.symbols = member +dotnet_naming_rule.member.style = member + +# CSharp code style settings: + +# IDE0060: Remove unused parameter +dotnet_code_quality_unused_parameters = non_public:suggestion + +[*.cs] +# Prefer "var" everywhere +csharp_style_var_for_built_in_types = true : suggestion +csharp_style_var_when_type_is_apparent = true : error +csharp_style_var_elsewhere = true : suggestion + +# Prefer method-like constructs to have a block body +csharp_style_expression_bodied_methods = false : none +csharp_style_expression_bodied_constructors = false : error +csharp_style_expression_bodied_operators = false : none + +# Prefer property-like constructs to have an expression-body +csharp_style_expression_bodied_properties = true : suggestion +csharp_style_expression_bodied_indexers = true : suggestion +csharp_style_expression_bodied_accessors = true : suggestion + +# Suggest more modern language features when available +csharp_style_pattern_matching_over_is_with_cast_check = true : suggestion +csharp_style_pattern_matching_over_as_with_null_check = true : suggestion +csharp_style_inlined_variable_declaration = true : suggestion +csharp_style_throw_expression = true : suggestion +csharp_style_conditional_delegate_call = true : suggestion + +# Newline settings +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true + +# Spacing +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_parameter_list_parentheses = false \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 99b4b1e..690c193 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1 @@ github: [chrissainty] - diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..e6de743 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,10 @@ +--- +name: Question +about: Ask a question about this project +title: "[Question]" +labels: Question, Triage +assignees: '' + +--- + +**Please be sure to check the readme file before raising an issue.** diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 16c5ce0..ac74e15 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -2,13 +2,13 @@ name-template: 'v$NEXT_PATCH_VERSION 🌈' tag-template: 'v$NEXT_PATCH_VERSION' categories: - title: '🚀 Features' - labels: - - 'Feature' + label: 'Feature' - title: '🐛 Bug Fixes' - labels: - - 'Bug' + label: 'Bug' - title: '🧰 Maintenance' label: 'Maintenance' + - title: '📖 Documentation' + label: 'Docs' change-template: '- (#$NUMBER) $TITLE - Thanks to @$AUTHOR ' template: | # What's Changed diff --git a/.github/workflows/ci-main.yml b/.github/workflows/ci-main.yml new file mode 100644 index 0000000..b7c42a5 --- /dev/null +++ b/.github/workflows/ci-main.yml @@ -0,0 +1,86 @@ +name: Build & Test Main + +on: + push: + branches: [ main ] + release: + types: [ published ] + +env: + NETCORE_VERSION: '7.0.x' + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + PROJECT_NAME: SessionStorage + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NUGET_FEED: https://api.nuget.org/v3/index.json + NUGET_KEY: ${{ secrets.NUGET_KEY }} + +jobs: + build: + name: Build, test and pack + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup .NET Core ${{ env.NETCORE_VERSION }} + uses: actions/setup-dotnet@v1 + with: + dotnet-version: ${{ env.NETCORE_VERSION }} + env: + NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} + + - name: Restore + run: dotnet restore + + - name: Build + run: dotnet build -c Release --no-restore src/Blazored.$PROJECT_NAME/Blazored.$PROJECT_NAME.csproj + + - name: Build Test Extensions + run: dotnet build -c Release --no-restore src/Blazored.$PROJECT_NAME.TestExtensions/Blazored.$PROJECT_NAME.TestExtensions.csproj + + - name: Test Local Storage + run: dotnet test -c Release --no-restore --verbosity normal tests/Blazored.$PROJECT_NAME.Tests + + deploy: + needs: build + if: github.event_name == 'release' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup .NET Core + uses: actions/setup-dotnet@v1 + with: + dotnet-version: ${{ env.NETCORE_VERSION }} + + - name: Create Release NuGet package + run: | + arrTag=(${GITHUB_REF//\// }) + VERSION="${arrTag[2]}" + echo Version: $VERSION + VERSION="${VERSION//v}" + echo Clean Version: $VERSION + dotnet pack -v normal -c Release --include-symbols --include-source -p:PackageVersion=$VERSION -o nupkg src/Blazored.$PROJECT_NAME/Blazored.$PROJECT_NAME.*proj + dotnet pack -v normal -c Release --include-symbols --include-source -p:PackageVersion=$VERSION -o nupkg src/Blazored.$PROJECT_NAME.TestExtensions/Blazored.$PROJECT_NAME.TestExtensions.csproj + + - name: Push to NuGet Feed + run: dotnet nuget push ./nupkg/*.nupkg --source $NUGET_FEED --api-key $NUGET_KEY --skip-duplicate + + - name: Publish Sample Site + run: dotnet publish -c Release samples/BlazorWebAssembly/BlazorWebAssembly.csproj + + - name: Rewrite base href + uses: SteveSandersonMS/ghaction-rewrite-base-href@v1 + with: + html_path: samples/BlazorWebAssembly/bin/Release/net7.0/publish/wwwroot/index.html + base_href: /${{ env.PROJECT_NAME }}/ + + - name: Deploy to Github Pages + uses: JamesIves/github-pages-deploy-action@releases/v3 + with: + ACCESS_TOKEN: $GITHUB_TOKEN + BASE_BRANCH: main # The branch the action should deploy from. + BRANCH: gh-pages # The branch the action should deploy to. + FOLDER: samples/BlazorWebAssembly/bin/Release/net7.0/publish/wwwroot # The folder the action should deploy. + SINGLE_COMMIT: true diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml new file mode 100644 index 0000000..1584fc7 --- /dev/null +++ b/.github/workflows/ci-pr.yml @@ -0,0 +1,33 @@ +name: Build & Test PR + +on: + pull_request: + branches: [ main ] + +env: + NETCORE_VERSION: '7.0.x' + PROJECT_NAME: Blazored.SessionStorage + +jobs: + build: + name: Build and test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setting up .NET Core SDK ${{ env.NETCORE_VERSION }}... + uses: actions/setup-dotnet@v1 + with: + dotnet-version: ${{ env.NETCORE_VERSION }} + + - name: Restoring packages... + run: dotnet restore + + - name: Building Session Storage... + run: dotnet build --configuration Release --no-restore src/$PROJECT_NAME/$PROJECT_NAME.csproj + + - name: Build Session Storage Test Extensions + run: dotnet build -c Release --no-restore src/$PROJECT_NAME.TestExtensions/$PROJECT_NAME.TestExtensions.csproj + + - name: Testing... + run: dotnet test -c Release --no-restore --verbosity normal tests/$PROJECT_NAME.Tests \ No newline at end of file diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..67341dd --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,71 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ main ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ main ] + schedule: + - cron: '28 17 * * 1' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'csharp' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 0000000..d706705 --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,14 @@ +name: Release Drafter + +on: + push: + branches: + - main + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + - uses: release-drafter/release-drafter@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3e759b7..d2d12b1 100644 --- a/.gitignore +++ b/.gitignore @@ -179,6 +179,8 @@ PublishScripts/ # NuGet Packages *.nupkg +*.snupkg + # The packages folder can be ignored because of Package Restore **/[Pp]ackages/* # except build/, which is used as an MSBuild target. diff --git a/Blazored.SessionStorage.sln b/Blazored.SessionStorage.sln index 02b5d7e..4e05906 100644 --- a/Blazored.SessionStorage.sln +++ b/Blazored.SessionStorage.sln @@ -1,22 +1,33 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28531.58 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31717.71 MinimumVisualStudioVersion = 15.0.26124.0 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blazored.SessionStorage", "src\Blazored.SessionStorage\Blazored.SessionStorage.csproj", "{EFA12DC3-35DE-449C-88F2-2BD7576CAF2C}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{F20B2AAB-FB71-4A1C-82FE-F1750B922BF6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorClientSide", "samples\BlazorClientSide\BlazorClientSide.csproj", "{D6953CE0-6AD5-434C-99AA-7FF1E26724D4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWebAssembly", "samples\BlazorWebAssembly\BlazorWebAssembly.csproj", "{D6953CE0-6AD5-434C-99AA-7FF1E26724D4}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorServerSide", "samples\BlazorServerSide\BlazorServerSide.csproj", "{767D657A-5410-4714-9477-99929D3FF709}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorServer", "samples\BlazorServer\BlazorServer.csproj", "{767D657A-5410-4714-9477-99929D3FF709}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9B1C958A-85F6-4387-98D9-71CEEE0A2A03}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9170D7A9-70CE-48E3-88A3-F11D2983103E}" ProjectSection(SolutionItems) = preProject - azure-pipelines.yml = azure-pipelines.yml + .gitignore = .gitignore + .github\workflows\ci-main.yml = .github\workflows\ci-main.yml + .github\workflows\ci-pr.yml = .github\workflows\ci-pr.yml README.md = README.md + .github\workflows\release-drafter.yml = .github\workflows\release-drafter.yml EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{B82A5126-EE01-4B4D-B642-F954B6E4E695}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blazored.SessionStorage.Tests", "tests\Blazored.SessionStorage.Tests\Blazored.SessionStorage.Tests.csproj", "{5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "bUnitExample", "samples\bUnitExample\bUnitExample.csproj", "{10F6FB83-3135-4B73-B0EB-D008A31AE8FA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blazored.SessionStorage.TestExtensions", "src\Blazored.SessionStorage.TestExtensions\Blazored.SessionStorage.TestExtensions.csproj", "{528AE63D-0043-4A63-9151-92107397EE02}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -63,6 +74,42 @@ Global {767D657A-5410-4714-9477-99929D3FF709}.Release|x64.Build.0 = Release|Any CPU {767D657A-5410-4714-9477-99929D3FF709}.Release|x86.ActiveCfg = Release|Any CPU {767D657A-5410-4714-9477-99929D3FF709}.Release|x86.Build.0 = Release|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Debug|x64.ActiveCfg = Debug|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Debug|x64.Build.0 = Debug|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Debug|x86.ActiveCfg = Debug|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Debug|x86.Build.0 = Debug|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Release|Any CPU.Build.0 = Release|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Release|x64.ActiveCfg = Release|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Release|x64.Build.0 = Release|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Release|x86.ActiveCfg = Release|Any CPU + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC}.Release|x86.Build.0 = Release|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Debug|x64.ActiveCfg = Debug|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Debug|x64.Build.0 = Debug|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Debug|x86.ActiveCfg = Debug|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Debug|x86.Build.0 = Debug|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Release|Any CPU.Build.0 = Release|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Release|x64.ActiveCfg = Release|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Release|x64.Build.0 = Release|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Release|x86.ActiveCfg = Release|Any CPU + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA}.Release|x86.Build.0 = Release|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Debug|x64.ActiveCfg = Debug|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Debug|x64.Build.0 = Debug|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Debug|x86.ActiveCfg = Debug|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Debug|x86.Build.0 = Debug|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Release|Any CPU.Build.0 = Release|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Release|x64.ActiveCfg = Release|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Release|x64.Build.0 = Release|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Release|x86.ActiveCfg = Release|Any CPU + {528AE63D-0043-4A63-9151-92107397EE02}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -70,6 +117,8 @@ Global GlobalSection(NestedProjects) = preSolution {D6953CE0-6AD5-434C-99AA-7FF1E26724D4} = {F20B2AAB-FB71-4A1C-82FE-F1750B922BF6} {767D657A-5410-4714-9477-99929D3FF709} = {F20B2AAB-FB71-4A1C-82FE-F1750B922BF6} + {5A6A013E-325D-4A5F-B2FA-659B4FD2BDBC} = {B82A5126-EE01-4B4D-B642-F954B6E4E695} + {10F6FB83-3135-4B73-B0EB-D008A31AE8FA} = {F20B2AAB-FB71-4A1C-82FE-F1750B922BF6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {2B91883F-A85A-49EB-A9C1-ABD567A9375E} diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..8f1e9e9 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,9 @@ + + + + + 6.0.12 + 7.0.1 + + + \ No newline at end of file diff --git a/README.md b/README.md index aedfe9d..3d1e274 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,52 @@ +[![Nuget version](https://img.shields.io/nuget/v/Blazored.SessionStorage.svg?logo=nuget)](https://www.nuget.org/packages/Blazored.SessionStorage/) +[![Nuget downloads](https://img.shields.io/nuget/dt/Blazored.SessionStorage?logo=nuget)](https://www.nuget.org/packages/Blazored.SessionStorage/) +![Build & Test Main](https://github.com/Blazored/SessionStorage/workflows/Build%20&%20Test%20Main/badge.svg) + # Blazored SessionStorage -A library to provide access to session storage in Blazor applications +Blazored SessionStorage is a library that provides access to the browsers session storage APIs for Blazor applications. An additional benefit of using this library is that it will handle serializing and deserializing values when saving or retrieving them. + +## Breaking Change (v1 > v2) + +### JsonSerializerOptions +From v4 onwards we use the default the `JsonSerializerOptions` for `System.Text.Json` instead of using custom ones. This will cause values saved to session storage with v3 to break things. +To retain the old settings use the following configuration when adding Blazored SessionStorage to the DI container: + +```csharp +builder.Services.AddBlazoredSessionStorage(config => { + config.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase; + config.JsonSerializerOptions.IgnoreNullValues = true; + config.JsonSerializerOptions.IgnoreReadOnlyProperties = true; + config.JsonSerializerOptions.PropertyNameCaseInsensitive = true; + config.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; + config.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip; + config.JsonSerializerOptions.WriteIndented = false; + } +); +``` -[![Build Status](https://dev.azure.com/blazored/SessionStorage/_apis/build/status/Blazored.SessionStorage?branchName=master)](https://dev.azure.com/blazored/SessionStorage/_build/latest?definitionId=1&branchName=master) +### SetItem[Async] method now serializes string values +Prior to v2 we bypassed the serialization of string values as it seemed pointless as string can be stored directly. However, this led to some edge cases where nullable strings were being saved as the string `"null"`. Then when retrieved, instead of being null the value was `"null"`. By serializing strings this issue is taken care of. +For those who wish to save raw string values, a new method `SetValueAsString[Async]` is available. This will save a string value without attempting to serialize it and will throw an exception if a null string is attempted to be saved. -![Nuget](https://img.shields.io/nuget/v/blazored.sessionstorage.svg) +## Installing -### Installing +To install the package add the following line to you csproj file replacing x.x.x with the latest version number (found at the top of this file): -You can install from NuGet using the following command: +``` + +``` -`Install-Package Blazored.SessionStorage` +You can also install via the .NET CLI with the following command: -Or via the Visual Studio package manger. +``` +dotnet add package Blazored.SessionStorage +``` -### Setup +If you're using Jetbrains Rider or Visual Studio you can also install via the built in NuGet package manager. -You will need to register the session storage services with the service collection in your _startup.cs_ file. +## Setup + +You will need to register the session storage services with the service collection in your _Startup.cs_ file in Blazor Server. ```c# public void ConfigureServices(IServiceCollection services) @@ -24,7 +55,32 @@ public void ConfigureServices(IServiceCollection services) } ``` -### Usage (Blazor WebAssembly) +Or in your _Program.cs_ file in Blazor WebAssembly. + +```c# +public static async Task Main(string[] args) +{ + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("app"); + + builder.Services.AddBlazoredSessionStorage(); + + await builder.Build().RunAsync(); +} +``` + +### Registering services as Singleton - Blazor WebAssembly **ONLY** +99% of developers will want to register Blazored SessionStorage using the method described above. However, in some very specific scenarios, +developers may have a need to register services as Singleton as apposed to Scoped. This is possible by using the following method: + +```csharp +builder.Services.AddBlazoredSessionStorageAsSingleton(); +``` + +**This method will not work with Blazor Server applications as Blazor's JS interop services are registered as Scoped and cannot be injected into Singletons.** + + +## Usage (Blazor WebAssembly) To use Blazored.SessionStorage in Blazor WebAssembly, inject the `ISessionStorageService` per the example below. ```c# @@ -57,16 +113,16 @@ With Blazor WebAssembly you also have the option of a synchronous API, if your u } ``` -### Usage (Blazor Server) +## Usage (Blazor Server) **NOTE:** Due to pre-rendering in Blazor Server you can't perform any JS interop until the `OnAfterRender` lifecycle method. ```c# @inject Blazored.SessionStorage.ISessionStorageService sessionStorage -@functions { +@code { - protected override async Task OnAfterRenderAsync() + protected override async Task OnAfterRenderAsync(bool firstRender) { await sessionStorage.SetItemAsync("name", "John Smith"); var name = await sessionStorage.GetItemAsync("name"); @@ -79,17 +135,103 @@ The APIs available are: - asynchronous via `ISessionStorageService`: - SetItemAsync() + - SetItemAsStringAsync() - GetItemAsync() + - GetItemAsStringAsync() - RemoveItemAsync() + - RemoveItemsAsync() - ClearAsync() - LengthAsync() - KeyAsync() -- synchronous via `ISyncSessionStorageService`: + - KeysAsync() + - ContainKeyAsync() + +- synchronous via `ISyncSessionStorageService` (Synchronous methods are **only** available in Blazor WebAssembly): - SetItem() + - SetItemAsString() - GetItem() + - GetItemAsString() - RemoveItem() + - RemovesItem() - Clear() - Length() - Key() + - Keys() + - ContainKey() + +**Note:** Blazored.SessionStorage methods will handle the serialisation and de-serialisation of the data for you, the exception is the `GetItemAsString[Async]` method which will return the raw string value from session storage. + +## Configuring JSON Serializer Options +You can configure the options for the default serializer (System.Text.Json) when calling the `AddBlazoredSessionStorage` method to register services. + +```c# +public static async Task Main(string[] args) +{ + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("app"); + + builder.Services.AddBlazoredSessionStorage(config => + config.JsonSerializerOptions.WriteIndented = true + ); -**Note:** Blazored.SessionStorage methods will handle the serialisation and de-serialisation of the data for you. + await builder.Build().RunAsync(); +} +``` + +## Using a custom JSON serializer +By default, the library uses `System.Text.Json`. If you prefer to use a different JSON library for serialization--or if you want to add some custom logic when serializing or deserializing--you can provide your own serializer which implements the `Blazored.SessionStorage.Serialization.IJsonSerializer` interface. + +To register your own serializer in place of the default one, you can do the following: + +```csharp +builder.Services.AddBlazoredSessionStorage(); +builder.Services.Replace(ServiceDescriptor.Scoped()); +``` + +You can find an example of this in the Blazor Server sample project. The standard serializer has been replaced with a new serializer which uses NewtonsoftJson. + +## Testing with bUnit +This library provides test extensions for use with the [bUnit testing library](https://bunit.dev/). Using these test extensions will provide an in memory implementation which mimics session storage allowing more realistic testing of your components. + +### Installing + +To install the package add the following line to you csproj file replacing x.x.x with the latest version number (found at the top of this file): + +``` + +``` + +You can also install via the .NET CLI with the following command: + +``` +dotnet add package Blazored.SessionStorage.TestExtensions +``` + +If you're using Jetbrains Rider or Visual Studio you can also install via the built in NuGet package manager. + +### Usage example + +Below is an example test which uses these extensions. You can find an example project which shows this code in action in the samples folder. + +```c# +public class IndexPageTests : TestContext +{ + [Fact] + public async Task SavesNameToSessionStorage() + { + // Arrange + const string inputName = "John Smith"; + var sessionStorage = this.AddBlazoredSessionStorage(); + var cut = RenderComponent(); + + // Act + cut.Find("#Name").Change(inputName); + cut.Find("#NameButton").Click(); + + // Assert + var name = await sessionStorage.GetItemAsync("name"); + + Assert.Equal(inputName, name); + } +} +``` diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 19b3826..0000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,34 +0,0 @@ -trigger: -- master - -pool: - vmImage: 'vs2017-win2016' - -variables: - buildConfiguration: 'Release' - -steps: -- task: DotNetCoreInstaller@0 - displayName: 'Installing .NET Core SDK...' - inputs: - version: 3.0.100-rc1-014190 - -- task: NuGetToolInstaller@0 - displayName: 'Installing Nuget Tools...' - inputs: - versionSpec: '4.9.2' - -- script: dotnet build --configuration $(buildConfiguration) src/Blazored.SessionStorage/Blazored.SessionStorage.csproj - displayName: 'Building $(buildConfiguration)...' - -- task: DotNetCoreCLI@2 - displayName: 'Generating Nuget Package... ' - inputs: - command: pack - - arguments: --no-build - packagesToPack: src/Blazored.SessionStorage/Blazored.SessionStorage.csproj - configuration: $(buildConfiguration) - -- task: PublishBuildArtifacts@1 - displayName: 'Publishing Build Artifacts...' diff --git a/samples/BlazorClientSide/BlazorClientSide.csproj b/samples/BlazorClientSide/BlazorClientSide.csproj deleted file mode 100644 index 85df72f..0000000 --- a/samples/BlazorClientSide/BlazorClientSide.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - - netstandard2.0 - - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json; - https://dotnet.myget.org/F/blazor-dev/api/v3/index.json; - - 7.3 - 3.0 - - - - - - - - - - - - - diff --git a/samples/BlazorClientSide/Pages/_Imports.razor b/samples/BlazorClientSide/Pages/_Imports.razor deleted file mode 100644 index 0f24eda..0000000 --- a/samples/BlazorClientSide/Pages/_Imports.razor +++ /dev/null @@ -1 +0,0 @@ -@layout MainLayout diff --git a/samples/BlazorClientSide/Program.cs b/samples/BlazorClientSide/Program.cs deleted file mode 100644 index 755f692..0000000 --- a/samples/BlazorClientSide/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Microsoft.AspNetCore.Blazor.Hosting; - -namespace BlazorClientSide -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IWebAssemblyHostBuilder CreateHostBuilder(string[] args) => - BlazorWebAssemblyHost.CreateDefaultBuilder() - .UseBlazorStartup(); - } -} diff --git a/samples/BlazorClientSide/Shared/MainLayout.razor b/samples/BlazorClientSide/Shared/MainLayout.razor deleted file mode 100644 index 902e3ed..0000000 --- a/samples/BlazorClientSide/Shared/MainLayout.razor +++ /dev/null @@ -1,15 +0,0 @@ -@inherits LayoutComponentBase - - - -
-
- About -
- -
- @Body -
-
diff --git a/samples/BlazorClientSide/Startup.cs b/samples/BlazorClientSide/Startup.cs deleted file mode 100644 index fb812ae..0000000 --- a/samples/BlazorClientSide/Startup.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Blazored.SessionStorage; -using Microsoft.AspNetCore.Components.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace BlazorClientSide -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddBlazoredSessionStorage(); - } - - public void Configure(IComponentsApplicationBuilder app) - { - app.AddComponent("app"); - } - } -} diff --git a/samples/BlazorClientSide/_Imports.razor b/samples/BlazorClientSide/_Imports.razor deleted file mode 100644 index 5c718e7..0000000 --- a/samples/BlazorClientSide/_Imports.razor +++ /dev/null @@ -1,8 +0,0 @@ -@using System.Net.Http -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Web -@using Microsoft.JSInterop -@using BlazorClientSide -@using BlazorClientSide.Shared - -@using Blazored.SessionStorage diff --git a/samples/BlazorClientSide/wwwroot/css/site.css b/samples/BlazorClientSide/wwwroot/css/site.css deleted file mode 100644 index 7338534..0000000 --- a/samples/BlazorClientSide/wwwroot/css/site.css +++ /dev/null @@ -1,123 +0,0 @@ -@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); - -html, body { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} - -app { - position: relative; - display: flex; - flex-direction: column; -} - -.top-row { - height: 3.5rem; - display: flex; - align-items: center; -} - -.main { - flex: 1; -} - - .main .top-row { - background-color: #e6e6e6; - border-bottom: 1px solid #d6d5d5; - } - -.sidebar { - background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); -} - - .sidebar .top-row { - background-color: rgba(0,0,0,0.4); - } - - .sidebar .navbar-brand { - font-size: 1.1rem; - } - - .sidebar .oi { - width: 2rem; - font-size: 1.1rem; - vertical-align: text-top; - top: -2px; - } - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - - .nav-item a.active { - background-color: rgba(255,255,255,0.25); - color: white; - } - - .nav-item a:hover { - background-color: rgba(255,255,255,0.1); - color: white; - } - -.content { - padding-top: 1.1rem; -} - -.navbar-toggler { - background-color: rgba(255, 255, 255, 0.1); -} - -@media (max-width: 767.98px) { - .main .top-row { - display: none; - } -} - -@media (min-width: 768px) { - app { - flex-direction: row; - } - - .sidebar { - width: 250px; - height: 100vh; - position: sticky; - top: 0; - } - - .main .top-row { - position: sticky; - top: 0; - } - - .main > div { - padding-left: 2rem !important; - padding-right: 1.5rem !important; - } - - .navbar-toggler { - display: none; - } - - .sidebar .collapse { - /* Never collapse the sidebar for wide screens */ - display: block; - } -} diff --git a/samples/BlazorClientSide/wwwroot/index.html b/samples/BlazorClientSide/wwwroot/index.html deleted file mode 100644 index 3ea544f..0000000 --- a/samples/BlazorClientSide/wwwroot/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - Blazored SessionStorage - - - - - - Loading... - - - - diff --git a/samples/BlazorServerSide/App.razor b/samples/BlazorServer/App.razor similarity index 62% rename from samples/BlazorServerSide/App.razor rename to samples/BlazorServer/App.razor index 0c89788..b941644 100644 --- a/samples/BlazorServerSide/App.razor +++ b/samples/BlazorServer/App.razor @@ -1,8 +1,4 @@ -@* - The Router component displays whichever component has a @page - directive matching the current URI. -*@ - + @@ -11,4 +7,4 @@

Sorry, there's nothing at this address.

-
\ No newline at end of file +
diff --git a/samples/BlazorServerSide/BlazorServerSide.csproj b/samples/BlazorServer/BlazorServer.csproj similarity index 60% rename from samples/BlazorServerSide/BlazorServerSide.csproj rename to samples/BlazorServer/BlazorServer.csproj index 0728b6a..98d95a3 100644 --- a/samples/BlazorServerSide/BlazorServerSide.csproj +++ b/samples/BlazorServer/BlazorServer.csproj @@ -1,11 +1,13 @@  - netcoreapp3.0 - 7.3 - true + net7.0 + + + + diff --git a/samples/BlazorServer/Pages/Error.cshtml b/samples/BlazorServer/Pages/Error.cshtml new file mode 100644 index 0000000..5f5a016 --- /dev/null +++ b/samples/BlazorServer/Pages/Error.cshtml @@ -0,0 +1,42 @@ +@page +@model WebApplication2.Pages.ErrorModel + + + + + + + + Error + + + + + +
+
+

Error.

+

An error occurred while processing your request.

+ + @if (Model.ShowRequestId) + { +

+ Request ID: @Model.RequestId +

+ } + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

+
+
+ + + diff --git a/samples/BlazorServer/Pages/Error.cshtml.cs b/samples/BlazorServer/Pages/Error.cshtml.cs new file mode 100644 index 0000000..67ebdb8 --- /dev/null +++ b/samples/BlazorServer/Pages/Error.cshtml.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; + +namespace WebApplication2.Pages +{ + [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] + [IgnoreAntiforgeryToken] + public class ErrorModel : PageModel + { + public string RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + private readonly ILogger _logger; + + public ErrorModel(ILogger logger) + { + _logger = logger; + } + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } + } +} diff --git a/samples/BlazorServerSide/Pages/Index.razor b/samples/BlazorServer/Pages/Index.razor similarity index 79% rename from samples/BlazorServerSide/Pages/Index.razor rename to samples/BlazorServer/Pages/Index.razor index 86c0409..d0e96fb 100644 --- a/samples/BlazorServerSide/Pages/Index.razor +++ b/samples/BlazorServer/Pages/Index.razor @@ -1,5 +1,4 @@ @page "/" -@using Microsoft.AspNetCore.Components.Web @inject ISessionStorageService sessionStorage

Blazored SessionStorage Sample

@@ -7,7 +6,7 @@
- +
Add Item to session storage
@@ -40,27 +39,33 @@
Items in session storage
@ItemsInSessionStorage
+
+
Item exist in session storage
@(ItemExist) +
@code { - string NameFromSessionStorage { get; set; } - int ItemsInSessionStorage { get; set; } - string Name { get; set; } + string NameFromSessionStorage { get; set; } + int ItemsInSessionStorage { get; set; } + string Name { get; set; } + bool ItemExist { get; set; } protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender) - { - await GetNameFromSessionStorage(); - await GetSessionStorageLength(); - - sessionStorage.Changed += (sender, e) => - { - Console.WriteLine($"Value for key {e.Key} changed from {e.OldValue} to {e.NewValue}"); - }; - - StateHasChanged(); + { + if (firstRender) + { + await GetNameFromSessionStorage(); + await GetSessionStorageLength(); + + sessionStorage.Changed += (sender, e) => + { + Console.WriteLine($"Value for key {e.Key} changed from {e.OldValue} to {e.NewValue}"); + }; + await TestTimespan(); + + + StateHasChanged(); } } @@ -104,6 +109,17 @@ { Console.WriteLine(await sessionStorage.LengthAsync()); ItemsInSessionStorage = await sessionStorage.LengthAsync(); + ItemExist = await sessionStorage.ContainKeyAsync("name"); + } + + async Task TestTimespan() + { + var timespan = await sessionStorage.GetItemAsync("timespan"); + if(timespan == TimeSpan.Zero) + { + await sessionStorage.SetItemAsync("timespan", new TimeSpan(0,15,0)); + timespan = await sessionStorage.GetItemAsync("timespan"); + } } } diff --git a/samples/BlazorServer/Pages/_Host.cshtml b/samples/BlazorServer/Pages/_Host.cshtml new file mode 100644 index 0000000..a136266 --- /dev/null +++ b/samples/BlazorServer/Pages/_Host.cshtml @@ -0,0 +1,32 @@ +@page "/" +@namespace BlazorServer.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers + + + + + + + Blazored SessionStorage (Server) + + + + + + + + +
+ + An error has occurred. This application may no longer respond until reloaded. + + + An unhandled exception has occurred. See browser dev tools for details. + + Reload + 🗙 +
+ + + + diff --git a/samples/BlazorServerSide/Program.cs b/samples/BlazorServer/Program.cs similarity index 66% rename from samples/BlazorServerSide/Program.cs rename to samples/BlazorServer/Program.cs index 23a8797..1f2b71a 100644 --- a/samples/BlazorServerSide/Program.cs +++ b/samples/BlazorServer/Program.cs @@ -1,15 +1,7 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -namespace BlazorServerSide +namespace BlazorServer { public class Program { diff --git a/samples/BlazorServer/Shared/MainLayout.razor b/samples/BlazorServer/Shared/MainLayout.razor new file mode 100644 index 0000000..2281c4f --- /dev/null +++ b/samples/BlazorServer/Shared/MainLayout.razor @@ -0,0 +1,17 @@ +@inherits LayoutComponentBase + +
+ + +
+
+ About +
+ +
+ @Body +
+
+
diff --git a/samples/BlazorServer/Shared/MainLayout.razor.css b/samples/BlazorServer/Shared/MainLayout.razor.css new file mode 100644 index 0000000..4ad9519 --- /dev/null +++ b/samples/BlazorServer/Shared/MainLayout.razor.css @@ -0,0 +1,70 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +.main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + } + + .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row:not(.auth) { + display: none; + } + + .top-row.auth { + justify-content: space-between; + } + + .top-row a, .top-row .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .main > div { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/samples/BlazorServerSide/Shared/NavMenu.razor b/samples/BlazorServer/Shared/NavMenu.razor similarity index 100% rename from samples/BlazorServerSide/Shared/NavMenu.razor rename to samples/BlazorServer/Shared/NavMenu.razor diff --git a/samples/BlazorServer/Shared/NavMenu.razor.css b/samples/BlazorServer/Shared/NavMenu.razor.css new file mode 100644 index 0000000..f7f4dbe --- /dev/null +++ b/samples/BlazorServer/Shared/NavMenu.razor.css @@ -0,0 +1,62 @@ +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.oi { + width: 2rem; + font-size: 1.1rem; + vertical-align: text-top; + top: -2px; +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + + .nav-item ::deep a.active { + background-color: rgba(255,255,255,0.25); + color: white; + } + + .nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; + } + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } +} diff --git a/samples/BlazorServerSide/Startup.cs b/samples/BlazorServer/Startup.cs similarity index 62% rename from samples/BlazorServerSide/Startup.cs rename to samples/BlazorServer/Startup.cs index 64fb58b..afb1033 100644 --- a/samples/BlazorServerSide/Startup.cs +++ b/samples/BlazorServer/Startup.cs @@ -3,18 +3,31 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Blazored.SessionStorage; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Blazored.SessionStorage.Serialization; +using Newtonsoft.Json; +using System; -namespace BlazorServerSide +namespace BlazorServer { public class Startup { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); - services.AddServerSideBlazor(); + services.AddServerSideBlazor(config => config.DetailedErrors = true); services.AddBlazoredSessionStorage(); + services.Replace(ServiceDescriptor.Scoped()); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. @@ -26,12 +39,12 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) } else { + app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); - app.UseStaticFiles(); app.UseRouting(); @@ -43,4 +56,13 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) }); } } + + public class NewtonSoftJsonSerializer : IJsonSerializer + { + public T Deserialize(string text) + =>JsonConvert.DeserializeObject(text); + + public string Serialize(T obj) + => JsonConvert.SerializeObject(obj); + } } diff --git a/samples/BlazorServer/_Imports.razor b/samples/BlazorServer/_Imports.razor new file mode 100644 index 0000000..f71dbdc --- /dev/null +++ b/samples/BlazorServer/_Imports.razor @@ -0,0 +1,12 @@ +@using System.Net.Http +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using BlazorServer +@using BlazorServer.Shared + +@using Blazored.SessionStorage diff --git a/samples/BlazorServerSide/appsettings.Development.json b/samples/BlazorServer/appsettings.Development.json similarity index 100% rename from samples/BlazorServerSide/appsettings.Development.json rename to samples/BlazorServer/appsettings.Development.json diff --git a/samples/BlazorServerSide/appsettings.json b/samples/BlazorServer/appsettings.json similarity index 100% rename from samples/BlazorServerSide/appsettings.json rename to samples/BlazorServer/appsettings.json diff --git a/samples/BlazorServerSide/wwwroot/css/bootstrap/bootstrap.min.css b/samples/BlazorServer/wwwroot/css/bootstrap/bootstrap.min.css similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/bootstrap/bootstrap.min.css rename to samples/BlazorServer/wwwroot/css/bootstrap/bootstrap.min.css diff --git a/samples/BlazorServerSide/wwwroot/css/bootstrap/bootstrap.min.css.map b/samples/BlazorServer/wwwroot/css/bootstrap/bootstrap.min.css.map similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/bootstrap/bootstrap.min.css.map rename to samples/BlazorServer/wwwroot/css/bootstrap/bootstrap.min.css.map diff --git a/samples/BlazorClientSide/wwwroot/css/open-iconic/FONT-LICENSE b/samples/BlazorServer/wwwroot/css/open-iconic/FONT-LICENSE similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/open-iconic/FONT-LICENSE rename to samples/BlazorServer/wwwroot/css/open-iconic/FONT-LICENSE diff --git a/samples/BlazorClientSide/wwwroot/css/open-iconic/ICON-LICENSE b/samples/BlazorServer/wwwroot/css/open-iconic/ICON-LICENSE similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/open-iconic/ICON-LICENSE rename to samples/BlazorServer/wwwroot/css/open-iconic/ICON-LICENSE diff --git a/samples/BlazorClientSide/wwwroot/css/open-iconic/README.md b/samples/BlazorServer/wwwroot/css/open-iconic/README.md similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/open-iconic/README.md rename to samples/BlazorServer/wwwroot/css/open-iconic/README.md diff --git a/samples/BlazorClientSide/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css b/samples/BlazorServer/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css rename to samples/BlazorServer/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css diff --git a/samples/BlazorClientSide/wwwroot/css/open-iconic/font/fonts/open-iconic.eot b/samples/BlazorServer/wwwroot/css/open-iconic/font/fonts/open-iconic.eot similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/open-iconic/font/fonts/open-iconic.eot rename to samples/BlazorServer/wwwroot/css/open-iconic/font/fonts/open-iconic.eot diff --git a/samples/BlazorClientSide/wwwroot/css/open-iconic/font/fonts/open-iconic.otf b/samples/BlazorServer/wwwroot/css/open-iconic/font/fonts/open-iconic.otf similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/open-iconic/font/fonts/open-iconic.otf rename to samples/BlazorServer/wwwroot/css/open-iconic/font/fonts/open-iconic.otf diff --git a/samples/BlazorClientSide/wwwroot/css/open-iconic/font/fonts/open-iconic.svg b/samples/BlazorServer/wwwroot/css/open-iconic/font/fonts/open-iconic.svg similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/open-iconic/font/fonts/open-iconic.svg rename to samples/BlazorServer/wwwroot/css/open-iconic/font/fonts/open-iconic.svg diff --git a/samples/BlazorClientSide/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf b/samples/BlazorServer/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf rename to samples/BlazorServer/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf diff --git a/samples/BlazorClientSide/wwwroot/css/open-iconic/font/fonts/open-iconic.woff b/samples/BlazorServer/wwwroot/css/open-iconic/font/fonts/open-iconic.woff similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/open-iconic/font/fonts/open-iconic.woff rename to samples/BlazorServer/wwwroot/css/open-iconic/font/fonts/open-iconic.woff diff --git a/samples/BlazorServer/wwwroot/css/site.css b/samples/BlazorServer/wwwroot/css/site.css new file mode 100644 index 0000000..caebf2a --- /dev/null +++ b/samples/BlazorServer/wwwroot/css/site.css @@ -0,0 +1,50 @@ +@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); + +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +a, .btn-link { + color: #0366d6; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } diff --git a/samples/BlazorServerSide/wwwroot/favicon.ico b/samples/BlazorServer/wwwroot/favicon.ico similarity index 100% rename from samples/BlazorServerSide/wwwroot/favicon.ico rename to samples/BlazorServer/wwwroot/favicon.ico diff --git a/samples/BlazorServerSide/Pages/_Host.cshtml b/samples/BlazorServerSide/Pages/_Host.cshtml deleted file mode 100644 index 469597c..0000000 --- a/samples/BlazorServerSide/Pages/_Host.cshtml +++ /dev/null @@ -1,29 +0,0 @@ -@page "/" -@namespace BlazorServerSide.Pages -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers - - - - - - - Blazored LocalStorage - Server-Side - - - - - - - - - - - @(await Html.RenderComponentAsync(RenderMode.Server)) - - - - diff --git a/samples/BlazorServerSide/Pages/_Imports.razor b/samples/BlazorServerSide/Pages/_Imports.razor deleted file mode 100644 index 0f24eda..0000000 --- a/samples/BlazorServerSide/Pages/_Imports.razor +++ /dev/null @@ -1 +0,0 @@ -@layout MainLayout diff --git a/samples/BlazorServerSide/Shared/MainLayout.razor b/samples/BlazorServerSide/Shared/MainLayout.razor deleted file mode 100644 index 97e764d..0000000 --- a/samples/BlazorServerSide/Shared/MainLayout.razor +++ /dev/null @@ -1,15 +0,0 @@ -@inherits LayoutComponentBase - - - -
-
- About -
- -
- @Body -
-
diff --git a/samples/BlazorServerSide/wwwroot/css/site.css b/samples/BlazorServerSide/wwwroot/css/site.css deleted file mode 100644 index 2789bc7..0000000 --- a/samples/BlazorServerSide/wwwroot/css/site.css +++ /dev/null @@ -1,135 +0,0 @@ -@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); - -html, body { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} - -app { - position: relative; - display: flex; - flex-direction: column; -} - -.top-row { - height: 3.5rem; - display: flex; - align-items: center; -} - -.main { - flex: 1; -} - - .main .top-row { - background-color: #e6e6e6; - border-bottom: 1px solid #d6d5d5; - } - -.sidebar { - background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); -} - - .sidebar .top-row { - background-color: rgba(0,0,0,0.4); - } - - .sidebar .navbar-brand { - font-size: 1.1rem; - } - - .sidebar .oi { - width: 2rem; - font-size: 1.1rem; - vertical-align: text-top; - top: -2px; - } - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - - .nav-item a.active { - background-color: rgba(255,255,255,0.25); - color: white; - } - - .nav-item a:hover { - background-color: rgba(255,255,255,0.1); - color: white; - } - -.content { - padding-top: 1.1rem; -} - -.navbar-toggler { - background-color: rgba(255, 255, 255, 0.1); -} - -.valid.modified:not([type=checkbox]) { - outline: 1px solid #26b050; -} - -.invalid { - outline: 1px solid red; -} - -.validation-message { - color: red; -} - -@media (max-width: 767.98px) { - .main .top-row { - display: none; - } -} - -@media (min-width: 768px) { - app { - flex-direction: row; - } - - .sidebar { - width: 250px; - height: 100vh; - position: sticky; - top: 0; - } - - .main .top-row { - position: sticky; - top: 0; - } - - .main > div { - padding-left: 2rem !important; - padding-right: 1.5rem !important; - } - - .navbar-toggler { - display: none; - } - - .sidebar .collapse { - /* Never collapse the sidebar for wide screens */ - display: block; - } -} diff --git a/samples/BlazorClientSide/App.razor b/samples/BlazorWebAssembly/App.razor similarity index 57% rename from samples/BlazorClientSide/App.razor rename to samples/BlazorWebAssembly/App.razor index 39b52f6..b941644 100644 --- a/samples/BlazorClientSide/App.razor +++ b/samples/BlazorWebAssembly/App.razor @@ -1,8 +1,4 @@ - - + @@ -11,4 +7,4 @@

Sorry, there's nothing at this address.

-
\ No newline at end of file +
diff --git a/samples/BlazorWebAssembly/BlazorWebAssembly.csproj b/samples/BlazorWebAssembly/BlazorWebAssembly.csproj new file mode 100644 index 0000000..f1d4e0d --- /dev/null +++ b/samples/BlazorWebAssembly/BlazorWebAssembly.csproj @@ -0,0 +1,17 @@ + + + + net7.0 + + + + + + + + + + + + + diff --git a/samples/BlazorClientSide/Pages/Index.razor b/samples/BlazorWebAssembly/Pages/Index.razor similarity index 62% rename from samples/BlazorClientSide/Pages/Index.razor rename to samples/BlazorWebAssembly/Pages/Index.razor index b94913b..31293dc 100644 --- a/samples/BlazorClientSide/Pages/Index.razor +++ b/samples/BlazorWebAssembly/Pages/Index.razor @@ -10,9 +10,9 @@
Add Item to session storage
- +
- +
@@ -28,7 +28,7 @@
-
+
Value Read from session storage
@@ -39,17 +39,32 @@
Items in session storage
@ItemsInSessionStorage
+ +
+
Item exist in session storage
@(ItemExist) +
+
+ +
+ +
+
String Read from session storage
+ @StringFromSessionStorage +
@code { string NameFromSessionStorage { get; set; } + string StringFromSessionStorage { get; set; } int ItemsInSessionStorage { get; set; } string Name { get; set; } + bool ItemExist { get; set; } protected override async Task OnInitializedAsync() { await GetNameFromSessionStorage(); + await GetStringFromSessionStorage(); await GetSessionStorageLength(); sessionStorage.Changed += (sender, e) => @@ -62,6 +77,7 @@ { await sessionStorage.SetItemAsync("name", Name); await GetNameFromSessionStorage(); + await GetStringFromSessionStorage(); await GetSessionStorageLength(); Name = ""; @@ -69,11 +85,29 @@ async Task GetNameFromSessionStorage() { - NameFromSessionStorage = await sessionStorage.GetItemAsync("name"); + try + { + NameFromSessionStorage = await sessionStorage.GetItemAsync("name"); + + if (string.IsNullOrEmpty(NameFromSessionStorage)) + { + NameFromSessionStorage = "Nothing Saved"; + } + } + catch(Exception) + { + Console.WriteLine("error reading 'name'"); + } + } + + + async Task GetStringFromSessionStorage() + { + StringFromSessionStorage = await sessionStorage.GetItemAsStringAsync("name"); - if (string.IsNullOrEmpty(NameFromSessionStorage)) + if (string.IsNullOrEmpty(StringFromSessionStorage)) { - NameFromSessionStorage = "Nothing Saved"; + StringFromSessionStorage = "Nothing Saved"; } } @@ -81,6 +115,7 @@ { await sessionStorage.RemoveItemAsync("name"); await GetNameFromSessionStorage(); + await GetStringFromSessionStorage(); await GetSessionStorageLength(); } @@ -90,6 +125,7 @@ await sessionStorage.ClearAsync(); Console.WriteLine("Getting name from session storage..."); await GetNameFromSessionStorage(); + await GetStringFromSessionStorage(); Console.WriteLine("Calling Get Length..."); await GetSessionStorageLength(); } @@ -98,6 +134,7 @@ { Console.WriteLine(await sessionStorage.LengthAsync()); ItemsInSessionStorage = await sessionStorage.LengthAsync(); + ItemExist = await sessionStorage.ContainKeyAsync("name"); } } diff --git a/samples/BlazorClientSide/Pages/Sync.razor b/samples/BlazorWebAssembly/Pages/Sync.razor similarity index 67% rename from samples/BlazorClientSide/Pages/Sync.razor rename to samples/BlazorWebAssembly/Pages/Sync.razor index d625680..59a5f03 100644 --- a/samples/BlazorClientSide/Pages/Sync.razor +++ b/samples/BlazorWebAssembly/Pages/Sync.razor @@ -37,17 +37,31 @@
Items in session storage
@ItemsInSessionStorage
+
+
Item exist in session storage
@(ItemExist) +
+ + +
+ +
+
String Read from session storage
+ @StringFromSessionStorage +
@code { string NameFromSessionStorage { get; set; } + string StringFromSessionStorage { get; set; } int ItemsInSessionStorage { get; set; } string Name { get; set; } + bool ItemExist { get; set; } protected override void OnInitialized() { GetNameFromSessionStorage(); + GetStringFromSessionStorage(); GetSessionStorageLength(); sessionStorage.Changed += (sender, e) => @@ -58,8 +72,10 @@ void SaveName() { + Console.WriteLine(Name); sessionStorage.SetItem("name", Name); GetNameFromSessionStorage(); + GetStringFromSessionStorage(); GetSessionStorageLength(); Name = ""; @@ -67,11 +83,28 @@ void GetNameFromSessionStorage() { - NameFromSessionStorage = sessionStorage.GetItem("name"); + try + { + NameFromSessionStorage = sessionStorage.GetItem("name"); + + if (string.IsNullOrEmpty(NameFromSessionStorage)) + { + NameFromSessionStorage = "Nothing Saved"; + } + } + catch (Exception) + { + Console.WriteLine("error reading 'name'"); + } + } + + void GetStringFromSessionStorage() + { + StringFromSessionStorage = sessionStorage.GetItemAsString("name"); - if (string.IsNullOrEmpty(NameFromSessionStorage)) + if (string.IsNullOrEmpty(StringFromSessionStorage)) { - NameFromSessionStorage = "Nothing Saved"; + StringFromSessionStorage = "Nothing Saved"; } } @@ -79,6 +112,7 @@ { sessionStorage.RemoveItem("name"); GetNameFromSessionStorage(); + GetStringFromSessionStorage(); GetSessionStorageLength(); } @@ -88,6 +122,7 @@ sessionStorage.Clear(); Console.WriteLine("Getting name from session storage..."); GetNameFromSessionStorage(); + GetStringFromSessionStorage(); Console.WriteLine("Calling Get Length..."); GetSessionStorageLength(); } @@ -96,6 +131,7 @@ { Console.WriteLine(sessionStorage.Length()); ItemsInSessionStorage = sessionStorage.Length(); + ItemExist = sessionStorage.ContainKey("name"); } } diff --git a/samples/BlazorWebAssembly/Program.cs b/samples/BlazorWebAssembly/Program.cs new file mode 100644 index 0000000..0fff24f --- /dev/null +++ b/samples/BlazorWebAssembly/Program.cs @@ -0,0 +1,19 @@ +using Blazored.SessionStorage; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using System.Threading.Tasks; + +namespace BlazorWebAssembly +{ + public class Program + { + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("#app"); + + builder.Services.AddBlazoredSessionStorage(); + + await builder.Build().RunAsync(); + } + } +} diff --git a/samples/BlazorWebAssembly/Shared/MainLayout.razor b/samples/BlazorWebAssembly/Shared/MainLayout.razor new file mode 100644 index 0000000..a76e097 --- /dev/null +++ b/samples/BlazorWebAssembly/Shared/MainLayout.razor @@ -0,0 +1,17 @@ +@inherits LayoutComponentBase + +
+ + +
+
+ About +
+ +
+ @Body +
+
+
diff --git a/samples/BlazorWebAssembly/Shared/MainLayout.razor.css b/samples/BlazorWebAssembly/Shared/MainLayout.razor.css new file mode 100644 index 0000000..4ad9519 --- /dev/null +++ b/samples/BlazorWebAssembly/Shared/MainLayout.razor.css @@ -0,0 +1,70 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +.main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + } + + .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row:not(.auth) { + display: none; + } + + .top-row.auth { + justify-content: space-between; + } + + .top-row a, .top-row .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .main > div { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/samples/BlazorClientSide/Shared/NavMenu.razor b/samples/BlazorWebAssembly/Shared/NavMenu.razor similarity index 66% rename from samples/BlazorClientSide/Shared/NavMenu.razor rename to samples/BlazorWebAssembly/Shared/NavMenu.razor index 4eca3b8..4869261 100644 --- a/samples/BlazorClientSide/Shared/NavMenu.razor +++ b/samples/BlazorWebAssembly/Shared/NavMenu.razor @@ -1,17 +1,17 @@  -
+
@code { - bool collapseNavMenu = true; + private bool collapseNavMenu = true; - void ToggleNavMenu() + private string NavMenuCssClass => collapseNavMenu ? "collapse" : null; + + private void ToggleNavMenu() { collapseNavMenu = !collapseNavMenu; } diff --git a/samples/BlazorWebAssembly/Shared/NavMenu.razor.css b/samples/BlazorWebAssembly/Shared/NavMenu.razor.css new file mode 100644 index 0000000..f7f4dbe --- /dev/null +++ b/samples/BlazorWebAssembly/Shared/NavMenu.razor.css @@ -0,0 +1,62 @@ +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.oi { + width: 2rem; + font-size: 1.1rem; + vertical-align: text-top; + top: -2px; +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + + .nav-item ::deep a.active { + background-color: rgba(255,255,255,0.25); + color: white; + } + + .nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; + } + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } +} diff --git a/samples/BlazorServerSide/_Imports.razor b/samples/BlazorWebAssembly/_Imports.razor similarity index 52% rename from samples/BlazorServerSide/_Imports.razor rename to samples/BlazorWebAssembly/_Imports.razor index 020af93..baf3f18 100644 --- a/samples/BlazorServerSide/_Imports.razor +++ b/samples/BlazorWebAssembly/_Imports.razor @@ -1,8 +1,12 @@ @using System.Net.Http +@using System.Net.Http.Json @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Http @using Microsoft.JSInterop -@using BlazorServerSide.Shared +@using BlazorWebAssembly +@using BlazorWebAssembly.Shared @using Blazored.SessionStorage diff --git a/samples/BlazorWebAssembly/wwwroot/.nojekyll b/samples/BlazorWebAssembly/wwwroot/.nojekyll new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/samples/BlazorWebAssembly/wwwroot/.nojekyll @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/BlazorWebAssembly/wwwroot/404.html b/samples/BlazorWebAssembly/wwwroot/404.html new file mode 100644 index 0000000..b4bc086 --- /dev/null +++ b/samples/BlazorWebAssembly/wwwroot/404.html @@ -0,0 +1,38 @@ + + + + + Single Page Apps for GitHub Pages + + + + + \ No newline at end of file diff --git a/samples/BlazorWebAssembly/wwwroot/css/app.css b/samples/BlazorWebAssembly/wwwroot/css/app.css new file mode 100644 index 0000000..82fc22a --- /dev/null +++ b/samples/BlazorWebAssembly/wwwroot/css/app.css @@ -0,0 +1,50 @@ +@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); + +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +a, .btn-link { + color: #0366d6; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } diff --git a/samples/BlazorClientSide/wwwroot/css/bootstrap/bootstrap.min.css b/samples/BlazorWebAssembly/wwwroot/css/bootstrap/bootstrap.min.css similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/bootstrap/bootstrap.min.css rename to samples/BlazorWebAssembly/wwwroot/css/bootstrap/bootstrap.min.css diff --git a/samples/BlazorClientSide/wwwroot/css/bootstrap/bootstrap.min.css.map b/samples/BlazorWebAssembly/wwwroot/css/bootstrap/bootstrap.min.css.map similarity index 100% rename from samples/BlazorClientSide/wwwroot/css/bootstrap/bootstrap.min.css.map rename to samples/BlazorWebAssembly/wwwroot/css/bootstrap/bootstrap.min.css.map diff --git a/samples/BlazorServerSide/wwwroot/css/open-iconic/FONT-LICENSE b/samples/BlazorWebAssembly/wwwroot/css/open-iconic/FONT-LICENSE similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/open-iconic/FONT-LICENSE rename to samples/BlazorWebAssembly/wwwroot/css/open-iconic/FONT-LICENSE diff --git a/samples/BlazorServerSide/wwwroot/css/open-iconic/ICON-LICENSE b/samples/BlazorWebAssembly/wwwroot/css/open-iconic/ICON-LICENSE similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/open-iconic/ICON-LICENSE rename to samples/BlazorWebAssembly/wwwroot/css/open-iconic/ICON-LICENSE diff --git a/samples/BlazorServerSide/wwwroot/css/open-iconic/README.md b/samples/BlazorWebAssembly/wwwroot/css/open-iconic/README.md similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/open-iconic/README.md rename to samples/BlazorWebAssembly/wwwroot/css/open-iconic/README.md diff --git a/samples/BlazorServerSide/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css b/samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css rename to samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css diff --git a/samples/BlazorServerSide/wwwroot/css/open-iconic/font/fonts/open-iconic.eot b/samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/fonts/open-iconic.eot similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/open-iconic/font/fonts/open-iconic.eot rename to samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/fonts/open-iconic.eot diff --git a/samples/BlazorServerSide/wwwroot/css/open-iconic/font/fonts/open-iconic.otf b/samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/fonts/open-iconic.otf similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/open-iconic/font/fonts/open-iconic.otf rename to samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/fonts/open-iconic.otf diff --git a/samples/BlazorServerSide/wwwroot/css/open-iconic/font/fonts/open-iconic.svg b/samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/fonts/open-iconic.svg similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/open-iconic/font/fonts/open-iconic.svg rename to samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/fonts/open-iconic.svg diff --git a/samples/BlazorServerSide/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf b/samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf rename to samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf diff --git a/samples/BlazorServerSide/wwwroot/css/open-iconic/font/fonts/open-iconic.woff b/samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/fonts/open-iconic.woff similarity index 100% rename from samples/BlazorServerSide/wwwroot/css/open-iconic/font/fonts/open-iconic.woff rename to samples/BlazorWebAssembly/wwwroot/css/open-iconic/font/fonts/open-iconic.woff diff --git a/samples/BlazorWebAssembly/wwwroot/favicon.ico b/samples/BlazorWebAssembly/wwwroot/favicon.ico new file mode 100644 index 0000000..a3a7999 Binary files /dev/null and b/samples/BlazorWebAssembly/wwwroot/favicon.ico differ diff --git a/samples/BlazorWebAssembly/wwwroot/index.html b/samples/BlazorWebAssembly/wwwroot/index.html new file mode 100644 index 0000000..980817a --- /dev/null +++ b/samples/BlazorWebAssembly/wwwroot/index.html @@ -0,0 +1,78 @@ + + + + + + Blazored SessionStorage (Wasm) + + + + + + + + + + + +
Loading...
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + + + diff --git a/samples/BlazorWebAssembly/wwwroot/js/decode.js b/samples/BlazorWebAssembly/wwwroot/js/decode.js new file mode 100644 index 0000000..9743172 --- /dev/null +++ b/samples/BlazorWebAssembly/wwwroot/js/decode.js @@ -0,0 +1 @@ +function BrotliDecodeClosure() { "use strict"; var z = new Int8Array(0); function c(e) { this.data = e, this.offset = 0 } var $ = Int32Array.from([1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15]), D = Int32Array.from([3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2]), F = Int32Array.from([0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3]), b = Int32Array.from([131072, 131076, 131075, 196610, 131072, 131076, 131075, 262145, 131072, 131076, 131075, 196610, 131072, 131076, 131075, 262149]), N = Int32Array.from([0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032, 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536, 115968, 118528, 119872, 121280, 122016]), B = Int32Array.from([0, 0, 0, 0, 10, 10, 11, 11, 10, 10, 10, 10, 10, 9, 9, 8, 7, 7, 8, 7, 7, 6, 6, 5, 5]), o = Int32Array.from([1, 5, 9, 13, 17, 25, 33, 41, 49, 65, 81, 97, 113, 145, 177, 209, 241, 305, 369, 497, 753, 1265, 2289, 4337, 8433, 16625]), r = Int32Array.from([2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 24]), M = Int32Array.from([0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50, 66, 98, 130, 194, 322, 578, 1090, 2114, 6210, 22594]), U = Int32Array.from([0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 12, 14, 24]), H = Int32Array.from([2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 18, 22, 30, 38, 54, 70, 102, 134, 198, 326, 582, 1094, 2118]), R = Int32Array.from([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24]), O = Int32Array.from([0, 0, 8, 8, 0, 16, 8, 16, 16]), L = Int32Array.from([0, 8, 0, 8, 16, 0, 16, 8, 16]); function d(e, t) { if (0 != e.t) throw "State MUST be uninitialized"; var i; e.i = new Int32Array(6480), e.input = t, (i = e).o = new Int8Array(4160), i.s = 0, i.l = new Int16Array(2080), i.h = 32, i.p = 2048, i.u = 0, a(i); var n = function (e) { if (16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), 0 == ne(e, 1)) return 16; var t = ne(e, 3); return 0 != t ? 17 + t : 0 != (t = ne(e, 3)) ? 8 + t : 17 }(e); if (9 == n) throw "Invalid 'windowBits' code"; e.m = 1 << n, e.g = e.m - 16, e.t = 1 } function h(e) { if (16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), 0 == ne(e, 1)) return 0; var t = ne(e, 3); return 0 == t ? 1 : ne(e, t) + (1 << t) } function W(e, t, i) { var n = i.s >>> i.h, a = e[t += 255 & n] >> 16, o = 65535 & e[t]; return a <= 8 ? (i.h += a, o) : (t += o, t += (n & (1 << a) - 1) >>> 8, i.h += 8 + (e[t] >> 16), 65535 & e[t]) } function s(e, t, i) { 16 <= i.h && (i.s = i.l[i.p++] << 16 | i.s >>> 16, i.h -= 16); var n = W(e, t, i), a = r[n]; return 16 <= i.h && (i.s = i.l[i.p++] << 16 | i.s >>> 16, i.h -= 16), o[n] + (a <= 16 ? ne(i, a) : ae(i, a)) } function f(e, t) { for (var i = e[t]; 0 < t; t--)e[t] = e[t - 1]; e[0] = i } function p(e, t, i, n) { var a, o = 1; 2030 < n.p && te(n); var r = new Int32Array(e); if (16 <= n.h && (n.s = n.l[n.p++] << 16 | n.s >>> 16, n.h -= 16), 1 == (a = ne(n, 2))) { for (var s = e - 1, l = 0, c = new Int32Array(4), d = ne(n, 2) + 1; 0 != s;)s >>= 1, l++; for (var h = 0; h < d; h++)16 <= n.h && (n.s = n.l[n.p++] << 16 | n.s >>> 16, n.h -= 16), c[h] = ne(n, l) % e, r[c[h]] = 2; switch (r[c[0]] = 1, d) { case 2: r[c[1]] = 1; break; case 4: 1 == ne(n, 1) ? (r[c[2]] = 3, r[c[3]] = 3) : r[c[0]] = 2 }o = function (e, t) { for (var i = 0; i < t - 1; ++i)for (var n = i + 1; n < t; ++n)if (e[i] == e[n]) return 0; return 1 }(c, d) } else { var f = new Int32Array(18), p = 32, u = 0; for (h = a; h < 18 && 0 < p; h++) { var m = $[h]; 16 <= n.h && (n.s = n.l[n.p++] << 16 | n.s >>> 16, n.h -= 16); var g = n.s >>> n.h & 15; n.h += b[g] >> 16; var P = 65535 & b[g]; 0 != (f[m] = P) && (p -= 32 >> P, u++) } 0 != p && 1 != u && (o = 0), function (e, t, i, n) { var a = 0, o = 8, r = 0, s = 0, l = 32768, c = new Int32Array(32); for (Q(c, 0, 5, e, 18); a < t && 0 < l;) { 2030 < n.p && te(n), 16 <= n.h && (n.s = n.l[n.p++] << 16 | n.s >>> 16, n.h -= 16); var d = n.s >>> n.h & 31; n.h += c[d] >> 16; var h = 65535 & c[d]; if (h < 16) (r = 0) != (i[a++] = h) && (l -= 32768 >> (o = h)); else { var f = h - 14, p = 0; 16 == h && (p = o), s != p && (r = 0, s = p); var u = r; 0 < r && (r -= 2, r <<= f), 16 <= n.h && (n.s = n.l[n.p++] << 16 | n.s >>> 16, n.h -= 16); var m = (r += ne(n, f) + 3) - u; if (t < a + m) throw "symbol + repeatDelta > numSymbols"; for (var g = 0; g < m; g++)i[a++] = s; 0 != s && (l -= m << 15 - s) } } if (0 != l) throw "Unused space"; i.fill(0, a, t) }(f, e, r, n) } if (0 == o) throw "Can't readHuffmanCode"; Q(t, i, 8, r, e) } function l(e, t, i) { 2030 < i.p && te(i); var n = h(i) + 1; if (1 == n) return t.fill(0, 0, e), n; 16 <= i.h && (i.s = i.l[i.p++] << 16 | i.s >>> 16, i.h -= 16); var a = 0; 0 != ne(i, 1) && (a = ne(i, 4) + 1); var o = new Int32Array(1080); p(n + a, o, 0, i); for (var r = 0; r < e;) { 2030 < i.p && te(i), 16 <= i.h && (i.s = i.l[i.p++] << 16 | i.s >>> 16, i.h -= 16); var s = W(o, 0, i); if (0 == s) t[r] = 0, r++; else if (s <= a) { 16 <= i.h && (i.s = i.l[i.p++] << 16 | i.s >>> 16, i.h -= 16); for (var l = (1 << s) + ne(i, s); 0 != l;) { if (e <= r) throw "Corrupted context map"; t[r] = 0, r++, l-- } } else t[r] = s - a, r++ } return 16 <= i.h && (i.s = i.l[i.p++] << 16 | i.s >>> 16, i.h -= 16), 1 == ne(i, 1) && function (e, t) { for (var i = new Int32Array(256), n = 0; n < 256; n++)i[n] = n; for (n = 0; n < t; n++) { var a = 255 & e[n]; e[n] = i[a], 0 != a && f(i, a) } }(t, e), n } function _(e, t, i) { var n = e.P, a = 4 + 2 * t; 16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16); var o = W(e.i, 1080 * t, e), r = s(e.i, 1080 * (t + 3), e); return 1 == o ? o = n[a + 1] + 1 : 0 == o ? o = n[a] : o -= 2, i <= o && (o -= i), n[a] = n[a + 1], n[a + 1] = o, r } function G(e) { e.$ = _(e, 0, e.v); var t = e.P[5]; e.X = t << 6, e.Y = 255 & e.k[e.X], e.C = e.j[e.Y]; var i = e.A[t]; e.q = i << 9, e.I = e.q + 256 } function J(e) { if (0 != e.T) return e.S = 9, void (e.t = 11); e.j = new Int32Array(0), e.D = new Int32Array(0), e.F = new Int32Array(0), 2030 < e.p && te(e), function (e) { if (16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), e.T = ne(e, 1), e.N = 0, e.B = 0, (e.M = 0) == e.T || 0 == ne(e, 1)) { var t = ne(e, 2) + 4; if (7 == t) { if (e.M = 1, 0 != ne(e, 1)) throw "Corrupted reserved bit"; var i = ne(e, 2); if (0 == i) return; for (var n = 0; n < i; n++) { if (16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), 0 == (a = ne(e, 8)) && n + 1 == i && 1 < i) throw "Exuberant nibble"; e.N |= a << 8 * n } } else for (n = 0; n < t; n++) { var a; if (16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), 0 == (a = ne(e, 4)) && n + 1 == t && 4 < t) throw "Exuberant nibble"; e.N |= a << 4 * n } e.N++, 0 == e.T && (e.B = ne(e, 1)) } }(e), 0 == e.N && 0 == e.M || (0 != e.B || 0 != e.M ? (oe(e), e.t = 0 != e.M ? 4 : 5) : e.t = 2, 0 == e.M && (e.U += e.N, e.U > 1 << 30 && (e.U = 1 << 30), e.H < e.m && function (e) { var t = e.m; if (t > e.U) { for (var i = e.U; i < t >> 1;)t >>= 1; 0 == e.T && t < 16384 && 16384 <= e.m && (t = 16384) } if (!(t <= e.H)) { var n = new Int8Array(t + 37); 0 != e.R.length && n.set(e.R.subarray(0, 0 + e.H), 0), e.R = n, e.H = t } }(e))) } function u(e, t, i) { return i <= 1 ? 1 << 28 : (p(i + 2, e.i, 1080 * t, e), p(26, e.i, 1080 * (t + 3), e), s(e.i, 1080 * (t + 3), e)) } function V(e) { e.v = h(e) + 1, e.$ = u(e, 0, e.v), e.O = h(e) + 1, e.L = u(e, 1, e.O), e.W = h(e) + 1, e._ = u(e, 2, e.W), 2030 < e.p && te(e), 16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), e.G = ne(e, 2), e.J = 16 + (ne(e, 4) << e.G), e.V = (1 << e.G) - 1; var t = e.J + (48 << e.G); e.A = new Int8Array(e.v); for (var i = 0; i < e.v;) { for (var n = se(i + 96, e.v); i < n; ++i)16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), e.A[i] = ne(e, 2); 2030 < e.p && te(e) } e.k = new Int8Array(e.v << 6); var a = l(e.v << 6, e.k, e); e.K = 1; for (var o = 0; o < e.v << 6; o++)if (e.k[o] != o >> 6) { e.K = 0; break } e.Z = new Int8Array(e.W << 2); var r = l(e.W << 2, e.Z, e); e.j = m(256, a, e), e.D = m(704, e.O, e), e.F = m(t, r, e), e.X = 0, e.ee = 0, e.q = e.A[0] << 9, e.I = e.q + 256, e.Y = 0, e.C = e.j[0], e.te = e.D[0], e.P[4] = 1, e.P[5] = 0, e.P[6] = 1, e.P[7] = 0, e.P[8] = 1, e.P[9] = 0 } function K(e) { var t = e.R; if (e.N <= 0) return n(e), void (e.t = 1); var i = se(e.H - e.ie, e.N); if (function (e, t, i, n) { if (0 != (7 & e.h)) throw "Unaligned copyBytes"; for (; 32 != e.h && 0 != n;)t[i++] = e.s >>> e.h, e.h += 8, n--; if (0 == n) return; var a = se(k(e), n >> 1); if (0 < a) { var o = e.p << 1, r = a << 1; t.set(e.o.subarray(o, o + r), i), i += r, n -= r, e.p += a } if (0 == n) return; if (0 < k(e)) { for (16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16); 0 != n;)t[i++] = e.s >>> e.h, e.h += 8, n--; return ie(e, 0) } for (; 0 < n;) { var s = C(e.input, t, i, n); if (-1 == s) throw "Unexpected end of input"; i += s, n -= s } }(e, t, e.ie, i), e.N -= i, e.ie += i, e.ie == e.H) return e.S = 5, void (e.t = 11); n(e), e.t = 1 } function m(e, t, i) { for (var n = new Int32Array(t + 1080 * t), a = t, o = 0; o < t; o++)n[o] = a, p(e, n, a, i), a += 1080; return n } function Z(e) { var t = e.H; return 0 != e.ne && (t = se(t, e.ae + e.oe - e.re)), t } function g(e) { if (0 == e.t) throw "Can't decompress until initialized"; if (10 == e.t) throw "Can't decompress after close"; for (var t, i, n, a, o, r, s, l = Z(e), c = e.H - 1, d = e.R; 9 != e.t;)switch (e.t) { case 1: if (e.N < 0) throw "Invalid metablock length"; J(e), l = Z(e), c = e.H - 1, d = e.R; continue; case 2: V(e), e.t = 3; case 3: if (e.N <= 0) { e.t = 1; continue } 2030 < e.p && te(e), 0 == e.L && ((s = e).L = _(s, 1, s.O), s.te = s.D[s.P[7]]), e.L--, 16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16); var h = W(e.D, e.te, e), f = h >>> 6; e.se = 0, 2 <= f && (f -= 2, e.se = -1); var p = O[f] + (h >>> 3 & 7); 16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16); var u = U[p], m = u <= 16 ? ne(e, u) : ae(e, u); e.le = M[p] + m; var g = L[f] + (7 & h); 16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16); var P = R[g], $ = P <= 16 ? ne(e, P) : ae(e, P); e.ce = H[g] + $, e.de = 0, e.t = 6; case 6: if (0 != e.K) { for (; e.de < e.le;)if (2030 < e.p && te(e), 0 == e.$ && G(e), e.$--, 16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), d[e.ie] = W(e.j, e.C, e), e.ie++, e.de++, e.ie >= l) { e.S = 6, e.t = 11; break } } else for (var b = 255 & d[e.ie - 1 & c], v = 255 & d[e.ie - 2 & c]; e.de < e.le;) { 2030 < e.p && te(e), 0 == e.$ && G(e); var y = 255 & e.k[e.X + (re[e.q + b] | re[e.I + v])]; if (e.$--, v = b, 16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), b = W(e.j, e.j[y], e), d[e.ie] = b, e.ie++, e.de++, e.ie >= l) { e.S = 6, e.t = 11; break } } if (6 != e.t) continue; if (e.N -= e.le, e.N <= 0) { e.t = 3; continue } if (e.se < 0 && (2030 < e.p && te(e), 0 == e._ && ((r = e)._ = _(r, 2, r.W), r.ee = r.P[9] << 2), e._--, 16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), e.se = W(e.F, e.F[255 & e.Z[e.ee + (4 < e.ce ? 3 : e.ce - 2)]], e), e.se >= e.J)) { e.se -= e.J; var X = e.se & e.V; e.se >>>= e.G; var w = 1 + (e.se >>> 1), Y = (2 + (1 & e.se) << w) - 4; 16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16); var Q = w <= 16 ? ne(e, w) : ae(e, w); e.se = e.J + X + (Y + Q << e.G) } if (e.he = (n = e.se, a = e.P, o = e.fe, n < 16 ? (o += D[n], a[o &= 3] + F[n]) : n - 16 + 1), e.he < 0) throw "Negative distance"; if (e.maxDistance != e.g && e.ie < e.g ? e.maxDistance = e.ie : e.maxDistance = e.g, e.he > e.maxDistance) { e.t = 8; continue } if (0 < e.se && (e.P[3 & e.fe] = e.he, e.fe++), e.ce > e.N) throw "Invalid backward reference"; e.de = 0, e.t = 7; case 7: var k = e.ie - e.he & c, x = e.ie, C = e.ce - e.de, j = k + C, A = x + C; if (j < c && A < c) { if (C < 12 || x < j && k < A) for (var q = 0; q < C; q += 4)d[x++] = d[k++], d[x++] = d[k++], d[x++] = d[k++], d[x++] = d[k++]; else d.copyWithin(x, k, j); e.de += C, e.N -= C, e.ie += C } else for (; e.de < e.ce;)if (d[e.ie] = d[e.ie - e.he & c], e.N--, e.ie++, e.de++, e.ie >= l) { e.S = 7, e.t = 11; break } 7 == e.t && (e.t = 3); continue; case 8: if (!(4 <= e.ce && e.ce <= 24)) throw "Invalid backward reference"; Y = N[e.ce]; var I = e.he - e.maxDistance - 1, T = B[e.ce], S = I >>> T; if (Y += (I & (1 << T) - 1) * e.ce, !(S < 121)) throw "Invalid backward reference"; var E = ee(d, e.ie, z, Y, e.ce, S); if (e.ie += E, e.N -= E, e.ie >= l) { e.S = 3, e.t = 11; continue } e.t = 3; continue; case 4: for (; 0 < e.N;)2030 < e.p && te(e), 16 <= e.h && (e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16), ne(e, 8), e.N--; e.t = 1; continue; case 5: K(e); continue; case 11: e.pe = se(e.ie, e.H), e.t = 12; case 12: if (0 == (void 0, 0 != (i = se((t = e).oe - t.re, t.pe - t.ae)) && (t.ue.set(t.R.subarray(t.ae, t.ae + i), t.me + t.re), t.re += i, t.ae += i), t.re < t.oe ? 1 : 0)) return; e.ie >= e.g && (e.maxDistance = e.g), e.ie >= e.H && (e.ie > e.H && d.copyWithin(0, e.H, e.ie), e.ie &= c, e.ae = 0), e.t = e.S; continue; default: throw "Unexpected state " + e.t }if (9 == e.t) { if (e.N < 0) throw "Invalid metablock length"; oe(e), ie(e, 1) } } var P = new Int32Array(363), v = new Int8Array(217), y = new Int32Array(51); function ee(e, t, i, n, a, o) { for (var r = t, s = 3 * o, l = y[P[s]], c = P[s + 1], d = y[P[s + 2]]; 0 != v[l];)e[r++] = v[l++]; var h = 12 <= c ? c - 11 : 0; a < h && (h = a), n += h, a -= h; for (var f = a -= c <= 9 ? c : 0; 0 < f;)e[r++] = i[n++], f--; if (11 == c || 10 == c) { var p = r - a; for (10 == c && (a = 1); 0 < a;) { var u = 255 & e[p]; u < 192 ? (97 <= u && u <= 122 && (e[p] ^= 32), p += 1, a -= 1) : u < 224 ? (e[p + 1] ^= 32, p += 2, a -= 2) : (e[p + 2] ^= 5, p += 3, a -= 3) } } for (; 0 != v[d];)e[r++] = v[d++]; return r - t } function X(e, t) { for (var i = 1 << t - 1; 0 != (e & i);)i >>= 1; return (e & i - 1) + i } function w(e, t, i, n, a) { for (; e[t + (n -= i)] = a, 0 < n;); } function Y(e, t, i) { for (var n = 1 << t - i; t < 15 && !((n -= e[t]) <= 0);)t++, n <<= 1; return t - i } function Q(e, t, i, n, a) { var o, r, s = new Int32Array(a), l = new Int32Array(16), c = new Int32Array(16); for (r = 0; r < a; r++)l[n[r]]++; c[1] = 0; for (var d = 1; d < 15; d++)c[d + 1] = c[d] + l[d]; for (r = 0; r < a; r++)0 != n[r] && (s[c[n[r]]++] = r); var h = i, f = 1 << h, p = f; if (1 != c[15]) { r = o = 0; d = 1; for (var u = 2; d <= i; d++, u <<= 1)for (; 0 < l[d]; l[d]--)w(e, t + o, u, f, d << 16 | s[r++]), o = X(o, d); var m = p - 1, g = -1, P = t; for (d = i + 1, u = 2; d <= 15; d++, u <<= 1)for (; 0 < l[d]; l[d]--)(o & m) != g && (P += f, p += f = 1 << (h = Y(l, d, i)), e[t + (g = o & m)] = h + i << 16 | P - t - g), w(e, P + (o >> i), u, f, d - i << 16 | s[r++]), o = X(o, d) } else for (o = 0; o < p; o++)e[t + o] = s[0] } function te(e) { if (0 != e.u) { if (-2 <= k(e)) return; throw "No more input" } var t = e.p << 1, i = 4096 - t; for (e.o.copyWithin(0, t, 4096), e.p = 0; i < 4096;) { var n = 4096 - i, a = C(e.input, e.o, i, n); if (a <= 0) { e.u = 1, e.ge = i, i += 1; break } i += a } !function (e, t) { for (var i = e.o, n = t >> 1, a = e.l, o = 0; o < n; ++o)a[o] = 255 & i[2 * o] | (255 & i[2 * o + 1]) << 8 }(e, i) } function ie(e, t) { if (0 != e.u) { var i = (e.p << 1) + (e.h + 7 >> 3) - 4; if (i > e.ge) throw "Read after end"; if (0 != t && i != e.ge) throw "Unused bytes after end" } } function ne(e, t) { var i = e.s >>> e.h & (1 << t) - 1; return e.h += t, i } function ae(e, t) { var i = ne(e, 16); return e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16, i | ne(e, t - 16) << 16 } function a(e) { 2030 < e.p && te(e), ie(e, 0), e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16, e.s = e.l[e.p++] << 16 | e.s >>> 16, e.h -= 16 } function n(e) { 32 == e.h && a(e) } function oe(e) { var t = 32 - e.h & 7; if (0 != t && 0 != ne(e, t)) throw "Corrupted padding bits" } function k(e) { var t = 2048; return 0 != e.u && (t = e.ge + 1 >> 1), t - e.p } !function (e, t, i, n, a) { for (var o = n.length, r = 1, s = 0; s < o; ++s) { var l = n.charCodeAt(s); 35 == (e[s] = l) && (t[r++] = s + 1, e[s] = 0) } for (s = 0; s < 363; ++s)i[s] = a.charCodeAt(s) - 32 }(v, y, P, '# #s #, #e #.# the #.com/#\xc2\xa0# of # and # in # to #"#">#\n#]# for # a # that #. # with #\'# from # by #. The # on # as # is #ing #\n\t#:#ed #(# at #ly #="# of the #. This #,# not #er #al #=\'#ful #ive #less #est #ize #ous #', " !! ! , *! &! \" ! ) * * - ! # ! #!*! + ,$ ! - % . / # 0 1 . \" 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : ; < ' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %' & E *6 F G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K"); var re = new Int32Array(2048); function x() { this.R = new Int8Array(0), this.A = new Int8Array(0), this.k = new Int8Array(0), this.Z = new Int8Array(0), this.ue = new Int8Array(0), this.o = new Int8Array(0), this.l = new Int16Array(0), this.Pe = new Int32Array(0), this.P = new Int32Array(0), this.i = new Int32Array(0), this.j = new Int32Array(0), this.D = new Int32Array(0), this.F = new Int32Array(0), this.t = 0, this.S = 0, this.s = 0, this.h = 0, this.p = 0, this.ge = 0, this.u = 0, this.N = 0, this.T = 0, this.B = 0, this.M = 0, this.$ = 0, this.v = 0, this.L = 0, this.O = 0, this._ = 0, this.W = 0, this.ie = 0, this.maxDistance = 0, this.fe = 0, this.K = 0, this.Y = 0, this.C = 0, this.de = 0, this.le = 0, this.X = 0, this.ee = 0, this.q = 0, this.I = 0, this.te = 0, this.se = 0, this.J = 0, this.V = 0, this.G = 0, this.he = 0, this.ce = 0, this.g = 0, this.m = 0, this.H = 0, this.U = 0, this.me = 0, this.oe = 0, this.re = 0, this.ae = 0, this.pe = 0, this.ne = 0, this.input = null, this.R = new Int8Array(0), this.P = new Int32Array(10), this.P[0] = 16, this.P[1] = 15, this.P[2] = 11, this.P[3] = 4 } !function (e, t, i) { for (var n = 0; n < 256; ++n)e[n] = 63 & n, e[512 + n] = n >> 2, e[1792 + n] = 2 + (n >> 6); for (n = 0; n < 128; ++n)e[1024 + n] = 4 * (t.charCodeAt(n) - 32); for (n = 0; n < 64; ++n)e[1152 + n] = 1 & n, e[1216 + n] = 2 + (1 & n); for (var a = 1280, o = 0; o < 19; ++o) { var r = 3 & o, s = i.charCodeAt(o) - 32; for (n = 0; n < s; ++n)e[a++] = r } for (n = 0; n < 16; ++n)e[1792 + n] = 1, e[2032 + n] = 6; for (e[1792] = 0, e[2047] = 7, n = 0; n < 256; ++n)e[1536 + n] = e[1792 + n] << 3 }(re, " !! ! \"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# ", "A/* ': & : $ \x81 @"); var e = new Int8Array(122784); function se(e, t) { return e <= t ? e : t } function C(e, t, i, n) { if (null == e) return -1; var a = se(e.offset + n, e.data.length), o = a - e.offset; return t.set(e.data.subarray(e.offset, a), i), e.offset += o, o } return function (e, t, i, n) { var a = function (e) { for (var t = e.length, i = new Int8Array(t), n = 0; n < t; ++n)i[n] = e.charCodeAt(n); return i }(t + i); if (a.length != e.length) throw "Corrupted brotli dictionary"; for (var o = 0, r = n.length, s = 0; s < r; s += 2) { var l = n.charCodeAt(s) - 36, c = n.charCodeAt(s + 1) - 36; o += l; for (var d = 0; d < c; ++d)a[o] |= 128, o++ } e.set(a) }(e, 'timedownlifeleftbackcodedatashowonlysitecityopenjustlikefreeworktextyearoverbodyloveformbookplaylivelinehelphomesidemorewordlongthemviewfindpagedaysfullheadtermeachareafromtruemarkableuponhighdatelandnewsevennextcasebothpostusedmadehandherewhatnameLinkblogsizebaseheldmakemainuser\') +holdendswithNewsreadweresigntakehavegameseencallpathwellplusmenufilmpartjointhislistgoodneedwayswestjobsmindalsologorichuseslastteamarmyfoodkingwilleastwardbestfirePageknowaway.pngmovethanloadgiveselfnotemuchfeedmanyrockicononcelookhidediedHomerulehostajaxinfoclublawslesshalfsomesuchzone100%onescareTimeracebluefourweekfacehopegavehardlostwhenparkkeptpassshiproomHTMLplanTypedonesavekeepflaglinksoldfivetookratetownjumpthusdarkcardfilefearstaykillthatfallautoever.comtalkshopvotedeepmoderestturnbornbandfellroseurl(skinrolecomeactsagesmeetgold.jpgitemvaryfeltthensenddropViewcopy1.0"stopelseliestourpack.gifpastcss?graymean>rideshotlatesaidroadvar feeljohnrickportfast\'UA-deadpoorbilltypeU.S.woodmust2px;Inforankwidewantwalllead[0];paulwavesure$(\'#waitmassarmsgoesgainlangpaid!-- lockunitrootwalkfirmwifexml"songtest20pxkindrowstoolfontmailsafestarmapscorerainflowbabyspansays4px;6px;artsfootrealwikiheatsteptriporg/lakeweaktoldFormcastfansbankveryrunsjulytask1px;goalgrewslowedgeid="sets5px;.js?40pxif (soonseatnonetubezerosentreedfactintogiftharm18pxcamehillboldzoomvoideasyringfillpeakinitcost3px;jacktagsbitsrolleditknewnear\x3c!--growJSONdutyNamesaleyou lotspainjazzcoldeyesfishwww.risktabsprev10pxrise25pxBlueding300,ballfordearnwildbox.fairlackverspairjunetechif(!pickevil$("#warmlorddoespull,000ideadrawhugespotfundburnhrefcellkeystickhourlossfuel12pxsuitdealRSS"agedgreyGET"easeaimsgirlaids8px;navygridtips#999warsladycars); }php?helltallwhomzh:e*/\r\n 100hall.\n\nA7px;pushchat0px;crew*/ericmostguidbelldeschairmathatom/imgRluckcent000;tinygonehtmlselldrugFREEnodenick?id=losenullvastwindRSS wearrelybeensamedukenasacapewishgulfT23:hitsslotgatekickblurthey15px\'\'););">msiewinsbirdsortbetaseekT18:ordstreemall60pxfarmb\0\x19sboys[0].\');"POSTbearkids);}}marytend(UK)quadzh:f-siz----prop\');\rliftT19:viceandydebt>RSSpoolneckblowT16:doorevalT17:letsfailoralpollnovacolsgene b\0\x14softrometillross

pourfadepinkmini)|!(minezh:hbarshear00);milk --\x3eironfreddiskwentsoilputs/js/holyT22:ISBNT20:adamsees

json\', \'contT21: RSSloopasiamoon

soulLINEfortcartT14:

80px!--<9px;T04:mike:46ZniceinchYorkricezh:d\'));puremageparatonebond:37Z_of_\']);000,zh:gtankyardbowlbush:56ZJava30px\n|}\n%C3%:34ZjeffEXPIcashvisagolfsnowzh:iquer.csssickmeatmin.binddellhirepicsrent:36ZHTTP-201fotowolfEND xbox:54ZBODYdick;\n}\nexit:35Zvarsbeat\'});diet999;anne}}sonyguysfuckpipe|-\n!002)ndow[1];[];\nLog salt\r\n\t\tbangtrimbath){\r\n00px\n});ko:lfeesad>\rs:// [];tollplug(){\n{\r\n .js\'200pdualboat.JPG);\n}quot);\n\n\');\n\r\n}\r201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037201320122011201020092008200720062005200420032002200120001999199819971996199519941993199219911990198919881987198619851984198319821981198019791978197719761975197419731972197119701969196819671966196519641963196219611960195919581957195619551954195319521951195010001024139400009999comomC!sesteestaperotodohacecadaaC1obiendC-aasC-vidacasootroforosolootracualdijosidograntipotemadebealgoquC)estonadatrespococasabajotodasinoaguapuesunosantediceluisellamayozonaamorpisoobraclicellodioshoracasiP7P0P=P0P>PP>Q\x02P8P7P=P>P4P>Q\x02P>P6P5P>P=P8Q\x05P\x1dP0P5P5P1Q\vPP2Q\vP2P>P\x1dP>P>P1P\x1fP>P;P8P=P8P P$P\x1dP5P\x1cQ\vQ\x02Q\vP\x1eP=P8Pthing.org/multiheardPowerstandtokensolid(thisbringshipsstafftriedcallsfullyfactsagentThis //--\x3eadminegyptEvent15px;Emailtrue"crossspentblogsbox">notedleavechinasizesguest

robotheavytrue,sevengrandcrimesignsawaredancephase>\x3c!--en_US'200px_namelatinenjoyajax.ationsmithU.S. holdspeterindianav">chainscorecomesdoingpriorShare1990sromanlistsjapanfallstrialowneragreeabusealertopera"-//WcardshillsteamsPhototruthclean.php?saintmetallouismeantproofbriefrow">genretrucklooksValueFrame.net/--\x3e\n\n\x3c!--POST"ocean
floorspeakdepth sizebankscatchchart20px;aligndealswould50px;url="parksmouseMost ...drugs\x3c!-- aprilidealallenexactforthcodeslogicView seemsblankports (200saved_linkgoalsgrantgreekhomesringsrated30px;whoseparse();" Blocklinuxjonespixel\');">);if(-leftdavidhorseFocusraiseboxesTrackementbar">.src=toweralt="cablehenry24px;setupitalysharpminortastewantsthis.resetwheelgirls/css/100%;clubsstuffbiblevotes 1000korea});\r\nbandsqueue= {};80px;cking{\r\n\t\taheadclockirishlike ratiostatsForm"yahoo)[0];AboutfindsdebugtasksURL =cells})();12px;primetellsturns0x600.jpg"spainbeachtaxesmicroangel--\x3e\r\nname=diegopage swiss--\x3e\n\n#fff;">Log.com"treatsheet) && 14px;sleepntentfiledja:c\x03id="cName"worseshots-box-delta\n<bears:48Z spendbakershops= "";php">ction13px;brianhellosize=o=%2F joinmaybe, fjsimg" ")[0]MTopBType"newlyDanskczechtrailknowsfaq">zh-cn10);\n-1");type=bluestrulydavis.js\';>\r\n\r\nform jesus100% menu.\r\n\t\r\nwalesrisksumentddingb-likteachgif" vegasdanskeestishqipsuomisobredesdeentretodospuedeaC1osestC!tienehastaotrospartedondenuevohacerformamismomejormundoaquC-dC-assC3loayudafechatodastantomenosdatosotrassitiomuchoahoralugarmayorestoshorastenerantesfotosestaspaC-snuevasaludforosmedioquienmesespoderchileserC!vecesdecirjosC)estarventagrupohechoellostengoamigocosasnivelgentemismaairesjuliotemashaciafavorjuniolibrepuntobuenoautorabrilbuenatextomarzosaberlistaluegocC3moenerojuegoperC:haberestoynuncamujervalorfueralibrogustaigualvotoscasosguC-apuedosomosavisousteddebennochebuscafaltaeurosseriedichocursoclavecasasleC3nplazolargoobrasvistaapoyojuntotratavistocrearcampohemoscincocargopisosordenhacenC!readiscopedrocercapuedapapelmenorC:tilclarojorgecalleponertardenadiemarcasigueellassiglocochemotosmadreclaserestoniC1oquedapasarbancohijosviajepabloC)stevienereinodejarfondocanalnorteletracausatomarmanoslunesautosvillavendopesartipostengamarcollevapadreunidovamoszonasambosbandamariaabusomuchasubirriojavivirgradochicaallC-jovendichaestantalessalirsuelopesosfinesllamabuscoC)stalleganegroplazahumorpagarjuntadobleislasbolsabaC1ohablaluchaC\x01readicenjugarnotasvalleallC!cargadolorabajoestC)gustomentemariofirmacostofichaplatahogarartesleyesaquelmuseobasespocosmitadcielochicomiedoganarsantoetapadebesplayaredessietecortecoreadudasdeseoviejodeseaaguas"domaincommonstatuseventsmastersystemactionbannerremovescrollupdateglobalmediumfilternumberchangeresultpublicscreenchoosenormaltravelissuessourcetargetspringmodulemobileswitchphotosborderregionitselfsocialactivecolumnrecordfollowtitle>eitherlengthfamilyfriendlayoutauthorcreatereviewsummerserverplayedplayerexpandpolicyformatdoublepointsseriespersonlivingdesignmonthsforcesuniqueweightpeopleenergynaturesearchfigurehavingcustomoffsetletterwindowsubmitrendergroupsuploadhealthmethodvideosschoolfutureshadowdebatevaluesObjectothersrightsleaguechromesimplenoticesharedendingseasonreportonlinesquarebuttonimagesenablemovinglatestwinterFranceperiodstrongrepeatLondondetailformeddemandsecurepassedtoggleplacesdevicestaticcitiesstreamyellowattackstreetflighthiddeninfo">openedusefulvalleycausesleadersecretseconddamagesportsexceptratingsignedthingseffectfieldsstatesofficevisualeditorvolumeReportmuseummoviesparentaccessmostlymother" id="marketgroundchancesurveybeforesymbolmomentspeechmotioninsidematterCenterobjectexistsmiddleEuropegrowthlegacymannerenoughcareeransweroriginportalclientselectrandomclosedtopicscomingfatheroptionsimplyraisedescapechosenchurchdefinereasoncorneroutputmemoryiframepolicemodelsNumberduringoffersstyleskilledlistedcalledsilvermargindeletebetterbrowselimitsGlobalsinglewidgetcenterbudgetnowrapcreditclaimsenginesafetychoicespirit-stylespreadmakingneededrussiapleaseextentScriptbrokenallowschargedividefactormember-basedtheoryconfigaroundworkedhelpedChurchimpactshouldalwayslogo" bottomlist">){var prefixorangeHeader.push(couplegardenbridgelaunchReviewtakingvisionlittledatingButtonbeautythemesforgotSearchanchoralmostloadedChangereturnstringreloadMobileincomesupplySourceordersviewed courseAbout islandPhilipawardshandleimportOfficeregardskillsnationSportsdegreeweekly (e.g.behinddoctorloggedunitedbeyond-scaleacceptservedmarineFootercamera\n_form"leavesstress" />\r\n.gif" onloadloaderOxfordsistersurvivlistenfemaleDesignsize="appealtext">levelsthankshigherforcedanimalanyoneAfricaagreedrecentPeople
wonderpricesturned|| {};main">inlinesundaywrap">failedcensusminutebeaconquotes150px|estateremoteemail"linkedright;signalformal1.htmlsignupprincefloat:.png" forum.AccesspaperssoundsextendHeightsliderUTF-8"& Before. WithstudioownersmanageprofitjQueryannualparamsboughtfamousgooglelongeri++) {israelsayingdecidehome">headerensurebranchpiecesblock;statedtop">boston.test(avatartested_countforumsschemaindex,filledsharesreaderalert(appearSubmitline">body">\n* TheThoughseeingjerseyNews\nSystem DavidcancertablesprovedApril reallydriveritem">more">boardscolorscampusfirst || [];media.guitarfinishwidth:showedOther .php" assumelayerswilsonstoresreliefswedenCustomeasily your String\n\nWhiltaylorclear:resortfrenchthough") + "buyingbrandsMembername">oppingsector5px;">vspacepostermajor coffeemartinmaturehappenkansaslink">Images=falsewhile hspace0& \n\nIn powerPolski-colorjordanBottomStart -count2.htmlnews">01.jpgOnline-rightmillerseniorISBN 00,000 guidesvalue)ectionrepair.xml" rights.html-blockregExp:hoverwithinvirginphones\rusing \n\tvar >\');\n\t\n\nbahasabrasilgalegomagyarpolskisrpskiX1X/Y\bd8-f\x16\x07g.\0d=\x13g9\x01i+\x14d?!f\x01/d8-e\x1b=f\b\x11d;,d8\0d8*e\x05,e\x0f8g.!g\x10\x06h.:e\x1d\x1be\x0f/d;%f\x1c\re\n!f\x176i\x174d8*d::d:\'e\x13\x01h\x07*e71d<\x01d8\x1af\x1f%g\x1c\ve7%d=\x1ch\x01\x14g3;f2!f\x1c\tg=\x11g+\x19f\t\0f\x1c\th/\x04h.:d8-e?\x03f\x16\x07g+ g\x14(f\b7i&\x16i!5d=\x1ch\0\x05f\n\0f\x1c/i\x17.i"\x18g\x1b8e\x053d8\vh==f\x10\x1cg4"d=?g\x14(h=/d;6e\x1c(g:?d8;i"\x18h5\x04f\x16\x19h\'\x06i"\x11e\x1b\x1ee$\rf3(e\x06\fg=\x11g;\x1cf\x146h\x17\x0fe\x06\x05e.9f\x0e(h\r\x10e8\x02e\x1c:f6\bf\x01/g):i\x174e\x0f\x11e8\x03d;\0d9\be%=e\x0f\vg\x14\x1ff4;e\x1b>g\t\x07e\x0f\x11e1\x15e&\x02f\x1e\x1cf\t\vf\x1c:f\x160i\x17;f\x1c\0f\x160f\x169e<\x0fe\f\x17d:,f\x0f\x10d>\x1be\x053d:\x0ef\x1b4e$\x1ah?\x19d8*g3;g;\x1fg\x1f%i\x01\x13f88f\b\x0fe9?e\x11\ne\x056d;\x16e\x0f\x11h!(e.\te\x05(g,,d8\0d<\x1ae\x11\x18h?\x1bh!\fg\x029e\x07;g\t\bf\x1d\x03g\x145e-\x10d8\x16g\x15\fh.>h.!e\x05\rh49f\x15\x19h\x022e\n e\x05%f4;e\n(d;\x16d;,e\x15\x06e\x13\x01e\r\x1ae."g\x0e0e\x1c(d8\nf57e&\x02d=\x15e72g;\x0fg\x15\x19h(\0h/&g;\x06g$>e\f:g\x19;e=\x15f\x1c,g+\x19i\x1c\0h&\x01d;7f f\x0e%e\x1b=e.6e;:h.>f\x1c\ve\x0f\vi\x18\x05h/;f3\x15e>\vd=\rg=.g;\x0ff5\x0ei\0\tf\v)h?\x19f 7e=\x13e\t\re\b\x06g1;f\x0e\x12h!\fe\x1b d8:d:$f\x18\x13f\x1c\0e\x10\x0ei\x1f3d9\x10d8\rh\x03=i\0\x1ah?\x07h!\fd8\x1ag\'\x11f\n\0e\x0f/h\x03=h.>e$\x07e\x10\bd=\x1ce$\'e.6g$>d<\x1ag \x14g)6d8\x13d8\x1ae\x05(i\x03(i!9g\x1b.h?\x19i\x07\fh?\x18f\x18/e<\0e\'\vf\x03\x05e\x065g\x145h\x04\x11f\x16\x07d;6e\x13\x01g\t\fe8.e\n)f\x16\x07e\f\x16h5\x04f:\x10e$\'e-&e-&d9 e\x1c0e\x1d\0f5\x0fh\'\bf\n\x15h5\x04e7%g(\vh&\x01f1\x02f\0\x0ed9\bf\x176e\0\x19e\n\x1fh\x03=d8;h&\x01g\x1b.e\t\rh5\x04h./e\x1f\x0ee8\x02f\x169f3\x15g\x145e=1f\v\x1bh\x01\x18e#0f\x18\x0ed;;d=\x15e\x01%e:7f\x150f\r.g>\x0ee\x1b=f1=h=&d;\vg;\rd=\x06f\x18/d:$f5\x01g\x14\x1fd:\'f\t\0d;%g\x145h/\x1df\x18>g$:d8\0d:\x1be\r\x15d=\rd::e\x11\x18e\b\x06f\x1e\x10e\x1c0e\x1b>f\x17\x05f88e7%e\x057e-&g\x14\x1fg3;e\b\x17g=\x11e\x0f\ve8\x16e-\x10e/\x06g \x01i"\x11i\x01\x13f\x0e\'e\b6e\x1c0e\f:e\x1f:f\x1c,e\x05(e\x1b=g=\x11d8\ni\x07\rh&\x01g,,d:\fe\x16\x1cf,"h?\x1be\x05%e\x0f\vf\x03\x05h?\x19d:\x1bh\0\x03h/\x15e\x0f\x11g\x0e0e\x1f9h.-d;%d8\nf\x14?e:\x1cf\b\x10d8:g\x0e/e"\x03i&\x19f8/e\x10\ff\x176e(1d9\x10e\x0f\x11i\0\x01d8\0e.\x1ae<\0e\x0f\x11d=\x1ce\x13\x01f \x07e\x07\x06f,"h?\x0eh\'#e\x063e\x1c0f\x169d8\0d8\vd;%e\x0f\nh4#d;;f\b\x16h\0\x05e."f\b7d;#h!(g\'/e\b\x06e%3d::f\x150g \x01i\x14\0e\x14.e\x07:g\x0e0g&;g:?e:\x14g\x14(e\b\x17h!(d8\re\x10\fg<\x16h>\x11g;\x1fh.!f\x1f%h/"d8\rh&\x01f\x1c\te\x053f\x1c:f\x1e\x04e>\be$\x1af\x12-f\x14>g;\x04g;\x07f\x14?g-\x16g\x1b4f\x0e%h\x03=e\n\x1bf\x1d%f:\x10f\x19\x02i\x16\x13g\x1c\ve\b0g\x03-i\x17(e\x053i\x14.d8\x13e\f:i\x1d\x1ee88h\v1h/-g\x19>e:&e8\ff\x1c\x1bg>\x0ee%3f/\x14h>\x03g\x1f%h/\x06h\'\x04e.\x1ae;:h..i\x03(i\x17(f\x04\x0fh\'\x01g2>e=)f\x17%f\x1c,f\x0f\x10i+\x18e\x0f\x11h(\0f\x169i\x1d"e\x1f:i\x07\x11e$\x04g\x10\x06f\x1d\x03i\x19\x10e=1g\t\x07i\x136h!\fh?\x18f\x1c\te\b\x06d:+g\t)e\x13\x01g;\x0fh\x10%f7;e\n d8\x13e.6h?\x19g\'\rh/\x1di"\x18h57f\x1d%d8\x1ae\n!e\x05,e\x11\nh.0e=\x15g.\0d;\vh4(i\x07\x0fg\x147d::e=1e\x13\re<\x15g\x14(f\n%e\x11\ni\x03(e\b\x06e?+i\0\x1fe\x12(h/"f\x176e0\x1af3(f\x04\x0fg\x143h/7e-&f !e:\x14h/%e\x0e\x06e\x0f2e\x0f*f\x18/h?\x14e\x1b\x1eh4-d90e\x10\rg\'0d8:d:\x06f\b\x10e\n\x1fh/4f\x18\x0ed>\x1be:\x14e-)e-\x10d8\x13i"\x18g(\ve:\x0fd8\0h\b,f\x1c\x03e\x13!e\x0f*f\x1c\te\x056e.\x03d?\x1df\n$h\0\fd8\x14d;\ne$)g*\x17e\x0f#e\n(f\0\x01g\n6f\0\x01g\t9e\b+h.$d8:e?\x05i!;f\x1b4f\x160e0\x0fh/4f\b\x11e\0\x11d=\x1cd8:e*\x12d=\x13e\f\x05f\v,i\x02#d9\bd8\0f 7e\x1b=e\x06\x05f\x18/e\x10&f 9f\r.g\x145h\'\x06e-&i\x19"e\x057f\x1c\th?\x07g(\vg\x141d:\x0ed::f\t\re\x07:f\x1d%d8\rh?\x07f-#e\x1c(f\x18\x0ef\x18\x1ff\x15\x05d:\ve\x053g3;f \x07i"\x18e\x15\x06e\n!h>\x13e\x05%d8\0g\x1b4e\x1f:g!\0f\x15\x19e-&d:\x06h\'#e;:g-\x11g;\x13f\x1e\x1ce\x05(g\x10\x03i\0\x1ag\x1f%h.!e\b\x12e/9d:\x0eh\t:f\x1c/g\x1b8e\x06\fe\x0f\x11g\x14\x1fg\x1c\x1fg\x1a\x04e;:g+\vg-\tg:\'g1;e\x1e\vg;\x0fi*\fe.\x1eg\x0e0e\b6d=\x1cf\x1d%h\x07*f \x07g->d;%d8\ve\x0e\x1fe\b\x1bf\x17 f3\x15e\x056d8-e\0\vd::d8\0e\b\x07f\f\x07e\r\x17e\x053i\x17-i\x1b\x06e\x1b"g,,d8\te\x053f3(e\x1b f-$g\x05\'g\t\x07f71e\x1c3e\x15\x06d8\x1ae9?e7\x1ef\x17%f\x1c\x1fi+\x18g:\'f\x1c\0h?\x11g;\x11h!\fd8:d:$i\0\x1ah/\x04d;7h\'\te>\x17g2>e\r\x0ee.6e:-e.\ff\b\x10f\x04\x1fh\'\te.\th#\x05e>\x17e\b0i\x02.d;6e\b6e:&i#\x1fe\x13\x01h\x19=g\x046h=,h==f\n%d;7h.0h\0\x05f\x169f!\bh!\ff\x14?d::f0\x11g\x14(e\x13\x01d8\x1ch%?f\x0f\x10e\x07:i\x05\x12e:\x17g\x046e\x10\x0ed;\x18f,>g\x03-g\x029d;%e\t\re.\fe\x05(e\x0f\x11e8\x16h.>g=.i"\x06e/g%\x1eh\x0e7e>\x17e\b)g\x14(g;\'g;-d= d;,h?\x19d9\bf(!e<\x0fh/-h(\0h\x03=e$\x1fi\x1b\x05h\x19\x0ef\x13\rd=\x1ci#\x0ef d9&f\x1c\tf\x15\bf5\vh/\x15g\';e\n(f\t\rh\x03=e\x063e.\x1ah\x02!g%(d8\rf\x16-i\x1c\0f1\x02d8\re>\x17e\n\x1ef3\x15d9\vi\x174i\x07\x07g\x14(h\x10%i\x14\0f\n\x15h/\tg\x1b.f \x07g\b1f\x03\x05f\x11\x04e=1f\x1c\td:\x1bh$\x07h#=f\x16\x07e-&f\x1c:d<\x1af\x150e-\x17h#\x05d?.h4-g\t)e\x06\x1cf\x1d\x11e\x05(i\x1d"g2>e\x13\x01e\x056e.\x1ed:\vf\x03\x05f04e93f\x0f\x10g$:d8\ne8\x02h0"h0"f\x19.i\0\x1af\x15\x19e8\bd8\nd< g1;e\b+f-\ff\x1b2f\v%f\x1c\te\b\x1bf\x160i\x05\rd;6e\x0f*h&\x01f\x176d;#h3\x07h(\nh>>e\b0d::g\x14\x1fh."i\x18\x05h\0\x01e8\be1\x15g$:e?\x03g\x10\x06h44e-\x10g62g+\x19d8;i!\fh\x07*g\x046g:\'e\b+g.\0e\r\x15f\x149i\x1d)i\x02#d:\x1bf\x1d%h/4f\t\x13e<\0d;#g \x01e\b i\x19$h/\x01e\b8h\n\x02g\x1b.i\x07\rg\x029f,!f\x158e$\x1ae0\x11h\'\x04e\b\x12h5\x04i\x07\x11f\t>e\b0d;%e\x10\x0ee$\'e\x05(d8;i!5f\x1c\0d=3e\x1b\x1eg-\x14e$)d8\vd?\x1di\x1a\x1cg\x0e0d;#f#\0f\x1f%f\n\x15g%(e0\x0ff\x176f2\x12f\x1c\tf-#e88g\x14\x1ah\x073d;#g\x10\x06g\x1b.e=\x15e\x05,e<\0e$\re\b6i\x07\x11h\x1e\re98g&\x0fg\t\bf\x1c,e="f\b\x10e\x07\x06e$\x07h!\ff\x03\x05e\x1b\x1ee\b0f\0\x1df\x033f\0\x0ef 7e\r\x0fh..h.$h/\x01f\x1c\0e%=d:\'g\x14\x1ff\f\tg\x05\'f\x1c\rh#\x05e9?d8\x1ce\n(f<+i\x07\x07h4-f\x160f\t\vg;\x04e\x1b>i\x1d"f\x1d?e\x0f\x02h\0\x03f\x14?f2;e.9f\x18\x13e$)e\x1c0e\n*e\n\x1bd::d;,e\r\x07g:\'i\0\x1fe:&d::g\t)h0\x03f\x154f5\x01h!\fi\0 f\b\x10f\x16\x07e-\x17i\x1f)e\x1b=h48f\x18\x13e<\0e1\x15g\x1b8i\x17\x1ch!(g\x0e0e=1h\'\x06e&\x02f-$g>\x0ee.9e$\'e0\x0ff\n%i\x01\x13f\x1d!f,>e?\x03f\x03\x05h.8e$\x1af3\x15h\'\x04e.6e1\x05d9&e:\x17h?\x1ef\x0e%g+\ve\r3d8>f\n%f\n\0e7\'e%%h?\x10g\x19;e\x05%d;%f\x1d%g\x10\x06h.:d:\vd;6h\x07*g\x141d8-e\r\x0ee\n\x1ee\x05,e&\be&\bg\x1c\x1ff-#d8\ri\x14\x19e\x05(f\x16\x07e\x10\be\x10\fd;7e\0e7&e\x0f3h\x02!d;=g-\x14f!\be.\x1ei\x19\x05g\x145d?!g;\x0fg\x10\x06g\x14\x1fe\x11=e.#d< d;;e\n!f-#e<\x0fg\t9h\t2d8\vf\x1d%e\r\x0fd<\x1ae\x0f*h\x03=e=\x13g\x046i\x07\rf\x160e\x05\'e.9f\f\x07e/g(\ve\f;g\x16\x17g;\x0fh?\x07h?\x07e\x0e;d9\ve\t\rf\x146e\x05%e94e:&f\x1d\x02e?\x17g>\x0ed8=f\x1c\0i+\x18g\x19;i\x19\x06f\x1c*f\x1d%e\n e7%e\x05\rh4#f\x15\x19g(\vg\t\be\x1d\x17h:+d=\x13i\x07\re:\x06e\x07:e\x14.f\b\x10f\x1c,e="e<\x0fe\x1c\x1fh1\x06e\x07:e\x039d8\x1cf\x169i\x02.g.1e\r\x17d:,f1\x02h\x01\fe\x0f\x16e>\x17h\x01\fd=\rg\x1b8d?!i!5i\x1d"e\b\x06i\x12\x1fg=\x11i!5g!.e.\x1ae\x1b>d>\vg=\x11e\x1d\0g\'/f\x1e\x01i\x14\x19h//g\x1b.g\x1a\x04e.\x1dh4\x1df\x1c:e\x053i#\x0ei\x19)f\x0e\bf\x1d\x03g\x17\x05f/\x12e. g\t)i\x19$d:\x06h)\x15h+\x16g\x16>g\x17\x05e\x0f\nf\x176f1\x02h4-g+\x19g\x029e\x04?g+%f/\x0fe$)d8-e$.h.$h/\x06f/\x0fd8*e$)f4%e-\x17d=\x13e\x0f0g\x01#g;4f\n$f\x1c,i!5d8*f\0\'e.\x18f\x169e88h\'\x01g\x1b8f\x1c:f\b\x18g\x15%e:\x14e=\x13e>\ve8\bf\x169d>?f !e\x1b-h\x02!e8\x02f\b?e1\vf \x0fg\x1b.e\x11\x18e7%e/\x0ee\x05\x03e<\x15h57f\x149e\x0f\x18g,,e\x1b\x1bd<\x1ah.!h**f\x18\x0ei\x1a\x10g\'\x01e.\x1de.\x1dh\'\x04h\f\x03f6\bh49e\x051e\x10\fe?\x18h.0d=\x13g3;e8&f\x1d%e\x10\re-\x17g\x19e\n g\x1b\x1fe\x0f\x17e\b0d:\ff\t\ve$\'i\x07\x0ff\b\x10d::f\x150i\x07\x0fe\x051d:+e\f:e\x1f\x1fe%3e-)e\x0e\x1fe\b\x19f\t\0e\x1c(g;\x13f\x1d\x1fi\0\x1ad?!h6\x05g:\'i\x05\rg=.e=\x13f\x176d<\x18g\'\0f\0\'f\x04\x1ff\b?d:\'i\x01\nf\b2e\x07:e\x0f#f\x0f\x10d:$e01d8\x1ad?\x1de\x01%g(\ve:&e\x0f\x02f\x150d:\vd8\x1af\x154d8*e11d8\x1cf\x03\x05f\x04\x1fg\t9f.\ne\b\x06i!\x1ef\x10\x1ce0\ve1\x1ed:\x0ei\x17(f\b7h4"e\n!e#0i\x1f3e\x0f\ne\x056h4"g;\x0fe\x1d\x1af\f\x01e92i\x03(f\b\x10g+\ve\b)g\x1b\nh\0\x03h\x19\x11f\b\x10i\x03=e\f\x05h#\x05g\x14(f\b6f/\x14h5\x1bf\x16\x07f\x18\x0ef\v\x1be\x15\x06e.\ff\x154g\x1c\x1ff\x18/g\x1ce/\x06g"\x0ei#\x1fg;?h\t2g(3e.\x1ag;\bd:\x0eg\x14\x1fg\t)d>\x1bf1\x02f\x10\x1cg\v\x10e\n\x1bi\x07\x0fd8%i\x07\rf08h?\x1ce\x06\x19g\x1c\x1ff\x1c\ti\x19\x10g+\x1ed:\te/9h1!h49g\x14(d8\re%=g;\x1de/9e\r\x01e\b\x06d?\x03h?\x1bg\x029h/\x04e=1i\x1f3d<\x18e\n?d8\re0\x11f,#h5\x0fe96d8\x14f\x1c\tg\x029f\x169e\x10\x11e\x05(f\x160d?!g\x14(h.>f\x16=e="h1!h5\x04f \x0ee\x15\x06e\x1f\x0eg;\x1fd8\0e\x07:g\t\bf\t\x13i\0 g\x14"e\x13\x01f&\x02e\x065g\x14(d:\x0ed?\x1dg\x15\x19e\x1b g4 d8-e\x1c\ve-\x18e\x02(h44e\x1b>f\x1c\0f\x04\x1bi\x15?f\x1c\x1fe\x0f#d;7g\x10\x06h4"e\x1f:e\x1c0e.\tf\x0e\x12f-&f1\ti\x07\fi\x1d"e\b\x1be;:e$)g):i&\x16e\x05\be.\fe\x16\x04i)1e\n(d8\vi\x1d"d8\re\x06\rh/\x1ad?!f\x04\x0fd9\ti\x183e\x05\th\v1e\x1b=f<\x02d:.e\x06\x1bd:\vg\x0e)e.6g>$d<\x17e\x06\x1cf0\x11e\r3e\x0f/e\x10\rg(1e.6e\x057e\n(g\x14;f\x033e\b0f3(f\x18\x0ee0\x0fe-&f\0\'h\x03=h\0\x03g \x14g!,d;6h\'\x02g\x1c\vf8\x05f%\x1af\x10\x1eg,\x11i&\x16i \x01i;\x04i\x07\x11i\0\x02g\x14(f1\x1fh\v\x0fg\x1c\x1fe.\x1ed8;g.!i\x186f.5h(;e\x06\ng?;h/\x11f\x1d\x03e\b)e\x01\x1ae%=d<P:P0P:P8P;P8Q\rQ\x02P>P2Q\x01P5P5P3P>P?Q\0P8Q\x02P0P:P5Q\tP5Q\x03P6P5P\x1aP0P:P1P5P7P1Q\vP;P>P=P8P\x12Q\x01P5P?P>P4P-Q\x02P>Q\x02P>PP=P0P3P4P5PP3P>P4P2P>Q\x02Q\x02P0PP2P0Q\x01P2P0PQ\x02Q\x03Q\x02P=P0P4P4P=Q\x0fP\x12P>Q\x02Q\x02Q\0P8P=P5P9P\x12P0Q\x01P=P8PQ\x02Q\0Q\x03P1P\x1eP=P8PPP9P4P2P5P>P=P>Q\x01Q\x03P4`$\x15`%\x07`$9`%\b`$\x15`%\0`$8`%\x07`$\x15`$>`$\x15`%\v`$\x14`$0`$*`$0`$(`%\x07`$\x0f`$\x15`$\x15`$?`$-`%\0`$\x07`$8`$\x15`$0`$$`%\v`$9`%\v`$\x06`$*`$9`%\0`$/`$9`$/`$>`$$`$\x15`$%`$>jagran`$\x06`$\x1c`$\x1c`%\v`$\x05`$,`$&`%\v`$\x17`$\b`$\x1c`$>`$\x17`$\x0f`$9`$.`$\x07`$(`$5`$9`$/`%\x07`$%`%\x07`$%`%\0`$\x18`$0`$\x1c`$,`$&`%\0`$\x15`$\b`$\x1c`%\0`$5`%\x07`$(`$\b`$(`$\x0f`$9`$0`$\t`$8`$.`%\x07`$\x15`$.`$5`%\v`$2`%\x07`$8`$,`$.`$\b`$&`%\x07`$\x13`$0`$\x06`$.`$,`$8`$-`$0`$,`$(`$\x1a`$2`$.`$(`$\x06`$\x17`$8`%\0`$2`%\0X9Y\x04Y\tX%Y\x04Y\tY\x07X0X\'X"X.X1X9X/X/X\'Y\x04Y\tY\x07X0Y\x07X5Y\bX1X:Y\nX1Y\x03X\'Y\x06Y\bY\x04X\'X(Y\nY\x06X9X1X6X0Y\x04Y\x03Y\x07Y\x06X\'Y\nY\bY\x05Y\x02X\'Y\x04X9Y\x04Y\nX\'Y\x06X\'Y\x04Y\x03Y\x06X-X*Y\tY\x02X(Y\x04Y\bX-X)X\'X.X1Y\x01Y\x02X7X9X(X/X1Y\x03Y\x06X%X0X\'Y\x03Y\x05X\'X\'X-X/X%Y\x04X\'Y\x01Y\nY\x07X(X9X6Y\x03Y\nY\x01X(X-X+Y\bY\x05Y\x06Y\bY\x07Y\bX#Y\x06X\'X,X/X\'Y\x04Y\x07X\'X3Y\x04Y\x05X9Y\x06X/Y\x04Y\nX3X9X(X1X5Y\x04Y\tY\x05Y\x06X0X(Y\x07X\'X#Y\x06Y\x07Y\x05X+Y\x04Y\x03Y\x06X*X\'Y\x04X\'X-Y\nX+Y\x05X5X1X4X1X-X-Y\bY\x04Y\bY\x01Y\nX\'X0X\'Y\x04Y\x03Y\x04Y\x05X1X)X\'Y\x06X*X\'Y\x04Y\x01X#X(Y\bX.X\'X5X#Y\x06X*X\'Y\x06Y\x07X\'Y\x04Y\nX9X6Y\bY\bY\x02X/X\'X(Y\x06X.Y\nX1X(Y\x06X*Y\x04Y\x03Y\x05X4X\'X!Y\bY\x07Y\nX\'X(Y\bY\x02X5X5Y\bY\x05X\'X1Y\x02Y\x05X#X-X/Y\x06X-Y\x06X9X/Y\x05X1X#Y\nX\'X-X)Y\x03X*X(X/Y\bY\x06Y\nX,X(Y\x05Y\x06Y\x07X*X-X*X,Y\x07X)X3Y\x06X)Y\nX*Y\x05Y\x03X1X)X:X2X)Y\x06Y\x01X3X(Y\nX*Y\x04Y\x04Y\x07Y\x04Y\x06X\'X*Y\x04Y\x03Y\x02Y\x04X(Y\x04Y\x05X\'X9Y\x06Y\x07X#Y\bY\x04X4Y\nX!Y\x06Y\bX1X#Y\x05X\'Y\x01Y\nY\x03X(Y\x03Y\x04X0X\'X*X1X*X(X(X#Y\x06Y\x07Y\x05X3X\'Y\x06Y\x03X(Y\nX9Y\x01Y\x02X/X-X3Y\x06Y\x04Y\x07Y\x05X4X9X1X#Y\x07Y\x04X4Y\x07X1Y\x02X7X1X7Y\x04X(profileservicedefaulthimselfdetailscontentsupportstartedmessagesuccessfashioncountryaccountcreatedstoriesresultsrunningprocesswritingobjectsvisiblewelcomearticleunknownnetworkcompanydynamicbrowserprivacyproblemServicerespectdisplayrequestreservewebsitehistoryfriendsoptionsworkingversionmillionchannelwindow.addressvisitedweathercorrectproductedirectforwardyou canremovedsubjectcontrolarchivecurrentreadinglibrarylimitedmanagerfurthersummarymachineminutesprivatecontextprogramsocietynumberswrittenenabledtriggersourcesloadingelementpartnerfinallyperfectmeaningsystemskeepingculture",journalprojectsurfaces"expiresreviewsbalanceEnglishContentthroughPlease opinioncontactaverageprimaryvillageSpanishgallerydeclinemeetingmissionpopularqualitymeasuregeneralspeciessessionsectionwriterscounterinitialreportsfiguresmembersholdingdisputeearlierexpressdigitalpictureAnothermarriedtrafficleadingchangedcentralvictoryimages/reasonsstudiesfeaturelistingmust beschoolsVersionusuallyepisodeplayinggrowingobviousoverlaypresentactions</ul>\r\nwrapperalreadycertainrealitystorageanotherdesktopofferedpatternunusualDigitalcapitalWebsitefailureconnectreducedAndroiddecadesregular & animalsreleaseAutomatgettingmethodsnothingPopularcaptionletterscapturesciencelicensechangesEngland=1&History = new CentralupdatedSpecialNetworkrequirecommentwarningCollegetoolbarremainsbecauseelectedDeutschfinanceworkersquicklybetweenexactlysettingdiseaseSocietyweaponsexhibit<!--Controlclassescoveredoutlineattacksdevices(windowpurposetitle="Mobile killingshowingItaliandroppedheavilyeffects-1\']);\nconfirmCurrentadvancesharingopeningdrawingbillionorderedGermanyrelated</form>includewhetherdefinedSciencecatalogArticlebuttonslargestuniformjourneysidebarChicagoholidayGeneralpassage,"animatefeelingarrivedpassingnaturalroughly.\n\nThe but notdensityBritainChineselack oftributeIreland" data-factorsreceivethat isLibraryhusbandin factaffairsCharlesradicalbroughtfindinglanding:lang="return leadersplannedpremiumpackageAmericaEdition]"Messageneed tovalue="complexlookingstationbelievesmaller-mobilerecordswant tokind ofFirefoxyou aresimilarstudiedmaximumheadingrapidlyclimatekingdomemergedamountsfoundedpioneerformuladynastyhow to SupportrevenueeconomyResultsbrothersoldierlargelycalling."AccountEdward segmentRobert effortsPacificlearnedup withheight:we haveAngelesnations_searchappliedacquiremassivegranted: falsetreatedbiggestbenefitdrivingStudiesminimumperhapsmorningsellingis usedreversevariant role="missingachievepromotestudentsomeoneextremerestorebottom:evolvedall thesitemapenglishway to AugustsymbolsCompanymattersmusicalagainstserving})();\r\npaymenttroubleconceptcompareparentsplayersregionsmonitor \'\'The winningexploreadaptedGalleryproduceabilityenhancecareers). The collectSearch ancientexistedfooter handlerprintedconsoleEasternexportswindowsChannelillegalneutralsuggest_headersigning.html">settledwesterncausing-webkitclaimedJusticechaptervictimsThomas mozillapromisepartieseditionoutside:false,hundredOlympic_buttonauthorsreachedchronicdemandssecondsprotectadoptedprepareneithergreatlygreateroverallimprovecommandspecialsearch.worshipfundingthoughthighestinsteadutilityquarterCulturetestingclearlyexposedBrowserliberal} catchProjectexamplehide();FloridaanswersallowedEmperordefenseseriousfreedomSeveral-buttonFurtherout of != nulltrainedDenmarkvoid(0)/all.jspreventRequestStephen\n\nWhen observe</h2>\r\nModern provide" alt="borders.\n\nFor \n\nMany artistspoweredperformfictiontype ofmedicalticketsopposedCouncilwitnessjusticeGeorge Belgium...</a>twitternotablywaitingwarfare Other rankingphrasesmentionsurvivescholar</p>\r\n Countryignoredloss ofjust asGeorgiastrange<head><stopped1\']);\r\nislandsnotableborder:list ofcarried100,000</h3>\n severalbecomesselect wedding00.htmlmonarchoff theteacherhighly biologylife ofor evenrise of»plusonehunting(thoughDouglasjoiningcirclesFor theAncientVietnamvehiclesuch ascrystalvalue =Windowsenjoyeda smallassumed<a id="foreign All rihow theDisplayretiredhoweverhidden;battlesseekingcabinetwas notlook atconductget theJanuaryhappensturninga:hoverOnline French lackingtypicalextractenemieseven ifgeneratdecidedare not/searchbeliefs-image:locatedstatic.login">convertviolententeredfirst">circuitFinlandchemistshe was10px;">as suchdivided</span>will beline ofa greatmystery/index.fallingdue to railwaycollegemonsterdescentit withnuclearJewish protestBritishflowerspredictreformsbutton who waslectureinstantsuicidegenericperiodsmarketsSocial fishingcombinegraphicwinners<br /><by the NaturalPrivacycookiesoutcomeresolveSwedishbrieflyPersianso muchCenturydepictscolumnshousingscriptsnext tobearingmappingrevisedjQuery(-width:title">tooltipSectiondesignsTurkishyounger.match(})();\n\nburningoperatedegreessource=Richardcloselyplasticentries</tr>\r\ncolor:#ul id="possessrollingphysicsfailingexecutecontestlink toDefault<br />\n: true,chartertourismclassicproceedexplain</h1>\r\nonline.?xml vehelpingdiamonduse theairlineend --\x3e).attr(readershosting#ffffffrealizeVincentsignals src="/ProductdespitediversetellingPublic held inJoseph theatreaffects<style>a largedoesn\'tlater, ElementfaviconcreatorHungaryAirportsee theso thatMichaelSystemsPrograms, and width=e"tradingleft">\npersonsGolden Affairsgrammarformingdestroyidea ofcase ofoldest this is.src = cartoonregistrCommonsMuslimsWhat isin manymarkingrevealsIndeed,equally/show_aoutdoorescape(Austriageneticsystem,In the sittingHe alsoIslandsAcademy\n\t\t\x3c!--Daniel bindingblock">imposedutilizeAbraham(except{width:putting).html(|| [];\nDATA[ *kitchenmountedactual dialectmainly _blank\'installexpertsif(typeIt also© ">Termsborn inOptionseasterntalkingconcerngained ongoingjustifycriticsfactoryits ownassaultinvitedlastinghis ownhref="/" rel="developconcertdiagramdollarsclusterphp?id=alcohol);})();using a><span>vesselsrevivalAddressamateurandroidallegedillnesswalkingcentersqualifymatchesunifiedextinctDefensedied in\n\t\x3c!-- customslinkingLittle Book ofeveningmin.js?are thekontakttoday\'s.html" target=wearingAll Rig;\n})();raising Also, crucialabout">declare--\x3e\n<scfirefoxas muchappliesindex, s, but type = \n\r\n\x3c!--towardsRecordsPrivateForeignPremierchoicesVirtualreturnsCommentPoweredinline;povertychamberLiving volumesAnthonylogin" RelatedEconomyreachescuttinggravitylife inChapter-shadowNotable</td>\r\n returnstadiumwidgetsvaryingtravelsheld bywho arework infacultyangularwho hadairporttown of\n\nSome \'click\'chargeskeywordit willcity of(this);Andrew unique checkedor more300px; return;rsion="pluginswithin herselfStationFederalventurepublishsent totensionactresscome tofingersDuke ofpeople,exploitwhat isharmonya major":"httpin his menu">\nmonthlyofficercouncilgainingeven inSummarydate ofloyaltyfitnessand wasemperorsupremeSecond hearingRussianlongestAlbertalateralset of small">.appenddo withfederalbank ofbeneathDespiteCapitalgrounds), and percentit fromclosingcontainInsteadfifteenas well.yahoo.respondfighterobscurereflectorganic= Math.editingonline paddinga wholeonerroryear ofend of barrierwhen itheader home ofresumedrenamedstrong>heatingretainscloudfrway of March 1knowingin partBetweenlessonsclosestvirtuallinks">crossedEND --\x3efamous awardedLicenseHealth fairly wealthyminimalAfricancompetelabel">singingfarmersBrasil)discussreplaceGregoryfont copursuedappearsmake uproundedboth ofblockedsaw theofficescoloursif(docuwhen heenforcepush(fuAugust UTF-8">Fantasyin mostinjuredUsuallyfarmingclosureobject defenceuse of Medical<body>\nevidentbe usedkeyCodesixteenIslamic#000000entire widely active (typeofone cancolor =speakerextendsPhysicsterrain<tbody>funeralviewingmiddle cricketprophetshifteddoctorsRussell targetcompactalgebrasocial-bulk ofman and</td>\n he left).val()false);logicalbankinghome tonaming Arizonacredits);\n});\nfounderin turnCollinsbefore But thechargedTitle">CaptainspelledgoddessTag --\x3eAdding:but wasRecent patientback in=false&Lincolnwe knowCounterJudaismscript altered\']);\n has theunclearEvent\',both innot all\n\n\x3c!-- placinghard to centersort ofclientsstreetsBernardassertstend tofantasydown inharbourFreedomjewelry/about..searchlegendsis mademodern only ononly toimage" linear painterand notrarely acronymdelivershorter00&as manywidth="/* <![Ctitle =of the lowest picked escapeduses ofpeoples PublicMatthewtacticsdamagedway forlaws ofeasy to windowstrong simple}catch(seventhinfoboxwent topaintedcitizenI don\'tretreat. Some ww.");\nbombingmailto:made in. Many carries||{};wiwork ofsynonymdefeatsfavoredopticalpageTraunless sendingleft"><comScorAll thejQuery.touristClassicfalse" Wilhelmsuburbsgenuinebishops.split(global followsbody ofnominalContactsecularleft tochiefly-hidden-banner</li>\n\n. When in bothdismissExplorealways via thespaC1olwelfareruling arrangecaptainhis sonrule ofhe tookitself,=0&(calledsamplesto makecom/pagMartin Kennedyacceptsfull ofhandledBesides//--\x3e</able totargetsessencehim to its by common.mineralto takeways tos.org/ladvisedpenaltysimple:if theyLettersa shortHerbertstrikes groups.lengthflightsoverlapslowly lesser social </p>\n\t\tit intoranked rate oful>\r\n attemptpair ofmake itKontaktAntoniohaving ratings activestreamstrapped").css(hostilelead tolittle groups,Picture--\x3e\r\n\r\n rows=" objectinverse<footerCustomV><\\/scrsolvingChamberslaverywoundedwhereas!= \'undfor allpartly -right:Arabianbacked centuryunit ofmobile-Europe,is homerisk ofdesiredClintoncost ofage of become none ofp"Middle ead\')[0Criticsstudios>©group">assemblmaking pressedwidget.ps:" ? rebuiltby someFormer editorsdelayedCanonichad thepushingclass="but arepartialBabylonbottom carrierCommandits useAs withcoursesa thirddenotesalso inHouston20px;">accuseddouble goal ofFamous ).bind(priests Onlinein Julyst + "gconsultdecimalhelpfulrevivedis veryr\'+\'iptlosing femalesis alsostringsdays ofarrivalfuture <objectforcingString(" />\n\t\there isencoded. The balloondone by/commonbgcolorlaw of Indianaavoidedbut the2px 3pxjquery.after apolicy.men andfooter-= true;for usescreen.Indian image =family,http://  driverseternalsame asnoticedviewers})();\n is moreseasonsformer the newis justconsent Searchwas thewhy theshippedbr><br>width: height=made ofcuisineis thata very Admiral fixed;normal MissionPress, ontariocharsettry to invaded="true"spacingis mosta more totallyfall of});\r\n immensetime inset outsatisfyto finddown tolot of Playersin Junequantumnot thetime todistantFinnishsrc = (single help ofGerman law andlabeledforestscookingspace">header-well asStanleybridges/globalCroatia About [0];\n it, andgroupedbeing a){throwhe madelighterethicalFFFFFF"bottom"like a employslive inas seenprintermost ofub-linkrejectsand useimage">succeedfeedingNuclearinformato helpWomen\'sNeitherMexicanprotein<table by manyhealthylawsuitdevised.push({sellerssimply Through.cookie Image(older">us.js"> Since universlarger open to!-- endlies in\']);\r\n marketwho is ("DOMComanagedone fortypeof Kingdomprofitsproposeto showcenter;made itdressedwere inmixtureprecisearisingsrc = \'make a securedBaptistvoting \n\t\tvar March 2grew upClimate.removeskilledway the</head>face ofacting right">to workreduceshas haderectedshow();action=book ofan area== "htt<header\n<html>conformfacing cookie.rely onhosted .customhe wentbut forspread Family a meansout theforums.footage">MobilClements" id="as highintense--\x3e\x3c!--female is seenimpliedset thea stateand hisfastestbesidesbutton_bounded"><img Infoboxevents,a youngand areNative cheaperTimeoutand hasengineswon the(mostlyright: find a -bottomPrince area ofmore ofsearch_nature,legallyperiod,land ofor withinducedprovingmissilelocallyAgainstthe wayk"px;">\r\npushed abandonnumeralCertainIn thismore inor somename isand, incrownedISBN 0-createsOctobermay notcenter late inDefenceenactedwish tobroadlycoolingonload=it. TherecoverMembersheight assumes<html>\npeople.in one =windowfooter_a good reklamaothers,to this_cookiepanel">London,definescrushedbaptismcoastalstatus title" move tolost inbetter impliesrivalryservers SystemPerhapses and contendflowinglasted rise inGenesisview ofrising seem tobut in backinghe willgiven agiving cities.flow of Later all butHighwayonly bysign ofhe doesdiffersbattery&lasinglesthreatsintegertake onrefusedcalled =US&See thenativesby thissystem.head of:hover,lesbiansurnameand allcommon/header__paramsHarvard/pixel.removalso longrole ofjointlyskyscraUnicodebr />\r\nAtlantanucleusCounty,purely count">easily build aonclicka givenpointerh"events else {\nditionsnow the, with man whoorg/Webone andcavalryHe diedseattle00,000 {windowhave toif(windand itssolely m"renewedDetroitamongsteither them inSenatorUs</a><King ofFrancis-produche usedart andhim andused byscoringat hometo haverelatesibilityfactionBuffalolink"><what hefree toCity ofcome insectorscountedone daynervoussquare };if(goin whatimg" alis onlysearch/tuesdaylooselySolomonsexual - <a hrmedium"DO NOT France,with a war andsecond take a >\r\n\r\n\r\nmarket.highwaydone inctivity"last">obligedrise to"undefimade to Early praisedin its for hisathleteJupiterYahoo! termed so manyreally s. The a woman?value=direct right" bicycleacing="day andstatingRather,higher Office are nowtimes, when a pay foron this-link">;borderaround annual the Newput the.com" takin toa brief(in thegroups.; widthenzymessimple in late{returntherapya pointbanninginks">\n();" rea place\\u003Caabout atr>\r\n\t\tccount gives a<SCRIPTRailwaythemes/toolboxById("xhumans,watchesin some if (wicoming formats Under but hashanded made bythan infear ofdenoted/iframeleft involtagein eacha"base ofIn manyundergoregimesaction </p>\r\n<ustomVa;></importsor thatmostly &re size="</a></ha classpassiveHost = WhetherfertileVarious=[];(fucameras/></td>acts asIn some>\r\n\r\n<!organis <br />BeijingcatalC deutscheuropeueuskaragaeilgesvenskaespaC1amensajeusuariotrabajomC)xicopC!ginasiempresistemaoctubreduranteaC1adirempresamomentonuestroprimeratravC)sgraciasnuestraprocesoestadoscalidadpersonanC:meroacuerdomC:sicamiembroofertasalgunospaC-sesejemploderechoademC!sprivadoagregarenlacesposiblehotelessevillaprimeroC:ltimoeventosarchivoculturamujeresentradaanuncioembargomercadograndesestudiomejoresfebrerodiseC1oturismocC3digoportadaespaciofamiliaantoniopermiteguardaralgunaspreciosalguiensentidovisitastC-tuloconocersegundoconsejofranciaminutossegundatenemosefectosmC!lagasesiC3nrevistagranadacompraringresogarcC-aacciC3necuadorquienesinclusodeberC!materiahombresmuestrapodrC-amaC1anaC:ltimaestamosoficialtambienningC:nsaludospodemosmejorarpositionbusinesshomepagesecuritylanguagestandardcampaignfeaturescategoryexternalchildrenreservedresearchexchangefavoritetemplatemilitaryindustryservicesmaterialproductsz-index:commentssoftwarecompletecalendarplatformarticlesrequiredmovementquestionbuildingpoliticspossiblereligionphysicalfeedbackregisterpicturesdisabledprotocolaudiencesettingsactivityelementslearninganythingabstractprogressoverviewmagazineeconomictrainingpressurevarious <strong>propertyshoppingtogetheradvancedbehaviordownloadfeaturedfootballselectedLanguagedistanceremembertrackingpasswordmodifiedstudentsdirectlyfightingnortherndatabasefestivalbreakinglocationinternetdropdownpracticeevidencefunctionmarriageresponseproblemsnegativeprogramsanalysisreleasedbanner">purchasepoliciesregionalcreativeargumentbookmarkreferrerchemicaldivisioncallbackseparateprojectsconflicthardwareinterestdeliverymountainobtained= false;for(var acceptedcapacitycomputeridentityaircraftemployedproposeddomesticincludesprovidedhospitalverticalcollapseapproachpartnerslogo"><adaughterauthor" culturalfamilies/images/assemblypowerfulteachingfinisheddistrictcriticalcgi-bin/purposesrequireselectionbecomingprovidesacademicexerciseactuallymedicineconstantaccidentMagazinedocumentstartingbottom">observed: "extendedpreviousSoftwarecustomerdecisionstrengthdetailedslightlyplanningtextareacurrencyeveryonestraighttransferpositiveproducedheritageshippingabsolutereceivedrelevantbutton" violenceanywherebenefitslaunchedrecentlyalliancefollowedmultiplebulletinincludedoccurredinternal$(this).republic><tr><tdcongressrecordedultimatesolution<ul id="discoverHome</a>websitesnetworksalthoughentirelymemorialmessagescontinueactive">somewhatvictoriaWestern title="LocationcontractvisitorsDownloadwithout right">\nmeasureswidth = variableinvolvedvirginianormallyhappenedaccountsstandingnationalRegisterpreparedcontrolsaccuratebirthdaystrategyofficialgraphicscriminalpossiblyconsumerPersonalspeakingvalidateachieved.jpg" />machines</h2>\n keywordsfriendlybrotherscombinedoriginalcomposedexpectedadequatepakistanfollow" valuable</label>relativebringingincreasegovernorplugins/List of Header">" name=" ("graduate</head>\ncommercemalaysiadirectormaintain;height:schedulechangingback to catholicpatternscolor: #greatestsuppliesreliable</ul>\n\t\t<select citizensclothingwatching<li id="specificcarryingsentence<center>contrastthinkingcatch(e)southernMichael merchantcarouselpadding:interior.split("lizationOctober ){returnimproved-->\n\ncoveragechairman.png" />subjectsRichard whateverprobablyrecoverybaseballjudgmentconnect..css" /> websitereporteddefault"/></a>\r\nelectricscotlandcreationquantity. ISBN 0did not instance-search-" lang="speakersComputercontainsarchivesministerreactiondiscountItalianocriteriastrongly: \'http:\'script\'coveringofferingappearedBritish identifyFacebooknumerousvehiclesconcernsAmericanhandlingdiv id="William provider_contentaccuracysection andersonflexibleCategorylawrence<script>layout="approved maximumheader"></table>Serviceshamiltoncurrent canadianchannels/themes//articleoptionalportugalvalue=""intervalwirelessentitledagenciesSearch" measuredthousandspending…new Date" size="pageNamemiddle" " /></a>hidden">sequencepersonaloverflowopinionsillinoislinks">\n\t<title>versionssaturdayterminalitempropengineersectionsdesignerproposal="false"EspaC1olreleasessubmit" er"additionsymptomsorientedresourceright"><pleasurestationshistory.leaving border=contentscenter">.\n\nSome directedsuitablebulgaria.show();designedGeneral conceptsExampleswilliamsOriginal"><span>search">operatorrequestsa "allowingDocumentrevision. \n\nThe yourselfContact michiganEnglish columbiapriorityprintingdrinkingfacilityreturnedContent officersRussian generate-8859-1"indicatefamiliar qualitymargin:0 contentviewportcontacts-title">portable.length eligibleinvolvesatlanticonload="default.suppliedpaymentsglossary\n\nAfter guidance</td><tdencodingmiddle">came to displaysscottishjonathanmajoritywidgets.clinicalthailandteachers<head>\n\taffectedsupportspointer;toString</small>oklahomawill be investor0" alt="holidaysResourcelicensed (which . After considervisitingexplorerprimary search" android"quickly meetingsestimate;return ;color:# height=approval, " checked.min.js"magnetic></a></hforecast. While thursdaydvertiseéhasClassevaluateorderingexistingpatients Online coloradoOptions"campbell\x3c!-- end</span><<br />\r\n_popups|sciences," quality Windows assignedheight: <b classle" value=" Companyexamples<iframe believespresentsmarshallpart of properly).\n\nThe taxonomymuch of </span>\n" data-srtuguC*sscrollTo project<head>\r\nattorneyemphasissponsorsfancyboxworld\'s wildlifechecked=sessionsprogrammpx;font- Projectjournalsbelievedvacationthompsonlightingand the special border=0checking</tbody><button Completeclearfix\n<head>\narticle <sectionfindingsrole in popular Octoberwebsite exposureused to changesoperatedclickingenteringcommandsinformed numbers </div>creatingonSubmitmarylandcollegesanalyticlistingscontact.loggedInadvisorysiblingscontent"s")s. This packagescheckboxsuggestspregnanttomorrowspacing=icon.pngjapanesecodebasebutton">gamblingsuch as , while </span> missourisportingtop:1px .</span>tensionswidth="2lazyloadnovemberused in height="cript">\n </<tr><td height:2/productcountry include footer" <!-- title"></jquery.</form>\n(g.\0d=\x13)(g9\x01i+\x14)hrvatskiitalianoromC"nD\x03tC<rkC\'eX\'X1X/Y\btambiC)nnoticiasmensajespersonasderechosnacionalserviciocontactousuariosprogramagobiernoempresasanunciosvalenciacolombiadespuC)sdeportesproyectoproductopC:bliconosotroshistoriapresentemillonesmediantepreguntaanteriorrecursosproblemasantiagonuestrosopiniC3nimprimirmientrasamC)ricavendedorsociedadrespectorealizarregistropalabrasinterC)sentoncesespecialmiembrosrealidadcC3rdobazaragozapC!ginassocialesbloqueargestiC3nalquilersistemascienciascompletoversiC3ncompletaestudiospC:blicaobjetivoalicantebuscadorcantidadentradasaccionesarchivossuperiormayorC-aalemaniafunciC3nC:ltimoshaciendoaquellosediciC3nfernandoambientefacebooknuestrasclientesprocesosbastantepresentareportarcongresopublicarcomerciocontratojC3venesdistritotC)cnicaconjuntoenergC-atrabajarasturiasrecienteutilizarboletC-nsalvadorcorrectatrabajosprimerosnegocioslibertaddetallespantallaprC3ximoalmerC-aanimalesquiC)nescorazC3nsecciC3nbuscandoopcionesexteriorconceptotodavC-agalerC-aescribirmedicinalicenciaconsultaaspectoscrC-ticadC3laresjusticiadeberC!nperC-odonecesitamantenerpequeC1orecibidatribunaltenerifecanciC3ncanariasdescargadiversosmallorcarequieretC)cnicodeberC-aviviendafinanzasadelantefuncionaconsejosdifC-cilciudadesantiguasavanzadatC)rminounidadessC!nchezcampaC1asoftonicrevistascontienesectoresmomentosfacultadcrC)ditodiversassupuestofactoressegundospequeC1aP3P>P4P0P5Q\x01P;P8P5Q\x01Q\x02Q\fP1Q\vP;P>P1Q\vQ\x02Q\fQ\rQ\x02P>P<P\x15Q\x01P;P8Q\x02P>P3P>P<P5P=Q\x0fP2Q\x01P5Q\x05Q\rQ\x02P>P9P4P0P6P5P1Q\vP;P8P3P>P4Q\x03P4P5P=Q\fQ\rQ\x02P>Q\x02P1Q\vP;P0Q\x01P5P1Q\x0fP>P4P8P=Q\x01P5P1P5P=P0P4P>Q\x01P0P9Q\x02Q\x04P>Q\x02P>P=P5P3P>Q\x01P2P>P8Q\x01P2P>P9P8P3Q\0Q\vQ\x02P>P6P5P2Q\x01P5P<Q\x01P2P>Q\x0eP;P8Q\bQ\fQ\rQ\x02P8Q\x05P?P>P:P0P4P=P5P9P4P>P<P0P<P8Q\0P0P;P8P1P>Q\x02P5P<Q\x03Q\x05P>Q\x02Q\x0fP4P2Q\x03Q\x05Q\x01P5Q\x02P8P;Q\x0eP4P8P4P5P;P>P<P8Q\0P5Q\x02P5P1Q\x0fQ\x01P2P>P5P2P8P4P5Q\x07P5P3P>Q\rQ\x02P8P<Q\x01Q\x07P5Q\x02Q\x02P5P<Q\vQ\x06P5P=Q\vQ\x01Q\x02P0P;P2P5P4Q\fQ\x02P5P<P5P2P>P4Q\vQ\x02P5P1P5P2Q\vQ\bP5P=P0P<P8Q\x02P8P?P0Q\x02P>P<Q\x03P?Q\0P0P2P;P8Q\x06P0P>P4P=P0P3P>P4Q\vP7P=P0Q\x0eP<P>P3Q\x03P4Q\0Q\x03P3P2Q\x01P5P9P8P4P5Q\x02P:P8P=P>P>P4P=P>P4P5P;P0P4P5P;P5Q\x01Q\0P>P:P8Q\x0eP=Q\x0fP2P5Q\x01Q\fP\x15Q\x01Q\x02Q\fQ\0P0P7P0P=P0Q\bP8X\'Y\x04Y\x04Y\x07X\'Y\x04X*Y\nX,Y\x05Y\nX9X.X\'X5X)X\'Y\x04X0Y\nX9Y\x04Y\nY\x07X,X/Y\nX/X\'Y\x04X"Y\x06X\'Y\x04X1X/X*X-Y\x03Y\x05X5Y\x01X-X)Y\x03X\'Y\x06X*X\'Y\x04Y\x04Y\nY\nY\x03Y\bY\x06X4X(Y\x03X)Y\x01Y\nY\x07X\'X(Y\x06X\'X*X-Y\bX\'X!X#Y\x03X+X1X.Y\x04X\'Y\x04X\'Y\x04X-X(X/Y\x04Y\nY\x04X/X1Y\bX3X\'X6X:X7X*Y\x03Y\bY\x06Y\x07Y\x06X\'Y\x03X3X\'X-X)Y\x06X\'X/Y\nX\'Y\x04X7X(X9Y\x04Y\nY\x03X4Y\x03X1X\'Y\nY\x05Y\x03Y\x06Y\x05Y\x06Y\x07X\'X4X1Y\x03X)X1X&Y\nX3Y\x06X4Y\nX7Y\x05X\'X0X\'X\'Y\x04Y\x01Y\x06X4X(X\'X(X*X9X(X1X1X-Y\x05X)Y\x03X\'Y\x01X)Y\nY\x02Y\bY\x04Y\x05X1Y\x03X2Y\x03Y\x04Y\x05X)X#X-Y\x05X/Y\x02Y\x04X(Y\nY\nX9Y\x06Y\nX5Y\bX1X)X7X1Y\nY\x02X4X\'X1Y\x03X,Y\bX\'Y\x04X#X.X1Y\tY\x05X9Y\x06X\'X\'X(X-X+X9X1Y\bX6X(X4Y\x03Y\x04Y\x05X3X,Y\x04X(Y\x06X\'Y\x06X.X\'Y\x04X/Y\x03X*X\'X(Y\x03Y\x04Y\nX)X(X/Y\bY\x06X#Y\nX6X\'Y\nY\bX,X/Y\x01X1Y\nY\x02Y\x03X*X(X*X#Y\x01X6Y\x04Y\x05X7X(X.X\'Y\x03X+X1X(X\'X1Y\x03X\'Y\x01X6Y\x04X\'X-Y\x04Y\tY\x06Y\x01X3Y\x07X#Y\nX\'Y\x05X1X/Y\bX/X#Y\x06Y\x07X\'X/Y\nY\x06X\'X\'Y\x04X\'Y\x06Y\x05X9X1X6X*X9Y\x04Y\x05X/X\'X.Y\x04Y\x05Y\x05Y\x03Y\x06\0\0\0\0\0\0\0\0\x01\0\x01\0\x01\0\x01\0\x02\0\x02\0\x02\0\x02\0\x04\0\x04\0\x04\0\x04\0\0\x01\x02\x03\x04\x05\x06\x07\x07\x06\x05\x04\x03\x02\x01\0\b\t\n\v\f\r\x0e\x0f\x0f\x0e\r\f\v\n\t\b\x10\x11\x12\x13\x14\x15\x16\x17\x17\x16\x15\x14\x13\x12\x11\x10\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x1f\x1e\x1d\x1c\x1b\x1a\x19\x18\x7f\x7f\x7f\x7f\0\0\0\0\0\0\0\0\x7f\x7f\x7f\x7f\x01\0\0\0\x02\0\0\0\x02\0\0\0\x01\0\0\0\x01\0\0\0\x03\0\0\0\x7f\x7f\0\x01\0\0\0\x01\0\0\x7f\x7f\0\x01\0\0\0\b\0\b\0\b\0\b\0\0\0\x01\0\x02\0\x03\0\x04\0\x05\0\x06\0\x07resourcescountriesquestionsequipmentcommunityavailablehighlightDTD/xhtmlmarketingknowledgesomethingcontainerdirectionsubscribeadvertisecharacter" value="</select>Australia" class="situationauthorityfollowingprimarilyoperationchallengedevelopedanonymousfunction functionscompaniesstructureagreement" title="potentialeducationargumentssecondarycopyrightlanguagesexclusivecondition</form>\r\nstatementattentionBiography} else {\nsolutionswhen the Analyticstemplatesdangeroussatellitedocumentspublisherimportantprototypeinfluence»</effectivegenerallytransformbeautifultransportorganizedpublishedprominentuntil thethumbnailNational .focus();over the migrationannouncedfooter">\nexceptionless thanexpensiveformationframeworkterritoryndicationcurrentlyclassNamecriticismtraditionelsewhereAlexanderappointedmaterialsbroadcastmentionedaffiliate</option>treatmentdifferent/default.Presidentonclick="biographyotherwisepermanentFranC\'aisHollywoodexpansionstandards</style>\nreductionDecember preferredCambridgeopponentsBusiness confusion>\n<title>presentedexplaineddoes not worldwideinterfacepositionsnewspaper</table>\nmountainslike the essentialfinancialselectionaction="/abandonedEducationparseInt(stabilityunable to\nrelationsNote thatefficientperformedtwo yearsSince thethereforewrapper">alternateincreasedBattle ofperceivedtrying tonecessaryportrayedelectionsElizabethdiscoveryinsurances.length;legendaryGeographycandidatecorporatesometimesservices.inheritedCommunityreligiouslocationsCommitteebuildingsthe worldno longerbeginningreferencecannot befrequencytypicallyinto the relative;recordingpresidentinitiallytechniquethe otherit can beexistenceunderlinethis timetelephoneitemscopepracticesadvantage);return For otherprovidingdemocracyboth the extensivesufferingsupportedcomputers functionpracticalsaid thatit may beEnglish\nsuspectedmargin: 0spiritual\n\nmicrosoftgraduallydiscussedhe becameexecutivejquery.jshouseholdconfirmedpurchasedliterallydestroyedup to thevariationremainingit is notcenturiesJapanese among thecompletedalgorithminterestsrebellionundefinedencourageresizableinvolvingsensitiveuniversalprovision(althoughfeaturingconducted), which continued-header">February numerous overflow:componentfragmentsexcellentcolspan="technicalnear the Advanced source ofexpressedHong Kong Facebookmultiple mechanismelevationoffensive\n\tsponsoreddocument.or "there arethose whomovementsprocessesdifficultsubmittedrecommendconvincedpromoting" width=".replace(classicalcoalitionhis firstdecisionsassistantindicatedevolution-wrapper"enough toalong thedelivered--\x3e\r\n\x3c!--American protectedNovember substanceautomaticaspect ofAmong theconnectedestimatesAir Forcesystem ofobjectiveimmediatemaking itpaintingsconqueredare stillproceduregrowth ofheaded byEuropean divisionsmoleculesfranchiseintentionattractedchildhoodalso useddedicatedsingaporedegree offather ofconflicts

\ncame fromwere usednote thatreceivingExecutiveeven moreaccess tocommanderPoliticalmusiciansdeliciousprisonersadvent ofUTF-8" />ContactSouthern bgcolor="series of. It was in Europepermittedvalidate.appearingofficialsseriously-languageinitiatedextendinglong-terminflationsuch thatgetCookiemarked byimplementbut it isincreasesdown the requiringdependent--\x3e\n\x3c!-- interviewWith the copies ofconsensuswas builtVenezuela(formerlythe statepersonnelstrategicfavour ofinventionWikipediacontinentvirtuallywhich wasprincipleComplete identicalshow thatprimitiveaway frommolecularpreciselydissolvedUnder theversion="> span id="sought tobelow thesurviving}his deathas in thecaused bypartiallyexisting using thewas givena list oflevels ofnotion ofOfficial dismissedscientistresemblesduplicateexplosiverecoveredall othergalleries{padding:people ofregion ofaddressesassociateimg alt="in modernshould bemethod ofreportingtimestampneeded tothe Greatregardingseemed toviewed asimpact onidea thatthe Worldheight ofexpandingThese arecurrent">carefullymaintainscharge ofClassicaladdressedpredictedownership\ndepend onsearch">\npieces ofcompetingReferencetennesseewhich has version= <gives thehistorianvalue="">padding:0view thattogether,the most was foundsubset ofattack onchildren,points ofpersonal position:allegedlyClevelandwas laterand afterare givenwas stillscrollingdesign ofmakes themuch lessAmericans.\n\nAfter , but theMuseum oflouisiana(from theminnesotaparticlesa processDominicanvolume ofreturningdefensive00px|righmade frommouseover" style="states of(which iscontinuesFranciscobuilding without awith somewho woulda form ofa part ofbefore itknown as Serviceslocation and oftenmeasuringand it ispaperbackvalues of\r\n= window.determineer" played byand early</center>from thisthe threepower andof "innerHTML<a href="y:inline;Church ofthe eventvery highofficial -height: content="/cgi-bin/to createafrikaansesperantofranC\'aislatvieE!ulietuviE3D\feE!tinaD\reE!tina`9\x04`8\x17`8"f\x17%f\x1c,h*\x1eg.\0d=\x13e-\x17g9\x01i+\x14e-\x17m\x15\x1cj5-l\x164d8:d;\0d9\bh.!g.\x17f\x1c:g,\x14h.0f\x1c,h(\x0eh+\x16e\r\0f\x1c\re\n!e\x19(d:\x12h\x01\x14g=\x11f\b?e\x1c0d:\'d?1d9\x10i\x03(e\x07:g\t\bg$>f\x0e\x12h!\ff&\x1ci\x03(h\x10=f <h?\x1bd8\0f-%f\x14/d;\x18e.\x1di*\fh/\x01g \x01e\'\x14e\x11\x18d<\x1af\x150f\r.e:\x13f6\bh49h\0\x05e\n\x1ee\x05,e.$h.(h.:e\f:f71e\x1c3e8\x02f\x12-f\x14>e\x19(e\f\x17d:,e8\x02e$\'e-&g\x14\x1fh6\nf\x1d%h6\ng.!g\x10\x06e\x11\x18d?!f\x01/g=\x11serviciosartC-culoargentinabarcelonacualquierpublicadoproductospolC-ticarespuestawikipediasiguientebC:squedacomunidadseguridadprincipalpreguntascontenidorespondervenezuelaproblemasdiciembrerelaciC3nnoviembresimilaresproyectosprogramasinstitutoactividadencuentraeconomC-aimC!genescontactardescargarnecesarioatenciC3ntelC)fonocomisiC3ncancionescapacidadencontraranC!lisisfavoritostC)rminosprovinciaetiquetaselementosfuncionesresultadocarC!cterpropiedadprincipionecesidadmunicipalcreaciC3ndescargaspresenciacomercialopinionesejercicioeditorialsalamancagonzC!lezdocumentopelC-cularecientesgeneralestarragonaprC!cticanovedadespropuestapacientestC)cnicasobjetivoscontactos`$.`%\x07`$\x02`$2`$?`$\x0f`$9`%\b`$\x02`$\x17`$/`$>`$8`$>`$%`$\x0f`$5`$\x02`$0`$9`%\x07`$\x15`%\v`$\b`$\x15`%\x01`$\x1b`$0`$9`$>`$,`$>`$&`$\x15`$9`$>`$8`$-`%\0`$9`%\x01`$\x0f`$0`$9`%\0`$.`%\b`$\x02`$&`$?`$(`$,`$>`$$diplodocs`$8`$.`$/`$0`%\x02`$*`$(`$>`$.`$*`$$`$>`$+`$?`$0`$\x14`$8`$$`$$`$0`$9`$2`%\v`$\x17`$9`%\x01`$\x06`$,`$>`$0`$&`%\x07`$6`$9`%\x01`$\b`$\x16`%\x07`$2`$/`$&`$?`$\x15`$>`$.`$5`%\x07`$,`$$`%\0`$(`$,`%\0`$\x1a`$.`%\f`$$`$8`$>`$2`$2`%\x07`$\x16`$\x1c`%\t`$,`$.`$&`$&`$$`$%`$>`$(`$9`%\0`$6`$9`$0`$\x05`$2`$\x17`$\x15`$-`%\0`$(`$\x17`$0`$*`$>`$8`$0`$>`$$`$\x15`$?`$\x0f`$\t`$8`%\x07`$\x17`$/`%\0`$9`%\x02`$\x01`$\x06`$\x17`%\x07`$\x1f`%\0`$.`$\x16`%\v`$\x1c`$\x15`$>`$0`$\x05`$-`%\0`$\x17`$/`%\x07`$$`%\x01`$.`$5`%\v`$\x1f`$&`%\x07`$\x02`$\x05`$\x17`$0`$\x10`$8`%\x07`$.`%\x07`$2`$2`$\x17`$>`$9`$>`$2`$\n`$*`$0`$\x1a`$>`$0`$\x10`$8`$>`$&`%\x07`$0`$\x1c`$?`$8`$&`$?`$2`$,`$\x02`$&`$,`$(`$>`$9`%\x02`$\x02`$2`$>`$\x16`$\x1c`%\0`$$`$,`$\x1f`$(`$.`$?`$2`$\x07`$8`%\x07`$\x06`$(`%\x07`$(`$/`$>`$\x15`%\x01`$2`$2`%\t`$\x17`$-`$>`$\x17`$0`%\x07`$2`$\x1c`$\x17`$9`$0`$>`$.`$2`$\x17`%\x07`$*`%\x07`$\x1c`$9`$>`$%`$\x07`$8`%\0`$8`$9`%\0`$\x15`$2`$>`$ `%\0`$\x15`$9`$>`$\x01`$&`%\x02`$0`$$`$9`$$`$8`$>`$$`$/`$>`$&`$\x06`$/`$>`$*`$>`$\x15`$\x15`%\f`$(`$6`$>`$.`$&`%\x07`$\x16`$/`$9`%\0`$0`$>`$/`$\x16`%\x01`$&`$2`$\x17`%\0categoriesexperience\r\nCopyright javascriptconditionseverything

\nmembershiplinguisticpx;paddingphilosophyassistanceuniversityfacilitiesrecognizedpreferenceif (typeofmaintainedvocabularyhypothesis.submit();&nbsp;annotationbehind theFoundationpublisher"assumptionintroducedcorruptionscientistsexplicitlyinstead ofdimensions onClick="considereddepartmentoccupationsoon afterinvestmentpronouncedidentifiedexperimentManagementgeographic" height="link rel=".replace(/depressionconferencepunishmenteliminatedresistanceadaptationoppositionwell knownsupplementdeterminedh1 class="0px;marginmechanicalstatisticscelebratedGovernment\n\nDuring tdevelopersartificialequivalentoriginatedCommissionattachment\r\nabsolute; supportingextremely mainstream popularityemployment\r\n colspan="\n conversionabout the

integrated" lang="enPortuguesesubstituteindividualimpossiblemultimediaalmost allpx solid #apart fromsubject toin Englishcriticizedexcept forguidelinesoriginallyremarkablethe secondh2 class="collection\r\nfunctionvisibilitythe use ofvolunteersattractionunder the threatened*\nevaluationemphasizedaccessiblesuccessionalong withMeanwhile,industries
has becomeaspects ofTelevisionsufficientbasketballboth sidescontinuingan articleadventureshis mothermanchesterprinciplesparticularcommentaryeffects ofdecided topublishersJournal ofdifficultyfacilitateacceptablestyle.css"\tfunction innovation>Copyrightsituationswould havebusinessesDictionarystatementsoften usedpersistentin Januarycomprising\n\tdiplomaticcontainingperformingextensionsmay not beconcept of onclick="It is alsofinancial making theLuxembourgadditionalare calledengaged in"script");but it waselectroniconsubmit="\n\x3c!-- End electricalofficiallysuggestiontop of theunlike theAustralianOriginallyreferences\n\r\nrecognisedinitializelimited toAlexandriaretirementAdventuresfour years\n\n<!-- increasingdecorationh3 class="origins ofobligationregulationclassified(function(advantagesbeing the historiansthe publicmany yearswhich wereover time,synonymouscontent">\npresumablyhis familyuserAgent.unexpectedincluding challengeda minorityundefined"belongs totaken fromin Octoberposition: said to bereligious Federation rowspan="only a fewmeant thatled to the--\x3e\r\n
Archbishop class="nobeing usedapproachesprivilegesnoscript>\nresults inmay be theEaster eggmechanismsreasonablePopulationCollectionselected">noscript>\r/index.phparrival of-jssdk\'));managed toincompletecasualtiescompletionChristiansSeptember arithmeticproceduresmight haveProductionit appearsPhilosophyfriendshipleading togiving thetoward theguaranteeddocumentedcolor:#000video gamecommissionreflectingchange theassociatedsans-serifonkeypress; padding:He was theunderlyingtypically , and the srcElementsuccessivesince the should be networkingaccountinguse of thelower thanshows that\n\t\tcomplaintscontinuousquantitiesastronomerhe did notdue to itsapplied toan averageefforts tothe futureattempt toTherefore,capabilityRepublicanwas formedElectronickilometerschallengespublishingthe formerindigenousdirectionssubsidiaryconspiracydetails ofand in theaffordablesubstancesreason forconventionitemtype="absolutelysupposedlyremained aattractivetravellingseparatelyfocuses onelementaryapplicablefound thatstylesheetmanuscriptstands for no-repeat(sometimesCommercialin Americaundertakenquarter ofan examplepersonallyindex.php?\npercentagebest-knowncreating a" dir="ltrLieutenant\n
is said tostructuralreferendummost oftena separate->\n
\r