diff --git a/Samples/Composition/README.md b/Samples/Composition/README.md new file mode 100644 index 000000000..fcc792394 --- /dev/null +++ b/Samples/Composition/README.md @@ -0,0 +1,23 @@ +--- +name: "Composition Samples" +page_type: sample +languages: +- csharp +products: +- windows +- windows-app-sdk +urlFragment: rendering +description: "Demonstrate the usage of rendering APIs (in both Microsoft.UI.Composition and Windows.UI.Composition) with WinAppSDK apps." +extendedZipContent: +- path: LICENSE + target: LICENSE +--- + +# Composition Samples +Welcome to the Windows Composition Samples. These samples demonstrate the usage of both Microsoft.UI.Composition and Windows.UI.Composition APIs that you can use to enhance your Windows App SDK application. + +## Dynamic Refresh Rate Sample + +## Sample Gallery +This is the place for the latest code samples, demos, and developer feedback around building beautiful and engaging WinUI3 apps. This repo focuses on the platform building blocks that make up the [Fluent Design System](https://fluent.microsoft.com/), with emphasis on creating UI using APIs in the [Microsoft.UI.Composition](https://docs.microsoft.com/windows/winui/api/microsoft.ui.composition) and [Microsoft.UI.Input](https://docs.microsoft.com/windows/winui/api/microsoft.ui.input) namespaces. For those of you familiar with the Universal Windows Platform Composition Samples, these samples are very similar but instead built on the APIs in the WinAppSDK (to learn more about the WinAppSDK, visit [here](https://docs.microsoft.com/windows/apps/windows-app-sdk/)). + diff --git a/Samples/Composition/SampleGallery/CONTRIBUTING.md b/Samples/Composition/SampleGallery/CONTRIBUTING.md new file mode 100644 index 000000000..4a6f51569 --- /dev/null +++ b/Samples/Composition/SampleGallery/CONTRIBUTING.md @@ -0,0 +1,76 @@ +# Contributing + +The Windows Composition Samples repo is built on open source principles. We welcome and encourage community contributions to help improve the codebase, samples, and overall quality of this project. In order to contribute, please follow the guidelines below. Thank you for your interest in the Windows.UI.Composition Samples project! + +## Prerequisite - CLA + +Microsoft asks that all contributors sign a contributor license agreement (CLA). +CLAs are generally common and accepted in most open source software projects. +We all want Microsoft's open source projects to be as widely used and +distributed as possible. We also want its users to be confident about the +origins and continuing existence of the code. The CLA helps us achieve that +goal by ensuring that we have the agreement of our contributors to use their +work, whether it be code, or documentation. + +The CLA permits Microsoft to distribute your code and submissions without +restriction. It doesn't require you to assign to us any copyright you have, +the ownership of the copyright remains with you. You cannot withdraw +permission for use of the contribution at a later date. + +We are generally seeking originally authored code, submissions and documentation +as contributions. Should you wish to submit materials that are not your original +work, you may submit them separately to the Project in accordance with the terms +of the CLA. + +Our Azure Pull Request Bot will automatically check for a signed CLA when you +submit a pull request. If there isn't a CLA on file, it will walk you through an all electronic process. **Note**: your employer may also have to complete an on-line form. + +## Source Directory Structure + +Since Windows.UI.Composition is constantly being updated, this project’s directory structure facilitates access to samples that will run on a variety of SDK versions. Each directory is numbered for the SDK version of the samples it contains. If you are unsure which SDK version you are using, you can create a new blank C# project and check the SDK version in its manifest. + +## Contribute - Pull Requests + +Create a pull request in order to submit new samples or fixes. All pull requests should follow the general guidelines below in addition to the guidelines specific to the type of pull request. + +### Pull Request Work Flow + +#### Creating a Branch + +In order to begin making changes for a pull request, first start by creating a new working branch. This can be done either in [Visual Studio](https://docs.microsoft.com/en-us/vsts/git/tutorial/branches?tabs=visual-studio), [via commandline](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging), or in other tools like the [GitHub Desktop app](https://help.github.com/desktop/guides/contributing-to-projects/creating-a-branch-for-your-work/). + +Please limit your branch changes to a single feature, sample, or bug fix for easier debugging, verification, and code review. This means for multiple samples or fixes you’ll have to create more than one branch with a correlating number of pull requests. + +#### Adding Work + +Using Visual Studio or your favorite editor, add your new content or edit existing files. You can commit multiple times while you are doing your work, or you can wait and commit only once when you're done. + +#### New Samples + +If making a new sample, you’ll want to create a new folder in the appropriate [Samples SDK folder](https://github.com/Microsoft/WindowsCompositionSamples/tree/master/SampleGallery/Samples) with a descriptive name. Copy the [sample template files](https://github.com/Microsoft/WindowsCompositionSamples/tree/master/SampleGallery/Samples/SampleTemplate) into your new folder and rename. You’ll also need to change the class names in both files, and add a good StaticSampleName and SampleDescription in the .cs file. The sample name should be short and match the intention of the sample; it will be the name displayed in the application. The description should be no more than a sentence and needs to concisely describe the purpose of the sample. It may also mention key APIs demonstrated. + +References to the new files will need to be added to the [sample definition](https://github.com/Microsoft/WindowsCompositionSamples/blob/master/SampleGallery/Shared/SampleDefinition.cs) page in order for them to show up in the application. Please place the reference under the appropriate SDK version block check and fill in the necessary information. + +You’ll notice the sample definition takes an imageUrl to use as the sample icon in the application, which you should place in the [Assets/SampleThumbnails](https://github.com/Microsoft/WindowsCompositionSamples/tree/master/SampleGallery/Assets/SampleThumbnails) folder. + +#### Verifying Changes + +To validate your changes, make sure you run all samples you have touched on x64, x86, and ARM. Please ensure that the project deploys to a mobile device or emulator as well as your desktop machine before submitting. + +#### Submitting Pull Requests + +After all changes have been committed and pushed to your branch, [create a pull request](https://github.com/Microsoft/WindowsCompositionSamples/compare). Please add a title and include a comment describing what changes have been made in detail. Double check that the Base branch is 'master' and your branch is the compared head. + +If creating a pull request to fix an existing open GitHub issue, please make sure to cross-reference the issue in the pull request and vice versa by using [supported GitHub issue and pull request autolinking](https://help.github.com/articles/autolinked-references-and-urls/). If no issue exists, please first [create a GitHub Issue](https://github.com/Microsoft/WindowsCompositionSamples/issues/new) then add the cross-referencing. + +Upon submitting the pull request, one of the site administrators will process it, review it, and provide feedback if necessary. Once all feedback is resolved, the pull request will be approved and integrated into the gallery. + +## UserVoice, GitHub Issues, & StackOverflow + +Alternative outlets for community participation are available through UserVoice, Github Issues, and StackOverflow. + +The [UWP UserVoice site](https://wpdev.uservoice.com/forums/110705-universal-windows-platform/category/58517-xaml-controls-composition) can be used to vote on and create suggestions for improvements to the Windows developer platform. Suggestions are reviewed by the Windows platform developer team and your feedback is used for planning and understanding how developers use the platform. + +This repo’s [GitHub Issues](https://github.com/Microsoft/WindowsCompositionSamples/issues) section can be used for asking questions about usage and bugs, but may also be used to respectfully interact with other community members to collaboratively answer questions and discover the innovative ways others are leveraging Windows APIs. + +Finally, StackOverflow has an active community of Windows UI developers where you can ask questions. Tag with ['uwp'](https://stackoverflow.com/questions/tagged/uwp) (or your appropriate application architecture), and tags indicating your framework. Some known active tags for Composition include ['windows-composition-api'](https://stackoverflow.com/questions/tagged/windows-composition-api?mixed=1) and ['xaml-composition'](https://stackoverflow.com/questions/tagged/xaml-composition?mixed=1). diff --git a/Samples/Composition/SampleGallery/LICENSE.txt b/Samples/Composition/SampleGallery/LICENSE.txt new file mode 100644 index 000000000..e697a2597 --- /dev/null +++ b/Samples/Composition/SampleGallery/LICENSE.txt @@ -0,0 +1,24 @@ + The MIT License (MIT) + + +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Samples/Composition/SampleGallery/PrivacyPolicy.md b/Samples/Composition/SampleGallery/PrivacyPolicy.md new file mode 100644 index 000000000..8c085a2ad --- /dev/null +++ b/Samples/Composition/SampleGallery/PrivacyPolicy.md @@ -0,0 +1 @@ +Windows UI Sample Gallery Privacy Policy =========== Personal Data We Collect ------------- None. How We Use Your Personal Data ------------- We do not collect or transmit any personal data. We do not store any personal data. Reasons We Share Your Personal Data ------------- We do not collect personal data and therefore do not share any of your personal data. Control You Have Over Your Personal Data ------------- Because we do not collect any personal data we do not offer any control over the use and sharing of this information, nor do we offer access to this data. \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/README.md b/Samples/Composition/SampleGallery/README.md new file mode 100644 index 000000000..d6fd1f82c --- /dev/null +++ b/Samples/Composition/SampleGallery/README.md @@ -0,0 +1,76 @@ +--- +name: "Composition Sample Gallery" +page_type: sample +languages: +- csharp +- cpp +products: +- windows +- windows-app-sdk +urlFragment: rendering +description: "Sample Gallery that showcases different use cases for the rendering APIs within Microsoft.UI.Composition." +extendedZipContent: +- path: LICENSE + target: LICENSE +--- + +# Composition Samples + +![app gif](https://media.giphy.com/media/Hx2beMDfEA7QqWPvD4/giphy.gif) + +Welcome to the Composition Samples! For those of you familiar with the Universal Windows Platform Composition Samples, these samples are very similar but instead built on the APIs in the WinAppSDK (to learn more about the WinAppSDK, visit [here](https://docs.microsoft.com/windows/apps/windows-app-sdk/)). This is the place for the latest code samples, demos, and developer feedback around building beautiful and engaging WinUI3 apps. This repo focuses on the platform building blocks that make up the [Fluent Design System](https://fluent.microsoft.com/), with emphasis on creating UI using APIs in the [Microsoft.UI.Composition](https://docs.microsoft.com/windows/winui/api/microsoft.ui.composition) and [Microsoft.UI.Input](https://docs.microsoft.com/windows/winui/api/microsoft.ui.input) namespaces. + +Inside this repo, you’ll find the following additional info: + +* [Getting started building and deploying readme](STARTUP.md) +* [Info on Questions and Contributing](CONTRIBUTING.md) + +If you are a developer getting familiar with the WinUI 3.0 platform, want to build beautiful and innovative UI experiences, and don't mind a few bugs here and there, then this is the place for you! + +We also want to see what inspiring UX you're building, so feel free to reach out on Twitter [@WindowsUI](https://twitter.com/windowsui). + +## Project Structure + +The following outlines the key folders for the project. + +### Demos + +The Demos folder contains standalone code demos that are focused on combining many concepts and feature sets into interesting user experiences. + +### Sample Gallery + +The Sample Gallery is an application that contains many samples, each demonstrating a different concept or API. The WinAppSDK samples automatically work downlevel to Windows 10 version 1809 (build 17763) which means as long as your Windows OS version is 1809 or higher, you'll automatically get all the latest features. + +### Samples Common + +These are early reference implementations, prototypes, and utilities the team has built over the course of developing our demos and code examples. This is a set of common code patterns that are shared across code samples and demos. + +### ExpressionBuilder + +A set of C# classes enabling you to build ExpressionAnimations in a more type-safe environment. + +### Samples Native + +A native library used to access some lower-level functionality that has no WinRT projections. + +## Contributing + +We encourage and welcome community involvement and contribution in this project. You'll find some details and guidelines for contribution in the [contributing readme](CONTRIBUTING.md). + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +## Related Projects + +This project is focused on experimenting with Microsoft.UI.Composition and Microsoft.UI.Input APIs to create beautiful, unique, and engaging user experiences. If instead you’re looking to get started with higher-level UI concepts with heavier focus on XAML-based controls, check out related projects: + + * [Xaml Controls Gallery](https://github.com/microsoft/Xaml-Controls-Gallery/tree/winui3) for WinUI3 controls-based UI + * [Windows UI Library (WinUI)](https://docs.microsoft.com/windows/apps/winui/) NuGet packages for XAML controls + * [Windows App SDK](https://docs.microsoft.com/windows/apps/windows-app-sdk/) Documentation for the new WinAppSDK + +## Privacy + +These samples do not collect any telemetry. A detailed privacy agreement can be found [here](https://go.microsoft.com/fwlink/?LinkId=521839) or in the 'Settings' section of the app. + +## Images + + The images used in this application are sourced from a variety of Microsoft employees, but we'd like to specially thank Conroy for his contribution. [See more of his content here.](https://www.instagram.com/conroy.williamson/) \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/STARTUP.md b/Samples/Composition/SampleGallery/STARTUP.md new file mode 100644 index 000000000..03c59a76a --- /dev/null +++ b/Samples/Composition/SampleGallery/STARTUP.md @@ -0,0 +1,19 @@ +# Getting Started + +Here you'll find some helpful guidance on how to locally build and run this project. + +## Prerequisites + +For local development, please visit this [link](https://docs.microsoft.com/windows/apps/windows-app-sdk/set-up-your-development-environment?tabs=vs%2Cstable) to set up your development environment before building this project. + +## Cloning and Building + +Once you have Visual Studio and the appropriate SDK(s) installed, clone the Windows Composition Samples repo locally. Cloning instructions can be found [here](https://help.github.com/articles/cloning-a-repository/). + +Open the SampleGallery solution file (.sln extension) in Visual Studio to view and manage the project. + +Open up the Solution Explorer (Under the "View" menu item in the top left), right click the SampleGalleryPkg and click "Set as Startup Project". You will also need to change the solution platform to x64 instead of Arm64. + +You'll want to restore dependencies or install yourself through NuGet in order to avoid dependency errors. To manage the NuGet dependencies in Visual Studio, right click the Sample Gallery project and select 'Manage NuGet Packages', then search for and install necessary dependencies. + +Clean the solution, then build and deploy it to run the application. \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/.gitattributes b/Samples/Composition/SampleGallery/cs-winui/.gitattributes new file mode 100644 index 000000000..bdb0cabc8 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/Samples/Composition/SampleGallery/cs-winui/.github/issue_template.md b/Samples/Composition/SampleGallery/cs-winui/.github/issue_template.md new file mode 100644 index 000000000..13d391db9 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/.github/issue_template.md @@ -0,0 +1,32 @@ + + +## Issue Type + +[ ] Bug Report +[ ] Feature Request +[ ] Sample request +[ ] Documentation issue or request +[ ] Other – Please describe: + +## UserVoice link + + +## Current Behavior + + + +## Expected Behavior + + + +## Steps to Reproduce (for bugs) + +1. +2. +3. + +## Your Environment + +* SDK #: +* Operating System build # : +* Visual Studio Version # : diff --git a/Samples/Composition/SampleGallery/cs-winui/.github/pull_request_template.md b/Samples/Composition/SampleGallery/cs-winui/.github/pull_request_template.md new file mode 100644 index 000000000..773b8cbab --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/.github/pull_request_template.md @@ -0,0 +1,15 @@ + + +## Pull Request Type +[ ] Bugfix +[ ] New Sample +[ ] Other - Please describe: + +## Issue + # + +## Proposed Changes +- +- + +## Screenshot/GIF (if applicable): diff --git a/Samples/Composition/SampleGallery/cs-winui/.gitignore b/Samples/Composition/SampleGallery/cs-winui/.gitignore new file mode 100644 index 000000000..4be969893 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/.gitignore @@ -0,0 +1,232 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +old/ + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ +*.binlog + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +## TODO: Comment the next line if you want to checkin your +## web deploy settings but do note that will include unencrypted +## passwords +#*.pubxml + +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# Store-related files +SampleGallery/Package.StoreAssociation.xml +SampleGallery/_pkginfo.txt +BundleArtifacts/ +AI Files/ + +# Other files to ignore +*.zip +*.bundle +*.appx +*.appxbundle +*.dll +*.exe + diff --git a/Samples/Composition/SampleGallery/cs-winui/CodeAnalysis.ruleset b/Samples/Composition/SampleGallery/cs-winui/CodeAnalysis.ruleset new file mode 100644 index 000000000..01f45cf69 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/CodeAnalysis.ruleset @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/Directory.Build.props b/Samples/Composition/SampleGallery/cs-winui/Directory.Build.props new file mode 100644 index 000000000..aff5b50b0 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/Directory.Build.props @@ -0,0 +1,7 @@ + + + $(MSBuildThisFileDirectory)CodeAnalysis.ruleset + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/Docs/ExpressionBuilder_Documentation.docx b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/Docs/ExpressionBuilder_Documentation.docx new file mode 100644 index 000000000..a4fd7fc9e Binary files /dev/null and b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/Docs/ExpressionBuilder_Documentation.docx differ diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder.sln b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder.sln new file mode 100644 index 000000000..f48b2a0f6 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder.sln @@ -0,0 +1,40 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExpressionBuilder", "ExpressionBuilder\ExpressionBuilder.csproj", "{97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Debug|ARM.ActiveCfg = Debug|ARM + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Debug|ARM.Build.0 = Debug|ARM + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Debug|x64.ActiveCfg = Debug|x64 + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Debug|x64.Build.0 = Debug|x64 + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Debug|x86.ActiveCfg = Debug|x86 + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Debug|x86.Build.0 = Debug|x86 + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Release|Any CPU.Build.0 = Release|Any CPU + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Release|ARM.ActiveCfg = Release|ARM + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Release|ARM.Build.0 = Release|ARM + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Release|x64.ActiveCfg = Release|x64 + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Release|x64.Build.0 = Release|x64 + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Release|x86.ActiveCfg = Release|x86 + {97F79CB4-FB7B-4DC3-8A08-28FA5694A73C}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionBuilder.CompositionExtensions.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionBuilder.CompositionExtensions.cs new file mode 100644 index 000000000..072b7e48c --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionBuilder.CompositionExtensions.cs @@ -0,0 +1,135 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System.Numerics; + + using Microsoft.UI.Composition; + using Microsoft.UI.Composition.Interactions; + + ///--------------------------------------------------------------------------------------------------------------------- + /// + /// class CompositionExtensions + /// ToDo: Add description after docs written + /// + ///--------------------------------------------------------------------------------------------------------------------- + + public static class CompositionExtensions + { + /// Create an ExpressionNode reference to this CompositionObject. + public static AmbientLightReferenceNode GetReference(this AmbientLight compObj) { return new AmbientLightReferenceNode(null, compObj); } + public static ColorBrushReferenceNode GetReference(this CompositionColorBrush compObj) { return new ColorBrushReferenceNode(null, compObj); } + public static DistantLightReferenceNode GetReference(this DistantLight compObj) { return new DistantLightReferenceNode(null, compObj); } + public static DropShadowReferenceNode GetReference(this DropShadow compObj) { return new DropShadowReferenceNode(null, compObj); } + public static InsetClipReferenceNode GetReference(this InsetClip compObj) { return new InsetClipReferenceNode(null, compObj); } + public static InteractionTrackerReferenceNode GetReference(this InteractionTracker compObj) { return new InteractionTrackerReferenceNode(null, compObj); } + public static NineGridBrushReferenceNode GetReference(this CompositionNineGridBrush compObj) { return new NineGridBrushReferenceNode(null, compObj); } + public static PointLightReferenceNode GetReference(this PointLight compObj) { return new PointLightReferenceNode(null, compObj); } + public static PropertySetReferenceNode GetReference(this CompositionPropertySet compObj) { return new PropertySetReferenceNode(null, compObj); } + public static SpotLightReferenceNode GetReference(this SpotLight compObj) { return new SpotLightReferenceNode(null, compObj); } + public static SurfaceBrushReferenceNode GetReference(this CompositionSurfaceBrush compObj) { return new SurfaceBrushReferenceNode(null, compObj); } + public static VisualReferenceNode GetReference(this Visual compObj) { return new VisualReferenceNode(null, compObj); } + + /// Create an ExpressionNode reference to this specialized PropertySet. + public static T GetSpecializedReference(this CompositionPropertySet ps) where T : PropertySetReferenceNode + { + if (typeof(T) == typeof(ManipulationPropertySetReferenceNode)) + { + return new ManipulationPropertySetReferenceNode(null, ps) as T; + } + else if (typeof(T) == typeof(PointerPositionPropertySetReferenceNode)) + { + return new PointerPositionPropertySetReferenceNode(null, ps) as T; + } + else + { + throw new System.Exception("Invalid property set specialization"); + } + } + + /// Connects the specified ExpressionNode with the specified property of the object. + /// The name of the property that the expression will target. + /// The root ExpressionNode that represents the ExpressionAnimation. + public static void StartAnimation(this CompositionObject compObject, string propertyName, ExpressionNode expressionNode) + { + compObject.StartAnimation(propertyName, CreateExpressionAnimationFromNode(compObject.Compositor, expressionNode)); + } + + /// Inserts a KeyFrame whose value is calculated using the specified ExpressionNode. + /// The time the key frame should occur at, expressed as a percentage of the animation Duration. Allowed value is from 0.0 to 1.0. + /// The root ExpressionNode that represents the ExpressionAnimation. + /// The easing function to use when interpolating between frames. + public static void InsertExpressionKeyFrame(this KeyFrameAnimation keyframeAnimation, float normalizedProgressKey, ExpressionNode expressionNode, CompositionEasingFunction easing = null) + { + keyframeAnimation.InsertExpressionKeyFrame(normalizedProgressKey, expressionNode.ToExpressionString(), easing); + + expressionNode.SetAllParameters(keyframeAnimation); + } + + /// Use the value of specified ExpressionNode to determine if this inertia modifier should be chosen. + /// The root ExpressionNode that represents the ExpressionAnimation. + public static void SetCondition(this InteractionTrackerInertiaRestingValue modifier, ExpressionNode expressionNode) + { + modifier.Condition = CreateExpressionAnimationFromNode(modifier.Compositor, expressionNode); + } + + /// Use the value of specified ExpressionNode as the resting value for this inertia modifier. + /// The root ExpressionNode that represents the ExpressionAnimation. + public static void SetRestingValue(this InteractionTrackerInertiaRestingValue modifier, ExpressionNode expressionNode) + { + modifier.RestingValue = CreateExpressionAnimationFromNode(modifier.Compositor, expressionNode); + } + + /// Use the value of specified ExpressionNode to determine if this inertia modifier should be chosen. + /// The root ExpressionNode that represents the ExpressionAnimation. + public static void SetCondition(this InteractionTrackerInertiaMotion modifier, ExpressionNode expressionNode) + { + modifier.Condition = CreateExpressionAnimationFromNode(modifier.Compositor, expressionNode); + } + + /// Use the value of specified ExpressionNode to dictate the motion for this inertia modifier. + /// The root ExpressionNode that represents the ExpressionAnimation. + public static void SetMotion(this InteractionTrackerInertiaMotion modifier, ExpressionNode expressionNode) + { + modifier.Motion = CreateExpressionAnimationFromNode(modifier.Compositor, expressionNode); + } + + /// Tries to update the InteractionTracker's position by applying an animation. + /// The root ExpressionNode that represents the ExpressionAnimation to apply to the InteractionTracker's position. + public static void TryUpdatePositionWithAnimation(this InteractionTracker tracker, ExpressionNode expressionNode) + { + tracker.TryUpdatePositionWithAnimation(CreateExpressionAnimationFromNode(tracker.Compositor, expressionNode)); + } + + /// Tries to update the InteractionTracker's scale by applying an animation. + /// The root ExpressionNode that represents the ExpressionAnimation to apply to the InteractionTracker's scale. + /// The centerPoint to use when scaling. + public static void TryUpdateScaleWithAnimation(this InteractionTracker tracker, ExpressionNode expressionNode, Vector3 centerPoint) + { + tracker.TryUpdateScaleWithAnimation(CreateExpressionAnimationFromNode(tracker.Compositor, expressionNode), centerPoint); + } + + + // + // Helper functions + // + + private static ExpressionAnimation CreateExpressionAnimationFromNode(Compositor compositor, ExpressionNode expressionNode) + { + // Only create a new animation if this node hasn't already generated one before, so we don't have to re-parse the expression string. + if (expressionNode._expressionAnimation == null) + { + expressionNode._expressionAnimation = compositor.CreateExpressionAnimation(expressionNode.ToExpressionString()); + } + + // We need to make sure all parameters are up to date, even if the animation already existed. + expressionNode.SetAllParameters(expressionNode._expressionAnimation); + + return expressionNode._expressionAnimation; + } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionBuilder.ExpressionFunctions.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionBuilder.ExpressionFunctions.cs new file mode 100644 index 000000000..e2ead0997 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionBuilder.ExpressionFunctions.cs @@ -0,0 +1,472 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System.Collections.Generic; + + internal enum OperationType + { + Function, + Operator, + Constant, + Reference, + Conditional, + Swizzle, + } + + ///--------------------------------------------------------------------------------------------------------------------- + /// + /// class ExpressionFunctions + /// ToDo: Add description after docs written + /// + ///--------------------------------------------------------------------------------------------------------------------- + + public static class ExpressionFunctions + { + // + // Float-only math operations + // + + /// Returns the angle (in radians) whose cosine is the specified number. + /// Value between �1 and 1, for which to calculate the arccosine (the inverse cosine). + public static ScalarNode ACos(ScalarNode val) { return Function(ExpressionNodeType.Acos, val); } + + /// Returns the angle (in radians) whose sine is the specified number. + /// Value between �1 and 1, for which to calculate the arcsine (the inverse sine). + public static ScalarNode ASin(ScalarNode val) { return Function(ExpressionNodeType.Asin, val); } + + /// Returns the angle (in radians) whose tangent is the specified number. + /// Value for which to calculate the arctan (the inverse tan). + public static ScalarNode ATan(ScalarNode val) { return Function(ExpressionNodeType.Atan, val); } + + /// Returns the smallest integral value that is greater than or equal to the specified value. + /// The floating point number to round. + public static ScalarNode Ceil(ScalarNode val) { return Function(ExpressionNodeType.Ceil, val); } + + /// Returns the cosine of the specified angle (in radians) + /// An angle, measured in radians. + public static ScalarNode Cos(ScalarNode val) { return Function(ExpressionNodeType.Cos, val); } + + /// Returns the largest integer less than or equal to the specified value. + /// The floating point number to round. + public static ScalarNode Floor(ScalarNode val) { return Function(ExpressionNodeType.Floor, val); } + + /// Returns the natural (base e) logarithm of a specified number. + /// The number whose natural logarithm is to be returned. + public static ScalarNode Ln(ScalarNode val) { return Function(ExpressionNodeType.Ln, val); } + + /// Returns the base 10 logarithm of a specified number. + /// The number whose base 10 logarithm is to be calculated. + public static ScalarNode Log10(ScalarNode val) { return Function(ExpressionNodeType.Log10, val); } + + /// Returns a specified number raised to the specified power. + /// A floating-point number to be raised to a power. + /// A floating-point number that specifies a power. + public static ScalarNode Pow(ScalarNode val1, ScalarNode val2) { return Function(ExpressionNodeType.Pow, val1, val2); } + + /// Rounds a floating point value to the nearest integral value. + /// The floating point number to round. + public static ScalarNode Round(ScalarNode val) { return Function(ExpressionNodeType.Round, val); } + + /// Returns the sine of the specified angle (in radians) + /// An angle, measured in radians. + public static ScalarNode Sin(ScalarNode val) { return Function(ExpressionNodeType.Sin, val); } + + /// Returns the specified number multiplied by itself. + /// The floating point number to square. + public static ScalarNode Square(ScalarNode val) { return Function(ExpressionNodeType.Square, val); } + + /// Returns the square root of a specified number. + /// The number whose square root is to be returned. + public static ScalarNode Sqrt(ScalarNode val) { return Function(ExpressionNodeType.Sqrt, val); } + + /// Returns the tangent of the specified angle (in radians) + /// An angle, measured in radians. + public static ScalarNode Tan(ScalarNode val) { return Function(ExpressionNodeType.Tan, val); } + + /// Converts an angle in radians to degrees as: val*180/PI. + /// A floating point value that represents an angle in radians. + public static ScalarNode ToDegrees(ScalarNode val) { return Function(ExpressionNodeType.ToDegrees, val); } + + /// Converts an angle in degrees to radians as: val*PI/180. + /// A floating point value that represents an angle in degrees. + public static ScalarNode ToRadians(ScalarNode val) { return Function(ExpressionNodeType.ToRadians, val); } + + + // + // System.Numerics functions + // + + /// Returns the absolute value of the specified input. For vectors, the absolute value of each subchannel is returned. + /// The input value. + public static ScalarNode Abs(ScalarNode val) { return Function(ExpressionNodeType.Absolute, val); } + public static Vector2Node Abs(Vector2Node val) { return Function(ExpressionNodeType.Absolute, val); } + public static Vector3Node Abs(Vector3Node val) { return Function(ExpressionNodeType.Absolute, val); } + public static Vector4Node Abs(Vector4Node val) { return Function(ExpressionNodeType.Absolute, val); } + + /// Restricts a value to be within a specified range. For vectors, each subchannel is clamped. + /// The value to clamp. + /// The specified minimum range. + /// The specified maximum range. + public static ScalarNode Clamp(ScalarNode val, ScalarNode min, ScalarNode max) { return Function(ExpressionNodeType.Clamp, val, min, max); } + public static Vector2Node Clamp(Vector2Node val, Vector2Node min, Vector2Node max) { return Function(ExpressionNodeType.Clamp, val, min, max); } + public static Vector3Node Clamp(Vector3Node val, Vector3Node min, Vector3Node max) { return Function(ExpressionNodeType.Clamp, val, min, max); } + public static Vector4Node Clamp(Vector4Node val, Vector4Node min, Vector4Node max) { return Function(ExpressionNodeType.Clamp, val, min, max); } + + /// Linearly interpolates between two colors in the default color space. + /// Color source value 1. + /// Color source value 2. + /// A value between 0 and 1.0 indicating the weight of val2. + public static ColorNode ColorLerp(ColorNode val1, ColorNode val2, ScalarNode progress) { return Function(ExpressionNodeType.ColorLerp, val1, val2, progress); } + + /// Linearly interpolates between two colors in the HSL color space. + /// Color source value 1. + /// Color source value 2. + /// A value between 0 and 1.0 indicating the weight of val2. + public static ColorNode ColorLerpHsl(ColorNode val1, ColorNode val2, ScalarNode progress) { return Function(ExpressionNodeType.ColorLerpHsl, val1, val2, progress); } + + /// Linearly interpolates between two colors in the RBG color space. + /// Color source value 1. + /// Color source value 2. + /// A value between 0 and 1.0 indicating the weight of val2. + public static ColorNode ColorLerpRgb(ColorNode val1, ColorNode val2, ScalarNode progress) { return Function(ExpressionNodeType.ColorLerpRgb, val1, val2, progress); } + + /// Concatenates two Quaternions; the result represents the first rotation followed by the second rotation. + /// The first quaternion rotation in the series. + /// The second quaternion rotation in the series. + public static QuaternionNode Concatenate(QuaternionNode val1, QuaternionNode val2) { return Function(ExpressionNodeType.Concatenate, val1, val2); } + + /// Returns the distance between two vectors as: sqrt((x1-x2)^2 + (y1-y2)^2 + ...). + /// Source value 1. + /// Source value 2. + public static ScalarNode Distance(ScalarNode val1, ScalarNode val2) { return Function(ExpressionNodeType.Distance, val1, val2); } + public static ScalarNode Distance(Vector2Node val1, Vector2Node val2) { return Function(ExpressionNodeType.Distance, val1, val2); } + public static ScalarNode Distance(Vector3Node val1, Vector3Node val2) { return Function(ExpressionNodeType.Distance, val1, val2); } + public static ScalarNode Distance(Vector4Node val1, Vector4Node val2) { return Function(ExpressionNodeType.Distance, val1, val2); } + + /// Returns the squared distance between two vectors as: ((x1-x2)^2 + (y1-y2)^2 + ...). + /// Source value 1. + /// Source value 2. + public static ScalarNode DistanceSquared(ScalarNode val1, ScalarNode val2) { return Function(ExpressionNodeType.DistanceSquared, val1, val2); } + public static ScalarNode DistanceSquared(Vector2Node val1, Vector2Node val2) { return Function(ExpressionNodeType.DistanceSquared, val1, val2); } + public static ScalarNode DistanceSquared(Vector3Node val1, Vector3Node val2) { return Function(ExpressionNodeType.DistanceSquared, val1, val2); } + public static ScalarNode DistanceSquared(Vector4Node val1, Vector4Node val2) { return Function(ExpressionNodeType.DistanceSquared, val1, val2); } + + /// Returns the inverse of the specified matrix. + /// The matrix to invert. + public static Matrix3x2Node Inverse(Matrix3x2Node val) { return Function(ExpressionNodeType.Inverse, val); } + public static Matrix4x4Node Inverse(Matrix4x4Node val) { return Function(ExpressionNodeType.Inverse, val); } + + /// Returns the length of the vector as: sqrt(x^2 + y^2 + ...) + /// Vector value to return the length of. + public static ScalarNode Length(ScalarNode val) { return Function(ExpressionNodeType.Length, val); } + public static ScalarNode Length(Vector2Node val) { return Function(ExpressionNodeType.Length, val); } + public static ScalarNode Length(Vector3Node val) { return Function(ExpressionNodeType.Length, val); } + public static ScalarNode Length(Vector4Node val) { return Function(ExpressionNodeType.Length, val); } + public static ScalarNode Length(QuaternionNode val) { return Function(ExpressionNodeType.Length, val); } + + /// Returns the squared length of the vector as: (x^2 + y^2 + ...) + /// Vector value to return the length squared of. + public static ScalarNode LengthSquared(ScalarNode val) { return Function(ExpressionNodeType.LengthSquared, val); } + public static ScalarNode LengthSquared(Vector2Node val) { return Function(ExpressionNodeType.LengthSquared, val); } + public static ScalarNode LengthSquared(Vector3Node val) { return Function(ExpressionNodeType.LengthSquared, val); } + public static ScalarNode LengthSquared(Vector4Node val) { return Function(ExpressionNodeType.LengthSquared, val); } + public static ScalarNode LengthSquared(QuaternionNode val) { return Function(ExpressionNodeType.LengthSquared, val); } + + /// Linearly interpolates between two vectors as: Output.x = x1 + (x2-x1)*progress + /// Source value 1. + /// Source value 2. + /// A value between 0 and 1.0 indicating the weight of val2. + public static ScalarNode Lerp(ScalarNode val1, ScalarNode val2, ScalarNode progress) { return Function(ExpressionNodeType.Lerp, val1, val2, progress); } + public static Vector2Node Lerp(Vector2Node val1, Vector2Node val2, ScalarNode progress) { return Function(ExpressionNodeType.Lerp, val1, val2, progress); } + public static Vector3Node Lerp(Vector3Node val1, Vector3Node val2, ScalarNode progress) { return Function(ExpressionNodeType.Lerp, val1, val2, progress); } + public static Vector4Node Lerp(Vector4Node val1, Vector4Node val2, ScalarNode progress) { return Function(ExpressionNodeType.Lerp, val1, val2, progress); } + + /// Returns the maximum of two values. For vectors, the max of each subchannel is returned. + /// Source value 1. + /// Source value 2. + public static ScalarNode Max(ScalarNode val1, ScalarNode val2) { return Function(ExpressionNodeType.Max, val1, val2); } + public static Vector2Node Max(Vector2Node val1, Vector2Node val2) { return Function(ExpressionNodeType.Max, val1, val2); } + public static Vector3Node Max(Vector3Node val1, Vector3Node val2) { return Function(ExpressionNodeType.Max, val1, val2); } + public static Vector4Node Max(Vector4Node val1, Vector4Node val2) { return Function(ExpressionNodeType.Max, val1, val2); } + + /// Returns the minimum of two values. For vectors, the min of each subchannel is returned. + /// Source value 1. + /// Source value 2. + public static ScalarNode Min(ScalarNode val1, ScalarNode val2) { return Function(ExpressionNodeType.Min, val1, val2); } + public static Vector2Node Min(Vector2Node val1, Vector2Node val2) { return Function(ExpressionNodeType.Min, val1, val2); } + public static Vector3Node Min(Vector3Node val1, Vector3Node val2) { return Function(ExpressionNodeType.Min, val1, val2); } + public static Vector4Node Min(Vector4Node val1, Vector4Node val2) { return Function(ExpressionNodeType.Min, val1, val2); } + + /// Returns the remainder resulting from dividing val1/val2. For vectors, the remainder for each subchannel is returned. + /// The numerator value. + /// The denominator value. + public static ScalarNode Mod(ScalarNode val1, ScalarNode val2) { return Function(ExpressionNodeType.Modulus, val1, val2); } + public static Vector2Node Mod(Vector2Node val1, Vector2Node val2) { return Function(ExpressionNodeType.Modulus, val1, val2); } + public static Vector3Node Mod(Vector3Node val1, Vector3Node val2) { return Function(ExpressionNodeType.Modulus, val1, val2); } + public static Vector4Node Mod(Vector4Node val1, Vector4Node val2) { return Function(ExpressionNodeType.Modulus, val1, val2); } + + /// Returns the normalized version of a vector. + /// Vector value to normalize. + public static Vector2Node Normalize(Vector2Node val) { return Function(ExpressionNodeType.Normalize, val); } + public static Vector3Node Normalize(Vector3Node val) { return Function(ExpressionNodeType.Normalize, val); } + public static Vector4Node Normalize(Vector4Node val) { return Function(ExpressionNodeType.Normalize, val); } + public static QuaternionNode Normalize(QuaternionNode val) { return Function(ExpressionNodeType.Normalize, val); } + + /// Multiply each subchannel of the specified vector/matrix by a float value. + /// Source value to scale. + /// Scaling value. + public static ScalarNode Scale(ScalarNode val1, ScalarNode val2) { return Function(ExpressionNodeType.Scale, val1, val2); } + public static Vector2Node Scale(Vector2Node val1, ScalarNode val2) { return Function(ExpressionNodeType.Scale, val1, val2); } + public static Vector3Node Scale(Vector3Node val1, ScalarNode val2) { return Function(ExpressionNodeType.Scale, val1, val2); } + public static Vector4Node Scale(Vector4Node val1, ScalarNode val2) { return Function(ExpressionNodeType.Scale, val1, val2); } + public static Matrix3x2Node Scale(Matrix3x2Node val1, ScalarNode val2) { return Function(ExpressionNodeType.Scale, val1, val2); } + public static Matrix4x4Node Scale(Matrix4x4Node val1, ScalarNode val2) { return Function(ExpressionNodeType.Scale, val1, val2); } + + /// Spherically interpolates between two quaternions. + /// Quaternion source value 1. + /// Quaternion source value 2. + /// A value between 0 and 1.0 indicating the weight of val2. + public static QuaternionNode Slerp(QuaternionNode val1, QuaternionNode val2, ScalarNode progress) { return Function(ExpressionNodeType.Slerp, val1, val2, progress); } + + /// Transforms a vector by the specified matrix. + /// Vector to be transformed. + /// The transformation matrix. + public static Vector2Node Transform(Vector2Node val1, Matrix3x2Node val2) { return Function(ExpressionNodeType.Transform, val1, val2); } + public static Vector4Node Transform(Vector4Node val1, Matrix4x4Node val2) { return Function(ExpressionNodeType.Transform, val1, val2); } + + + // + // System.Numerics Type Constructors + // + + /// Creates a vector whose subchannels have the specified values. + public static Vector2Node Vector2(ScalarNode x, ScalarNode y) { return Function(ExpressionNodeType.Vector2, x, y); } + public static Vector3Node Vector3(ScalarNode x, ScalarNode y, ScalarNode z) { return Function(ExpressionNodeType.Vector3, x, y, z); } + public static Vector4Node Vector4(ScalarNode x, ScalarNode y, ScalarNode z, ScalarNode w) { return Function(ExpressionNodeType.Vector4, x, y, z, w); } + + /// Creates a color in the HSL format. + /// Hue + /// Saturation + /// Luminosity + public static ColorNode ColorHsl(ScalarNode h, ScalarNode s, ScalarNode l) { return Function(ExpressionNodeType.ColorHsl, h, s, l); } + + /// Creates a Color in the ARGB format. + public static ColorNode ColorRgb(ScalarNode alpha, ScalarNode red, ScalarNode green, ScalarNode blue) + { return Function(ExpressionNodeType.ColorRgb, alpha, red, green, blue); } + + /// Creates a quaternion whose subchannels have the specified values. + public static QuaternionNode Quaternion(ScalarNode x, ScalarNode y, ScalarNode z, ScalarNode w) { return Function(ExpressionNodeType.Quaternion, x, y, z, w); } + + /// Creates a matrix whose subchannels have the specified values. + public static Matrix3x2Node Matrix3x2(ScalarNode _11, ScalarNode _12, ScalarNode _21, ScalarNode _22, ScalarNode _31, ScalarNode _32) + { return Function(ExpressionNodeType.Matrix3x2, _11, _12, _21, _22, _31, _32); } + + /// Creates a matrix whose subchannels have the specified values. + public static Matrix4x4Node Matrix4x4(ScalarNode _11, ScalarNode _12, ScalarNode _13, ScalarNode _14, + ScalarNode _21, ScalarNode _22, ScalarNode _23, ScalarNode _24, + ScalarNode _31, ScalarNode _32, ScalarNode _33, ScalarNode _34, + ScalarNode _41, ScalarNode _42, ScalarNode _43, ScalarNode _44) + { return Function(ExpressionNodeType.Matrix4x4, _11, _12, _13, _14, _21, _22, _23, _24, _31, _32, _33, _34, _41, _42, _43, _44); } + + /// Creates a 4x4 matrix from a 3x2 matrix. + public static Matrix4x4Node Matrix4x4(Matrix3x2Node val) + { return Function(ExpressionNodeType.Matrix4x4, + val._11, val._12, (ScalarNode)0, (ScalarNode)0, + val._21, val._22, (ScalarNode)0, (ScalarNode)0, + (ScalarNode)0, (ScalarNode)0, (ScalarNode)1, (ScalarNode)0, + val._31, val._32, (ScalarNode)0, (ScalarNode)1); } + + /// Creates a translation matrix from the specified vector. + /// Source translation vector. + public static Matrix3x2Node CreateTranslation(Vector2Node val) { return Function(ExpressionNodeType.Matrix3x2FromTranslation, val); } + public static Matrix4x4Node CreateTranslation(Vector3Node val) { return Function(ExpressionNodeType.Matrix4x4FromTranslation, val); } + + /// Creates a scale matrix from the specified vector scale. + /// Source scaling vector. + public static Matrix3x2Node CreateScale(Vector2Node val) { return Function(ExpressionNodeType.Matrix3x2FromScale, val); } + public static Matrix4x4Node CreateScale(Vector3Node val) { return Function(ExpressionNodeType.Matrix4x4FromScale, val); } + + /// Creates a skew matrix from the specified angles in radians. + /// X angle, in radians. + /// Y angle, in radians. + /// The centerpoint for the operation. + public static Matrix3x2Node CreateSkew(ScalarNode xAngle, ScalarNode yAngle, Vector2Node centerPoint) + { return Function(ExpressionNodeType.Matrix3x2FromSkew, xAngle, yAngle, centerPoint); } + + /// Creates a rotation matrix using the given rotation in radians. + /// Angle, in radians. + public static Matrix3x2Node CreateRotation(ScalarNode angle) { return Function(ExpressionNodeType.Matrix3x2FromRotation, angle); } + + /// Creates a matrix that rotates around an arbitrary vector. + /// Rotation axis + /// Angle, in radians. + public static Matrix4x4Node CreateMatrix4x4FromAxisAngle(Vector3Node axis, ScalarNode angle) + { return Function(ExpressionNodeType.Matrix4x4FromAxisAngle, axis, angle); } + + /// Creates a quaternion that rotates around an arbitrary vector. + /// Rotation axis + /// Angle, in radians. + public static QuaternionNode CreateQuaternionFromAxisAngle(Vector3Node axis, ScalarNode angle) + { return Function(ExpressionNodeType.QuaternionFromAxisAngle, axis, angle); } + + + // + // Logical Operators + // + + /// Performs a logical AND operation on two boolean values as: val1 && val2. + public static BooleanNode And(BooleanNode val1, BooleanNode val2) { return Function(ExpressionNodeType.And, val1, val2); } + + /// Performs a logical OR operation on two boolean values as: val1 || val2. + public static BooleanNode Or (BooleanNode val1, BooleanNode val2) { return Function(ExpressionNodeType.Or, val1, val2); } + + /// Performs a logical NOT operation on a specified boolean value as: !val. + public static BooleanNode Not(BooleanNode val) { return Function(ExpressionNodeType.Not, val); } + + + // + // Conditional + // + + /// Returns one of two values, depending on the value of the boolean condition. + /// Boolean value used to determine whether to return the value represented by 'trueCase' or 'falseCase'. + /// Value to return if 'condition' evaluates to true. + /// Value to return if 'condition' evaluates to false. + public static ScalarNode Conditional(BooleanNode condition, ScalarNode trueCase, ScalarNode falseCase) { return Function(ExpressionNodeType.Conditional, condition, trueCase, falseCase); } + public static Vector2Node Conditional(BooleanNode condition, Vector2Node trueCase, Vector2Node falseCase) { return Function(ExpressionNodeType.Conditional, condition, trueCase, falseCase); } + public static Vector3Node Conditional(BooleanNode condition, Vector3Node trueCase, Vector3Node falseCase) { return Function(ExpressionNodeType.Conditional, condition, trueCase, falseCase); } + public static Vector4Node Conditional(BooleanNode condition, Vector4Node trueCase, Vector4Node falseCase) { return Function(ExpressionNodeType.Conditional, condition, trueCase, falseCase); } + public static ColorNode Conditional(BooleanNode condition, ColorNode trueCase, ColorNode falseCase) { return Function(ExpressionNodeType.Conditional, condition, trueCase, falseCase); } + public static QuaternionNode Conditional(BooleanNode condition, QuaternionNode trueCase, QuaternionNode falseCase) { return Function(ExpressionNodeType.Conditional, condition, trueCase, falseCase); } + public static Matrix3x2Node Conditional(BooleanNode condition, Matrix3x2Node trueCase, Matrix3x2Node falseCase) { return Function(ExpressionNodeType.Conditional, condition, trueCase, falseCase); } + public static Matrix4x4Node Conditional(BooleanNode condition, Matrix4x4Node trueCase, Matrix4x4Node falseCase) { return Function(ExpressionNodeType.Conditional, condition, trueCase, falseCase); } + + + // + // Helper functions + // + + internal static T Function(ExpressionNodeType nodeType, params ExpressionNode [] expressionFunctionParams) where T : class + { + T newNode = ExpressionNode.CreateExpressionNode(); + + (newNode as ExpressionNode)._nodeType = nodeType; + foreach (var param in expressionFunctionParams) + { + (newNode as ExpressionNode)._children.Add(param); + } + + return newNode; + } + + internal static ExpressionNodeInfo GetNodeInfoFromType(ExpressionNodeType type) + { + return _expressionNodeInfo[type]; + } + + + // + // Structs + // + + internal struct ExpressionNodeInfo + { + public ExpressionNodeInfo(OperationType nodeOperationKind, string operationString) + { + NodeOperationKind = nodeOperationKind; + OperationString = operationString; + } + + public OperationType NodeOperationKind; + public string OperationString; + } + + + // + // Data + // + + private static readonly Dictionary _expressionNodeInfo = new Dictionary + { + { ExpressionNodeType.ConstantValue, new ExpressionNodeInfo(OperationType.Constant, null) }, + { ExpressionNodeType.ConstantParameter, new ExpressionNodeInfo(OperationType.Constant, null) }, + { ExpressionNodeType.CurrentValueProperty, new ExpressionNodeInfo(OperationType.Reference, null) }, + { ExpressionNodeType.Reference, new ExpressionNodeInfo(OperationType.Reference, null) }, + { ExpressionNodeType.ReferenceProperty, new ExpressionNodeInfo(OperationType.Reference, null) }, + { ExpressionNodeType.StartingValueProperty, new ExpressionNodeInfo(OperationType.Reference, null) }, + { ExpressionNodeType.TargetReference, new ExpressionNodeInfo(OperationType.Reference, null) }, + { ExpressionNodeType.Conditional, new ExpressionNodeInfo(OperationType.Conditional, null) }, + { ExpressionNodeType.Swizzle, new ExpressionNodeInfo(OperationType.Swizzle, null) }, + { ExpressionNodeType.Add, new ExpressionNodeInfo(OperationType.Operator, "+") }, + { ExpressionNodeType.And, new ExpressionNodeInfo(OperationType.Operator, "&&") }, + { ExpressionNodeType.Divide, new ExpressionNodeInfo(OperationType.Operator, "/") }, + { ExpressionNodeType.Equals, new ExpressionNodeInfo(OperationType.Operator, "==") }, + { ExpressionNodeType.GreaterThan, new ExpressionNodeInfo(OperationType.Operator, ">") }, + { ExpressionNodeType.GreaterThanEquals, new ExpressionNodeInfo(OperationType.Operator, ">=") }, + { ExpressionNodeType.LessThan, new ExpressionNodeInfo(OperationType.Operator, "<") }, + { ExpressionNodeType.LessThanEquals, new ExpressionNodeInfo(OperationType.Operator, "<=") }, + { ExpressionNodeType.Multiply, new ExpressionNodeInfo(OperationType.Operator, "*") }, + { ExpressionNodeType.Not, new ExpressionNodeInfo(OperationType.Operator, "!") }, + { ExpressionNodeType.NotEquals, new ExpressionNodeInfo(OperationType.Operator, "!=") }, + { ExpressionNodeType.Or, new ExpressionNodeInfo(OperationType.Operator, "||") }, + { ExpressionNodeType.Subtract, new ExpressionNodeInfo(OperationType.Operator, "-") }, + { ExpressionNodeType.Absolute, new ExpressionNodeInfo(OperationType.Function, "abs") }, + { ExpressionNodeType.Acos, new ExpressionNodeInfo(OperationType.Function, "acos") }, + { ExpressionNodeType.Asin, new ExpressionNodeInfo(OperationType.Function, "asin") }, + { ExpressionNodeType.Atan, new ExpressionNodeInfo(OperationType.Function, "atan") }, + { ExpressionNodeType.Cos, new ExpressionNodeInfo(OperationType.Function, "cos") }, + { ExpressionNodeType.Ceil, new ExpressionNodeInfo(OperationType.Function, "ceil") }, + { ExpressionNodeType.Clamp, new ExpressionNodeInfo(OperationType.Function, "clamp") }, + { ExpressionNodeType.ColorHsl, new ExpressionNodeInfo(OperationType.Function, "colorhsl") }, + { ExpressionNodeType.ColorRgb, new ExpressionNodeInfo(OperationType.Function, "colorrgb") }, + { ExpressionNodeType.ColorLerp, new ExpressionNodeInfo(OperationType.Function, "colorlerp") }, + { ExpressionNodeType.ColorLerpHsl, new ExpressionNodeInfo(OperationType.Function, "colorhsllerp") }, + { ExpressionNodeType.ColorLerpRgb, new ExpressionNodeInfo(OperationType.Function, "colorrgblerp") }, + { ExpressionNodeType.Concatenate, new ExpressionNodeInfo(OperationType.Function, "concatenate") }, + { ExpressionNodeType.Distance, new ExpressionNodeInfo(OperationType.Function, "distance") }, + { ExpressionNodeType.DistanceSquared, new ExpressionNodeInfo(OperationType.Function, "distancesquared") }, + { ExpressionNodeType.Floor, new ExpressionNodeInfo(OperationType.Function, "floor") }, + { ExpressionNodeType.Inverse, new ExpressionNodeInfo(OperationType.Function, "inverse") }, + { ExpressionNodeType.Length, new ExpressionNodeInfo(OperationType.Function, "length") }, + { ExpressionNodeType.LengthSquared, new ExpressionNodeInfo(OperationType.Function, "lengthsquared") }, + { ExpressionNodeType.Lerp, new ExpressionNodeInfo(OperationType.Function, "lerp") }, + { ExpressionNodeType.Ln, new ExpressionNodeInfo(OperationType.Function, "ln") }, + { ExpressionNodeType.Log10, new ExpressionNodeInfo(OperationType.Function, "log10") }, + { ExpressionNodeType.Max, new ExpressionNodeInfo(OperationType.Function, "max") }, + { ExpressionNodeType.Matrix3x2FromRotation, new ExpressionNodeInfo(OperationType.Function, "matrix3x2.createrotation") }, + { ExpressionNodeType.Matrix3x2FromScale, new ExpressionNodeInfo(OperationType.Function, "matrix3x2.createscale") }, + { ExpressionNodeType.Matrix3x2FromSkew, new ExpressionNodeInfo(OperationType.Function, "matrix3x2.createskew") }, + { ExpressionNodeType.Matrix3x2FromTranslation, new ExpressionNodeInfo(OperationType.Function, "matrix3x2.createtranslation") }, + { ExpressionNodeType.Matrix3x2, new ExpressionNodeInfo(OperationType.Function, "matrix3x2") }, + { ExpressionNodeType.Matrix4x4FromAxisAngle, new ExpressionNodeInfo(OperationType.Function, "matrix4x4.createfromaxisangle") }, + { ExpressionNodeType.Matrix4x4FromScale, new ExpressionNodeInfo(OperationType.Function, "matrix4x4.createscale") }, + { ExpressionNodeType.Matrix4x4FromTranslation, new ExpressionNodeInfo(OperationType.Function, "matrix4x4.createtranslation") }, + { ExpressionNodeType.Matrix4x4, new ExpressionNodeInfo(OperationType.Function, "matrix4x4") }, + { ExpressionNodeType.Min, new ExpressionNodeInfo(OperationType.Function, "min") }, + { ExpressionNodeType.Modulus, new ExpressionNodeInfo(OperationType.Function, "mod") }, + { ExpressionNodeType.Negate, new ExpressionNodeInfo(OperationType.Function, "-") }, + { ExpressionNodeType.Normalize, new ExpressionNodeInfo(OperationType.Function, "normalize") }, + { ExpressionNodeType.Pow, new ExpressionNodeInfo(OperationType.Function, "pow") }, + { ExpressionNodeType.QuaternionFromAxisAngle, new ExpressionNodeInfo(OperationType.Function, "quaternion.createfromaxisangle") }, + { ExpressionNodeType.Quaternion, new ExpressionNodeInfo(OperationType.Function, "quaternion") }, + { ExpressionNodeType.Round, new ExpressionNodeInfo(OperationType.Function, "round") }, + { ExpressionNodeType.Scale, new ExpressionNodeInfo(OperationType.Function, "scale") }, + { ExpressionNodeType.Sin, new ExpressionNodeInfo(OperationType.Function, "sin") }, + { ExpressionNodeType.Slerp, new ExpressionNodeInfo(OperationType.Function, "slerp") }, + { ExpressionNodeType.Sqrt, new ExpressionNodeInfo(OperationType.Function, "sqrt") }, + { ExpressionNodeType.Square, new ExpressionNodeInfo(OperationType.Function, "square") }, + { ExpressionNodeType.Tan, new ExpressionNodeInfo(OperationType.Function, "tan") }, + { ExpressionNodeType.ToDegrees, new ExpressionNodeInfo(OperationType.Function, "todegrees") }, + { ExpressionNodeType.ToRadians, new ExpressionNodeInfo(OperationType.Function, "toradians") }, + { ExpressionNodeType.Transform, new ExpressionNodeInfo(OperationType.Function, "transform") }, + { ExpressionNodeType.Vector2, new ExpressionNodeInfo(OperationType.Function, "vector2") }, + { ExpressionNodeType.Vector3, new ExpressionNodeInfo(OperationType.Function, "vector3") }, + { ExpressionNodeType.Vector4, new ExpressionNodeInfo(OperationType.Function, "vector4") }, + }; + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionBuilder.csproj b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionBuilder.csproj new file mode 100644 index 000000000..97836668c --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionBuilder.csproj @@ -0,0 +1,47 @@ + + + + net5.0-windows10.0.19041 + 10.0.19041.0 + 10.0.18362.0 + ExpressionBuilder + + AnyCPU;x86;x64 + win-x86;win-x64;win10-x86 + + + 1701;1702;8305 + + + 1701;1702;8305 + + + 1701;1702;8305;CA1416 + + + 1701;1702;8305 + + + 1701;1702;8305 + + + 1701;1702;8305 + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.BooleanNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.BooleanNode.cs new file mode 100644 index 000000000..08dc753fe --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.BooleanNode.cs @@ -0,0 +1,60 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ +// Ignore warning: 'BooleanNode' defines operator == or operator != but does not override Object.Equals(object o) && Object.GetHashCode() +#pragma warning disable CS0660, CS0661 + public sealed class BooleanNode : ExpressionNode + { + internal BooleanNode() + { + } + + internal BooleanNode(bool value) + { + _value = value; + _nodeType = ExpressionNodeType.ConstantValue; + } + + internal BooleanNode(string paramName) + { + _paramName = paramName; + _nodeType = ExpressionNodeType.ConstantParameter; + } + + internal BooleanNode(string paramName, bool value) + { + _paramName = paramName; + _value = value; + _nodeType = ExpressionNodeType.ConstantParameter; + + SetBooleanParameter(paramName, value); + } + + + // + // Operator overloads + // + + public static implicit operator BooleanNode(bool value) { return new BooleanNode(value); } + + public static BooleanNode operator ==(BooleanNode left, BooleanNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Equals, left, right); } + public static BooleanNode operator !=(BooleanNode left, BooleanNode right) { return ExpressionFunctions.Function(ExpressionNodeType.NotEquals, left, right); } + + public static BooleanNode operator &(BooleanNode left, BooleanNode right) { return ExpressionFunctions.Function(ExpressionNodeType.And, left, right); } + public static BooleanNode operator |(BooleanNode left, BooleanNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Or, left, right); } + public static BooleanNode operator !(BooleanNode value) { return ExpressionFunctions.Function(ExpressionNodeType.Not, value); } + + internal protected override string GetValue() + { + return _value ? "true" : "false"; + } + + private bool _value; + } +#pragma warning restore CS0660, CS0661 +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.ColorNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.ColorNode.cs new file mode 100644 index 000000000..bfe0cdcf3 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.ColorNode.cs @@ -0,0 +1,58 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Windows.UI; + +// Ignore warning: 'ColorNode' defines operator == or operator != but does not override Object.Equals(object o) && Object.GetHashCode() +#pragma warning disable CS0660, CS0661 + public sealed class ColorNode : ExpressionNode + { + internal ColorNode() + { + } + + internal ColorNode(Color value) + { + _value = value; + _nodeType = ExpressionNodeType.ConstantValue; + } + + internal ColorNode(string paramName) + { + _paramName = paramName; + _nodeType = ExpressionNodeType.ConstantParameter; + } + + internal ColorNode(string paramName, Color value) + { + _paramName = paramName; + _value = value; + _nodeType = ExpressionNodeType.ConstantParameter; + + SetColorParameter(paramName, value); + } + + + // + // Operator overloads + // + + public static implicit operator ColorNode(Color value) { return new ColorNode(value); } + + public static BooleanNode operator ==(ColorNode left, ColorNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Equals, left, right); } + public static BooleanNode operator !=(ColorNode left, ColorNode right) { return ExpressionFunctions.Function(ExpressionNodeType.NotEquals, left, right); } + + internal protected override string GetValue() + { + return $"ColorRgb({_value.A},{_value.R},{_value.G},{_value.B})"; + } + + private Color _value; + } +#pragma warning restore CS0660, CS0661 +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.ExpressionNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.ExpressionNode.cs new file mode 100644 index 000000000..59c1ae69b --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.ExpressionNode.cs @@ -0,0 +1,626 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System; + using System.Collections.Generic; + using System.Numerics; + + using Windows.UI; + + using Microsoft.UI.Composition; + + internal enum ExpressionNodeType + { + ConstantValue, + ConstantParameter, + CurrentValueProperty, + Reference, + ReferenceProperty, + StartingValueProperty, + TargetReference, + Conditional, + Swizzle, + Add, + And, + Divide, + Equals, + GreaterThan, + GreaterThanEquals, + LessThan, + LessThanEquals, + Multiply, + Not, + NotEquals, + Or, + Subtract, + Absolute, + Acos, + Asin, + Atan, + Cos, + Ceil, + Clamp, + ColorHsl, + ColorRgb, + ColorLerp, + ColorLerpHsl, + ColorLerpRgb, + Concatenate, + Distance, + DistanceSquared, + Floor, + Inverse, + Length, + LengthSquared, + Lerp, + Ln, + Log10, + Max, + Matrix3x2FromRotation, + Matrix3x2FromScale, + Matrix3x2FromSkew, + Matrix3x2FromTranslation, + Matrix3x2, + Matrix4x4FromAxisAngle, + Matrix4x4FromScale, + Matrix4x4FromTranslation, + Matrix4x4, + Min, + Modulus, + Negate, + Normalize, + Pow, + QuaternionFromAxisAngle, + Quaternion, + Round, + Scale, + Sin, + Slerp, + Sqrt, + Square, + Tan, + ToDegrees, + ToRadians, + Transform, + Vector2, + Vector3, + Vector4, + + Count + } + + internal enum ValueKeywordKind + { + CurrentValue, + StartingValue, + } + + ///--------------------------------------------------------------------------------------------------------------------- + /// + /// class ExpressionNode + /// ToDo: Add description after docs written + /// + ///--------------------------------------------------------------------------------------------------------------------- + + public abstract class ExpressionNode + { + internal ExpressionNode() { } + + /// Resolve a named reference parameter to the CompositionObject it will refer to. + /// The string name of the parameter to be resolved. + /// The composition object that the parameter should resolve to. + public void SetReferenceParameter(string parameterName, CompositionObject compObj) + { + // Make sure we have our reference list populated + EnsureReferenceInfo(); + + for (int i = 0; i < _objRefList.Count; i++) + { + if (string.Compare(_objRefList[i].ParameterName, parameterName, true /*ignoreCase*/) == 0) + { + var item = _objRefList[i]; + item.CompObject = compObj; + _objRefList[i] = item; + } + } + } + + /// Resolve a named parameter to the boolean value it will use. + /// The string name of the parameter to be resolved. + /// The value that the parameter should resolve to. + public void SetBooleanParameter(string parameterName, bool value) { _constParamMap[parameterName] = value; } + + /// Resolve a named parameter to the float value it will use. + /// The string name of the parameter to be resolved. + /// The value that the parameter should resolve to. + public void SetScalarParameter(string parameterName, float value) { _constParamMap[parameterName] = value; } + + /// Resolve a named parameter to the Vector2 value it will use. + /// The string name of the parameter to be resolved. + /// The value that the parameter should resolve to. + public void SetVector2Parameter(string parameterName, Vector2 value) { _constParamMap[parameterName] = value; } + + /// Resolve a named parameter to the Vector3 value it will use. + /// The string name of the parameter to be resolved. + /// The value that the parameter should resolve to. + public void SetVector3Parameter(string parameterName, Vector3 value) { _constParamMap[parameterName] = value; } + + /// Resolve a named parameter to the Vector4 value it will use. + /// The string name of the parameter to be resolved. + /// The value that the parameter should resolve to. + public void SetVector4Parameter(string parameterName, Vector4 value) { _constParamMap[parameterName] = value; } + + /// Resolve a named parameter to the Color value it will use. + /// The string name of the parameter to be resolved. + /// The value that the parameter should resolve to. + public void SetColorParameter(string parameterName, Color value) { _constParamMap[parameterName] = value; } + + /// Resolve a named parameter to the Quaternion value it will use. + /// The string name of the parameter to be resolved. + /// The value that the parameter should resolve to. + public void SetQuaternionParameter(string parameterName, Quaternion value) { _constParamMap[parameterName] = value; } + + /// Resolve a named parameter to the Matrix3x2 value it will use. + /// The string name of the parameter to be resolved. + /// The value that the parameter should resolve to. + public void SetMatrix3x2Parameter(string parameterName, Matrix3x2 value) { _constParamMap[parameterName] = value; } + + /// Resolve a named parameter to the Matrix4x4 value it will use. + /// The string name of the parameter to be resolved. + /// The value that the parameter should resolve to. + public void SetMatrix4x4Parameter(string parameterName, Matrix4x4 value) { _constParamMap[parameterName] = value; } + + /// Releases all resources used by this ExpressionNode. + public void Dispose() + { + _objRefList = null; + _compObjToParamNameMap = null; + _constParamMap = null; + _subchannels = null; + _propertyName = null; + _nodeType = ExpressionNodeType.Count; + + // Note: we don't recursively dispose all child nodes, as those nodes could be in use by a different Expression + _children = null; + + if (_expressionAnimation != null) + { + _expressionAnimation.Dispose(); + _expressionAnimation = null; + } + } + + // + // Helper functions + // + + internal static T CreateExpressionNode() where T : class + { + T newNode; + + if (typeof(T) == typeof(BooleanNode)) + { + newNode = new BooleanNode() as T; + } + else if (typeof(T) == typeof(ScalarNode)) + { + newNode = new ScalarNode() as T; + } + else if (typeof(T) == typeof(Vector2Node)) + { + newNode = new Vector2Node() as T; + } + else if (typeof(T) == typeof(Vector3Node)) + { + newNode = new Vector3Node() as T; + } + else if (typeof(T) == typeof(Vector4Node)) + { + newNode = new Vector4Node() as T; + } + else if (typeof(T) == typeof(ColorNode)) + { + newNode = new ColorNode() as T; + } + else if (typeof(T) == typeof(QuaternionNode)) + { + newNode = new QuaternionNode() as T; + } + else if (typeof(T) == typeof(Matrix3x2Node)) + { + newNode = new Matrix3x2Node() as T; + } + else if (typeof(T) == typeof(Matrix4x4Node)) + { + newNode = new Matrix4x4Node() as T; + } + else + { + throw new Exception("unexpected type"); + } + + return newNode; + } + + internal string ToExpressionString() + { + if (_objRefList == null) + { + EnsureReferenceInfo(); + } + + return ToExpressionStringInternal(); + } + + internal void EnsureReferenceInfo() + { + if (_objRefList == null) + { + // Get all ReferenceNodes in this expression + HashSet referenceNodes = new HashSet(); + PopulateParameterNodes(ref _constParamMap, ref referenceNodes); + + // Find all CompositionObjects across all referenceNodes that need a paramName to be created + HashSet compObjects = new HashSet(); + foreach (var refNode in referenceNodes) + { + if ((refNode.Reference != null) && (refNode.GetReferenceParamString() == null)) + { + compObjects.Add(refNode.Reference); + } + } + + // Create a map to store the generated paramNames for each CompObj + uint id = 0; + _compObjToParamNameMap = new Dictionary(); + foreach (var compObj in compObjects) + { + // compObj.ToString() will return something like "Microsoft.UI.Composition.SpriteVisual" + // Make it look like "SpriteVisual_1" + string paramName = compObj.ToString(); + paramName = $"{paramName.Substring(paramName.LastIndexOf('.') + 1)}_{++id}"; // make sure the created param name doesn't overwrite a custom name + + _compObjToParamNameMap.Add(compObj, paramName); + } + + // Go through all reference nodes again to create our full list of referenceInfo. This time, if + // the param name is null, look it up from our new map and store it. + _objRefList = new List(); + foreach (var refNode in referenceNodes) + { + string paramName = refNode.GetReferenceParamString(); + + if ((refNode.Reference == null) && (paramName == null)) + { + // This can't happen - if the ref is null it must be because it's a named param + throw new Exception("Reference and paramName can't both be null"); + } + + if (paramName == null) + { + paramName = _compObjToParamNameMap[refNode.Reference]; + } + + _objRefList.Add(new ReferenceInfo(paramName, refNode.Reference)); + refNode._paramName = paramName; + } + } + } + + internal void SetAllParameters(CompositionAnimation anim) + { + // Make sure the list is populated + EnsureReferenceInfo(); + + foreach (var refInfo in _objRefList) + { + anim.SetReferenceParameter(refInfo.ParameterName, refInfo.CompObject); + } + + foreach (var constParam in _constParamMap) + { + if (constParam.Value.GetType() == typeof(bool)) + { + anim.SetBooleanParameter(constParam.Key, (bool)constParam.Value); + } + else if (constParam.Value.GetType() == typeof(float)) + { + anim.SetScalarParameter(constParam.Key, (float)constParam.Value); + } + else if (constParam.Value.GetType() == typeof(Vector2)) + { + anim.SetVector2Parameter(constParam.Key, (Vector2)constParam.Value); + } + else if (constParam.Value.GetType() == typeof(Vector3)) + { + anim.SetVector3Parameter(constParam.Key, (Vector3)constParam.Value); + } + else if (constParam.Value.GetType() == typeof(Vector4)) + { + anim.SetVector4Parameter(constParam.Key, (Vector4)constParam.Value); + } + else if (constParam.Value.GetType() == typeof(Color)) + { + anim.SetColorParameter(constParam.Key, (Color)constParam.Value); + } + else if (constParam.Value.GetType() == typeof(Quaternion)) + { + anim.SetQuaternionParameter(constParam.Key, (Quaternion)constParam.Value); + } + else if (constParam.Value.GetType() == typeof(Matrix3x2)) + { + anim.SetMatrix3x2Parameter(constParam.Key, (Matrix3x2)constParam.Value); + } + else if (constParam.Value.GetType() == typeof(Matrix4x4)) + { + anim.SetMatrix4x4Parameter(constParam.Key, (Matrix4x4)constParam.Value); + } + else + { + throw new Exception($"Unexpected constant parameter datatype ({constParam.Value.GetType()})"); + } + } + } + + internal static T CreateValueKeyword(ValueKeywordKind keywordKind) where T : class + { + T node = CreateExpressionNode(); + + (node as ExpressionNode)._paramName = null; + + switch (keywordKind) + { + case ValueKeywordKind.CurrentValue: + (node as ExpressionNode)._nodeType = ExpressionNodeType.CurrentValueProperty; + break; + + case ValueKeywordKind.StartingValue: + (node as ExpressionNode)._nodeType = ExpressionNodeType.StartingValueProperty; + break; + + default: + throw new Exception("Invalid ValueKeywordKind"); + } + + return node; + } + + internal protected abstract string GetValue(); + + internal protected T SubchannelsInternal(params string[] subchannels) where T : class + { + ExpressionNodeType swizzleNodeType = ExpressionNodeType.Swizzle; + T newNode; + + switch (subchannels.GetLength(0)) + { + case 1: + newNode = ExpressionFunctions.Function(swizzleNodeType, this) as T; + break; + + case 2: + newNode = ExpressionFunctions.Function(swizzleNodeType, this) as T; + break; + + case 3: + newNode = ExpressionFunctions.Function(swizzleNodeType, this) as T; + break; + + case 4: + newNode = ExpressionFunctions.Function(swizzleNodeType, this) as T; + break; + + case 6: + newNode = ExpressionFunctions.Function(swizzleNodeType, this) as T; + break; + + case 16: + newNode = ExpressionFunctions.Function(swizzleNodeType, this) as T; + break; + + default: + throw new Exception($"Invalid subchannel count ({subchannels.GetLength(0)})"); + } + + (newNode as ExpressionNode)._subchannels = subchannels; + + return newNode; + } + + internal protected void PopulateParameterNodes(ref Dictionary constParamMap, ref HashSet referenceNodes) + { + var refNode = (this as ReferenceNode); + if ((refNode != null) && (refNode._nodeType != ExpressionNodeType.TargetReference)) + { + referenceNodes.Add(refNode); + } + + if ((_constParamMap != null) && (_constParamMap != constParamMap)) + { + foreach (var entry in _constParamMap) + { + // If this parameter hasn't already been set on the root, use this node's parameter info + if (!constParamMap.ContainsKey(entry.Key)) + { + constParamMap[entry.Key] = entry.Value; + } + } + } + + foreach (var child in _children) + { + child.PopulateParameterNodes(ref constParamMap, ref referenceNodes); + } + } + + + private OperationType GetOperationKind() { return ExpressionFunctions.GetNodeInfoFromType(_nodeType).NodeOperationKind; } + private string GetOperationString() { return ExpressionFunctions.GetNodeInfoFromType(_nodeType).OperationString; } + + + private string ToExpressionStringInternal() + { + string ret = ""; + + // Do a recursive depth-first traversal of the node tree to print out the full expression string + switch (GetOperationKind()) + { + case OperationType.Function: + if (_children.Count == 0) + { + throw new Exception("Can't have an expression function with no params"); + } + + ret = $"{GetOperationString()}({_children[0].ToExpressionStringInternal()}"; + for (int i = 1; i < _children.Count; i++) + { + ret += "," + _children[i].ToExpressionStringInternal(); + } + ret += ")"; + break; + + case OperationType.Operator: + if (_children.Count != 2) + { + throw new Exception("Can't have an operator that doesn't have 2 exactly params"); + } + + ret = $"({_children[0].ToExpressionStringInternal()} {GetOperationString()} {_children[1].ToExpressionStringInternal()})"; + break; + + case OperationType.Constant: + if (_children.Count == 0) + { + // If a parameterName was specified, use it. Otherwise write the value. + ret = _paramName ?? GetValue(); + } + else + { + throw new Exception("Constants must have 0 children"); + } + break; + + case OperationType.Swizzle: + if (_children.Count != 1) + { + throw new Exception("Swizzles should have exactly 1 child"); + } + + string swizzleString = ""; + foreach (var sub in _subchannels) + { + swizzleString += sub; + } + + ret = $"{_children[0].ToExpressionStringInternal()}.{swizzleString}"; + break; + + case OperationType.Reference: + if ((_nodeType == ExpressionNodeType.Reference) || + (_nodeType == ExpressionNodeType.TargetReference)) + { + // This is the reference node itself + if (_children.Count != 0) + { + throw new Exception("References cannot have children"); + } + + ret = (this as ReferenceNode).GetReferenceParamString(); + } + else if (_nodeType == ExpressionNodeType.ReferenceProperty) + { + // This is the property node of the reference + if (_children.Count != 1) + { + throw new Exception("Reference properties must have exactly one child"); + } + + if (_propertyName == null) + { + throw new Exception("Reference properties must have a property name"); + } + + ret = $"{_children[0].ToExpressionStringInternal()}.{_propertyName}"; + } + else if (_nodeType == ExpressionNodeType.StartingValueProperty) + { + // This is a "this.StartingValue" node + if (_children.Count != 0) + { + throw new Exception("StartingValue references Cannot have children"); + } + + ret = "this.StartingValue"; + } + else if (_nodeType == ExpressionNodeType.CurrentValueProperty) + { + // This is a "this.CurrentValue" node + if (_children.Count != 0) + { + throw new Exception("CurrentValue references Cannot have children"); + } + + ret = "this.CurrentValue"; + } + else + { + throw new Exception("Unexpected NodeType for OperationType.Reference"); + } + break; + + case OperationType.Conditional: + if (_children.Count != 3) + { + throw new Exception("Conditionals must have exactly 3 children"); + } + + ret = $"(({_children[0].ToExpressionStringInternal()}) ? ({_children[1].ToExpressionStringInternal()}) : ({_children[2].ToExpressionStringInternal()}))"; + break; + + default: + throw new Exception($"Unexpected operation type ({GetOperationKind()}), nodeType = {_nodeType}"); + } + + return ret; + } + + // + // Structs + // + + internal struct ReferenceInfo + { + public ReferenceInfo(string paramName, CompositionObject compObj) + { + ParameterName = paramName; + CompObject = compObj; + } + + public string ParameterName; + public CompositionObject CompObject; + } + + + // + // Data + // + + private List _objRefList = null; + private Dictionary _compObjToParamNameMap = null; + private Dictionary _constParamMap = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + + internal protected string[] _subchannels = null; + internal string _propertyName = null; + + internal ExpressionNodeType _nodeType; + internal List _children = new List(); + internal string _paramName = null; + + internal ExpressionAnimation _expressionAnimation = null; + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Matrix3x2Node.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Matrix3x2Node.cs new file mode 100644 index 000000000..777db1f2b --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Matrix3x2Node.cs @@ -0,0 +1,107 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System.Numerics; + +// Ignore warning: 'Matrix3x2Node' defines operator == or operator != but does not override Object.Equals(object o) && Object.GetHashCode() +#pragma warning disable CS0660, CS0661 + public sealed class Matrix3x2Node : ExpressionNode + { + internal Matrix3x2Node() + { + } + + internal Matrix3x2Node(Matrix3x2 value) + { + _value = value; + _nodeType = ExpressionNodeType.ConstantValue; + } + + internal Matrix3x2Node(string paramName) + { + _paramName = paramName; + _nodeType = ExpressionNodeType.ConstantParameter; + } + + internal Matrix3x2Node(string paramName, Matrix3x2 value) + { + _paramName = paramName; + _value = value; + _nodeType = ExpressionNodeType.ConstantParameter; + + SetMatrix3x2Parameter(paramName, value); + } + + + // + // Operator overloads + // + + public static implicit operator Matrix3x2Node(Matrix3x2 value) { return new Matrix3x2Node(value); } + + public static Matrix3x2Node operator +(Matrix3x2Node left, Matrix3x2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Add, left, right); } + public static Matrix3x2Node operator -(Matrix3x2Node left, Matrix3x2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Subtract, left, right); } + public static Matrix3x2Node operator -(Matrix3x2Node value) { return ExpressionFunctions.Function(ExpressionNodeType.Negate, value); } + + public static Matrix3x2Node operator *(Matrix3x2Node left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + public static Matrix3x2Node operator *(Matrix3x2Node left, Matrix3x2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + + public static BooleanNode operator ==(Matrix3x2Node left, Matrix3x2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Equals, left, right); } + public static BooleanNode operator !=(Matrix3x2Node left, Matrix3x2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.NotEquals, left, right); } + + + // + // Subchannels + // + + public enum Subchannel + { + _11, _12, + _21, _22, + _31, _32, + } + + // Commonly accessed subchannels + public ScalarNode _11 { get { return GetSubchannels(Subchannel._11); } } + public ScalarNode _12 { get { return GetSubchannels(Subchannel._12); } } + public ScalarNode _21 { get { return GetSubchannels(Subchannel._21); } } + public ScalarNode _22 { get { return GetSubchannels(Subchannel._22); } } + public ScalarNode _31 { get { return GetSubchannels(Subchannel._31); } } + public ScalarNode _32 { get { return GetSubchannels(Subchannel._32); } } + + /// Create a new type by re-arranging the Matrix subchannels. + public ScalarNode GetSubchannels(Subchannel s) { return SubchannelsInternal(s.ToString()); } + public Vector2Node GetSubchannels(Subchannel s1, Subchannel s2) { return SubchannelsInternal(s1.ToString(), s2.ToString()); } + public Vector3Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3) { return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString()); } + public Vector4Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4) { return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString()); } + + public Matrix3x2Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4, Subchannel s5, Subchannel s6) + { + return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString(), s5.ToString(), s6.ToString()); + } + + public Matrix4x4Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4, + Subchannel s5, Subchannel s6, Subchannel s7, Subchannel s8, + Subchannel s9, Subchannel s10, Subchannel s11, Subchannel s12, + Subchannel s13, Subchannel s14, Subchannel s15, Subchannel s16) + { + return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString(), + s5.ToString(), s6.ToString(), s7.ToString(), s8.ToString(), + s9.ToString(), s10.ToString(), s11.ToString(), s12.ToString(), + s13.ToString(), s14.ToString(), s15.ToString(), s16.ToString()); + } + + internal protected override string GetValue() + { + return $"Matrix3x2({_value.M11},{_value.M12},{_value.M21},{_value.M22},{_value.M31},{_value.M32})"; + } + + private Matrix3x2 _value; + } +#pragma warning restore CS0660, CS0661 +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Matrix4x4Node.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Matrix4x4Node.cs new file mode 100644 index 000000000..c9d65b6bb --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Matrix4x4Node.cs @@ -0,0 +1,123 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System.Numerics; + +// Ignore warning: 'Matrix4x4Node' defines operator == or operator != but does not override Object.Equals(object o) && Object.GetHashCode() +#pragma warning disable CS0660, CS0661 + public sealed class Matrix4x4Node : ExpressionNode + { + internal Matrix4x4Node() + { + } + + internal Matrix4x4Node(Matrix4x4 value) + { + _value = value; + _nodeType = ExpressionNodeType.ConstantValue; + } + + internal Matrix4x4Node(string paramName) + { + _paramName = paramName; + _nodeType = ExpressionNodeType.ConstantParameter; + } + + internal Matrix4x4Node(string paramName, Matrix4x4 value) + { + _paramName = paramName; + _value = value; + _nodeType = ExpressionNodeType.ConstantParameter; + + SetMatrix4x4Parameter(paramName, value); + } + + + // + // Operator overloads + // + + public static implicit operator Matrix4x4Node(Matrix4x4 value) { return new Matrix4x4Node(value); } + + public static Matrix4x4Node operator +(Matrix4x4Node left, Matrix4x4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Add, left, right); } + public static Matrix4x4Node operator -(Matrix4x4Node left, Matrix4x4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Subtract, left, right); } + public static Matrix4x4Node operator -(Matrix4x4Node value) { return ExpressionFunctions.Function(ExpressionNodeType.Negate, value); } + + public static Matrix4x4Node operator *(Matrix4x4Node left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + public static Matrix4x4Node operator *(Matrix4x4Node left, Matrix4x4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + + public static BooleanNode operator ==(Matrix4x4Node left, Matrix4x4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Equals, left, right); } + public static BooleanNode operator !=(Matrix4x4Node left, Matrix4x4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.NotEquals, left, right); } + + + // + // Subchannels + // + + public enum Subchannel + { + _11, _12, _13, _14, + _21, _22, _23, _24, + _31, _32, _33, _34, + _41, _42, _43, _44, + } + + // Commonly accessed subchannels + public ScalarNode _11 { get { return GetSubchannels(Subchannel._11); } } + public ScalarNode _12 { get { return GetSubchannels(Subchannel._12); } } + public ScalarNode _13 { get { return GetSubchannels(Subchannel._13); } } + public ScalarNode _14 { get { return GetSubchannels(Subchannel._14); } } + public ScalarNode _21 { get { return GetSubchannels(Subchannel._21); } } + public ScalarNode _22 { get { return GetSubchannels(Subchannel._22); } } + public ScalarNode _23 { get { return GetSubchannels(Subchannel._23); } } + public ScalarNode _24 { get { return GetSubchannels(Subchannel._24); } } + public ScalarNode _31 { get { return GetSubchannels(Subchannel._31); } } + public ScalarNode _32 { get { return GetSubchannels(Subchannel._32); } } + public ScalarNode _33 { get { return GetSubchannels(Subchannel._33); } } + public ScalarNode _34 { get { return GetSubchannels(Subchannel._34); } } + public ScalarNode _41 { get { return GetSubchannels(Subchannel._41); } } + public ScalarNode _42 { get { return GetSubchannels(Subchannel._42); } } + public ScalarNode _43 { get { return GetSubchannels(Subchannel._43); } } + public ScalarNode _44 { get { return GetSubchannels(Subchannel._44); } } + public Vector3Node _11_22_33 { get { return GetSubchannels(Subchannel._11, Subchannel._22, Subchannel._33); } } + public Vector3Node _41_42_43 { get { return GetSubchannels(Subchannel._41, Subchannel._42, Subchannel._43); } } + + /// Create a new type by re-arranging the Matrix subchannels. + public ScalarNode GetSubchannels(Subchannel s) { return SubchannelsInternal(s.ToString()); } + public Vector2Node GetSubchannels(Subchannel s1, Subchannel s2) { return SubchannelsInternal(s1.ToString(), s2.ToString()); } + public Vector3Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3) { return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString()); } + public Vector4Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4) { return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString()); } + + public Matrix3x2Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4, Subchannel s5, Subchannel s6) + { + return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString(), s5.ToString(), s6.ToString()); + } + + public Matrix4x4Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4, + Subchannel s5, Subchannel s6, Subchannel s7, Subchannel s8, + Subchannel s9, Subchannel s10, Subchannel s11, Subchannel s12, + Subchannel s13, Subchannel s14, Subchannel s15, Subchannel s16) + { + return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString(), + s5.ToString(), s6.ToString(), s7.ToString(), s8.ToString(), + s9.ToString(), s10.ToString(), s11.ToString(), s12.ToString(), + s13.ToString(), s14.ToString(), s15.ToString(), s16.ToString()); + } + + internal protected override string GetValue() + { + return $"Matrix4x4({_value.M11},{_value.M12},{_value.M13},{_value.M14}," + + $"{_value.M21},{_value.M22},{_value.M23},{_value.M24}," + + $"{_value.M31},{_value.M32},{_value.M33},{_value.M34}," + + $"{_value.M41},{_value.M42},{_value.M43},{_value.M44})"; + } + + private Matrix4x4 _value; + } +#pragma warning restore CS0660, CS0661 +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.QuaternionNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.QuaternionNode.cs new file mode 100644 index 000000000..aaa8080c8 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.QuaternionNode.cs @@ -0,0 +1,63 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System.Numerics; + +// Ignore warning: 'QuaternionNode' defines operator == or operator != but does not override Object.Equals(object o) && Object.GetHashCode() +#pragma warning disable CS0660, CS0661 + public sealed class QuaternionNode : ExpressionNode + { + internal QuaternionNode() + { + } + + internal QuaternionNode(Quaternion value) + { + _value = value; + _nodeType = ExpressionNodeType.ConstantValue; + } + + internal QuaternionNode(string paramName) + { + _paramName = paramName; + _nodeType = ExpressionNodeType.ConstantParameter; + } + + internal QuaternionNode(string paramName, Quaternion value) + { + _paramName = paramName; + _value = value; + _nodeType = ExpressionNodeType.ConstantParameter; + + SetQuaternionParameter(paramName, value); + } + + + // + // Operator overloads + // + + public static implicit operator QuaternionNode(Quaternion value) { return new QuaternionNode(value); } + + public static QuaternionNode operator *(QuaternionNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + public static QuaternionNode operator *(QuaternionNode left, QuaternionNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + + public static QuaternionNode operator /(QuaternionNode left, QuaternionNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Divide, left, right); } + + public static BooleanNode operator ==(QuaternionNode left, QuaternionNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Equals, left, right); } + public static BooleanNode operator !=(QuaternionNode left, QuaternionNode right) { return ExpressionFunctions.Function(ExpressionNodeType.NotEquals, left, right); } + + internal protected override string GetValue() + { + return $"Quaternion({_value.X},{_value.Y},{_value.Z},{_value.W})"; + } + + private Quaternion _value; + } +#pragma warning restore CS0660, CS0661 +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.ScalarNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.ScalarNode.cs new file mode 100644 index 000000000..e51c5a68c --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.ScalarNode.cs @@ -0,0 +1,74 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ +// Ignore warning: 'ScalarNode' defines operator == or operator != but does not override Object.Equals(object o) && Object.GetHashCode() +#pragma warning disable CS0660, CS0661 + public sealed class ScalarNode : ExpressionNode + { + internal ScalarNode() + { + } + + internal ScalarNode(float value) + { + _value = value; + _nodeType = ExpressionNodeType.ConstantValue; + } + + internal ScalarNode(string paramName) + { + _paramName = paramName; + _nodeType = ExpressionNodeType.ConstantParameter; + } + + internal ScalarNode(string paramName, float value) + { + _paramName = paramName; + _value = value; + _nodeType = ExpressionNodeType.ConstantParameter; + + SetScalarParameter(paramName, value); + } + + + // + // Operator overloads + // + + public static implicit operator ScalarNode(float value) { return new ScalarNode(value); } + public static implicit operator ScalarNode(int value) { return new ScalarNode((float)value); } + + public static ScalarNode operator +(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Add, left, right); } + public static ScalarNode operator -(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Subtract, left, right); } + public static ScalarNode operator -(ScalarNode value) { return ExpressionFunctions.Function(ExpressionNodeType.Negate, value); } + + public static ScalarNode operator *(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + public static Vector2Node operator *(ScalarNode left, Vector2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + public static Vector3Node operator *(ScalarNode left, Vector3Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + public static Vector4Node operator *(ScalarNode left, Vector4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + public static Matrix4x4Node operator *(ScalarNode left, Matrix4x4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + + public static ScalarNode operator /(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Divide, left, right); } + public static ScalarNode operator %(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Modulus, left, right); } + + public static BooleanNode operator ==(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Equals, left, right); } + public static BooleanNode operator !=(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.NotEquals, left, right); } + public static BooleanNode operator <=(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.LessThanEquals, left, right); } + public static BooleanNode operator <(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.LessThan, left, right); } + public static BooleanNode operator >=(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.GreaterThanEquals, left, right); } + public static BooleanNode operator >(ScalarNode left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.GreaterThan, left, right); } + + internal protected override string GetValue() + { + return _value.ToString(); + } + + private float _value; + } +#pragma warning restore CS0660, CS0661 +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Vector2Node.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Vector2Node.cs new file mode 100644 index 000000000..c54a8eb7b --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Vector2Node.cs @@ -0,0 +1,105 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System.Numerics; + +// Ignore warning: 'Vector2Node' defines operator == or operator != but does not override Object.Equals(object o) && Object.GetHashCode() +#pragma warning disable CS0660, CS0661 + public sealed class Vector2Node : ExpressionNode + { + internal Vector2Node() + { + } + + internal Vector2Node(Vector2 value) + { + _value = value; + _nodeType = ExpressionNodeType.ConstantValue; + } + + internal Vector2Node(string paramName) + { + _paramName = paramName; + _nodeType = ExpressionNodeType.ConstantParameter; + } + + internal Vector2Node(string paramName, Vector2 value) + { + _paramName = paramName; + _value = value; + _nodeType = ExpressionNodeType.ConstantParameter; + + SetVector2Parameter(paramName, value); + } + + + // + // Operator overloads + // + + public static implicit operator Vector2Node(Vector2 value) { return new Vector2Node(value); } + + public static Vector2Node operator +(Vector2Node left, Vector2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Add, left, right); } + public static Vector2Node operator -(Vector2Node left, Vector2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Subtract, left, right); } + public static Vector2Node operator -(Vector2Node value) { return ExpressionFunctions.Function(ExpressionNodeType.Negate, value); } + + public static Vector2Node operator *(Vector2Node left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + public static Vector2Node operator *(Vector2Node left, Vector2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + + public static Vector2Node operator /(Vector2Node left, Vector2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Divide, left, right); } + public static Vector2Node operator %(Vector2Node left, Vector2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Modulus, left, right); } + + public static BooleanNode operator ==(Vector2Node left, Vector2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Equals, left, right); } + public static BooleanNode operator !=(Vector2Node left, Vector2Node right) { return ExpressionFunctions.Function(ExpressionNodeType.NotEquals, left, right); } + + + // + // Subchannels + // + + public enum Subchannel + { + X, + Y + } + + // Commonly accessed subchannels + public ScalarNode X { get { return GetSubchannels(Subchannel.X); } } + public ScalarNode Y { get { return GetSubchannels(Subchannel.Y); } } + + /// Create a new type by re-arranging the Vector subchannels. + public ScalarNode GetSubchannels(Subchannel s) { return SubchannelsInternal(s.ToString()); } + public Vector2Node GetSubchannels(Subchannel s1, Subchannel s2) { return SubchannelsInternal(s1.ToString(), s2.ToString()); } + public Vector3Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3) { return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString()); } + public Vector4Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4) { return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString()); } + + public Matrix3x2Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4, Subchannel s5, Subchannel s6) + { + return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString(), s5.ToString(), s6.ToString()); + } + + public Matrix4x4Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4, + Subchannel s5, Subchannel s6, Subchannel s7, Subchannel s8, + Subchannel s9, Subchannel s10, Subchannel s11, Subchannel s12, + Subchannel s13, Subchannel s14, Subchannel s15, Subchannel s16) + { + return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString(), + s5.ToString(), s6.ToString(), s7.ToString(), s8.ToString(), + s9.ToString(), s10.ToString(), s11.ToString(), s12.ToString(), + s13.ToString(), s14.ToString(), s15.ToString(), s16.ToString()); + } + + internal protected override string GetValue() + { + return $"Vector2({_value.X},{_value.Y})"; + } + + private Vector2 _value; + } +#pragma warning restore CS0660, CS0661 +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Vector3Node.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Vector3Node.cs new file mode 100644 index 000000000..7023ae039 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Vector3Node.cs @@ -0,0 +1,108 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System.Numerics; + +// Ignore warning: 'Vector3Node' defines operator == or operator != but does not override Object.Equals(object o) && Object.GetHashCode() +#pragma warning disable CS0660, CS0661 + public sealed class Vector3Node : ExpressionNode + { + internal Vector3Node() + { + } + + internal Vector3Node(Vector3 value) + { + _value = value; + _nodeType = ExpressionNodeType.ConstantValue; + } + + internal Vector3Node(string paramName) + { + _paramName = paramName; + _nodeType = ExpressionNodeType.ConstantParameter; + } + + internal Vector3Node(string paramName, Vector3 value) + { + _paramName = paramName; + _value = value; + _nodeType = ExpressionNodeType.ConstantParameter; + + SetVector3Parameter(paramName, value); + } + + + // + // Operator overloads + // + + public static implicit operator Vector3Node(Vector3 value) { return new Vector3Node(value); } + + public static Vector3Node operator +(Vector3Node left, Vector3Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Add, left, right); } + public static Vector3Node operator -(Vector3Node left, Vector3Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Subtract, left, right); } + public static Vector3Node operator -(Vector3Node value) { return ExpressionFunctions.Function(ExpressionNodeType.Negate, value); } + + public static Vector3Node operator *(Vector3Node left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + public static Vector3Node operator *(Vector3Node left, Vector3Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + + public static Vector3Node operator /(Vector3Node left, Vector3Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Divide, left, right); } + public static Vector3Node operator %(Vector3Node left, Vector3Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Modulus, left, right); } + + public static BooleanNode operator ==(Vector3Node left, Vector3Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Equals, left, right); } + public static BooleanNode operator !=(Vector3Node left, Vector3Node right) { return ExpressionFunctions.Function(ExpressionNodeType.NotEquals, left, right); } + + + // + // Subchannels + // + + public enum Subchannel + { + X, + Y, + Z + } + + // Commonly accessed subchannels + public ScalarNode X { get { return GetSubchannels(Subchannel.X); } } + public ScalarNode Y { get { return GetSubchannels(Subchannel.Y); } } + public ScalarNode Z { get { return GetSubchannels(Subchannel.Z); } } + public Vector2Node XY { get { return GetSubchannels(Subchannel.X, Subchannel.Y); } } + + /// Create a new type by re-arranging the Vector subchannels. + public ScalarNode GetSubchannels(Subchannel s) { return SubchannelsInternal(s.ToString()); } + public Vector2Node GetSubchannels(Subchannel s1, Subchannel s2) { return SubchannelsInternal(s1.ToString(), s2.ToString()); } + public Vector3Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3) { return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString()); } + public Vector4Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4) { return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString()); } + + public Matrix3x2Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4, Subchannel s5, Subchannel s6) + { + return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString(), s5.ToString(), s6.ToString()); + } + + public Matrix4x4Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4, + Subchannel s5, Subchannel s6, Subchannel s7, Subchannel s8, + Subchannel s9, Subchannel s10, Subchannel s11, Subchannel s12, + Subchannel s13, Subchannel s14, Subchannel s15, Subchannel s16) + { + return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString(), + s5.ToString(), s6.ToString(), s7.ToString(), s8.ToString(), + s9.ToString(), s10.ToString(), s11.ToString(), s12.ToString(), + s13.ToString(), s14.ToString(), s15.ToString(), s16.ToString()); + } + + internal protected override string GetValue() + { + return $"Vector3({_value.X},{_value.Y},{_value.Z})"; + } + + private Vector3 _value; + } +#pragma warning restore CS0660, CS0661 +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Vector4Node.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Vector4Node.cs new file mode 100644 index 000000000..19ca5f787 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionNodes/ExpressionBuilder.Vector4Node.cs @@ -0,0 +1,111 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System.Numerics; + +// Ignore warning: 'Vector4Node' defines operator == or operator != but does not override Object.Equals(object o) && Object.GetHashCode() +#pragma warning disable CS0660, CS0661 + public sealed class Vector4Node : ExpressionNode + { + internal Vector4Node() + { + } + + internal Vector4Node(Vector4 value) + { + _value = value; + _nodeType = ExpressionNodeType.ConstantValue; + } + + internal Vector4Node(string paramName) + { + _paramName = paramName; + _nodeType = ExpressionNodeType.ConstantParameter; + } + + internal Vector4Node(string paramName, Vector4 value) + { + _paramName = paramName; + _value = value; + _nodeType = ExpressionNodeType.ConstantParameter; + + SetVector4Parameter(paramName, value); + } + + + // + // Operator overloads + // + + public static implicit operator Vector4Node(Vector4 value) { return new Vector4Node(value); } + + public static Vector4Node operator +(Vector4Node left, Vector4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Add, left, right); } + public static Vector4Node operator -(Vector4Node left, Vector4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Subtract, left, right); } + public static Vector4Node operator -(Vector4Node value) { return ExpressionFunctions.Function(ExpressionNodeType.Negate, value); } + + public static Vector4Node operator *(Vector4Node left, ScalarNode right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + public static Vector4Node operator *(Vector4Node left, Vector4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Multiply, left, right); } + + public static Vector4Node operator /(Vector4Node left, Vector4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Divide, left, right); } + public static Vector4Node operator %(Vector4Node left, Vector4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Modulus, left, right); } + + public static BooleanNode operator ==(Vector4Node left, Vector4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.Equals, left, right); } + public static BooleanNode operator !=(Vector4Node left, Vector4Node right) { return ExpressionFunctions.Function(ExpressionNodeType.NotEquals, left, right); } + + + // + // Subchannels + // + + public enum Subchannel + { + X, + Y, + Z, + W + } + + // Commonly accessed subchannels + public ScalarNode X { get { return GetSubchannels(Subchannel.X); } } + public ScalarNode Y { get { return GetSubchannels(Subchannel.Y); } } + public ScalarNode Z { get { return GetSubchannels(Subchannel.Z); } } + public ScalarNode W { get { return GetSubchannels(Subchannel.W); } } + public Vector2Node XY { get { return GetSubchannels(Subchannel.X, Subchannel.Y); } } + public Vector3Node XYZ { get { return GetSubchannels(Subchannel.X, Subchannel.Y, Subchannel.Z); } } + + /// Create a new type by re-arranging the Vector subchannels. + public ScalarNode GetSubchannels(Subchannel s) { return SubchannelsInternal(s.ToString()); } + public Vector2Node GetSubchannels(Subchannel s1, Subchannel s2) { return SubchannelsInternal(s1.ToString(), s2.ToString()); } + public Vector3Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3) { return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString()); } + public Vector4Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4) { return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString()); } + + public Matrix3x2Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4, Subchannel s5, Subchannel s6) + { + return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString(), s5.ToString(), s6.ToString()); + } + + public Matrix4x4Node GetSubchannels(Subchannel s1, Subchannel s2, Subchannel s3, Subchannel s4, + Subchannel s5, Subchannel s6, Subchannel s7, Subchannel s8, + Subchannel s9, Subchannel s10, Subchannel s11, Subchannel s12, + Subchannel s13, Subchannel s14, Subchannel s15, Subchannel s16) + { + return SubchannelsInternal(s1.ToString(), s2.ToString(), s3.ToString(), s4.ToString(), + s5.ToString(), s6.ToString(), s7.ToString(), s8.ToString(), + s9.ToString(), s10.ToString(), s11.ToString(), s12.ToString(), + s13.ToString(), s14.ToString(), s15.ToString(), s16.ToString()); + } + + internal protected override string GetValue() + { + return $"Vector4({_value.X},{_value.Y},{_value.Z},{_value.W})"; + } + + private Vector4 _value; + } +#pragma warning restore CS0660, CS0661 +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.Constant.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.Constant.cs new file mode 100644 index 000000000..a819ecc38 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.Constant.cs @@ -0,0 +1,116 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System.Numerics; + using Windows.UI; + + ///--------------------------------------------------------------------------------------------------------------------- + /// + /// class ExpressionValues.Constant + /// ToDo: Add description after docs written + /// + ///--------------------------------------------------------------------------------------------------------------------- + + // ExpressionValues is a static class instead of a namespace to improve intellisense discoverablity and consistency with the other helper classes. + public static partial class ExpressionValues + { + /// Create a constant parameter whose value can be changed without recreating the expression. + public static class Constant + { + // + // Constant parameters with no default value + // + + /// Creates a named constant parameter of type bool. + /// The name that will be used to refer to the parameter at a later time. + public static BooleanNode CreateConstantBoolean(string paramName) { return new BooleanNode(paramName); } + + /// Creates a named constant parameter of type float. + /// The name that will be used to refer to the parameter at a later time. + public static ScalarNode CreateConstantScalar(string paramName) { return new ScalarNode(paramName); } + + /// Creates a named constant parameter of type Vector2. + /// The name that will be used to refer to the parameter at a later time. + public static Vector2Node CreateConstantVector2(string paramName) { return new Vector2Node(paramName); } + + /// Creates a named constant parameter of type Vector3. + /// The name that will be used to refer to the parameter at a later time. + public static Vector3Node CreateConstantVector3(string paramName) { return new Vector3Node(paramName); } + + /// Creates a named constant parameter of type Vector4. + /// The name that will be used to refer to the parameter at a later time. + public static Vector4Node CreateConstantVector4(string paramName) { return new Vector4Node(paramName); } + + /// Creates a named constant parameter of type Color. + /// The name that will be used to refer to the parameter at a later time. + public static ColorNode CreateConstantColor(string paramName) { return new ColorNode(paramName); } + + /// Creates a named constant parameter of type Quaternion. + /// The name that will be used to refer to the parameter at a later time. + public static QuaternionNode CreateConstantQuaternion(string paramName) { return new QuaternionNode(paramName); } + + /// Creates a named constant parameter of type Matrix3x2. + /// The name that will be used to refer to the parameter at a later time. + public static Matrix3x2Node CreateConstantMatrix3x2(string paramName) { return new Matrix3x2Node(paramName); } + + /// Creates a named constant parameter of type Matrix4x4. + /// The name that will be used to refer to the parameter at a later time. + public static Matrix4x4Node CreateConstantMatrix4x4(string paramName) { return new Matrix4x4Node(paramName); } + + + // + // Constant parameters with a default value + // + + /// Creates a named constant parameter of type bool, initialized with the specified value. + /// The name that will be used to refer to the parameter at a later time. + /// The value of the parameter. + public static BooleanNode CreateConstantBoolean(string paramName, bool value) { return new BooleanNode(paramName, value); } + + /// Creates a named constant parameter of type float, initialized with the specified value. + /// The name that will be used to refer to the parameter at a later time. + /// The value of the parameter. + public static ScalarNode CreateConstantScalar(string paramName, float value) { return new ScalarNode(paramName, value); } + + /// Creates a named constant parameter of type Vector2, initialized with the specified value. + /// The name that will be used to refer to the parameter at a later time. + /// The value of the parameter. + public static Vector2Node CreateConstantVector2(string paramName, Vector2 value) { return new Vector2Node(paramName, value); } + + /// Creates a named constant parameter of type Vector3, initialized with the specified value. + /// The name that will be used to refer to the parameter at a later time. + /// The value of the parameter. + public static Vector3Node CreateConstantVector3(string paramName, Vector3 value) { return new Vector3Node(paramName, value); } + + /// Creates a named constant parameter of type Vector4, initialized with the specified value. + /// The name that will be used to refer to the parameter at a later time. + /// The value of the parameter. + public static Vector4Node CreateConstantVector4(string paramName, Vector4 value) { return new Vector4Node(paramName, value); } + + /// Creates a named constant parameter of type Color, initialized with the specified value. + /// The name that will be used to refer to the parameter at a later time. + /// The value of the parameter. + public static ColorNode CreateConstantColor(string paramName, Color value) { return new ColorNode(paramName, value); } + + /// Creates a named constant parameter of type Quaternion, initialized with the specified value. + /// The name that will be used to refer to the parameter at a later time. + /// The value of the parameter. + public static QuaternionNode CreateConstantQuaternion(string paramName, Quaternion value) { return new QuaternionNode(paramName, value); } + + /// Creates a named constant parameter of type Matrix3x2, initialized with the specified value. + /// The name that will be used to refer to the parameter at a later time. + /// The value of the parameter. + public static Matrix3x2Node CreateConstantMatrix3x2(string paramName, Matrix3x2 value) { return new Matrix3x2Node(paramName, value); } + + /// Creates a named constant parameter of type Matrix4x4, initialized with the specified value. + /// The name that will be used to refer to the parameter at a later time. + /// The value of the parameter. + public static Matrix4x4Node CreateConstantMatrix4x4(string paramName, Matrix4x4 value) { return new Matrix4x4Node(paramName, value); } + } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.CurrentValue.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.CurrentValue.cs new file mode 100644 index 000000000..410d04eee --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.CurrentValue.cs @@ -0,0 +1,50 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + ///--------------------------------------------------------------------------------------------------------------------- + /// + /// class ExpressionValues.CurrentValue + /// ToDo: Add description after docs written + /// + ///--------------------------------------------------------------------------------------------------------------------- + + // ExpressionValues is a static class instead of a namespace to improve intellisense discoverablity and consistency with the other helper classes. + public static partial class ExpressionValues + { + /// Refer to the current value of the property this expression is connected to. + public static class CurrentValue + { + /// Create a reference to the current value of the boolean property that this expression will be connected to. + public static BooleanNode CreateBooleanCurrentValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.CurrentValue); } + + /// Create a reference to the current value of the float property that this expression will be connected to. + public static ScalarNode CreateScalarCurrentValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.CurrentValue); } + + /// Create a reference to the current value of the Vector2 property that this expression will be connected to. + public static Vector2Node CreateVector2CurrentValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.CurrentValue); } + + /// Create a reference to the current value of the Vector3 property that this expression will be connected to. + public static Vector3Node CreateVector3CurrentValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.CurrentValue); } + + /// Create a reference to the current value of the Vector4 property that this expression will be connected to. + public static Vector4Node CreateVector4CurrentValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.CurrentValue); } + + /// Create a reference to the current value of the Color property that this expression will be connected to. + public static ColorNode CreateColorCurrentValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.CurrentValue); } + + /// Create a reference to the current value of the Quaternion property that this expression will be connected to. + public static QuaternionNode CreateQuaternionCurrentValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.CurrentValue); } + + /// Create a reference to the current value of the Matrix3x2 property that this expression will be connected to. + public static Matrix3x2Node CreateMatrix3x2CurrentValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.CurrentValue); } + + /// Create a reference to the current value of the Matrix4x4 property that this expression will be connected to. + public static Matrix4x4Node CreateMatrix4x4CurrentValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.CurrentValue); } + } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.Reference.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.Reference.cs new file mode 100644 index 000000000..42e9ef214 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.Reference.cs @@ -0,0 +1,73 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Windows.UI; + + ///--------------------------------------------------------------------------------------------------------------------- + /// + /// class ExpressionValues + /// ToDo: Add description after docs written + /// + ///--------------------------------------------------------------------------------------------------------------------- + + // ExpressionValues is a static class instead of a namespace to improve intellisense discoverablity and consistency with the other helper classes. + public static partial class ExpressionValues + { + /// Create a reference to a CompositionObject. + public static class Reference + { + /// Creates a named reference parameter to an AmbientLight. + /// The name that will be used to refer to the parameter at a later time. + public static AmbientLightReferenceNode CreateAmbientLightReference(string parameterName) { return new AmbientLightReferenceNode(parameterName); } + + /// Creates a named reference parameter to a ColorBrush. + /// The name that will be used to refer to the parameter at a later time. + public static ColorBrushReferenceNode CreateColorBrushReference(string parameterName) { return new ColorBrushReferenceNode(parameterName); } + + /// Creates a named reference parameter to a DistantLight. + /// The name that will be used to refer to the parameter at a later time. + public static DistantLightReferenceNode CreateDistantLightReference(string parameterName) { return new DistantLightReferenceNode(parameterName); } + + /// Creates a named reference parameter to a DropShadow. + /// The name that will be used to refer to the parameter at a later time. + public static DropShadowReferenceNode CreateDropShadowReference(string parameterName) { return new DropShadowReferenceNode(parameterName); } + + /// Creates a named reference parameter to an InsetClip. + /// The name that will be used to refer to the parameter at a later time. + public static InsetClipReferenceNode CreateInsetClipReference(string parameterName) { return new InsetClipReferenceNode(parameterName); } + + /// Creates a named reference parameter to an InteractionTracker. + /// The name that will be used to refer to the parameter at a later time. + public static InteractionTrackerReferenceNode CreateInteractionTrackerReference(string parameterName) { return new InteractionTrackerReferenceNode(parameterName); } + + /// Creates a named reference parameter to a NineGridBrush. + /// The name that will be used to refer to the parameter at a later time. + public static NineGridBrushReferenceNode CreateNineGridBrushReference(string parameterName) { return new NineGridBrushReferenceNode(parameterName); } + + /// Creates a named reference parameter to a PointLight. + /// The name that will be used to refer to the parameter at a later time. + public static PointLightReferenceNode CreatePointLightReference(string parameterName) { return new PointLightReferenceNode(parameterName); } + + /// Creates a named reference parameter to a PropertySet. + /// The name that will be used to refer to the parameter at a later time. + public static PropertySetReferenceNode CreatePropertySetReference(string parameterName) { return new PropertySetReferenceNode(parameterName); } + + /// Creates a named reference parameter to a SpotLight. + /// The name that will be used to refer to the parameter at a later time. + public static SpotLightReferenceNode CreateSpotLightReference(string parameterName) { return new SpotLightReferenceNode(parameterName); } + + /// Creates a named reference parameter to a SurfaceBrush. + /// The name that will be used to refer to the parameter at a later time. + public static SurfaceBrushReferenceNode CreateSurfaceBrushReference(string parameterName) { return new SurfaceBrushReferenceNode(parameterName); } + + /// Creates a named reference parameter to a Visual. + /// The name that will be used to refer to the parameter at a later time. + public static VisualReferenceNode CreateVisualReference(string parameterName) { return new VisualReferenceNode(parameterName); } + } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.StartingValue.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.StartingValue.cs new file mode 100644 index 000000000..295ba2dc6 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.StartingValue.cs @@ -0,0 +1,50 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + ///--------------------------------------------------------------------------------------------------------------------- + /// + /// class ExpressionValues.StartingValue + /// ToDo: Add description after docs written + /// + ///--------------------------------------------------------------------------------------------------------------------- + + // ExpressionValues is a static class instead of a namespace to improve intellisense discoverablity and consistency with the other helper classes. + public static partial class ExpressionValues + { + /// Refer to the value of the property this expression is connected to, sampled during the first frame of execution. + public static class StartingValue + { + /// Create a reference to the starting value of the boolean property that this expression will be connected to. + public static BooleanNode CreateBooleanStartingValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.StartingValue); } + + /// Create a reference to the starting value of the float property that this expression will be connected to. + public static ScalarNode CreateScalarStartingValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.StartingValue); } + + /// Create a reference to the starting value of the Vector2 property that this expression will be connected to. + public static Vector2Node CreateVector2StartingValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.StartingValue); } + + /// Create a reference to the starting value of the Vector3 property that this expression will be connected to. + public static Vector3Node CreateVector3StartingValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.StartingValue); } + + /// Create a reference to the starting value of the Vector4 property that this expression will be connected to. + public static Vector4Node CreateVector4StartingValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.StartingValue); } + + /// Create a reference to the starting value of the Color property that this expression will be connected to. + public static ColorNode CreateColorStartingValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.StartingValue); } + + /// Create a reference to the starting value of the Quaternion property that this expression will be connected to. + public static QuaternionNode CreateQuaternionStartingValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.StartingValue); } + + /// Create a reference to the starting value of the Matrix3x2 property that this expression will be connected to. + public static Matrix3x2Node CreateMatrix3x2StartingValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.StartingValue); } + + /// Create a reference to the starting value of the Matrix4x4 property that this expression will be connected to. + public static Matrix4x4Node CreateMatrix4x4StartingValue() { return ExpressionNode.CreateValueKeyword(ValueKeywordKind.StartingValue); } + } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.Target.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.Target.cs new file mode 100644 index 000000000..e614e5c4a --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ExpressionValues/ExpressionBuilder.ExpressionValues.Target.cs @@ -0,0 +1,59 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + ///--------------------------------------------------------------------------------------------------------------------- + /// + /// class ExpressionValues.Target + /// ToDo: Add description after docs written + /// + ///--------------------------------------------------------------------------------------------------------------------- + + // ExpressionValues is a static class instead of a namespace to improve intellisense discoverablity and consistency with the other helper classes. + public static partial class ExpressionValues + { + /// Create a reference to the CompositionObject this expression will be connected to. + public static class Target + { + /// Create a reference to the AmbientLight target that this expression will be connected to. + public static AmbientLightReferenceNode CreateAmbientLightTarget() { return AmbientLightReferenceNode.CreateTargetReference(); } + + /// Create a reference to the ColorBrush target that this expression will be connected to. + public static ColorBrushReferenceNode CreateColorBrushTarget() { return ColorBrushReferenceNode.CreateTargetReference(); } + + /// Create a reference to the DistantLight target that this expression will be connected to. + public static DistantLightReferenceNode CreateDistantLightTarget() { return DistantLightReferenceNode.CreateTargetReference(); } + + /// Create a reference to the DropShadow target that this expression will be connected to. + public static DropShadowReferenceNode CreateDropShadowTarget() { return DropShadowReferenceNode.CreateTargetReference(); } + + /// Create a reference to the InsetClip target that this expression will be connected to. + public static InsetClipReferenceNode CreateInsetClipTarget() { return InsetClipReferenceNode.CreateTargetReference(); } + + /// Create a reference to the InteractionTracker target that this expression will be connected to. + public static InteractionTrackerReferenceNode CreateInteractionTrackerTarget() { return InteractionTrackerReferenceNode.CreateTargetReference(); } + + /// Create a reference to the NineGridBrush target that this expression will be connected to. + public static NineGridBrushReferenceNode CreateNineGridBrushTarget() { return NineGridBrushReferenceNode.CreateTargetReference(); } + + /// Create a reference to the PointLight target that this expression will be connected to. + public static PointLightReferenceNode CreatePointLightTarget() { return PointLightReferenceNode.CreateTargetReference(); } + + /// Create a reference to the PropertySet target that this expression will be connected to. + public static PropertySetReferenceNode CreatePropertySetTarget() { return PropertySetReferenceNode.CreateTargetReference(); } + + /// Create a reference to the SpotLight target that this expression will be connected to. + public static SpotLightReferenceNode CreateSpotLightTarget() { return SpotLightReferenceNode.CreateTargetReference(); } + + /// Create a reference to the SurfaceBrush target that this expression will be connected to. + public static SurfaceBrushReferenceNode CreateSurfaceBrushTarget() { return SurfaceBrushReferenceNode.CreateTargetReference(); } + + /// Create a reference to the Visual target that this expression will be connected to. + public static VisualReferenceNode CreateVisualTarget() { return VisualReferenceNode.CreateTargetReference(); } + } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/Properties/AssemblyInfo.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..880bddcc5 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ExpressionBuilder")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ExpressionBuilder")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/Properties/ExpressionBuilder.rd.xml b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/Properties/ExpressionBuilder.rd.xml new file mode 100644 index 000000000..7cb554fa5 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/Properties/ExpressionBuilder.rd.xml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.AmbientLightReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.AmbientLightReferenceNode.cs new file mode 100644 index 000000000..ecaddfaa7 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.AmbientLightReferenceNode.cs @@ -0,0 +1,26 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class AmbientLightReferenceNode : ReferenceNode + { + internal AmbientLightReferenceNode(string paramName, AmbientLight light = null) : base(paramName, light) { } + + internal static AmbientLightReferenceNode CreateTargetReference() + { + var node = new AmbientLightReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public ColorNode Color { get { return ReferenceProperty("Color"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.ColorBrushReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.ColorBrushReferenceNode.cs new file mode 100644 index 000000000..be716ddda --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.ColorBrushReferenceNode.cs @@ -0,0 +1,26 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class ColorBrushReferenceNode : ReferenceNode + { + internal ColorBrushReferenceNode(string paramName, CompositionColorBrush brush = null) : base(paramName, brush) { } + + internal static ColorBrushReferenceNode CreateTargetReference() + { + var node = new ColorBrushReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public ColorNode Color { get { return ReferenceProperty("Color"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.DistantLightReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.DistantLightReferenceNode.cs new file mode 100644 index 000000000..5b82dce1e --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.DistantLightReferenceNode.cs @@ -0,0 +1,27 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class DistantLightReferenceNode : ReferenceNode + { + internal DistantLightReferenceNode(string paramName, DistantLight light = null) : base(paramName, light) { } + + internal static DistantLightReferenceNode CreateTargetReference() + { + var node = new DistantLightReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public ColorNode Color { get { return ReferenceProperty("Color"); } } + public Vector3Node Direction { get { return ReferenceProperty("Direction"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.DropShadowReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.DropShadowReferenceNode.cs new file mode 100644 index 000000000..cd0421993 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.DropShadowReferenceNode.cs @@ -0,0 +1,29 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class DropShadowReferenceNode : ReferenceNode + { + internal DropShadowReferenceNode(string paramName, DropShadow source = null) : base(paramName, source) { } + + internal static DropShadowReferenceNode CreateTargetReference() + { + var node = new DropShadowReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public ScalarNode BlurRadius { get { return ReferenceProperty("BlurRadius"); } } + public ScalarNode Opacity { get { return ReferenceProperty("Opacity"); } } + public Vector3Node Offset { get { return ReferenceProperty("Offset"); } } + public ColorNode Color { get { return ReferenceProperty("Color"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.InsetClipReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.InsetClipReferenceNode.cs new file mode 100644 index 000000000..bafa4ae7a --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.InsetClipReferenceNode.cs @@ -0,0 +1,39 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class InsetClipReferenceNode : ReferenceNode + { + internal InsetClipReferenceNode(string paramName, InsetClip ic = null) : base(paramName, ic) { } + + internal static InsetClipReferenceNode CreateTargetReference() + { + var node = new InsetClipReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public ScalarNode BottomInset { get { return ReferenceProperty("BottomInset"); } } + public ScalarNode LeftInset { get { return ReferenceProperty("LeftInset"); } } + public ScalarNode RightInset { get { return ReferenceProperty("RightInset"); } } + public ScalarNode TopInset { get { return ReferenceProperty("TopInset"); } } + + public ScalarNode RotationAngle { get { return ReferenceProperty("RotationAngle"); } } + public ScalarNode RotationAngleInDegrees { get { return ReferenceProperty("RotationAngleInDegrees"); } } + + public Vector2Node AnchorPoint { get { return ReferenceProperty("AnchorPoint"); } } + public Vector2Node CenterPoint { get { return ReferenceProperty("CenterPoint"); } } + public Vector2Node Offset { get { return ReferenceProperty("Offset"); } } + public Vector2Node Scale { get { return ReferenceProperty("Scale"); } } + + public Matrix3x2Node TransformMatrix { get { return ReferenceProperty("TransformMatrix"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.InteractionTrackerReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.InteractionTrackerReferenceNode.cs new file mode 100644 index 000000000..eb7e39ea6 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.InteractionTrackerReferenceNode.cs @@ -0,0 +1,39 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition.Interactions; + + public sealed class InteractionTrackerReferenceNode : ReferenceNode + { + internal InteractionTrackerReferenceNode(string paramName, InteractionTracker it = null) : base(paramName, it) { } + internal static InteractionTrackerReferenceNode CreateTargetReference() + { + var node = new InteractionTrackerReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public BooleanNode IsPositionRoundingSuggested { get { return ReferenceProperty("IsPositionRoundingSuggested"); } } + + public ScalarNode MinScale { get { return ReferenceProperty("MinScale"); } } + public ScalarNode MaxScale { get { return ReferenceProperty("MaxScale"); } } + public ScalarNode NaturalRestingScale { get { return ReferenceProperty("NaturalRestingScale"); } } + public ScalarNode Scale { get { return ReferenceProperty("Scale"); } } + public ScalarNode ScaleInertiaDecayRate { get { return ReferenceProperty("ScaleInertiaDecayRate"); } } + public ScalarNode ScaleVelocityInPercentPerSecond { get { return ReferenceProperty("ScaleVelocityInPercentPerSecond"); } } + + public Vector3Node MinPosition { get { return ReferenceProperty("MinPosition"); } } + public Vector3Node MaxPosition { get { return ReferenceProperty("MaxPosition"); } } + public Vector3Node NaturalRestingPosition { get { return ReferenceProperty("NaturalRestingPosition"); } } + public Vector3Node Position { get { return ReferenceProperty("Position"); } } + public Vector3Node PositionInertiaDecayRate { get { return ReferenceProperty("PositionInertiaDecayRate"); } } + public Vector3Node PositionVelocityInPixelsPerSecond { get { return ReferenceProperty("PositionVelocityInPixelsPerSecond"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.ManipulationPropertySetReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.ManipulationPropertySetReferenceNode.cs new file mode 100644 index 000000000..fca04c8d8 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.ManipulationPropertySetReferenceNode.cs @@ -0,0 +1,26 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class ManipulationPropertySetReferenceNode : PropertySetReferenceNode + { + internal ManipulationPropertySetReferenceNode(string paramName, CompositionPropertySet ps = null) : base(paramName, ps) { } + + // Needed for GetSpecializedReference<> + internal ManipulationPropertySetReferenceNode() : base(null, null) { } + + // Animatable properties + public Vector3Node CenterPoint { get { return ReferenceProperty("CenterPoint"); } } + public Vector3Node Pan { get { return ReferenceProperty("Pan"); } } + public Vector3Node Scale { get { return ReferenceProperty("Scale"); } } + public Vector3Node Translation { get { return ReferenceProperty("Translation"); } } + + public Matrix4x4Node Matrix { get { return ReferenceProperty("Matrix"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.NineGridBrushReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.NineGridBrushReferenceNode.cs new file mode 100644 index 000000000..18c80865f --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.NineGridBrushReferenceNode.cs @@ -0,0 +1,33 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class NineGridBrushReferenceNode : ReferenceNode + { + internal NineGridBrushReferenceNode(string paramName, CompositionNineGridBrush brush = null) : base(paramName, brush) { } + + internal static NineGridBrushReferenceNode CreateTargetReference() + { + var node = new NineGridBrushReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public ScalarNode BottomInset { get { return ReferenceProperty("BottomInset"); } } + public ScalarNode BottomInsetScale { get { return ReferenceProperty("BottomInsetScale"); } } + public ScalarNode LeftInset { get { return ReferenceProperty("LeftInset"); } } + public ScalarNode LeftInsetScale { get { return ReferenceProperty("LeftInsetScale"); } } + public ScalarNode RightInset { get { return ReferenceProperty("RightInset"); } } + public ScalarNode RightInsetScale { get { return ReferenceProperty("RightInsetScale"); } } + public ScalarNode TopInset { get { return ReferenceProperty("TopInset"); } } + public ScalarNode TopInsetScale { get { return ReferenceProperty("TopInsetScale"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.PointLightReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.PointLightReferenceNode.cs new file mode 100644 index 000000000..0580c2c2c --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.PointLightReferenceNode.cs @@ -0,0 +1,32 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class PointLightReferenceNode : ReferenceNode + { + internal PointLightReferenceNode(string paramName, PointLight light = null) : base(paramName, light) { } + + internal static PointLightReferenceNode CreateTargetReference() + { + var node = new PointLightReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public ScalarNode ConstantAttenuation { get { return ReferenceProperty("ConstantAttenuation"); } } + public ScalarNode LinearAttenuation { get { return ReferenceProperty("LinearAttenuation"); } } + public ScalarNode QuadraticAttentuation { get { return ReferenceProperty("QuadraticAttentuation"); } } + + public ColorNode Color { get { return ReferenceProperty("Color"); } } + public Vector3Node Direction { get { return ReferenceProperty("Direction"); } } + public Vector3Node Offset { get { return ReferenceProperty("Offset"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.PointerPositionPropertySet.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.PointerPositionPropertySet.cs new file mode 100644 index 000000000..80abe9bad --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.PointerPositionPropertySet.cs @@ -0,0 +1,21 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class PointerPositionPropertySetReferenceNode : PropertySetReferenceNode + { + internal PointerPositionPropertySetReferenceNode(string paramName, CompositionPropertySet ps = null) : base(paramName, ps) { } + + // Needed for GetSpecializedReference<> + internal PointerPositionPropertySetReferenceNode() : base(null, null) { } + + // Animatable properties + public Vector3Node Position { get { return ReferenceProperty("Position"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.PropertySetReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.PropertySetReferenceNode.cs new file mode 100644 index 000000000..a6d2de363 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.PropertySetReferenceNode.cs @@ -0,0 +1,28 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public class PropertySetReferenceNode : ReferenceNode + { + internal PropertySetReferenceNode(string paramName, CompositionPropertySet ps = null) : base(paramName, ps) { } + + + // Needed for GetSpecializedReference<>() + internal PropertySetReferenceNode() : base(null, null) { } + internal CompositionPropertySet Source { get; set; } + + internal static PropertySetReferenceNode CreateTargetReference() + { + var node = new PropertySetReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.ReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.ReferenceNode.cs new file mode 100644 index 000000000..37b815c25 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.ReferenceNode.cs @@ -0,0 +1,112 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using System; + + using Microsoft.UI.Composition; + + ///--------------------------------------------------------------------------------------------------------------------- + /// + /// class ReferenceNode + /// ToDo: Add description after docs written + /// + ///--------------------------------------------------------------------------------------------------------------------- + + public abstract class ReferenceNode : ExpressionNode + { + internal ReferenceNode(string paramName, CompositionObject compObj = null) + { + _reference = compObj; + _nodeType = ExpressionNodeType.Reference; + _paramName = paramName; + } + + + // + // Property set accessor functions + // + + /// Create a reference to the specified boolean property. This maybe be a property on the CompositionObject directly, or on the its PropertySet. + /// The name of the property to reference. + public BooleanNode GetBooleanProperty(string propertyName) { return ReferenceProperty(propertyName); } + + /// Create a reference to the specified float property. This maybe be a property on the CompositionObject directly, or on the its PropertySet. + /// The name of the property to reference. + public ScalarNode GetScalarProperty(string propertyName) { return ReferenceProperty(propertyName); } + + /// Create a reference to the specified Vector2 property. This maybe be a property on the CompositionObject directly, or on the its PropertySet. + /// The name of the property to reference. + public Vector2Node GetVector2Property(string propertyName) { return ReferenceProperty(propertyName); } + + /// Create a reference to the specified Vector3 property. This maybe be a property on the CompositionObject directly, or on the its PropertySet. + /// The name of the property to reference. + public Vector3Node GetVector3Property(string propertyName) { return ReferenceProperty(propertyName); } + + /// Create a reference to the specified Vector4 property. This maybe be a property on the CompositionObject directly, or on the its PropertySet. + /// The name of the property to reference. + public Vector4Node GetVector4Property(string propertyName) { return ReferenceProperty(propertyName); } + + /// Create a reference to the specified Color property. This maybe be a property on the CompositionObject directly, or on the its PropertySet. + /// The name of the property to reference. + public ColorNode GetColorProperty(string propertyName) { return ReferenceProperty(propertyName); } + + /// Create a reference to the specified Quaternion property. This maybe be a property on the CompositionObject directly, or on the its PropertySet. + /// The name of the property to reference. + public QuaternionNode GetQuaternionProperty(string propertyName) { return ReferenceProperty(propertyName); } + + /// Create a reference to the specified Matrix3x2 property. This maybe be a property on the CompositionObject directly, or on the its PropertySet. + /// The name of the property to reference. + public Matrix3x2Node GetMatrix3x2Property(string propertyName) { return ReferenceProperty(propertyName); } + + /// Create a reference to the specified Matrix4x4 property. This maybe be a property on the CompositionObject directly, or on the its PropertySet. + /// The name of the property to reference. + public Matrix4x4Node GetMatrix4x4Property(string propertyName) { return ReferenceProperty(propertyName); } + + + // + // Helper functions + // + + internal protected T ReferenceProperty(string propertyName) where T : class + { + T newNode = ExpressionNode.CreateExpressionNode(); + + (newNode as ExpressionNode)._nodeType = ExpressionNodeType.ReferenceProperty; + (newNode as ExpressionNode)._children.Add(this); + (newNode as ExpressionNode)._propertyName = propertyName; + + return newNode; + } + + internal string GetReferenceParamString() + { + if (_nodeType == ExpressionNodeType.TargetReference) + { + return "this.target"; + } + else + { + return _paramName; + } + } + + internal protected override string GetValue() + { + throw new NotImplementedException("GetValue is not implemented for ReferenceNode and shouldn't be called"); + } + + public CompositionObject Reference { get { return _reference; } } + + + // + // Data + // + + private CompositionObject _reference; + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.SpotLightReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.SpotLightReferenceNode.cs new file mode 100644 index 000000000..08c6a3210 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.SpotLightReferenceNode.cs @@ -0,0 +1,40 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class SpotLightReferenceNode : ReferenceNode + { + internal SpotLightReferenceNode(string paramName, SpotLight light = null) : base(paramName, light) { } + + internal static SpotLightReferenceNode CreateTargetReference() + { + var node = new SpotLightReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public ScalarNode ConstantAttenuation { get { return ReferenceProperty("ConstantAttenuation"); } } + public ScalarNode LinearAttenuation { get { return ReferenceProperty("LinearAttenuation"); } } + public ScalarNode QuadraticAttentuation { get { return ReferenceProperty("QuadraticAttentuation"); } } + + public ScalarNode InnerConeAngle { get { return ReferenceProperty("InnerConeAngle"); } } + public ScalarNode InnerConeAngleInDegrees { get { return ReferenceProperty("InnerConeAngleInDegrees"); } } + public ScalarNode OuterConeAngle { get { return ReferenceProperty("OuterConeAngle"); } } + public ScalarNode OuterConeAngleInDegrees { get { return ReferenceProperty("OuterConeAngleInDegrees"); } } + + public ColorNode Color { get { return ReferenceProperty("Color"); } } + public ColorNode InnerConeColor { get { return ReferenceProperty("InnerConeColor"); } } + public ColorNode OuterConeColor { get { return ReferenceProperty("OuterConeColor"); } } + + public Vector3Node Direction { get { return ReferenceProperty("Direction"); } } + public Vector3Node Offset { get { return ReferenceProperty("Offset"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.SurfaceBrushReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.SurfaceBrushReferenceNode.cs new file mode 100644 index 000000000..a56a9286e --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.SurfaceBrushReferenceNode.cs @@ -0,0 +1,42 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class SurfaceBrushReferenceNode : ReferenceNode + { + internal SurfaceBrushReferenceNode(string paramName, CompositionSurfaceBrush brush = null) : base(paramName, brush) { } + + internal static SurfaceBrushReferenceNode CreateTargetReference() + { + var node = new SurfaceBrushReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public ScalarNode HorizontalAlignmentRatio { get { return ReferenceProperty("HorizontalAlignmentRatio"); } } + public ScalarNode VerticalAlignmentRatio { get { return ReferenceProperty("VerticalAlignmentRatio"); } } + + public ScalarNode BottomInset { get { return ReferenceProperty("BottomInset"); } } + public ScalarNode LeftInset { get { return ReferenceProperty("LeftInset"); } } + public ScalarNode RightInset { get { return ReferenceProperty("RightInset"); } } + public ScalarNode TopInset { get { return ReferenceProperty("TopInset"); } } + + public ScalarNode RotationAngle { get { return ReferenceProperty("RotationAngle"); } } + public ScalarNode RotationAngleInDegrees { get { return ReferenceProperty("RotationAngleInDegrees"); } } + + public Vector2Node AnchorPoint { get { return ReferenceProperty("AnchorPoint"); } } + public Vector2Node CenterPoint { get { return ReferenceProperty("CenterPoint"); } } + public Vector2Node Offset { get { return ReferenceProperty("Offset"); } } + public Vector2Node Scale { get { return ReferenceProperty("Scale"); } } + + public Matrix3x2Node TransformMatrix { get { return ReferenceProperty("TransformMatrix"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.VisualReferenceNode.cs b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.VisualReferenceNode.cs new file mode 100644 index 000000000..86b135cc1 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/ExpressionBuilder/ReferenceNodes/ExpressionBuilder.VisualReferenceNode.cs @@ -0,0 +1,43 @@ +///--------------------------------------------------------------------------------------------------------------------- +/// +/// Copyright (c) Microsoft Corporation. All rights reserved. +/// +///--------------------------------------------------------------------------------------------------------------------- + +namespace ExpressionBuilder +{ + using Microsoft.UI.Composition; + + public sealed class VisualReferenceNode : ReferenceNode + { + internal VisualReferenceNode(string paramName, Visual v = null) : base(paramName, v) { } + + internal static VisualReferenceNode CreateTargetReference() + { + var node = new VisualReferenceNode(null); + node._nodeType = ExpressionNodeType.TargetReference; + + return node; + } + + // Animatable properties + public ScalarNode Opacity { get { return ReferenceProperty("Opacity"); } } + public ScalarNode RotationAngle { get { return ReferenceProperty("RotationAngle"); } } + public ScalarNode RotationAngleInDegrees { get { return ReferenceProperty("RotationAngleInDegrees"); } } + + public Vector2Node AnchorPoint { get { return ReferenceProperty("AnchorPoint"); } } + public Vector2Node RelativeSize { get { return ReferenceProperty("RelativeSize"); } } + public Vector2Node Size { get { return ReferenceProperty("Size"); } } + + public Vector3Node CenterPoint { get { return ReferenceProperty("CenterPoint"); } } + public Vector3Node Offset { get { return ReferenceProperty("Offset"); } } + public Vector3Node RelativeOffset { get { return ReferenceProperty("RelativeOffset"); } } + public Vector3Node RotationAxis { get { return ReferenceProperty("RotationAxis"); } } + public Vector3Node Scale { get { return ReferenceProperty("Scale"); } } + public Vector3Node Translation { get { return GetVector3Property("Translation"); } } + + public QuaternionNode Orientation { get { return ReferenceProperty("Orientation"); } } + + public Matrix4x4Node TransformMatrix { get { return ReferenceProperty("TransformMatrix"); } } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/LICENSE.TXT b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/LICENSE.TXT new file mode 100644 index 000000000..54a0121f4 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/LICENSE.TXT @@ -0,0 +1,38 @@ +[ExpressionBuilder] + +(c) Microsoft 2017. All rights reserved. + + + +Permission is hereby granted, free of charge, to any person obtaining a copy + +of this software and associated documentation files (the "Software"), to deal + +in the Software without restriction, including without limitation the rights + +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + +copies of the Software, and to permit persons to whom the Software is + +furnished to do so, subject to the following conditions: + + +The above copyright notice and this permission notice shall be included in + +all copies or substantial portions of the Software. + + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + +THE SOFTWARE. \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/README.md b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/README.md new file mode 100644 index 000000000..2d3bdd2b0 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/ExpressionBuilder/README.md @@ -0,0 +1,110 @@ +# ExpressionBuilder +Welcome to the ExpressionBuilder classes! The ExpressionBuilder classes are a C#-only alternative to building Expressions with type safety. Below is a quick introduction to using the ExpressionBuilder classes with your application. For complete documentation and walkthroughs, please see the Word Document in the project folder titled "ExpressionBuilder_Documentation.docx". + +## Setting up the ExpressionBuilder classes with your app +To use the ExpressionBuilder in your app, download a copy of the source, add the project into your solution and update the references for your app project. Next, within your app project, make sure to add the using statement to leverage the ExpressionBuilder classes: + +``` +using ExpressionBuilder; +``` + +Once you have the classes added to your solution and referenced in your project, you are all set to start using the ExpressionBuilder classes! + +## Getting started with ExpressionBuilder classes +### ExpressionAnimation Overview +A brief recap of ExpressionAnimations: +- ExpressionAnimations are a type of CompositionAnimations used to create mathematical relationships between Composition Objects. Simple examples include making a relationship such that one object will move relative to another. +- Like other CompositionAnimations, ExpressionAnimations are templates, meaning you can create an Expression and use it to animate multiple objects. You can also change aspects of the animation and have those changes take effect the next time you animate an object (without affecting any previously connected animations). +- For more information on ExpressionAnimations, [please check our documentation](https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Composition.ExpressionAnimation). + +ExpressionAnimations can create some very powerful and unique experiences, but can be a bit combersome to author. One of the big pain points with ExpressionAnimations is that the equation or mathematical relationship that defines the animation is written as a string, e.g.: + +``` +_parallaxExpression = compositor.CreateExpressionAnimation( + "(ScrollManipulation.Translation.Y + StartOffset - (0.5 * ItemHeight)) * ParallaxValue - (ScrollManipulation.Translation.Y + StartOffset - (0.5 * ItemHeight))"); +``` +This creates a series of challenges when authoring Expressions in this manner: +- No type safety checks +- No intellisense or autocomplete +- Semantic errors with the equation appear at runtime, not compile time + +Thus, the ExpressionBuilder classes were created to help alleviate these challenges and present an alternative way to create ExpressionAnimations. + +## Using the ExpressionBuilder classes +For full documentation on how to use the ExpressionBuilder classes, please refer to the Word document that is included within the project folder. + +Before we highlight how to use the classes, let's reiterate the core components that make up an Expression: +- Parameters: These are key-value pairs that can either be references to a CompositionObject or constant values. The values to these keys can be changed later on. +- Functions: Similar to operators, there are a series of mathematical functions that provide a series of common math behaviors (clamp, max, min, cos, etc.) +- Keywords: a set of known phrases to the Expression language to provide specific behaviors (referencing the CurrentValue, etc.) +- Operators: The glue that brings together all the components of an equation. Your typical mathematical operators (+, -, *, /) + +On the surface, the ExpressionBuilder classes provide three major components to build Expressions with: +- ExpressionFunctions Class: object that defines all the math functions and type (Scalar, Vector2, Vector3, etc.) constructors +- ExpressionValues Class: object that defines the creation of parameters and keywords +- Extension Methods for Composition Objects: a series of extension methods off of CompositionObject and it's children. + +Behind the scenes, methods off the ExpressionFunctions and ExpressionValues classes construct ExpressionNode objects that represent an Expression. These nodes can be combined with other ExpressionNodes or System.Numerics objects using operators, resulting in a new ExpressionNode. Via the extension methods, anywhere you would normally insert an ExpressionAnimation object, you can instead use an ExpressionNode. + +### Extension Methods (GetReference(), StartAnimation()) +Prior to ExpressionBuilder, in order to reference a CompositionObject property, a SetReferenceParameter on the ExpressionAnimation must always be called: +``` +var expression = _compositor.CreateExpressionAnimation("visualA.Offset.X + 50"); +expression.SetReferenceParameter("visualA", _visualA); +_visualB.StartAnimation("Offset.X", expression); +``` +With ExpressionBuilder, you can use the GetReference() extension method that performs this same behavior if you don't need to template, but in a type safe manner: +``` +_visualB.StartAnimation("Offset.X", _visualA.GetReference().Offset.X + 50f); +``` +Also notice in the above code snippet, the CompositionObject.StartAnimation() extension method was used to pass in an ExpressionNode instead of an ExpressionAnimation. + +### How to template with ExpressionBuilder +Templating is a big value prop of CompositionAnimations. As a developer, you define a template for an animation that you then can create multiple instances of later when binding to CompositionObjects via StartAnimation(). In some cases, when templating, you want to change the value of parameters you define. For example, changing which Visual you want to reference, or changing the value of a constant. This means that parameters must be able to be referenced later on so their reference or value can be changed; for this reason, parameters are defined with a string property name. + +In the following code snippet, we update the Expression defined earlier: +- Make the Visual we reference a parameter so it can be changed at a later time +- Create a constant parameter instead of hardcoding the value “50f”, so this can easily be changed at a later time + +``` +var additionOffset = ExpressionValues.Constant.CreateScalarConstant("addOffset", 50f); +var expressionNode = ExpressionValues.Reference.CreateVisualReference("visualA", _visualA) + addOffset; +[...] +// If want to change what "visualA" references and value of "addOffset" in the Expression template ... +expressionNode.SetReferenceParameter("visualA", _visualC); +expressionNode.SetScalarParameter("addOffset", 100f); +``` +### E2E Example +Let's walk through the expression used in the PullToAnimate sample to animate Opacity with InteractionTracker +``` +// Expression written with strings +var progressExp = _compositor.CreateExpressionAnimation(); +progressExp.Expression = "Clamp(tracker.Position.Y / tracker.MaxPosition.Y, 0, 1)"; +progressExp.SetReferenceParameter("tracker", _tracker); +visual.StartAnimation("Opacity", progressExp); +``` +Now let's show what this looks like with ExpressionBuilder: + +``` +// Expression written with ExpressionBuilder +var trackerNode = _tracker.GetReference(); +var progressExp = EF.Clamp(trackerNode.Position.Y / trackerNode.MaxPosition.Y, 0, 1); +_propertySet.StartAnimation("progress", progressExp); +``` + +### Things to Note +If you are familiar with how Expressions were built with Strings, there are a few things to note: +- The ternary operator (condition ? ifTrue : ifFalse) is now represented by ExpressionFunctions..Conditional(condition, ifTrue, ifFalse) +- The "And" and "Or" operators (“&&” and “||”) are now represented by the & and | operators. +- If using ExpressionBuilder to create expressions for use with InteractionTracker’s InertiaModifiers, the following extensions methods are available: + + - InteractionTrackerInertiaRestingValue.SetCondition + - InteractionTrackerInertiaRestingValue.SetRestingValue + - InteractionTrackerInertiaMotion.SetCondition + - InteractionTrackerInertiaMotion.SetMotion +- Referencing ExpressionValues and ExpressionFunctions in your code can be a bit verbose, so you can define shortened versions in the Using section of your app: + + ``` + using EF = ExpressionBuilder.ExpressionFunctions; + using EV = ExpressionBuilder.ExpressionValues; + ``` diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery.sln b/Samples/Composition/SampleGallery/cs-winui/SampleGallery.sln new file mode 100644 index 000000000..6d73220da --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery.sln @@ -0,0 +1,89 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32516.85 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExpressionBuilder", "ExpressionBuilder\ExpressionBuilder\ExpressionBuilder.csproj", "{F0903746-A27C-4333-B882-CEA03BCF2B64}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SamplesCommon", "SamplesCommon\SamplesCommon\SamplesCommon.csproj", "{6060E794-A924-4D48-9139-7E9F55685F73}" +EndProject +Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "SampleGalleryPkg", "SampleGallery\SampleGallery (Package)\SampleGalleryPkg.wapproj", "{4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleGallery", "SampleGallery\SampleGallery.csproj", "{34C72C70-0CE0-4089-8C1D-54DCF6076E27}" + ProjectSection(ProjectDependencies) = postProject + {F0903746-A27C-4333-B882-CEA03BCF2B64} = {F0903746-A27C-4333-B882-CEA03BCF2B64} + {6060E794-A924-4D48-9139-7E9F55685F73} = {6060E794-A924-4D48-9139-7E9F55685F73} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|arm64 = Debug|arm64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|arm64 = Release|arm64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Debug|arm64.ActiveCfg = Debug|Any CPU + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Debug|arm64.Build.0 = Debug|Any CPU + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Debug|x64.ActiveCfg = Debug|x64 + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Debug|x64.Build.0 = Debug|x64 + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Debug|x86.ActiveCfg = Debug|x86 + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Debug|x86.Build.0 = Debug|x86 + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Release|arm64.ActiveCfg = Release|Any CPU + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Release|arm64.Build.0 = Release|Any CPU + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Release|x64.ActiveCfg = Release|x64 + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Release|x64.Build.0 = Release|x64 + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Release|x86.ActiveCfg = Release|x86 + {F0903746-A27C-4333-B882-CEA03BCF2B64}.Release|x86.Build.0 = Release|x86 + {6060E794-A924-4D48-9139-7E9F55685F73}.Debug|arm64.ActiveCfg = Debug|Any CPU + {6060E794-A924-4D48-9139-7E9F55685F73}.Debug|arm64.Build.0 = Debug|Any CPU + {6060E794-A924-4D48-9139-7E9F55685F73}.Debug|x64.ActiveCfg = Debug|x64 + {6060E794-A924-4D48-9139-7E9F55685F73}.Debug|x64.Build.0 = Debug|x64 + {6060E794-A924-4D48-9139-7E9F55685F73}.Debug|x86.ActiveCfg = Debug|x86 + {6060E794-A924-4D48-9139-7E9F55685F73}.Debug|x86.Build.0 = Debug|x86 + {6060E794-A924-4D48-9139-7E9F55685F73}.Release|arm64.ActiveCfg = Release|Any CPU + {6060E794-A924-4D48-9139-7E9F55685F73}.Release|arm64.Build.0 = Release|Any CPU + {6060E794-A924-4D48-9139-7E9F55685F73}.Release|x64.ActiveCfg = Release|x64 + {6060E794-A924-4D48-9139-7E9F55685F73}.Release|x64.Build.0 = Release|x64 + {6060E794-A924-4D48-9139-7E9F55685F73}.Release|x86.ActiveCfg = Release|x86 + {6060E794-A924-4D48-9139-7E9F55685F73}.Release|x86.Build.0 = Release|x86 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Debug|arm64.ActiveCfg = Debug|arm64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Debug|arm64.Build.0 = Debug|arm64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Debug|arm64.Deploy.0 = Debug|arm64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Debug|x64.ActiveCfg = Debug|x64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Debug|x64.Build.0 = Debug|x64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Debug|x64.Deploy.0 = Debug|x64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Debug|x86.ActiveCfg = Debug|x86 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Debug|x86.Build.0 = Debug|x86 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Debug|x86.Deploy.0 = Debug|x86 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Release|arm64.ActiveCfg = Release|arm64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Release|arm64.Build.0 = Release|arm64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Release|arm64.Deploy.0 = Release|arm64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Release|x64.ActiveCfg = Release|x64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Release|x64.Build.0 = Release|x64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Release|x64.Deploy.0 = Release|x64 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Release|x86.ActiveCfg = Release|x86 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Release|x86.Build.0 = Release|x86 + {4B74DEDD-A486-4CF2-A591-A3E16B6E9C72}.Release|x86.Deploy.0 = Release|x86 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Debug|arm64.ActiveCfg = Debug|arm64 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Debug|arm64.Build.0 = Debug|arm64 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Debug|x64.ActiveCfg = Debug|x64 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Debug|x64.Build.0 = Debug|x64 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Debug|x86.ActiveCfg = Debug|x86 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Debug|x86.Build.0 = Debug|x86 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Release|arm64.ActiveCfg = Release|arm64 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Release|arm64.Build.0 = Release|arm64 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Release|x64.ActiveCfg = Release|x64 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Release|x64.Build.0 = Release|x64 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Release|x86.ActiveCfg = Release|x86 + {34C72C70-0CE0-4089-8C1D-54DCF6076E27}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {89011714-7888-4C1C-8C40-0FFEE194BBEC} + EndGlobalSection +EndGlobal diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/App.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/App.xaml new file mode 100644 index 000000000..a3b3f2912 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/App.xaml @@ -0,0 +1,849 @@ + + + + + + + + + 720 + 0 + 48 + 25 + 12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridResizing.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridResizing.xaml.cs new file mode 100644 index 000000000..714a2c432 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridResizing.xaml.cs @@ -0,0 +1,375 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using CompositionSampleGallery.Samples.SDK_14393.NineGridResizing; +using CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios; +using SamplesCommon; +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Numerics; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Hosting; +using Windows.Foundation; + +namespace CompositionSampleGallery +{ + public sealed partial class NineGridResizing : SamplePage, INotifyPropertyChanged + { + private readonly Compositor _compositor; + private readonly Visual _backgroundContainer; + private readonly SpriteVisual _ninegridVisual; + private readonly ManagedSurface _ninegridSurface; + private readonly CompositionNineGridBrush _ninegridBrush; + private readonly ObservableCollection _nineGridBrushScenarios; + private INineGridScenario _selectedBrushScenario; + private Vector2 _defaultSize; + private bool _isAnimatedInterpolation; + private static readonly TimeSpan _duration = TimeSpan.FromSeconds(2); + private ValueTimer _valueTimerXSlider; + private ValueTimer _valueTimerYSlider; + private ValueTimer _valueTimerScaleSlider; + + public static string StaticSampleName => "Nine-Grid Resizing"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Resize and Scale a SpriteVisual painted with a NineGridBrush"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869001"; + + public NineGridResizing() + { + this.InitializeComponent(); + + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + // Add page loaded event listener + this.Loaded += NineGridResizing_Loaded; + + // Set data context for data binding + DataContext = this; + + // Sprite visual to be painted + _ninegridVisual = _compositor.CreateSpriteVisual(); + + // Create ninegridbrush and paint on visual; + _ninegridBrush = _compositor.CreateNineGridBrush(); + _ninegridVisual.Brush = _ninegridBrush; + _ninegridSurface = ImageLoader.Instance.LoadFromUri(new Uri("ms-appx:///Assets/Other/RoundedRect.png")); + + // Clip compgrid + var compGrid = ElementCompositionPreview.GetElementVisual(CompGrid); + compGrid.Clip = _compositor.CreateInsetClip(); + + // Scene container to be scaled + _backgroundContainer = ElementCompositionPreview.GetElementVisual(bkgHost); + + // Insert Composition island + ElementCompositionPreview.SetElementChildVisual(ngHost, _ninegridVisual); + + // Instatiate brush scenario list and fill with created brush scenarios + _nineGridBrushScenarios = new ObservableCollection(CreateBrushes(_compositor, _ninegridSurface, _ninegridVisual.Size)); + + // Set default combo box selection to first item + BrushScenarioSelected = _nineGridBrushScenarios.FirstOrDefault(); + + // Value timer initialization for sliders + _valueTimerXSlider = new ValueTimer(); + _valueTimerXSlider.ValueChanged += OnXSliderValueChanged; + + _valueTimerYSlider = new ValueTimer(); + _valueTimerYSlider.ValueChanged += OnYSliderValueChanged; + + _valueTimerScaleSlider = new ValueTimer(); + _valueTimerScaleSlider.ValueChanged += OnScaleSliderValueChanged; + } + + /// + /// Handles property changes for data binding. + /// + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Data binding for animated interpolation toggle button + /// + public bool IsAnimatedInterpolation + { + get { return _isAnimatedInterpolation; } + set + { + _isAnimatedInterpolation = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsAnimatedInterpolation))); + if (_isAnimatedInterpolation) + { + _valueTimerXSlider.IntervalMilliseconds = _valueTimerYSlider.IntervalMilliseconds = _valueTimerScaleSlider.IntervalMilliseconds = 250; + } + else + { + _valueTimerXSlider.IntervalMilliseconds = _valueTimerYSlider.IntervalMilliseconds = _valueTimerScaleSlider.IntervalMilliseconds = 0; + } + } + } + + /// + /// Data binding for selected brush combobox scenario. + /// + public INineGridScenario BrushScenarioSelected + { + get { return _selectedBrushScenario; } + set + { + _selectedBrushScenario = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(BrushScenarioSelected))); + ComboBoxSelectedItemChanged(); + } + } + + /// + /// Instantiate brush scenarios to use on the visual; used in combobox BrushSelection changed event. + /// + private static INineGridScenario[] CreateBrushes(Compositor compositor, ManagedSurface ninegridSurface, Vector2 visualSize) + { + ninegridSurface.Brush.Stretch = CompositionStretch.Fill; + + // Create INineGridScenario array to return. Surface scenario is special because it's used as input to another scenario + var surfaceNineGridScenario = new SurfaceNineGridScenario(compositor, ninegridSurface.Brush, "Source: SurfaceBrush"); + return new INineGridScenario[] + { + new ColorNineGridScenario(compositor, "Source: ColorBrush(hollow)"), + new BorderNineGridScenario(compositor, ninegridSurface.Brush, visualSize, "Source: ColorBrush(w/ content)"), + surfaceNineGridScenario, + new EffectNineGridScenario(compositor, (CompositionNineGridBrush)surfaceNineGridScenario.Brush, "Input to: EffectBrush"), + new MaskNineGridScenario(compositor, ninegridSurface.Brush, "Input to: MaskBrush") + }; + } + + /// + /// Handles selection change event from the XAML BrushSelection ComboBox. + /// Uses the appropriate scenario to update the visual with the correct brush. + /// + private void ComboBoxSelectedItemChanged() + { + // Remove content from the border case when switching brushes + var children = _ninegridVisual.Children; + if (children != null) + { + children.RemoveAll(); + } + + BrushScenarioSelected.Selected(_ninegridVisual); + } + + /// + /// Helper for slider value changes; updates ninegrid visual to correct x/y size with animation. + /// + private void AnimateXYSliderChangeHelper(ValueTimer sender, string direction) + { + // For animated case, animate from the current to the released values using a keyframe animation + if (IsAnimatedInterpolation) + { + var percentSliderValue = (float)sender.Value / 100.0f; + + float defaultSizeValue; + switch (direction) + { + case "x": + defaultSizeValue = _defaultSize.X; + break; + case "y": + defaultSizeValue = _defaultSize.Y; + break; + default: + throw new ArgumentException("Parameter must be 'x' or 'y'", direction); + } + + // Define keyframe animation + var animation = _compositor.CreateScalarKeyFrameAnimation(); + animation.InsertExpressionKeyFrame(1, direction + " * p"); + animation.SetScalarParameter(direction, defaultSizeValue); + animation.SetScalarParameter("p", percentSliderValue); + animation.Duration = _duration; + + // Start animation + _ninegridVisual.StartAnimation("Size." + direction.ToUpper(), animation); + } + } + + /// + /// Called on x slider value changed; calls value timer to start attempt at value change. + /// + private void SizeXSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + if (_valueTimerXSlider != null) + { + _valueTimerXSlider.Restart((float)((Slider)sender).Value); + } + } + + /// + /// Callback for value timer to execute value changed. + /// + private void OnXSliderValueChanged(ValueTimer sender, ValueChangedEventArgs args) + { + if (_valueTimerXSlider.IntervalMilliseconds != 0 && IsAnimatedInterpolation) + { + this.AnimateXYSliderChangeHelper(sender, "x"); + } + else if (!IsAnimatedInterpolation) + { + // For non-animated case, change Size.X based on the percentage value from the slider + var p = (float)args.Value / 100.0f; + var x = _defaultSize.X; + var y = _ninegridVisual.Size.Y; + _ninegridVisual.Size = new Vector2(x * p, y); + } + } + + /// + /// Called on y slider value changed; calls value timer to start attempt at value change. + /// + private void SizeYSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + if (_valueTimerYSlider != null) + { + _valueTimerYSlider.Restart((float)((Slider)sender).Value); + } + } + + /// + /// Callback for value timer to execute value changed. + /// + private void OnYSliderValueChanged(ValueTimer sender, ValueChangedEventArgs args) + { + if (_valueTimerYSlider.IntervalMilliseconds != 0 && IsAnimatedInterpolation) + { + this.AnimateXYSliderChangeHelper(sender, "y"); + } + else if(!IsAnimatedInterpolation) + { + // For non-animated case, change Size.Y based on the percentage value from the slider + var x = _ninegridVisual.Size.X; + var p = (float)args.Value / 100.0f; + var y = _defaultSize.Y; + _ninegridVisual.Size = new Vector2(x, y * p); + } + } + + /// + /// Called on scale slider value changed; calls value timer to start attempt at value change. + /// + private void ScaleSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + if (_valueTimerScaleSlider != null) + { + _valueTimerScaleSlider.Restart((float)((Slider)sender).Value); + } + } + + /// + /// Callback for value timer to execute value changed. + /// + private void OnScaleSliderValueChanged(ValueTimer sender, ValueChangedEventArgs args) + { + if (_valueTimerScaleSlider.IntervalMilliseconds != 0 && IsAnimatedInterpolation) + { + // For animated case, animate from the current to the released values using a keyframe animation + var scaleValue = (float)args.Value; + + // Define keyframe animation + var scaleAnimation = _compositor.CreateVector3KeyFrameAnimation(); + scaleAnimation.InsertKeyFrame(1, new Vector3(scaleValue / 100.0f, scaleValue / 100.0f, 1)); + scaleAnimation.Duration = _duration; + + // Start animations + _ninegridVisual.StartAnimation("Scale", scaleAnimation); + } + else if(!IsAnimatedInterpolation) + { + // For non-animated case, change Scale based on the percentage value from the slider + var s = (float)args.Value; + _ninegridVisual.Scale = new Vector3(s / 100.0f, s / 100.0f, 1); + } + } + + /// + /// Called on reset button click; reses sliders and visual to original values. + /// + private void ResetButton_Click(object sender, RoutedEventArgs e) + { + // Reset values on controls and restore default transforms + _ninegridVisual.Size = _defaultSize; + _ninegridVisual.Scale = new Vector3(1, 1, 0); + _ninegridBrush.SetInsetScales(1.0f); + _backgroundContainer.Scale = new Vector3(1, 1, 0); + SizeXSlider.Value = 100; + SizeYSlider.Value = 100; + ScaleSlider.Value = 100; + IsAnimatedInterpolation = false; + } + + /// + /// Called on page load to do initial setup. + /// + private void NineGridResizing_Loaded(object sender, RoutedEventArgs e) + { + // Set properties for ninegridVisual and backgroundContainer + SetDefaultVisualProperties(); + + LandscapeTrigger.SizeChanged(new Size(this.ActualSize.X, this.ActualSize.Y)); + PortraitTrigger.SizeChanged(new Size(this.ActualSize.X, this.ActualSize.Y)); + this.SizeChanged += BlurPlayground_SizeChanged; + } + + private void BlurPlayground_SizeChanged(object sender, SizeChangedEventArgs e) + { + LandscapeTrigger.SizeChanged(e.NewSize); + PortraitTrigger.SizeChanged(e.NewSize); + } + + /// + /// Set/update properties for the visual and container. + /// + private void SetDefaultVisualProperties() + { + // Compute size and transforms + _defaultSize = new Vector2((float)(Math.Min(ngHost.ActualWidth, ngHost.ActualHeight)) * 0.35f); + + // Specify centerpoint for scale transforms + _backgroundContainer.CenterPoint = new Vector3(bkgHost.RenderSize.ToVector2() / 2, 0); + + _ninegridVisual.Size = new Vector2((float)SizeXSlider.Value / 100.0f * _defaultSize.X, (float)SizeYSlider.Value / 100.0f * _defaultSize.Y); + _ninegridVisual.Offset = new Vector3(ngHost.RenderSize.ToVector2() / 2, 0); + _ninegridVisual.AnchorPoint = new Vector2(0.5f); + } + + /// + /// Recomputes transforms on visual based on updated UIElement size. + /// + private void CompGrid_SizeChanged(object sender, SizeChangedEventArgs e) + { + SetDefaultVisualProperties(); + } + + private void SamplePage_Unloaded(object sender, RoutedEventArgs e) + { + _valueTimerXSlider.Dispose(); + _valueTimerYSlider.Dispose(); + _valueTimerScaleSlider.Dispose(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/BorderNineGridScenario.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/BorderNineGridScenario.cs new file mode 100644 index 000000000..d12bebeae --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/BorderNineGridScenario.cs @@ -0,0 +1,84 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; +using System.Numerics; + +using Windows.UI; + +using Microsoft.UI; +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios +{ + sealed internal class BorderNineGridScenario : INineGridScenario + { + private readonly CompositionNineGridBrush _nineGridBrush; + private readonly SpriteVisual _borderedContent; + private readonly Compositor _compositor; + private readonly string _text; + + public BorderNineGridScenario(Compositor compositor, CompositionSurfaceBrush surfaceBrush, Vector2 hostVisualSize, string text) + { + _nineGridBrush = compositor.CreateNineGridBrush(); + _nineGridBrush.Source = compositor.CreateColorBrush(Colors.Black); + _nineGridBrush.SetInsets(10.0f); + _nineGridBrush.IsCenterHollow = true; + + _borderedContent = compositor.CreateSpriteVisual(); + _borderedContent.Size = hostVisualSize - new Vector2(2 * 10.0f); + _borderedContent.Offset = new Vector3(10.0f, 10.0f, 0); + _borderedContent.Brush = surfaceBrush; + + _compositor = compositor; + _text = text; + } + + public CompositionBrush Brush + { + get + { + return _nineGridBrush; + } + } + + public string Text + { + get + { + return _text; + } + } + public void Selected(SpriteVisual hostVisual) + { + // Set ColorBrush as Source to NineGridBrush with HollowCenter and insert child Content visual + hostVisual.Brush = _nineGridBrush; + hostVisual.Children.InsertAtTop(_borderedContent); + + // Run expression animations to manage the size of borderedContent child visual + + var hostNode = hostVisual.GetReference(); + var nineBrush = _nineGridBrush.GetReference(); + var xSizeExpression = hostNode.Size.X - (nineBrush.LeftInset * nineBrush.LeftInsetScale + nineBrush.RightInset * nineBrush.RightInsetScale); + var ySizeExpression = hostNode.Size.Y - (nineBrush.TopInset * nineBrush.TopInsetScale + nineBrush.BottomInset + nineBrush.BottomInsetScale); + var xOffsetExpression = nineBrush.LeftInset * nineBrush.LeftInsetScale; + var yOffsetExpression = nineBrush.TopInset * nineBrush.TopInsetScale; + + _borderedContent.StartAnimation("Size.X", xSizeExpression); + _borderedContent.StartAnimation("Size.Y", ySizeExpression); + _borderedContent.StartAnimation("Offset.X", xOffsetExpression); + _borderedContent.StartAnimation("Offset.Y", yOffsetExpression); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/ColorNineGridScenario.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/ColorNineGridScenario.cs new file mode 100644 index 000000000..52698a1bc --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/ColorNineGridScenario.cs @@ -0,0 +1,55 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI; +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios +{ + sealed internal class ColorNineGridScenario : INineGridScenario + { + private readonly CompositionNineGridBrush _nineGridBrush; + private readonly string _text; + + public ColorNineGridScenario(Compositor compositor, string text) + { + _nineGridBrush = compositor.CreateNineGridBrush(); + _nineGridBrush.Source = compositor.CreateColorBrush(Colors.Black); + _nineGridBrush.SetInsets(10.0f); + _nineGridBrush.IsCenterHollow = true; + + _text = text; + } + + public CompositionBrush Brush + { + get + { + return _nineGridBrush; + } + } + public string Text + { + get + { + return _text; + } + } + + public void Selected(SpriteVisual hostVisual) + { + hostVisual.Brush = _nineGridBrush; + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/EffectNineGridScenario.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/EffectNineGridScenario.cs new file mode 100644 index 000000000..647cade63 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/EffectNineGridScenario.cs @@ -0,0 +1,59 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.Graphics.Canvas.Effects; +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios +{ + sealed internal class EffectNineGridScenario : INineGridScenario + { + private readonly CompositionEffectBrush _nineGridEffectBrush; + private readonly string _text; + + public EffectNineGridScenario(Compositor compositor, CompositionNineGridBrush sourceNineGridBrush, string text) + { + var saturationEffect = new SaturationEffect + { + Saturation = 0f, + Source = new CompositionEffectSourceParameter("sourceNineGridBrush"), + }; + var saturationFactory = compositor.CreateEffectFactory(saturationEffect); + _nineGridEffectBrush = saturationFactory.CreateBrush(); + _nineGridEffectBrush.SetSourceParameter("sourceNineGridBrush", sourceNineGridBrush); //takes a ninegrid source as input + + _text = text; + } + + public CompositionBrush Brush + { + get + { + return _nineGridEffectBrush; + } + } + public string Text + { + get + { + return _text; + } + } + + public void Selected(SpriteVisual hostVisual) + { + hostVisual.Brush = _nineGridEffectBrush; + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/MaskNineGridScenario.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/MaskNineGridScenario.cs new file mode 100644 index 000000000..4421889de --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/MaskNineGridScenario.cs @@ -0,0 +1,59 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI; +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios +{ + sealed internal class MaskNineGridScenario : INineGridScenario + { + private readonly CompositionMaskBrush _nineGridMaskBrush; + private readonly string _text; + + public MaskNineGridScenario(Compositor compositor, CompositionSurfaceBrush surfaceBrush, string text) + { + CompositionNineGridBrush brush = compositor.CreateNineGridBrush(); + brush.Source = surfaceBrush; + brush.SetInsets(60.0f); + brush.IsCenterHollow = true; + + _nineGridMaskBrush = compositor.CreateMaskBrush(); + _nineGridMaskBrush.Mask = brush; + _nineGridMaskBrush.Source = compositor.CreateColorBrush(Colors.Black); + + _text = text; + } + + public CompositionBrush Brush + { + get + { + return _nineGridMaskBrush; + } + } + public string Text + { + get + { + return _text; + } + } + + public void Selected(SpriteVisual hostVisual) + { + hostVisual.Brush = _nineGridMaskBrush; + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/SurfaceNineGridScenario.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/SurfaceNineGridScenario.cs new file mode 100644 index 000000000..934932d87 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NineGridResizing/NineGridScenarios/SurfaceNineGridScenario.cs @@ -0,0 +1,54 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; + +namespace CompositionSampleGallery.Samples.SDK_14393.NineGridResizing.NineGridScenarios +{ + sealed internal class SurfaceNineGridScenario : INineGridScenario + { + private readonly CompositionNineGridBrush _nineGridBrush; + private readonly string _text; + + public SurfaceNineGridScenario(Compositor compositor, CompositionSurfaceBrush surfaceBrush, string text) + { + _nineGridBrush = compositor.CreateNineGridBrush(); + _nineGridBrush.Source = surfaceBrush; + _nineGridBrush.SetInsets(60.0f); + + _text = text; + } + + public CompositionBrush Brush + { + get + { + return _nineGridBrush; + } + } + + public string Text + { + get + { + return _text; + } + } + + public void Selected(SpriteVisual hostVisual) + { + hostVisual.Brush = _nineGridBrush; + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NowPlaying/NowPlaying.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NowPlaying/NowPlaying.xaml new file mode 100644 index 000000000..012b03213 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NowPlaying/NowPlaying.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NowPlaying/NowPlaying.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NowPlaying/NowPlaying.xaml.cs new file mode 100644 index 000000000..ea1c5a8c3 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/NowPlaying/NowPlaying.xaml.cs @@ -0,0 +1,255 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; +using System; +using System.Numerics; + +using Windows.Foundation; +using Windows.Graphics.Effects; + +using Microsoft.Graphics.Canvas.Effects; +using Microsoft.Graphics.Canvas.Text; +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Text; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; + +namespace CompositionSampleGallery +{ + public sealed partial class NowPlaying : SamplePage + { + private Compositor _compositor; + private SpriteVisual _textSprite; + + public NowPlaying() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Now Playing"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates the use of image lighting with BackdropBrush with a HardLight blend to create an interesting dynamic visual effect."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869002"; + + private void Grid_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + // Get the current compositor + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + // Set the artist image + ArtistImage.Source = new Uri("ms-appx:///Assets/Landscapes/Landscape-7.jpg"); + + // Disable the placeholder image + ArtistImage.PlaceholderDelay = TimeSpan.MinValue; + + // Bounds of the window, used for positioning lights + //Vector2 sizeWindowBounds = new Vector2((float)Window.Current.Bounds.Width, (float)Window.Current.Bounds.Height); + Vector2 sizeWindowBounds = new Vector2(this.ActualSize.X, this.ActualSize.Y); + + // Setup the image and lighting effect + CreateImageAndLights(sizeWindowBounds); + + // Setup text with the hard light blending over the drawn content + CreateTextAndBlendEffect(sizeWindowBounds); + } + + private void CreateTextAndBlendEffect(Vector2 sizeLightBounds) + { + // + // Crete the effect graph, doing a hard light blend of the text over the + // content already drawn into the backbuffer + // + + IGraphicsEffect graphicsEffect = new BlendEffect() + { + Mode = BlendEffectMode.HardLight, + Foreground = new CompositionEffectSourceParameter("Text"), + Background = new CompositionEffectSourceParameter("Destination"), + }; + + CompositionEffectFactory effectFactory = _compositor.CreateEffectFactory(graphicsEffect, null); + CompositionEffectBrush brush = effectFactory.CreateBrush(); + + // Bind the destination brush + brush.SetSourceParameter("Destination", _compositor.CreateBackdropBrush()); + + + // + // Create the text surface which we'll scroll over the image with the lighting effect + // + + // Pick a nice size font depending on target size + const float maxFontSize = 72; + const float scaleFactor = 12; + float fontSize = Math.Min(sizeLightBounds.X / scaleFactor, maxFontSize); + + // Create the text format description, then the surface + CanvasTextFormat textFormat = new CanvasTextFormat + { + FontFamily = "Segoe UI", + FontSize = fontSize, + FontWeight = FontWeights.Bold, + WordWrapping = CanvasWordWrapping.WholeWord, + HorizontalAlignment = CanvasHorizontalAlignment.Center, + VerticalAlignment = CanvasVerticalAlignment.Center + }; + + string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec efficitur, eros sit amet laoreet scelerisque, " + + "nunc odio ultricies metus, ut consectetur nulla massa eu nibh.Phasellus in lorem id nunc euismod tempus.Phasellus et nulla non turpis tempor blandit ut eget turpis." + + "Phasellus ac ornare elit, ut scelerisque dolor. Nam vel finibus lorem. Aenean malesuada pulvinar eros id ornare. Fusce blandit ante eget dolor efficitur suscipit." + + "Phasellus ac lacus nibh. Aenean eget blandit risus, in lacinia mi. Proin fermentum ante eros, non sollicitudin mi pretium eu. Curabitur suscipit lectus arcu, eget" + + "pretium quam sagittis non. Mauris purus mauris, condimentum nec laoreet sit amet, imperdiet sit amet nisi. Sed interdum, urna et aliquam porta, elit velit tincidunt orci," + + "vitae vestibulum risus lacus at nulla.Phasellus sapien ipsum, pellentesque varius enim nec, iaculis aliquet enim. Nulla id dapibus ante. Sed hendrerit sagittis leo, commodo" + + "fringilla ligula rutrum ut. Nullam sodales, ex ut pellentesque scelerisque, sapien nulla mattis lectus, vel ullamcorper leo enim ac mi.Sed consectetur vitae velit in consequat." + + "Pellentesque ac condimentum justo, at feugiat nulla. Sed ut congue neque. Nam gravida quam ac urna porttitor, ut bibendum ante mattis.Cras viverra cursus sapien, et sollicitudin" + + "risus fringilla eget. Nulla facilisi. Duis pellentesque scelerisque nisi, facilisis malesuada massa gravida et. Vestibulum ac leo sed orci tincidunt feugiat.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc id leo vestibulum, vulputate ipsum sit amet, scelerisque velit. Curabitur imperdiet justo et tortor dignissim, sit amet volutpat sem ullamcorper. Nam mollis ullamcorper tellus vitae convallis. Aliquam eleifend elit nec tincidunt pharetra. Aliquam turpis eros, mollis et nunc quis, porta molestie justo. Etiam ultrices sem non turpis imperdiet dictum.Aliquam molestie elit in urna sodales, nec luctus dui laoreet.Curabitur molestie risus vel ligula efficitur, non fringilla urna iaculis.Curabitur neque tortor, facilisis quis dictum facilisis, facilisis et ante. Sed nisl erat, semper vitae efficitur ut, congue vitae quam. Ut auctor lacus sit amet varius placerat.Sed ac tellus tempus, ultricies est quis, tempor felis.Nulla vel faucibus elit, eu tincidunt eros. Nulla blandit id nisl ut porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam suscipit tellus a mattis pulvinar. Sed et libero vel ligula elementum suscipit.Ut elementum libero at sagittis pharetra. Fusce ultrices odio sapien, a posuere est consectetur ut."; + + // Make the surface twice the height to give us room to scroll + Vector2 surfaceSize = new Vector2(sizeLightBounds.X, 2f * sizeLightBounds.Y); + ManagedSurface textSurface = ImageLoader.Instance.LoadText(text, surfaceSize.ToSize(), + textFormat, Colors.White, Colors.Transparent); + brush.SetSourceParameter("Text", textSurface.Brush); + + // Create the sprite and parent it to the panel with the clip + _textSprite = _compositor.CreateSpriteVisual(); + _textSprite.Size = surfaceSize; + _textSprite.Brush = brush; + + ElementCompositionPreview.SetElementChildVisual(MyPanel, _textSprite); + + // Lastly, setup the slow scrolling animation of the text + LinearEasingFunction linear = _compositor.CreateLinearEasingFunction(); + Vector3KeyFrameAnimation offsetAnimation = _compositor.CreateVector3KeyFrameAnimation(); + offsetAnimation.InsertKeyFrame(0f, new Vector3(0, 0, 0), linear); + offsetAnimation.InsertKeyFrame(1f, new Vector3(0, -_textSprite.Size.Y * .5f, 0), linear); + offsetAnimation.Duration = TimeSpan.FromMilliseconds(30000); + offsetAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + _textSprite.StartAnimation("Offset", offsetAnimation); + } + + private void CreateImageAndLights(Vector2 sizeLightBounds) + { + // + // Image and effect setup + // + + // Create the effect graph. We will combine the desaturated image with two diffuse lights + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.Add, + Sources = + { + new SaturationEffect() + { + Saturation = 0, + Source = new CompositionEffectSourceParameter("ImageSource") + }, + + new PointDiffuseEffect() + { + Name = "Light1", + DiffuseAmount = 1f, + }, + + new PointDiffuseEffect() + { + Name = "Light2", + DiffuseAmount = 1f, + }, + } + }; + + // Create the effect factory, we're going to animate the light positions and colors + CompositionEffectFactory effectFactory = _compositor.CreateEffectFactory(graphicsEffect, + new[] { "Light1.LightPosition", "Light1.LightColor", + "Light2.LightPosition", "Light2.LightColor", }); + + // Create the effect brush and bind the normal map + CompositionEffectBrush brush = effectFactory.CreateBrush(); + + // Update the CompositionImage to use the custom effect brush + ArtistImage.Brush = brush; + + + // + // Animation setup + // + + // Setup the first light's position, top and to the left in general + LinearEasingFunction linear = _compositor.CreateLinearEasingFunction(); + Vector3KeyFrameAnimation positionAnimation = _compositor.CreateVector3KeyFrameAnimation(); + positionAnimation.InsertKeyFrame(0f, new Vector3(0f, 0f, 300f), linear); + positionAnimation.InsertKeyFrame(.33f, new Vector3(sizeLightBounds.X * .5f, sizeLightBounds.Y * .5f, 100f), linear); + positionAnimation.InsertKeyFrame(.66f, new Vector3(sizeLightBounds.X * .25f, sizeLightBounds.Y * .95f, 100f), linear); + positionAnimation.InsertKeyFrame(1f, new Vector3(0f, 0f, 300f), linear); + positionAnimation.Duration = TimeSpan.FromMilliseconds(20000); + positionAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + brush.StartAnimation("Light1.LightPosition", positionAnimation); + + + // Setup the first light's color animation, cycling through some brighter tones + ColorKeyFrameAnimation colorAnimation = _compositor.CreateColorKeyFrameAnimation(); + colorAnimation.InsertKeyFrame(0f, Colors.Orange); + colorAnimation.InsertKeyFrame(.2f, Colors.Orange); + colorAnimation.InsertKeyFrame(.3f, Colors.Red); + colorAnimation.InsertKeyFrame(.5f, Colors.Red); + colorAnimation.InsertKeyFrame(.6f, Colors.Yellow); + colorAnimation.InsertKeyFrame(.8f, Colors.Yellow); + colorAnimation.InsertKeyFrame(.9f, Colors.Orange); + colorAnimation.InsertKeyFrame(1f, Colors.Orange); + colorAnimation.Duration = TimeSpan.FromMilliseconds(20000); + colorAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + brush.StartAnimation("Light1.LightColor", colorAnimation); + + + // Setup the second light's position, down and to the right in general + positionAnimation = _compositor.CreateVector3KeyFrameAnimation(); + positionAnimation.InsertKeyFrame(0f, new Vector3(sizeLightBounds.X, sizeLightBounds.Y, 200f), linear); + positionAnimation.InsertKeyFrame(.33f, new Vector3(sizeLightBounds.X * .7f, sizeLightBounds.Y * .9f, 300f), linear); + positionAnimation.InsertKeyFrame(.66f, new Vector3(sizeLightBounds.X * .95f, sizeLightBounds.Y * .95f, 100f), linear); + positionAnimation.InsertKeyFrame(1f, new Vector3(sizeLightBounds.X, sizeLightBounds.Y, 200f), linear); + positionAnimation.Duration = TimeSpan.FromMilliseconds(20000); + positionAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + brush.StartAnimation("Light2.LightPosition", positionAnimation); + + // Setup the second light's color animation, cycling through some darker tones + colorAnimation = _compositor.CreateColorKeyFrameAnimation(); + colorAnimation.InsertKeyFrame(0f, Colors.Blue); + colorAnimation.InsertKeyFrame(.2f, Colors.Blue); + colorAnimation.InsertKeyFrame(.3f, Colors.DarkGreen); + colorAnimation.InsertKeyFrame(.5f, Colors.DarkGreen); + colorAnimation.InsertKeyFrame(.6f, Colors.DarkBlue); + colorAnimation.InsertKeyFrame(.8f, Colors.DarkBlue); + colorAnimation.InsertKeyFrame(.9f, Colors.Blue); + colorAnimation.InsertKeyFrame(1f, Colors.Blue); + colorAnimation.Duration = TimeSpan.FromMilliseconds(20000); + colorAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + brush.StartAnimation("Light2.LightColor", colorAnimation); + } + + private void MyPanel_SizeChanged(object sender, SizeChangedEventArgs e) + { + MyClip.Rect = new Rect(0d, 0d, e.NewSize.Width, e.NewSize.Height); + + // Resize the text layer if available + if (_textSprite != null) + { + _textSprite.Size = new Vector2((float)e.NewSize.Width, (float)e.NewSize.Height * 2f); + } + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/ImagePopupViewer.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/ImagePopupViewer.xaml new file mode 100644 index 000000000..92155b784 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/ImagePopupViewer.xaml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/ImagePopupViewer.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/ImagePopupViewer.xaml.cs new file mode 100644 index 000000000..e87673931 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/ImagePopupViewer.xaml.cs @@ -0,0 +1,375 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; +using System; +using System.Collections.Generic; +using System.Numerics; + +using Windows.Foundation; +using Windows.Graphics.DirectX; +using Windows.Graphics.Display; +using Windows.Graphics.Effects; +using Windows.UI; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Media; +using Microsoft.Graphics.Canvas; +using Microsoft.Graphics.Canvas.Effects; +using Microsoft.Graphics.Canvas.UI.Composition; + +namespace CompositionSampleGallery +{ + public sealed partial class ImagePopupViewer : UserControl + { + Compositor _compositor; + CompositionEffectBrush _crossFadeBrush; + CompositionSurfaceBrush _previousSurfaceBrush; + CompositionScopedBatch _crossFadeBatch; + ConnectedTransition _transition; + string _initialPhoto; + static ImagePopupViewer _viewerInstance; + static Grid _hostGrid; + Func _imageUriGetterFunc; + + /// + /// Private constructor as Show() is responsible for creating an instance + /// + private ImagePopupViewer(Func photoGetter, string initialPhoto) + { + this.InitializeComponent(); + + _imageUriGetterFunc = photoGetter; + _transition = new ConnectedTransition(); + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + this.Loaded += ImagePopupViewer_Loaded; + this.Unloaded += ImagePopupViewer_Unloaded; + + // Bring the selected item into view + _initialPhoto = initialPhoto; + + // Hide until the content is available + this.Opacity = 0; + BackgroundImage.ImageOpened += BackgroundImage_FirstOpened; + + // Disable the placeholder as we'll be using a transition + PrimaryImage.PlaceholderDelay = TimeSpan.FromMilliseconds(-1); + BackgroundImage.PlaceholderDelay = TimeSpan.FromMilliseconds(-1); + BackgroundImage.LoadTimeEffectHandler = SampleImageColor; + BackgroundImage.SharedSurface = true; + + // Create a crossfade brush to animate image transitions + IGraphicsEffect graphicsEffect = new ArithmeticCompositeEffect() + { + Name = "CrossFade", + Source1Amount = 0, + Source2Amount = 1, + MultiplyAmount = 0, + Source1 = new CompositionEffectSourceParameter("ImageSource"), + Source2 = new CompositionEffectSourceParameter("ImageSource2"), + }; + + CompositionEffectFactory factory = _compositor.CreateEffectFactory(graphicsEffect, new[] { "CrossFade.Source1Amount", "CrossFade.Source2Amount" }); + _crossFadeBrush = factory.CreateBrush(); + + } + + private void BackgroundImage_FirstOpened(object sender, RoutedEventArgs e) + { + // Image loaded, let's show the content + this.Opacity = 1; + + // Show the content now that we should have something. + ScalarKeyFrameAnimation fadeInAnimation = _compositor.CreateScalarKeyFrameAnimation(); + fadeInAnimation.InsertKeyFrame(0, 0); + fadeInAnimation.InsertKeyFrame(1, 1); + fadeInAnimation.Duration = TimeSpan.FromMilliseconds(1000); + BackgroundImage.SpriteVisual.StartAnimation("Opacity", fadeInAnimation); + ElementCompositionPreview.GetElementVisual(ImageList).StartAnimation("Opacity", fadeInAnimation); + + // Start a slow UV scale to create movement in the background image + Vector2KeyFrameAnimation scaleAnimation = _compositor.CreateVector2KeyFrameAnimation(); + scaleAnimation.InsertKeyFrame(0, new Vector2(1.1f, 1.1f)); + scaleAnimation.InsertKeyFrame(.5f, new Vector2(2.0f, 2.0f)); + scaleAnimation.InsertKeyFrame(1, new Vector2(1.1f, 1.1f)); + scaleAnimation.Duration = TimeSpan.FromMilliseconds(40000); + scaleAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + CompositionDrawingSurface surface = (CompositionDrawingSurface)BackgroundImage.SurfaceBrush.Surface; + BackgroundImage.SurfaceBrush.CenterPoint = new Vector2((float)surface.Size.Width, (float)surface.Size.Height) * .5f; + BackgroundImage.SurfaceBrush.StartAnimation("Scale", scaleAnimation); + + // Start the animation of the cross-fade brush so they're in sync + _previousSurfaceBrush = _compositor.CreateSurfaceBrush(); + _previousSurfaceBrush.StartAnimation("Scale", scaleAnimation); + + BackgroundImage.ImageOpened -= BackgroundImage_FirstOpened; + } + + private void BackgroundImage_ImageChanged(object sender, RoutedEventArgs e) + { + if (_crossFadeBatch == null) + { + TimeSpan duration = TimeSpan.FromMilliseconds(1000); + + // Create the animations for cross-fading + ScalarKeyFrameAnimation fadeInAnimation = _compositor.CreateScalarKeyFrameAnimation(); + fadeInAnimation.InsertKeyFrame(0, 0); + fadeInAnimation.InsertKeyFrame(1, 1); + fadeInAnimation.Duration = duration; + + ScalarKeyFrameAnimation fadeOutAnimation = _compositor.CreateScalarKeyFrameAnimation(); + fadeOutAnimation.InsertKeyFrame(0, 1); + fadeOutAnimation.InsertKeyFrame(1, 0); + fadeOutAnimation.Duration = duration; + + // Create a batch object so we can cleanup when the cross-fade completes. + _crossFadeBatch = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + + // Set the sources + _crossFadeBrush.SetSourceParameter("ImageSource", BackgroundImage.SurfaceBrush); + _crossFadeBrush.SetSourceParameter("ImageSource2", _previousSurfaceBrush); + + // Animate the source amounts to fade between + _crossFadeBrush.StartAnimation("CrossFade.Source1Amount", fadeInAnimation); + _crossFadeBrush.StartAnimation("CrossFade.Source2Amount", fadeOutAnimation); + + // Update the image to use the cross fade brush + BackgroundImage.Brush = _crossFadeBrush; + + _crossFadeBatch.Completed += Batch_CrossFadeCompleted; + _crossFadeBatch.End(); + } + + // Unhook the handler + BackgroundImage.ImageOpened -= BackgroundImage_ImageChanged; + } + + private void Batch_CrossFadeCompleted(object sender, CompositionBatchCompletedEventArgs args) + { + BackgroundImage.Brush = BackgroundImage.SurfaceBrush; + + // Dispose the image + ((CompositionDrawingSurface)_previousSurfaceBrush.Surface).Dispose(); + _previousSurfaceBrush.Surface = null; + + // Clear out the batch + _crossFadeBatch = null; + } + + private void ImagePopupViewer_Loaded(object sender, RoutedEventArgs e) + { + // Update the sources + BackgroundImage.Source = new Uri(_initialPhoto); + PrimaryImage.Source = new Uri(_initialPhoto); + + // Ensure the source thumbnail is in view + ImageList.ScrollIntoView(_initialPhoto); + } + + private void ImagePopupViewer_Unloaded(object sender, RoutedEventArgs e) + { + if (_hostGrid != null) + { + ElementCompositionPreview.SetElementChildVisual(_hostGrid.Children[0], null); + _hostGrid.Children.Remove(_viewerInstance); + _hostGrid = null; + } + _viewerInstance = null; + } + + public object ItemsSource + { + get { return ImageList.ItemsSource; } + set { ImageList.ItemsSource = value; } + } + + + private Color ExtractPredominantColor(Color[] colors, Size size) + { + Dictionary dict = new Dictionary(); + uint maxColor = 0xff000000; + + // Take a small sampling of the decoded pixels, looking for the most common color + int pixelSamples = Math.Min(2000, colors.Length); + int skipPixels = colors.Length / pixelSamples; + + for (int pixel = colors.Length - 1; pixel >= 0; pixel -= skipPixels) + { + Color c = colors[pixel]; + + // Quantize the colors to bucket the groupings better + c.R -= (byte)(c.R % 10); + c.G -= (byte)(c.G % 10); + c.B -= (byte)(c.B % 10); + + // Determine the saturation and value for the color + int max = Math.Max(c.R, Math.Max(c.G, c.B)); + int min = Math.Min(c.R, Math.Min(c.G, c.B)); + int saturation = (int)(((max == 0) ? 0 : (1f - (1f * min / max))) * 255); + int value = (int)((max / 255f) * 255); + + if (c.A > 0) + { + uint color = (uint)((255 << 24) | (c.R << 16) | (c.G << 8) | (c.B << 0)); + + // Weigh saturated, high value colors more heavily + int weight = saturation + value; + + if (dict.ContainsKey(color)) + { + dict[color] += weight; + } + else + { + dict.Add(color, weight); + } + } + } + + // Determine the predominant color + int maxValue = 0; + foreach (KeyValuePair pair in dict) + { + if (pair.Value > maxValue) + { + maxColor = pair.Key; + maxValue = pair.Value; + } + } + + // Convert to the final color value + return Color.FromArgb((byte)(maxColor >> 24), (byte)(maxColor >> 16), + (byte)(maxColor >> 8), (byte)(maxColor >> 0)); + } + + private void SampleImageColor(CompositionDrawingSurface surface, CanvasBitmap bitmap, CompositionGraphicsDevice device) + { + // Extract the color to tint the blur with + Color predominantColor = ExtractPredominantColor(bitmap.GetPixelColors(), bitmap.Size); + + // Create a heavily blurred version of the image + GaussianBlurEffect blurEffect = new GaussianBlurEffect() + { + Source = bitmap, + BlurAmount = 20.0f + }; + + Size size = surface.Size; + using (var ds = CanvasComposition.CreateDrawingSession(surface)) + { + Rect destination = new Rect(0, 0, size.Width, size.Height); + ds.FillRectangle(destination, predominantColor); + ds.DrawImage(blurEffect, destination, new Rect(0, 0, size.Width, size.Height), .6f); + } + } + + private void ListView_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) + { + CompositionImage image = args.ItemContainer.ContentTemplateRoot.GetFirstDescendantOfType(); + Uri imageSource = _imageUriGetterFunc(args.Item, false); + + // Set the URI source, and size to the large target image + image.Source = imageSource; + } + + private void ImageList_ItemClick(object sender, ItemClickEventArgs e) + { + ListViewItem item = (ListViewItem)ImageList.ContainerFromItem(e.ClickedItem); + + // If we near the edges of the list, scroll more into view + GeneralTransform coordinate = item.TransformToVisual(ImageList); + Point position = coordinate.TransformPoint(new Point(0, 0)); + + if ((position.X + item.ActualWidth >= ImageList.ActualWidth) || + (position.X - item.ActualWidth <= 0)) + { + double delta = position.X - item.ActualWidth <= 0 ? -item.ActualWidth : item.ActualWidth; + delta *= 1.5; + + ScrollViewer scroller = ImageList.GetFirstDescendantOfType(); + scroller.ChangeView(scroller.HorizontalOffset + delta, null, null); + } + } + + private void Grid_SizeChanged(object sender, SizeChangedEventArgs e) + { + GridClip.Rect = new Rect(0, 0, e.NewSize.Width, e.NewSize.Height); + } + + private void ImageList_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (ImageList.SelectedItem != null) + { + ListViewItem item = (ListViewItem)ImageList.ContainerFromItem(ImageList.SelectedItem); + Uri imageSource = _imageUriGetterFunc(item.Content, true); + + if (_crossFadeBatch == null) + { + // Save the previous image for a cross-fade + _previousSurfaceBrush.Surface = BackgroundImage.SurfaceBrush.Surface; + _previousSurfaceBrush.CenterPoint = BackgroundImage.SurfaceBrush.CenterPoint; + _previousSurfaceBrush.Stretch = BackgroundImage.SurfaceBrush.Stretch; + + // Load the new background image + BackgroundImage.ImageOpened += BackgroundImage_ImageChanged; + } + + // Update the images + BackgroundImage.Source = imageSource; + PrimaryImage.Source = imageSource; + + if (!_transition.Completed) + { + _transition.Cancel(); + } + + // Kick off a connected animation to animate from it's current position to it's new location + CompositionImage image = VisualTreeHelperExtensions.GetFirstDescendantOfType(item); + _transition.Initialize(this, image, null); + _transition.Start(this, PrimaryImage, null, null); + } + } + + internal static void Show(string photo, object itemSource, Func photoGetter, Thickness margin, UIElement page) + { + if (_viewerInstance != null) + { + throw new InvalidOperationException("Already displaying a photoviewer popup"); + } + + _hostGrid = VisualTreeHelperExtensions.GetFirstDescendantOfType(page); + + if (_hostGrid != null) + { + _viewerInstance = new ImagePopupViewer(photoGetter, photo); + + // dialog needs to span all rows in the grid + _viewerInstance.SetValue(Grid.RowSpanProperty, (_hostGrid.RowDefinitions.Count > 0 ? _hostGrid.RowDefinitions.Count : 1)); + _viewerInstance.SetValue(Grid.ColumnSpanProperty, (_hostGrid.ColumnDefinitions.Count > 0 ? _hostGrid.ColumnDefinitions.Count : 1)); + + _hostGrid.Children.Add(_viewerInstance); + + _viewerInstance.ItemsSource = itemSource; + } + else + { + throw new ArgumentException("can't find a top level grid"); + } + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/PhotoViewer.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/PhotoViewer.xaml new file mode 100644 index 000000000..e0881a662 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/PhotoViewer.xaml @@ -0,0 +1,16 @@ + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/PhotoViewer.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/PhotoViewer.xaml.cs new file mode 100644 index 000000000..8b77be7f5 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PhotoViewer/PhotoViewer.xaml.cs @@ -0,0 +1,61 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; + +using Microsoft.UI.Xaml; +using CompositionSampleGallery.Shared; + +namespace CompositionSampleGallery +{ + public sealed partial class PhotoViewer : SamplePage + { + public PhotoViewer() + { + Model = new LocalDataSource(); + this.InitializeComponent(); + } + + public static string StaticSampleName => "Photo Popup Viewer"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use ListView and Effects to create a dynamic basic photo viewing experience. Click on any thumbnail and notice the smooth transition and color shifting in the blurred background."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761180"; + + public LocalDataSource Model { set; get; } + + private void LoadData() + { + Func getImageForThumbnail = (o, large) => + { + return new Uri(((Thumbnail)o).ImageUrl); + }; + + ImagePopupViewer.Show(Model.Nature[0].ImageUrl, Model.Nature, getImageForThumbnail, + new Thickness + { + Left = 50, + Top = 50, + Right = 50, + Bottom = 50 + }, + this); + } + + private void SamplePage_Loading(Microsoft.UI.Xaml.FrameworkElement sender, object args) + { + LoadData(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PullToAnimate/PullToAnimate.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PullToAnimate/PullToAnimate.cs new file mode 100644 index 000000000..62968f8ef --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PullToAnimate/PullToAnimate.cs @@ -0,0 +1,423 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; +using Microsoft.Graphics.Canvas.Effects; +using System; +using System.Numerics; + +using Windows.Foundation; +using Windows.UI.ViewManagement; + +using Microsoft.UI.Composition; +using Microsoft.UI.Composition.Interactions; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Input; + +using EF = ExpressionBuilder.ExpressionFunctions; + +namespace CompositionSampleGallery +{ + public sealed partial class PullToAnimate : SamplePage + { + public PullToAnimate() + { + this.InitializeComponent(); + SizeChanged += PullToAnimate_SizeChanged; + } + + private void PullToAnimate_SizeChanged(object sender, SizeChangedEventArgs e) + { + if(_blurredBackgroundImageVisual != null && _backgroundVisualDimmer != null) + { + _blurredBackgroundImageVisual.Size = new Vector2((float)Root.ActualWidth, (float)Root.ActualHeight); + _backgroundVisualDimmer.Size = new Vector2((float)Root.ActualWidth, (float)Root.ActualHeight); + } + } + + public static string StaticSampleName => "Pull To Animate"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use InteractionTracker to create custom resting points with Animations. Pan with Touch or Precision Touchpad, or hit the toggle button to animate."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/?LinkId=761166"; + + private void Page_Loaded(object sender, RoutedEventArgs e) + { + _backgroundImageVisual = ElementCompositionPreview.GetElementVisual(BackgroundImage); + _weatherLayerVisual = ElementCompositionPreview.GetElementVisual(WeatherLayer); + _todoLayerVisual = ElementCompositionPreview.GetElementVisual(ToDoLayer); + _calendarIconVisual = ElementCompositionPreview.GetElementVisual(CalendarIcon); + _backgroundVisual = ElementCompositionPreview.GetElementVisual(Root); + + _compositor = _backgroundImageVisual.Compositor; + _backgroundVisual.Clip = _compositor.CreateInsetClip(0, 0, 0, 0); + + + _backgroundImageVisual.Size = new Vector2((float)Root.ActualWidth, (float)Root.ActualHeight); + + + _backgroundImageVisual.CenterPoint = new Vector3( + (float)Root.ActualWidth / 2.0f, + (float)Root.ActualHeight / 2.0f, + 0); + + _calendarIconVisual.CenterPoint = new Vector3( + (float)CalendarIcon.ActualWidth / 2.0f, + (float)CalendarIcon.ActualHeight / 2.0f, + 0); + + _weatherLayerVisual.CenterPoint = new Vector3( + (float)WeatherLayer.ActualWidth / 2.0f, + -(float)WeatherLayer.ActualHeight, + 0); + + _todoLayerVisual.CenterPoint = new Vector3( + (float)ToDoLayer.ActualWidth / 2.0f, + (float)ToDoLayer.ActualHeight / 2.0f, + 0); + + _backgroundVisual.Size = new Vector2((float)Root.ActualWidth, (float)Root.ActualHeight); + + _backgroundVisualDimmer = _compositor.CreateSpriteVisual(); + _backgroundVisualDimmer.Brush = _compositor.CreateColorBrush(Microsoft.UI.Colors.Black); + _backgroundVisualDimmer.Size = _backgroundVisual.Size; + + ElementCompositionPreview.SetElementChildVisual(BackgroundImageOverlay, _backgroundVisualDimmer); + + + // + // Store the state 1 and 2 values. We'll blend between them later. + // + + _visualState1 = new VisualState + { + BackgroundBlurAmount = 1.0f, + BackgroundScale = new Vector3(1.0f, 1.0f, 1.0f), + CalendarIconOffset = new Vector3(0, -50, 0), + CalendarIconScale = new Vector3(0.7f, 0.7f, 1.0f), + ToDoLayerBlurAmount = 0.3f, + ToDoLayerOpacity = 0.0f, + ToDoLayerScale = new Vector3(0.8f, 0.8f, 1.0f), + WeatherLayerBlurAmount = 0.0f, + WeatherLayerOpacity = 3.0f, + WeatherLayerScale = new Vector3(1.0f), + }; + + _visualState2 = new VisualState + { + BackgroundBlurAmount = 9.0f, + BackgroundScale = new Vector3(1.11f, 1.11f, 1.0f), + CalendarIconOffset = new Vector3(), + CalendarIconScale = new Vector3(1.0f), + ToDoLayerBlurAmount = 0.0f, + ToDoLayerOpacity = 1.0f, + ToDoLayerScale = new Vector3(1.0f), + WeatherLayerBlurAmount = 0.3f, + WeatherLayerOpacity = 0.0f, + WeatherLayerScale = new Vector3(0.8f, 0.8f, 1.0f), + }; + + // + // Store the interaction "progress" into a property set. + // We'll reference it later in all of the expressions. + // + + _propertySet = _compositor.CreatePropertySet(); + _propertySet.InsertScalar("progress", 0.0f); + + + // + // Create a "canned" key frame animation that we'll use to + // play when the toggle button is pressed. + // + + _cannedProgressAnimation = _compositor.CreateVector3KeyFrameAnimation(); + _cannedProgressAnimation.Duration = TimeSpan.FromMilliseconds(1500); + + + InitializeBlurVisuals(); + + ConfigureInteractionTracker(); + + ConfigureRestingPoints(); + + ConfigureTransitionAnimations(); + + TransitionToState1(false); + } + + private void InitializeBlurVisuals() + { + var blurEffect = new GaussianBlurEffect() + { + Name = "blur", + BlurAmount = 0.0f, + BorderMode = EffectBorderMode.Hard, + Optimization = EffectOptimization.Balanced, + Source = new CompositionEffectSourceParameter("source") + }; + + var blurBrush = _compositor.CreateEffectFactory(blurEffect, + new[] { "blur.BlurAmount" }) + .CreateBrush(); + + blurBrush.SetSourceParameter("source", _compositor.CreateBackdropBrush()); + + _blurredBackgroundImageVisual = _compositor.CreateSpriteVisual(); + _blurredBackgroundImageVisual.Brush = blurBrush; + _blurredBackgroundImageVisual.Size = new Vector2((float)Root.ActualWidth, (float)Root.ActualHeight); + + ElementCompositionPreview.SetElementChildVisual(BackgroundImageBlurPanel, _blurredBackgroundImageVisual); + } + + private void ToggleState_Click(object sender, RoutedEventArgs e) + { + bool animate = true; + + if (_isState1) + { + TransitionToState2(animate); + } + else + { + TransitionToState1(animate); + } + } + + private void TransitionToState1(bool animate) + { + var minPosition = new Vector3(); + + if (animate) + { + _cannedProgressAnimation.InsertKeyFrame(1.0f, minPosition); + + _tracker.TryUpdatePositionWithAnimation(_cannedProgressAnimation); + } + else + { + _tracker.TryUpdatePosition(minPosition); + } + + _isState1 = true; + } + + + private void TransitionToState2(bool animate) + { + Vector3 maxPosition = new Vector3(0, _tracker.MaxPosition.Y, 0); + + if (animate) + { + _cannedProgressAnimation.InsertKeyFrame(1.0f, maxPosition); + + _tracker.TryUpdatePositionWithAnimation(_cannedProgressAnimation); + } + else + { + _tracker.TryUpdatePosition(maxPosition); + } + + _isState1 = false; + + } + + private void ConfigureInteractionTracker() + { + _tracker = InteractionTracker.Create(_compositor); + _tracker.MaxPosition = new Vector3(0, _backgroundImageVisual.Size.Y * 0.5f, 0); + _tracker.MinPosition = new Vector3(); + + _interactionSource = VisualInteractionSource.Create(_backgroundVisual); + _interactionSource.PositionYSourceMode = InteractionSourceMode.EnabledWithInertia; + _interactionSource.ManipulationRedirectionMode = VisualInteractionSourceRedirectionMode.CapableTouchpadAndPointerWheel; + _tracker.InteractionSources.Add(_interactionSource); + + var trackerNode = _tracker.GetReference(); + var progressExp = EF.Clamp(trackerNode.Position.Y / trackerNode.MaxPosition.Y, 0, 1); + _propertySet.StartAnimation("progress", progressExp); + } + + private void ConfigureRestingPoints() + { + var trackerTarget = ExpressionValues.Target.CreateInteractionTrackerTarget(); + + var endpoint1 = InteractionTrackerInertiaRestingValue.Create(_compositor); + endpoint1.SetCondition(trackerTarget.NaturalRestingPosition.Y < (trackerTarget.MaxPosition.Y - trackerTarget.MinPosition.Y) / 2); + endpoint1.SetRestingValue(trackerTarget.MinPosition.Y); + + var endpoint2 = InteractionTrackerInertiaRestingValue.Create(_compositor); + endpoint2.SetCondition(trackerTarget.NaturalRestingPosition.Y >= (trackerTarget.MaxPosition.Y - trackerTarget.MinPosition.Y) / 2); + endpoint2.SetRestingValue(trackerTarget.MaxPosition.Y); + + _tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { endpoint1, endpoint2 }); + } + + private void ConfigureTransitionAnimations() + { + // + // Create a common expression that blends between the start and end value, + // based on the tracker's progres (0 to 1). + // + + var startNode = ExpressionValues.Constant.CreateConstantScalar("start"); + var endNode = ExpressionValues.Constant.CreateConstantScalar("end"); + var progress = _propertySet.GetReference().GetScalarProperty("progress"); + var blendExpression = EF.Lerp(startNode, endNode, progress); + + // + // Apply the expression to the background image's blur amount. + // + + blendExpression.SetScalarParameter("start", _visualState1.BackgroundBlurAmount); + blendExpression.SetScalarParameter("end", _visualState2.BackgroundBlurAmount); + + _blurredBackgroundImageVisual.Brush.Properties.StartAnimation("blur.BlurAmount", blendExpression); + + // + // Apply the expression to the background image's blur amount. Since the expression + // structure isn't changing, we can simply update the parameter values (i.e. placeholders) + // before starting the animation. + // + + blendExpression.SetVector3Parameter("start", _visualState1.BackgroundScale); + blendExpression.SetVector3Parameter("end", _visualState2.BackgroundScale); + + _backgroundImageVisual.StartAnimation("scale", blendExpression); + + + // + // Apply the expression to the background image overlay's opacity, to dim the image. + // + + blendExpression.SetScalarParameter("start", 0.0f); + blendExpression.SetScalarParameter("end", 0.4f); + + _backgroundVisualDimmer.StartAnimation("opacity", blendExpression); + + + // + // Set up the Calendar icon to move up/down, using the common expression. + // + + blendExpression.SetVector3Parameter("start", _visualState1.CalendarIconOffset); + blendExpression.SetVector3Parameter("end", _visualState2.CalendarIconOffset); + + _calendarIconVisual.StartAnimation("offset", blendExpression); + + + // + // Set up the Calendar icon to also scale up/down a bit, using the common expression. + // + + blendExpression.SetVector3Parameter("start", _visualState1.CalendarIconScale); + blendExpression.SetVector3Parameter("end", _visualState2.CalendarIconScale); + + _calendarIconVisual.StartAnimation("scale", blendExpression); + + + // + // Blend the ToDo layer's starting -> ending opacity. Instead of linear, we'll add a slightly more dramatic effect. + // + + var weightNode = ExpressionValues.Constant.CreateConstantScalar("weight"); + blendExpression = EF.Lerp(startNode, endNode, (EF.Pow(weightNode, progress) - 1.0f) / (weightNode - 1.0f)); + blendExpression.SetScalarParameter("start", _visualState1.ToDoLayerOpacity); + blendExpression.SetScalarParameter("end", _visualState2.ToDoLayerOpacity); + blendExpression.SetScalarParameter("weight", 30); + + _todoLayerVisual.StartAnimation("opacity", blendExpression); + + + // + // Set up ToDo layer to scale up/down with the same warped blend. + // + + blendExpression.SetVector3Parameter("start", _visualState1.ToDoLayerScale); + blendExpression.SetVector3Parameter("end", _visualState2.ToDoLayerScale); + + _todoLayerVisual.StartAnimation("scale", blendExpression); + + + // + // Set up weather layer's opacity to increase/decrease. We'll use the same warped blend, but change the weight. + // + + blendExpression.SetScalarParameter("start", _visualState1.WeatherLayerOpacity); + blendExpression.SetScalarParameter("end", _visualState2.WeatherLayerOpacity); + blendExpression.SetScalarParameter("weight", 1.0f / 30.0f); + + _weatherLayerVisual.StartAnimation("opacity", blendExpression); + + + // + // Set up weather layer to scale up/down the same way. + // + + blendExpression.SetVector3Parameter("start", _visualState1.WeatherLayerScale); + blendExpression.SetVector3Parameter("end", _visualState2.WeatherLayerScale); + + _weatherLayerVisual.StartAnimation("scale", blendExpression); + } + + private void Pointer_Pressed(object sender, PointerRoutedEventArgs e) + { + try + { + _interactionSource.TryRedirectForManipulation(e.GetCurrentPoint(Root)); + } + catch (Exception) + { + // + // Catch to avoid app crash based on unauthorized input. + // + } + } + + private Compositor _compositor; + private InteractionTracker _tracker; + private VisualInteractionSource _interactionSource; + private Visual _backgroundImageVisual; + private Visual _weatherLayerVisual; + private Visual _todoLayerVisual; + private Visual _calendarIconVisual; + private Visual _backgroundVisual; + private SpriteVisual _blurredBackgroundImageVisual; + private SpriteVisual _backgroundVisualDimmer; + private CompositionPropertySet _propertySet; + private Vector3KeyFrameAnimation _cannedProgressAnimation; + + private VisualState _visualState1; + private VisualState _visualState2; + private bool _isState1 = false; + + internal struct VisualState + { + public float BackgroundBlurAmount; + public Vector3 BackgroundScale; + + public Vector3 CalendarIconOffset; + public Vector3 CalendarIconScale; + + public float ToDoLayerBlurAmount; + public float ToDoLayerOpacity; + public Vector3 ToDoLayerScale; + + public float WeatherLayerBlurAmount; + public float WeatherLayerOpacity; + public Vector3 WeatherLayerScale; + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PullToAnimate/PullToAnimate.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PullToAnimate/PullToAnimate.xaml new file mode 100644 index 000000000..9936a67b1 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/PullToAnimate/PullToAnimate.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowInterop/ShadowInterop.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowInterop/ShadowInterop.cs new file mode 100644 index 000000000..72ac74807 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowInterop/ShadowInterop.cs @@ -0,0 +1,30 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +namespace CompositionSampleGallery +{ + public sealed partial class ShadowInterop : SamplePage + { + public ShadowInterop() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Shadow Interop"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to apply drop shadows to Xaml elements."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761171"; + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowInterop/ShadowInterop.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowInterop/ShadowInterop.xaml new file mode 100644 index 000000000..1bf8021ea --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowInterop/ShadowInterop.xaml @@ -0,0 +1,131 @@ + + + + + + + + + + TextBlock + + + + + Here’s a custom control that allows you to apply DropShadows through Markup on XAML Text, Images, or Shapes + + + + + Here’s a custom control that allows you to apply DropShadows through Markup on XAML Text, Images, or Shapes + + + + Shapes + + + + + + + + + + + + + + + + + Images + + + + + + + Before + + + + + + + After + + + + + Before + + + + + + + After + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowPlayground/ShadowPlayground.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowPlayground/ShadowPlayground.xaml new file mode 100644 index 000000000..ba9364940 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowPlayground/ShadowPlayground.xaml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + Blur Radius + + Opacity + + Offset - X + + Offset - Y + + Shadow Color + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowPlayground/ShadowPlayground.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowPlayground/ShadowPlayground.xaml.cs new file mode 100644 index 000000000..17e66afa3 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShadowPlayground/ShadowPlayground.xaml.cs @@ -0,0 +1,94 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; + +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Hosting; + +namespace CompositionSampleGallery +{ + public sealed partial class ShadowPlayground : SamplePage + { + private Visual _shadowContainer; + private Compositor _compositor; + private SpriteVisual _imageVisual; + private CompositionImage _image; + private ManagedSurface _imageMaskSurface; + private CompositionMaskBrush _maskBrush; + private bool _isMaskEnabled; + + public ShadowPlayground() + { + this.InitializeComponent(); + } + + public static string StaticSampleName => "Shadow Playground"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Experiment with the available properties on the DropShadow object to create interesting shadows."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761177"; + + private void SamplePage_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + // Get backing visual from shadow container and interop compositor + _shadowContainer = ElementCompositionPreview.GetElementVisual(ShadowContainer); + _compositor = _shadowContainer.Compositor; + + // Get CompositionImage, its sprite visual + _image = VisualTreeHelperExtensions.GetFirstDescendantOfType(ShadowContainer); + _imageVisual = _image.SpriteVisual; + + // Load mask asset onto surface using helpers in SamplesCommon + _imageMaskSurface = ImageLoader.Instance.LoadCircle(200, Colors.White); + + // Get surface brush from composition image + CompositionSurfaceBrush source = _image.SurfaceBrush as CompositionSurfaceBrush; + + // Create mask brush for toggle mask functionality + _maskBrush = _compositor.CreateMaskBrush(); + _maskBrush.Mask = _imageMaskSurface.Brush; + _maskBrush.Source = source; + + // Initialize toggle mask + _isMaskEnabled = false; + } + + private void SamplePage_Unloaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + if (_imageMaskSurface != null) + { + _imageMaskSurface.Dispose(); + } + } + + private void MaskButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + if (_isMaskEnabled) //then remove mask + { + _image.Brush = _maskBrush.Source; //set set composition image's brush to (the initial) surfacebrush (source) + Shadow.Mask = null; //remove mask from shadow + } + else //add mask + { + _image.Brush = _maskBrush; //set composition image's brush to maskbrush + Shadow.Mask = _maskBrush.Mask; //add mask to shadow + } + + // Update bool + _isMaskEnabled = !_isMaskEnabled; + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShyHeader/ShyHeader.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShyHeader/ShyHeader.xaml new file mode 100644 index 000000000..1e5c35552 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShyHeader/ShyHeader.xaml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud + exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShyHeader/ShyHeader.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShyHeader/ShyHeader.xaml.cs new file mode 100644 index 000000000..e2de8bc50 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ShyHeader/ShyHeader.xaml.cs @@ -0,0 +1,192 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; +using System.Numerics; + +using EF = ExpressionBuilder.ExpressionFunctions; +using System.Collections.ObjectModel; +using SamplesCommon; + +using Microsoft.Graphics.Canvas.Effects; +using Microsoft.UI.Xaml; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Media; +using CompositionSampleGallery.Shared; + +// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 +namespace CompositionSampleGallery +{ + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class ShyHeader : SamplePage + { + CompositionPropertySet _props; + CompositionPropertySet _scrollerPropertySet; + Compositor _compositor; + private SpriteVisual _blurredBackgroundImageVisual; + public LocalDataSource Model { set; get; } + + public ShyHeader() + { + this.InitializeComponent(); + Loaded += SamplePage_Loaded; + SizeChanged += Page_SizeChanged; + } + + public static string StaticSampleName => "Shy Header"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use ExpressionAnimations with a ScrollViewer to create a shrinking header tied to scroll position."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869003"; + + private void SamplePage_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + // Retrieve the ScrollViewer that the GridView is using internally + var scrollViewer = gridView.GetFirstDescendantOfType(); + + // Update the ZIndex of the header container so that the header is above the items when scrolling + var headerPresenter = (UIElement)VisualTreeHelper.GetParent((UIElement)gridView.Header); + var headerContainer = (UIElement)VisualTreeHelper.GetParent(headerPresenter); + Canvas.SetZIndex((UIElement)headerContainer, 1); + + // Get the PropertySet that contains the scroll values from the ScrollViewer + _scrollerPropertySet = ElementCompositionPreview.GetScrollViewerManipulationPropertySet(scrollViewer); + _compositor = _scrollerPropertySet.Compositor; + Model = new LocalDataSource(); + + gridView.ItemsSource = Model.AggregateDataSources(new ObservableCollection[] { Model.Landscapes, Model.Nature, Model.Abstract }); + + // Create a PropertySet that has values to be referenced in the ExpressionAnimations below + _props = _compositor.CreatePropertySet(); + _props.InsertScalar("progress", 0); + _props.InsertScalar("clampSize", 150); + _props.InsertScalar("scaleFactor", 0.7f); + + // Get references to our property sets for use with ExpressionNodes + var scrollingProperties = _scrollerPropertySet.GetSpecializedReference(); + var props = _props.GetReference(); + var progressNode = props.GetScalarProperty("progress"); + var clampSizeNode = props.GetScalarProperty("clampSize"); + var scaleFactorNode = props.GetScalarProperty("scaleFactor"); + + // Create a blur effect to be animated based on scroll position + var blurEffect = new GaussianBlurEffect() + { + Name = "blur", + BlurAmount = 0.0f, + BorderMode = EffectBorderMode.Hard, + Optimization = EffectOptimization.Balanced, + Source = new CompositionEffectSourceParameter("source") + }; + + var blurBrush = _compositor.CreateEffectFactory( + blurEffect, + new[] { "blur.BlurAmount" }) + .CreateBrush(); + + blurBrush.SetSourceParameter("source", _compositor.CreateBackdropBrush()); + + // Create a Visual for applying the blur effect + _blurredBackgroundImageVisual = _compositor.CreateSpriteVisual(); + _blurredBackgroundImageVisual.Brush = blurBrush; + _blurredBackgroundImageVisual.Size = new Vector2((float)OverlayRectangle.ActualWidth, (float)OverlayRectangle.ActualHeight); + + // Insert the blur visual at the right point in the Visual Tree + ElementCompositionPreview.SetElementChildVisual(OverlayRectangle, _blurredBackgroundImageVisual); + + // Create and start an ExpressionAnimation to track scroll progress over the desired distance + ExpressionNode progressAnimation = EF.Clamp(-scrollingProperties.Translation.Y / clampSizeNode, 0, 1); + _props.StartAnimation("progress", progressAnimation); + + // Create and start an ExpressionAnimation to animate blur radius between 0 and 15 based on progress + ExpressionNode blurAnimation = EF.Lerp(0, 15, progressNode); + _blurredBackgroundImageVisual.Brush.Properties.StartAnimation("blur.BlurAmount", blurAnimation); + + // Get the backing visual for the header so that its properties can be animated + Visual headerVisual = ElementCompositionPreview.GetElementVisual(Header); + + // Create and start an ExpressionAnimation to clamp the header's offset to keep it onscreen + ExpressionNode headerTranslationAnimation = EF.Conditional(progressNode < 1, 0, -scrollingProperties.Translation.Y - clampSizeNode); + headerVisual.StartAnimation("Offset.Y", headerTranslationAnimation); + + // Create and start an ExpressionAnimation to scale the header during overpan + ExpressionNode headerScaleAnimation = EF.Lerp(1, 1.25f, EF.Clamp(scrollingProperties.Translation.Y / 50, 0, 1)); + headerVisual.StartAnimation("Scale.X", headerScaleAnimation); + headerVisual.StartAnimation("Scale.Y", headerScaleAnimation); + + //Set the header's CenterPoint to ensure the overpan scale looks as desired + headerVisual.CenterPoint = new Vector3((float)(Header.ActualWidth / 2), (float)Header.ActualHeight, 0); + + // Get the backing visual for the photo in the header so that its properties can be animated + Visual photoVisual = ElementCompositionPreview.GetElementVisual(BackgroundRectangle); + + // Create and start an ExpressionAnimation to opacity fade out the image behind the header + ExpressionNode imageOpacityAnimation = 1 - progressNode; + photoVisual.StartAnimation("opacity", imageOpacityAnimation); + + // Get the backing visual for the profile picture visual so that its properties can be animated + Visual profileVisual = ElementCompositionPreview.GetElementVisual(ProfileImage); + + // Create and start an ExpressionAnimation to scale the profile image with scroll position + ExpressionNode scaleAnimation = EF.Lerp(1, scaleFactorNode, progressNode); + profileVisual.StartAnimation("Scale.X", scaleAnimation); + profileVisual.StartAnimation("Scale.Y", scaleAnimation); + + // Get backing visuals for the text blocks so that their properties can be animated + Visual blurbVisual = ElementCompositionPreview.GetElementVisual(Blurb); + Visual subtitleVisual = ElementCompositionPreview.GetElementVisual(SubtitleBlock); + Visual moreVisual = ElementCompositionPreview.GetElementVisual(MoreText); + + // Create an ExpressionAnimation that moves between 1 and 0 with scroll progress, to be used for text block opacity + ExpressionNode textOpacityAnimation = EF.Clamp(1 - (progressNode * 2), 0, 1); + + // Start opacity and scale animations on the text block visuals + blurbVisual.StartAnimation("Opacity", textOpacityAnimation); + blurbVisual.StartAnimation("Scale.X", scaleAnimation); + blurbVisual.StartAnimation("Scale.Y", scaleAnimation); + + subtitleVisual.StartAnimation("Opacity", textOpacityAnimation); + subtitleVisual.StartAnimation("Scale.X", scaleAnimation); + subtitleVisual.StartAnimation("Scale.Y", scaleAnimation); + + moreVisual.StartAnimation("Opacity", textOpacityAnimation); + moreVisual.StartAnimation("Scale.X", scaleAnimation); + moreVisual.StartAnimation("Scale.Y", scaleAnimation); + + // Get the backing visuals for the text and button containers so that their properites can be animated + Visual textVisual = ElementCompositionPreview.GetElementVisual(TextContainer); + Visual buttonVisual = ElementCompositionPreview.GetElementVisual(ButtonPanel); + + // When the header stops scrolling it is 150 pixels offscreen. We want the text header to end up with 50 pixels of its content + // offscreen which means it needs to go from offset 0 to 100 as we traverse through the scrollable region + ExpressionNode contentOffsetAnimation = progressNode * 100; + textVisual.StartAnimation("Offset.Y", contentOffsetAnimation); + + ExpressionNode buttonOffsetAnimation = progressNode * -100; + buttonVisual.StartAnimation("Offset.Y", buttonOffsetAnimation); + } + + private void Page_SizeChanged(object sender, SizeChangedEventArgs e) + { + if (_blurredBackgroundImageVisual != null) + { + _blurredBackgroundImageVisual.Size = new Vector2((float)OverlayRectangle.ActualWidth, (float)OverlayRectangle.ActualHeight); + } + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/Behaviors/InteractionBehavior.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/Behaviors/InteractionBehavior.cs new file mode 100644 index 000000000..303f86a45 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/Behaviors/InteractionBehavior.cs @@ -0,0 +1,283 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; + +#if Microsoft_Xaml_Behaviors_Uwp_Managed // The behavior nuget package has depenedency on windows.ui.xaml +using Microsoft.Xaml.Interactivity; +#endif + +using System; +using System.Numerics; + +using Microsoft.UI.Composition; +using Microsoft.UI.Composition.Interactions; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; + +using EF = ExpressionBuilder.ExpressionFunctions; + +namespace CompositionSampleGallery.Samples.SDK_14393.SwipeScroller.Behaviors +{ + class InteractionBehavior : DependencyObject, IInteractionTrackerOwner + { + #region setup + + public FrameworkElement InfoContent + { + get { return (FrameworkElement)GetValue(InfoContentProperty); } + set { SetValue(InfoContentProperty, value); } + } + + public static readonly DependencyProperty InfoContentProperty = + DependencyProperty.Register("InfoContent", typeof(FrameworkElement), typeof(InteractionBehavior), new PropertyMetadata(null)); + + public FrameworkElement InfoContainer + { + get { return (FrameworkElement)GetValue(InfoContainerProperty); } + set { SetValue(InfoContainerProperty, value); } + } + + public static readonly DependencyProperty InfoContainerProperty = + DependencyProperty.Register("InfoContainer", typeof(FrameworkElement), typeof(InteractionBehavior), new PropertyMetadata(null)); + + public FrameworkElement PhotoContent + { + get { return (FrameworkElement)GetValue(PhotoContentProperty); } + set { SetValue(PhotoContentProperty, value); } + } + + public static readonly DependencyProperty PhotoContentProperty = + DependencyProperty.Register("PhotoContent", typeof(FrameworkElement), typeof(InteractionBehavior), new PropertyMetadata(null)); + + public FrameworkElement HittestContent + { + get { return (FrameworkElement)GetValue(HittestContentProperty); } + set { SetValue(HittestContentProperty, value); } + } + + public static readonly DependencyProperty HittestContentProperty = + DependencyProperty.Register("HittestContent", typeof(FrameworkElement), typeof(InteractionBehavior), new PropertyMetadata(null, OnHittestContentChanged)); + + private void ImageContainerSizeChanged(object sender, SizeChangedEventArgs e) + { + ConfigureInteractionTracker(); + } + #endregion + private void ConfigureInteractionTracker() + { + if (InfoContent == null) return; + if (HittestContent == null) return; + + // Configure hittestVisual size for the interaction (size needs to be explicitly set in order for the hittesting to work correctly due to XAML-COMP interop policy) + _hittestVisual.Size = new Vector2((float)HittestContent.ActualWidth, (float)HittestContent.ActualHeight); + + _props = _compositor.CreatePropertySet(); + + Visual infoVisual = ElementCompositionPreview.GetElementVisual(InfoContent); + Visual photoVisual = ElementCompositionPreview.GetElementVisual(PhotoContent); + photoVisual.Size = new Vector2((float)PhotoContent.ActualWidth, (float)PhotoContent.ActualHeight); + + photoVisual.CenterPoint = new Vector3((float)PhotoContent.ActualWidth * .5f, (float)PhotoContent.ActualHeight * .5f, 0f); + infoVisual.CenterPoint = new Vector3((float)InfoContent.ActualWidth * .5f, (float)InfoContent.ActualHeight * .5f, 0f); + + VisualInteractionSource interactionSource = VisualInteractionSource.Create(_hittestVisual); + + //Configure for y-direction panning + interactionSource.PositionYSourceMode = InteractionSourceMode.EnabledWithInertia; + + //Create tracker and associate interaction source + _tracker.InteractionSources.Add(interactionSource); + + //Configure tracker boundaries + _tracker.MaxPosition = new Vector3((float)HittestContent.ActualHeight); + + SpriteVisual shadowVisual = _compositor.CreateSpriteVisual(); + shadowVisual.Size = photoVisual.Size; + ElementCompositionPreview.SetElementChildVisual(InfoContainer, shadowVisual); + + ConfigureAnimations(photoVisual, infoVisual, shadowVisual); + + ConfigureRestingPoints(); + + HittestContent.PointerPressed += (s, a) => + { + // Capture the touch manipulation to the InteractionTracker for automatic handling + if (a.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch) + { + try + { + interactionSource.TryRedirectForManipulation(a.GetCurrentPoint(s as UIElement)); + } + catch (Exception) + { + // Ignoring the failed redirect to prevent app crashing + } + } + // Update the InteractionTracker's position to change between min and max for other input types + else + { + float direction = 1; + if (_isExpanded) + { + direction = -1; + } + _tracker.TryUpdatePositionWithAdditionalVelocity(new Vector3(0f, direction * 1000f, 0f)); + } + }; + } + + private void ConfigureRestingPoints() + { + // Setup a possible inertia endpoint (snap point) for the InteractionTracker's minimum position + var endpoint1 = InteractionTrackerInertiaRestingValue.Create(_compositor); + + // Use this endpoint when the natural resting position of the interaction is less than the halfway point + var trackerTarget = ExpressionValues.Target.CreateInteractionTrackerTarget(); + endpoint1.SetCondition(trackerTarget.NaturalRestingPosition.Y < (trackerTarget.MaxPosition.Y - trackerTarget.MinPosition.Y) / 2); + + // Set the result for this condition to make the InteractionTracker's y position the minimum y position + endpoint1.SetRestingValue(trackerTarget.MinPosition.Y); + + // Setup a possible inertia endpoint (snap point) for the InteractionTracker's maximum position + var endpoint2 = InteractionTrackerInertiaRestingValue.Create(_compositor); + + //Use this endpoint when the natural resting position of the interaction is more than the halfway point + endpoint2.SetCondition(trackerTarget.NaturalRestingPosition.Y >= (trackerTarget.MaxPosition.Y - trackerTarget.MinPosition.Y) / 2); + + //Set the result for this condition to make the InteractionTracker's y position the maximum y position + endpoint2.SetRestingValue(trackerTarget.MaxPosition.Y); + + _tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { endpoint1, endpoint2 }); + } + + private void ConfigureAnimations(Visual photoVisual, Visual infoVisual, SpriteVisual shadowVisual) + { + // Create a drop shadow to be animated by the manipulation + var shadow = _compositor.CreateDropShadow(); + shadowVisual.Shadow = shadow; + _props.InsertScalar("progress", 0); + + // Create an animation that tracks the progress of the manipulation and stores it in a the PropertySet _props + var trackerNode = _tracker.GetReference(); + _props.StartAnimation("progress", trackerNode.Position.Y / trackerNode.MaxPosition.Y); + + // Create an animation that scales up the infoVisual based on the manipulation progress + var propSetProgress = _props.GetReference().GetScalarProperty("progress"); + infoVisual.StartAnimation("Scale", EF.Vector3(1, 1, 1) * EF.Lerp(1, 1.2f, propSetProgress)); + + // Create an animation that changes the offset of the photoVisual and shadowVisual based on the manipulation progress + var photoOffsetExp = -120f * _props.GetReference().GetScalarProperty("Progress"); + photoVisual.StartAnimation("offset.y", photoOffsetExp); + shadowVisual.StartAnimation("offset.y", photoOffsetExp); + + // Create an animation that fades in the info visual based on the manipulation progress + infoVisual.StartAnimation("opacity", EF.Lerp(0, 1, _props.GetReference().GetScalarProperty("Progress"))); + shadow.StartAnimation("blurradius", EF.Lerp(1, 50, _props.GetReference().GetScalarProperty("Progress"))); + } + + private static void OnHittestContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (e.OldValue != e.NewValue) + { + var thisBehavior = d as InteractionBehavior; + + if (thisBehavior != null) + { + var oldElement = e.OldValue as FrameworkElement; + var newElement = e.NewValue as FrameworkElement; + + if (oldElement != null) + { + oldElement.SizeChanged -= thisBehavior.ImageContainerSizeChanged; + } + + if (newElement != null) + { + newElement.SizeChanged += thisBehavior.ImageContainerSizeChanged; + thisBehavior.ConfigureInteractionTracker(); + } + } + } + } + + #region Callbacks + public void CustomAnimationStateEntered(InteractionTracker sender, InteractionTrackerCustomAnimationStateEnteredArgs args) + { + + } + + public void IdleStateEntered(InteractionTracker sender, InteractionTrackerIdleStateEnteredArgs args) + { + + } + + public void InertiaStateEntered(InteractionTracker sender, InteractionTrackerInertiaStateEnteredArgs args) + { + + } + + public void InteractingStateEntered(InteractionTracker sender, InteractionTrackerInteractingStateEnteredArgs args) + { + + } + + public void RequestIgnored(InteractionTracker sender, InteractionTrackerRequestIgnoredArgs args) + { + + } + + public void ValuesChanged(InteractionTracker sender, InteractionTrackerValuesChangedArgs args) + { + // Store whether the item is expanded in order to know whether a mouse click should expand or collapse + _isExpanded = (args.Position.Y > 0); + } + #endregion //Callbacks + + public void Attach(DependencyObject associatedObject) + { + AssociatedObject = associatedObject; + _hittestVisual = ElementCompositionPreview.GetElementVisual(HittestContent); + + if (_compositor == null) + { + _compositor = _hittestVisual.Compositor; + } + _tracker = InteractionTracker.CreateWithOwner(_compositor, this); + _isExpanded = false; + } + + public void Detach() + { + _tracker.Dispose(); + _tracker = null; + _hittestVisual = null; + _compositor = null; + _props = null; + } + + DependencyObject AssociatedObject { get; set; } + + //DependencyObject AssociatedObject + //{ + // get { return this.AssociatedObject; } + //} + + InteractionTracker _tracker; + CompositionPropertySet _props; + Compositor _compositor; + Visual _hittestVisual; + bool _isExpanded; + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/Models/PhotoModel.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/Models/PhotoModel.cs new file mode 100644 index 000000000..1047a47c6 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/Models/PhotoModel.cs @@ -0,0 +1,25 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; + +namespace CompositionSampleGallery.Samples.SDK_14393.SwipeScroller.Models +{ + class PhotoModel + { + public String Name { get; set; } + public String Info { get; set; } + public Uri Image { get; set; } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/SwipeScroller.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/SwipeScroller.cs new file mode 100644 index 000000000..cf5a454d7 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/SwipeScroller.cs @@ -0,0 +1,57 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using CompositionSampleGallery.Samples.SDK_14393.SwipeScroller.Models; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +using Microsoft.UI.Xaml; +using CompositionSampleGallery.Shared; + +namespace CompositionSampleGallery +{ + public sealed partial class SwipeScroller : SamplePage + { + public SwipeScroller() + { + this.InitializeComponent(); + Model = new LocalDataSource(); + } + + public static string StaticSampleName => "Swipe Scroller"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to use InteractionTracker to add a swipe behavior to items inside a ScrollViewer"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869004"; + + public LocalDataSource Model { set; get; } + + private void Page_Loaded(object sender, RoutedEventArgs e) + { + List list = new List(); + foreach (Thumbnail thumbnail in Model.AggregateDataSources(new ObservableCollection[] { Model.Landscapes, Model.Nature })) + { + list.Add(new PhotoModel() + { + Name = thumbnail.Name, + Image = new Uri(thumbnail.ImageUrl), + Info = thumbnail.Description + }); + } + Items.ItemsSource = list; + } + } +} + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/SwipeScroller.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/SwipeScroller.xaml new file mode 100644 index 000000000..cf4144597 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/SwipeScroller/SwipeScroller.xaml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TextShimmer/TextShimmer.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TextShimmer/TextShimmer.xaml new file mode 100644 index 000000000..3d35aba55 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TextShimmer/TextShimmer.xaml @@ -0,0 +1,18 @@ + + + + + + Text Shimmer + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TextShimmer/TextShimmer.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TextShimmer/TextShimmer.xaml.cs new file mode 100644 index 000000000..59669a30d --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TextShimmer/TextShimmer.xaml.cs @@ -0,0 +1,66 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Numerics; + +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Hosting; + +namespace CompositionSampleGallery +{ + public sealed partial class TextShimmer : SamplePage + { + public TextShimmer() + { + this.InitializeComponent(); + this.Loaded += TextShimmer_Loaded; + } + + public static string StaticSampleName => "Text Shimmer"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Target a XAML UIElement with a Composition Light"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869005"; + + private void TextShimmer_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + //get interop compositor + _compositor = ElementCompositionPreview.GetElementVisual(TextBlock).Compositor; + + //get interop visual for XAML TextBlock + var text = ElementCompositionPreview.GetElementVisual(TextBlock); + + _pointLight = _compositor.CreatePointLight(); + _pointLight.Color = Colors.White; + _pointLight.CoordinateSpace = text; //set up co-ordinate space for offset + _pointLight.Targets.Add(text); //target XAML TextBlock + + //starts out to the left; vertically centered; light's z-offset is related to fontsize + _pointLight.Offset = new Vector3(-(float)TextBlock.ActualWidth, (float)TextBlock.ActualHeight / 2, (float)TextBlock.FontSize); + + //simple offset.X animation that runs forever + var animation = _compositor.CreateScalarKeyFrameAnimation(); + animation.InsertKeyFrame(1, 2 * (float)TextBlock.ActualWidth); + animation.Duration = TimeSpan.FromSeconds(3.3f); + animation.IterationBehavior = AnimationIterationBehavior.Forever; + + _pointLight.StartAnimation("Offset.X", animation); + } + + private Compositor _compositor; + private PointLight _pointLight; + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ThumbnailLighting/ThumbnailLighting.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ThumbnailLighting/ThumbnailLighting.xaml new file mode 100644 index 000000000..2eadd9601 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ThumbnailLighting/ThumbnailLighting.xaml @@ -0,0 +1,55 @@ + + + + + + + + + + + Enable Mouse hover + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ThumbnailLighting/ThumbnailLighting.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ThumbnailLighting/ThumbnailLighting.xaml.cs new file mode 100644 index 000000000..a3aadaeff --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/ThumbnailLighting/ThumbnailLighting.xaml.cs @@ -0,0 +1,663 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Numerics; +using System.Threading.Tasks; + +using Windows.Foundation; +using Windows.Graphics.Effects; + +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Composition.Effects; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.Graphics.Canvas; +using Microsoft.Graphics.Canvas.Effects; +using CompositionSampleGallery.Shared; + +namespace CompositionSampleGallery +{ + public sealed partial class ThumbnailLighting : SamplePage + { + private Compositor _compositor; + private CompositionEffectFactory _effectFactory; + private AmbientLight _ambientLight; + private PointLight _pointLight; + private DistantLight _distantLight; + private SpotLight _spotLight; + private ManagedSurface _sphereNormalMap; + private ManagedSurface _edgeNormalMap; + + public enum LightingTypes + { + PointDiffuse, + PointSpecular, + SpotLightDiffuse, + SpotLightSpecular, + DistantDiffuse, + DistantSpecular, + } + + public ThumbnailLighting() + { + Model = new LocalDataSource(); + this.InitializeComponent(); + + // Get the current compositor + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + + // + // Create the lights + // + + _ambientLight = _compositor.CreateAmbientLight(); + _pointLight = _compositor.CreatePointLight(); + _distantLight = _compositor.CreateDistantLight(); + _spotLight = _compositor.CreateSpotLight(); + } + + public static string StaticSampleName => "Thumbnail Lighting"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to apply Image Lighting to ListView Items. Switch between different combinations of light types(point, spot, distant) and lighting properties such as diffuse and specular. Click on a tile to flip it, or select mouse mode to track the mouse location."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761165"; + + public LocalDataSource Model { get; set; } + + private async void Page_Loaded(object sender, RoutedEventArgs e) + { + // Populate the light type combobox + IList lightList = new List(); + foreach (LightingTypes type in Enum.GetValues(typeof(LightingTypes))) + { + ComboBoxItem item = new ComboBoxItem(); + item.Tag = type; + item.Content = type.ToString(); + lightList.Add(item); + } + + LightingSelection.ItemsSource = lightList; + LightingSelection.SelectedIndex = 0; + + ThumbnailList.ItemsSource = Model.AggregateDataSources(new ObservableCollection[] { Model.Landscapes, Model.Nature} ); + + // + // Create the sperical normal map. The normals will give the appearance of a sphere, and the alpha channel is used + // for masking off the rectangular edges. + // + + _sphereNormalMap = await ImageLoader.Instance.LoadFromUriAsync(new Uri("ms-appx:///Assets/NormalMapsAndMasks/SphericalWithMask.png")); + _sphereNormalMap.Brush.Stretch = CompositionStretch.Fill; + + + // + // Create the flat normal map with beveled edges. This should give the appearance of slanting of the surface along + // the edges, flat in the middle. + // + + _edgeNormalMap = await ImageLoader.Instance.LoadFromUriAsync(new Uri("ms-appx:///Assets/NormalMapsAndMasks/BeveledEdges.jpg")); + _edgeNormalMap.Brush.Stretch = CompositionStretch.Fill; + + // Update the effect brushes now that the normal maps are available. + UpdateEffectBrush(); + } + + private void Page_Unloaded(object sender, RoutedEventArgs e) + { + if (_sphereNormalMap != null) + { + _sphereNormalMap.Dispose(); + _sphereNormalMap = null; + } + + if (_edgeNormalMap != null) + { + _edgeNormalMap.Dispose(); + _edgeNormalMap = null; + } + } + + private void UpdateEffectBrush() + { + if (ThumbnailList.ItemsPanelRoot != null) + { + foreach (ListViewItem item in ThumbnailList.ItemsPanelRoot.Children) + { + CompositionImage image = item.ContentTemplateRoot.GetFirstDescendantOfType(); + SetImageEffect(image); + } + } + } + + private void UpdateAnimations() + { + Vector2 sizeLightBounds = new Vector2((float)RootPanel.ActualWidth, (float)RootPanel.ActualHeight); + Vector3KeyFrameAnimation lightPositionAnimation; + ColorKeyFrameAnimation lightColorAnimation; + + ComboBoxItem item = LightingSelection.SelectedValue as ComboBoxItem; + switch ((LightingTypes)item.Tag) + { + case LightingTypes.PointDiffuse: + case LightingTypes.PointSpecular: + { + float zDistance = 50f; + + // Create the light position animation + lightPositionAnimation = _compositor.CreateVector3KeyFrameAnimation(); + lightPositionAnimation.InsertKeyFrame(0f, new Vector3(0f, 0f, zDistance)); + lightPositionAnimation.InsertKeyFrame(.25f, new Vector3(sizeLightBounds.X * .2f, sizeLightBounds.Y * .5f, zDistance)); + lightPositionAnimation.InsertKeyFrame(.50f, new Vector3(sizeLightBounds.X * .75f, sizeLightBounds.Y * .5f, zDistance)); + lightPositionAnimation.InsertKeyFrame(.75f, new Vector3(sizeLightBounds.X * .2f, sizeLightBounds.Y * .2f, zDistance)); + lightPositionAnimation.InsertKeyFrame(1f, new Vector3(0f, 0f, zDistance)); + lightPositionAnimation.Duration = TimeSpan.FromMilliseconds(7500); + lightPositionAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + lightColorAnimation = _compositor.CreateColorKeyFrameAnimation(); + lightColorAnimation.InsertKeyFrame(0f, Colors.White); + lightColorAnimation.InsertKeyFrame(.33f, Colors.White); + lightColorAnimation.InsertKeyFrame(.66f, Colors.Yellow); + lightColorAnimation.InsertKeyFrame(1f, Colors.White); + lightColorAnimation.Duration = TimeSpan.FromMilliseconds(20000); + lightColorAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + _pointLight.StartAnimation("Offset", lightPositionAnimation); + _pointLight.StartAnimation("Color", lightColorAnimation); + } + break; + + case LightingTypes.SpotLightDiffuse: + case LightingTypes.SpotLightSpecular: + { + // Create the light position animation + lightPositionAnimation = _compositor.CreateVector3KeyFrameAnimation(); + lightPositionAnimation.InsertKeyFrame(0f, new Vector3(0f, 0f, 100f)); + lightPositionAnimation.InsertKeyFrame(.33f, new Vector3(sizeLightBounds.X * .5f, sizeLightBounds.Y * .5f, 200f)); + lightPositionAnimation.InsertKeyFrame(.66f, new Vector3(sizeLightBounds.X, sizeLightBounds.Y * .5f, 400f)); + lightPositionAnimation.InsertKeyFrame(1f, new Vector3(0f, 0f, 100f)); + lightPositionAnimation.Duration = TimeSpan.FromMilliseconds(7500); + lightPositionAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + lightColorAnimation = _compositor.CreateColorKeyFrameAnimation(); + lightColorAnimation.InsertKeyFrame(0f, Colors.White); + lightColorAnimation.InsertKeyFrame(.33f, Colors.White); + lightColorAnimation.InsertKeyFrame(.66f, Colors.Yellow); + lightColorAnimation.InsertKeyFrame(1f, Colors.White); + lightColorAnimation.Duration = TimeSpan.FromMilliseconds(20000); + lightColorAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + _spotLight.StartAnimation("Offset", lightPositionAnimation); + _spotLight.StartAnimation("InnerConeColor", lightColorAnimation); + } + break; + + case LightingTypes.DistantDiffuse: + case LightingTypes.DistantSpecular: + { + // Animate the light direction + Vector3 position = new Vector3(0, 0, 100); + float offCenter = 700f; + + Vector3KeyFrameAnimation lightDirectionAnimation = _compositor.CreateVector3KeyFrameAnimation(); + lightDirectionAnimation.InsertKeyFrame(0f, Vector3.Normalize(new Vector3(0,0,0) - position)); + lightDirectionAnimation.InsertKeyFrame(.25f, Vector3.Normalize(new Vector3(offCenter, 0, 0) - position)); + lightDirectionAnimation.InsertKeyFrame(.5f, Vector3.Normalize(new Vector3(-offCenter, offCenter, 0) - position)); + lightDirectionAnimation.InsertKeyFrame(.75f, Vector3.Normalize(new Vector3(0, -offCenter, 0) - position)); + lightDirectionAnimation.InsertKeyFrame(1f, Vector3.Normalize(new Vector3(0, 0, 0) - position)); + lightDirectionAnimation.Duration = TimeSpan.FromMilliseconds(7500); + lightDirectionAnimation.IterationBehavior = AnimationIterationBehavior.Forever; + + _distantLight.StartAnimation("Direction", lightDirectionAnimation); + } + break; + + default: + break; + } + } + + private void StopAnimations() + { + ComboBoxItem item = LightingSelection.SelectedValue as ComboBoxItem; + switch ((LightingTypes)item.Tag) + { + case LightingTypes.PointDiffuse: + case LightingTypes.PointSpecular: + _pointLight.StopAnimation("Offset"); + _pointLight.StopAnimation("Color"); + break; + + case LightingTypes.SpotLightDiffuse: + case LightingTypes.SpotLightSpecular: + _spotLight.StopAnimation("Offset"); + _spotLight.StopAnimation("InnerConeColor"); + break; + + case LightingTypes.DistantDiffuse: + case LightingTypes.DistantSpecular: + _distantLight.StopAnimation("Direction"); + break; + + default: + break; + } + } + + private void SetImageEffect(CompositionImage image) + { + // Create the effect brush and bind the normal map + CompositionEffectBrush brush = _effectFactory.CreateBrush(); + + ComboBoxItem item = LightingSelection.SelectedValue as ComboBoxItem; + switch ((LightingTypes)item.Tag) + { + case LightingTypes.SpotLightSpecular: + case LightingTypes.PointSpecular: + case LightingTypes.DistantDiffuse: + case LightingTypes.DistantSpecular: + brush.SetSourceParameter("NormalMap", _sphereNormalMap == null ? null : _sphereNormalMap.Brush); + break; + default: + brush.SetSourceParameter("NormalMap", _edgeNormalMap == null ? null : _edgeNormalMap.Brush); + break; + } + + // Update the CompositionImage to use the custom effect brush + image.Brush = brush; + } + + private void ListView_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) + { + CompositionImage image = args.ItemContainer.ContentTemplateRoot.GetFirstDescendantOfType(); + Thumbnail thumbnail = args.Item as Thumbnail; + Uri uri = new Uri(thumbnail.ImageUrl); + + // Setup the brush for this image + SetImageEffect(image); + + // Update the image URI + image.Source = uri; + } + + private void ThumbnailList_SizeChanged(object sender, SizeChangedEventArgs e) + { + UpdateAnimations(); + } + + private void LightingSelection_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + UpdateLightingEffect(); + } + + private void UpdateLightingEffect() + { + _ambientLight.Targets.RemoveAll(); + _pointLight.Targets.RemoveAll(); + _distantLight.Targets.RemoveAll(); + _spotLight.Targets.RemoveAll(); + + ComboBoxItem item = LightingSelection.SelectedValue as ComboBoxItem; + switch ((LightingTypes)item.Tag) + { + case LightingTypes.PointDiffuse: + { + // + // Result = Ambient + Diffuse + // Result = (Image) + (.75 * Diffuse color) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.Add, + Sources = + { + new CompositionEffectSourceParameter("ImageSource"), + new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = .75f, + SpecularAmount = 0, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + } + }; + + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + // Set the light coordinate space and add the target + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _pointLight.CoordinateSpace = lightRoot; + _pointLight.Targets.Add(lightRoot); + } + break; + + case LightingTypes.PointSpecular: + { + // + // Result = Ambient + Diffuse + Specular + // Result = (Image * .6) + (Image * Diffuse color) + (Specular color) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.DestinationIn, + Sources = + { + new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + Source1Amount = 1, + Source2Amount = 1, + MultiplyAmount = 0, + + Source1 = new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + MultiplyAmount = 1, + Source1Amount = 0, + Source2Amount = 0, + Source1 = new CompositionEffectSourceParameter("ImageSource"), + Source2 = new SceneLightingEffect() + { + AmbientAmount = .6f, + DiffuseAmount = 1f, + SpecularAmount = 0f, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + Source2 = new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = 0f, + SpecularAmount = 1f, + SpecularShine = 100, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + new CompositionEffectSourceParameter("NormalMap"), + } + }; + + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + // Set the light coordinate space and add the target + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _ambientLight.Targets.Add(lightRoot); + _pointLight.CoordinateSpace = lightRoot; + _pointLight.Targets.Add(lightRoot); + } + break; + + case LightingTypes.SpotLightDiffuse: + { + // + // Result = Ambient + Diffuse + // Result = Image + (Diffuse color * .75) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.Add, + Sources = + { + new CompositionEffectSourceParameter("ImageSource"), + new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = .75f, + SpecularAmount = 0, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + } + }; + + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + // Set the light coordinate space and add the target + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _spotLight.CoordinateSpace = lightRoot; + _spotLight.Targets.Add(lightRoot); + _spotLight.InnerConeAngle = (float)(Math.PI / 4); + _spotLight.OuterConeAngle = (float)(Math.PI / 3.5); + _spotLight.Direction = new Vector3(0, 0, -1); + }; + break; + + case LightingTypes.SpotLightSpecular: + { + // + // Result = Ambient + Diffuse + Specular + // Result = (Image * .6) + (Image * Diffuse color) + (Specular color) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.DestinationIn, + Sources = + { + new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + Source1Amount = 1, + Source2Amount = 1, + MultiplyAmount = 0, + + Source1 = new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + MultiplyAmount = 1, + Source1Amount = 0, + Source2Amount = 0, + Source1 = new CompositionEffectSourceParameter("ImageSource"), + Source2 = new SceneLightingEffect() + { + AmbientAmount = .6f, + DiffuseAmount = 1f, + SpecularAmount = 0f, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + Source2 = new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = 0f, + SpecularAmount = 1f, + SpecularShine = 100, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + new CompositionEffectSourceParameter("NormalMap"), + } + }; + + // Create the effect factory + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + // Set the light coordinate space and add the target + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _ambientLight.Targets.Add(lightRoot); + _spotLight.CoordinateSpace = lightRoot; + _spotLight.Targets.Add(lightRoot); + _spotLight.InnerConeAngle = (float)(Math.PI / 4); + _spotLight.OuterConeAngle = (float)(Math.PI / 3.5); + _spotLight.Direction = new Vector3(0, 0, -1); + }; + break; + + case LightingTypes.DistantDiffuse: + { + // + // Result = Ambient + Diffuse + // Result = (Image) + (.5 * Diffuse color) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.DestinationIn, + Sources = + { + new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.Add, + Sources = + { + new CompositionEffectSourceParameter("ImageSource"), + new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = .5f, + SpecularAmount = 0, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + } + }, + new CompositionEffectSourceParameter("NormalMap"), + } + }; + + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _distantLight.CoordinateSpace = lightRoot; + _distantLight.Targets.Add(lightRoot); + }; + break; + + case LightingTypes.DistantSpecular: + { + // + // Result = Diffuse + Specular + // Result = (Image * Diffuse color) + (Specular color) + // + + IGraphicsEffect graphicsEffect = new CompositeEffect() + { + Mode = Microsoft.Graphics.Canvas.CanvasComposite.DestinationIn, + Sources = + { + new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + Source1Amount = 1, + Source2Amount = 1, + MultiplyAmount = 0, + + Source1 = new Microsoft.Graphics.Canvas.Effects.ArithmeticCompositeEffect() + { + MultiplyAmount = 1, + Source1Amount = 0, + Source2Amount = 0, + Source1 = new CompositionEffectSourceParameter("ImageSource"), + Source2 = new SceneLightingEffect() + { + AmbientAmount = .6f, + DiffuseAmount = 1f, + SpecularAmount = 0f, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + Source2 = new SceneLightingEffect() + { + AmbientAmount = 0, + DiffuseAmount = 0f, + SpecularAmount = 1f, + SpecularShine = 100, + NormalMapSource = new CompositionEffectSourceParameter("NormalMap"), + } + }, + new CompositionEffectSourceParameter("NormalMap"), + } + }; + + _effectFactory = _compositor.CreateEffectFactory(graphicsEffect); + + Visual lightRoot = ElementCompositionPreview.GetElementVisual(ThumbnailList); + _distantLight.CoordinateSpace = lightRoot; + _distantLight.Targets.Add(lightRoot); + }; + break; + + default: + break; + } + + // Update the animations + UpdateAnimations(); + + // Update all the image to have the new effect + UpdateEffectBrush(); + } + + private void ThumbnailList_PointerMoved(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e) + { + Vector2 offset = e.GetCurrentPoint(ThumbnailList).Position.ToVector2(); + ComboBoxItem item = LightingSelection.SelectedValue as ComboBoxItem; + switch ((LightingTypes)item.Tag) + { + case LightingTypes.PointDiffuse: + case LightingTypes.PointSpecular: + _pointLight.Offset = new Vector3(offset.X, offset.Y, 75); + break; + + case LightingTypes.SpotLightDiffuse: + case LightingTypes.SpotLightSpecular: + _spotLight.Offset = new Vector3(offset.X, offset.Y, 150); + break; + + case LightingTypes.DistantDiffuse: + case LightingTypes.DistantSpecular: + Vector3 position = new Vector3((float)ThumbnailList.ActualWidth / 2, (float)ThumbnailList.ActualHeight / 2, 200); + Vector3 lookAt = new Vector3((float)ThumbnailList.ActualWidth - offset.X, (float)ThumbnailList.ActualHeight - offset.Y, 0); + _distantLight.Direction = Vector3.Normalize(lookAt - position); + break; + + default: + break; + } + } + + private void CheckBox_Checked(object sender, RoutedEventArgs e) + { + if(MouseHover.IsChecked == true) + { + ThumbnailList.PointerMoved += ThumbnailList_PointerMoved; + StopAnimations(); + } + else + { + ThumbnailList.PointerMoved -= ThumbnailList_PointerMoved; + UpdateAnimations(); + } + } + + private void ThumbnailList_ItemClick(object sender, ItemClickEventArgs e) + { + ListViewItem listItem = (ListViewItem)ThumbnailList.ContainerFromItem(e.ClickedItem); + CompositionImage image = listItem.ContentTemplateRoot.GetFirstDescendantOfType(); + + // Flip each thumbnail as it's clicked + SpriteVisual sprite = image.SpriteVisual; + sprite.RotationAxis = new Vector3(1, 0, 0); + sprite.CenterPoint = new Vector3(sprite.Size.X / 2, sprite.Size.Y / 2, 0); + + ScalarKeyFrameAnimation rotateAnimation = _compositor.CreateScalarKeyFrameAnimation(); + rotateAnimation.InsertKeyFrame(0, 0); + rotateAnimation.InsertKeyFrame(1, 360); + rotateAnimation.Duration = TimeSpan.FromSeconds(2); + sprite.StartAnimation("RotationAngleInDegrees", rotateAnimation); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TreeEffects/TreeEffects.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TreeEffects/TreeEffects.xaml new file mode 100644 index 000000000..f8f22018a --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TreeEffects/TreeEffects.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TreeEffects/TreeEffects.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TreeEffects/TreeEffects.xaml.cs new file mode 100644 index 000000000..70ba0ca68 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/TreeEffects/TreeEffects.xaml.cs @@ -0,0 +1,291 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Numerics; +using System.Collections.Generic; + +using Windows.UI; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.Graphics.Canvas.Effects; + +namespace CompositionSampleGallery +{ + public sealed partial class TreeEffects : SamplePage + { + + public static string StaticSampleName => "Tree Effects"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Use LayerVisual to apply an animated effect to a tree of SpriteVisuals"; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=869006"; + + public TreeEffects() + { + this.InitializeComponent(); + this.Loaded += MainPage_Loaded; + } + + #region Background Toggle + + public bool BackgroundSwitch + { + get + { + return _backgroundSwitch; + } + set + { + // Animate in normal or reverse based on switch toggle + var batch = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + _blurAnimation.Direction = value ? Microsoft.UI.Composition.AnimationDirection.Normal : Microsoft.UI.Composition.AnimationDirection.Reverse; + _blurBrush.Properties.StartAnimation("blurEffect.BlurAmount", _blurAnimation); + BackgroundToggle.IsEnabled = false; // disable button while animation is in progress + batch.End(); + batch.Completed += Background_BatchCompleted; + _backgroundSwitch = value; + } + } + + private void Background_BatchCompleted(object sender, CompositionBatchCompletedEventArgs args) + { + BackgroundToggle.IsEnabled = true; + } + #endregion + + #region Foreground Toggle + public bool ForegroundSwitch + { + get + { + return _foregroundSwitch; + } + set + { + // Animate in normal or reverse based on switch toggle + var batch = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation); + _saturationAnimation.Direction = value ? Microsoft.UI.Composition.AnimationDirection.Normal : Microsoft.UI.Composition.AnimationDirection.Reverse; + _saturationBrush.Properties.StartAnimation("saturationEffect.Saturation", _saturationAnimation); + ForegroundToggle.IsEnabled = false; // disable button while animation is in progress + batch.End(); + batch.Completed += Foreground_BatchCompleted; + _foregroundSwitch = value; + } + } + + private void Foreground_BatchCompleted(object sender, CompositionBatchCompletedEventArgs args) + { + ForegroundToggle.IsEnabled = true; + } + + #endregion + + private static int CompareZOffset(SpriteVisual one, SpriteVisual two) + { + return (one.Offset.Z).CompareTo(two.Offset.Z); + } + + private void MainPage_Loaded(object sender, RoutedEventArgs e) + { + + // Set up scene: get interop compositor, create comp root and initialize scene + _compositor = ElementCompositionPreview.GetElementVisual(CompGrid).Compositor; + _root = _compositor.CreateContainerVisual(); + ElementCompositionPreview.SetElementChildVisual(CompGrid, _root); + + // Compute root size and scene container transforms; insert clip + _sceneContainer = _compositor.CreateContainerVisual(); + ComputeSceneLayout(); + _root.Children.InsertAtTop(_sceneContainer); + + + // Initialize layervisuals; specify size + _foregroundLayerVisual = _compositor.CreateLayerVisual(); + _backgroundLayerVisual = _compositor.CreateLayerVisual(); + + // Create SpriteVisuals and add to lists + PopulateSpriteVisuals(); + + + // Insert layervisuals in visual tree + _sceneContainer.Children.InsertAtTop(_foregroundLayerVisual); + _sceneContainer.Children.InsertBelow(_backgroundLayerVisual, _foregroundLayerVisual); + + // Initialize effects and their animations + CreateEffectAnimations(); + + // CompGrid_SizeChanged event fired after MainPage_Loaded + CompGrid.SizeChanged += CompGrid_SizeChanged; + } + + private void CompGrid_SizeChanged(object sender, SizeChangedEventArgs e) + { + _foregroundLayerVisual.Children.RemoveAll(); + _backgroundLayerVisual.Children.RemoveAll(); + ComputeSceneLayout(); + PopulateSpriteVisuals(); + } + + #region Compute Layout and Populate Visuals + private void ComputeSceneLayout() + { + // Compute root size and add clip + _root.Size = CompGrid.RenderSize.ToVector2(); + _root.Clip = _compositor.CreateInsetClip(); + + // Populate screen with visuals based on container size + var smallerSize = Math.Min(_root.Size.X, _root.Size.Y); + _spriteSize = new Vector2(smallerSize / 10); + _numVisuals = (_root.Size.X * _root.Size.Y) * 100 / (smallerSize * smallerSize); + + _sceneContainer.Size = _root.Size - _spriteSize; + _sceneContainer.Offset = new Vector3(_spriteSize / 2, 0); + + // Apply perspective transform to sceneContainer + float perspectiveOriginPercent = 0.5f; + Vector3 perspectiveOrigin = new Vector3(perspectiveOriginPercent * _sceneContainer.Size, 0); + float perspectiveDepth = -1000; + _sceneContainer.TransformMatrix = Matrix4x4.CreateTranslation(-perspectiveOrigin) * + new Matrix4x4(1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 1 / perspectiveDepth, + 0, 0, 0, 1) * + Matrix4x4.CreateTranslation(perspectiveOrigin); + } + + private void PopulateSpriteVisuals() + { + // Initialize variables for visual creation loop + int count = 0; + var rand = new Random(); + float z_depth = -1000.0f; + + var listOfForegroundVisuals = new List(); + var listOfBackgroundVisuals = new List(); + + while (count < _numVisuals) + { + var r_x = (float)rand.NextDouble(); + var r_y = (float)rand.NextDouble(); + var r_z = (float)rand.NextDouble(); + + // Create a new sprite with random offset and color + var sprite = _compositor.CreateSpriteVisual(); + sprite.Size = _spriteSize; + sprite.AnchorPoint = new Vector2(0.5f, 0.5f); + sprite.Offset = new Vector3(r_x * _sceneContainer.Size.X, r_y * _sceneContainer.Size.Y, r_z * z_depth); + sprite.Brush = _compositor.CreateColorBrush(Color.FromArgb(190, (byte)rand.Next(255), (byte)rand.Next(255), (byte)rand.Next(255))); + + // Partition into two lists + if (sprite.Offset.Z > z_depth / 2) + { + listOfForegroundVisuals.Add(sprite); + } + else + { + listOfBackgroundVisuals.Add(sprite); + } + count++; + } + + _foregroundLayerVisual.Size = _root.Size; + _backgroundLayerVisual.Size = _root.Size; + + // Sort the lists by z offset so drawing order matches z order + listOfForegroundVisuals.Sort(CompareZOffset); + listOfBackgroundVisuals.Sort(CompareZOffset); + + // Insert spritevisuals into layervisuals + foreach (var visual in listOfForegroundVisuals) + { + _foregroundLayerVisual.Children.InsertAtTop(visual); + } + foreach (var visual in listOfBackgroundVisuals) + { + _backgroundLayerVisual.Children.InsertAtTop(visual); + } + } + + #endregion + + #region Initialize Effects and Animations + private void CreateEffectAnimations() + { + // Create saturation effect + var saturationEffect = new SaturationEffect + { + Name = "saturationEffect", + Saturation = 1f, + Source = new CompositionEffectSourceParameter("foregroundLayerVisual"), + }; + + var saturationFactory = _compositor.CreateEffectFactory(saturationEffect, new[] { "saturationEffect.Saturation" }); + _saturationBrush = saturationFactory.CreateBrush(); + + // Apply animatable saturation effect to foreground visuals + _foregroundLayerVisual.Effect = _saturationBrush; + + // Create blur effect + var blurEffect = new GaussianBlurEffect + { + Name = "blurEffect", + BlurAmount = 0f, + BorderMode = EffectBorderMode.Hard, + Source = new CompositionEffectSourceParameter("backgroundLayerVisual"), + }; + + var blurFactory = _compositor.CreateEffectFactory(blurEffect, new[] { "blurEffect.BlurAmount" }); + _blurBrush = blurFactory.CreateBrush(); + + // Apply animatable saturation effect to foreground visuals + _backgroundLayerVisual.Effect = _blurBrush; + + // Initialize effect animations + var lin = _compositor.CreateLinearEasingFunction(); + + _saturationAnimation = _compositor.CreateScalarKeyFrameAnimation(); + _saturationAnimation.InsertKeyFrame(0, 1f, lin); + _saturationAnimation.InsertKeyFrame(1, 0f, lin); + _saturationAnimation.Duration = _duration; + + _blurAnimation = _compositor.CreateScalarKeyFrameAnimation(); + _blurAnimation.InsertKeyFrame(0, 0f, lin); + _blurAnimation.InsertKeyFrame(1, 20f, lin); + _blurAnimation.Duration = _duration; + } + + #endregion + + private Compositor _compositor; + private ContainerVisual _root; + private ContainerVisual _sceneContainer; + private LayerVisual _foregroundLayerVisual; + private LayerVisual _backgroundLayerVisual; + private float _numVisuals; + private Vector2 _spriteSize; + + private ScalarKeyFrameAnimation _saturationAnimation; + private ScalarKeyFrameAnimation _blurAnimation; + private CompositionEffectBrush _saturationBrush; + private CompositionEffectBrush _blurBrush; + private static readonly TimeSpan _duration = TimeSpan.FromSeconds(3); + private bool _backgroundSwitch; + private bool _foregroundSwitch; + } +} + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Commands/DelegateCommand.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Commands/DelegateCommand.cs new file mode 100644 index 000000000..20eb78c1a --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Commands/DelegateCommand.cs @@ -0,0 +1,81 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Input; + +namespace CompositionSampleGallery.Commands +{ + public interface IDelegateCommand : ICommand + { + void RaiseCanExecuteChanged(); + } + + public class DelegateCommand : IDelegateCommand + { + Action _execute; + Func _canExecute; + + + #region Constructors + public DelegateCommand(Action execute, Func canExecute) + { + this._execute = execute; + this._canExecute = canExecute; + } + + + public DelegateCommand(Action execute) + { + this._execute = execute; + this._canExecute = this.AlwaysCanExecute; + } + #endregion + + #region IDelegateCommand + public void RaiseCanExecuteChanged() + { + if (CanExecuteChanged != null) + { + CanExecuteChanged(this, EventArgs.Empty); + } + } + + + public bool CanExecute(object parameter) + { + return _canExecute(parameter); + } + + + public event EventHandler CanExecuteChanged; + + + public void Execute(object parameter) + { + _execute(parameter); + } + #endregion + + + bool AlwaysCanExecute(object param) + { + return true; + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/BoolToStringConverter.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/BoolToStringConverter.cs new file mode 100644 index 000000000..9b217fbe6 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/BoolToStringConverter.cs @@ -0,0 +1,52 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Picks between two strings depending on the input bool. + /// + public class BoolToStringConverter : IValueConverter + { + /// + /// Takes a bool and returns a string depending on the value of the bool. This converter + /// requires the parameter to be a string that is delimited by a ';'. The string is split + /// on the ';' and returns the first token if the value is true. If the value is false, the + /// second token is used. + /// + /// A bool to be evaluated/converted. + /// Unused. + /// A string that is delimited by a ';'. + /// Unused. + /// String + public object Convert(object value, Type targetType, object parameter, string language) + { + bool bvalue = (bool)value; + var parts = parameter.ToString().Split(';'); + return bvalue ? parts[0] : parts[1]; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/BoolToVisibilityConverter.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/BoolToVisibilityConverter.cs new file mode 100644 index 000000000..c10bd5bab --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/BoolToVisibilityConverter.cs @@ -0,0 +1,55 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Converts a bool to a Visibility enum. + /// + public class BoolToVisibilityConverter : IValueConverter + { + /// + /// Returns Visibility.Visible if value is true, with Visibility.Collapsed returned otherwise. + /// If a parameter of 'true' is provided, the result will be inverted. + /// + /// The bool to be converted. + /// Unused. + /// Optional. If a bool is asigned and it is set to true, then the + /// value is inversed. + /// Unused. + /// Visibility + public object Convert(object value, Type targetType, object parameter, string language) + { + bool bvalue = (bool)value; + bool invert = parameter != null ? (bool)parameter : false; + + bvalue = invert ? !bvalue : bvalue; + + return bvalue ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/InvertBoolConverter.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/InvertBoolConverter.cs new file mode 100644 index 000000000..5fab31d9e --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/InvertBoolConverter.cs @@ -0,0 +1,48 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Inverts a given bool value. + /// + public class InvertBoolConverter : IValueConverter + { + /// + /// Inverts a given bool value. + /// + /// Bool to be inverted. + /// Unused. + /// Unused. + /// Unused. + /// bool + public object Convert(object value, Type targetType, object parameter, string language) + { + bool bvalue = (bool)value; + return !bvalue; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/LightModeToBrushConverter.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/LightModeToBrushConverter.cs new file mode 100644 index 000000000..437c8c824 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/LightModeToBrushConverter.cs @@ -0,0 +1,53 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Media; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Converts a LightMode to a Brush. When the LightMode is set to None, the brush is transparent. + /// Otherwise the brush is red. + /// + public class LightModeToBrushConverter : IValueConverter + { + /// + /// Returns a transparent SolidColorBrush if the LightMode is set to None. Otherwise returns + /// a red SolidColorBrush. + /// + /// The LightMode to be converted. + /// Unused. + /// Unused. + /// Unused. + /// SolidColorBrush + public object Convert(object value, Type targetType, object parameter, string language) + { + LightMode lightMode = (LightMode)value; + Color color = lightMode == LightMode.None ? Colors.Transparent : Colors.Red; + return new SolidColorBrush(color); + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/LightModeToVisibilityConverter.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/LightModeToVisibilityConverter.cs new file mode 100644 index 000000000..e4fe41f79 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/LightModeToVisibilityConverter.cs @@ -0,0 +1,52 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Converts a LightMode to a Visibility enum. + /// + public class LightModeToVisibilityConverter : IValueConverter + { + /// + /// Returns Visibility.Visible if the value matches the parameter. Returns Visibility.Collapsed + /// otherwise. + /// + /// The LightMode to convert. + /// Unused. + /// The string value of the LightMode value checked against. + /// Unused. + /// Visibility + public object Convert(object value, Type targetType, object parameter, string language) + { + LightMode lightMode = (LightMode)value; + String refMode = parameter.ToString().Trim(); + bool match = refMode.Equals(lightMode.ToString()); + return match ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/NullToVisibilityConverter.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/NullToVisibilityConverter.cs new file mode 100644 index 000000000..56b66a5b2 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/NullToVisibilityConverter.cs @@ -0,0 +1,48 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Converts null to Visibility. + /// + public class NullToVisibilityConverter : IValueConverter + { + /// + /// Returns Visibility.Collapsed if the value is null. Returns Visibility.Visible otherwise. + /// + /// The object to be checked for null. + /// Unused. + /// Unused. + /// Unused. + /// Visibility + public object Convert(object value, Type targetType, object parameter, string language) + { + return value == null ? Visibility.Collapsed : Visibility.Visible; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/StringApenderConverter.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/StringApenderConverter.cs new file mode 100644 index 000000000..5c33c30b5 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/Converters/StringApenderConverter.cs @@ -0,0 +1,57 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI.Xaml.Data; + +namespace CompositionSampleGallery.Converters +{ + /// + /// Appends a string to a given value. + /// + public class StringAppenderConverter : IValueConverter + { + /// + /// Returns value.ToString() + " " + parameter.ToString(). + /// + /// The value to be appended. + /// Unused. + /// The string to append. + /// Unused. + /// String + public object Convert(object value, Type targetType, object parameter, string language) + { + string result = ""; + if (value != null) + { + result = value.ToString(); + if (parameter != null) + { + result += " " + parameter.ToString(); + } + } + + return result; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + throw new NotImplementedException(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/EffectItem.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/EffectItem.cs new file mode 100644 index 000000000..c0651e47e --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/EffectItem.cs @@ -0,0 +1,125 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CompositionSampleGallery +{ + /// + /// A model for CompositionEffectBrush. Dictates slider values, as well as changes a given + /// property of the effect brush. + /// + public class EffectItem + { + // Private Members + private CompositionEffectFactory _factory; + private CompositionEffectBrush _brush; + + /// + /// The name of the effect. Must match the name given to the effect in the effect definition. + /// + public String EffectName { get; set; } + /// + /// The name of the property. Must match the name of the property. + /// + public String AnimatablePropertyName { get; set; } + /// + /// The minimum value for the animatable property. + /// + public float ValueMin { get; set; } + /// + /// The maximum value for the animatable property. + /// + public float ValueMax { get; set; } + + /// + /// Function called to create the effect brush. + /// + public Func CreateEffectFactory { get; set; } + + // Slider specific properties. + public float SmallChange { get; set; } + public float LargeChange { get; set; } + + /// + /// Returns the effect brush for this model. If a brush has not beeen created, one is created + /// given CreateEffectFactory has been assigned. + /// + /// CompositionEffectBrush + public CompositionEffectBrush GetEffectBrush() + { + if (_brush == null && CreateEffectFactory != null) + { + if (_factory == null) + { + _factory = CreateEffectFactory(); + } + + _brush = _factory.CreateBrush(); + } + + return _brush; + } + + /// + /// Changes the animatable property on the effect brush if already created. Does nothing if + /// there is no animatable property present. + /// + /// Value to assign to the effect brush's animatable property. + public void ChangeValue(float value) + { + if (_brush != null && !String.IsNullOrEmpty(AnimatablePropertyName)) + { + // Change the value on the effect brush. Unlike a visual, where only the property name + // is needed, both the effect name and the property value are needed to specify the + // effect property. + _brush.Properties.InsertScalar(EffectName + "." + AnimatablePropertyName, value); + } + } + + /// + /// Animates the effect brush property from the given starting value to the given ending + /// value for the given duration. The default easing funciton is used. + /// + /// Starting value for the effect brush property. + /// The ending or target value for the effect brush property. + /// Desired length of the animation. + public void Animate(float start, float end, double duration) + { + if (_brush != null && !String.IsNullOrEmpty(AnimatablePropertyName)) + { + // Create our animation. + var compositor = _brush.Compositor; + var animation = compositor.CreateScalarKeyFrameAnimation(); + animation.InsertKeyFrame(0.0f, start); + animation.InsertKeyFrame(1.0f, end); + animation.Duration = TimeSpan.FromSeconds(duration); + + // Like with directly changing the effect property, the full effect name and effect + // property name are needed to set an animation. + _brush.StartAnimation(EffectName + "." + AnimatablePropertyName, animation); + } + } + + /// + /// Sentinel value for no effect. + /// + public static EffectItem None = new EffectItem() { EffectName = "None" }; + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/VideoPlayground.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/VideoPlayground.xaml new file mode 100644 index 000000000..2b4cb63bc --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 14393/VideoPlayground/VideoPlayground.xaml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 15063/ShowHideImplicitWebview/ShowHideImplicitWebview.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 15063/ShowHideImplicitWebview/ShowHideImplicitWebview.xaml.cs new file mode 100644 index 000000000..d0f6474af --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 15063/ShowHideImplicitWebview/ShowHideImplicitWebview.xaml.cs @@ -0,0 +1,314 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Shapes; +using System; +using System.Collections.Generic; +using System.Numerics; + +namespace CompositionSampleGallery +{ + public sealed partial class ShowHideImplicitWebview : SamplePage + { + private Compositor _compositor; + private Visual _image1, _image2, _image3; + private Vector3 _primaryImageOffset, _secondaryImageOffset, _tertiaryImageOffset; + private Vector3 _primaryImageScale, _secondaryImageScale, _tertiaryImageScale; + private Ellipse _currentPrimary, _currentSecondary, _currentTertiary; + private Dictionary imageDictionary; + private static string _rightArrowGlyph = "\u2190"; + private static string _leftArrowGlyph = "\u2192"; + private bool _circlesVisible = true; + private ImplicitAnimationCollection _implicitAnimationCollection; + + public static string StaticSampleName => "Implicit Show/Hide Webview"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Demonstrates how to apply an implicit show/hide animation on a " + + "webview UI element in a realistic app scenario."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868955"; + + + public ShowHideImplicitWebview() + { + this.InitializeComponent(); + + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + imageDictionary = new Dictionary(); + + _primaryImageScale = new Vector3(1, 1, 1); + _secondaryImageScale = new Vector3(0.8f, 0.8f, 0.8f); + _tertiaryImageScale = new Vector3(0.6f, 0.6f, 0.6f); + + this.CreateImageObjects(); + + // Implicit show animation for webview + var showWebviewAnimation = _compositor.CreateScalarKeyFrameAnimation(); + showWebviewAnimation.InsertKeyFrame(0.0f, 0.0f); + showWebviewAnimation.InsertKeyFrame(1.0f, 1.0f); + showWebviewAnimation.Target = nameof(Visual.Opacity); + showWebviewAnimation.Duration = TimeSpan.FromSeconds(0.5f); + ElementCompositionPreview.SetImplicitShowAnimation(PageWebview, showWebviewAnimation); + + // Implicit hide animation for webview + var hideWebviewAnimation = _compositor.CreateScalarKeyFrameAnimation(); + hideWebviewAnimation.InsertKeyFrame(0.0f, 1.0f); + hideWebviewAnimation.InsertKeyFrame(1.0f, 0.0f); + hideWebviewAnimation.Target = nameof(Visual.Opacity); + hideWebviewAnimation.Duration = TimeSpan.FromSeconds(0.5f); + ElementCompositionPreview.SetImplicitHideAnimation(PageWebview, hideWebviewAnimation); + + // Implicit show animation for the images + var showImagesAnimation = _compositor.CreateScalarKeyFrameAnimation(); + showImagesAnimation.InsertKeyFrame(0.0f, 0.0f); + showImagesAnimation.InsertKeyFrame(1.0f, 1.0f); + showImagesAnimation.Target = nameof(Visual.Opacity); + showImagesAnimation.Duration = TimeSpan.FromSeconds(1.0f); + ElementCompositionPreview.SetImplicitShowAnimation(CircleCanvas, showImagesAnimation); + + // Offset and scale implicit animation set up for images + _implicitAnimationCollection = _compositor.CreateImplicitAnimationCollection(); + // Offset implicit animation + var offsetAnimation = _compositor.CreateVector3KeyFrameAnimation(); + offsetAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); + offsetAnimation.Duration = TimeSpan.FromSeconds(1.0f); + offsetAnimation.Target = nameof(Visual.Offset); + // Scale implicit animation + var scaleAnimation = _compositor.CreateVector3KeyFrameAnimation(); + scaleAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); + scaleAnimation.Duration = TimeSpan.FromSeconds(1.0f); + scaleAnimation.Target = nameof(Visual.Scale); + // Add to collection + _implicitAnimationCollection["Offset"] = offsetAnimation; + _implicitAnimationCollection["Scale"] = scaleAnimation; + } + + /// + /// Helper to create image objects + /// + private void CreateImageObjects() + { + ImageItem imageItem1 = new ImageItem("https://en.wikipedia.org/wiki/Slug"); + ImageItem imageItem2 = new ImageItem("https://en.wikipedia.org/wiki/Nymphalidae"); + ImageItem imageItem3 = new ImageItem("https://en.wikipedia.org/wiki/Dahlia#Flower_type"); + + imageDictionary.Add(Image1, imageItem1); + imageDictionary.Add(Image2, imageItem2); + imageDictionary.Add(Image3, imageItem3); + } + + /// + /// Update layout and webivew on page load + /// + private void Page_Loaded(object sender, RoutedEventArgs e) + { + _primaryImageOffset = new Vector3((float)(6 * (CircleCanvas.ActualWidth / 18)), (float)CircleCanvas.ActualHeight / 5, 0); + _secondaryImageOffset = new Vector3((float)(1 * (CircleCanvas.ActualWidth / 14)), (float)CircleCanvas.ActualHeight / 7, 20); + _tertiaryImageOffset = new Vector3((float)(20 * (CircleCanvas.ActualWidth / 30)), (float)CircleCanvas.ActualHeight / 10, 40); + + // Get backing visuals + _image1 = ElementCompositionPreview.GetElementVisual(Image1); + _image2 = ElementCompositionPreview.GetElementVisual(Image2); + _image3 = ElementCompositionPreview.GetElementVisual(Image3); + + // Update XAML element visibility to trigger show animation + Image1.Visibility = Visibility.Visible; + Image2.Visibility = Visibility.Visible; + Image3.Visibility = Visibility.Visible; + + _currentPrimary = Image1; + _currentSecondary = Image2; + _currentTertiary = Image3; + + UpdateVisualLayout(); + UpdateWebview(_currentPrimary); + } + + /// + /// Show webview on navigation complete, which will trigger show implicit animation + /// + private void PageWebview_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args) + { + PageWebview.Visibility = Visibility.Visible; + } + + /// + /// Updates circle image positions on grid resize + /// Also update portrait layout values if applicable + /// + private void MainGrid_SizeChanged(object sender, SizeChangedEventArgs e) + { + UpdateVisualLayout(); + + if (LeftStackPanel.Visibility == Visibility.Collapsed && PageWebview.Visibility == Visibility.Visible) + { + MainGrid.ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star); + MainGrid.ColumnDefinitions[1].Width = new GridLength(3, GridUnitType.Star); + MainGrid.ColumnDefinitions[2].Width = new GridLength(20, GridUnitType.Star); + + // Update glyph + ViewMoreButtonIcon.Glyph = _rightArrowGlyph; + } + } + + /// + /// Click listener for navigation on portrait layout + /// + private void ViewMoreButton_Click(object sender, RoutedEventArgs e) + { + if (_circlesVisible) + { + LeftStackPanel.Visibility = Visibility.Collapsed; + PageWebview.Visibility = Visibility.Visible; + MainGrid.ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star); + MainGrid.ColumnDefinitions[1].Width = new GridLength(3, GridUnitType.Star); + MainGrid.ColumnDefinitions[2].Width = new GridLength(20, GridUnitType.Star); + + // Update glyph + ViewMoreButtonIcon.Glyph = _rightArrowGlyph; + } + else + { + LeftStackPanel.Visibility = Visibility.Visible; + PageWebview.Visibility = Visibility.Collapsed; + MainGrid.ColumnDefinitions[0].Width = new GridLength(20, GridUnitType.Star); + MainGrid.ColumnDefinitions[1].Width = new GridLength(3, GridUnitType.Star); + MainGrid.ColumnDefinitions[2].Width = new GridLength(1, GridUnitType.Star); + + // Update glyph + ViewMoreButtonIcon.Glyph = _leftArrowGlyph; + } + _circlesVisible = !_circlesVisible; + } + + /// + /// Navigates the webview to the info URL of a passed image + /// + private void UpdateWebview(Ellipse imageLookup) + { + PageWebview.Navigate(new Uri(imageDictionary[imageLookup].GetWebviewString())); + } + + /// + /// Helper to update circle image size/positioning without animation + /// + private void UpdateVisualLayout() + { + if (_currentPrimary != null) + { + var primary = ElementCompositionPreview.GetElementVisual(_currentPrimary); + var secondary = ElementCompositionPreview.GetElementVisual(_currentSecondary); + var tertiary = ElementCompositionPreview.GetElementVisual(_currentTertiary); + + primary.Offset = _primaryImageOffset; + primary.Scale = _primaryImageScale; + + secondary.Offset = _secondaryImageOffset; + secondary.Scale = _secondaryImageScale; + + tertiary.Offset = _tertiaryImageOffset; + tertiary.Scale = _tertiaryImageScale; + } + } + + /// + /// Helper to animate circle images to new positions given new desired position information + /// Triggers implicit offset/scale animations + /// + private void AnimateImages(Visual newPrimary, Ellipse newPrimaryImage, Visual newSecondary, Ellipse newSecondaryImage, Visual newTertiary, Ellipse newTertiaryImage) + { + // Connect implicit animations + newPrimary.ImplicitAnimations = _implicitAnimationCollection; + newSecondary.ImplicitAnimations = _implicitAnimationCollection; + newTertiary.ImplicitAnimations = _implicitAnimationCollection; + + // Update values to trigger implicit animations + + newPrimary.Offset = _primaryImageOffset; + newPrimary.Scale = _primaryImageScale; + + newSecondary.Offset = _secondaryImageOffset; + newSecondary.Scale = _secondaryImageScale; + + newTertiary.Offset = _tertiaryImageOffset; + newTertiary.Scale = _tertiaryImageScale; + + // Update current order + _currentPrimary = newPrimaryImage; + _currentSecondary = newSecondaryImage; + _currentTertiary = newTertiaryImage; + + // Reorder visual tree + var xamlImage1Storage = Image1; + var xamlImage2Storage = Image2; + var xamlImage3Storage = Image3; + CircleCanvas.Children.Clear(); + CircleCanvas.Children.Add(_currentTertiary); + CircleCanvas.Children.Add(_currentSecondary); + CircleCanvas.Children.Add(_currentPrimary); + } + + /// + /// On image click, animate circle images to appropriate view and update webview + /// + private void Image3_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) + { + this.AnimateImages(_image3, Image3, _image1, Image1, _image2, Image2); + PageWebview.Visibility = Visibility.Collapsed; + this.UpdateWebview(Image3); + } + + /// + /// On image click, animate circle images to appropriate view and update webview + /// + private void Image2_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) + { + this.AnimateImages(_image2, Image2, _image3, Image3, _image1, Image1); + PageWebview.Visibility = Visibility.Collapsed; + this.UpdateWebview(Image2); + } + + /// + /// On image click, animate circle images to appropriate view and update webview + /// + private void Image1_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) + { + this.AnimateImages(_image1, Image1, _image2, Image2, _image3, Image3); + PageWebview.Visibility = Visibility.Collapsed; + this.UpdateWebview(Image1); + } + } + + /// + /// Stores information about an image + /// + public class ImageItem + { + private string webviewString; + + public ImageItem(string webviewString) + { + this.webviewString = webviewString; + } + + public string GetWebviewString() + { + return webviewString; + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/LinearGradients/LinearGradients.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/LinearGradients/LinearGradients.xaml new file mode 100644 index 000000000..e611f3ecf --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/LinearGradients/LinearGradients.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + About + + + + + Work + + + + + Partners + + + + + Awards + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/LinearGradients/LinearGradients.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/LinearGradients/LinearGradients.xaml.cs new file mode 100644 index 000000000..615b9365c --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/LinearGradients/LinearGradients.xaml.cs @@ -0,0 +1,220 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Numerics; +using System.Linq; + +using Windows.UI; + +using Microsoft.UI; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Media; + +namespace CompositionSampleGallery +{ + public sealed partial class LinearGradients : SamplePage + { + public static string StaticSampleName => "Linear Gradients"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Simple visual effect showing linear gradient animations. Scroll mouse over the textblocks or click on them to see the animations."; + public override string SampleDescription => StaticSampleDescription; + + private static readonly (Color, Color) s_coolColors = (Colors.LightSkyBlue, Colors.Teal); + private static readonly (Color, Color) s_warmColors = (Colors.DeepPink, Colors.Honeydew); + + private readonly Compositor _compositor = CompositionTarget.GetCompositorForCurrentThread(); + + private readonly CompositionColorGradientStop _gradientStop1; + private readonly CompositionColorGradientStop _gradientStop2; + + private ColorScheme _currentColorScheme = ColorScheme.Warm; + + public LinearGradients() + { + this.InitializeComponent(); + + // Create the linear gradient brush with the initial color scheme. + var (stop1Color, stop2Color) = GetCurrentColors(); + var linearGradientBrush = _compositor.CreateLinearGradientBrush(); + _gradientStop1 = _compositor.CreateColorGradientStop(); + _gradientStop1.Color = stop1Color; + _gradientStop2 = _compositor.CreateColorGradientStop(); + _gradientStop2.Offset = 1; + _gradientStop2.Color = stop2Color; + linearGradientBrush.ColorStops.Add(_gradientStop1); + linearGradientBrush.ColorStops.Add(_gradientStop2); + + // Create the Visuals that will be used to paint with the linear gradient brush + // behind each line of text. + foreach (Grid lineElement in TextLines.Children) + { + var visual = _compositor.CreateSpriteVisual(); + visual.Brush = linearGradientBrush; + + // Initially 0% scale on the X axis, so the Visual will be invisible. + visual.Scale = new Vector3(0, 1, 1); + + // The Visual will be sized relative to its parent. + visual.RelativeSizeAdjustment = Vector2.One; + + // Save the Visual in the Tag on the element for easy access in the event handlers. + lineElement.Tag = visual; + + // Parent the Visual to the first child. The second child + // is the TextBlock that will draw on top of this Visual. + ElementCompositionPreview.SetElementChildVisual(lineElement.Children[0], visual); + } + } + private ColorKeyFrameAnimation CreateAnimationToColor(Color color) + { + var animation = _compositor.CreateColorKeyFrameAnimation(); + animation.InsertKeyFrame(1, color); + animation.Duration = TimeSpan.FromSeconds(2); + return animation; + } + + private void AnimateToNewColorScheme(ColorScheme colorScheme) + { + // Save the color scheme as the current one. + _currentColorScheme = colorScheme; + + // Animate to the colors in the color scheme. + var (stop1Color, stop2Color) = GetCurrentColors(); + _gradientStop1.StartAnimation("Color", CreateAnimationToColor(stop1Color)); + _gradientStop2.StartAnimation("Color", CreateAnimationToColor(stop2Color)); + } + + // Animate the given Visual to sweep across the text. + private void AnimateToNewPosition(Visual visual) + { + // Scale the width from 0 to 1 to 0. + var scaleAnimation = _compositor.CreateVector3KeyFrameAnimation(); + scaleAnimation.InsertKeyFrame(0, new Vector3(0, 1, 1)); + scaleAnimation.InsertKeyFrame(.5f, Vector3.One); + scaleAnimation.InsertKeyFrame(1, new Vector3(0, 1, 1)); + scaleAnimation.Duration = TimeSpan.FromSeconds(2); + visual.StartAnimation("Scale", scaleAnimation); + + // Sweep the offset along the x axis. + var targetX = + visual.RelativeOffsetAdjustment.X == 0 + ? 1 + : 0; + + visual.AnchorPoint = new Vector2(targetX, 0); + + var offsetAnimation = _compositor.CreateScalarKeyFrameAnimation(); + offsetAnimation.Duration = TimeSpan.FromSeconds(1); + offsetAnimation.InsertKeyFrame(1, targetX); + visual.StartAnimation("RelativeOffsetAdjustment.X", offsetAnimation); + } + + private void Line_PointerPressed(object sender, RoutedEventArgs e) + { + // Toggle the color scheme. + AnimateToNewColorScheme(GetComplementaryColorScheme(_currentColorScheme)); + } + + private void Line_PointerEntered(object sender, PointerRoutedEventArgs e) + { + // Get the Visual associated with the sender and animate its position and width. + AnimateToNewPosition((SpriteVisual)((FrameworkElement)sender).Tag); + + if (sender == TextLines.Children.First()) + { + // Pointer is over the top line. + switch (_currentColorScheme) + { + case ColorScheme.CoolReversed: + case ColorScheme.Warm: + AnimateToNewColorScheme(GetReversedColorScheme(_currentColorScheme)); + break; + } + } + else if (sender == TextLines.Children.Last()) + { + // Pointer is over the bottom line. + switch (_currentColorScheme) + { + case ColorScheme.Cool: + case ColorScheme.WarmReversed: + AnimateToNewColorScheme(GetReversedColorScheme(_currentColorScheme)); + break; + } + } + } + + private (Color, Color) GetCurrentColors() + { + switch (_currentColorScheme) + { + case ColorScheme.Warm: return s_warmColors; + case ColorScheme.WarmReversed: return Reverse(s_warmColors); + case ColorScheme.Cool: return s_coolColors; + case ColorScheme.CoolReversed: return Reverse(s_coolColors); + default: + throw new InvalidOperationException(); + } + } + + private static ColorScheme GetComplementaryColorScheme(ColorScheme colorScheme) + => ApplyColorSchemeFunction( + colorScheme, + ifWarm: ColorScheme.Cool, + ifWarmReversed: ColorScheme.CoolReversed, + ifCool: ColorScheme.Warm, + ifCoolReversed: ColorScheme.WarmReversed); + + private static ColorScheme GetReversedColorScheme(ColorScheme colorScheme) + => ApplyColorSchemeFunction( + colorScheme, + ifWarm: ColorScheme.WarmReversed, + ifWarmReversed: ColorScheme.Warm, + ifCool: ColorScheme.CoolReversed, + ifCoolReversed: ColorScheme.Cool); + + private static ColorScheme ApplyColorSchemeFunction( + ColorScheme input, + ColorScheme ifWarm, + ColorScheme ifWarmReversed, + ColorScheme ifCool, + ColorScheme ifCoolReversed) + { + switch (input) + { + case ColorScheme.Warm: return ifWarm; + case ColorScheme.WarmReversed: return ifWarmReversed; + case ColorScheme.Cool: return ifCool; + case ColorScheme.CoolReversed: return ifCoolReversed; + default: + throw new InvalidOperationException(); + } + } + + private static (T, T) Reverse((T, T) pair) => (pair.Item2, pair.Item1); + + private enum ColorScheme + { + Warm, + WarmReversed, + Cool, + CoolReversed, + } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/SpringyImage/SpringyImage.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/SpringyImage/SpringyImage.xaml new file mode 100644 index 000000000..98aaf2628 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/SpringyImage/SpringyImage.xaml @@ -0,0 +1,24 @@ + + + + + + + + + Spring Properties + Damping Ratio + + Period (in sec) + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/SpringyImage/SpringyImage.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/SpringyImage/SpringyImage.xaml.cs new file mode 100644 index 000000000..33a2ff22c --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 16299/SpringyImage/SpringyImage.xaml.cs @@ -0,0 +1,180 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using ExpressionBuilder; + +using System; +using System.Numerics; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Input; + +using EF = ExpressionBuilder.ExpressionFunctions; +using EV = ExpressionBuilder.ExpressionValues; + +namespace CompositionSampleGallery +{ + + public sealed partial class SpringyImage : SamplePage + { + public SpringyImage() + { + this.InitializeComponent(); + Setup(); + } + + public static string StaticSampleName => "Springy Image"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Animate the Scale property of a Visual with a Spring-based Animation."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "https://go.microsoft.com/fwlink/?linkid=868957"; + + private void Setup() + { + // Grab the existing Compositor for this page + _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; + + // Define the Spring Animation that will be used to animate images + // Create a SpringVector3Animation since we will be animating Scale + _springAnimation = _compositor.CreateSpringVector3Animation(); + _springAnimation.DampingRatio = 0.65f; + _springAnimation.Period = TimeSpan.FromSeconds(.05); + + // Track if an image has been clicked, initially set to false + _imageClickScaleMode = false; + + // Setup the Expressions to manage list layout + SetupImageList(); + } + + private void SetupImageList() + { + // Note: Translation is an additive value to the Offset property when defining the final position of a backed visual of a UIElement + + // This Expression defines an equation that changes the Y Translation of an image based on the scale of its vertical neighbor image. + // As the scale of an image grows, the images below it will dynamically move down. + // The equation is built by summing up two different deltas caused by a scale animation: + // 1) The delta caused by the image directly above the target scaling to a value > 1 (should have no effect if scale == 1) + // 2) Any additional delta caused by if the image above has translated down because the image above it (or higher up) has scaled up + // [Will either be a large scale from Click, or medium scale if on hover] + // Note: 120 represents the height of the images + the gap between them + + var visualPlaceHolder = EV.Reference.CreateVisualReference("visual"); + var factor = EV.Constant.CreateConstantScalar("factor"); + _translationDeltaExp = ((visualPlaceHolder.Scale.Y - 1) * (float)image.Height) + + EF.Conditional( + ((visualPlaceHolder.Translation.Y / (120 * factor)) > 1), + (EV.Constant.CreateConstantScalar("largeScaleDiff")), + visualPlaceHolder.Translation.Y % (120 * factor) + ); + + // Activate Translation property for Visuals backing a UIElement + TranslationSetup(image); + TranslationSetup(image2); + TranslationSetup(image3); + TranslationSetup(image4); + + // Setup the Expression on the Y Translation property for images 2 - 4. + // Pass in the target image that the Expression gets applied to, the image above it for reference and images indexed position + // Note: Since the first image does not have an image above it, do not need to apply the Expression to it + StartAnimationHelper(image2, image, 1); + StartAnimationHelper(image3, image2, 2); + StartAnimationHelper(image4, image3, 3); + } + + private void TranslationSetup(UIElement element) + { + // Activate Translation property on the UIElement images + ElementCompositionPreview.SetIsTranslationEnabled(element, true); + var visual = ElementCompositionPreview.GetElementVisual(element); + visual.Properties.InsertVector3("Translation", new Vector3(0)); + } + + private void StartAnimationHelper(UIElement targetImage, UIElement imageAbove, int indexFactor) + { + // Retrieve references to the target Visual of the Expression along with the vertical neighbor we need to reference + var referenceVisual = ElementCompositionPreview.GetElementVisual(imageAbove); + var targetVisual = ElementCompositionPreview.GetElementVisual(targetImage); + + // Set the references to the Expression and Start it on the target Visual + _translationDeltaExp.SetReferenceParameter("visual", referenceVisual); + _translationDeltaExp.SetScalarParameter("factor", indexFactor); + _translationDeltaExp.SetScalarParameter("largeScaleDiff", 2 * (float)image.Height); + targetVisual.StartAnimation("Translation.Y", _translationDeltaExp); + } + + private void Button_Click(object sender, RoutedEventArgs e) + { + float dampInputResult; + TimeSpan periodInputResult; + + // Check input and assign if valid + if (float.TryParse(DampingInput.Text, out dampInputResult)) + { + _springAnimation.DampingRatio = dampInputResult; + } + if (TimeSpan.TryParse(PeriodInput.Text, out periodInputResult)) + { + _springAnimation.Period = periodInputResult; + } + } + + private void image_PointerEntered(object sender, PointerRoutedEventArgs e) + { + // Animating the image only if not been previously clicked + if (!_imageClickScaleMode) + { + _springAnimation.FinalValue = new Vector3(1.5f); + var visual = ElementCompositionPreview.GetElementVisual((UIElement)sender); + visual.StartAnimation("Scale", _springAnimation); + } + } + + private void image_PointerExited(object sender, PointerRoutedEventArgs e) + { + // Animating the image only if not been previously clicked + if (!_imageClickScaleMode) + { + _springAnimation.FinalValue = new Vector3(1f); + var visual = ElementCompositionPreview.GetElementVisual((UIElement)sender); + visual.StartAnimation("Scale", _springAnimation); + } + } + + private void image_PointerReleased(object sender, PointerRoutedEventArgs e) + { + if (!_imageClickScaleMode) + { + // If not previously clicked, then scale to large size + _imageClickScaleMode = true; + _springAnimation.FinalValue = new Vector3(3.0f); + } + else + { + // Else scale to original size + _imageClickScaleMode = false; + _springAnimation.FinalValue = new Vector3(1f); + } + var visual = ElementCompositionPreview.GetElementVisual((UIElement)sender); + visual.StartAnimation("Scale", _springAnimation); + } + + private Compositor _compositor; + private SpringVector3NaturalMotionAnimation _springAnimation; + private ExpressionNode _translationDeltaExp; + private bool _imageClickScaleMode; + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 17134/AnimationController/AnimationControl.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 17134/AnimationController/AnimationControl.cs new file mode 100644 index 000000000..ca52cb715 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 17134/AnimationController/AnimationControl.cs @@ -0,0 +1,206 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* +using System; +using System.Numerics; + +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; + +namespace CompositionSampleGallery +{ + public sealed partial class AnimationControl : SamplePage + { + public AnimationControl() + { + InitializeComponent(); + AnimationSetup(); + } + + public static string StaticSampleName => "Animation Controller"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "Play, pause, speed up, slow down, " + + "or scrub your animation with the AnimationController API"; + public override string SampleDescription => StaticSampleDescription; + private void AnimationSetup() + { + _compositor = CompositionTarget.GetCompositorForCurrentThread(); + _visual = ElementCompositionPreview.GetElementVisual(Rectangle); + _pause = true; + _interval = TimeSpan.FromMilliseconds(16); // based on 60f/sec + + var linear = _compositor.CreateLinearEasingFunction(); + int animationDuration = 4; + float animationMax = 250f; + + // set up main animation + ElementCompositionPreview.SetIsTranslationEnabled(Rectangle, true); + _animation = _compositor.CreateVector3KeyFrameAnimation(); + _animation.InsertKeyFrame(0.25f, new Vector3(animationMax, (float)Canvas.GetTop(Rectangle), 0f), linear); + _animation.InsertKeyFrame(0.5f, new Vector3(animationMax, animationMax, 0f), linear); + _animation.InsertKeyFrame(0.75f, new Vector3((float)Canvas.GetLeft(Rectangle), animationMax, 0f), linear); + _animation.InsertKeyFrame(1f, new Vector3((float)Canvas.GetLeft(Rectangle), (float)Canvas.GetTop(Rectangle), 0f), linear); + _animation.Duration = TimeSpan.FromSeconds(animationDuration); + _animation.IterationBehavior = AnimationIterationBehavior.Forever; + + // set up dispatcher timer to animate slider + _sliderAnimator = new DispatcherTimer(); + _sliderAnimator.Tick += SliderBehavior; + _sliderAnimator.Interval = _interval; + + // initialize amount to change slider value per tick + _delta = (slider.Maximum / _animation.Duration.TotalMilliseconds) * _interval.TotalMilliseconds; + + // add pointer listeners to slider for smooth scrubbing action + slider.AddHandler(PointerPressedEvent, new PointerEventHandler(PressedThumb), true); + slider.AddHandler(PointerReleasedEvent, new PointerEventHandler(ReleasedThumb), true); + } + private void EnsureController() + { + if (_controller == null) + { + // start animation on visual, and grab AnimationController from visual + _visual.StartAnimation(nameof(Visual.Offset), _animation); + _controller = _visual.TryGetAnimationController(nameof(Visual.Offset)); + _controller.Pause(); + } + } + private void PlayPause_Animation(object sender, RoutedEventArgs e) + { + EnsureController(); + if (_pause) + { + _controller.Resume(); + PlaySlider(); + PlayIcon.Symbol = Symbol.Pause; + } + else + { + _controller.Pause(); + StopSlider(); + PlayIcon.Symbol = Symbol.Play; + } + _pause = !_pause; + } + private void Stop_Animation(object sender, RoutedEventArgs e) + { + _pause = false; + PlayPause_Animation(sender, e); + _controller.PlaybackRate = 1; + _controller.Progress = 0; + slider.Value = 0; + } + private void SpeedUp_Animation(object sender, RoutedEventArgs e) + { + EnsureController(); + if (Math.Abs(_controller.PlaybackRate) < Math.Abs(AnimationController.MaxPlaybackRate) && !_pause) + { + _controller.PlaybackRate *= 2; + } + } + private void SlowDown_Animation(object sender, RoutedEventArgs e) + { + EnsureController(); + if (Math.Abs(_controller.PlaybackRate) > Math.Abs(AnimationController.MinPlaybackRate) && !_pause) + { + _controller.PlaybackRate /= 2; + } + } + private void Reverse_Animation(object sender, RoutedEventArgs e) + { + if (!_pause) + { + _controller.PlaybackRate *= -1; + } + } + + // helper methods to animate slider + private void OnSliderValueChanged(object sender, RangeBaseValueChangedEventArgs e) + { + EnsureController(); + // this enables scrubbing + _controller.Progress = (float)slider.Value * .01f; + } + private void SliderBehavior(object sender, object e) + { + // update slider.Value based on time elapsed + DateTimeOffset currentTime = DateTimeOffset.Now; + TimeSpan elapsedTime = currentTime - lastTime; + double numTicks = elapsedTime.TotalMilliseconds / _interval.TotalMilliseconds; + slider.Value += (_delta * numTicks * _controller.PlaybackRate); + + // logic to loop slider animation + // if PlaybackRate is less than 0, playing in reverse + if (_controller.PlaybackRate > 0) + { + if (slider.Value == 100) + { + slider.Value = 0; + } + } + else + { + if (slider.Value == 0) + { + slider.Value = 100; + } + } + lastTime = currentTime; + } + private void PlaySlider() + { + if (_sliderAnimator != null) + { + _sliderAnimator.Start(); + lastTime = DateTimeOffset.Now; + } + } + private void StopSlider() + { + if (_sliderAnimator != null) + _sliderAnimator.Stop(); + } + + // helper methods for mouse input on the slider for smooth scrubbing action + private void PressedThumb(object sender, PointerRoutedEventArgs e) + { + EnsureController(); + StopSlider(); + _controller.Pause(); + } + private void ReleasedThumb(object sender, PointerRoutedEventArgs e) + { + EnsureController(); + if (!_pause) + { + PlaySlider(); + _controller.Resume(); + } + } + + private Compositor _compositor; + private Vector3KeyFrameAnimation _animation; + private AnimationController _controller; + private Visual _visual; + private bool _pause; + private DispatcherTimer _sliderAnimator; + private TimeSpan _interval; + private DateTimeOffset lastTime; + private double _delta; + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 17134/AnimationController/AnimationControl.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 17134/AnimationController/AnimationControl.xaml new file mode 100644 index 000000000..140d920b0 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SDK 17134/AnimationController/AnimationControl.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SceneNode/SceneNodePlayground.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SceneNode/SceneNodePlayground.xaml new file mode 100644 index 000000000..ac9803c44 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SceneNode/SceneNodePlayground.xaml @@ -0,0 +1,15 @@ + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SceneNode/SceneNodePlayground.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SceneNode/SceneNodePlayground.xaml.cs new file mode 100644 index 000000000..8eb6687fd --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Samples/SceneNode/SceneNodePlayground.xaml.cs @@ -0,0 +1,1169 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using SamplesCommon; +using System; +using System.Runtime.InteropServices; +using System.Numerics; + +using Windows.Foundation; + +using Microsoft.UI.Composition; +using Microsoft.UI.Composition.Scenes; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; + +namespace CompositionSampleGallery +{ + public sealed partial class SceneNodePlayground : SamplePage + { + public static string StaticSampleName => "SceneNode Playground"; + public override string SampleName => StaticSampleName; + public static string StaticSampleDescription => "SceneNode Sample."; + public override string SampleDescription => StaticSampleDescription; + public override string SampleCodeUri => "http://go.microsoft.com/fwlink/p/?LinkID=761172"; + + public SceneNodePlayground() + { + this.InitializeComponent(); + } + + private void SceneNodePlayground_Loaded(object sender, RoutedEventArgs e) + { + Compositor compositor = ElementCompositionPreview.GetElementVisual(MyGrid).Compositor; + ContainerVisual container = compositor.CreateContainerVisual(); + ElementCompositionPreview.SetElementChildVisual(MyGrid, container); + + var sceneNode = SceneNode.Create(compositor); + + var sceneVisual = SceneVisual.Create(compositor); + sceneVisual.Root = sceneNode; + sceneVisual.Size = new Vector2(500); + sceneVisual.Offset = new Vector3(250, 250, 0); + + container.Children.InsertAtTop(sceneVisual); + + var mesh = SceneMesh.Create(compositor); + + mesh.PrimitiveTopology = Microsoft.Graphics.DirectX.DirectXPrimitiveTopology.TriangleList; + + mesh.FillMeshAttribute( + SceneAttributeSemantic.Vertex, + Microsoft.Graphics.DirectX.DirectXPixelFormat.R32G32B32Float, + CopyArrayOfBytesToMemoryBuffer(k_rgPositions)); + + mesh.FillMeshAttribute( + SceneAttributeSemantic.Index, + Microsoft.Graphics.DirectX.DirectXPixelFormat.R16UInt, + CopyArrayOfBytesToMemoryBuffer(k_rgIndices)); + + mesh.FillMeshAttribute( + SceneAttributeSemantic.Normal, + Microsoft.Graphics.DirectX.DirectXPixelFormat.R32G32B32Float, + CopyArrayOfBytesToMemoryBuffer(k_rgNormals)); + + var material = SceneMetallicRoughnessMaterial.Create(compositor); + material.BaseColorFactor = new Vector4(56f / 255f, 191f / 255f, 110f / 255f, 1.0f); + + var meshRendererComponent = SceneMeshRendererComponent.Create(compositor); + meshRendererComponent.Mesh = mesh; + meshRendererComponent.Material = material; + + sceneNode.Components.Add(meshRendererComponent); + } + + private void SceneNodePlayground_Unloaded(object sender, RoutedEventArgs e) + { + + } + + static MemoryBuffer CopyArrayOfBytesToMemoryBuffer(byte[] a) + { + MemoryBuffer mb = new MemoryBuffer((uint)a.Length); + IMemoryBufferReference mbr = mb.CreateReference(); + IMemoryBufferByteAccess mba = (IMemoryBufferByteAccess)mbr; + unsafe + { + byte* bytes = null; + uint capacity; + mba.GetBuffer(&bytes, &capacity); + for (int i = 0; i < capacity; ++i) + { + bytes[i] = a[i]; + } + } + + return mb; + } + + [ComImport, + Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + interface IMemoryBufferByteAccess + { + unsafe void GetBuffer(byte** bytes, uint* capacity); + } + + + static byte[] k_rgPositions = + { + 0xbf, 0x7d, 0xbf, 0xc1, 0x96, 0x90, 0x38, 0x41, 0x66, 0xe6, 0xf4, 0x41, 0xab, 0xcf, 0x95, 0xc1, 0x5f, 0xba, 0x21, 0x41, 0x81, 0x73, 0xd5, 0x41, 0xec, 0x2f, 0x7b, 0xc1, 0x45, 0xd8, 0x36, 0x41, 0xab, 0xed, 0x08, 0x42, 0x11, 0x58, 0x37, 0xc1, 0x2a, 0xa9, 0x20, 0x41, 0x2a, 0x98, 0xee, 0x41, 0xc3, 0x42, 0xc4, 0xc1, 0xcf, 0xd5, 0x21, 0x41, 0xbb, 0xa7, 0xb1, 0x41, 0x24, 0x28, 0xf4, 0xc1, 0x03, 0x09, 0x3a, 0x41, 0x90, 0x0f, 0xc9, 0x41, 0x77, 0x9c, 0x0c, 0xc2, 0x06, 0xf0, 0x3a, 0x41, +0xb7, 0xc0, 0x8d, 0x41, 0x38, 0x67, 0xe4, 0xc1, 0x23, 0xdb, 0x22, 0x41, 0xc0, 0xca, 0x7c, 0x41, 0xe1, 0xe9, 0xf8, 0xc1, 0x8c, 0xb9, 0x22, 0x41, 0xc6, 0x50, 0xcc, 0x40, 0x74, 0xb5, 0x17, 0xc2, 0xe1, 0x7a, 0x3c, 0x41, 0xb7, 0xe9, 0xdf, 0x40, 0x20, 0x12, 0x3f, 0x42, 0xf4, 0xdb, 0x61, 0x41, 0x1c, 0x7c, 0x06, 0x42, 0x55, 0x30, 0x76, 0x42, 0x91, 0x5c, 0x64, 0x41, 0x64, 0xaa, 0xc9, 0x41, 0x49, 0x5d, 0x4f, 0x42, 0xdd, 0xa4, 0x8d, 0x41, 0xa5, 0x3d, 0x12, 0x42, 0xf2, 0x70, 0x83, 0x42, +0xdc, 0xf9, 0x92, 0x41, 0x89, 0xb0, 0xd8, 0x41, 0xfb, 0x0b, 0x60, 0x42, 0xb6, 0xf3, 0x36, 0x41, 0x05, 0x92, 0xb5, 0x41, 0xd9, 0xbd, 0x2e, 0x42, 0x47, 0xe1, 0x36, 0x41, 0x96, 0x21, 0xf0, 0x41, 0x71, 0x2c, 0xe5, 0xc1, 0x8e, 0x97, 0x66, 0x41, 0xcd, 0xea, 0x07, 0x42, 0x09, 0xac, 0x9b, 0xc1, 0xab, 0xf1, 0x64, 0x41, 0xf1, 0xb4, 0x17, 0x42, 0x9c, 0x44, 0x10, 0xc2, 0x1e, 0x16, 0x68, 0x41, 0xea, 0x73, 0xdd, 0x41, 0x80, 0xb7, 0x03, 0xc2, 0x8e, 0x75, 0x94, 0x41, 0x32, 0xe6, 0x12, 0x42, +0xec, 0xaf, 0x23, 0xc2, 0xbf, 0x0e, 0x95, 0x41, 0x08, 0x1b, 0xed, 0x41, 0xd8, 0xdf, 0xb9, 0xc1, 0xbe, 0x30, 0x91, 0x41, 0xee, 0x2b, 0x24, 0x42, 0x03, 0xc9, 0x23, 0xc2, 0x17, 0x48, 0x6a, 0x41, 0x73, 0xc6, 0x99, 0x41, 0x83, 0xaf, 0x30, 0xc2, 0xb3, 0x7b, 0x6a, 0x41, 0x96, 0xe7, 0xe8, 0x40, 0x75, 0xb1, 0x38, 0xc2, 0x80, 0x48, 0x95, 0x41, 0x61, 0x32, 0xa4, 0x41, 0xeb, 0x11, 0x49, 0xc2, 0xac, 0x1c, 0x93, 0x41, 0x1e, 0xa2, 0xeb, 0x40, 0x84, 0x3c, 0x89, 0x42, 0x36, 0x3c, 0x63, 0x41, +0x11, 0x36, 0x61, 0x41, 0x78, 0xcb, 0x79, 0x42, 0xe5, 0x61, 0x36, 0x41, 0x89, 0xb0, 0x4f, 0x41, 0x00, 0xaf, 0x92, 0x42, 0x3f, 0xc6, 0x92, 0x41, 0xdc, 0xb5, 0x6e, 0x41, 0x07, 0x1f, 0x5f, 0x42, 0x8b, 0xfd, 0xb3, 0x41, 0x9d, 0x2f, 0x1a, 0x42, 0x14, 0xbf, 0x89, 0x42, 0x1d, 0x49, 0xbb, 0x41, 0xcc, 0x5d, 0xe3, 0x41, 0x2e, 0xee, 0x70, 0x42, 0x21, 0x8e, 0xe1, 0x41, 0x2d, 0x61, 0x1e, 0x42, 0xc8, 0x98, 0x8e, 0x42, 0x86, 0x49, 0xe8, 0x41, 0x02, 0xab, 0xea, 0x41, 0x77, 0xed, 0x13, 0xc2, +0xe4, 0xf2, 0xbd, 0x41, 0x6d, 0x56, 0x1a, 0x42, 0x05, 0x23, 0xd8, 0xc1, 0x9f, 0xbc, 0xbb, 0x41, 0x7a, 0x25, 0x2c, 0x42, 0xb9, 0xeb, 0x34, 0xc2, 0x6a, 0x4d, 0xbd, 0x41, 0x94, 0x65, 0xf7, 0x41, 0xda, 0x4a, 0x24, 0xc2, 0xf5, 0xa8, 0xea, 0x41, 0xbb, 0xe7, 0x1d, 0x42, 0xcd, 0xcc, 0x43, 0xc2, 0x84, 0x7c, 0xe7, 0x41, 0x17, 0x48, 0xfb, 0x41, 0x11, 0xe5, 0x03, 0xc2, 0xfc, 0x87, 0xed, 0x41, 0x73, 0xe8, 0x2d, 0x42, 0x03, 0xf8, 0x99, 0x42, 0x0e, 0xbe, 0xbb, 0x41, 0xca, 0x32, 0x79, 0x41, +0x49, 0xec, 0x9e, 0x42, 0xe4, 0x83, 0xe9, 0x41, 0xa0, 0x89, 0x80, 0x41, 0xe3, 0xc5, 0x91, 0x42, 0x3c, 0x7d, 0x0c, 0x42, 0xf8, 0xb1, 0xee, 0x41, 0x5f, 0xf6, 0x7c, 0x42, 0xc7, 0x3a, 0x0a, 0x42, 0xa3, 0x52, 0x1f, 0x42, 0xaa, 0x80, 0x82, 0x42, 0xfe, 0x94, 0x25, 0x42, 0x38, 0x89, 0x1f, 0x42, 0xa4, 0x9f, 0x93, 0x42, 0x52, 0xf8, 0x26, 0x42, 0x00, 0xde, 0xee, 0x41, 0x15, 0xdd, 0xa1, 0x42, 0x01, 0x8d, 0x0d, 0x42, 0xa2, 0x45, 0x83, 0x41, 0xbb, 0xb8, 0xa3, 0x42, 0xbd, 0x74, 0x28, 0x42, +0x67, 0xd5, 0x85, 0x41, 0xaa, 0x40, 0x81, 0x42, 0x89, 0xf0, 0x5d, 0x42, 0x27, 0x0f, 0x19, 0x42, 0xd4, 0x29, 0x84, 0x42, 0xd5, 0x38, 0x42, 0x42, 0xc7, 0xfa, 0x1c, 0x42, 0xc4, 0x51, 0x91, 0x42, 0x13, 0x03, 0x5c, 0x42, 0x72, 0xf9, 0xe9, 0x41, 0x55, 0xff, 0x93, 0x42, 0x88, 0x23, 0x42, 0x42, 0x50, 0x7c, 0xed, 0x41, 0xc6, 0x2d, 0xa3, 0x42, 0xd4, 0x5a, 0x43, 0x42, 0xd0, 0xb3, 0x87, 0x41, 0x6d, 0x56, 0xa0, 0x42, 0xbf, 0xbd, 0x5c, 0x42, 0x81, 0x95, 0x87, 0x41, 0x54, 0x12, 0x5e, 0x42, +0xcf, 0x77, 0x87, 0x42, 0x75, 0xf1, 0x0e, 0x42, 0x53, 0xc5, 0x74, 0x42, 0xd6, 0x05, 0x78, 0x42, 0x15, 0x2e, 0x15, 0x42, 0x72, 0x2a, 0x85, 0x42, 0x3f, 0xd5, 0x84, 0x42, 0xd8, 0x5f, 0xdf, 0x41, 0x0a, 0x57, 0x8c, 0x42, 0x90, 0x0f, 0x74, 0x42, 0xb2, 0x1d, 0xe5, 0x41, 0x26, 0x93, 0x9b, 0x42, 0x12, 0x14, 0x74, 0x42, 0xbb, 0x16, 0x86, 0x41, 0xba, 0xba, 0x95, 0x42, 0x52, 0xa7, 0x84, 0x42, 0xda, 0xce, 0x84, 0x41, 0x07, 0xfd, 0x2d, 0x42, 0xfd, 0x65, 0x97, 0x42, 0x8e, 0xf5, 0xfe, 0x41, +0x9a, 0x08, 0x42, 0x42, 0x49, 0x4e, 0x90, 0x42, 0x92, 0x9c, 0x07, 0x42, 0x6b, 0xbc, 0x63, 0x42, 0xe5, 0x01, 0x96, 0x42, 0xfa, 0xfe, 0xcd, 0x41, 0x07, 0x0e, 0x77, 0x42, 0xf2, 0x12, 0x8e, 0x42, 0x79, 0xd8, 0xd6, 0x41, 0xa2, 0x43, 0x8f, 0x42, 0xba, 0x5a, 0x8e, 0x42, 0x05, 0x56, 0x85, 0x41, 0xf3, 0x5d, 0x86, 0x42, 0x0a, 0xe6, 0x96, 0x42, 0xc2, 0x17, 0x85, 0x41, 0x2e, 0xff, 0x41, 0xc1, 0x8a, 0xff, 0x93, 0x42, 0x51, 0x5a, 0xe7, 0x41, 0x9c, 0xdc, 0xf7, 0x3f, 0x6a, 0xad, 0x91, 0x42, +0x55, 0x81, 0x07, 0x42, 0xfe, 0xcf, 0xec, 0xc0, 0xf2, 0x50, 0x98, 0x42, 0xd8, 0x01, 0xd3, 0x41, 0xc5, 0x72, 0x69, 0x40, 0x12, 0xd4, 0x97, 0x42, 0x4f, 0x62, 0xf4, 0x41, 0xb1, 0x4b, 0x58, 0xc0, 0x7d, 0x1d, 0x9c, 0x42, 0xf9, 0x8f, 0xb9, 0x41, 0x8c, 0x2d, 0xaa, 0x40, 0x92, 0xda, 0x9c, 0x42, 0x11, 0xb6, 0xd7, 0x41, 0x04, 0x56, 0x6d, 0x41, 0x06, 0xa1, 0x98, 0x42, 0x3b, 0x30, 0x00, 0x42, 0xc1, 0x39, 0x6b, 0x41, 0x68, 0xb1, 0x9d, 0x42, 0xda, 0x1b, 0xe7, 0x41, 0x5e, 0x29, 0x6c, 0x41, +0x7e, 0xbd, 0x93, 0x42, 0x2d, 0xa1, 0x0c, 0x42, 0x67, 0x44, 0x6b, 0xc1, 0x1d, 0x38, 0x99, 0x42, 0x67, 0xc4, 0x9d, 0x41, 0x15, 0x9d, 0x99, 0xc1, 0x7d, 0x9f, 0x9b, 0x42, 0x69, 0xc1, 0xea, 0x40, 0x75, 0x93, 0xa7, 0xc1, 0x05, 0x03, 0x96, 0x42, 0x2d, 0x32, 0xab, 0x41, 0x5b, 0x42, 0xc6, 0xc1, 0xf7, 0x75, 0x9c, 0x42, 0xb6, 0xd6, 0xf4, 0x40, 0x78, 0x7a, 0x54, 0xc1, 0x2e, 0x90, 0x9c, 0x42, 0x26, 0xfc, 0xd8, 0x40, 0xff, 0xf3, 0x14, 0xc1, 0xf3, 0x2e, 0x9c, 0x42, 0xd9, 0x4e, 0x8d, 0x41, +0x2f, 0x51, 0x15, 0x40, 0x17, 0x88, 0xa2, 0x42, 0xef, 0x38, 0x2b, 0x41, 0xfe, 0xec, 0x27, 0x3f, 0x04, 0x25, 0xa2, 0x42, 0xc3, 0x99, 0x7f, 0x40, 0x2c, 0x26, 0x9e, 0x40, 0x78, 0xda, 0xa2, 0x42, 0xac, 0x1c, 0x7d, 0x41, 0xd5, 0x38, 0x5d, 0xc2, 0xf0, 0xf6, 0xa2, 0x42, 0xf3, 0x7d, 0xa1, 0x41, 0x5d, 0x0f, 0x46, 0xc2, 0x6f, 0xc1, 0xa7, 0x42, 0x74, 0x24, 0xa6, 0x41, 0x1e, 0xe7, 0x5a, 0xc2, 0xc3, 0xf3, 0xb3, 0x42, 0xc0, 0x84, 0x0d, 0x41, 0x13, 0x32, 0x42, 0xc2, 0xfc, 0x87, 0xb8, 0x42, +0xb1, 0x0a, 0x11, 0x41, 0x13, 0x32, 0x42, 0xc2, 0xfc, 0x87, 0xb8, 0x42, 0xb1, 0x0a, 0x11, 0x41, 0x5d, 0x0f, 0x46, 0xc2, 0x6f, 0xc1, 0xa7, 0x42, 0x74, 0x24, 0xa6, 0x41, 0xd2, 0xaf, 0x29, 0xc2, 0x69, 0x0f, 0xb7, 0x42, 0x90, 0x5a, 0x10, 0x41, 0xf5, 0x68, 0x30, 0xc2, 0xbd, 0xc1, 0xa5, 0x42, 0xd7, 0xa3, 0xa8, 0x41, 0x65, 0x99, 0x41, 0xc2, 0x6d, 0x85, 0x9a, 0x42, 0x0e, 0xad, 0xd7, 0x41, 0x83, 0xaf, 0x30, 0xc2, 0xa0, 0xc9, 0x9b, 0x42, 0xaf, 0x03, 0xd1, 0x41, 0x65, 0x99, 0x41, 0xc2, +0x6d, 0x85, 0x9a, 0x42, 0x0e, 0xad, 0xd7, 0x41, 0x5b, 0xa0, 0x56, 0xc2, 0x99, 0x79, 0x95, 0x42, 0xba, 0xc9, 0xd7, 0x41, 0x1e, 0x56, 0x7f, 0xc2, 0xfb, 0xab, 0x8b, 0x42, 0xd7, 0xa3, 0x8d, 0x41, 0xe9, 0x55, 0x71, 0xc2, 0x1c, 0xba, 0x98, 0x42, 0x91, 0x7e, 0x98, 0x41, 0x74, 0x84, 0x81, 0xc2, 0xa5, 0xcc, 0x93, 0x42, 0x21, 0xe5, 0xe4, 0x40, 0x6e, 0xa3, 0x70, 0xc2, 0xb8, 0xcf, 0xa8, 0x42, 0xbd, 0x80, 0x04, 0x41, 0x17, 0x08, 0x69, 0xc2, 0x79, 0x47, 0x8d, 0x42, 0x0a, 0x57, 0xd3, 0x41, +0xc2, 0x46, 0x76, 0xc2, 0x40, 0x64, 0x83, 0x42, 0x6a, 0xcd, 0xc9, 0x41, 0x66, 0x95, 0x68, 0xc2, 0xc3, 0xa4, 0x71, 0x42, 0x0e, 0xad, 0xfc, 0x41, 0x74, 0x35, 0x5a, 0xc2, 0xc4, 0xc0, 0x81, 0x42, 0x7b, 0xb2, 0x03, 0x42, 0x67, 0xc4, 0x48, 0xc2, 0xf2, 0x90, 0x89, 0x42, 0x54, 0x63, 0x04, 0x42, 0xe9, 0xb7, 0x2b, 0xc2, 0x34, 0x00, 0x75, 0x42, 0x64, 0xcc, 0x1d, 0x42, 0xbb, 0x96, 0x39, 0xc2, 0x7e, 0x3f, 0x5e, 0x42, 0x1e, 0x56, 0x21, 0x42, 0xa1, 0xd6, 0x43, 0xc2, 0x3f, 0x06, 0x45, 0x42, +0x86, 0x49, 0x1f, 0x42, 0x09, 0x39, 0x56, 0xc2, 0x05, 0xa3, 0x38, 0x42, 0xa0, 0xf8, 0x0b, 0x42, 0x61, 0x43, 0x73, 0xc2, 0x98, 0xfb, 0x5f, 0x42, 0x18, 0x95, 0xe4, 0x41, 0xac, 0x7a, 0x69, 0xc2, 0x86, 0xc9, 0x2f, 0x42, 0xbb, 0x49, 0xe0, 0x41, 0xa9, 0x46, 0x7c, 0xc2, 0x80, 0xea, 0x52, 0x42, 0x41, 0x71, 0xc0, 0x41, 0xbf, 0xee, 0x81, 0xc2, 0xb7, 0x11, 0x65, 0x42, 0x1c, 0xeb, 0xad, 0x41, 0x16, 0x99, 0x7e, 0xc2, 0x38, 0x27, 0x73, 0x42, 0x28, 0xed, 0xba, 0x41, 0xa9, 0x93, 0x4a, 0xc2, +0xe1, 0xfa, 0xbb, 0x41, 0x4d, 0xf3, 0xa9, 0x41, 0x2c, 0x07, 0x5f, 0xc2, 0x11, 0x58, 0xb8, 0x41, 0xaa, 0x60, 0xf7, 0x40, 0x53, 0xb4, 0x59, 0xc2, 0x48, 0x50, 0xe4, 0x41, 0x08, 0x1b, 0xad, 0x41, 0xd2, 0x6f, 0x70, 0xc2, 0x1f, 0xe3, 0xe1, 0x41, 0x35, 0xb0, 0xfd, 0x40, 0x43, 0x6e, 0x95, 0xc0, 0xe6, 0xee, 0x0e, 0x42, 0xec, 0xde, 0x50, 0x42, 0x6a, 0xd9, 0xa5, 0xc0, 0x9f, 0x6b, 0x1d, 0x42, 0x8c, 0x79, 0x53, 0x42, 0xdb, 0xf9, 0x25, 0xc1, 0x96, 0x43, 0x11, 0x42, 0x9b, 0x55, 0x4f, 0x42, +0xca, 0xc3, 0x46, 0xc1, 0x4a, 0xfb, 0x1c, 0x42, 0x81, 0xc4, 0x4f, 0x42, 0x2a, 0x8c, 0xbe, 0xc0, 0xc0, 0x8a, 0x2d, 0x42, 0xfd, 0xa9, 0x54, 0x42, 0x64, 0x3b, 0x64, 0xc1, 0x24, 0xe8, 0x2d, 0x42, 0x8a, 0x8e, 0x4f, 0x42, 0x9e, 0x8d, 0x34, 0xc2, 0xc7, 0xba, 0x0c, 0x42, 0x3a, 0x52, 0x1c, 0x42, 0xd6, 0xb4, 0x50, 0xc2, 0x03, 0x67, 0x08, 0x42, 0x56, 0xfd, 0xf7, 0x41, 0x09, 0x39, 0x56, 0xc2, 0x05, 0xa3, 0x38, 0x42, 0xa0, 0xf8, 0x0b, 0x42, 0xac, 0x7a, 0x69, 0xc2, 0x86, 0xc9, 0x2f, 0x42, +0xbb, 0x49, 0xe0, 0x41, 0xa1, 0xd6, 0x43, 0xc2, 0x3f, 0x06, 0x45, 0x42, 0x86, 0x49, 0x1f, 0x42, 0xcc, 0x6e, 0x1d, 0xc2, 0x82, 0xb3, 0x14, 0x42, 0x49, 0x4c, 0x2b, 0x42, 0xee, 0xfc, 0x66, 0xc2, 0xab, 0x2d, 0x06, 0x42, 0x7b, 0x14, 0xac, 0x41, 0x9c, 0xd1, 0x7c, 0xc2, 0xbf, 0x6c, 0x05, 0x42, 0xd7, 0xc0, 0xf8, 0x40, 0xcc, 0xee, 0x79, 0xc2, 0x5f, 0x18, 0x2b, 0x42, 0xa7, 0xd7, 0x9c, 0x41, 0xf9, 0x80, 0x84, 0xc2, 0x01, 0x80, 0x29, 0x42, 0xc8, 0xea, 0xf2, 0x40, 0xe1, 0x06, 0xcb, 0xc0, +0x54, 0x23, 0x3e, 0x42, 0xd2, 0x5e, 0x54, 0x42, 0x49, 0x9d, 0xc6, 0xc0, 0x9a, 0xb7, 0x4d, 0x42, 0x67, 0xe6, 0x51, 0x42, 0x9d, 0x80, 0x6f, 0xc1, 0xa2, 0x63, 0x40, 0x42, 0xe8, 0x48, 0x4e, 0x42, 0x40, 0x13, 0x68, 0xc1, 0x16, 0x19, 0x51, 0x42, 0x97, 0x2e, 0x4c, 0x42, 0x01, 0x4d, 0xc1, 0xc1, 0x44, 0x9a, 0x85, 0x42, 0xea, 0x84, 0x1e, 0x42, 0x9c, 0xc4, 0xa8, 0xc1, 0x8d, 0x28, 0x81, 0x42, 0x37, 0xda, 0x26, 0x42, 0x91, 0x7e, 0x53, 0xc1, 0x4e, 0x51, 0x88, 0x42, 0xf8, 0x31, 0x1a, 0x42, +0xb1, 0xbf, 0x29, 0xc1, 0xc2, 0x26, 0x83, 0x42, 0x05, 0x12, 0x25, 0x42, 0x43, 0x9c, 0xe9, 0xc1, 0xec, 0x4f, 0x9f, 0x42, 0xfc, 0x5e, 0x01, 0x41, 0xbf, 0x6c, 0xdc, 0xc1, 0x1a, 0x60, 0x93, 0x42, 0x52, 0x27, 0xb7, 0x41, 0x5f, 0xba, 0xa6, 0xc1, 0xc6, 0xdc, 0x8f, 0x42, 0x33, 0xb3, 0xfc, 0x41, 0x5f, 0xba, 0xa6, 0xc1, 0xc6, 0xdc, 0x8f, 0x42, 0x33, 0xb3, 0xfc, 0x41, 0xbf, 0x6c, 0xdc, 0xc1, 0x1a, 0x60, 0x93, 0x42, 0x52, 0x27, 0xb7, 0x41, 0xf7, 0x64, 0xfe, 0xc1, 0xfa, 0xad, 0x8d, 0x42, +0x14, 0xbf, 0x05, 0x42, 0x5a, 0x53, 0x08, 0xc2, 0x89, 0x50, 0x93, 0x42, 0x16, 0x59, 0xb9, 0x41, 0x43, 0x9c, 0xe9, 0xc1, 0xec, 0x4f, 0x9f, 0x42, 0xfc, 0x5e, 0x01, 0x41, 0x11, 0x76, 0x04, 0xc2, 0x78, 0xab, 0xa4, 0x42, 0xd0, 0xfe, 0x09, 0x41, 0x70, 0x7d, 0x08, 0x42, 0xc3, 0x24, 0xa1, 0x42, 0xab, 0x2d, 0xd5, 0x41, 0x79, 0x58, 0x1c, 0x42, 0xa4, 0x4e, 0x9b, 0x42, 0x9a, 0xf7, 0xeb, 0x41, 0x15, 0xfb, 0x40, 0x42, 0x65, 0x28, 0xa2, 0x42, 0xb3, 0x9d, 0xb2, 0x41, 0xde, 0x24, 0x51, 0x42, +0xbc, 0x94, 0x9c, 0x42, 0x54, 0x63, 0xc2, 0x41, 0xcf, 0x66, 0xe5, 0x41, 0xe9, 0x17, 0x96, 0x42, 0xc2, 0xf5, 0x0a, 0x42, 0x31, 0xf7, 0xd4, 0x41, 0x6b, 0xe9, 0x99, 0x42, 0xb1, 0x50, 0xff, 0x41, 0x29, 0x3a, 0xc4, 0x41, 0x7f, 0xd9, 0x9e, 0x42, 0x17, 0xc8, 0xe8, 0x41, 0xc7, 0x58, 0x7a, 0x42, 0x80, 0xb7, 0x9d, 0x42, 0x59, 0xf5, 0x80, 0x41, 0x7e, 0xfb, 0x68, 0x42, 0x72, 0x4a, 0xa3, 0x42, 0xc5, 0xfe, 0x6e, 0x41, 0x3f, 0x3a, 0x0c, 0x41, 0xc5, 0x1e, 0xa3, 0x42, 0x75, 0xf1, 0xa1, 0x41, +0xdc, 0xd7, 0x78, 0x41, 0xeb, 0xc2, 0xa2, 0x42, 0x4e, 0x62, 0xc3, 0x41, 0x65, 0x3b, 0x20, 0xc2, 0x92, 0x9c, 0x92, 0x42, 0x9c, 0x22, 0xe8, 0x41, 0x6f, 0x92, 0x1d, 0xc2, 0x34, 0xd1, 0x9b, 0x42, 0x1b, 0x1e, 0xb2, 0x41, 0xf4, 0x6c, 0x14, 0xc2, 0xb4, 0x59, 0xb0, 0x42, 0x3e, 0xa2, 0x0e, 0x41, 0xcc, 0xee, 0x79, 0xc2, 0x5f, 0x18, 0x2b, 0x42, 0xa7, 0xd7, 0x9c, 0x41, 0x83, 0x2f, 0x83, 0xc2, 0xc7, 0xa9, 0x4e, 0x42, 0x40, 0x13, 0x8a, 0x41, 0xf9, 0x80, 0x84, 0xc2, 0x01, 0x80, 0x29, 0x42, +0xc8, 0xea, 0xf2, 0x40, 0x5b, 0x02, 0x88, 0xc2, 0x2e, 0x50, 0x4e, 0x42, 0x46, 0xeb, 0xe4, 0x40, 0x26, 0x82, 0x84, 0xc2, 0x20, 0x12, 0x67, 0x42, 0x43, 0x1c, 0x80, 0x41, 0x9c, 0xf3, 0x87, 0xc2, 0xac, 0x0b, 0x6a, 0x42, 0xc7, 0xef, 0xdf, 0x40, 0x9b, 0x55, 0x33, 0xc2, 0xcd, 0xaa, 0x8e, 0x42, 0x36, 0x7c, 0x00, 0x42, 0x5a, 0x53, 0x18, 0xc2, 0x72, 0x39, 0x85, 0x42, 0x15, 0x8c, 0x16, 0x42, 0x5a, 0x53, 0x18, 0xc2, 0x72, 0x39, 0x85, 0x42, 0x15, 0x8c, 0x16, 0x42, 0x9b, 0x55, 0x33, 0xc2, +0xcd, 0xaa, 0x8e, 0x42, 0x36, 0x7c, 0x00, 0x42, 0x54, 0x23, 0x83, 0xc2, 0x1f, 0x34, 0x7e, 0x42, 0xb6, 0x73, 0x84, 0x41, 0x53, 0xd4, 0x85, 0xc2, 0x6b, 0x3c, 0x83, 0x42, 0xa6, 0x79, 0xe2, 0x40, 0x36, 0xab, 0x5c, 0x42, 0x0a, 0x77, 0xa7, 0x42, 0xac, 0x8b, 0x53, 0x41, 0xaa, 0x8f, 0x38, 0x42, 0xea, 0x95, 0xa6, 0x42, 0xd5, 0x78, 0xa0, 0x41, 0xab, 0x7e, 0x55, 0x42, 0x49, 0x1d, 0xab, 0x42, 0xde, 0xe0, 0x45, 0x41, 0xdc, 0x75, 0x33, 0x42, 0xe4, 0x65, 0xaa, 0x42, 0xf9, 0x0f, 0x96, 0x41, +0xaa, 0x71, 0xca, 0x41, 0x9d, 0x51, 0xa6, 0x42, 0x7e, 0x3f, 0xbe, 0x41, 0x98, 0x5d, 0x8c, 0x41, 0xb5, 0x75, 0xa6, 0x42, 0x20, 0x41, 0xad, 0x41, 0x64, 0x2a, 0xc3, 0x41, 0x8b, 0x7b, 0xa2, 0x42, 0xe5, 0x50, 0xd3, 0x41, 0x66, 0x66, 0x98, 0x41, 0xc3, 0x04, 0xaa, 0x42, 0x86, 0xc9, 0xa3, 0x41, 0xa4, 0x70, 0xd0, 0x41, 0xcb, 0xe1, 0xa9, 0x42, 0x55, 0x9f, 0xb2, 0x41, 0xce, 0xc8, 0x0c, 0x42, 0x05, 0x16, 0xa6, 0x42, 0xbb, 0x16, 0xbc, 0x41, 0x9a, 0x08, 0x0d, 0x42, 0xa9, 0xf3, 0xa9, 0x42, +0x3a, 0x12, 0xb0, 0x41, 0x3e, 0xe8, 0x41, 0x41, 0xbb, 0x78, 0xa6, 0x42, 0x9a, 0x99, 0x90, 0x41, 0x90, 0x66, 0x0a, 0x41, 0x8a, 0x4e, 0xa6, 0x42, 0xfd, 0x65, 0x5b, 0x41, 0xa0, 0x89, 0x23, 0x41, 0x9e, 0xed, 0xa9, 0x42, 0xdf, 0x4f, 0x52, 0x41, 0x20, 0xd2, 0x5d, 0x41, 0xb2, 0x0c, 0xaa, 0x42, 0xdc, 0x46, 0x8a, 0x41, 0x38, 0x16, 0x1d, 0x42, 0x34, 0x11, 0x20, 0x41, 0xe7, 0xea, 0xcf, 0x41, 0x31, 0xf7, 0x46, 0x42, 0x04, 0xf3, 0x1f, 0x41, 0x86, 0xa7, 0x9d, 0x41, 0x7f, 0xd9, 0x69, 0x41, +0xca, 0x32, 0x20, 0x41, 0xcc, 0x5d, 0xfe, 0x41, 0x6d, 0xb4, 0xcf, 0x41, 0x44, 0x69, 0x20, 0x41, 0x7c, 0x50, 0xf0, 0x41, 0x76, 0xe0, 0x72, 0x41, 0x5c, 0x8f, 0x36, 0x41, 0x65, 0xaa, 0x11, 0x42, 0xf8, 0xb1, 0xe1, 0x41, 0x45, 0xd8, 0x36, 0x41, 0xff, 0x50, 0x0a, 0x42, 0x03, 0xea, 0x2d, 0xbf, 0xd0, 0x44, 0x20, 0x41, 0xa2, 0xa3, 0xfe, 0x41, 0x0b, 0x98, 0x2c, 0xc0, 0xe1, 0x7a, 0x35, 0x41, 0x77, 0xdc, 0x11, 0x42, 0x4c, 0xb7, 0x5c, 0x42, 0x91, 0x7e, 0x20, 0x41, 0x0e, 0xbe, 0x36, 0x41, +0xfb, 0x3a, 0xf4, 0x41, 0xe7, 0x8c, 0x61, 0x41, 0xa9, 0xe4, 0x18, 0x42, 0xd8, 0x01, 0x81, 0x41, 0x42, 0xad, 0x5f, 0x41, 0xec, 0xde, 0x20, 0x42, 0xdf, 0x60, 0x8a, 0x41, 0x6f, 0xf0, 0x8a, 0x41, 0xbe, 0x30, 0x2d, 0x42, 0x34, 0x51, 0x04, 0x42, 0x69, 0xde, 0x8d, 0x41, 0x89, 0x81, 0x25, 0x42, 0x03, 0x09, 0xa7, 0xc0, 0xfe, 0x43, 0x61, 0x41, 0xea, 0x04, 0x21, 0x42, 0xc4, 0x20, 0x05, 0xc1, 0x78, 0xfa, 0x8e, 0x41, 0x9f, 0x7c, 0x2d, 0x42, 0x23, 0x5b, 0x97, 0x41, 0xff, 0xd0, 0x10, 0x42, +0x57, 0x5b, 0x52, 0x42, 0xd0, 0xb3, 0x93, 0x41, 0xcf, 0xf7, 0x1f, 0x42, 0x96, 0x32, 0x55, 0x42, 0x6f, 0x81, 0x33, 0x41, 0x48, 0x7f, 0x0e, 0x42, 0x2b, 0x65, 0x52, 0x42, 0x9f, 0xab, 0x29, 0x41, 0x0e, 0x9c, 0x1e, 0x42, 0xc1, 0xb9, 0x55, 0x42, 0xb6, 0x04, 0x92, 0x41, 0x14, 0x3f, 0x31, 0x42, 0x97, 0x2e, 0x57, 0x42, 0x69, 0x6f, 0x22, 0x41, 0x8a, 0x4e, 0x2f, 0x42, 0x67, 0xb3, 0x57, 0x42, 0xd0, 0xb3, 0x93, 0x41, 0xcf, 0xf7, 0x1f, 0x42, 0x96, 0x32, 0x55, 0x42, 0xc4, 0xa0, 0xcf, 0x41, +0x62, 0xff, 0x1f, 0x42, 0x16, 0x19, 0x53, 0x42, 0xb6, 0x04, 0x92, 0x41, 0x14, 0x3f, 0x31, 0x42, 0x97, 0x2e, 0x57, 0x42, 0xca, 0x32, 0xd8, 0x41, 0xe7, 0x3b, 0x32, 0x42, 0xb4, 0x88, 0x53, 0x42, 0x49, 0x8c, 0xc4, 0x41, 0xe4, 0xb2, 0x13, 0x42, 0x5b, 0xe0, 0x51, 0x42, 0x23, 0x5b, 0x97, 0x41, 0xff, 0xd0, 0x10, 0x42, 0x57, 0x5b, 0x52, 0x42, 0x2b, 0x87, 0x8d, 0x41, 0xf8, 0xf1, 0x43, 0x42, 0xd4, 0x49, 0x57, 0x42, 0x91, 0xc4, 0x1b, 0x41, 0x98, 0x5d, 0x40, 0x42, 0xa8, 0x86, 0x57, 0x42, +0x95, 0xab, 0x15, 0x41, 0xe9, 0xb7, 0x50, 0x42, 0xbc, 0x05, 0x56, 0x42, 0x88, 0x63, 0x87, 0x41, 0x52, 0x67, 0x56, 0x42, 0xc1, 0x28, 0x55, 0x42, 0x88, 0x63, 0x87, 0x41, 0x52, 0x67, 0x56, 0x42, 0xc1, 0x28, 0x55, 0x42, 0x2b, 0x87, 0x8d, 0x41, 0xf8, 0xf1, 0x43, 0x42, 0xd4, 0x49, 0x57, 0x42, 0xcb, 0x7f, 0xcb, 0x41, 0x3e, 0x57, 0x5c, 0x42, 0x23, 0x4a, 0x50, 0x42, 0x0f, 0xfa, 0xd6, 0x41, 0x29, 0x7a, 0x47, 0x42, 0xe2, 0xc7, 0x52, 0x42, 0xa9, 0x24, 0x81, 0x41, 0x9a, 0x66, 0x66, 0x42, +0xb6, 0x44, 0x51, 0x42, 0x38, 0x04, 0x12, 0x41, 0x52, 0x78, 0x5f, 0x42, 0x55, 0xdf, 0x52, 0x42, 0x7c, 0xb3, 0x13, 0x41, 0x32, 0x08, 0x6d, 0x42, 0x93, 0xd8, 0x4c, 0x42, 0x1d, 0xa7, 0x7f, 0x41, 0x7e, 0x7b, 0x73, 0x42, 0xb3, 0x6a, 0x4b, 0x42, 0x1d, 0xa7, 0x7f, 0x41, 0x7e, 0x7b, 0x73, 0x42, 0xb3, 0x6a, 0x4b, 0x42, 0xa9, 0x24, 0x81, 0x41, 0x9a, 0x66, 0x66, 0x42, 0xb6, 0x44, 0x51, 0x42, 0x67, 0x33, 0xaa, 0x41, 0x19, 0x91, 0x76, 0x42, 0xf7, 0x93, 0x49, 0x42, 0x41, 0xf1, 0xb9, 0x41, +0x4c, 0xd5, 0x6c, 0x42, 0x7e, 0xcc, 0x4c, 0x42, 0xc6, 0x0b, 0x01, 0x42, 0xeb, 0xd1, 0x8e, 0x42, 0x0b, 0xe4, 0x17, 0x42, 0xa8, 0x35, 0x73, 0x41, 0x9e, 0xde, 0x8d, 0x42, 0xae, 0xf6, 0x19, 0x42, 0xa8, 0x75, 0x2f, 0x42, 0x94, 0x96, 0x87, 0x42, 0x86, 0x78, 0x1f, 0x42, 0x61, 0xc3, 0x4d, 0x42, 0x3a, 0xb4, 0x7a, 0x42, 0xe2, 0xd8, 0x25, 0x42, 0x1a, 0xef, 0x5f, 0x42, 0x66, 0xa6, 0x60, 0x42, 0x8a, 0x1f, 0x2b, 0x42, 0xf9, 0x8f, 0x66, 0x42, 0x10, 0xa9, 0x43, 0x42, 0x8a, 0x5f, 0x2f, 0x42, +0xbf, 0xac, 0x61, 0x42, 0x27, 0x0f, 0x27, 0x42, 0x97, 0xbf, 0x31, 0x42, 0xb9, 0xab, 0x53, 0x42, 0x01, 0x3c, 0x0c, 0x42, 0x27, 0x4f, 0x32, 0x42, 0x8f, 0xd3, 0x3b, 0x42, 0x68, 0x11, 0xe8, 0x41, 0xa8, 0xf5, 0x30, 0x42, 0x36, 0xde, 0x10, 0x42, 0xb8, 0x2f, 0xb9, 0x41, 0x55, 0x9f, 0x2f, 0x42, 0xf8, 0x53, 0x90, 0x41, 0x2e, 0xb2, 0xaa, 0x41, 0xc7, 0xa9, 0x35, 0x42, 0x1e, 0x16, 0x51, 0xc1, 0xbf, 0x6c, 0xbc, 0x41, 0x32, 0x95, 0x36, 0x42, 0x71, 0x1b, 0xc2, 0xc1, 0xa9, 0x13, 0xee, 0x41, +0xaa, 0xe0, 0x39, 0x42, 0x11, 0x25, 0xfe, 0xc1, 0xa0, 0x78, 0x12, 0x42, 0x8b, 0x1b, 0x37, 0x42, 0xd4, 0x89, 0x14, 0xc2, 0xf0, 0x96, 0x32, 0x42, 0x8c, 0xb9, 0x31, 0x42, 0xeb, 0x51, 0x17, 0xc2, 0x23, 0x4a, 0x4e, 0x42, 0x53, 0xc5, 0x2e, 0x42, 0x9a, 0x77, 0x0f, 0xc2, 0xc9, 0x94, 0x67, 0x42, 0xe6, 0xee, 0x2a, 0x42, 0xbb, 0x96, 0x39, 0xc2, 0x7e, 0x3f, 0x5e, 0x42, 0x1e, 0x56, 0x21, 0x42, 0xe9, 0xb7, 0x2b, 0xc2, 0x34, 0x00, 0x75, 0x42, 0x64, 0xcc, 0x1d, 0x42, 0xc6, 0xcb, 0xfb, 0xc1, +0x5d, 0x2d, 0x7d, 0x42, 0x15, 0x2e, 0x25, 0x42, 0x5a, 0x53, 0x18, 0xc2, 0x72, 0x39, 0x85, 0x42, 0x15, 0x8c, 0x16, 0x42, 0xf7, 0x64, 0xfe, 0xc1, 0xfa, 0xad, 0x8d, 0x42, 0x14, 0xbf, 0x05, 0x42, 0x44, 0x86, 0xb7, 0xc0, 0x84, 0xbc, 0x5a, 0x42, 0x32, 0x44, 0x4f, 0x42, 0x6f, 0xf0, 0x4e, 0xc1, 0x5c, 0xbe, 0x5d, 0x42, 0x05, 0xa3, 0x4a, 0x42, 0x9c, 0x85, 0xb1, 0xc0, 0xb8, 0xde, 0x65, 0x42, 0x66, 0x95, 0x4a, 0x42, 0x31, 0x08, 0x31, 0xc1, 0x7b, 0x54, 0x65, 0x42, 0x94, 0x36, 0x49, 0x42, +0x20, 0x41, 0xb1, 0x3f, 0x6d, 0x85, 0x8a, 0x42, 0x65, 0x59, 0x1a, 0x42, 0x30, 0x99, 0xdf, 0xc1, 0x18, 0xe6, 0x11, 0x42, 0xc0, 0x8a, 0x3a, 0x42, 0xc8, 0x07, 0x00, 0xc2, 0x2b, 0x47, 0x2d, 0x42, 0x59, 0x06, 0x37, 0x42, 0xc3, 0xd3, 0xbe, 0xc1, 0x8b, 0x9b, 0x12, 0x42, 0xe7, 0x0c, 0x43, 0x42, 0x82, 0x62, 0xda, 0xc1, 0xe1, 0x8b, 0x2b, 0x42, 0x59, 0x46, 0x40, 0x42, 0x2a, 0xa9, 0xcf, 0xc1, 0xf2, 0x41, 0x12, 0x42, 0x43, 0x1c, 0x3d, 0x42, 0x72, 0x79, 0xee, 0xc1, 0x55, 0xdf, 0x2b, 0x42, +0x40, 0x24, 0x3a, 0x42, 0x7e, 0x8c, 0x83, 0xc1, 0x32, 0xe6, 0x00, 0x42, 0xba, 0x38, 0x45, 0x42, 0x23, 0x4a, 0x95, 0xc1, 0x44, 0x69, 0xf9, 0x41, 0x50, 0x4d, 0x3f, 0x42, 0x60, 0xd4, 0xa4, 0xc1, 0xb6, 0xe2, 0xf4, 0x41, 0x8a, 0x41, 0x3c, 0x42, 0xcb, 0x50, 0x05, 0xc2, 0xe4, 0x83, 0x48, 0x42, 0x5d, 0x6d, 0x33, 0x42, 0xfb, 0x8b, 0x00, 0xc2, 0x88, 0xf4, 0x61, 0x42, 0xe3, 0x54, 0x2f, 0x42, 0x19, 0x04, 0xe6, 0xc1, 0x82, 0x15, 0x45, 0x42, 0x46, 0x25, 0x3d, 0x42, 0x1b, 0x1e, 0xdf, 0xc1, +0x09, 0x2c, 0x5c, 0x42, 0x7c, 0x10, 0x3a, 0x42, 0x2d, 0x21, 0xfa, 0xc1, 0xad, 0x98, 0x46, 0x42, 0x19, 0xa2, 0x36, 0x42, 0xc5, 0x20, 0xf2, 0xc1, 0x84, 0x5e, 0x5f, 0x42, 0x2e, 0xd0, 0x32, 0x42, 0xac, 0x7a, 0xef, 0x41, 0x05, 0x34, 0xcf, 0x41, 0x2a, 0x18, 0x3a, 0x42, 0x9f, 0x3c, 0x83, 0x41, 0xaa, 0x71, 0xbf, 0x41, 0x7e, 0x3b, 0x3c, 0x42, 0x25, 0x06, 0x5a, 0x41, 0xde, 0x82, 0xe0, 0x41, 0x91, 0xfe, 0x47, 0x42, 0xc7, 0x29, 0x6f, 0x41, 0x61, 0xb2, 0xcd, 0x41, 0xc5, 0x8f, 0x41, 0x42, +0x89, 0xb0, 0xbf, 0x41, 0xc6, 0x5c, 0xec, 0x41, 0x80, 0xa6, 0x47, 0x42, 0x9a, 0x08, 0xd6, 0x41, 0xc1, 0x17, 0xdc, 0x41, 0xe3, 0x76, 0x40, 0x42, 0x89, 0xb0, 0xbf, 0x41, 0xc6, 0x5c, 0xec, 0x41, 0x80, 0xa6, 0x47, 0x42, 0x9a, 0x08, 0xd6, 0x41, 0xc1, 0x17, 0xdc, 0x41, 0xe3, 0x76, 0x40, 0x42, 0x15, 0x8c, 0x01, 0x42, 0x4f, 0xde, 0x02, 0x42, 0x01, 0x7c, 0x47, 0x42, 0xa7, 0x28, 0x11, 0x42, 0x0a, 0xc6, 0xf9, 0x41, 0xf3, 0x3d, 0x40, 0x42, 0x7b, 0x72, 0x20, 0x42, 0xc5, 0x20, 0xf2, 0x41, +0x3b, 0x0e, 0x3a, 0x42, 0x81, 0x78, 0x1d, 0xc1, 0xb6, 0x04, 0xd1, 0x41, 0xad, 0x9c, 0x3c, 0x42, 0xf8, 0x19, 0xe5, 0xc0, 0xb1, 0x2e, 0xeb, 0x41, 0xe3, 0xd4, 0x46, 0x42, 0x21, 0xd9, 0x06, 0xc1, 0xf8, 0xb1, 0xdb, 0x41, 0x55, 0xf0, 0x40, 0x42, 0x6b, 0x49, 0x3b, 0x42, 0x9c, 0x44, 0x0f, 0x42, 0x07, 0x4e, 0x3a, 0x42, 0xd2, 0x9e, 0x18, 0x42, 0x01, 0x0d, 0x16, 0x42, 0x27, 0x20, 0x47, 0x42, 0x72, 0xa8, 0x2a, 0x42, 0xea, 0x15, 0x12, 0x42, 0x3c, 0x3d, 0x40, 0x42, 0x9d, 0x91, 0x25, 0x42, +0xa5, 0xbd, 0x2d, 0x42, 0xbe, 0xdf, 0x45, 0x42, 0x44, 0x0b, 0x3a, 0x42, 0x43, 0x1c, 0x2b, 0x42, 0xdb, 0x28, 0x3f, 0x42, 0x51, 0x1a, 0x4b, 0x42, 0x37, 0x1a, 0x29, 0x42, 0x25, 0x64, 0x39, 0x42, 0x44, 0x3a, 0x50, 0x42, 0x6c, 0x38, 0x45, 0x42, 0x76, 0x0f, 0x37, 0x42, 0x95, 0x14, 0x29, 0x42, 0x32, 0xa6, 0x47, 0x42, 0xa9, 0x82, 0x43, 0x42, 0x06, 0xf0, 0x3e, 0x42, 0x50, 0x8d, 0x46, 0x42, 0x15, 0xbb, 0x3c, 0x42, 0x2d, 0xe1, 0x21, 0x42, 0x2d, 0x61, 0x61, 0x42, 0x54, 0x23, 0x40, 0x42, +0x86, 0xa7, 0x36, 0x42, 0x84, 0xde, 0x61, 0x42, 0x94, 0x07, 0x39, 0x42, 0xc3, 0x82, 0x48, 0x42, 0x94, 0x98, 0x61, 0x42, 0x65, 0x08, 0x33, 0x42, 0x7c, 0xe1, 0xd3, 0x41, 0x4d, 0x84, 0x8a, 0x42, 0x96, 0x32, 0x25, 0x42, 0xe9, 0x77, 0x14, 0x42, 0x1a, 0xe0, 0x85, 0x42, 0xe5, 0x61, 0x29, 0x42, 0x43, 0x0b, 0xa4, 0x41, 0x6b, 0x7c, 0x84, 0x42, 0x63, 0x9d, 0x37, 0x42, 0x51, 0xc9, 0xe7, 0x41, 0xea, 0x13, 0x82, 0x42, 0xf8, 0x93, 0x39, 0x42, 0x7d, 0xae, 0xb9, 0x41, 0x0d, 0xa0, 0x87, 0x42, +0xae, 0x36, 0x2e, 0x42, 0xdb, 0x68, 0x03, 0x42, 0x31, 0x57, 0x84, 0x42, 0x97, 0x2e, 0x31, 0x42, 0x38, 0xd6, 0x30, 0x41, 0x26, 0x53, 0x83, 0x42, 0x7b, 0xc3, 0x36, 0x42, 0x43, 0x0b, 0xa4, 0x41, 0x6b, 0x7c, 0x84, 0x42, 0x63, 0x9d, 0x37, 0x42, 0xf5, 0xb9, 0x45, 0x41, 0x39, 0x85, 0x86, 0x42, 0xb8, 0xde, 0x2c, 0x42, 0x7d, 0xae, 0xb9, 0x41, 0x0d, 0xa0, 0x87, 0x42, 0xae, 0x36, 0x2e, 0x42, 0x3e, 0x57, 0x5b, 0x41, 0x64, 0x8c, 0x89, 0x42, 0xcc, 0x6e, 0x24, 0x42, 0x54, 0x41, 0x34, 0x42, +0x6c, 0x38, 0x7a, 0x42, 0x0c, 0x42, 0x2e, 0x42, 0xab, 0x4f, 0x0f, 0x42, 0xec, 0xc0, 0x76, 0x42, 0x4e, 0x91, 0x3c, 0x42, 0x6c, 0x38, 0x22, 0x42, 0x04, 0x05, 0x79, 0x42, 0xe4, 0xf2, 0x34, 0x42, 0x2a, 0x29, 0xe2, 0xc1, 0xc9, 0x65, 0x76, 0x42, 0xc8, 0xb6, 0x2a, 0x42, 0xab, 0xad, 0x94, 0xc1, 0x5d, 0x8b, 0x79, 0x42, 0x61, 0x65, 0x36, 0x42, 0x50, 0x6b, 0xa1, 0xc1, 0x83, 0x5e, 0x7f, 0x42, 0x94, 0x65, 0x2a, 0x42, 0x3a, 0x92, 0xc5, 0xc1, 0x5b, 0x20, 0x6e, 0x42, 0x3b, 0x8e, 0x37, 0x42, +0xb3, 0xfb, 0xd5, 0xc1, 0x4d, 0x04, 0x73, 0x42, 0xe0, 0xad, 0x2e, 0x42, 0x5b, 0x4e, 0x0f, 0xc1, 0xfb, 0x0b, 0x7d, 0x42, 0x67, 0x55, 0x36, 0x42, 0xfc, 0xfb, 0x1c, 0xc1, 0x31, 0x28, 0x81, 0x42, 0x88, 0x23, 0x2a, 0x42, 0x02, 0x48, 0xa9, 0x3f, 0xb2, 0x4e, 0x80, 0x42, 0x5a, 0xa4, 0x36, 0x42, 0x89, 0x07, 0xc8, 0x3f, 0x5f, 0xe7, 0x82, 0x42, 0xd4, 0x1a, 0x2c, 0x42, 0x3d, 0x1b, 0xb3, 0xc1, 0xd1, 0x51, 0x2d, 0x42, 0x2b, 0x65, 0x47, 0x42, 0x27, 0x31, 0x99, 0xc1, 0x71, 0x9b, 0x18, 0x42, +0x1c, 0x9a, 0x49, 0x42, 0xcb, 0x7f, 0x55, 0xc1, 0xa0, 0xc9, 0x09, 0x42, 0x6d, 0x16, 0x4b, 0x42, 0xd3, 0xab, 0xb6, 0xc1, 0x04, 0x45, 0x57, 0x42, 0x36, 0x6b, 0x42, 0x42, 0x6a, 0x4d, 0xbd, 0xc1, 0xae, 0x87, 0x43, 0x42, 0xaa, 0xe0, 0x44, 0x42, 0x04, 0xd6, 0xa8, 0x41, 0xdd, 0xf5, 0x02, 0x42, 0xfc, 0xe9, 0x4d, 0x42, 0x7f, 0xd9, 0x44, 0x41, 0x5f, 0x18, 0xfd, 0x41, 0x55, 0xdf, 0x4d, 0x42, 0x04, 0xd6, 0xa8, 0x41, 0xdd, 0xf5, 0x02, 0x42, 0xfc, 0xe9, 0x4d, 0x42, 0x9a, 0x99, 0xe1, 0x41, +0x96, 0xe1, 0x0b, 0x42, 0xe3, 0xf6, 0x4d, 0x42, 0xf6, 0x7a, 0xb6, 0xc0, 0xae, 0xc7, 0x01, 0x42, 0x1a, 0x6f, 0x4c, 0x42, 0x0b, 0xb5, 0x01, 0x42, 0x43, 0xdc, 0x1b, 0x42, 0x0a, 0xd7, 0x4d, 0x42, 0xc1, 0xb9, 0x0b, 0x42, 0xa4, 0x9f, 0x30, 0x42, 0x7f, 0x08, 0x4d, 0x42, 0x6a, 0xfc, 0x0c, 0x42, 0x4a, 0x2a, 0x48, 0x42, 0xc0, 0x1b, 0x4b, 0x42, 0x93, 0xe9, 0x06, 0x42, 0xe2, 0x98, 0x5f, 0x42, 0xa4, 0x30, 0x48, 0x42, 0xc6, 0xcb, 0xc6, 0x41, 0xe1, 0x7a, 0x7d, 0x42, 0x13, 0x72, 0x42, 0x42, +0x5d, 0x5c, 0x8f, 0x41, 0x82, 0x22, 0x7f, 0x42, 0x97, 0xbf, 0x41, 0x42, 0xcb, 0x62, 0x1f, 0x41, 0x98, 0x8c, 0x7b, 0x42, 0x7d, 0x9d, 0x41, 0x42, 0x5d, 0x5c, 0x8f, 0x41, 0x82, 0x22, 0x7f, 0x42, 0x97, 0xbf, 0x41, 0x42, 0xde, 0x24, 0xf0, 0x41, 0x55, 0x63, 0x72, 0x42, 0x30, 0xfb, 0x44, 0x42, 0x88, 0x63, 0xa3, 0xc1, 0xd1, 0x91, 0x66, 0x42, 0xb7, 0x80, 0x40, 0x42, 0x0d, 0x4f, 0x70, 0xc1, 0xc5, 0xfe, 0x6e, 0x42, 0x29, 0x0b, 0x40, 0x42, 0x62, 0xa1, 0xe3, 0xc0, 0x53, 0x34, 0x72, 0x42, +0x18, 0xd5, 0x40, 0x42, 0x96, 0xcf, 0xc2, 0x3f, 0x1a, 0x00, 0x76, 0x42, 0x35, 0x6f, 0x41, 0x42, 0xda, 0x38, 0xe2, 0x3f, 0x7c, 0x10, 0x68, 0x42, 0x23, 0x0a, 0x4c, 0x42, 0xa5, 0xf7, 0xd9, 0x3f, 0x68, 0x51, 0x5b, 0x42, 0xb9, 0xeb, 0x51, 0x42, 0x88, 0x9d, 0xd1, 0x3f, 0x92, 0x8b, 0x4d, 0x42, 0x7a, 0x36, 0x55, 0x42, 0xf8, 0xfc, 0xe0, 0x3f, 0x75, 0x13, 0x3e, 0x42, 0x32, 0x26, 0x57, 0x42, 0x8d, 0x45, 0x07, 0x40, 0x6f, 0xc1, 0x2d, 0x42, 0x70, 0x4e, 0x57, 0x42, 0xcc, 0x40, 0x27, 0x40, +0xfa, 0x9c, 0x1d, 0x42, 0x1f, 0x34, 0x55, 0x42, 0xd9, 0xeb, 0x41, 0x40, 0x60, 0xd4, 0x0d, 0x42, 0xb8, 0xde, 0x51, 0x42, 0xb7, 0x0b, 0x47, 0x40, 0xbb, 0x16, 0xfd, 0x41, 0x56, 0x4e, 0x4d, 0x42, 0xe5, 0xd0, 0x44, 0x40, 0x9b, 0xd5, 0xe1, 0x41, 0x0e, 0xbe, 0x47, 0x42, 0x9d, 0x0c, 0x46, 0x40, 0x03, 0x2b, 0xcf, 0x41, 0x1e, 0xe7, 0x41, 0x42, 0x71, 0xe6, 0x47, 0x40, 0xde, 0x82, 0xc0, 0x41, 0x3b, 0x1f, 0x3d, 0x42, 0xb9, 0xdf, 0x41, 0x40, 0x46, 0x94, 0xab, 0x41, 0xcf, 0x95, 0x37, 0x42, +0xa5, 0xa0, 0x82, 0x40, 0x53, 0x16, 0x8b, 0x41, 0x81, 0xc4, 0x2f, 0x42, 0x6a, 0x6a, 0x8f, 0x40, 0x84, 0xc0, 0x5e, 0x41, 0xe8, 0xd9, 0x23, 0x42, 0x2f, 0x2f, 0x94, 0x40, 0x2e, 0x90, 0x35, 0x41, 0x56, 0x3d, 0x14, 0x42, 0x89, 0x93, 0x9e, 0x40, 0x14, 0xf9, 0x1f, 0x41, 0xc5, 0x8f, 0x01, 0x42, 0x0a, 0x48, 0x8d, 0x42, 0xc3, 0x42, 0x66, 0x41, 0xc2, 0x69, 0x3b, 0x40, 0xb5, 0xa6, 0x97, 0x42, 0x74, 0x24, 0x93, 0x41, 0xf3, 0x1f, 0x3c, 0x40, 0x1b, 0x8d, 0x80, 0x42, 0x87, 0x85, 0x3a, 0x41, +0x4b, 0x3c, 0x2a, 0x40, 0xdf, 0xde, 0x9f, 0x42, 0xd4, 0x4d, 0xbb, 0x41, 0xf3, 0x1f, 0x3c, 0x40, 0x27, 0xa0, 0xa5, 0x42, 0x2a, 0x18, 0xe9, 0x41, 0xf3, 0x1f, 0x3c, 0x40, 0x1d, 0x29, 0xa9, 0x42, 0xe8, 0x6a, 0x0d, 0x42, 0xf3, 0x1f, 0x3c, 0x40, 0xc5, 0xbe, 0xab, 0x42, 0xb8, 0x8d, 0x28, 0x42, 0xf3, 0x1f, 0x3c, 0x40, 0x1b, 0xed, 0xab, 0x42, 0x20, 0x70, 0x43, 0x42, 0x35, 0x7b, 0x50, 0x40, 0x53, 0xd4, 0xa9, 0x42, 0x1e, 0xd6, 0x5c, 0x42, 0x35, 0x7b, 0x50, 0x40, 0x9b, 0xa6, 0xa5, 0x42, +0x24, 0x17, 0x74, 0x42, 0x55, 0x87, 0x50, 0x40, 0x3c, 0xdf, 0x9f, 0x42, 0xc2, 0x66, 0x84, 0x42, 0x35, 0x7b, 0x50, 0x40, 0x5b, 0x82, 0x99, 0x42, 0xc5, 0xaf, 0x8e, 0x42, 0xd5, 0x56, 0x50, 0x40, 0x66, 0xd7, 0x91, 0x42, 0x55, 0x50, 0x97, 0x42, 0x31, 0x77, 0x47, 0x40, 0xcf, 0x06, 0x8a, 0x42, 0x85, 0x4b, 0x9e, 0x42, 0x09, 0xa2, 0x40, 0x40, 0xc6, 0xed, 0x81, 0x42, 0x28, 0x3e, 0xa4, 0x42, 0x88, 0x16, 0x39, 0x40, 0xb3, 0x3b, 0x76, 0x42, 0xa0, 0x69, 0xa8, 0x42, 0x08, 0x20, 0x21, 0x40, +0xb3, 0x99, 0x6c, 0x42, 0x11, 0xa7, 0xab, 0x42, 0x5e, 0x80, 0x07, 0x40, 0x6a, 0x4d, 0x64, 0x42, 0xa4, 0x70, 0x22, 0x41, 0xcb, 0x45, 0x12, 0x40, 0x20, 0x7b, 0xd4, 0x40, 0x94, 0x25, 0xa6, 0x42, 0x9e, 0x41, 0x0a, 0x41, 0xb7, 0x23, 0xb5, 0x40, 0xe1, 0x09, 0xa6, 0x42, 0xaf, 0x42, 0x3e, 0x40, 0x6d, 0x6e, 0xfd, 0x40, 0xb8, 0x7e, 0xa9, 0x42, 0xdc, 0xef, 0x02, 0x41, 0x57, 0x78, 0xd7, 0x40, 0x9e, 0x0d, 0xa9, 0x42, 0xd3, 0x9f, 0x35, 0x40, 0xff, 0x90, 0x25, 0x41, 0xf4, 0xcc, 0xae, 0x42, +0x1c, 0xeb, 0x5f, 0x41, 0xa3, 0x75, 0xf5, 0x40, 0x9c, 0x84, 0xad, 0x42, 0x74, 0x35, 0x0a, 0x41, 0x00, 0x52, 0xc5, 0x40, 0x95, 0xb4, 0xac, 0x42, 0x3d, 0x9b, 0x55, 0x40, 0x4b, 0x93, 0x8a, 0x40, 0xcf, 0x66, 0xb1, 0x42, 0xea, 0x78, 0x92, 0x40, 0xb0, 0xc4, 0xbf, 0x40, 0xbd, 0x23, 0xb3, 0x42, 0xbd, 0xc1, 0x21, 0x41, 0x5a, 0xaa, 0x13, 0x41, 0xdc, 0x15, 0xb7, 0x42, 0x60, 0xd4, 0x88, 0x41, 0xbe, 0x30, 0x9c, 0x41, 0xe4, 0x32, 0xae, 0x42, 0xec, 0x2f, 0xa5, 0x41, 0x6f, 0x5f, 0x66, 0x41, +0x8c, 0x8a, 0xae, 0x42, 0x97, 0xff, 0x8e, 0x41, 0x40, 0x82, 0x68, 0x41, 0x13, 0xf2, 0xb4, 0x42, 0xd1, 0xa2, 0xa4, 0x41, 0x72, 0x8a, 0x9c, 0x41, 0x42, 0x6f, 0xb3, 0x42, 0x38, 0xe7, 0xb3, 0x41, 0x14, 0xae, 0xd1, 0x41, 0x2c, 0xe3, 0xad, 0x42, 0xbd, 0x52, 0xb1, 0x41, 0x52, 0xb8, 0xce, 0x41, 0xe5, 0xa1, 0xb2, 0x42, 0x72, 0x79, 0xbc, 0x41, 0x24, 0x17, 0x0c, 0x42, 0x59, 0xc6, 0xb2, 0x42, 0x50, 0xfc, 0xba, 0x41, 0x8a, 0x1f, 0x0c, 0x42, 0x32, 0xe6, 0xad, 0x42, 0xa7, 0x57, 0xaf, 0x41, +0x78, 0x3a, 0x34, 0x42, 0xea, 0xd5, 0xb2, 0x42, 0x8e, 0x97, 0x9e, 0x41, 0x66, 0xb7, 0x31, 0x42, 0x30, 0x59, 0xae, 0x42, 0x79, 0x47, 0x95, 0x41, 0x88, 0x63, 0x53, 0x42, 0x32, 0x08, 0xaf, 0x42, 0x51, 0x49, 0x45, 0x41, 0xf6, 0x97, 0x58, 0x42, 0xfd, 0x65, 0xb4, 0x42, 0x92, 0x3a, 0x52, 0x41, 0xaa, 0x4f, 0x6a, 0x42, 0xcb, 0x30, 0xaf, 0x42, 0x77, 0xf3, 0x0e, 0x40, 0xe1, 0x69, 0x6c, 0x42, 0x96, 0x10, 0xb4, 0x42, 0xf7, 0x1e, 0x58, 0x40, 0x7a, 0x4e, 0xca, 0x3f, 0xb7, 0xa0, 0x85, 0x42, +0x5b, 0xf1, 0x24, 0x42, 0xe7, 0x6a, 0xfe, 0xc1, 0x70, 0x5f, 0x21, 0x41, 0x62, 0x4a, 0xfc, 0xbf, 0xd0, 0x33, 0x1b, 0xc2, 0x0d, 0x02, 0x3b, 0x41, 0xce, 0xdf, 0xf8, 0xbf, 0xb3, 0xfb, 0x34, 0xc2, 0xf0, 0xa7, 0x68, 0x41, 0x83, 0x9e, 0xfd, 0xbf, 0xd8, 0x41, 0x4e, 0xc2, 0x2d, 0xa1, 0x91, 0x41, 0x2c, 0xd4, 0x06, 0xc0, 0x2e, 0x90, 0x8d, 0x42, 0x49, 0x9d, 0x63, 0x41, 0x1d, 0x38, 0x28, 0xc1, 0x92, 0xdc, 0x97, 0x42, 0xec, 0x2f, 0x92, 0x41, 0x6d, 0xe7, 0x29, 0xc1, 0x1b, 0xbe, 0x80, 0x42, +0x22, 0x6c, 0x38, 0x41, 0x43, 0x1c, 0x22, 0xc1, 0xa4, 0xdf, 0x9f, 0x42, 0x1c, 0xeb, 0xba, 0x41, 0xa2, 0x45, 0x2a, 0xc1, 0x25, 0x64, 0xa5, 0x42, 0x02, 0x09, 0xe9, 0x41, 0xcf, 0xf7, 0x2b, 0xc1, 0x92, 0xbc, 0xa8, 0x42, 0xcf, 0x77, 0x0d, 0x42, 0xbf, 0x0e, 0x31, 0xc1, 0x51, 0x3a, 0xab, 0x42, 0x4a, 0x8c, 0x28, 0x42, 0xd8, 0x81, 0x38, 0xc1, 0x7e, 0x9b, 0xab, 0x42, 0x6d, 0xb4, 0x43, 0x42, 0x72, 0x68, 0x40, 0xc1, 0xb5, 0x95, 0xa9, 0x42, 0xca, 0x61, 0x5d, 0x42, 0xe0, 0x9c, 0x46, 0xc1, +0x22, 0x6c, 0xa5, 0x42, 0xc0, 0xdb, 0x74, 0x42, 0xd7, 0x12, 0x4b, 0xc1, 0xc3, 0x44, 0x9f, 0x42, 0xb9, 0xcb, 0x84, 0x42, 0x1a, 0xc0, 0x4e, 0xc1, 0x38, 0x56, 0x8f, 0x42, 0x33, 0x44, 0x97, 0x42, 0x2f, 0x4c, 0x4b, 0xc1, 0x9a, 0x08, 0x98, 0x42, 0x08, 0xdb, 0x8e, 0x42, 0x82, 0x51, 0x56, 0xc1, 0x17, 0xd9, 0x9d, 0xc1, 0xc6, 0xcd, 0x9b, 0x42, 0xce, 0xdf, 0xf8, 0xbf, 0x4c, 0x15, 0xa2, 0xc1, 0x1c, 0xfc, 0x9b, 0x42, 0xc8, 0x98, 0x33, 0xc1, 0xda, 0x2c, 0xc8, 0xc1, 0x75, 0x62, 0x9d, 0x42, +0xf8, 0x36, 0xe9, 0xbf, 0xc8, 0x18, 0xca, 0xc1, 0xf3, 0x4e, 0x9e, 0x42, 0x23, 0xb9, 0x34, 0xc1, 0x39, 0x23, 0x5d, 0xc1, 0x25, 0xa6, 0x9c, 0x42, 0x49, 0x2e, 0xf3, 0xbf, 0x64, 0xcc, 0x65, 0xc1, 0x36, 0xbc, 0x9c, 0x42, 0x98, 0x4c, 0x29, 0xc1, 0xfa, 0x7f, 0x19, 0x3f, 0x82, 0x31, 0xa2, 0x42, 0x42, 0x95, 0x8e, 0xbf, 0x06, 0x13, 0x0b, 0x3f, 0xb2, 0x3d, 0xa2, 0x42, 0x82, 0x17, 0xc7, 0xc0, 0x1d, 0xc9, 0x5d, 0xc2, 0x95, 0xf4, 0xb8, 0x42, 0x10, 0xc7, 0x58, 0xc0, 0x36, 0xde, 0x43, 0xc2, +0x9c, 0xc2, 0xbc, 0x42, 0x3d, 0xb8, 0x5b, 0xc0, 0xba, 0x89, 0x45, 0xc2, 0x52, 0xf6, 0xb9, 0x42, 0x58, 0x17, 0x75, 0xc1, 0x36, 0xde, 0x43, 0xc2, 0x9c, 0xc2, 0xbc, 0x42, 0x3d, 0xb8, 0x5b, 0xc0, 0xe4, 0xc3, 0x2c, 0xc2, 0x78, 0x0b, 0xb8, 0x42, 0xe7, 0x8c, 0x6f, 0xc1, 0x58, 0xf9, 0x2a, 0xc2, 0x41, 0x80, 0xb9, 0x42, 0xa3, 0xaa, 0x4f, 0xc0, 0x3a, 0xa1, 0x84, 0xc2, 0xd6, 0xf4, 0x96, 0x42, 0xa6, 0x96, 0x07, 0xc0, 0x68, 0x80, 0x76, 0xc2, 0xe1, 0x5a, 0xad, 0x42, 0xb4, 0x59, 0x3d, 0xc0, +0xa6, 0x5b, 0x63, 0xc2, 0x19, 0x62, 0xb7, 0x41, 0x87, 0xbf, 0x02, 0xc0, 0x71, 0x2c, 0x74, 0xc2, 0xfa, 0x5c, 0xe0, 0x41, 0x2e, 0xff, 0x34, 0xc1, 0x27, 0x4f, 0x75, 0xc2, 0x05, 0x56, 0xe1, 0x41, 0x24, 0x0b, 0x00, 0xc0, 0xc9, 0xb4, 0x80, 0xc2, 0x9f, 0xfc, 0x08, 0x42, 0xe6, 0xae, 0x32, 0xc1, 0xb3, 0x5d, 0x81, 0xc2, 0x05, 0xa3, 0x08, 0x42, 0x5c, 0xc9, 0xf6, 0xbf, 0xc9, 0x54, 0xe9, 0xc1, 0x42, 0xbe, 0xa0, 0x42, 0x71, 0xfe, 0xd6, 0xbf, 0x15, 0x0c, 0xe9, 0xc1, 0x98, 0x2c, 0xa2, 0x42, +0xb9, 0x1e, 0x37, 0xc1, 0xea, 0x73, 0x03, 0xc2, 0xf0, 0x05, 0xa7, 0x42, 0x31, 0xeb, 0xf9, 0xbf, 0xc4, 0x71, 0x02, 0xc2, 0x00, 0x60, 0xa9, 0x42, 0x84, 0x7c, 0x48, 0xc1, 0xc9, 0x54, 0xe9, 0xc1, 0x42, 0xbe, 0xa0, 0x42, 0x71, 0xfe, 0xd6, 0xbf, 0x15, 0x0c, 0xe9, 0xc1, 0x98, 0x2c, 0xa2, 0x42, 0xb9, 0x1e, 0x37, 0xc1, 0x03, 0x29, 0x87, 0x42, 0xc1, 0x37, 0x9e, 0x42, 0x71, 0x3d, 0x44, 0xc1, 0xd8, 0xf0, 0x7d, 0x42, 0xeb, 0x02, 0xa4, 0x42, 0x4c, 0xa6, 0x38, 0xc1, 0x9e, 0x8d, 0x14, 0xc2, +0xe2, 0xe7, 0xb1, 0x42, 0x76, 0x89, 0x3e, 0xc0, 0x53, 0x45, 0x15, 0xc2, 0xad, 0x9a, 0xb2, 0x42, 0x4d, 0x84, 0x68, 0xc1, 0xe4, 0x72, 0x87, 0xc2, 0x3a, 0xb4, 0x2a, 0x42, 0x27, 0xda, 0xf1, 0xbf, 0xd5, 0x98, 0x8a, 0xc2, 0xa8, 0x24, 0x50, 0x42, 0x96, 0xe7, 0xfd, 0xbf, 0x0a, 0x28, 0x8a, 0xc2, 0x04, 0x45, 0x6c, 0x42, 0x55, 0x30, 0xfe, 0xbf, 0x8d, 0x06, 0x88, 0xc2, 0x8c, 0x2c, 0x85, 0x42, 0x92, 0x57, 0xfb, 0xbf, 0x42, 0xfe, 0x6f, 0x42, 0xe9, 0x06, 0xa8, 0x42, 0x7f, 0xd9, 0x2b, 0xc1, +0x35, 0x0d, 0x67, 0x42, 0x37, 0x38, 0xab, 0x42, 0x0e, 0x9c, 0x25, 0xc1, 0x57, 0x04, 0xb6, 0x40, 0x07, 0x0e, 0xa6, 0x42, 0x45, 0x47, 0x3a, 0xbf, 0x21, 0xe5, 0xb6, 0x40, 0x3a, 0x12, 0xa6, 0x42, 0x14, 0xb3, 0x8d, 0xc0, 0x26, 0x4e, 0xd0, 0x40, 0xd1, 0xe0, 0xa8, 0x42, 0x07, 0x96, 0x77, 0xbf, 0xc8, 0x5e, 0xcb, 0x40, 0xb0, 0xc1, 0xa8, 0x42, 0x8c, 0x2d, 0x6e, 0xc0, 0x1b, 0x5e, 0x64, 0x42, 0x9a, 0x77, 0x21, 0x41, 0x84, 0x7c, 0x19, 0xc1, 0x1a, 0x34, 0xb7, 0x40, 0xb9, 0x6b, 0xac, 0x42, +0xfd, 0xd7, 0xa9, 0xbe, 0xb3, 0xb5, 0xae, 0x40, 0x28, 0x3e, 0xac, 0x42, 0xbd, 0xa9, 0x50, 0xc0, 0xb4, 0x3c, 0x6f, 0x40, 0x83, 0x0f, 0xb1, 0x42, 0x20, 0xef, 0x8d, 0x3f, 0x1b, 0xd3, 0x4f, 0x40, 0x36, 0x2b, 0xb1, 0x42, 0x18, 0x5b, 0x2e, 0xc0, 0x46, 0xb6, 0x63, 0x42, 0xd1, 0x91, 0xb3, 0x42, 0x2e, 0x90, 0x28, 0xc1, 0x72, 0xf9, 0x61, 0x42, 0x7e, 0xec, 0xae, 0x42, 0xae, 0x47, 0x21, 0xc1, 0x58, 0xb9, 0xc2, 0xc1, 0x72, 0xf9, 0x36, 0x41, 0xf2, 0x70, 0x19, 0xc2, 0xb0, 0x83, 0x81, 0xc1, +0xa6, 0x9b, 0x36, 0x41, 0xfb, 0x4b, 0x27, 0xc2, 0xe8, 0x6a, 0x99, 0xc1, 0xb1, 0x85, 0x1f, 0x41, 0x34, 0x40, 0x0a, 0xc2, 0x88, 0xd2, 0x40, 0xc1, 0xe4, 0xe6, 0x1f, 0x41, 0x13, 0xe1, 0x15, 0xc2, 0x17, 0xd9, 0xf8, 0xc1, 0xd7, 0xa3, 0x37, 0x41, 0xd8, 0xdf, 0x03, 0xc2, 0xb7, 0xf3, 0xc8, 0xc1, 0xb3, 0xde, 0x1e, 0x41, 0xee, 0x7c, 0xf1, 0xc1, 0xe3, 0xe5, 0x0d, 0xc2, 0x4f, 0x1e, 0x3a, 0x41, 0x50, 0x6b, 0xcd, 0xc1, 0x0b, 0x13, 0xe8, 0xc1, 0xa1, 0xd6, 0x20, 0x41, 0x48, 0xbf, 0xbf, 0xc1, +0x5b, 0x60, 0x17, 0xc2, 0xb6, 0x84, 0x3b, 0x41, 0x56, 0x7d, 0x8f, 0xc1, 0xcd, 0xbb, 0xf7, 0xc1, 0xf0, 0x85, 0x22, 0x41, 0x97, 0xff, 0x87, 0xc1, 0x59, 0xd5, 0x82, 0x42, 0xdc, 0xf9, 0x92, 0x41, 0x36, 0xab, 0x0a, 0xc2, 0x00, 0x00, 0x74, 0x42, 0x17, 0xd9, 0x64, 0x41, 0xe4, 0xc3, 0x02, 0xc2, 0x3f, 0x75, 0x4c, 0x42, 0xb3, 0x9d, 0x8e, 0x41, 0x08, 0x1b, 0x2f, 0xc2, 0x88, 0xe3, 0x3b, 0x42, 0xad, 0x69, 0x63, 0x41, 0x77, 0x2d, 0x23, 0xc2, 0x86, 0x27, 0x5e, 0x42, 0xf7, 0x75, 0x37, 0x41, +0x5a, 0xe4, 0xf1, 0xc1, 0x2e, 0xee, 0x2b, 0x42, 0x17, 0x26, 0x38, 0x41, 0x00, 0xaf, 0x15, 0xc2, 0x58, 0x28, 0x9c, 0xc1, 0xab, 0xad, 0x65, 0x41, 0x0d, 0x8f, 0x35, 0xc2, 0x09, 0xf9, 0xe7, 0xc1, 0x27, 0x0f, 0x66, 0x41, 0xc5, 0x8f, 0x26, 0xc2, 0xb7, 0xf3, 0x11, 0xc2, 0x1c, 0x5a, 0x67, 0x41, 0x27, 0x71, 0x0d, 0xc2, 0x38, 0xe7, 0x24, 0xc2, 0xbf, 0x0e, 0x95, 0x41, 0x47, 0xe1, 0x14, 0xc2, 0x3a, 0xc1, 0x04, 0xc2, 0xdd, 0x93, 0x94, 0x41, 0x71, 0xec, 0x30, 0xc2, 0x49, 0xae, 0xb5, 0xc1, +0x84, 0x0d, 0x93, 0x41, 0x6f, 0xb0, 0x40, 0xc2, 0x84, 0xbc, 0x25, 0xc2, 0x9a, 0xe6, 0x66, 0x41, 0xaf, 0x14, 0xd9, 0xc1, 0x42, 0x7e, 0x30, 0xc2, 0x7d, 0x1d, 0x67, 0x41, 0xaf, 0x94, 0x95, 0xc1, 0x27, 0xa0, 0x47, 0xc2, 0x59, 0x06, 0x91, 0x41, 0x05, 0xa3, 0x9b, 0xc1, 0xc9, 0xa5, 0x3a, 0xc2, 0x74, 0x24, 0x93, 0x41, 0x3f, 0x46, 0xe2, 0xc1, 0xaa, 0x60, 0x78, 0x42, 0xae, 0xb6, 0x36, 0x41, 0x7c, 0x50, 0xa4, 0xc1, 0xd5, 0x87, 0x88, 0x42, 0xf4, 0x6c, 0x63, 0x41, 0x48, 0x3f, 0xad, 0xc1, +0x5a, 0x13, 0x92, 0x42, 0x3f, 0xc6, 0x92, 0x41, 0x40, 0x02, 0xb4, 0xc1, 0xfb, 0xda, 0x8d, 0x42, 0x17, 0x48, 0xe8, 0x41, 0xe8, 0x6a, 0x13, 0xc2, 0x6e, 0x23, 0x89, 0x42, 0x1d, 0x49, 0xbb, 0x41, 0x8f, 0x02, 0x10, 0xc2, 0x8a, 0x41, 0x6d, 0x42, 0x4f, 0xaf, 0xe3, 0x41, 0xa7, 0x28, 0x3a, 0xc2, 0xa6, 0x5b, 0x5b, 0x42, 0xa5, 0xac, 0xb5, 0x41, 0x70, 0xdf, 0x36, 0xc2, 0x1b, 0x0d, 0xd7, 0xc1, 0x9a, 0x88, 0xbd, 0x41, 0x76, 0x8f, 0x48, 0xc2, 0x89, 0xb0, 0x14, 0xc2, 0x0d, 0x02, 0xbe, 0x41, +0x1a, 0x91, 0x37, 0xc2, 0xd8, 0x23, 0x36, 0xc2, 0x6a, 0x4d, 0xbd, 0x41, 0x73, 0x06, 0x1a, 0xc2, 0x2d, 0x72, 0x45, 0xc2, 0x26, 0x06, 0xe7, 0x41, 0x30, 0x19, 0x1c, 0xc2, 0xb9, 0x7c, 0x25, 0xc2, 0x54, 0xc1, 0xea, 0x41, 0xc9, 0x14, 0x3b, 0xc2, 0xe1, 0xcb, 0x04, 0xc2, 0xe8, 0xfb, 0xee, 0x41, 0xf6, 0xd7, 0x4a, 0xc2, 0x5d, 0x5c, 0x99, 0x42, 0x0e, 0xbe, 0xbb, 0x41, 0xb7, 0x40, 0xb9, 0xc1, 0xa4, 0x50, 0x9e, 0x42, 0xe4, 0x83, 0xe9, 0x41, 0x4f, 0x2f, 0xbd, 0xc1, 0x69, 0x20, 0x91, 0x42, +0xd8, 0x81, 0x0c, 0x42, 0x9e, 0x8d, 0x15, 0xc2, 0x69, 0x11, 0x7a, 0x42, 0x5c, 0x3e, 0x0b, 0x42, 0x74, 0xa4, 0x3a, 0xc2, 0x60, 0xf6, 0x92, 0x42, 0x0a, 0x06, 0x27, 0x42, 0x96, 0x61, 0x15, 0xc2, 0xc5, 0x3e, 0x81, 0x42, 0xac, 0x5c, 0x26, 0x42, 0x55, 0x5f, 0x3a, 0xc2, 0x6f, 0x41, 0xa1, 0x42, 0x01, 0x8d, 0x0d, 0x42, 0x50, 0xeb, 0xbf, 0xc1, 0x15, 0x1d, 0xa3, 0x42, 0xbd, 0x74, 0x28, 0x42, 0xee, 0x7c, 0xc2, 0xc1, 0xa2, 0xb4, 0x7f, 0x42, 0x74, 0xe4, 0x5c, 0x42, 0x5d, 0x4b, 0x36, 0xc2, +0x2e, 0xd0, 0x91, 0x42, 0x6e, 0x63, 0x5c, 0x42, 0xa4, 0x1f, 0x14, 0xc2, 0xa6, 0x6a, 0x82, 0x42, 0x53, 0x34, 0x42, 0x42, 0xa8, 0x75, 0x38, 0xc2, 0x14, 0xae, 0x93, 0x42, 0x69, 0x40, 0x42, 0x42, 0x33, 0x33, 0x15, 0xc2, 0x17, 0x59, 0xa3, 0x42, 0x5f, 0x98, 0x43, 0x42, 0xc2, 0x06, 0xc5, 0xc1, 0xcb, 0x5f, 0xa1, 0x42, 0x0b, 0x64, 0x5d, 0x42, 0xbd, 0x74, 0xc6, 0xc1, 0xdc, 0x35, 0x5f, 0x42, 0x65, 0x88, 0x85, 0x42, 0x77, 0xad, 0x30, 0xc2, 0xb3, 0x9d, 0x86, 0x42, 0x98, 0xdd, 0x84, 0x42, +0xc9, 0x76, 0x10, 0xc2, 0x34, 0x2f, 0x73, 0x42, 0xe2, 0xc7, 0x75, 0x42, 0x5b, 0x20, 0x34, 0xc2, 0x0d, 0x8f, 0x8d, 0x42, 0xdc, 0x79, 0x74, 0x42, 0xad, 0x29, 0x13, 0xc2, 0xa6, 0x39, 0x9d, 0x42, 0x5d, 0x0f, 0x75, 0x42, 0x98, 0x6e, 0xc6, 0xc1, 0x52, 0x18, 0x97, 0x42, 0x29, 0x0b, 0x85, 0x42, 0x2e, 0xff, 0xc4, 0xc1, 0x0c, 0xd3, 0x2f, 0x42, 0x6e, 0x54, 0x95, 0x42, 0x90, 0x42, 0x1f, 0xc2, 0x9c, 0x51, 0x67, 0x42, 0xdc, 0x79, 0x96, 0x42, 0xa4, 0x8e, 0x08, 0xc2, 0x25, 0xc6, 0x44, 0x42, +0x8d, 0xe6, 0x8d, 0x42, 0xc3, 0x64, 0x29, 0xc2, 0x39, 0xf4, 0x7b, 0x42, 0x17, 0x19, 0x8e, 0x42, 0xc8, 0xc7, 0x0c, 0xc2, 0x82, 0xf3, 0x8e, 0x42, 0xdc, 0x66, 0x8e, 0x42, 0x59, 0x97, 0xc3, 0xc1, 0xba, 0xba, 0x85, 0x42, 0xfa, 0xed, 0x96, 0x42, 0x9b, 0x66, 0xc3, 0xc1, 0x78, 0x7a, 0x43, 0xc1, 0x88, 0xc3, 0x93, 0x42, 0x06, 0xc1, 0x11, 0xc2, 0xe3, 0x6b, 0xdb, 0xc0, 0xeb, 0x42, 0x98, 0x42, 0x7b, 0x32, 0x05, 0xc2, 0x12, 0xf7, 0x0c, 0x40, 0xc4, 0xc0, 0x91, 0x42, 0x9b, 0xe6, 0x24, 0xc2, +0x61, 0x32, 0x83, 0x40, 0xf4, 0xac, 0x97, 0x42, 0x17, 0xc8, 0x15, 0xc2, 0xc4, 0xb1, 0x02, 0xc0, 0xf2, 0xd2, 0x9c, 0x42, 0xce, 0xcc, 0xeb, 0xc1, 0x11, 0xfc, 0xc5, 0x40, 0x65, 0x0a, 0x9d, 0x42, 0x71, 0xbd, 0x05, 0xc2, 0x63, 0x5d, 0x76, 0x41, 0x7f, 0x99, 0x9d, 0x42, 0x0d, 0x0f, 0x0e, 0xc2, 0x14, 0x3f, 0x76, 0x41, 0x7d, 0x3f, 0x98, 0x42, 0xa5, 0xac, 0x1b, 0xc2, 0x3f, 0xa4, 0x78, 0x41, 0xf9, 0x60, 0x92, 0x42, 0xc6, 0x0b, 0x2a, 0xc2, 0x01, 0x4d, 0xc6, 0xc1, 0x8d, 0x28, 0x99, 0x42, +0x48, 0xd0, 0x9d, 0xc1, 0xa2, 0x45, 0x95, 0xc1, 0xee, 0x5a, 0x9a, 0x42, 0xf2, 0xc1, 0x97, 0xc1, 0x32, 0x66, 0xa5, 0xc1, 0x92, 0xfc, 0x95, 0x42, 0xe7, 0x8c, 0xe6, 0xc1, 0x6b, 0x09, 0x69, 0xc1, 0x02, 0x3a, 0x99, 0x42, 0x5c, 0x0f, 0xd8, 0xc1, 0x44, 0x8b, 0x48, 0xc1, 0x53, 0x94, 0x9c, 0x42, 0xa7, 0x57, 0x8d, 0xc1, 0xa0, 0x1a, 0x05, 0xc1, 0xb5, 0xb5, 0x9c, 0x42, 0x5e, 0x29, 0xc2, 0xc1, 0x5b, 0x77, 0xfb, 0x3f, 0x2c, 0x83, 0xa2, 0x42, 0xab, 0xcf, 0x92, 0xc1, 0x04, 0x56, 0x3a, 0x3f, +0xd8, 0x5f, 0xa2, 0x42, 0x05, 0xa3, 0x46, 0xc1, 0xb7, 0x06, 0x8b, 0x40, 0xd2, 0x3e, 0xa2, 0x42, 0x48, 0x50, 0xc1, 0xc1, 0x3c, 0x5f, 0x5f, 0xc2, 0xc5, 0xa0, 0xa2, 0x42, 0x38, 0x67, 0xe4, 0xc1, 0xe4, 0x43, 0x5f, 0xc2, 0x1c, 0x7c, 0xae, 0x42, 0xd4, 0x9a, 0xb0, 0xc1, 0xff, 0x90, 0x47, 0xc2, 0xc8, 0x38, 0xa7, 0x42, 0xc9, 0xe5, 0xe7, 0xc1, 0x69, 0x80, 0x46, 0xc2, 0x75, 0xb1, 0xb2, 0x42, 0xe9, 0xb7, 0xb3, 0xc1, 0x69, 0x80, 0x46, 0xc2, 0x75, 0xb1, 0xb2, 0x42, 0xe9, 0xb7, 0xb3, 0xc1, +0x7c, 0xd0, 0x2e, 0xc2, 0xe4, 0xb2, 0xb0, 0x42, 0xc2, 0x86, 0xb2, 0xc1, 0xff, 0x90, 0x47, 0xc2, 0xc8, 0x38, 0xa7, 0x42, 0xc9, 0xe5, 0xe7, 0xc1, 0xc8, 0xc7, 0x31, 0xc2, 0xa8, 0x35, 0xa5, 0x42, 0xb1, 0xbf, 0xe7, 0xc1, 0x88, 0xf4, 0x31, 0xc2, 0x1a, 0xc0, 0x9b, 0x42, 0xc1, 0xa8, 0x06, 0xc2, 0x23, 0xb9, 0x42, 0xc2, 0xfd, 0x76, 0x9a, 0x42, 0x5c, 0x20, 0x0a, 0xc2, 0x6d, 0x85, 0x58, 0xc2, 0xb5, 0x95, 0x95, 0x42, 0x94, 0x87, 0x0a, 0xc2, 0x23, 0xb9, 0x42, 0xc2, 0xfd, 0x76, 0x9a, 0x42, +0x5c, 0x20, 0x0a, 0xc2, 0x4e, 0xa0, 0x80, 0xc2, 0x89, 0x50, 0x8b, 0x42, 0xec, 0x2f, 0xcf, 0xc1, 0xb6, 0x02, 0x83, 0xc2, 0xe0, 0x2d, 0x91, 0x42, 0x09, 0x0a, 0x94, 0xc1, 0xa5, 0x7d, 0x74, 0xc2, 0x09, 0x39, 0x98, 0x42, 0x05, 0x23, 0xda, 0xc1, 0xc1, 0xd7, 0x76, 0xc2, 0x4a, 0xcc, 0xa3, 0x42, 0x8f, 0xd3, 0xa7, 0xc1, 0x4d, 0x22, 0x6b, 0xc2, 0xb2, 0x6c, 0x8d, 0x42, 0x55, 0x70, 0x08, 0xc2, 0x5f, 0xd8, 0x77, 0xc2, 0xd8, 0x81, 0x83, 0x42, 0x3a, 0xd2, 0x03, 0xc2, 0xa0, 0xc9, 0x69, 0xc2, +0x35, 0x8d, 0x71, 0x42, 0xc4, 0xb1, 0x1c, 0xc2, 0x8a, 0x3d, 0x5c, 0xc2, 0x41, 0x11, 0x82, 0x42, 0x0c, 0x13, 0x22, 0xc2, 0xe2, 0x07, 0x4a, 0xc2, 0xd2, 0x8f, 0x89, 0x42, 0x0f, 0xba, 0x22, 0xc2, 0x85, 0xda, 0x2d, 0xc2, 0xc1, 0xca, 0x71, 0x42, 0x25, 0xf5, 0x3d, 0xc2, 0x42, 0xe0, 0x3a, 0xc2, 0xe7, 0x6a, 0x5d, 0x42, 0xbd, 0x63, 0x40, 0xc2, 0xb5, 0xd5, 0x44, 0xc2, 0x98, 0xcc, 0x44, 0x42, 0x3c, 0x7d, 0x3d, 0xc2, 0x65, 0xbb, 0x58, 0xc2, 0xef, 0xf8, 0x37, 0x42, 0x2d, 0x21, 0x29, 0xc2, +0x27, 0xe0, 0x6b, 0xc2, 0x2d, 0xe1, 0x2e, 0x42, 0xdc, 0x57, 0x0e, 0xc2, 0x2b, 0x36, 0x75, 0xc2, 0xd5, 0x56, 0x5f, 0x42, 0x90, 0x31, 0x11, 0xc2, 0x6a, 0x6b, 0x7f, 0xc2, 0xce, 0x48, 0x52, 0x42, 0x73, 0x06, 0x00, 0xc2, 0x0b, 0x64, 0x82, 0xc2, 0x09, 0x4a, 0x64, 0x42, 0x49, 0x1d, 0xec, 0xc1, 0xe7, 0xbb, 0x7f, 0xc2, 0x80, 0xea, 0x72, 0x42, 0xf1, 0x52, 0xf9, 0xc1, 0x8a, 0xce, 0x4c, 0xc2, 0xb0, 0x61, 0xb9, 0x41, 0x5b, 0xa0, 0xe8, 0xc1, 0xf8, 0xd3, 0x5b, 0xc2, 0x3a, 0x81, 0xb6, 0x41, +0x13, 0xd0, 0x9f, 0xc1, 0xc5, 0x0f, 0x6d, 0xc2, 0x92, 0x4b, 0xdf, 0x41, 0x88, 0xe3, 0xa1, 0xc1, 0xa7, 0x9b, 0x5c, 0xc2, 0x27, 0xb1, 0xe1, 0x41, 0x32, 0x66, 0xec, 0xc1, 0x0b, 0xb0, 0x7d, 0xc0, 0xe1, 0x29, 0x10, 0x42, 0x32, 0x08, 0x6e, 0xc2, 0xe0, 0x39, 0x15, 0xc1, 0xb3, 0xaa, 0x12, 0x42, 0xb6, 0x33, 0x6c, 0xc2, 0x57, 0x21, 0x8c, 0xc0, 0xa4, 0x4e, 0x1e, 0x42, 0x14, 0x5d, 0x6f, 0xc2, 0x4e, 0x40, 0x33, 0xc1, 0xa1, 0xa7, 0x1d, 0x42, 0xb3, 0x1d, 0x6c, 0xc2, 0xe5, 0x61, 0x51, 0xc1, +0xf9, 0x60, 0x2d, 0x42, 0x74, 0x64, 0x6b, 0xc2, 0x47, 0x1b, 0xa7, 0xc0, 0xd1, 0xe2, 0x2d, 0x42, 0x0a, 0x86, 0x6f, 0xc2, 0xb6, 0x62, 0x37, 0xc2, 0x5c, 0xbe, 0x0d, 0x42, 0xd8, 0x41, 0x39, 0xc2, 0xd4, 0x4d, 0x54, 0xc2, 0x41, 0x20, 0x09, 0x42, 0x7f, 0x19, 0x1a, 0xc2, 0x27, 0xe0, 0x6b, 0xc2, 0x2d, 0xe1, 0x2e, 0x42, 0xdc, 0x57, 0x0e, 0xc2, 0x65, 0xbb, 0x58, 0xc2, 0xef, 0xf8, 0x37, 0x42, 0x2d, 0x21, 0x29, 0xc2, 0xb5, 0xd5, 0x44, 0xc2, 0x98, 0xcc, 0x44, 0x42, 0x3c, 0x7d, 0x3d, 0xc2, +0x61, 0x03, 0x1f, 0xc2, 0xce, 0x59, 0x15, 0x42, 0xa6, 0xca, 0x48, 0xc2, 0x2b, 0xc7, 0x6a, 0xc2, 0x2c, 0xc3, 0x06, 0x42, 0xb7, 0x51, 0xeb, 0xc1, 0x61, 0x83, 0x7c, 0xc2, 0x1d, 0xda, 0x05, 0x42, 0xd3, 0x2b, 0xa1, 0xc1, 0x6f, 0xb0, 0x84, 0xc2, 0x79, 0xc7, 0x28, 0x42, 0x47, 0x83, 0x9b, 0xc1, 0xfc, 0x87, 0x7c, 0xc2, 0x74, 0x35, 0x2a, 0x42, 0x76, 0xcf, 0xde, 0xc1, 0x1e, 0x85, 0x63, 0xc1, 0xad, 0x9c, 0x4f, 0x42, 0xca, 0x32, 0x68, 0xc2, 0x3f, 0x35, 0xc0, 0xc0, 0x9f, 0x6b, 0x4d, 0x42, +0x2e, 0x32, 0x6c, 0xc2, 0xf4, 0x6c, 0x63, 0xc1, 0xc9, 0xe5, 0x3e, 0x42, 0x4b, 0xf7, 0x69, 0xc2, 0xd8, 0xf0, 0xba, 0xc0, 0xd9, 0x0e, 0x3e, 0x42, 0xc3, 0x64, 0x6e, 0xc2, 0x8d, 0x28, 0x32, 0xc1, 0x5f, 0xfa, 0x82, 0x42, 0x65, 0xc8, 0x42, 0xc2, 0x35, 0xef, 0xad, 0xc1, 0x04, 0x05, 0x80, 0x42, 0x44, 0x29, 0x45, 0xc2, 0x22, 0xfd, 0x5e, 0xc1, 0x0a, 0xa8, 0x87, 0x42, 0xb1, 0xae, 0x37, 0xc2, 0x31, 0x77, 0xc8, 0xc1, 0xdd, 0xd3, 0x83, 0x42, 0xb5, 0x26, 0x3d, 0xc2, 0x56, 0x8e, 0xf0, 0xc1, +0x89, 0xa1, 0x9a, 0x42, 0xe1, 0x8b, 0xa4, 0xc1, 0x19, 0x73, 0xda, 0xc1, 0x8d, 0xc6, 0x93, 0x42, 0xff, 0xa1, 0xf2, 0xc1, 0x08, 0x9b, 0xac, 0xc1, 0xea, 0x95, 0x8e, 0x42, 0xed, 0x8d, 0x1d, 0xc2, 0x08, 0x9b, 0xac, 0xc1, 0xea, 0x95, 0x8e, 0x42, 0xed, 0x8d, 0x1d, 0xc2, 0xca, 0x83, 0x04, 0xc2, 0x39, 0xc5, 0x8a, 0x42, 0x9c, 0xe2, 0x25, 0xc2, 0x19, 0x73, 0xda, 0xc1, 0x8d, 0xc6, 0x93, 0x42, 0xff, 0xa1, 0xf2, 0xc1, 0x17, 0x08, 0x09, 0xc2, 0x21, 0xce, 0x93, 0x42, 0x52, 0xb8, 0xf6, 0xc1, +0xf1, 0xf4, 0x09, 0xc2, 0x01, 0x0d, 0xa0, 0x42, 0x91, 0x7e, 0xac, 0xc1, 0x56, 0x8e, 0xf0, 0xc1, 0x89, 0xa1, 0x9a, 0x42, 0xe1, 0x8b, 0xa4, 0xc1, 0xea, 0xf3, 0x08, 0x42, 0xfe, 0x23, 0xa1, 0x42, 0xcb, 0xff, 0x08, 0xc2, 0xc7, 0xcb, 0x42, 0x42, 0x7d, 0x5f, 0xa2, 0x42, 0x81, 0xf3, 0xf6, 0xc1, 0x49, 0xdd, 0x1c, 0x42, 0x72, 0x4a, 0x9b, 0x42, 0x9b, 0x55, 0x14, 0xc2, 0xf4, 0x2c, 0x53, 0x42, 0x05, 0xf4, 0x9c, 0x42, 0x58, 0x79, 0x03, 0xc2, 0x0b, 0xa4, 0xed, 0x41, 0x9a, 0x77, 0x93, 0x42, +0x53, 0x34, 0x28, 0xc2, 0xf0, 0x05, 0xd9, 0x41, 0x7b, 0x74, 0x99, 0x42, 0xba, 0x89, 0x1b, 0xc2, 0x77, 0xbe, 0xc9, 0x41, 0x90, 0xa0, 0x9e, 0x42, 0xb3, 0x3b, 0x0f, 0xc2, 0x35, 0x8d, 0x79, 0x42, 0xdd, 0xd5, 0x9d, 0x42, 0x1f, 0xf4, 0xc1, 0xc1, 0xf2, 0xc1, 0x67, 0x42, 0x42, 0x6f, 0xa3, 0x42, 0xd0, 0xc4, 0xb9, 0xc1, 0x0a, 0x63, 0x18, 0x41, 0x40, 0x24, 0xa2, 0x42, 0x6f, 0x5f, 0xe6, 0xc1, 0x71, 0x9b, 0x84, 0x41, 0x08, 0x3b, 0xa2, 0x42, 0xf7, 0x28, 0xff, 0xc1, 0x2c, 0x94, 0x21, 0xc2, +0x4e, 0xa2, 0x92, 0x42, 0x18, 0x55, 0x12, 0xc2, 0x3a, 0x92, 0x1e, 0xc2, 0x2c, 0x23, 0x9c, 0x42, 0xd3, 0xab, 0xee, 0xc1, 0x9d, 0x80, 0x1a, 0xc2, 0x4d, 0x44, 0xa9, 0x42, 0xa8, 0x35, 0xb1, 0xc1, 0xfc, 0x87, 0x7c, 0xc2, 0x74, 0x35, 0x2a, 0x42, 0x76, 0xcf, 0xde, 0xc1, 0x6f, 0xb0, 0x84, 0xc2, 0x79, 0xc7, 0x28, 0x42, 0x47, 0x83, 0x9b, 0xc1, 0xe4, 0x43, 0x84, 0xc2, 0x65, 0x59, 0x4d, 0x42, 0x08, 0x9b, 0xce, 0xc1, 0x39, 0x14, 0x88, 0xc2, 0x1f, 0x05, 0x4d, 0x42, 0x94, 0x18, 0x93, 0xc1, +0x38, 0x09, 0x88, 0xc2, 0x6b, 0xda, 0x68, 0x42, 0xe1, 0x8b, 0x8e, 0xc1, 0x70, 0x5f, 0x85, 0xc2, 0x3d, 0x5b, 0x66, 0x42, 0xd8, 0x81, 0xc5, 0xc1, 0x15, 0x8c, 0x34, 0xc2, 0xe4, 0x92, 0x8e, 0x42, 0x0a, 0xc6, 0x1e, 0xc2, 0xf6, 0xc6, 0x1c, 0xc2, 0x5d, 0x9c, 0x81, 0x42, 0xee, 0xda, 0x36, 0xc2, 0xf6, 0xc6, 0x1c, 0xc2, 0x5d, 0x9c, 0x81, 0x42, 0xee, 0xda, 0x36, 0xc2, 0x15, 0x8c, 0x34, 0xc2, 0xe4, 0x92, 0x8e, 0x42, 0x0a, 0xc6, 0x1e, 0xc2, 0x5b, 0xb1, 0x83, 0xc2, 0x6a, 0xab, 0x7d, 0x42, +0x40, 0x13, 0xc8, 0xc1, 0xe8, 0x2a, 0x86, 0xc2, 0x59, 0x35, 0x82, 0x42, 0xbb, 0x49, 0x8f, 0xc1, 0x84, 0xde, 0x59, 0x42, 0x96, 0x52, 0xa7, 0x42, 0x57, 0x6c, 0xac, 0xc1, 0x19, 0x62, 0x38, 0x42, 0xf3, 0x7f, 0xa6, 0x42, 0x33, 0x22, 0xe5, 0xc1, 0xc2, 0xc6, 0x30, 0x42, 0xee, 0x3c, 0xaa, 0x42, 0xf5, 0x4a, 0xd6, 0xc1, 0xde, 0xc2, 0x50, 0x42, 0xe9, 0xb7, 0xaa, 0x42, 0x23, 0x39, 0xa3, 0xc1, 0x70, 0x5f, 0x8f, 0x41, 0x65, 0x68, 0xa6, 0x42, 0x55, 0x1f, 0xe8, 0xc1, 0xa9, 0x02, 0xca, 0x41, +0x40, 0x24, 0xa2, 0x42, 0xbe, 0x70, 0x05, 0xc2, 0x79, 0xc7, 0xce, 0x41, 0x7a, 0x45, 0xa6, 0x42, 0x19, 0x04, 0xf7, 0xc1, 0xda, 0x2c, 0x98, 0x41, 0xaa, 0x11, 0xaa, 0x42, 0xd8, 0xdf, 0xdb, 0xc1, 0x70, 0x4e, 0xd1, 0x41, 0xd1, 0x20, 0xaa, 0x42, 0xb8, 0x9e, 0xea, 0xc1, 0xab, 0x0f, 0x0b, 0x42, 0xcf, 0x15, 0xaa, 0x42, 0x00, 0x5e, 0xeb, 0xc1, 0x41, 0x20, 0x0c, 0x42, 0x26, 0x22, 0xa6, 0x42, 0xf2, 0x1f, 0xfa, 0xc1, 0x54, 0x52, 0x42, 0x41, 0x65, 0x68, 0xa6, 0x42, 0x1a, 0xaf, 0xcc, 0xc1, +0xe8, 0x02, 0x06, 0x41, 0x63, 0x5d, 0xa6, 0x42, 0x66, 0xe6, 0xa8, 0xc1, 0xc3, 0x0d, 0x1f, 0x41, 0xad, 0xd8, 0xa9, 0x42, 0xed, 0x8d, 0xa0, 0xc1, 0x24, 0x97, 0x5b, 0x41, 0x32, 0xf5, 0xa9, 0x42, 0xd5, 0xf8, 0xc1, 0xc1, 0x9d, 0x91, 0x45, 0x42, 0x69, 0x6f, 0x20, 0x41, 0xc1, 0x97, 0xda, 0xc1, 0x9d, 0x2f, 0x1b, 0x42, 0x9e, 0xcd, 0x20, 0x41, 0x9c, 0x73, 0x06, 0xc2, 0xf4, 0xfd, 0x62, 0x41, 0x05, 0xfa, 0x1e, 0x41, 0x69, 0x40, 0x1e, 0xc2, 0xb3, 0x7b, 0x6c, 0x41, 0x24, 0x28, 0x36, 0x41, +0xd1, 0x11, 0x30, 0xc2, 0x13, 0xe1, 0xcb, 0x41, 0x1d, 0x03, 0x1f, 0x41, 0x2e, 0xff, 0x17, 0xc2, 0xa3, 0xf0, 0xdd, 0x41, 0x45, 0xd8, 0x36, 0x41, 0x15, 0x9d, 0x28, 0xc2, 0xb0, 0x8f, 0x50, 0xc0, 0x27, 0x31, 0x36, 0x41, 0xb6, 0xe2, 0x2f, 0xc2, 0x00, 0x1e, 0x6d, 0xbf, 0x4d, 0x67, 0x1f, 0x41, 0x7e, 0x4c, 0x1e, 0xc2, 0xc3, 0x24, 0x5c, 0x42, 0x17, 0x48, 0x20, 0x41, 0xb6, 0x04, 0x98, 0xc1, 0xf8, 0x31, 0x7a, 0x41, 0x0a, 0x46, 0x5f, 0x41, 0xd0, 0x73, 0x3f, 0xc2, 0xbf, 0x9f, 0xf0, 0x41, +0x36, 0xab, 0x61, 0x41, 0xcb, 0x10, 0x37, 0xc2, 0x76, 0x60, 0x87, 0x41, 0xc5, 0x8f, 0x8b, 0x41, 0xf5, 0x39, 0x4b, 0xc2, 0x63, 0x2e, 0x03, 0x42, 0x94, 0x65, 0x8e, 0x41, 0x56, 0x3d, 0x43, 0xc2, 0x36, 0x3c, 0xbf, 0xc0, 0xaa, 0x60, 0x63, 0x41, 0xe6, 0x5d, 0x3e, 0xc2, 0xc2, 0x06, 0x11, 0xc1, 0xf8, 0x42, 0x91, 0x41, 0x09, 0x4a, 0x4a, 0xc2, 0x76, 0xcf, 0x96, 0x41, 0x16, 0x19, 0x11, 0x42, 0x0c, 0x42, 0x72, 0xc2, 0xcd, 0x3b, 0x36, 0x41, 0x72, 0xf9, 0x0e, 0x42, 0x43, 0x1c, 0x71, 0xc2, +0x81, 0x95, 0x93, 0x41, 0x00, 0x40, 0x20, 0x42, 0x55, 0xf0, 0x74, 0xc2, 0xa8, 0xc6, 0x2d, 0x41, 0x44, 0x29, 0x1f, 0x42, 0x4b, 0x99, 0x73, 0xc2, 0x27, 0x31, 0x27, 0x41, 0x88, 0xa3, 0x2f, 0x42, 0xdc, 0x57, 0x74, 0xc2, 0x6b, 0x1a, 0x93, 0x41, 0xa0, 0x49, 0x31, 0x42, 0x13, 0x50, 0x75, 0xc2, 0x01, 0xbc, 0xd4, 0x41, 0x38, 0x96, 0x32, 0x42, 0x45, 0x07, 0x74, 0xc2, 0x34, 0x91, 0xcc, 0x41, 0x08, 0x9b, 0x20, 0x42, 0x19, 0xb3, 0x73, 0xc2, 0x6b, 0x1a, 0x93, 0x41, 0xa0, 0x49, 0x31, 0x42, +0x13, 0x50, 0x75, 0xc2, 0x81, 0x95, 0x93, 0x41, 0x00, 0x40, 0x20, 0x42, 0x55, 0xf0, 0x74, 0xc2, 0xcf, 0xf7, 0xc1, 0x41, 0xec, 0x40, 0x14, 0x42, 0x25, 0x35, 0x72, 0xc2, 0x76, 0xcf, 0x96, 0x41, 0x16, 0x19, 0x11, 0x42, 0x0c, 0x42, 0x72, 0xc2, 0x9b, 0xe6, 0x8f, 0x41, 0xe1, 0x0b, 0x43, 0x42, 0xf3, 0x3d, 0x74, 0xc2, 0xf6, 0xc0, 0x1f, 0x41, 0xb3, 0x2a, 0x40, 0x42, 0x07, 0x1f, 0x73, 0xc2, 0xa7, 0x4b, 0x17, 0x41, 0xf4, 0xfd, 0x4f, 0x42, 0x5d, 0x1c, 0x70, 0xc2, 0x42, 0x60, 0x89, 0x41, +0x37, 0x1a, 0x54, 0x42, 0x64, 0xaa, 0x70, 0xc2, 0x42, 0x60, 0x89, 0x41, 0x37, 0x1a, 0x54, 0x42, 0x64, 0xaa, 0x70, 0xc2, 0x67, 0xb3, 0xcb, 0x41, 0xba, 0xf8, 0x59, 0x42, 0xf4, 0x1b, 0x6e, 0xc2, 0x9b, 0xe6, 0x8f, 0x41, 0xe1, 0x0b, 0x43, 0x42, 0xf3, 0x3d, 0x74, 0xc2, 0x74, 0xa4, 0xd5, 0x41, 0xa4, 0xce, 0x46, 0x42, 0x0e, 0x7e, 0x72, 0xc2, 0xdf, 0xe0, 0x81, 0x41, 0x3e, 0x17, 0x63, 0x42, 0x37, 0x78, 0x6b, 0xc2, 0x30, 0x64, 0x10, 0x41, 0x13, 0x83, 0x5e, 0x42, 0x83, 0x80, 0x6b, 0xc2, +0x47, 0x1b, 0x10, 0x41, 0xac, 0xfa, 0x6b, 0x42, 0x8a, 0x1f, 0x65, 0xc2, 0xce, 0x88, 0x7f, 0x41, 0x42, 0xe0, 0x6f, 0x42, 0xcb, 0x50, 0x65, 0xc2, 0xce, 0x88, 0x7f, 0x41, 0x42, 0xe0, 0x6f, 0x42, 0xcb, 0x50, 0x65, 0xc2, 0x5b, 0xb1, 0xaa, 0x41, 0xd5, 0x38, 0x72, 0x42, 0xd7, 0xd2, 0x64, 0xc2, 0xdf, 0xe0, 0x81, 0x41, 0x3e, 0x17, 0x63, 0x42, 0x37, 0x78, 0x6b, 0xc2, 0x86, 0x38, 0xba, 0x41, 0x2e, 0xee, 0x68, 0x42, 0x05, 0xd6, 0x68, 0xc2, 0xaa, 0x60, 0x79, 0x41, 0xae, 0x16, 0x8c, 0x42, +0x62, 0x50, 0x38, 0xc2, 0x30, 0xaa, 0x03, 0x42, 0xef, 0x18, 0x8c, 0x42, 0xfd, 0x65, 0x36, 0xc2, 0x01, 0x8d, 0x30, 0x42, 0xf8, 0xf3, 0x84, 0x42, 0x9c, 0xc4, 0x3d, 0xc2, 0xf4, 0xfd, 0x4c, 0x42, 0x54, 0xa3, 0x76, 0x42, 0x1c, 0xfc, 0x42, 0xc2, 0x10, 0x29, 0x5e, 0x42, 0xc8, 0x18, 0x5e, 0x42, 0x04, 0x16, 0x47, 0xc2, 0x29, 0x4b, 0x64, 0x42, 0x84, 0x3c, 0x43, 0x42, 0xf6, 0x46, 0x4a, 0xc2, 0xa8, 0x06, 0x60, 0x42, 0x0c, 0xd3, 0x27, 0x42, 0x07, 0x1f, 0x4d, 0xc2, 0xe4, 0x43, 0x52, 0x42, +0xe4, 0x54, 0x0d, 0x42, 0x5e, 0x69, 0x4e, 0xc2, 0x84, 0x0d, 0x3a, 0x42, 0xce, 0xcc, 0xe9, 0x41, 0x1f, 0x05, 0x4e, 0xc2, 0x78, 0x0b, 0x8c, 0x41, 0x45, 0x36, 0xab, 0x41, 0xcb, 0x90, 0x54, 0xc2, 0xf8, 0x02, 0x0f, 0x42, 0x63, 0x10, 0xba, 0x41, 0x19, 0xb3, 0x4d, 0xc2, 0xcc, 0x5d, 0x59, 0xc1, 0x3e, 0x79, 0xbf, 0x41, 0xde, 0x71, 0x52, 0xc2, 0x57, 0xec, 0xc6, 0xc1, 0xfa, 0xdc, 0xf2, 0x41, 0x75, 0x82, 0x53, 0xc2, 0x35, 0x8d, 0x01, 0xc2, 0x59, 0x39, 0x14, 0x42, 0x35, 0x8d, 0x52, 0xc2, +0x48, 0x61, 0x16, 0xc2, 0x6c, 0xb8, 0x32, 0x42, 0x6a, 0x0d, 0x4f, 0xc2, 0x85, 0xda, 0x2d, 0xc2, 0xc1, 0xca, 0x71, 0x42, 0x25, 0xf5, 0x3d, 0xc2, 0x1e, 0x45, 0x11, 0xc2, 0x2e, 0x2e, 0x62, 0x42, 0x06, 0x70, 0x4a, 0xc2, 0x42, 0xe0, 0x3a, 0xc2, 0xe7, 0x6a, 0x5d, 0x42, 0xbd, 0x63, 0x40, 0xc2, 0xf9, 0x60, 0x18, 0xc2, 0xf8, 0x71, 0x4b, 0x42, 0x0f, 0xad, 0x4d, 0xc2, 0xf6, 0xc6, 0x1c, 0xc2, 0x5d, 0x9c, 0x81, 0x42, 0xee, 0xda, 0x36, 0xc2, 0x57, 0x1b, 0x01, 0xc2, 0xc5, 0x0f, 0x78, 0x42, +0x05, 0xd2, 0x44, 0xc2, 0xca, 0x83, 0x04, 0xc2, 0x39, 0xc5, 0x8a, 0x42, 0x9c, 0xe2, 0x25, 0xc2, 0x06, 0x81, 0x50, 0xc1, 0xc7, 0xe9, 0x5c, 0x42, 0x93, 0x47, 0x66, 0xc2, 0x8a, 0x3c, 0xb8, 0xc0, 0x5a, 0xd3, 0x5a, 0x42, 0xd6, 0x05, 0x69, 0xc2, 0xaa, 0x0e, 0xb5, 0xc0, 0x6d, 0x34, 0x66, 0x42, 0xed, 0x4d, 0x64, 0xc2, 0xbb, 0x27, 0x33, 0xc1, 0x0a, 0x17, 0x65, 0x42, 0x19, 0xe2, 0x63, 0xc2, 0x7a, 0xdf, 0xb0, 0x3f, 0x6e, 0xf4, 0x89, 0x42, 0xdd, 0xd3, 0x37, 0xc2, 0x58, 0x28, 0x01, 0xc2, +0x40, 0x93, 0x2c, 0x42, 0x78, 0x8b, 0x54, 0xc2, 0xcd, 0xaa, 0xde, 0xc1, 0xd8, 0x70, 0x13, 0x42, 0xb1, 0x72, 0x57, 0xc2, 0x7e, 0x8c, 0xad, 0xc1, 0xc7, 0xfa, 0x15, 0x42, 0x05, 0x23, 0x61, 0xc2, 0x7b, 0xf2, 0xc6, 0xc1, 0x71, 0x2c, 0x14, 0x42, 0x86, 0x67, 0x5b, 0xc2, 0x20, 0xc1, 0xd1, 0xc1, 0x97, 0xbf, 0x2a, 0x42, 0x03, 0x67, 0x5e, 0xc2, 0x92, 0xcb, 0xec, 0xc1, 0xb1, 0xee, 0x2a, 0x42, 0x9c, 0x33, 0x58, 0xc2, 0x66, 0x66, 0x71, 0xc1, 0x69, 0x5e, 0x05, 0x42, 0xd3, 0x2b, 0x63, 0xc2, +0xbd, 0xc1, 0x8d, 0xc1, 0xee, 0x6b, 0x00, 0x42, 0x4b, 0x99, 0x5d, 0xc2, 0x33, 0x22, 0xa3, 0xc1, 0xd8, 0xdf, 0xf9, 0x41, 0xe5, 0x21, 0x59, 0xc2, 0xb7, 0x51, 0x03, 0xc2, 0xab, 0x7e, 0x5d, 0x42, 0x7e, 0xbb, 0x4d, 0xc2, 0xad, 0xfa, 0x06, 0xc2, 0x8f, 0x31, 0x45, 0x42, 0xe3, 0x94, 0x51, 0xc2, 0x40, 0x24, 0xe4, 0xc1, 0x94, 0x36, 0x42, 0x42, 0x8b, 0x1b, 0x5b, 0xc2, 0x34, 0x33, 0xfc, 0xc1, 0x40, 0x53, 0x43, 0x42, 0x2e, 0xb2, 0x54, 0xc2, 0x36, 0xbc, 0xe4, 0xc1, 0xbd, 0xd2, 0x59, 0x42, +0xc6, 0x8b, 0x57, 0xc2, 0x91, 0x5c, 0xf8, 0xc1, 0xa4, 0xce, 0x5b, 0x42, 0x76, 0xa0, 0x50, 0xc2, 0xf6, 0x06, 0xec, 0x41, 0xcc, 0x5d, 0xd0, 0x41, 0xe3, 0x54, 0x58, 0xc2, 0x92, 0x3a, 0x7e, 0x41, 0xc9, 0x54, 0xbf, 0x41, 0x8c, 0xec, 0x5a, 0xc2, 0xee, 0xc9, 0x55, 0x41, 0x73, 0x46, 0xde, 0x41, 0x9e, 0xde, 0x66, 0xc2, 0xcb, 0xff, 0xbd, 0x41, 0x80, 0xa6, 0xeb, 0x41, 0x55, 0xb0, 0x66, 0xc2, 0xd0, 0xb3, 0x67, 0x41, 0x58, 0x28, 0xcd, 0x41, 0x09, 0xe8, 0x5f, 0xc2, 0x09, 0x68, 0xd3, 0x41, +0x8a, 0x0e, 0xdc, 0x41, 0xa1, 0xa7, 0x5e, 0xc2, 0xcb, 0xff, 0xbd, 0x41, 0x80, 0xa6, 0xeb, 0x41, 0x55, 0xb0, 0x66, 0xc2, 0x62, 0x7f, 0xfe, 0x41, 0x1c, 0x7c, 0x04, 0x42, 0xfb, 0xba, 0x66, 0xc2, 0x09, 0x68, 0xd3, 0x41, 0x8a, 0x0e, 0xdc, 0x41, 0xa1, 0xa7, 0x5e, 0xc2, 0x54, 0xa3, 0x0e, 0x42, 0x12, 0x03, 0xfd, 0x41, 0xd5, 0x96, 0x5e, 0xc2, 0xcf, 0xb7, 0x1e, 0x42, 0x91, 0x7e, 0xf4, 0x41, 0xbc, 0x85, 0x57, 0xc2, 0x07, 0xce, 0x20, 0xc1, 0x1a, 0xaf, 0xd4, 0x41, 0xb4, 0x08, 0x5a, 0xc2, +0x89, 0xb0, 0xd9, 0xc0, 0xbd, 0xd2, 0xf0, 0x41, 0x2a, 0xd8, 0x64, 0xc2, 0x80, 0x60, 0x05, 0xc1, 0x39, 0x45, 0xe1, 0x41, 0x04, 0x05, 0x5f, 0xc2, 0x13, 0x03, 0x39, 0x42, 0x0a, 0xd7, 0x10, 0x42, 0x10, 0x29, 0x57, 0xc2, 0x62, 0x21, 0x14, 0x42, 0x33, 0x73, 0x18, 0x42, 0x0b, 0xe4, 0x66, 0xc2, 0x5f, 0xc7, 0x26, 0x42, 0x7b, 0x32, 0x14, 0x42, 0xab, 0xad, 0x5e, 0xc2, 0xd5, 0x38, 0x1f, 0x42, 0xda, 0xce, 0x2f, 0x42, 0xf4, 0x2c, 0x66, 0xc2, 0x7c, 0x50, 0x34, 0x42, 0xe4, 0xf2, 0x2c, 0x42, +0x1a, 0xef, 0x5d, 0xc2, 0x1b, 0x0d, 0x48, 0x42, 0xe3, 0x36, 0x2a, 0x42, 0xf4, 0x2c, 0x56, 0xc2, 0x57, 0x8e, 0x4c, 0x42, 0xd0, 0x04, 0x45, 0x42, 0xbb, 0xd6, 0x53, 0xc2, 0x6e, 0x74, 0x22, 0x42, 0xbc, 0xa3, 0x48, 0x42, 0x49, 0x1d, 0x64, 0xc2, 0x77, 0x6d, 0x38, 0x42, 0x27, 0x0f, 0x47, 0x42, 0x6d, 0xd6, 0x5b, 0xc2, 0x10, 0xa9, 0x1b, 0x42, 0xc8, 0x98, 0x60, 0x42, 0xe8, 0x59, 0x60, 0xc2, 0xa3, 0x12, 0x31, 0x42, 0xbc, 0x85, 0x60, 0x42, 0x86, 0x49, 0x58, 0xc2, 0xb5, 0x48, 0x45, 0x42, +0x1e, 0x56, 0x5f, 0x42, 0xd5, 0x56, 0x50, 0xc2, 0x89, 0x92, 0x14, 0x42, 0xbb, 0x96, 0x83, 0x42, 0x8f, 0x53, 0x47, 0xc2, 0x23, 0xdb, 0xd5, 0x41, 0x5d, 0x0d, 0x88, 0x42, 0x88, 0x23, 0x43, 0xc2, 0x75, 0x82, 0xa3, 0x41, 0x96, 0x92, 0x83, 0x42, 0xcb, 0x90, 0x54, 0xc2, 0x0f, 0x0b, 0xba, 0x41, 0xb5, 0x08, 0x86, 0x42, 0xba, 0x89, 0x4b, 0xc2, 0xdf, 0x3e, 0xe4, 0x41, 0xcd, 0xac, 0x80, 0x42, 0x0e, 0x7e, 0x57, 0xc2, 0xb7, 0x73, 0x02, 0x42, 0x1a, 0xb1, 0x82, 0x42, 0x3c, 0x3d, 0x4f, 0xc2, +0xb8, 0x1e, 0x2e, 0x41, 0xe4, 0x83, 0x82, 0x42, 0x0c, 0x71, 0x53, 0xc2, 0x86, 0x38, 0x44, 0x41, 0x32, 0x55, 0x85, 0x42, 0xac, 0x4b, 0x49, 0xc2, 0x75, 0x82, 0xa3, 0x41, 0x96, 0x92, 0x83, 0x42, 0xcb, 0x90, 0x54, 0xc2, 0x0f, 0x0b, 0xba, 0x41, 0xb5, 0x08, 0x86, 0x42, 0xba, 0x89, 0x4b, 0xc2, 0x74, 0x24, 0x5a, 0x41, 0xc0, 0xbb, 0x87, 0x42, 0x64, 0x8c, 0x42, 0xc2, 0x14, 0x7f, 0x32, 0x42, 0x15, 0x7b, 0x76, 0x42, 0x01, 0x0d, 0x4c, 0xc2, 0x98, 0x6e, 0x0b, 0x42, 0x9f, 0xbc, 0x74, 0x42, +0x14, 0xae, 0x5b, 0xc2, 0xde, 0xa4, 0x1e, 0x42, 0x14, 0x3f, 0x76, 0x42, 0x94, 0xc7, 0x53, 0xc2, 0x50, 0xeb, 0xe9, 0xc1, 0x5d, 0x2d, 0x73, 0x42, 0xd6, 0x05, 0x49, 0xc2, 0x9a, 0x99, 0x96, 0xc1, 0xae, 0xf6, 0x77, 0x42, 0xe5, 0x90, 0x53, 0xc2, 0xdc, 0xb5, 0xcb, 0xc1, 0xbc, 0xb4, 0x6c, 0x42, 0x96, 0xc3, 0x54, 0xc2, 0xb1, 0xd0, 0xa3, 0xc1, 0x2f, 0xcc, 0x7c, 0x42, 0xe9, 0x37, 0x49, 0xc2, 0x26, 0x06, 0xdd, 0xc1, 0xbc, 0x85, 0x70, 0x42, 0x9f, 0x7c, 0x4c, 0xc2, 0xbd, 0xef, 0x12, 0xc1, +0x5d, 0x6d, 0x7c, 0x42, 0x3d, 0x4a, 0x53, 0xc2, 0x34, 0x80, 0x22, 0xc1, 0xce, 0xe8, 0x80, 0x42, 0x77, 0x2d, 0x48, 0xc2, 0xda, 0x55, 0x8c, 0x3f, 0xd2, 0xa2, 0x7f, 0x42, 0xe1, 0x7a, 0x53, 0xc2, 0xe8, 0x4d, 0xbd, 0x3f, 0x97, 0x0e, 0x82, 0x42, 0x59, 0x17, 0x49, 0xc2, 0xfe, 0xc3, 0xa2, 0xc1, 0x8d, 0x46, 0x2c, 0x42, 0x0f, 0x3a, 0x65, 0xc2, 0xc8, 0x07, 0x87, 0xc1, 0xe3, 0x36, 0x1a, 0x42, 0xf3, 0x1f, 0x67, 0xc2, 0x92, 0xcb, 0x41, 0xc1, 0xfd, 0x25, 0x0c, 0x42, 0xf4, 0xac, 0x68, 0xc2, +0x4d, 0xf3, 0xb1, 0xc1, 0x9d, 0x80, 0x54, 0x42, 0xc9, 0x14, 0x60, 0xc2, 0x23, 0x39, 0xb2, 0xc1, 0x38, 0xa7, 0x40, 0x42, 0x9c, 0xc4, 0x62, 0xc2, 0xf2, 0xb0, 0xa7, 0x41, 0x21, 0x0e, 0x03, 0x42, 0x0a, 0x97, 0x6d, 0xc2, 0x7a, 0xa5, 0x44, 0x41, 0x48, 0xbf, 0xfd, 0x41, 0x09, 0xca, 0x6c, 0xc2, 0xf2, 0xb0, 0xa7, 0x41, 0x21, 0x0e, 0x03, 0x42, 0x0a, 0x97, 0x6d, 0xc2, 0x96, 0x10, 0xde, 0x41, 0x01, 0xcd, 0x0c, 0x42, 0x01, 0xfc, 0x6d, 0xc2, 0x9b, 0xfe, 0xa4, 0xc0, 0x5f, 0x98, 0x03, 0x42, +0x3f, 0x46, 0x6a, 0xc2, 0x48, 0x50, 0xfe, 0x41, 0x65, 0x2a, 0x1d, 0x42, 0x6d, 0x85, 0x6e, 0xc2, 0xa1, 0x96, 0x07, 0x42, 0xd3, 0xfc, 0x31, 0x42, 0xf4, 0x1b, 0x6e, 0xc2, 0x36, 0xfc, 0x08, 0x42, 0x35, 0xaf, 0x48, 0x42, 0x86, 0xf8, 0x6b, 0xc2, 0x91, 0xfe, 0x02, 0x42, 0x7a, 0x65, 0x5e, 0x42, 0xd3, 0xfc, 0x67, 0xc2, 0xb8, 0x8d, 0xc4, 0x41, 0xd4, 0x1a, 0x7a, 0x42, 0x64, 0x4c, 0x5f, 0xc2, 0xed, 0x1e, 0x8e, 0x41, 0x35, 0x8d, 0x7c, 0x42, 0x9e, 0x9e, 0x5d, 0xc2, 0xed, 0x1e, 0x8e, 0x41, +0x35, 0x8d, 0x7c, 0x42, 0x9e, 0x9e, 0x5d, 0xc2, 0x4e, 0x0b, 0x1b, 0x41, 0xfe, 0x43, 0x79, 0x42, 0x1d, 0x09, 0x5d, 0xc2, 0xcd, 0x2a, 0xeb, 0x41, 0xc2, 0xb5, 0x6f, 0x42, 0x77, 0x2d, 0x63, 0xc2, 0x41, 0xf1, 0x9f, 0xc1, 0x54, 0x52, 0x64, 0x42, 0x08, 0xec, 0x5d, 0xc2, 0x54, 0xc1, 0x6e, 0xc1, 0x75, 0x82, 0x6d, 0x42, 0x1f, 0xe3, 0x5c, 0xc2, 0xd7, 0xa3, 0xe7, 0xc0, 0x6f, 0x70, 0x71, 0x42, 0xe6, 0xd0, 0x5c, 0xc2, 0x84, 0x81, 0x9f, 0x3f, 0x1b, 0xde, 0x74, 0x42, 0x6b, 0xeb, 0x5c, 0xc2, +0x98, 0xc0, 0xc5, 0x3f, 0x50, 0x7c, 0x68, 0x42, 0xb2, 0xcc, 0x64, 0xc2, 0x99, 0x47, 0xd2, 0x3f, 0xb9, 0xab, 0x5b, 0x42, 0x07, 0x9f, 0x6a, 0xc2, 0xe2, 0x58, 0xe7, 0x3f, 0xa5, 0xbd, 0x4d, 0x42, 0x66, 0x95, 0x6e, 0xc2, 0x07, 0xb1, 0x09, 0x40, 0x01, 0x80, 0x3e, 0x42, 0x83, 0x1e, 0x71, 0xc2, 0x57, 0xad, 0x28, 0x40, 0x65, 0x88, 0x2e, 0x42, 0x04, 0x16, 0x72, 0xc2, 0x33, 0x16, 0x49, 0x40, 0xb4, 0x77, 0x1e, 0x42, 0xa0, 0xb8, 0x71, 0xc2, 0x6d, 0x1c, 0x5d, 0x40, 0x9c, 0xb3, 0x0e, 0x42, +0x69, 0x9e, 0x6f, 0xc2, 0xd1, 0x91, 0x54, 0x40, 0x14, 0x9d, 0xfe, 0x41, 0xe5, 0xa1, 0x6b, 0xc2, 0x9f, 0x59, 0x34, 0x40, 0xea, 0x73, 0xcf, 0x41, 0xe2, 0x07, 0x60, 0xc2, 0xc8, 0x41, 0x41, 0x40, 0xe6, 0x9d, 0xe2, 0x41, 0x15, 0x1d, 0x66, 0xc2, 0xb1, 0x50, 0x23, 0x40, 0xdc, 0xd7, 0xac, 0x41, 0xd7, 0x92, 0x55, 0xc2, 0xf0, 0xa7, 0x2e, 0x40, 0xbf, 0x6c, 0xc1, 0x41, 0xcb, 0x50, 0x5b, 0xc2, 0xfa, 0xed, 0x67, 0x40, 0x43, 0xad, 0x8c, 0x41, 0x89, 0x01, 0x4d, 0xc2, 0x45, 0xf0, 0x88, 0x40, +0x17, 0x48, 0x60, 0x41, 0x6d, 0x67, 0x41, 0xc2, 0xb8, 0x1e, 0x92, 0x40, 0x5f, 0x98, 0x36, 0x41, 0x7f, 0x2a, 0x32, 0xc2, 0x06, 0x2a, 0x93, 0x40, 0x03, 0xa1, 0x1f, 0x41, 0xfa, 0x5c, 0x20, 0xc2, 0x17, 0x26, 0x1b, 0xc2, 0x9d, 0x80, 0x3c, 0x41, 0x08, 0x3d, 0x26, 0xc1, 0x3e, 0x57, 0xfe, 0xc1, 0x64, 0xaa, 0x22, 0x41, 0xa8, 0xa4, 0x1f, 0xc1, 0x7a, 0x25, 0x35, 0xc2, 0xf6, 0x06, 0x68, 0x41, 0x54, 0x52, 0x2d, 0xc1, 0x87, 0x85, 0x4d, 0xc2, 0x30, 0xaa, 0x91, 0x41, 0xf0, 0x16, 0x32, 0xc1, +0x6b, 0xab, 0x5d, 0xc2, 0x9b, 0x46, 0xb6, 0x42, 0x28, 0x7e, 0x72, 0xc1, 0xba, 0x89, 0x45, 0xc2, 0x52, 0xf6, 0xb9, 0x42, 0x58, 0x17, 0x75, 0xc1, 0x95, 0x14, 0x83, 0xc2, 0x95, 0x94, 0x95, 0x42, 0x28, 0x7e, 0x32, 0xc1, 0xd9, 0x7d, 0x73, 0xc2, 0x8e, 0x35, 0xab, 0x42, 0xaf, 0x94, 0x63, 0xc1, 0xbe, 0xf0, 0x61, 0xc2, 0x75, 0x02, 0xb7, 0x41, 0xa0, 0x89, 0x33, 0xc1, 0x0c, 0x91, 0x86, 0xc2, 0x83, 0xef, 0x29, 0x42, 0x27, 0xa0, 0x2e, 0xc1, 0x0c, 0x91, 0x86, 0xc2, 0x83, 0xef, 0x29, 0x42, +0x27, 0xa0, 0x2e, 0xc1, 0xc3, 0x04, 0x8a, 0xc2, 0xdc, 0x86, 0x4e, 0x42, 0xb7, 0xf3, 0x29, 0xc1, 0xa9, 0xc2, 0x89, 0xc2, 0x84, 0xbc, 0x6a, 0x42, 0x97, 0xff, 0x26, 0xc1, 0x35, 0x4f, 0x87, 0xc2, 0x0e, 0x5e, 0x84, 0x42, 0x07, 0xce, 0x27, 0xc1, 0x8a, 0xab, 0xa5, 0x40, 0x6e, 0x03, 0xa6, 0x42, 0x7b, 0xf2, 0x27, 0xc1, 0x42, 0xec, 0xc9, 0x40, 0x35, 0x3e, 0xa9, 0x42, 0x62, 0x73, 0x19, 0xc1, 0x27, 0x31, 0xc1, 0x40, 0xfd, 0x25, 0xa6, 0x42, 0x63, 0x10, 0x81, 0xc1, 0xfa, 0xd0, 0xee, 0x40, +0xa3, 0xa1, 0xa9, 0x42, 0x3c, 0x2c, 0x72, 0xc1, 0xb9, 0xfc, 0xb0, 0x40, 0xea, 0x55, 0xad, 0x42, 0x2f, 0xe9, 0x13, 0xc1, 0x34, 0x29, 0x19, 0x40, 0xb2, 0xbd, 0xb4, 0x42, 0xa8, 0xb5, 0x1d, 0xc1, 0xb3, 0xb5, 0x1e, 0x41, 0x3a, 0xe1, 0xad, 0x42, 0x68, 0xa2, 0x9f, 0xc1, 0xf8, 0xda, 0xe3, 0x40, 0xda, 0xca, 0xad, 0x42, 0x07, 0x3d, 0x70, 0xc1, 0x49, 0x29, 0xa8, 0x40, 0x0b, 0xa4, 0xb3, 0x42, 0xb3, 0x9d, 0x81, 0xc1, 0xd3, 0xcd, 0x0a, 0x41, 0x33, 0x22, 0xb3, 0x42, 0x4d, 0xf3, 0xa7, 0xc1, +0x70, 0x5f, 0x99, 0x41, 0x3e, 0xf7, 0xad, 0x42, 0x78, 0x7a, 0xd9, 0xc1, 0xec, 0x2f, 0x5e, 0x41, 0x83, 0xe0, 0xad, 0x42, 0x0f, 0x7a, 0xc0, 0xc1, 0x07, 0x5f, 0x4f, 0x41, 0x94, 0xd8, 0xb2, 0x42, 0x2c, 0x43, 0xc7, 0xc1, 0x01, 0xcd, 0x92, 0x41, 0x8e, 0xd5, 0xb2, 0x42, 0xdc, 0xc6, 0xdf, 0xc1, 0xe2, 0xd8, 0xcf, 0x41, 0x5b, 0x31, 0xae, 0x42, 0x09, 0xac, 0xe7, 0xc1, 0xb6, 0x62, 0xc8, 0x41, 0x13, 0x21, 0xb3, 0x42, 0xcb, 0xa1, 0xef, 0xc1, 0x47, 0x32, 0x03, 0x42, 0x21, 0x6e, 0xb3, 0x42, +0xeb, 0x62, 0xf3, 0xc1, 0x18, 0x26, 0x08, 0x42, 0x98, 0x3b, 0xae, 0x42, 0xc7, 0x3a, 0xe8, 0xc1, 0x05, 0x74, 0x25, 0x42, 0xf6, 0x57, 0xb4, 0x42, 0xa8, 0xa4, 0xe5, 0xc1, 0x12, 0x54, 0x2b, 0x42, 0x92, 0x7a, 0xae, 0x42, 0x02, 0xab, 0xd4, 0xc1, 0xc5, 0xcf, 0x4b, 0x42, 0xec, 0xa0, 0xae, 0x42, 0x95, 0xd4, 0xa4, 0xc1, 0xbf, 0x7d, 0x4b, 0x42, 0x73, 0x57, 0xb5, 0x42, 0xcd, 0x2a, 0xbd, 0xc1, 0x04, 0xc5, 0x34, 0xc1, 0x4f, 0x62, 0xf5, 0x42, 0x22, 0x26, 0x1b, 0x41, 0xa4, 0xdf, 0x27, 0xc1, +0xb5, 0x88, 0xff, 0x42, 0x74, 0x24, 0x27, 0x41, 0x36, 0xab, 0x39, 0xc1, 0xe0, 0x8f, 0xf5, 0x42, 0xd1, 0xf4, 0x0a, 0x41, 0x05, 0xa3, 0x31, 0xc1, 0x55, 0xe3, 0xff, 0x42, 0x61, 0xa6, 0x06, 0x41, 0xcb, 0xa1, 0x2f, 0xc1, 0x65, 0xbb, 0xf4, 0x42, 0x53, 0x05, 0x2b, 0x41, 0x5f, 0xc1, 0x1d, 0xc1, 0x78, 0x3e, 0xfe, 0x42, 0x9c, 0xc4, 0x46, 0x41, 0x4c, 0xa6, 0x2a, 0xc1, 0xd7, 0xa3, 0xf3, 0x42, 0x42, 0x60, 0x39, 0x41, 0xde, 0xf1, 0x13, 0xc1, 0xf2, 0x12, 0xfc, 0x42, 0xe5, 0x61, 0x63, 0x41, +0x25, 0x06, 0x26, 0xc1, 0xf0, 0x27, 0xf2, 0x42, 0x12, 0x83, 0x45, 0x41, 0xa3, 0xe4, 0x0a, 0xc1, 0x3c, 0x1f, 0xf9, 0x42, 0x3f, 0xa4, 0x7b, 0x41, 0xad, 0xfa, 0x21, 0xc1, 0x9a, 0x59, 0xf0, 0x42, 0x19, 0xe2, 0x4e, 0x41, 0x01, 0xfb, 0x02, 0xc1, 0x2c, 0x87, 0xf5, 0x42, 0x24, 0x28, 0x87, 0x41, 0x3c, 0xb1, 0x1e, 0xc1, 0xe0, 0x4f, 0xee, 0x42, 0xf6, 0x06, 0x55, 0x41, 0xbb, 0x44, 0xf9, 0xc0, 0x4d, 0x77, 0xf1, 0x42, 0xd9, 0x4e, 0x8d, 0x41, 0x03, 0x5b, 0x1c, 0xc1, 0x4f, 0x22, 0xec, 0x42, +0x4f, 0xaf, 0x57, 0x41, 0x25, 0xc7, 0xef, 0xc0, 0x42, 0x20, 0xed, 0x42, 0x73, 0xc6, 0x8f, 0x41, 0xbc, 0x00, 0x1b, 0xc1, 0x85, 0xeb, 0xe9, 0x42, 0x67, 0xb3, 0x56, 0x41, 0x67, 0xb3, 0xea, 0xc0, 0xdc, 0xb9, 0xe8, 0x42, 0xc4, 0xc2, 0x8e, 0x41, 0xdc, 0xba, 0x1a, 0xc1, 0x26, 0xc6, 0xe7, 0x42, 0x46, 0x25, 0x52, 0x41, 0xe7, 0xde, 0xe9, 0xc0, 0x4c, 0x77, 0xe4, 0x42, 0x21, 0x30, 0x8a, 0x41, 0x83, 0x92, 0x1b, 0xc1, 0x4a, 0xcc, 0xe5, 0x42, 0x3c, 0x2c, 0x4a, 0x41, 0xbb, 0x61, 0xed, 0xc0, +0xc7, 0x8b, 0xe0, 0x42, 0xb8, 0x2f, 0x82, 0x41, 0x45, 0xbb, 0x1d, 0xc1, 0xc1, 0x0a, 0xe4, 0x42, 0x4e, 0x40, 0x3e, 0x41, 0xbe, 0x65, 0xf6, 0xc0, 0x69, 0x11, 0xdd, 0x42, 0x75, 0x93, 0x6c, 0x41, 0x51, 0x49, 0x22, 0xc1, 0x0d, 0x82, 0xe2, 0x42, 0xa7, 0x57, 0x2b, 0x41, 0xa4, 0x70, 0x04, 0xc1, 0xe6, 0x10, 0xda, 0x42, 0x2e, 0x90, 0x47, 0x41, 0x2e, 0x90, 0x2b, 0xc1, 0xf9, 0xd3, 0xe1, 0x42, 0x7e, 0x80, 0x0b, 0x41, 0x62, 0xb9, 0x15, 0xc1, 0xf5, 0x28, 0xd8, 0x42, 0xab, 0xad, 0x08, 0x41, +0x0d, 0x02, 0x27, 0xc1, 0x13, 0x03, 0xe2, 0x42, 0x12, 0xce, 0x1a, 0x41, 0x1c, 0x99, 0x0d, 0xc1, 0x3e, 0xca, 0xd8, 0x42, 0xf2, 0xb0, 0x26, 0x41, 0x04, 0xca, 0x10, 0xc1, 0xac, 0xbc, 0x04, 0x43, 0x2e, 0xb2, 0x2f, 0x41, 0x25, 0x4c, 0x1f, 0xc1, 0x7d, 0xff, 0x04, 0x43, 0xc8, 0xcd, 0xfe, 0x40, 0x60, 0xc8, 0x01, 0xc1, 0xf0, 0xc7, 0x03, 0x43, 0x96, 0x90, 0x5e, 0x41, 0x5e, 0x80, 0xe6, 0xc0, 0x4a, 0x2c, 0x02, 0x43, 0x4a, 0x7b, 0x84, 0x41, 0x17, 0xb7, 0xcb, 0xc0, 0xdc, 0xf9, 0xff, 0x42, +0xc2, 0x75, 0x96, 0x41, 0xd8, 0x7c, 0xb4, 0xc0, 0xf0, 0xa7, 0xfa, 0x42, 0xd8, 0x5f, 0xa4, 0x41, 0xdb, 0xdc, 0xa1, 0xc0, 0xd2, 0xa2, 0xf4, 0x42, 0x9d, 0x91, 0xad, 0x41, 0x23, 0xbe, 0x94, 0xc0, 0xb1, 0x32, 0xee, 0x42, 0xb8, 0x9e, 0xb1, 0x41, 0xbe, 0x87, 0x8d, 0xc0, 0xe4, 0xa5, 0xe7, 0x42, 0xbe, 0x30, 0xb0, 0x41, 0x38, 0xb9, 0x8c, 0xc0, 0xcc, 0x4c, 0xe1, 0x42, 0xdb, 0x79, 0xa9, 0x41, 0x9b, 0x03, 0x92, 0xc0, 0xf4, 0x7d, 0xdb, 0x42, 0x00, 0x80, 0x9d, 0x41, 0x38, 0x10, 0x9f, 0xc0, +0x09, 0x6c, 0xd6, 0x42, 0xe0, 0x1c, 0x8b, 0x41, 0xc0, 0x95, 0xba, 0xc0, 0xe1, 0xfa, 0xd1, 0x42, 0x57, 0x5b, 0x60, 0x41, 0x56, 0x0e, 0xd7, 0xc0, 0xb5, 0xc8, 0xcf, 0x42, 0xbe, 0x9f, 0x2f, 0x41, 0x81, 0x73, 0xe0, 0xc0, 0x79, 0x89, 0x09, 0x43, 0xd6, 0xc5, 0x34, 0x41, 0xfc, 0x46, 0x03, 0xc1, 0x07, 0xe1, 0x09, 0x43, 0x79, 0xc7, 0xea, 0x40, 0x39, 0x23, 0xb9, 0xc0, 0xb5, 0x48, 0x08, 0x43, 0xca, 0x32, 0x72, 0x41, 0xe9, 0x0e, 0x93, 0xc0, 0x0f, 0x2d, 0x06, 0x43, 0x54, 0xe3, 0x94, 0x41, +0x7e, 0xe3, 0x5f, 0xc0, 0x21, 0x50, 0x03, 0x43, 0x7b, 0x72, 0xac, 0x41, 0xec, 0xf5, 0x22, 0xc0, 0x6d, 0xa7, 0xff, 0x42, 0x49, 0xae, 0xbe, 0x41, 0x67, 0x5c, 0xe4, 0xbf, 0x19, 0xc4, 0xf7, 0x42, 0xcd, 0xbb, 0xca, 0x41, 0x9f, 0x8e, 0x9f, 0xbf, 0xf9, 0x53, 0xef, 0x42, 0x4a, 0x0c, 0xd0, 0x41, 0xfb, 0x77, 0x75, 0xbf, 0xe8, 0xbb, 0xe6, 0x42, 0xfa, 0x5c, 0xce, 0x41, 0x05, 0xa3, 0x6e, 0xbf, 0x6d, 0x67, 0xde, 0x42, 0x49, 0x9d, 0xc5, 0x41, 0x01, 0x13, 0x94, 0xbf, 0x6f, 0xd2, 0xd6, 0x42, +0xe3, 0x94, 0xb5, 0x41, 0xde, 0x1a, 0xdc, 0xbf, 0x21, 0x30, 0xd0, 0x42, 0x7b, 0x72, 0x9d, 0x41, 0xd1, 0xcb, 0x36, 0xc0, 0x38, 0x49, 0xca, 0x42, 0xe6, 0x1d, 0x75, 0x41, 0xe0, 0x62, 0x80, 0xc0, 0xe3, 0x54, 0xc7, 0x42, 0x0b, 0x24, 0x35, 0x41, 0x26, 0xfc, 0xbb, 0xc0, 0x19, 0x84, 0x0e, 0x43, 0xf8, 0x88, 0xd1, 0x40, 0x24, 0x5d, 0x8d, 0xc0, 0x17, 0x19, 0x0e, 0x43, 0x8f, 0x53, 0x36, 0x41, 0x83, 0xa3, 0x3a, 0xc0, 0xe6, 0x90, 0x0c, 0x43, 0x05, 0xb4, 0x80, 0x41, 0x26, 0xfc, 0xba, 0xbf, +0x30, 0xfd, 0x09, 0x43, 0x3c, 0xac, 0xa2, 0x41, 0x11, 0xe0, 0xf4, 0xbd, 0x30, 0x7d, 0x06, 0x43, 0x37, 0x78, 0xbf, 0x41, 0xf2, 0x98, 0x85, 0x3f, 0xa0, 0x3a, 0x02, 0x43, 0x8f, 0xc2, 0xd5, 0x41, 0x10, 0xe4, 0xfc, 0x3f, 0x63, 0xd0, 0xfa, 0x42, 0x5c, 0x7e, 0xe4, 0x41, 0xae, 0x7c, 0x28, 0x40, 0x7e, 0x7f, 0xf0, 0x42, 0x7e, 0xfb, 0xea, 0x41, 0xad, 0xfa, 0x3e, 0x40, 0xfb, 0xfe, 0xe5, 0x42, 0x2e, 0xee, 0xe8, 0x41, 0x80, 0xd4, 0x40, 0x40, 0x44, 0xcb, 0xdb, 0x42, 0x85, 0x6b, 0xde, 0x41, +0xa7, 0x3a, 0x2e, 0x40, 0xfb, 0x7e, 0xd2, 0x42, 0x4a, 0x0c, 0xcb, 0x41, 0x92, 0x3f, 0x00, 0x40, 0x48, 0xa1, 0xca, 0x42, 0xf4, 0xec, 0xab, 0x41, 0xfd, 0xd8, 0x30, 0x3f, 0x59, 0xd5, 0xc3, 0x42, 0xcb, 0x90, 0x82, 0x41, 0xff, 0x5e, 0x4e, 0xbf, 0x0f, 0xab, 0xbf, 0x42, 0x2c, 0xd4, 0x35, 0x41, 0x14, 0xe8, 0x3f, 0xc0, 0x0a, 0xd7, 0x12, 0x43, 0x5d, 0x6d, 0xb3, 0x40, 0x75, 0x02, 0xa6, 0xbf, 0x5f, 0x5a, 0x12, 0x43, 0x76, 0x4f, 0x34, 0x41, 0xff, 0x5b, 0xe9, 0x3e, 0x63, 0x90, 0x10, 0x43, +0x7e, 0xfb, 0x85, 0x41, 0x86, 0xe1, 0x09, 0x40, 0x56, 0x8e, 0x0d, 0x43, 0xc4, 0xa0, 0xad, 0x41, 0x3b, 0x19, 0x6e, 0x40, 0x52, 0x78, 0x09, 0x43, 0x48, 0x3f, 0xcf, 0x41, 0xba, 0x83, 0xa2, 0x40, 0x3c, 0x7f, 0x04, 0x43, 0x9b, 0x44, 0xe9, 0x41, 0x00, 0x52, 0xc5, 0x40, 0xee, 0xbc, 0xfd, 0x42, 0x94, 0x76, 0xfa, 0x41, 0x61, 0xe0, 0xdd, 0x40, 0x2e, 0xb2, 0xf1, 0x42, 0xa2, 0x05, 0x01, 0x42, 0x09, 0xf9, 0xea, 0x40, 0x9e, 0x6f, 0xe5, 0x42, 0x3f, 0xa4, 0xff, 0x41, 0x77, 0x10, 0xec, 0x40, +0x2c, 0x87, 0xd9, 0x42, 0x0d, 0x60, 0xf3, 0x41, 0x78, 0xd1, 0xe0, 0x40, 0x86, 0xab, 0xce, 0x42, 0xd9, 0xbd, 0xdc, 0x41, 0x47, 0x1b, 0xc5, 0x40, 0x13, 0xa1, 0xc5, 0x42, 0xa4, 0x5f, 0xb7, 0x41, 0x61, 0x89, 0x95, 0x40, 0xd3, 0xbc, 0xbd, 0x42, 0xdf, 0x3e, 0x87, 0x41, 0xe0, 0x45, 0x2f, 0x40, 0xd5, 0x27, 0xb9, 0x42, 0x9a, 0x99, 0x2f, 0x41, 0x03, 0x04, 0xc3, 0x3e, 0xfc, 0xc9, 0x16, 0x43, 0x14, 0xe8, 0x90, 0x40, 0xfc, 0x52, 0x13, 0x40, 0x30, 0x3d, 0x16, 0x43, 0x04, 0xc5, 0x2e, 0x41, +0x65, 0xfc, 0x88, 0x40, 0x52, 0x38, 0x14, 0x43, 0x51, 0xda, 0x88, 0x41, 0x29, 0x57, 0xc6, 0x40, 0x34, 0xd3, 0x10, 0x43, 0x08, 0x9b, 0xb5, 0x41, 0xf3, 0xe0, 0xfe, 0x40, 0x88, 0x36, 0x0c, 0x43, 0x21, 0x8e, 0xdb, 0x41, 0xc0, 0xf8, 0x17, 0x41, 0x9a, 0x99, 0x06, 0x43, 0xee, 0xeb, 0xf8, 0x41, 0xf9, 0xa0, 0x2b, 0x41, 0xfa, 0x3e, 0x00, 0x43, 0xe8, 0x2a, 0x06, 0x42, 0xd6, 0x78, 0x39, 0x41, 0x66, 0xe6, 0xf2, 0x42, 0xaa, 0x71, 0x0a, 0x42, 0x0d, 0xe0, 0x40, 0x41, 0xe0, 0x0f, 0xe5, 0x42, +0xbb, 0x16, 0x09, 0x42, 0xbf, 0x7d, 0x41, 0x41, 0xb8, 0x9e, 0xd7, 0x42, 0xb3, 0x2a, 0x02, 0x42, 0x27, 0x31, 0x3b, 0x41, 0x8a, 0x41, 0xcb, 0x42, 0xf6, 0x97, 0xeb, 0x41, 0x06, 0xf0, 0x2b, 0x41, 0xa3, 0xf2, 0xc0, 0x42, 0x13, 0x61, 0xc1, 0x41, 0xbe, 0xd9, 0x86, 0x40, 0x15, 0x4e, 0x1a, 0x43, 0x0c, 0xe5, 0x54, 0x40, 0xee, 0x77, 0xca, 0x40, 0x33, 0xb3, 0x19, 0x43, 0x33, 0xc4, 0x25, 0x41, 0x3b, 0x0d, 0x08, 0x41, 0x23, 0x7b, 0x17, 0x43, 0x3f, 0x46, 0x89, 0x41, 0x11, 0xc7, 0x29, 0x41, +0xbf, 0xbf, 0x13, 0x43, 0x4a, 0x7b, 0xba, 0x41, 0xf4, 0xdb, 0x48, 0x41, 0x50, 0xad, 0x0e, 0x43, 0x05, 0x34, 0xe4, 0x41, 0xcf, 0xd5, 0x63, 0x41, 0x48, 0x81, 0x08, 0x43, 0x2e, 0x3f, 0x02, 0x42, 0xb0, 0x72, 0x79, 0x41, 0xde, 0x84, 0x01, 0x43, 0x9f, 0xeb, 0x0c, 0x42, 0x9b, 0x55, 0x84, 0x41, 0x94, 0x18, 0xf4, 0x42, 0x07, 0x9f, 0x11, 0x42, 0x38, 0x67, 0x88, 0x41, 0xc5, 0xe0, 0xe4, 0x42, 0xe5, 0x21, 0x10, 0x42, 0x36, 0xbc, 0x88, 0x41, 0x99, 0x19, 0xd6, 0x42, 0xbc, 0x85, 0x08, 0x42, +0x6d, 0x45, 0x85, 0x41, 0x19, 0x84, 0xc8, 0x42, 0x85, 0xeb, 0xf5, 0x41, 0xa3, 0x92, 0x7b, 0x41, 0xaf, 0x74, 0xbd, 0x42, 0xf8, 0x53, 0xce, 0x41, 0x5c, 0x20, 0x07, 0x41, 0x88, 0x56, 0x1d, 0x43, 0x1d, 0x55, 0x01, 0x40, 0x87, 0x85, 0x2b, 0x41, 0xe0, 0xaf, 0x1c, 0x43, 0xe0, 0x73, 0x19, 0x41, 0x09, 0xf9, 0x50, 0x41, 0x8c, 0x4c, 0x1a, 0x43, 0xdf, 0x3e, 0x87, 0x41, 0xc3, 0x42, 0x75, 0x41, 0x73, 0x48, 0x16, 0x43, 0xe6, 0x2e, 0xbc, 0x41, 0xe8, 0x59, 0x8b, 0x41, 0xb7, 0xd3, 0x10, 0x43, +0x12, 0x14, 0xe9, 0x41, 0x98, 0xdd, 0x99, 0x41, 0x9e, 0x2f, 0x0a, 0x43, 0xdb, 0xe8, 0x05, 0x42, 0x1c, 0x7c, 0xa5, 0x41, 0x85, 0xab, 0x02, 0x43, 0x74, 0x64, 0x11, 0x42, 0xb1, 0xae, 0xad, 0x41, 0x13, 0x43, 0xf5, 0x42, 0xff, 0x72, 0x16, 0x42, 0x5c, 0x0f, 0xb2, 0x41, 0xd8, 0xe3, 0xe4, 0x42, 0xfc, 0xd8, 0x14, 0x42, 0x4a, 0x6a, 0xb2, 0x41, 0x71, 0xfd, 0xd4, 0x42, 0xc1, 0xa8, 0x0c, 0x42, 0x71, 0x9b, 0xae, 0x41, 0x19, 0x71, 0xc6, 0x42, 0x10, 0xe9, 0xfb, 0x41, 0x9a, 0x99, 0xa6, 0x41, +0x08, 0xcc, 0xba, 0x42, 0x04, 0xc5, 0xd4, 0x41, 0x7a, 0x36, 0x50, 0x41, 0x8e, 0xd7, 0x1f, 0x43, 0x00, 0xe0, 0x20, 0x3f, 0x2a, 0xa9, 0x76, 0x41, 0x6d, 0x27, 0x1f, 0x43, 0xd0, 0xfe, 0x09, 0x41, 0x99, 0x19, 0x8f, 0x41, 0x0d, 0xa2, 0x1c, 0x43, 0x8c, 0xca, 0x82, 0x41, 0x96, 0x43, 0xa2, 0x41, 0x5b, 0x64, 0x18, 0x43, 0xf8, 0xb1, 0xba, 0x41, 0x22, 0xec, 0xb3, 0x41, 0x8a, 0xa1, 0x12, 0x43, 0x30, 0x19, 0xea, 0x41, 0x42, 0x3e, 0xc3, 0x41, 0x36, 0x9e, 0x0b, 0x43, 0x74, 0x64, 0x07, 0x42, +0xe4, 0x83, 0xcf, 0x41, 0x98, 0xae, 0x03, 0x43, 0x19, 0x84, 0x13, 0x42, 0x36, 0x2b, 0xd8, 0x41, 0xd2, 0x62, 0xf6, 0x42, 0x43, 0xdc, 0x18, 0x42, 0x23, 0xca, 0xdc, 0x41, 0x17, 0x19, 0xe5, 0x42, 0xb3, 0x2a, 0x17, 0x42, 0x36, 0x2b, 0xdd, 0x41, 0x57, 0x4e, 0xd4, 0x42, 0xd0, 0x84, 0x0e, 0x42, 0xb1, 0x3f, 0xd9, 0x41, 0x24, 0xd7, 0xc4, 0x42, 0x88, 0x74, 0xfe, 0x41, 0xec, 0x9e, 0xd1, 0x41, 0xac, 0xab, 0xb8, 0x42, 0xf4, 0x5b, 0xd6, 0x41, 0x42, 0xcf, 0x8e, 0x41, 0xf0, 0xc7, 0x21, 0x43, +0x06, 0x48, 0x54, 0xbf, 0x3f, 0xc6, 0xa2, 0x41, 0x27, 0x11, 0x21, 0x43, 0x36, 0x37, 0xef, 0x40, 0x0d, 0x4f, 0xb7, 0x41, 0xf2, 0x72, 0x1e, 0x43, 0xb7, 0xf3, 0x77, 0x41, 0x74, 0x35, 0xcb, 0x41, 0x86, 0x0b, 0x1a, 0x43, 0xf6, 0x06, 0xb6, 0x41, 0x0f, 0x8b, 0xdd, 0x41, 0x21, 0x10, 0x14, 0x43, 0xf2, 0x41, 0xe7, 0x41, 0x81, 0x73, 0xed, 0x41, 0xae, 0xc7, 0x0c, 0x43, 0xa5, 0xac, 0x06, 0x42, 0x95, 0x32, 0xfa, 0x41, 0xfc, 0x89, 0x04, 0x43, 0x67, 0x44, 0x13, 0x42, 0xbb, 0x96, 0x01, 0x42, +0xb1, 0x72, 0xf7, 0x42, 0x13, 0xd0, 0x18, 0x42, 0xb5, 0x26, 0x04, 0x42, 0xc9, 0x76, 0xe5, 0x42, 0x43, 0x1c, 0x17, 0x42, 0xbf, 0x8e, 0x04, 0x42, 0x0d, 0x02, 0xd4, 0x42, 0x53, 0x34, 0x0e, 0x42, 0x5f, 0x58, 0x02, 0x42, 0x55, 0xf0, 0xc3, 0x42, 0x36, 0xbc, 0xfc, 0x41, 0x53, 0xb8, 0xff, 0x41, 0x55, 0xbf, 0xb6, 0x42, 0xd5, 0xd6, 0xd1, 0x41, 0x8f, 0xc2, 0xcb, 0x41, 0x77, 0x7e, 0x23, 0x43, 0x8f, 0xfc, 0x45, 0xc0, 0xec, 0x40, 0xe0, 0x41, 0xd1, 0xc2, 0x22, 0x43, 0x02, 0xd4, 0xad, 0x40, +0x54, 0x52, 0xf5, 0x41, 0xf2, 0x12, 0x20, 0x43, 0x6b, 0x9a, 0x5a, 0x41, 0x3c, 0xdf, 0x04, 0x42, 0x57, 0x8e, 0x1b, 0x43, 0x76, 0xe0, 0xa8, 0x41, 0x79, 0x47, 0x0e, 0x42, 0x7f, 0x6a, 0x15, 0x43, 0x88, 0x63, 0xdb, 0x41, 0x90, 0x71, 0x16, 0x42, 0x69, 0xf1, 0x0d, 0x43, 0xbf, 0x3d, 0x01, 0x42, 0xb3, 0xfb, 0x1c, 0x42, 0xac, 0x7c, 0x05, 0x43, 0xc7, 0x29, 0x0e, 0x42, 0xf8, 0x82, 0x21, 0x42, 0x47, 0xe1, 0xf8, 0x42, 0x89, 0x92, 0x13, 0x42, 0xab, 0x4f, 0x24, 0x42, 0x30, 0x5d, 0xe6, 0x42, +0x3f, 0x75, 0x11, 0x42, 0x58, 0x79, 0x25, 0x42, 0x84, 0x80, 0xd4, 0x42, 0x5c, 0x60, 0x09, 0x42, 0x1d, 0x49, 0x22, 0x42, 0x59, 0x06, 0xc4, 0x42, 0x6d, 0xc5, 0xf0, 0x41, 0x98, 0xee, 0x1d, 0x42, 0x83, 0xaf, 0xb5, 0x42, 0xf8, 0xb1, 0xc4, 0x41, 0x0d, 0x0f, 0x05, 0x42, 0x52, 0xf8, 0x23, 0x43, 0xdc, 0x29, 0xac, 0xc0, 0xbc, 0x45, 0x0f, 0x42, 0xb3, 0x3d, 0x23, 0x43, 0x31, 0x77, 0x47, 0x40, 0x9c, 0xc4, 0x19, 0x42, 0x63, 0x90, 0x20, 0x43, 0xe3, 0x14, 0x35, 0x41, 0xd8, 0xf0, 0x23, 0x42, +0xe0, 0x0f, 0x1c, 0x43, 0x61, 0xe5, 0x95, 0x41, 0xf3, 0x3d, 0x36, 0x42, 0xfc, 0x29, 0x16, 0x43, 0x30, 0x3b, 0xc1, 0x41, 0xa1, 0xd6, 0x3b, 0x42, 0x13, 0x83, 0x0f, 0x43, 0x1a, 0x40, 0xe4, 0x41, 0xa7, 0x17, 0x43, 0x42, 0x9c, 0x24, 0x08, 0x43, 0x07, 0xdf, 0xf7, 0x41, 0x5b, 0x82, 0x40, 0x42, 0x59, 0x39, 0xfa, 0x42, 0xe0, 0xad, 0x08, 0x42, 0x1b, 0x1e, 0x46, 0x42, 0xf9, 0x93, 0xe8, 0x42, 0xd3, 0xfc, 0x08, 0x42, 0xee, 0xab, 0x47, 0x42, 0xdc, 0x39, 0xd6, 0x42, 0x3a, 0xb4, 0x01, 0x42, +0xd8, 0xc1, 0x42, 0x42, 0x25, 0xa4, 0xc5, 0x42, 0x6b, 0x9a, 0xde, 0x41, 0xaf, 0xe5, 0x3c, 0x42, 0x8a, 0x41, 0xb7, 0x42, 0x8c, 0x6c, 0xb1, 0x41, 0x13, 0xd0, 0x19, 0x42, 0x7b, 0x74, 0x23, 0x43, 0x4f, 0x3b, 0xdc, 0xc0, 0x1b, 0xcd, 0x23, 0x42, 0xf4, 0xbd, 0x22, 0x43, 0xb7, 0xee, 0xb6, 0x3f, 0x82, 0x11, 0x2e, 0x42, 0x7d, 0x1f, 0x20, 0x43, 0xdd, 0x35, 0x17, 0x41, 0xd2, 0x2f, 0x3f, 0x42, 0x4a, 0x2c, 0x1b, 0x43, 0xf3, 0x1f, 0x8b, 0x41, 0xe4, 0xc3, 0x54, 0x42, 0x5b, 0x64, 0x01, 0x43, +0x1a, 0xaf, 0xf3, 0x41, 0x0a, 0xc6, 0x65, 0x42, 0xbf, 0x5f, 0xf0, 0x42, 0xf2, 0xd2, 0xf2, 0x41, 0xa1, 0x05, 0x67, 0x42, 0x13, 0xc3, 0xd9, 0x42, 0xa9, 0x93, 0xe9, 0x41, 0x07, 0x01, 0x62, 0x42, 0xb1, 0xb2, 0xc8, 0x42, 0xec, 0x1e, 0xc7, 0x41, 0x2c, 0xc3, 0x59, 0x42, 0xba, 0xfa, 0xba, 0x42, 0x40, 0x35, 0x95, 0x41, 0x10, 0x29, 0x2e, 0x42, 0x6f, 0x52, 0x22, 0x43, 0x40, 0x76, 0x05, 0xc1, 0xfc, 0xc7, 0x37, 0x42, 0xd1, 0xa2, 0x21, 0x43, 0x01, 0xbe, 0xab, 0xbe, 0x5e, 0xa9, 0x49, 0x42, +0xbf, 0x1f, 0x1e, 0x43, 0xd1, 0x3a, 0x1f, 0x41, 0xf3, 0xce, 0x41, 0x42, 0xc9, 0x96, 0x20, 0x43, 0x8d, 0xc0, 0x1b, 0xc1, 0x08, 0xec, 0x4a, 0x42, 0x63, 0xf0, 0x1f, 0x43, 0x19, 0xad, 0x09, 0xc0, 0xd6, 0x45, 0x59, 0x42, 0x30, 0x9d, 0x1d, 0x43, 0x77, 0x67, 0xc7, 0x40, 0xf1, 0xa3, 0x7f, 0x42, 0xb8, 0x1e, 0xdc, 0x42, 0xe2, 0xc7, 0xc5, 0x41, 0x94, 0x36, 0x7f, 0x42, 0x48, 0x21, 0xef, 0x42, 0xbb, 0x16, 0xcb, 0x41, 0xa1, 0x9a, 0x7b, 0x42, 0x21, 0x70, 0xcc, 0x42, 0xbb, 0x38, 0xa7, 0x41, +0x54, 0x12, 0x73, 0x42, 0xda, 0x2c, 0xc0, 0x42, 0x5d, 0x4b, 0x6b, 0x41, 0xe9, 0x77, 0x54, 0x42, 0xae, 0x47, 0x1e, 0x43, 0x64, 0xaa, 0x30, 0xc1, 0x55, 0xf0, 0x5c, 0x42, 0xcd, 0xac, 0x1d, 0x43, 0x62, 0x7f, 0x7f, 0xc0, 0x8f, 0xc2, 0x68, 0x42, 0x3c, 0xdf, 0x1b, 0x43, 0xc0, 0xad, 0x33, 0x40, 0x03, 0x98, 0x86, 0x42, 0x61, 0x25, 0xef, 0x42, 0xb4, 0x48, 0xa8, 0x41, 0xe5, 0x81, 0x87, 0x42, 0x00, 0x80, 0xde, 0x42, 0x09, 0x0a, 0xa0, 0x41, 0x21, 0xbf, 0x86, 0x42, 0x0a, 0xd7, 0xcf, 0x42, +0xcd, 0x2a, 0x89, 0x41, 0x05, 0x16, 0x82, 0x42, 0x0a, 0x48, 0xc4, 0x42, 0xee, 0x5a, 0x38, 0x41, 0x4f, 0xde, 0x65, 0x42, 0xd3, 0x6d, 0x1b, 0x43, 0x86, 0xeb, 0x43, 0xc1, 0x75, 0x93, 0x6d, 0x42, 0x07, 0xe1, 0x1a, 0x43, 0xb6, 0x9c, 0xba, 0xc0, 0x18, 0xc4, 0x78, 0x42, 0x65, 0xfb, 0x18, 0x43, 0x23, 0xf4, 0xd3, 0x3d, 0x7e, 0x9d, 0x8d, 0x42, 0xbb, 0x89, 0xe0, 0x42, 0x4f, 0x62, 0x7a, 0x41, 0x39, 0x65, 0x8b, 0x42, 0x2e, 0xb2, 0xef, 0x42, 0x45, 0xc7, 0x84, 0x41, 0xf2, 0xe1, 0x8c, 0x42, +0xf8, 0x13, 0xd4, 0x42, 0x4b, 0x59, 0x4e, 0x41, 0xe3, 0x16, 0x89, 0x42, 0x34, 0x73, 0xc9, 0x42, 0xa3, 0x2f, 0x03, 0x41, 0xb7, 0xc0, 0x75, 0x42, 0xb7, 0x13, 0x18, 0x43, 0x4c, 0x37, 0x55, 0xc1, 0x32, 0x95, 0x7c, 0x42, 0x0a, 0x97, 0x17, 0x43, 0xe7, 0x8c, 0xf4, 0xc0, 0x5c, 0x8f, 0x83, 0x42, 0x50, 0x6d, 0x15, 0x43, 0xa7, 0xcb, 0x02, 0xc0, 0x81, 0xa4, 0x91, 0x42, 0xcb, 0xe1, 0xef, 0x42, 0xb5, 0xa6, 0x2e, 0x41, 0x92, 0xfc, 0x91, 0x42, 0xb8, 0x1e, 0xe3, 0x42, 0xd4, 0x09, 0x23, 0x41, +0xf6, 0x37, 0x91, 0x42, 0xfb, 0x3e, 0xda, 0x42, 0xe5, 0x5c, 0xe7, 0x40, 0x1b, 0x4d, 0x8f, 0x42, 0xd6, 0xf8, 0xd1, 0x42, 0x86, 0x1c, 0x2f, 0x3f, 0x15, 0xac, 0x84, 0x42, 0xba, 0x78, 0xbe, 0x42, 0x12, 0xd8, 0x1c, 0x3e, 0x73, 0xd7, 0x8e, 0x42, 0x4e, 0x62, 0xcd, 0x42, 0x3f, 0xfb, 0xbd, 0xc0, 0x95, 0xb4, 0x80, 0x42, 0xcd, 0x9b, 0xbd, 0x42, 0x4c, 0x15, 0x48, 0xc1, 0xc9, 0x25, 0x70, 0x42, 0x7d, 0xce, 0xb6, 0x42, 0x82, 0x51, 0x31, 0xc1, 0x09, 0x39, 0x79, 0x42, 0xbf, 0x2c, 0xb9, 0x42, +0x6b, 0x9a, 0x3b, 0x40, 0x4a, 0x3b, 0x84, 0x42, 0x63, 0x50, 0x12, 0x43, 0x61, 0xe5, 0x68, 0xc1, 0xde, 0x42, 0x87, 0x42, 0xf0, 0xa7, 0x11, 0x43, 0xb7, 0xfa, 0x0d, 0xc1, 0xbf, 0xdf, 0x89, 0x42, 0x19, 0xa4, 0x10, 0x43, 0x4d, 0x67, 0x97, 0xc0, 0x90, 0xef, 0x87, 0x42, 0x63, 0x30, 0x0f, 0x43, 0x9e, 0x5e, 0x70, 0xc1, 0x9e, 0xaf, 0x8b, 0x42, 0x05, 0xd6, 0x0d, 0x43, 0x58, 0xee, 0x14, 0xc1, 0x8b, 0xfb, 0x8b, 0x42, 0x44, 0x2b, 0x0c, 0x43, 0x96, 0xb2, 0x78, 0xc1, 0x84, 0xc0, 0x8f, 0x42, +0xbf, 0xbf, 0x0a, 0x43, 0x65, 0x0d, 0x1b, 0xc1, 0xaf, 0x03, 0x36, 0xc1, 0x9c, 0x44, 0xeb, 0x42, 0x6d, 0x73, 0x0c, 0x41, 0x5a, 0x13, 0x77, 0x42, 0xee, 0xbc, 0x0a, 0x43, 0x15, 0x9d, 0x87, 0x41, 0x35, 0xcd, 0x7d, 0x42, 0xe8, 0x1b, 0x0c, 0x43, 0xfb, 0xcb, 0x74, 0x41, 0x13, 0x10, 0x73, 0x42, 0xec, 0x71, 0x0c, 0x43, 0x82, 0x51, 0x85, 0x41, 0x1c, 0x6b, 0x79, 0x42, 0x6f, 0x72, 0x0d, 0x43, 0x3a, 0x01, 0x73, 0x41, 0x81, 0x73, 0x6e, 0x42, 0x00, 0xc0, 0x0b, 0x43, 0xe3, 0xb6, 0x8c, 0x41, +0x1a, 0x40, 0x72, 0x42, 0x75, 0x93, 0x09, 0x43, 0xc8, 0x07, 0x90, 0x41, 0x0f, 0x7a, 0x70, 0x42, 0xe6, 0x10, 0x0e, 0x43, 0xba, 0xb8, 0x7f, 0x41, 0x4d, 0xb7, 0x6c, 0x42, 0xa4, 0xd0, 0x0d, 0x43, 0xe8, 0x59, 0x84, 0x41, 0xd4, 0xc9, 0x75, 0x42, 0x46, 0x96, 0x0e, 0x43, 0xd8, 0xa3, 0x6e, 0x41, 0x94, 0x36, 0x80, 0x42, 0xb8, 0x9e, 0x07, 0x43, 0x5d, 0x5c, 0x83, 0x41, 0x8a, 0x2e, 0x83, 0x42, 0xf4, 0x3d, 0x09, 0x43, 0x54, 0xc1, 0x6f, 0x41, 0x67, 0xc4, 0x7b, 0x42, 0x9a, 0x19, 0x09, 0x43, +0x8b, 0xfd, 0x86, 0x41, 0x12, 0x23, 0x81, 0x42, 0x09, 0xac, 0x0a, 0x43, 0x9a, 0x77, 0x73, 0x41, 0xb3, 0xfb, 0x76, 0x42, 0x40, 0x95, 0x07, 0x43, 0x3a, 0x92, 0x8e, 0x41, 0x03, 0x27, 0x7c, 0x42, 0xe8, 0xfb, 0x05, 0x43, 0x5e, 0x29, 0x89, 0x41, 0x5b, 0xe4, 0x83, 0x42, 0xd7, 0x63, 0x05, 0x43, 0x21, 0x8e, 0x6b, 0x41, 0x4b, 0x99, 0x85, 0x42, 0x90, 0xa2, 0x06, 0x43, 0xf3, 0x1f, 0x62, 0x41, 0x3d, 0x3b, 0x82, 0x42, 0x6b, 0x5c, 0x06, 0x43, 0x2b, 0x65, 0x7a, 0x41, 0x5b, 0xb1, 0x84, 0x42, +0x6b, 0xdc, 0x07, 0x43, 0xe7, 0x8c, 0x69, 0x41, 0x3c, 0xac, 0x80, 0x42, 0xb3, 0xdd, 0x04, 0x43, 0x00, 0x00, 0x81, 0x41, 0xbb, 0xd8, 0x82, 0x42, 0xd5, 0x18, 0x04, 0x43, 0xac, 0x8b, 0x6e, 0x41, 0x1e, 0xc7, 0x86, 0x42, 0xa8, 0xa6, 0x05, 0x43, 0x77, 0x2d, 0x53, 0x41, 0xfd, 0xe5, 0x85, 0x42, 0xc9, 0xb6, 0x05, 0x43, 0x05, 0x12, 0x5d, 0x41, 0xa2, 0x94, 0x86, 0x42, 0x63, 0xf0, 0x04, 0x43, 0xe8, 0xd9, 0x4d, 0x41, 0x74, 0x35, 0x85, 0x42, 0xfe, 0xd4, 0x04, 0x43, 0x8b, 0xdb, 0x5c, 0x41, +0x22, 0xbd, 0x84, 0x42, 0x7f, 0xca, 0x03, 0x43, 0xe2, 0xc7, 0x5a, 0x41, 0x49, 0x6e, 0x86, 0x42, 0xde, 0x04, 0x04, 0x43, 0xf3, 0x1f, 0x47, 0x41, 0x70, 0xee, 0x87, 0x42, 0xde, 0xe4, 0x04, 0x43, 0xe1, 0x0b, 0x35, 0x41, 0xbb, 0x07, 0x89, 0x42, 0x56, 0x4e, 0x06, 0x43, 0x61, 0x32, 0x25, 0x41, 0x9d, 0xd1, 0x87, 0x42, 0x5f, 0xba, 0x05, 0x43, 0x5d, 0xdc, 0x40, 0x41, 0x00, 0x8f, 0x88, 0x42, 0x4e, 0x02, 0x07, 0x43, 0x91, 0xed, 0x37, 0x41, 0xd6, 0x94, 0x87, 0x42, 0x73, 0x48, 0x06, 0x43, +0xd2, 0xde, 0x4b, 0x41, 0x65, 0x7b, 0x87, 0x42, 0x32, 0x48, 0x07, 0x43, 0xf1, 0xf4, 0x4d, 0x41, 0x53, 0xc5, 0x85, 0x42, 0xe0, 0x2f, 0x0a, 0x43, 0x12, 0x83, 0x4f, 0x41, 0x7e, 0xfb, 0x86, 0x42, 0x4a, 0xac, 0x08, 0x43, 0xaa, 0xcf, 0x4e, 0x41, 0xcf, 0x86, 0x87, 0x42, 0xe2, 0x5a, 0x0a, 0x43, 0xef, 0xc9, 0x2c, 0x41, 0xf4, 0x7d, 0x88, 0x42, 0x3c, 0x9f, 0x08, 0x43, 0x77, 0x2d, 0x31, 0x41, 0xfc, 0x58, 0x89, 0x42, 0x11, 0x18, 0x08, 0x43, 0x10, 0x3b, 0x18, 0x41, 0x8f, 0x93, 0x88, 0x42, +0x1b, 0x0f, 0x0a, 0x43, 0xc1, 0x73, 0x0f, 0x41, 0x05, 0xa3, 0x81, 0x42, 0x42, 0x20, 0x0d, 0x43, 0x2e, 0x6e, 0x52, 0x41, 0x3a, 0xe3, 0x83, 0x42, 0x69, 0xb1, 0x0b, 0x43, 0x21, 0x8e, 0x50, 0x41, 0xab, 0x4d, 0x83, 0x42, 0x5d, 0xaf, 0x0d, 0x43, 0xb5, 0xa6, 0x2e, 0x41, 0x84, 0xbe, 0x85, 0x42, 0xf8, 0x13, 0x0c, 0x43, 0x9b, 0xc4, 0x2b, 0x41, 0x16, 0xb9, 0x86, 0x42, 0xfc, 0x09, 0x0c, 0x43, 0xbf, 0x8e, 0x0c, 0x41, 0xae, 0x07, 0x84, 0x42, 0x5b, 0xe4, 0x0d, 0x43, 0x7e, 0xfb, 0x10, 0x41, +0x73, 0x17, 0x7a, 0x42, 0xcf, 0x57, 0x0f, 0x43, 0xc5, 0xfe, 0x53, 0x41, 0xb7, 0x6f, 0x7e, 0x42, 0x71, 0x5d, 0x0e, 0x43, 0x20, 0xb0, 0x53, 0x41, 0xab, 0x71, 0x7b, 0x42, 0x8e, 0xf7, 0x0f, 0x43, 0xb1, 0xbf, 0x3b, 0x41, 0xc3, 0x84, 0x80, 0x42, 0xd7, 0x03, 0x0f, 0x43, 0xe3, 0x36, 0x34, 0x41, 0xbb, 0xd6, 0x80, 0x42, 0xbf, 0x5f, 0x0f, 0x43, 0x22, 0x26, 0x1b, 0x41, 0xe5, 0x21, 0x7b, 0x42, 0xee, 0x5c, 0x10, 0x43, 0xc5, 0x8f, 0x29, 0x41, 0x04, 0x45, 0x74, 0x42, 0x2e, 0xf2, 0x0f, 0x43, +0x1e, 0xa7, 0x5d, 0x41, 0x39, 0x23, 0x77, 0x42, 0x48, 0x01, 0x10, 0x43, 0x4e, 0x40, 0x52, 0x41, 0x2d, 0x72, 0x72, 0x42, 0x6f, 0x32, 0x10, 0x43, 0x47, 0xe1, 0x59, 0x41, 0x64, 0x7b, 0x76, 0x42, 0xa8, 0x66, 0x10, 0x43, 0x5f, 0x07, 0x47, 0x41, 0x86, 0x49, 0x75, 0x42, 0xa2, 0xc5, 0x10, 0x43, 0x5d, 0x4b, 0x3c, 0x41, 0x3b, 0x70, 0x70, 0x42, 0xc9, 0x76, 0x10, 0x43, 0x53, 0x74, 0x55, 0x41, 0xf7, 0x24, 0x70, 0x42, 0x52, 0x58, 0x0f, 0x43, 0x0f, 0x0b, 0x6f, 0x41, 0x11, 0x36, 0x73, 0x42, +0x4c, 0x57, 0x0f, 0x43, 0x75, 0x02, 0x6b, 0x41, 0xc3, 0x53, 0x6d, 0x42, 0xfe, 0x74, 0x0f, 0x43, 0xc3, 0x42, 0x71, 0x41, 0x82, 0xd1, 0x6f, 0x42, 0x3a, 0x94, 0x09, 0x43, 0x4f, 0x9e, 0xa9, 0x41, 0xda, 0x1b, 0x76, 0x42, 0xf0, 0x87, 0x06, 0x43, 0xa5, 0x3d, 0xa5, 0x41, 0x08, 0xdb, 0x71, 0x42, 0xc9, 0x76, 0x09, 0x43, 0x05, 0x56, 0xa0, 0x41, 0x54, 0x81, 0x77, 0x42, 0xbd, 0xd4, 0x06, 0x43, 0xa2, 0xb4, 0x9c, 0x41, 0xa1, 0x56, 0x7e, 0x42, 0xf2, 0x72, 0x05, 0x43, 0x08, 0x3d, 0x8e, 0x41, +0xe6, 0xdd, 0x78, 0x42, 0x47, 0x21, 0x07, 0x43, 0xfc, 0x29, 0x94, 0x41, 0x20, 0xf0, 0x7d, 0x42, 0x65, 0xdb, 0x04, 0x43, 0xa2, 0x23, 0x96, 0x41, 0x33, 0x62, 0x72, 0x42, 0xa0, 0xba, 0x14, 0x43, 0x3a, 0x01, 0x69, 0x41, 0x53, 0x05, 0x6e, 0x42, 0xbd, 0x54, 0x13, 0x43, 0x7b, 0x83, 0x8a, 0x41, 0xd9, 0xfd, 0x72, 0x42, 0xae, 0x07, 0x13, 0x43, 0x2f, 0xdd, 0x61, 0x41, 0x27, 0x0f, 0x6f, 0x42, 0xc1, 0xca, 0x11, 0x43, 0x12, 0x14, 0x84, 0x41, 0x9a, 0x66, 0x6e, 0x42, 0x9c, 0x64, 0x0e, 0x43, +0x18, 0x26, 0x8b, 0x41, 0x10, 0x18, 0x70, 0x42, 0xc5, 0x40, 0x10, 0x43, 0x2f, 0x4c, 0x7b, 0x41, 0xbc, 0xc5, 0x6c, 0x42, 0xc3, 0x95, 0x0f, 0x43, 0x6f, 0x81, 0x93, 0x41, 0xf7, 0x24, 0x6b, 0x42, 0xea, 0xc6, 0x10, 0x43, 0x69, 0xde, 0x9b, 0x41, 0xc9, 0x54, 0x6b, 0x42, 0x3a, 0x34, 0x0d, 0x43, 0xde, 0x71, 0xa6, 0x41, 0xe5, 0xa1, 0x6d, 0x42, 0xe6, 0x90, 0x0c, 0x43, 0x64, 0x4c, 0x9d, 0x41, 0xa8, 0xe4, 0x73, 0x42, 0x99, 0x59, 0x09, 0x43, 0x27, 0x0f, 0x97, 0x41, 0x1a, 0xef, 0x6f, 0x42, +0x50, 0xed, 0x0b, 0x43, 0xea, 0x26, 0x94, 0x41, 0x63, 0xbd, 0x82, 0x42, 0xbd, 0xb4, 0x02, 0x43, 0xda, 0x0a, 0x95, 0x41, 0xa2, 0x54, 0x82, 0x42, 0xc5, 0x80, 0x03, 0x43, 0x9d, 0x91, 0x8d, 0x41, 0x25, 0x75, 0x7d, 0x42, 0x77, 0x3e, 0x04, 0x43, 0x6a, 0x3c, 0x9e, 0x41, 0x4c, 0x46, 0x84, 0x42, 0xe4, 0x85, 0x03, 0x43, 0xb7, 0xf3, 0x77, 0x41, 0x02, 0xda, 0x81, 0x42, 0xae, 0x47, 0x04, 0x43, 0xa1, 0x56, 0x86, 0x41, 0xe4, 0x25, 0x85, 0x42, 0x6d, 0xa7, 0x02, 0x43, 0xb9, 0x6b, 0x81, 0x41, +0x3f, 0x06, 0x86, 0x42, 0x96, 0xc3, 0x01, 0x43, 0xd4, 0x09, 0x87, 0x41, 0xe7, 0x9b, 0x88, 0x42, 0x13, 0x63, 0x01, 0x43, 0xf0, 0x16, 0x6c, 0x41, 0x36, 0x7c, 0x87, 0x42, 0x6f, 0x52, 0x02, 0x43, 0x6b, 0x2b, 0x66, 0x41, 0xee, 0x5a, 0x86, 0x42, 0x6b, 0x3c, 0x03, 0x43, 0x51, 0x49, 0x60, 0x41, 0x06, 0x32, 0x88, 0x42, 0xd5, 0x78, 0x03, 0x43, 0x7d, 0xae, 0x47, 0x41, 0xbb, 0x98, 0x89, 0x42, 0xbd, 0x94, 0x02, 0x43, 0xe8, 0x6a, 0x48, 0x41, 0x0d, 0xcf, 0x89, 0x42, 0xc3, 0x55, 0x04, 0x43, +0x82, 0xe2, 0x2f, 0x41, 0x61, 0xa5, 0x8b, 0x42, 0x6b, 0xbc, 0x03, 0x43, 0x9a, 0x08, 0x2b, 0x41, 0xaa, 0x11, 0x8b, 0x42, 0x90, 0xe2, 0x05, 0x43, 0xbf, 0x60, 0x1a, 0x41, 0xcc, 0x3d, 0x8d, 0x42, 0xd1, 0xa2, 0x05, 0x43, 0x5d, 0xf9, 0x0f, 0x41, 0xa2, 0x83, 0x8d, 0x42, 0x58, 0x19, 0x03, 0x43, 0xa3, 0x01, 0x25, 0x41, 0x82, 0x02, 0x8b, 0x42, 0x7b, 0xb4, 0x01, 0x43, 0x0e, 0x2d, 0x49, 0x41, 0xec, 0xe0, 0x8e, 0x42, 0x81, 0x15, 0x08, 0x43, 0xb9, 0x4e, 0xd5, 0x40, 0x3c, 0x4c, 0x8d, 0x42, +0xdc, 0xf9, 0x07, 0x43, 0x64, 0xaa, 0xf6, 0x40, 0x03, 0x29, 0x8f, 0x42, 0x9c, 0x64, 0x05, 0x43, 0xe5, 0x44, 0x03, 0x41, 0x09, 0x8a, 0x8b, 0x42, 0xb7, 0xf3, 0x07, 0x43, 0xef, 0x1b, 0x08, 0x41, 0xbb, 0xd8, 0x8a, 0x42, 0xe4, 0x45, 0x0a, 0x43, 0xc3, 0x5f, 0xf8, 0x40, 0xab, 0x0f, 0x8c, 0x42, 0x6d, 0x87, 0x0a, 0x43, 0xe6, 0x1d, 0xdc, 0x40, 0x1b, 0x5e, 0x8a, 0x42, 0x3a, 0xb4, 0x0d, 0x43, 0x9d, 0x29, 0xb4, 0x40, 0x4c, 0x95, 0x89, 0x42, 0xe8, 0x1b, 0x0d, 0x43, 0xd7, 0x12, 0xd4, 0x40, +0x23, 0x3b, 0x8d, 0x42, 0xe2, 0xda, 0x0a, 0x43, 0x06, 0xb6, 0xba, 0x40, 0x40, 0xc2, 0x88, 0x42, 0xb1, 0x92, 0x0c, 0x43, 0x7a, 0xdf, 0xf1, 0x40, 0xee, 0xab, 0x85, 0x42, 0x8a, 0xa1, 0x0e, 0x43, 0x01, 0xd9, 0xff, 0x40, 0x73, 0x28, 0x86, 0x42, 0x8f, 0x82, 0x0f, 0x43, 0xa9, 0x65, 0xe4, 0x40, 0x1a, 0x71, 0x82, 0x42, 0x0b, 0xb7, 0x12, 0x43, 0x7e, 0x6f, 0xf4, 0x40, 0x8e, 0x35, 0x82, 0x42, 0xc9, 0x76, 0x11, 0x43, 0xd4, 0x89, 0x04, 0x41, 0x6e, 0xa3, 0x86, 0x42, 0x1f, 0x65, 0x10, 0x43, +0xfd, 0xd9, 0xc8, 0x40, 0x8c, 0xf9, 0x81, 0x42, 0x46, 0x36, 0x10, 0x43, 0xf4, 0xdb, 0x0e, 0x41, 0x0e, 0x5c, 0x7d, 0x42, 0xb3, 0x3d, 0x11, 0x43, 0xb2, 0x0c, 0x23, 0x41, 0xe5, 0xa1, 0x7d, 0x42, 0xe0, 0xcf, 0x12, 0x43, 0x5b, 0x7c, 0x1d, 0x41, 0x90, 0xcf, 0x77, 0x42, 0x17, 0x19, 0x15, 0x43, 0x84, 0x0d, 0x3d, 0x41, 0x94, 0xe5, 0x77, 0x42, 0xa0, 0x5a, 0x13, 0x43, 0xda, 0x8a, 0x3c, 0x41, 0x03, 0xe7, 0x7d, 0x42, 0x0d, 0x62, 0x14, 0x43, 0x22, 0xec, 0x17, 0x41, 0x98, 0xfb, 0x77, 0x42, +0x6b, 0x9c, 0x11, 0x43, 0x53, 0x05, 0x3c, 0x41, 0x7f, 0x99, 0x73, 0x42, 0x7b, 0x54, 0x11, 0x43, 0xba, 0xb8, 0x5a, 0x41, 0x54, 0x63, 0x80, 0x42, 0x50, 0x0d, 0x04, 0x43, 0x00, 0xef, 0x82, 0x41, 0x04, 0xc5, 0x82, 0x42, 0xb1, 0x52, 0x03, 0x43, 0x56, 0x7d, 0x70, 0x41, 0x54, 0x63, 0x80, 0x42, 0x50, 0x0d, 0x04, 0x43, 0x00, 0xef, 0x82, 0x41, 0x2b, 0x47, 0x7b, 0x42, 0x1b, 0x2f, 0x05, 0x43, 0x46, 0xb6, 0x8b, 0x41, 0x2c, 0xd4, 0x6c, 0x42, 0x29, 0x7c, 0x0b, 0x43, 0x97, 0x7f, 0x90, 0x41, +0xe1, 0xa9, 0x70, 0x42, 0x5c, 0x0f, 0x09, 0x43, 0xf6, 0xa8, 0x93, 0x41, 0x2c, 0xd4, 0x6c, 0x42, 0x29, 0x7c, 0x0b, 0x43, 0x97, 0x7f, 0x90, 0x41, 0x72, 0x39, 0x6b, 0x42, 0x1f, 0xc5, 0x0d, 0x43, 0x48, 0xbf, 0x86, 0x41, 0x17, 0xa6, 0x75, 0x42, 0x13, 0xe3, 0x06, 0x43, 0xed, 0x8d, 0x91, 0x41, 0x2b, 0x47, 0x7b, 0x42, 0x1b, 0x2f, 0x05, 0x43, 0x46, 0xb6, 0x8b, 0x41, 0x17, 0xa6, 0x75, 0x42, 0x13, 0xe3, 0x06, 0x43, 0xed, 0x8d, 0x91, 0x41, 0xe1, 0xa9, 0x70, 0x42, 0x5c, 0x0f, 0x09, 0x43, +0xf6, 0xa8, 0x93, 0x41, 0x41, 0xd1, 0x84, 0x42, 0x09, 0x0c, 0x03, 0x43, 0xda, 0xce, 0x59, 0x41, 0xdf, 0x9e, 0x86, 0x42, 0x9e, 0x4f, 0x03, 0x43, 0x2e, 0xff, 0x42, 0x41, 0x41, 0xd1, 0x84, 0x42, 0x09, 0x0c, 0x03, 0x43, 0xda, 0xce, 0x59, 0x41, 0x04, 0xc5, 0x82, 0x42, 0xb1, 0x52, 0x03, 0x43, 0x56, 0x7d, 0x70, 0x41, 0x16, 0x2a, 0x6c, 0x42, 0x6f, 0x92, 0x0f, 0x43, 0x4f, 0xaf, 0x72, 0x41, 0x72, 0x39, 0x6b, 0x42, 0x1f, 0xc5, 0x0d, 0x43, 0x48, 0xbf, 0x86, 0x41, 0x16, 0x2a, 0x6c, 0x42, +0x6f, 0x92, 0x0f, 0x43, 0x4f, 0xaf, 0x72, 0x41, 0x4b, 0x99, 0x6f, 0x42, 0x84, 0xa0, 0x10, 0x43, 0xee, 0x5a, 0x53, 0x41, 0x95, 0x63, 0x89, 0x42, 0x6f, 0xb2, 0x05, 0x43, 0xcf, 0x14, 0x1a, 0x41, 0x09, 0x2a, 0x88, 0x42, 0x63, 0x30, 0x04, 0x43, 0x96, 0x43, 0x2d, 0x41, 0x09, 0x2a, 0x88, 0x42, 0x63, 0x30, 0x04, 0x43, 0x96, 0x43, 0x2d, 0x41, 0xdf, 0x9e, 0x86, 0x42, 0x9e, 0x4f, 0x03, 0x43, 0x2e, 0xff, 0x42, 0x41, 0x4b, 0x99, 0x6f, 0x42, 0x84, 0xa0, 0x10, 0x43, 0xee, 0x5a, 0x53, 0x41, +0x94, 0x98, 0x74, 0x42, 0x59, 0xf9, 0x10, 0x43, 0x13, 0xd0, 0x36, 0x41, 0x94, 0x98, 0x74, 0x42, 0x59, 0xf9, 0x10, 0x43, 0x13, 0xd0, 0x36, 0x41, 0x2b, 0xb6, 0x7a, 0x42, 0xb1, 0x92, 0x10, 0x43, 0xe3, 0x36, 0x20, 0x41, 0x55, 0x30, 0x89, 0x42, 0x73, 0xc8, 0x09, 0x43, 0xa2, 0x23, 0xfe, 0x40, 0xdb, 0xe8, 0x89, 0x42, 0xbf, 0x9f, 0x07, 0x43, 0x63, 0xdd, 0x09, 0x41, 0xdb, 0xe8, 0x89, 0x42, 0xbf, 0x9f, 0x07, 0x43, 0x63, 0xdd, 0x09, 0x41, 0x95, 0x63, 0x89, 0x42, 0x6f, 0xb2, 0x05, 0x43, +0xcf, 0x14, 0x1a, 0x41, 0x2b, 0xb6, 0x7a, 0x42, 0xb1, 0x92, 0x10, 0x43, 0xe3, 0x36, 0x20, 0x41, 0x94, 0xc7, 0x80, 0x42, 0xb5, 0x88, 0x0f, 0x43, 0xc1, 0xd6, 0x0d, 0x41, 0x94, 0xc7, 0x80, 0x42, 0xb5, 0x88, 0x0f, 0x43, 0xc1, 0xd6, 0x0d, 0x41, 0x4c, 0x46, 0x84, 0x42, 0xd5, 0xf8, 0x0d, 0x43, 0x4d, 0x84, 0x00, 0x41, 0x4c, 0x46, 0x84, 0x42, 0xd5, 0xf8, 0x0d, 0x43, 0x4d, 0x84, 0x00, 0x41, 0x03, 0x29, 0x87, 0x42, 0xb1, 0xf2, 0x0b, 0x43, 0x75, 0x54, 0xf7, 0x40, 0x03, 0x29, 0x87, 0x42, +0xb1, 0xf2, 0x0b, 0x43, 0x75, 0x54, 0xf7, 0x40, 0x55, 0x30, 0x89, 0x42, 0x73, 0xc8, 0x09, 0x43, 0xa2, 0x23, 0xfe, 0x40, 0x54, 0x63, 0x80, 0x42, 0x50, 0x0d, 0x04, 0x43, 0x00, 0xef, 0x82, 0x41, 0x04, 0xc5, 0x82, 0x42, 0xb1, 0x52, 0x03, 0x43, 0x56, 0x7d, 0x70, 0x41, 0x54, 0x63, 0x80, 0x42, 0x50, 0x0d, 0x04, 0x43, 0x00, 0xef, 0x82, 0x41, 0x2b, 0x47, 0x7b, 0x42, 0x1b, 0x2f, 0x05, 0x43, 0x46, 0xb6, 0x8b, 0x41, 0x2c, 0xd4, 0x6c, 0x42, 0x29, 0x7c, 0x0b, 0x43, 0x97, 0x7f, 0x90, 0x41, +0xe1, 0xa9, 0x70, 0x42, 0x5c, 0x0f, 0x09, 0x43, 0xf6, 0xa8, 0x93, 0x41, 0x72, 0x39, 0x6b, 0x42, 0x1f, 0xc5, 0x0d, 0x43, 0x48, 0xbf, 0x86, 0x41, 0x2c, 0xd4, 0x6c, 0x42, 0x29, 0x7c, 0x0b, 0x43, 0x97, 0x7f, 0x90, 0x41, 0x2b, 0x47, 0x7b, 0x42, 0x1b, 0x2f, 0x05, 0x43, 0x46, 0xb6, 0x8b, 0x41, 0x17, 0xa6, 0x75, 0x42, 0x13, 0xe3, 0x06, 0x43, 0xed, 0x8d, 0x91, 0x41, 0xe1, 0xa9, 0x70, 0x42, 0x5c, 0x0f, 0x09, 0x43, 0xf6, 0xa8, 0x93, 0x41, 0x17, 0xa6, 0x75, 0x42, 0x13, 0xe3, 0x06, 0x43, +0xed, 0x8d, 0x91, 0x41, 0x41, 0xd1, 0x84, 0x42, 0x09, 0x0c, 0x03, 0x43, 0xda, 0xce, 0x59, 0x41, 0xdf, 0x9e, 0x86, 0x42, 0x9e, 0x4f, 0x03, 0x43, 0x2e, 0xff, 0x42, 0x41, 0x04, 0xc5, 0x82, 0x42, 0xb1, 0x52, 0x03, 0x43, 0x56, 0x7d, 0x70, 0x41, 0x41, 0xd1, 0x84, 0x42, 0x09, 0x0c, 0x03, 0x43, 0xda, 0xce, 0x59, 0x41, 0x72, 0x39, 0x6b, 0x42, 0x1f, 0xc5, 0x0d, 0x43, 0x48, 0xbf, 0x86, 0x41, 0x16, 0x2a, 0x6c, 0x42, 0x6f, 0x92, 0x0f, 0x43, 0x4f, 0xaf, 0x72, 0x41, 0x4b, 0x99, 0x6f, 0x42, +0x84, 0xa0, 0x10, 0x43, 0xee, 0x5a, 0x53, 0x41, 0x16, 0x2a, 0x6c, 0x42, 0x6f, 0x92, 0x0f, 0x43, 0x4f, 0xaf, 0x72, 0x41, 0x09, 0x2a, 0x88, 0x42, 0x63, 0x30, 0x04, 0x43, 0x96, 0x43, 0x2d, 0x41, 0x95, 0x63, 0x89, 0x42, 0x6f, 0xb2, 0x05, 0x43, 0xcf, 0x14, 0x1a, 0x41, 0xdf, 0x9e, 0x86, 0x42, 0x9e, 0x4f, 0x03, 0x43, 0x2e, 0xff, 0x42, 0x41, 0x09, 0x2a, 0x88, 0x42, 0x63, 0x30, 0x04, 0x43, 0x96, 0x43, 0x2d, 0x41, 0x4b, 0x99, 0x6f, 0x42, 0x84, 0xa0, 0x10, 0x43, 0xee, 0x5a, 0x53, 0x41, +0x94, 0x98, 0x74, 0x42, 0x59, 0xf9, 0x10, 0x43, 0x13, 0xd0, 0x36, 0x41, 0x2b, 0xb6, 0x7a, 0x42, 0xb1, 0x92, 0x10, 0x43, 0xe3, 0x36, 0x20, 0x41, 0x94, 0x98, 0x74, 0x42, 0x59, 0xf9, 0x10, 0x43, 0x13, 0xd0, 0x36, 0x41, 0xdb, 0xe8, 0x89, 0x42, 0xbf, 0x9f, 0x07, 0x43, 0x63, 0xdd, 0x09, 0x41, 0x55, 0x30, 0x89, 0x42, 0x73, 0xc8, 0x09, 0x43, 0xa2, 0x23, 0xfe, 0x40, 0x95, 0x63, 0x89, 0x42, 0x6f, 0xb2, 0x05, 0x43, 0xcf, 0x14, 0x1a, 0x41, 0xdb, 0xe8, 0x89, 0x42, 0xbf, 0x9f, 0x07, 0x43, +0x63, 0xdd, 0x09, 0x41, 0x2b, 0xb6, 0x7a, 0x42, 0xb1, 0x92, 0x10, 0x43, 0xe3, 0x36, 0x20, 0x41, 0x94, 0xc7, 0x80, 0x42, 0xb5, 0x88, 0x0f, 0x43, 0xc1, 0xd6, 0x0d, 0x41, 0x4c, 0x46, 0x84, 0x42, 0xd5, 0xf8, 0x0d, 0x43, 0x4d, 0x84, 0x00, 0x41, 0x94, 0xc7, 0x80, 0x42, 0xb5, 0x88, 0x0f, 0x43, 0xc1, 0xd6, 0x0d, 0x41, 0x4c, 0x46, 0x84, 0x42, 0xd5, 0xf8, 0x0d, 0x43, 0x4d, 0x84, 0x00, 0x41, 0x03, 0x29, 0x87, 0x42, 0xb1, 0xf2, 0x0b, 0x43, 0x75, 0x54, 0xf7, 0x40, 0x55, 0x30, 0x89, 0x42, +0x73, 0xc8, 0x09, 0x43, 0xa2, 0x23, 0xfe, 0x40, 0x03, 0x29, 0x87, 0x42, 0xb1, 0xf2, 0x0b, 0x43, 0x75, 0x54, 0xf7, 0x40, 0xd2, 0x7e, 0x8f, 0x42, 0x67, 0x06, 0x02, 0x43, 0xad, 0x12, 0x19, 0x41, 0xee, 0x0b, 0x91, 0x42, 0xa6, 0xfb, 0x04, 0x43, 0xd6, 0xa8, 0xd6, 0x40, 0x1c, 0x9c, 0x8c, 0x42, 0xaa, 0x31, 0x00, 0x43, 0x14, 0xae, 0x4b, 0x41, 0x43, 0x3c, 0x90, 0x42, 0xeb, 0x51, 0x08, 0x43, 0x55, 0xbc, 0x98, 0x40, 0x73, 0xc6, 0x8d, 0x42, 0x75, 0xb3, 0x0b, 0x43, 0x12, 0xa0, 0x78, 0x40, +0x1c, 0x6b, 0x79, 0x42, 0x32, 0x28, 0x03, 0x43, 0x65, 0x08, 0xb6, 0x41, 0x3c, 0x2c, 0x6d, 0x42, 0x75, 0x33, 0x06, 0x43, 0xd7, 0x92, 0xbe, 0x41, 0xf5, 0x4a, 0x65, 0x42, 0x02, 0x2b, 0x0a, 0x43, 0x98, 0xcc, 0xc3, 0x41, 0x03, 0x29, 0x82, 0x42, 0xe8, 0x5b, 0x15, 0x43, 0xa4, 0x19, 0xbf, 0x40, 0xa5, 0xbd, 0x7a, 0x42, 0x34, 0x93, 0x17, 0x43, 0xdc, 0x9d, 0x02, 0x41, 0x03, 0xc9, 0x86, 0x42, 0x6d, 0x47, 0x12, 0x43, 0xa7, 0x3a, 0x8d, 0x40, 0xe8, 0x08, 0x60, 0x42, 0xb7, 0x53, 0x13, 0x43, +0x8e, 0x97, 0xad, 0x41, 0x9a, 0xc8, 0x63, 0x42, 0xb5, 0x68, 0x16, 0x43, 0x82, 0x51, 0x94, 0x41, 0x5a, 0x24, 0x6a, 0x42, 0xea, 0x26, 0x18, 0x43, 0x9c, 0xa2, 0x6c, 0x41, 0x6d, 0x85, 0x60, 0x42, 0x6f, 0xf2, 0x0e, 0x43, 0xa7, 0x57, 0xbe, 0x41, 0x25, 0xd5, 0x86, 0x42, 0xf8, 0x33, 0x00, 0x43, 0xea, 0x95, 0x94, 0x41, 0x50, 0x6d, 0x82, 0x42, 0x73, 0x48, 0x01, 0x43, 0xee, 0xeb, 0xa7, 0x41, 0x93, 0xe9, 0x89, 0x42, 0xe6, 0x90, 0xff, 0x42, 0xe2, 0xc7, 0x7c, 0x41, 0xfc, 0x98, 0x8a, 0x42, +0xee, 0xfc, 0x0e, 0x43, 0x83, 0x86, 0x6c, 0x40, 0x22, 0x30, 0x72, 0x42, 0x29, 0x9c, 0x18, 0x43, 0x15, 0xfb, 0x32, 0x41, 0x88, 0x34, 0x91, 0x42, 0xcc, 0x21, 0xff, 0x42, 0x62, 0x9c, 0x07, 0x41, 0x17, 0xe8, 0x91, 0x42, 0x42, 0xa0, 0x03, 0x43, 0xd8, 0xb6, 0x8a, 0x40, 0xe9, 0xb7, 0x8e, 0x42, 0x14, 0xae, 0xfa, 0x42, 0x26, 0xc2, 0x49, 0x41, 0x02, 0xcb, 0x90, 0x42, 0xd5, 0x18, 0x08, 0x43, 0x75, 0x3c, 0xda, 0x3f, 0xa6, 0xca, 0x8d, 0x42, 0xbb, 0x49, 0x0c, 0x43, 0xfb, 0xe8, 0x4c, 0x3f, +0x4b, 0x19, 0x62, 0x42, 0x30, 0x9d, 0x04, 0x43, 0x27, 0x8f, 0xdd, 0x41, 0x24, 0xa8, 0x71, 0x42, 0x29, 0x7c, 0x00, 0x43, 0xe2, 0xc7, 0xca, 0x41, 0x28, 0x6d, 0x55, 0x42, 0x36, 0x5e, 0x09, 0x43, 0xc1, 0xca, 0xe0, 0x41, 0x87, 0xc5, 0x7e, 0x42, 0x5d, 0xaf, 0x17, 0x43, 0x88, 0x9d, 0x45, 0x40, 0xc8, 0xb6, 0x70, 0x42, 0x3a, 0x74, 0x1a, 0x43, 0x47, 0xfe, 0xb4, 0x40, 0x46, 0xb4, 0x85, 0x42, 0xea, 0x26, 0x14, 0x43, 0x7c, 0xed, 0xc5, 0x3f, 0x88, 0x16, 0x50, 0x42, 0x4e, 0x02, 0x19, 0x43, +0xaa, 0x71, 0x97, 0x41, 0xf0, 0xd6, 0x49, 0x42, 0x2e, 0x52, 0x15, 0x43, 0xf0, 0xa7, 0xbb, 0x41, 0x2a, 0xe9, 0x59, 0x42, 0xa4, 0x30, 0x1b, 0x43, 0xfc, 0x87, 0x61, 0x41, 0xe5, 0x7f, 0x4c, 0x42, 0xdc, 0x39, 0x10, 0x43, 0x4f, 0xaf, 0xd6, 0x41, 0x2d, 0xf2, 0x7f, 0x42, 0x19, 0x04, 0xfd, 0x42, 0x8a, 0x1f, 0xb4, 0x41, 0xd9, 0x9d, 0x85, 0x42, 0x52, 0x38, 0xfb, 0x42, 0x6b, 0x1a, 0x9d, 0x41, 0xbe, 0x70, 0x8a, 0x42, 0xdc, 0x79, 0xfa, 0x42, 0xae, 0x47, 0x84, 0x41, 0xb3, 0x1b, 0x8a, 0x42, +0x27, 0x51, 0x10, 0x43, 0x78, 0x63, 0x31, 0x3f, 0xf3, 0xdf, 0x64, 0x42, 0x38, 0xa9, 0x1b, 0x43, 0x63, 0xfa, 0x18, 0x41, 0xf6, 0xe8, 0x93, 0x42, 0x3c, 0xdf, 0x01, 0x43, 0x00, 0xc5, 0x74, 0x3f, 0xf7, 0xa4, 0x93, 0x42, 0x1d, 0x1a, 0xf8, 0x42, 0xba, 0x66, 0xdc, 0x40, 0x50, 0xdc, 0x91, 0x42, 0x98, 0x6e, 0x07, 0x43, 0x75, 0x3c, 0x50, 0xc0, 0xf3, 0x3f, 0x8e, 0x42, 0xee, 0x3c, 0x0c, 0x43, 0x80, 0xcf, 0x77, 0xc0, 0x4c, 0xd7, 0x97, 0x42, 0xd4, 0x0d, 0xeb, 0x42, 0x2f, 0xd1, 0x16, 0xc1, +0x2c, 0x54, 0x98, 0x42, 0xde, 0x24, 0xe9, 0x42, 0x9e, 0x4d, 0x0d, 0xc1, 0x35, 0xed, 0x95, 0x42, 0x24, 0x1b, 0xe9, 0x42, 0xbd, 0xd2, 0x1b, 0xc1, 0x75, 0xf1, 0x97, 0x42, 0xf2, 0x12, 0xe8, 0x42, 0xf1, 0xc6, 0x1e, 0xc1, 0x78, 0x2b, 0x96, 0x42, 0x65, 0xbb, 0xe8, 0x42, 0x0a, 0xa9, 0x10, 0xc1, 0x44, 0x5a, 0x95, 0x42, 0xb7, 0x73, 0xea, 0x42, 0x38, 0xd6, 0x54, 0xc1, 0x45, 0xd6, 0x96, 0x42, 0x96, 0xc3, 0xe7, 0x42, 0x27, 0xa0, 0x5d, 0xc1, 0x59, 0x15, 0x94, 0x42, 0x63, 0x50, 0xea, 0x42, +0x11, 0x47, 0x81, 0xc1, 0x15, 0xbb, 0x95, 0x42, 0x42, 0xa0, 0xe7, 0x42, 0xff, 0x32, 0x83, 0xc1, 0x2a, 0x69, 0x97, 0x42, 0x3e, 0xca, 0xe7, 0x42, 0xa7, 0x57, 0x3b, 0xc1, 0x9d, 0x80, 0x95, 0x42, 0x85, 0xeb, 0xe9, 0x42, 0x03, 0x09, 0x34, 0xc1, 0xfc, 0x18, 0x98, 0x42, 0x42, 0xe0, 0xee, 0x42, 0x30, 0x99, 0x4a, 0xc1, 0xee, 0x7c, 0x97, 0x42, 0xc9, 0x76, 0xed, 0x42, 0x06, 0xf0, 0x2d, 0xc1, 0x33, 0xa4, 0x9b, 0x42, 0xda, 0x0e, 0xf3, 0x42, 0x40, 0x24, 0x8b, 0xc1, 0x94, 0x98, 0x9d, 0x42, +0x57, 0x0e, 0xf3, 0x42, 0xd7, 0x81, 0x5a, 0xc1, 0x59, 0x17, 0x96, 0x42, 0xf2, 0x52, 0xee, 0x42, 0xfa, 0x7e, 0x83, 0xc1, 0x66, 0x57, 0x9c, 0x42, 0x52, 0x38, 0xfe, 0x42, 0x1d, 0xac, 0x8e, 0xc0, 0xad, 0x38, 0x99, 0x42, 0x71, 0xfd, 0xfe, 0x42, 0xe4, 0x0f, 0x74, 0xc0, 0xc6, 0xed, 0x99, 0x42, 0xf7, 0x68, 0xf4, 0x42, 0xbb, 0x5c, 0x3c, 0x40, 0xf9, 0x40, 0x97, 0x42, 0xc9, 0xb6, 0xf3, 0x42, 0xbe, 0x0e, 0x6a, 0x40, 0x59, 0xf9, 0x95, 0x42, 0xb3, 0x9d, 0xf1, 0x42, 0x5d, 0x68, 0xc6, 0x40, +0x9c, 0x73, 0x96, 0x42, 0x47, 0x61, 0x00, 0x43, 0x4b, 0x59, 0x30, 0xc0, 0xa3, 0x01, 0x91, 0x42, 0x2e, 0x72, 0xd8, 0x42, 0xdc, 0x11, 0x06, 0xc0, 0x05, 0x16, 0x92, 0x42, 0x01, 0xc0, 0xd5, 0x42, 0x5f, 0x07, 0x25, 0xc1, 0xfb, 0xab, 0x97, 0x42, 0x63, 0x50, 0xd8, 0x42, 0xdd, 0x93, 0x8e, 0xc0, 0x35, 0xbe, 0x97, 0x42, 0x0f, 0xad, 0xd6, 0x42, 0x44, 0xfa, 0x2f, 0xc1, 0xba, 0x69, 0x96, 0x42, 0xcd, 0x0c, 0xd5, 0x42, 0x17, 0x37, 0x82, 0xc1, 0xe4, 0xa3, 0x90, 0x42, 0x21, 0xf0, 0xd3, 0x42, +0xc1, 0x39, 0x74, 0xc1, 0x05, 0x16, 0x92, 0x42, 0x01, 0xc0, 0xd5, 0x42, 0x5f, 0x07, 0x25, 0xc1, 0x00, 0x4f, 0x97, 0x42, 0xfe, 0x74, 0x03, 0x43, 0xa1, 0x62, 0xed, 0xc0, 0x9c, 0x73, 0x96, 0x42, 0x47, 0x61, 0x00, 0x43, 0x4b, 0x59, 0x30, 0xc0, 0xc8, 0x96, 0x94, 0x42, 0x79, 0xc9, 0x03, 0x43, 0xe9, 0xd4, 0xda, 0xc0, 0x4b, 0x59, 0x94, 0x42, 0xde, 0xc4, 0x06, 0x43, 0x3e, 0x57, 0x3f, 0xc1, 0xc8, 0x96, 0x94, 0x42, 0x79, 0xc9, 0x03, 0x43, 0xe9, 0xd4, 0xda, 0xc0, 0x8e, 0x04, 0x92, 0x42, +0x17, 0xb9, 0x06, 0x43, 0x8d, 0x06, 0x3a, 0xc1, 0x92, 0xfa, 0x97, 0x42, 0x0f, 0x2d, 0x06, 0x43, 0x1b, 0x0d, 0x47, 0xc1, 0xa8, 0x55, 0x9b, 0x42, 0x85, 0xeb, 0x02, 0x43, 0xb0, 0x1b, 0xff, 0xc0, 0x80, 0x88, 0xa3, 0x42, 0xf5, 0x3d, 0xff, 0x42, 0xea, 0x3e, 0xbd, 0xc0, 0xdc, 0xe6, 0x9f, 0x42, 0x19, 0xc4, 0xfe, 0x42, 0x9d, 0x0c, 0xa4, 0xc0, 0xf8, 0x31, 0xa3, 0x42, 0xfb, 0xbe, 0xf5, 0x42, 0x86, 0x1f, 0x54, 0x3f, 0xff, 0x30, 0x9f, 0x42, 0xe6, 0x90, 0xf5, 0x42, 0x65, 0x88, 0xff, 0x3f, +0x09, 0xd9, 0x98, 0x42, 0x5f, 0xba, 0xea, 0x42, 0x57, 0xe7, 0xef, 0x40, 0x48, 0xff, 0x9e, 0x42, 0xe0, 0x4f, 0xeb, 0x42, 0x21, 0x59, 0xd7, 0x40, 0xdd, 0x44, 0x99, 0x42, 0xf7, 0x68, 0xf0, 0x42, 0x18, 0x78, 0xc2, 0x40, 0x37, 0x38, 0x9f, 0x42, 0x52, 0xb8, 0xf0, 0x42, 0xa2, 0x5d, 0x9c, 0x40, 0x1a, 0x60, 0xa4, 0x42, 0xd6, 0x38, 0xea, 0x42, 0xc1, 0x51, 0x95, 0x40, 0x8d, 0xc8, 0xa4, 0x42, 0x3c, 0xdf, 0xef, 0x42, 0x00, 0x00, 0x52, 0x40, 0xf6, 0x17, 0x9f, 0x42, 0x2a, 0x9c, 0xe4, 0x42, +0x1d, 0x03, 0xbd, 0x40, 0x5d, 0x5c, 0x99, 0x42, 0x0b, 0x17, 0xe4, 0x42, 0x97, 0x51, 0xe6, 0x40, 0x20, 0xb2, 0x9c, 0x42, 0x28, 0xf1, 0xd8, 0x42, 0x9d, 0x9d, 0xb9, 0xc0, 0x7c, 0x10, 0x9e, 0x42, 0x19, 0x04, 0xdc, 0x42, 0x5c, 0x72, 0xd4, 0x3f, 0xe6, 0xdf, 0x98, 0x42, 0x84, 0xc0, 0xdb, 0x42, 0xa8, 0xa4, 0x58, 0x40, 0x22, 0xec, 0xa2, 0x42, 0xd4, 0xcd, 0xdd, 0x42, 0x0c, 0x01, 0x98, 0xbe, 0x82, 0x73, 0xa1, 0x42, 0xec, 0x91, 0xd9, 0x42, 0xd5, 0x21, 0xe4, 0xc0, 0x8d, 0x06, 0x9c, 0x42, +0x1f, 0x45, 0xd7, 0x42, 0x6d, 0x56, 0x40, 0xc1, 0xda, 0x3b, 0xa0, 0x42, 0xe8, 0x3b, 0xd8, 0x42, 0x09, 0xf9, 0x59, 0xc1, 0x05, 0xb2, 0x9a, 0x42, 0x51, 0xcd, 0xd5, 0x42, 0x51, 0x49, 0x87, 0xc1, 0x0f, 0xba, 0x9f, 0x42, 0xb3, 0x9d, 0xd6, 0x42, 0xd9, 0x3d, 0x8d, 0xc1, 0x82, 0xb1, 0x9b, 0x42, 0x63, 0x90, 0x05, 0x43, 0x2d, 0x21, 0x4f, 0xc1, 0xb8, 0x0d, 0x9f, 0x42, 0x0d, 0xc2, 0x02, 0x43, 0x07, 0xa5, 0x07, 0xc1, 0x0d, 0x40, 0xa0, 0x42, 0x8e, 0xd7, 0x04, 0x43, 0xe8, 0x48, 0x59, 0xc1, +0x92, 0xab, 0xa2, 0x42, 0x6b, 0x9c, 0x02, 0x43, 0x13, 0xfe, 0x10, 0xc1, 0xd7, 0x03, 0xa7, 0x42, 0xb9, 0x5e, 0xeb, 0x42, 0x32, 0xfe, 0x1d, 0x40, 0x4c, 0xf7, 0xa6, 0x42, 0x4a, 0x4c, 0xe8, 0x42, 0x18, 0x3e, 0x28, 0x40, 0x90, 0x00, 0xa6, 0x42, 0x51, 0x0d, 0xe4, 0x42, 0x4b, 0x3c, 0x60, 0x40, 0xb0, 0xc1, 0xb4, 0x42, 0x9c, 0x44, 0xdd, 0x42, 0xdb, 0x85, 0x12, 0xc1, 0xa2, 0x85, 0xb7, 0x42, 0x11, 0x58, 0xd9, 0x42, 0x19, 0x04, 0x62, 0xc1, 0x80, 0x57, 0xb6, 0x42, 0x96, 0x83, 0xe0, 0x42, +0xc9, 0xe5, 0x21, 0xc1, 0x29, 0xda, 0xb8, 0x42, 0x82, 0x15, 0xde, 0x42, 0xcf, 0xd5, 0x6c, 0xc1, 0xa2, 0x85, 0xb2, 0x42, 0xc1, 0xca, 0xd7, 0x42, 0x1e, 0x85, 0x4c, 0xc1, 0x80, 0xb7, 0xb1, 0x42, 0x40, 0x35, 0xda, 0x42, 0x8a, 0x59, 0x14, 0xc1, 0xd1, 0x40, 0xb8, 0x42, 0x2c, 0xc7, 0xdb, 0x42, 0x96, 0x10, 0x90, 0xc1, 0xa9, 0xa2, 0xb6, 0x42, 0xb5, 0x88, 0xd6, 0x42, 0x63, 0x6e, 0x8d, 0xc1, 0xfd, 0xc5, 0xb6, 0x42, 0xfd, 0xe9, 0xda, 0x42, 0x76, 0xcf, 0xa8, 0xc1, 0xbe, 0xf0, 0xb4, 0x42, +0x4e, 0x22, 0xd6, 0x42, 0x7c, 0xe1, 0xa5, 0xc1, 0xa6, 0x99, 0xb0, 0x42, 0xf8, 0x53, 0xd4, 0x42, 0xa8, 0xa4, 0xa0, 0xc1, 0xdd, 0xf3, 0xb1, 0x42, 0xff, 0x54, 0xd5, 0x42, 0xc8, 0xf6, 0x85, 0xc1, 0x92, 0xcb, 0xbc, 0x42, 0x25, 0x66, 0x0a, 0x43, 0x6c, 0x67, 0x89, 0xc1, 0x60, 0xb4, 0xbc, 0x42, 0xd3, 0xcd, 0x07, 0x43, 0xee, 0xeb, 0x35, 0xc1, 0x61, 0x32, 0xc0, 0x42, 0xfc, 0xc9, 0x08, 0x43, 0x98, 0xdd, 0x8b, 0xc1, 0x1c, 0x5c, 0xc0, 0x42, 0x79, 0x09, 0x06, 0x43, 0xb7, 0xd1, 0x37, 0xc1, +0xdd, 0xc4, 0xbb, 0x42, 0x1f, 0xa5, 0x03, 0x43, 0x3f, 0x8c, 0xee, 0xc0, 0xb1, 0xce, 0xbe, 0x42, 0xea, 0x66, 0x01, 0x43, 0xd4, 0x9a, 0xf2, 0xc0, 0xe4, 0x65, 0x9e, 0x42, 0x44, 0xcb, 0xe8, 0x42, 0x6b, 0xf1, 0xf7, 0xc0, 0x73, 0xf7, 0x9d, 0x42, 0x69, 0x51, 0xed, 0x42, 0xbb, 0x61, 0x15, 0xc1, 0x89, 0xf0, 0xa3, 0x42, 0x7a, 0x69, 0xeb, 0x42, 0xd6, 0x6e, 0xd2, 0xc0, 0x56, 0xae, 0xa4, 0x42, 0x73, 0x28, 0xef, 0x42, 0x40, 0x41, 0x14, 0xc1, 0xe3, 0xc5, 0xa4, 0x42, 0x82, 0x95, 0xe7, 0x42, +0x81, 0x95, 0x59, 0xc0, 0x3b, 0x3f, 0xa3, 0x42, 0x51, 0x0d, 0xe8, 0x42, 0x13, 0xed, 0xab, 0xc0, 0x22, 0x8c, 0x9c, 0x42, 0xc7, 0x8b, 0xe7, 0x42, 0x65, 0xaa, 0x1c, 0xc1, 0xbf, 0xae, 0xa1, 0x42, 0xee, 0xbc, 0xe6, 0x42, 0x83, 0x75, 0x1a, 0xc1, 0x15, 0xbd, 0x9f, 0x42, 0x6b, 0xfc, 0xe4, 0x42, 0x5d, 0x4b, 0x6e, 0xc1, 0xfe, 0xd4, 0x9a, 0x42, 0xc5, 0x20, 0xe6, 0x42, 0x9b, 0x55, 0x66, 0xc1, 0x5b, 0xa2, 0xa0, 0x42, 0x48, 0xa1, 0xe5, 0x42, 0x39, 0xb4, 0x47, 0xc1, 0x84, 0x9e, 0x9b, 0x42, +0xaf, 0x87, 0xe6, 0x42, 0x51, 0x49, 0x41, 0xc1, 0x30, 0xaa, 0x99, 0x42, 0x55, 0xe3, 0xe5, 0x42, 0x77, 0xad, 0x87, 0xc1, 0x23, 0x99, 0x9e, 0x42, 0x0b, 0x97, 0xe4, 0x42, 0xdc, 0x46, 0x8d, 0xc1, 0xf3, 0x5d, 0xa6, 0x42, 0x01, 0xc0, 0xf6, 0x42, 0x7d, 0xe6, 0x10, 0xbf, 0x0c, 0x13, 0xa7, 0x42, 0x8f, 0x02, 0x00, 0x43, 0x9f, 0x1f, 0xd9, 0xc0, 0x86, 0xa7, 0xa9, 0x42, 0xc2, 0x35, 0x01, 0x43, 0xd4, 0x60, 0xef, 0xc0, 0x66, 0x86, 0xaa, 0x42, 0x8c, 0x2c, 0xf9, 0x42, 0x96, 0xca, 0xe7, 0xbf, +0x0c, 0x13, 0xa7, 0x42, 0xc1, 0xca, 0xe9, 0x42, 0x58, 0x39, 0x46, 0xc0, 0x7b, 0x43, 0xa8, 0x42, 0x5b, 0x24, 0xed, 0x42, 0x65, 0x8d, 0xcb, 0xc0, 0x7d, 0x7d, 0xab, 0x42, 0xad, 0x9c, 0xeb, 0x42, 0x8b, 0xa6, 0x61, 0xc0, 0x86, 0x89, 0xac, 0x42, 0x42, 0xa0, 0xee, 0x42, 0x0a, 0x11, 0xd5, 0xc0, 0x4a, 0x8a, 0xa9, 0x42, 0x3a, 0xf4, 0xf0, 0x42, 0x9c, 0xf9, 0x15, 0xc1, 0x7a, 0xa5, 0xad, 0x42, 0xf9, 0xd3, 0xf2, 0x42, 0x41, 0x71, 0x18, 0xc1, 0xb5, 0xc6, 0xa6, 0x42, 0x69, 0x11, 0xea, 0x42, +0xf9, 0x49, 0xa5, 0xbe, 0x56, 0x6e, 0xab, 0x42, 0xc5, 0xa0, 0xeb, 0x42, 0x0f, 0x97, 0x8c, 0xbf, 0x0d, 0xc0, 0xa5, 0x42, 0xe6, 0x50, 0xe7, 0x42, 0x88, 0x65, 0x0b, 0xbf, 0xcd, 0xaa, 0xa5, 0x42, 0x48, 0x21, 0xe8, 0x42, 0x10, 0x58, 0x79, 0xbe, 0x40, 0x13, 0xa8, 0x42, 0xb8, 0x9e, 0xec, 0x42, 0xe7, 0xde, 0x9f, 0x3f, 0xc4, 0xd1, 0xab, 0x42, 0xa3, 0xc5, 0xed, 0x42, 0xf2, 0x7c, 0xa6, 0x3e, 0x74, 0x24, 0xaa, 0x42, 0x34, 0x73, 0xf6, 0x42, 0xfa, 0xed, 0x3d, 0xc1, 0x11, 0xf6, 0xa4, 0x42, +0x99, 0x19, 0xf4, 0x42, 0x2b, 0x87, 0x39, 0xc1, 0x84, 0x3c, 0xae, 0x42, 0x5d, 0xcf, 0xf8, 0x42, 0x5f, 0x07, 0x40, 0xc1, 0x8c, 0x4a, 0xa9, 0x42, 0xb5, 0x08, 0xf8, 0x42, 0x4a, 0x7b, 0x72, 0xc1, 0xf2, 0xe1, 0xac, 0x42, 0xeb, 0xd1, 0xf9, 0x42, 0x7d, 0xae, 0x79, 0xc1, 0x67, 0xf3, 0xa4, 0x42, 0x1e, 0x05, 0xf6, 0x42, 0x3c, 0x2c, 0x68, 0xc1, 0x61, 0xa3, 0xb1, 0x42, 0x67, 0x46, 0x00, 0x43, 0xe6, 0x22, 0x92, 0xc0, 0x4d, 0x64, 0xb4, 0x42, 0x40, 0xb5, 0x02, 0x43, 0xc9, 0xe5, 0xce, 0xc0, +0xe4, 0x65, 0xae, 0x42, 0xa8, 0xc6, 0x03, 0x43, 0xfb, 0x91, 0x12, 0xc1, 0x26, 0x33, 0xb0, 0x42, 0xa0, 0x3a, 0x05, 0x43, 0xe3, 0x36, 0x23, 0xc1, 0xd1, 0x80, 0xb1, 0x42, 0x7f, 0x6a, 0x06, 0x43, 0x26, 0xc2, 0x31, 0xc1, 0xc3, 0x64, 0xb6, 0x42, 0x44, 0x6b, 0x05, 0x43, 0x7e, 0x29, 0x10, 0xc1, 0x53, 0x94, 0xb8, 0x42, 0xd2, 0xa2, 0xf7, 0x42, 0x20, 0x7b, 0xe6, 0xc0, 0x30, 0x9d, 0xb7, 0x42, 0xfd, 0xa9, 0xf8, 0x42, 0xb1, 0x8a, 0x10, 0xc1, 0xc4, 0x80, 0xbc, 0x42, 0x65, 0xfb, 0xfd, 0x42, +0x29, 0x05, 0x1a, 0xc1, 0x23, 0xd9, 0xba, 0x42, 0xd7, 0xa3, 0xfd, 0x42, 0x5e, 0x4b, 0x2e, 0xc1, 0xd8, 0x21, 0xb7, 0x42, 0x9a, 0x99, 0xfa, 0x42, 0x20, 0xd2, 0x30, 0xc1, 0xf4, 0x8c, 0xb9, 0x42, 0x0f, 0xad, 0xfd, 0x42, 0x03, 0x09, 0x3e, 0xc1, 0xad, 0xe9, 0xb3, 0x42, 0x7e, 0x3f, 0xf7, 0x42, 0xd5, 0x78, 0x24, 0xc1, 0xf9, 0xe0, 0xb3, 0x42, 0x00, 0x80, 0xf4, 0x42, 0x9a, 0xce, 0xfc, 0xc0, 0x5a, 0x33, 0xb4, 0x42, 0x98, 0xae, 0xf2, 0x42, 0x75, 0x3c, 0xb9, 0xc0, 0x11, 0xf6, 0xb4, 0x42, +0x03, 0xeb, 0xf2, 0x42, 0x19, 0xca, 0x81, 0xc0, 0xcb, 0xf0, 0xb9, 0x42, 0x11, 0x18, 0xf8, 0x42, 0xc4, 0xe6, 0xb2, 0xc0, 0x27, 0xa0, 0xb5, 0x42, 0x6f, 0x12, 0xf5, 0x42, 0x72, 0xf9, 0x3b, 0xc0, 0x9c, 0xe2, 0xba, 0x42, 0x4d, 0xb7, 0xfa, 0x42, 0xcd, 0xc7, 0x91, 0xc0, 0x7e, 0x1b, 0xbe, 0x42, 0xd6, 0xb8, 0xff, 0x42, 0x30, 0xbb, 0x06, 0xc1, 0xa1, 0x36, 0xad, 0x42, 0x17, 0x99, 0x05, 0x43, 0xf7, 0x75, 0x38, 0xc1, 0xc0, 0x1b, 0xaf, 0x42, 0x32, 0xc8, 0x06, 0x43, 0xb6, 0xf3, 0x44, 0xc1, +0x5b, 0xe4, 0xab, 0x42, 0xa2, 0x05, 0x06, 0x43, 0x10, 0xe9, 0x75, 0xc1, 0xdf, 0xbe, 0xad, 0x42, 0xa6, 0x1b, 0x07, 0x43, 0xec, 0x9e, 0x7d, 0xc1, 0x32, 0x24, 0xb1, 0x42, 0x1d, 0xda, 0x07, 0x43, 0x42, 0xcf, 0x4e, 0xc1, 0xe8, 0x0a, 0xb0, 0x42, 0xb7, 0x53, 0x08, 0x43, 0x48, 0x3f, 0x83, 0xc1, 0xbb, 0xc9, 0xb6, 0x42, 0xb3, 0x9d, 0xff, 0x42, 0x80, 0xb7, 0x54, 0xc1, 0x32, 0xa4, 0xb3, 0x42, 0x15, 0xee, 0xfc, 0x42, 0xf8, 0x31, 0x4a, 0xc1, 0xca, 0xd2, 0xb9, 0x42, 0x27, 0xd1, 0x00, 0x43, +0x52, 0x96, 0x5e, 0xc1, 0x4d, 0xf3, 0xb5, 0x42, 0x5f, 0x7a, 0x00, 0x43, 0xa6, 0x1b, 0x87, 0xc1, 0xec, 0xaf, 0xb9, 0x42, 0x9c, 0x04, 0x02, 0x43, 0x51, 0x49, 0x8c, 0xc1, 0xea, 0x95, 0xb2, 0x42, 0xb1, 0xf2, 0xfd, 0x42, 0xee, 0xda, 0x82, 0xc1, 0xb5, 0x15, 0xb7, 0x42, 0x86, 0x8b, 0x08, 0x43, 0x46, 0x25, 0x44, 0xc1, 0xdf, 0x9e, 0xb6, 0x42, 0xfe, 0x94, 0x0a, 0x43, 0xc9, 0x76, 0x87, 0xc1, 0x9e, 0x2d, 0xbc, 0x42, 0xc9, 0x76, 0x01, 0x43, 0x82, 0x51, 0x5d, 0xc1, 0x42, 0xbe, 0xbc, 0x42, +0x07, 0x41, 0x03, 0x43, 0xed, 0x8d, 0x8f, 0xc1, 0xaf, 0x14, 0xbe, 0x42, 0x11, 0x58, 0x02, 0x43, 0xa2, 0xb4, 0x54, 0xc1, 0xda, 0xca, 0xbe, 0x42, 0x96, 0xc3, 0x04, 0x43, 0xd4, 0x09, 0x8f, 0xc1, 0x1c, 0xdc, 0xa5, 0x42, 0xa2, 0x05, 0xda, 0x42, 0x49, 0xcb, 0x05, 0xc1, 0x96, 0x61, 0xa7, 0x42, 0xd7, 0x23, 0xde, 0x42, 0xda, 0xc9, 0x04, 0xc0, 0x78, 0x7a, 0xab, 0x42, 0x2e, 0x72, 0xdd, 0x42, 0xa5, 0xb8, 0x68, 0xc0, 0xd4, 0xa9, 0xa9, 0x42, 0x46, 0xb6, 0xd9, 0x42, 0xbd, 0x35, 0x1a, 0xc1, +0xc4, 0x62, 0xa7, 0x42, 0x69, 0xd1, 0xe3, 0x42, 0xfe, 0x47, 0xc6, 0x3d, 0x24, 0x57, 0xab, 0x42, 0x84, 0xc0, 0xe2, 0x42, 0x7c, 0xed, 0x05, 0xc0, 0xab, 0xed, 0xa7, 0x42, 0xa0, 0xda, 0xe5, 0x42, 0x87, 0xfc, 0x3b, 0xbf, 0xe9, 0x06, 0xac, 0x42, 0xf4, 0x7d, 0xe5, 0x42, 0x9b, 0x1b, 0x31, 0xc0, 0xc8, 0x47, 0xa7, 0x42, 0x09, 0x2c, 0xe7, 0x42, 0x5b, 0x5a, 0xc7, 0xc0, 0xf8, 0x73, 0xa6, 0x42, 0x78, 0x3e, 0xe6, 0x42, 0x9a, 0x77, 0x25, 0xc1, 0x9f, 0x5c, 0xaa, 0x42, 0x1f, 0x45, 0xe4, 0x42, +0xc1, 0x39, 0x59, 0xc1, 0x72, 0x79, 0xa5, 0x42, 0x6b, 0x3c, 0xe5, 0x42, 0xb6, 0x84, 0x50, 0xc1, 0x89, 0x10, 0xab, 0x42, 0xb3, 0x5d, 0xe5, 0x42, 0xd6, 0x34, 0x2c, 0xc1, 0x59, 0x75, 0xa4, 0x42, 0x3e, 0x4a, 0xd8, 0x42, 0xc6, 0x4b, 0x60, 0xc1, 0x5d, 0x4d, 0xa8, 0x42, 0xee, 0xfc, 0xd7, 0x42, 0xb9, 0xfc, 0x69, 0xc1, 0x65, 0xbb, 0xa3, 0x42, 0x3a, 0xf4, 0xd5, 0x42, 0x23, 0xdb, 0x91, 0xc1, 0xa4, 0x30, 0xa7, 0x42, 0xc5, 0x20, 0xd6, 0x42, 0x82, 0xd1, 0x95, 0xc1, 0x73, 0x86, 0xa4, 0x42, +0x4c, 0x37, 0xe4, 0x42, 0x65, 0x19, 0x76, 0xc1, 0x45, 0xa7, 0xa3, 0x42, 0x03, 0x6b, 0xe3, 0x42, 0xd4, 0x89, 0x92, 0xc1, 0xae, 0x56, 0xa9, 0x42, 0xf5, 0xa8, 0xe3, 0x42, 0x93, 0x29, 0x80, 0xc1, 0xf5, 0x39, 0xa8, 0x42, 0x09, 0xec, 0xe2, 0x42, 0x66, 0xe6, 0x97, 0xc1, 0x8d, 0x28, 0xad, 0x42, 0xf2, 0x52, 0xd8, 0x42, 0x72, 0xf9, 0x30, 0xc1, 0x4e, 0x20, 0xaf, 0x42, 0xde, 0x24, 0xdc, 0x42, 0xe1, 0x06, 0xcc, 0xc0, 0xeb, 0x51, 0xb0, 0x42, 0xc5, 0xa0, 0xe0, 0x42, 0x8c, 0x9c, 0xa6, 0xc0, +0xc4, 0x51, 0xb1, 0x42, 0x66, 0xe6, 0xe3, 0x42, 0xff, 0x95, 0xb4, 0xc0, 0xf8, 0x11, 0xb1, 0x42, 0xe0, 0xcf, 0xe3, 0x42, 0xa9, 0xc6, 0x65, 0xc1, 0xbf, 0x6e, 0xb0, 0x42, 0x03, 0x2b, 0xe4, 0x42, 0xd8, 0xf0, 0x33, 0xc1, 0x1c, 0xcb, 0xaa, 0x42, 0xdc, 0xf9, 0xd4, 0x42, 0x57, 0xec, 0x99, 0xc1, 0x1e, 0xe5, 0xab, 0x42, 0xc5, 0xe0, 0xd6, 0x42, 0x54, 0xc1, 0x75, 0xc1, 0xfe, 0x83, 0xb0, 0x42, 0x7a, 0xe9, 0xe2, 0x42, 0x66, 0xe6, 0x88, 0xc1, 0xe4, 0x32, 0xaf, 0x42, 0x11, 0x58, 0xe2, 0x42, +0x47, 0x83, 0xa0, 0xc1, 0xcd, 0x3b, 0xa6, 0x42, 0x30, 0x9d, 0x02, 0x43, 0x9f, 0x0e, 0x1d, 0xc1, 0x5d, 0xfc, 0xa8, 0x42, 0xcd, 0x6c, 0x03, 0x43, 0x49, 0x9d, 0x24, 0xc1, 0xed, 0x1c, 0xa4, 0x42, 0x54, 0x63, 0x04, 0x43, 0xa0, 0x89, 0x62, 0xc1, 0x6e, 0xe3, 0xa7, 0x42, 0x29, 0x7c, 0x04, 0x43, 0x9f, 0x3c, 0x6a, 0xc1, 0xf6, 0xc6, 0xaf, 0x42, 0x4f, 0xa2, 0xfb, 0x42, 0x60, 0x54, 0x7f, 0xc1, 0xee, 0x0b, 0xb1, 0x42, 0xfd, 0xa9, 0xfa, 0x42, 0xc1, 0xa8, 0x43, 0xc1, 0x5b, 0xf1, 0xb0, 0x42, +0xf2, 0xd2, 0xf4, 0x42, 0x5d, 0xa7, 0x1c, 0xc1, 0x65, 0x79, 0xb5, 0x42, 0xab, 0x31, 0xfa, 0x42, 0xc9, 0x59, 0x22, 0xc0, 0x84, 0x1e, 0xb1, 0x42, 0x9e, 0x6f, 0xf5, 0x42, 0x3e, 0x78, 0x7d, 0xbf, 0x82, 0xe2, 0xb0, 0x42, 0xc7, 0x4b, 0xf0, 0x42, 0xec, 0x51, 0x88, 0xbf, 0xbe, 0xff, 0xab, 0x42, 0x61, 0xa5, 0xf2, 0x42, 0xfd, 0x69, 0x0f, 0x3f, 0xfb, 0x6b, 0xae, 0x42, 0x3a, 0x74, 0xfc, 0x42, 0xb3, 0x24, 0x42, 0xc0, 0x45, 0x38, 0xac, 0x42, 0x1b, 0x6f, 0x02, 0x43, 0x36, 0x2b, 0x04, 0xc1, +0x43, 0xab, 0xaf, 0x42, 0x78, 0xbe, 0xed, 0x42, 0xd4, 0x9a, 0x8d, 0xc0, 0x48, 0x3f, 0xb0, 0x42, 0xd2, 0x22, 0xf1, 0x42, 0x42, 0x95, 0xe4, 0xc0, 0xd1, 0xd1, 0xb8, 0x42, 0xc3, 0x15, 0x00, 0x43, 0xe6, 0xe8, 0x8e, 0xc0, 0x36, 0x7c, 0xa7, 0x42, 0x01, 0x40, 0xf1, 0x42, 0xa2, 0x40, 0xe3, 0x3f, 0x01, 0xbc, 0x94, 0x42, 0x0b, 0x97, 0xea, 0x42, 0x7f, 0x2b, 0xfc, 0x40, 0x59, 0xf9, 0x95, 0x42, 0xb3, 0x9d, 0xf1, 0x42, 0x5d, 0x68, 0xc6, 0x40, 0x47, 0x52, 0xa0, 0x42, 0xa7, 0x9b, 0xe0, 0x42, +0x0c, 0xb0, 0x84, 0x40, 0x8e, 0x04, 0x92, 0x42, 0x17, 0xb9, 0x06, 0x43, 0x8d, 0x06, 0x3a, 0xc1, 0x61, 0x52, 0x8f, 0x42, 0x6b, 0x1c, 0x08, 0x43, 0x09, 0xf9, 0x7e, 0xc1, 0x12, 0xb4, 0x91, 0x42, 0x88, 0x76, 0x08, 0x43, 0xed, 0x9e, 0x83, 0xc1, 0xae, 0xb6, 0x94, 0x42, 0x0d, 0xe2, 0x07, 0x43, 0x08, 0xbd, 0x85, 0xc1, 0x01, 0x3e, 0x99, 0x42, 0x02, 0x2b, 0x07, 0x43, 0x8e, 0xe4, 0x8a, 0xc1, 0x15, 0xec, 0x9d, 0x42, 0x15, 0x4e, 0x06, 0x43, 0xf8, 0x31, 0x90, 0xc1, 0x59, 0x26, 0xa2, 0x42, +0x5c, 0x8f, 0x05, 0x43, 0xed, 0xfc, 0x94, 0xc1, 0xe2, 0xe7, 0xa5, 0x42, 0x42, 0x20, 0x05, 0x43, 0x5e, 0x4b, 0x99, 0xc1, 0x80, 0x48, 0xaa, 0x42, 0x30, 0x1d, 0x05, 0x43, 0xcf, 0xd5, 0x6f, 0xc1, 0x76, 0x40, 0xa8, 0x42, 0x5f, 0x7a, 0x05, 0x43, 0x99, 0x19, 0x9c, 0xc1, 0x4b, 0xd9, 0xa9, 0x42, 0x7d, 0x3f, 0x06, 0x43, 0x43, 0x1c, 0x9e, 0xc1, 0x94, 0x96, 0xab, 0x42, 0xd5, 0x38, 0x07, 0x43, 0xbd, 0x52, 0xa0, 0xc1, 0xe1, 0xfa, 0xad, 0x42, 0xda, 0xae, 0x08, 0x43, 0xbd, 0x63, 0xa3, 0xc1, +0x49, 0xfd, 0xb4, 0x42, 0xda, 0x6e, 0x0b, 0x43, 0x59, 0x17, 0xac, 0xc1, 0x35, 0x6d, 0xbb, 0x42, 0x6f, 0x72, 0x0b, 0x43, 0x08, 0x9b, 0xb3, 0xc1, 0x0f, 0x2d, 0xc0, 0x42, 0x94, 0xb8, 0x06, 0x43, 0xc2, 0x17, 0x8d, 0xc1, 0xc4, 0x31, 0xbf, 0x42, 0x48, 0x01, 0x08, 0x43, 0x5d, 0x5c, 0xb7, 0xc1, 0xb1, 0xff, 0xbe, 0x42, 0xe4, 0x05, 0x0a, 0x43, 0xaf, 0x83, 0xb7, 0xc1, 0x4f, 0xfe, 0xbd, 0x42, 0xcf, 0xf7, 0x05, 0x43, 0x40, 0x93, 0xb5, 0xc1, 0xb4, 0x97, 0xbb, 0x42, 0x81, 0x35, 0x04, 0x43, +0x75, 0x71, 0xb2, 0xc1, 0xe5, 0x30, 0xb8, 0x42, 0x38, 0x89, 0x02, 0x43, 0x2a, 0x29, 0xae, 0xc1, 0x41, 0x40, 0xb4, 0x42, 0xa0, 0x9a, 0x00, 0x43, 0x2d, 0x32, 0xa9, 0xc1, 0x44, 0xba, 0xb0, 0x42, 0xfd, 0xa9, 0xfd, 0x42, 0xec, 0xc0, 0xa4, 0xc1, 0x16, 0x0a, 0xae, 0x42, 0x55, 0x63, 0xfb, 0x42, 0x60, 0x65, 0xa1, 0xc1, 0xde, 0x51, 0xab, 0x42, 0x85, 0xeb, 0xf9, 0x42, 0x1e, 0x16, 0x9e, 0xc1, 0xf5, 0x8a, 0xa7, 0x42, 0x88, 0x56, 0xf8, 0x42, 0x8d, 0x86, 0x99, 0xc1, 0x4b, 0xe8, 0xa2, 0x42, +0xbf, 0x1f, 0xf6, 0x42, 0x72, 0xe8, 0x93, 0xc1, 0x7a, 0x45, 0xb7, 0x42, 0xf5, 0x28, 0xdf, 0x42, 0x69, 0x80, 0x8f, 0xc1, 0xc1, 0xca, 0xb7, 0x42, 0xd6, 0xf8, 0xe0, 0x42, 0x4c, 0xa6, 0x6e, 0xc1, 0x11, 0xd6, 0xb5, 0x42, 0x5b, 0x64, 0xde, 0x42, 0xd1, 0x11, 0xa8, 0xc1, 0x1d, 0x98, 0xa8, 0x42, 0xbb, 0x09, 0xe7, 0x42, 0xad, 0x12, 0x20, 0xc0, 0xab, 0xfe, 0xa5, 0x42, 0xd4, 0x8d, 0xe6, 0x42, 0x3f, 0x35, 0xe2, 0x3f, 0x9d, 0x8f, 0xac, 0x42, 0x42, 0x60, 0xe6, 0x42, 0x3f, 0x00, 0x90, 0xc0, +0x84, 0x80, 0xab, 0x42, 0x0d, 0x42, 0xe6, 0x42, 0x2d, 0x04, 0xea, 0xc0, 0xa6, 0x2a, 0xb1, 0x42, 0xea, 0xe6, 0xe4, 0x42, 0x37, 0x1a, 0xdf, 0xc0, 0xbd, 0x41, 0xaf, 0x42, 0x65, 0x3b, 0xe5, 0x42, 0x82, 0x28, 0x07, 0xc1, 0x64, 0x2a, 0xb0, 0x42, 0xb7, 0xf3, 0xed, 0x42, 0x09, 0xbf, 0x10, 0xc0, 0xba, 0xd8, 0xb5, 0x42, 0x61, 0x65, 0xe2, 0x42, 0x47, 0x03, 0x2d, 0xc1, 0xfb, 0xab, 0xbf, 0x42, 0x79, 0xe9, 0x03, 0x43, 0x3d, 0x0a, 0x47, 0xc1, 0x59, 0xf9, 0x95, 0x42, 0xb3, 0x9d, 0xf1, 0x42, +0x5d, 0x68, 0xc6, 0x40, 0x9e, 0x0d, 0x9d, 0x42, 0x6d, 0xe7, 0xf0, 0x42, 0x84, 0x0d, 0x36, 0xc1, 0x0a, 0x77, 0xab, 0x42, 0xa0, 0x7a, 0x04, 0x43, 0xbf, 0x7d, 0x2c, 0xc1, 0xb4, 0xa8, 0x8e, 0x42, 0x65, 0xbb, 0x09, 0x43, 0x24, 0x06, 0x7e, 0xc1, 0x19, 0xf3, 0x91, 0x42, 0xbb, 0x49, 0x08, 0x43, 0xe4, 0xf2, 0x2a, 0xc1, 0x61, 0x52, 0x8f, 0x42, 0x6b, 0x1c, 0x08, 0x43, 0x09, 0xf9, 0x7e, 0xc1, 0x8e, 0x04, 0x92, 0x42, 0x17, 0xb9, 0x06, 0x43, 0x8d, 0x06, 0x3a, 0xc1, 0xf2, 0x50, 0x94, 0x42, +0x5f, 0x1a, 0x05, 0x43, 0x88, 0xd7, 0xa8, 0xc0, 0xfb, 0x6b, 0x96, 0x42, 0x34, 0xd3, 0x00, 0x43, 0x22, 0x37, 0xb3, 0xbf, 0x61, 0x25, 0x96, 0x42, 0xfb, 0x3e, 0xf4, 0x42, 0x76, 0xc3, 0xc6, 0x40, 0x9c, 0x73, 0x96, 0x42, 0x47, 0x61, 0x00, 0x43, 0x4b, 0x59, 0x30, 0xc0, 0x59, 0xf9, 0x95, 0x42, 0xb3, 0x9d, 0xf1, 0x42, 0x5d, 0x68, 0xc6, 0x40, 0x88, 0x94, 0x94, 0x42, 0x65, 0x3b, 0xed, 0x42, 0x6e, 0x69, 0x0d, 0x41, 0x40, 0x04, 0x94, 0x42, 0x19, 0x44, 0xe4, 0x42, 0xbc, 0xc6, 0xff, 0x40, +0x5e, 0xeb, 0x92, 0x42, 0xab, 0xb1, 0xdc, 0x42, 0xe0, 0x62, 0x9d, 0x40, 0x71, 0xfd, 0x93, 0x42, 0x7b, 0x94, 0xe4, 0x42, 0xe7, 0xfb, 0xdf, 0x40, 0x78, 0x3a, 0x92, 0x42, 0x33, 0xb3, 0xdd, 0x42, 0x07, 0x08, 0x64, 0x40, 0xe8, 0xca, 0x8e, 0x42, 0xa0, 0x5a, 0xd0, 0x42, 0x26, 0xc2, 0x71, 0xc1, 0x82, 0x91, 0x91, 0x42, 0x96, 0xc3, 0xd2, 0x42, 0xae, 0x42, 0xe8, 0xc0, 0x79, 0xe9, 0x8a, 0x42, 0x3a, 0x74, 0xc9, 0x42, 0x1e, 0x85, 0x67, 0xc1, 0x01, 0xbc, 0x94, 0x42, 0x0b, 0x97, 0xea, 0x42, +0x7f, 0x2b, 0xfc, 0x40, 0x71, 0xfd, 0x93, 0x42, 0x7b, 0x94, 0xe4, 0x42, 0xe7, 0xfb, 0xdf, 0x40, 0xa3, 0x01, 0x91, 0x42, 0x2e, 0x72, 0xd8, 0x42, 0xdc, 0x11, 0x06, 0xc0, 0x78, 0x3a, 0x92, 0x42, 0x33, 0xb3, 0xdd, 0x42, 0x07, 0x08, 0x64, 0x40, 0xbd, 0xa3, 0x91, 0x42, 0x29, 0xdc, 0xd5, 0x42, 0x86, 0xc6, 0x77, 0xbf, 0x78, 0x3a, 0x92, 0x42, 0x33, 0xb3, 0xdd, 0x42, 0x07, 0x08, 0x64, 0x40, 0x71, 0xfd, 0x93, 0x42, 0x7b, 0x94, 0xe4, 0x42, 0xe7, 0xfb, 0xdf, 0x40, 0x05, 0x16, 0x92, 0x42, +0x01, 0xc0, 0xd5, 0x42, 0x5f, 0x07, 0x25, 0xc1, 0xe4, 0xa3, 0x90, 0x42, 0x21, 0xf0, 0xd3, 0x42, 0xc1, 0x39, 0x74, 0xc1, 0x8e, 0x04, 0x92, 0x42, 0x17, 0xb9, 0x06, 0x43, 0x8d, 0x06, 0x3a, 0xc1, 0xc8, 0x96, 0x94, 0x42, 0x79, 0xc9, 0x03, 0x43, 0xe9, 0xd4, 0xda, 0xc0, 0xc8, 0x96, 0x94, 0x42, 0x79, 0xc9, 0x03, 0x43, 0xe9, 0xd4, 0xda, 0xc0, 0x9c, 0x73, 0x96, 0x42, 0x47, 0x61, 0x00, 0x43, 0x4b, 0x59, 0x30, 0xc0, 0x59, 0xf9, 0x95, 0x42, 0xb3, 0x9d, 0xf1, 0x42, 0x5d, 0x68, 0xc6, 0x40, +0x01, 0xbc, 0x94, 0x42, 0x0b, 0x97, 0xea, 0x42, 0x7f, 0x2b, 0xfc, 0x40, 0x01, 0xbc, 0x94, 0x42, 0x0b, 0x97, 0xea, 0x42, 0x7f, 0x2b, 0xfc, 0x40, 0x71, 0xfd, 0x93, 0x42, 0x7b, 0x94, 0xe4, 0x42, 0xe7, 0xfb, 0xdf, 0x40, 0x78, 0x3a, 0x92, 0x42, 0x33, 0xb3, 0xdd, 0x42, 0x07, 0x08, 0x64, 0x40, 0xa3, 0x01, 0x91, 0x42, 0x2e, 0x72, 0xd8, 0x42, 0xdc, 0x11, 0x06, 0xc0, 0xa3, 0x01, 0x91, 0x42, 0x2e, 0x72, 0xd8, 0x42, 0xdc, 0x11, 0x06, 0xc0, 0x05, 0x16, 0x92, 0x42, 0x01, 0xc0, 0xd5, 0x42, +0x5f, 0x07, 0x25, 0xc1, 0x2a, 0xe9, 0xa4, 0x42, 0x7b, 0x94, 0xe2, 0x42, 0x23, 0xa1, 0x0b, 0x40, 0xde, 0x24, 0x9f, 0x42, 0xc1, 0x0a, 0xdf, 0x42, 0xa7, 0xe8, 0x50, 0x40, 0xdc, 0xd7, 0x3a, 0xc1, 0x11, 0x58, 0xff, 0x42, 0xd5, 0x56, 0xcc, 0x40, 0xa2, 0x45, 0x3e, 0xc1, 0x3e, 0x4a, 0xf5, 0x42, 0xd7, 0x86, 0xf5, 0x40, 0xb1, 0x2e, 0x43, 0xc1, 0x36, 0xde, 0xfd, 0x42, 0x33, 0x16, 0x8d, 0x40, 0x47, 0x72, 0x42, 0xc1, 0x4a, 0x8c, 0xf4, 0x42, 0x26, 0xc2, 0xd5, 0x40, 0x1e, 0x16, 0x4a, 0xc1, +0xaf, 0x87, 0xfb, 0x42, 0x71, 0xac, 0x27, 0x40, 0x2c, 0xd4, 0x45, 0xc1, 0xb9, 0x5e, 0xf3, 0x42, 0x98, 0xfa, 0xb8, 0x40, 0xef, 0x38, 0x4f, 0xc1, 0x22, 0x70, 0xf8, 0x42, 0x23, 0x2d, 0x8d, 0x3f, 0x44, 0x8b, 0x48, 0xc1, 0x69, 0xd1, 0xf1, 0x42, 0xbb, 0x96, 0xa0, 0x40, 0x10, 0x58, 0x52, 0xc1, 0xee, 0xbc, 0xf4, 0x42, 0xc7, 0x67, 0x92, 0xbd, 0x19, 0x04, 0x4a, 0xc1, 0xbd, 0xf4, 0xef, 0x42, 0x34, 0xba, 0x8d, 0x40, 0xb1, 0x50, 0x53, 0xc1, 0x1d, 0x9a, 0xf0, 0x42, 0x7e, 0x37, 0x59, 0xbf, +0x05, 0x56, 0x4a, 0xc1, 0x42, 0xe0, 0xed, 0x42, 0x88, 0x4b, 0x81, 0x40, 0xb9, 0xfc, 0x51, 0xc1, 0xdc, 0x39, 0xec, 0x42, 0x01, 0x13, 0x98, 0xbf, 0x94, 0x87, 0x49, 0xc1, 0x14, 0xae, 0xeb, 0x42, 0x58, 0xc5, 0x77, 0x40, 0xc3, 0x64, 0x4e, 0xc1, 0xeb, 0xd1, 0xe7, 0x42, 0x3a, 0x75, 0x89, 0xbf, 0xa8, 0xa4, 0x47, 0xc1, 0xd0, 0x77, 0xe9, 0x42, 0xb5, 0x6c, 0x7b, 0x40, 0x8c, 0xb9, 0x44, 0xc1, 0x17, 0x59, 0xe7, 0x42, 0x2e, 0xa8, 0x86, 0x40, 0xfe, 0xb2, 0x48, 0xc1, 0x94, 0x98, 0xe3, 0x42, +0x7c, 0x0b, 0x03, 0xbf, 0xb6, 0xf3, 0x40, 0xc1, 0xfd, 0x69, 0xe5, 0x42, 0x1a, 0x69, 0x96, 0x40, 0xe8, 0x48, 0x41, 0xc1, 0x84, 0xc0, 0xdf, 0x42, 0xf4, 0xc0, 0xef, 0x3e, 0xa8, 0x35, 0x38, 0xc1, 0xea, 0x66, 0xdc, 0x42, 0xc7, 0x0c, 0xf4, 0x3f, 0x20, 0x41, 0x3c, 0xc1, 0x59, 0xb9, 0xe3, 0x42, 0x22, 0xe0, 0xad, 0x40, 0x7a, 0xa5, 0x2b, 0xc1, 0x36, 0x5e, 0xd9, 0x42, 0xe9, 0x60, 0x8b, 0x40, 0xe6, 0xae, 0x35, 0xc1, 0x19, 0x44, 0xe2, 0x42, 0x80, 0x43, 0xd4, 0x40, 0xa8, 0xa4, 0x22, 0xc1, +0x26, 0x86, 0xd8, 0x42, 0xff, 0xe7, 0xc6, 0x40, 0xa5, 0x2c, 0x31, 0xc1, 0x15, 0xee, 0xe1, 0x42, 0x36, 0x71, 0xf2, 0x40, 0x72, 0xf9, 0x2c, 0xc1, 0x94, 0x98, 0x04, 0x43, 0x85, 0x3d, 0x9e, 0x40, 0x4b, 0x59, 0x39, 0xc1, 0x83, 0x80, 0x03, 0x43, 0x15, 0x00, 0x01, 0x40, 0xc5, 0x8f, 0x43, 0xc1, 0xde, 0xc4, 0x01, 0x43, 0x86, 0x8d, 0x22, 0xbf, 0x99, 0x2a, 0x4b, 0xc1, 0x40, 0xf5, 0xfe, 0x42, 0xbe, 0x82, 0x38, 0xc0, 0xc1, 0xca, 0x4f, 0xc1, 0xdc, 0x79, 0xf9, 0x42, 0x84, 0xf0, 0x93, 0xc0, +0x92, 0x3a, 0x51, 0xc1, 0x17, 0x59, 0xf3, 0x42, 0x08, 0xc9, 0xb8, 0xc0, 0xad, 0x69, 0x4f, 0xc1, 0xad, 0xdc, 0xec, 0x42, 0x95, 0x09, 0xc9, 0xc0, 0x09, 0x68, 0x4a, 0xc1, 0xeb, 0x51, 0xe6, 0x42, 0xd7, 0xf5, 0xc3, 0xc0, 0x1f, 0x63, 0x42, 0xc1, 0x38, 0x09, 0xe0, 0x42, 0xe8, 0x9f, 0xa9, 0xc0, 0x38, 0x67, 0x37, 0xc1, 0x05, 0x56, 0xda, 0x42, 0x0e, 0xb9, 0x75, 0xc0, 0x0f, 0x2d, 0x2a, 0xc1, 0x55, 0x63, 0xd5, 0x42, 0xbb, 0x27, 0xdf, 0xbf, 0x00, 0x35, 0x17, 0xc1, 0x51, 0xcd, 0xd0, 0x42, +0x9f, 0x1f, 0xfa, 0x3f, 0xa4, 0xeb, 0x09, 0xc1, 0xf6, 0x68, 0xcf, 0x42, 0xfc, 0xa4, 0x97, 0x40, 0xde, 0x3c, 0x15, 0xc1, 0x1d, 0x5a, 0x09, 0x43, 0xd7, 0x12, 0x58, 0x40, 0x0c, 0x71, 0x25, 0xc1, 0x44, 0xeb, 0x07, 0x43, 0xf6, 0x08, 0xed, 0xbe, 0xcf, 0xd5, 0x32, 0xc1, 0xe4, 0xa5, 0x05, 0x43, 0x8f, 0xfc, 0x7b, 0xc0, 0xcd, 0xcc, 0x3c, 0xc1, 0x61, 0xa5, 0x02, 0x43, 0x5f, 0x41, 0xdc, 0xc0, 0xa4, 0xdf, 0x42, 0xc1, 0xa7, 0x1b, 0xfe, 0x42, 0x1b, 0x9e, 0x12, 0xc1, 0xb1, 0xbf, 0x44, 0xc1, +0xf9, 0x13, 0xf6, 0x42, 0x48, 0xbf, 0x2a, 0xc1, 0xfa, 0x5c, 0x42, 0xc1, 0xf9, 0x93, 0xed, 0x42, 0x66, 0x66, 0x35, 0xc1, 0xe5, 0xd0, 0x3b, 0xc1, 0x07, 0x01, 0xe5, 0x42, 0x12, 0x14, 0x32, 0xc1, 0xad, 0x69, 0x31, 0xc1, 0x0d, 0xc2, 0xdc, 0x42, 0xbf, 0xec, 0x20, 0xc1, 0x75, 0x02, 0x23, 0xc1, 0x4a, 0x4c, 0xd5, 0x42, 0x9f, 0x0e, 0x02, 0xc1, 0x3f, 0xd2, 0x11, 0xc1, 0x7c, 0xd4, 0xce, 0x42, 0x44, 0xa3, 0xac, 0xc0, 0xdc, 0xef, 0xf1, 0xc0, 0xe8, 0xfb, 0xc8, 0x42, 0x83, 0xa7, 0x20, 0xbf, +0x75, 0x71, 0xce, 0xc0, 0x7e, 0xff, 0xc6, 0x42, 0x23, 0xd6, 0x3c, 0x40, 0xbf, 0xec, 0xe7, 0xc0, 0xfa, 0xde, 0x0d, 0x43, 0xe3, 0xc2, 0xd9, 0x3f, 0x00, 0xc6, 0x07, 0xc1, 0x77, 0x1e, 0x0c, 0x43, 0x6f, 0x7c, 0x3f, 0xc0, 0xde, 0x24, 0x18, 0xc1, 0x11, 0x58, 0x09, 0x43, 0xad, 0x9e, 0xe7, 0xc0, 0x8f, 0x53, 0x24, 0xc1, 0x8c, 0xac, 0x05, 0x43, 0x5d, 0x6d, 0x2d, 0xc1, 0x0e, 0xbe, 0x2b, 0xc1, 0x73, 0x48, 0x01, 0x43, 0x32, 0x08, 0x5a, 0xc1, 0x0f, 0x0b, 0x2e, 0xc1, 0x01, 0xc0, 0xf8, 0x42, +0xf0, 0x85, 0x77, 0xc1, 0xf3, 0x1f, 0x2b, 0xc1, 0xa7, 0x5b, 0xee, 0x42, 0x3f, 0x46, 0x82, 0xc1, 0xe6, 0x1d, 0x23, 0xc1, 0x47, 0xe1, 0xe3, 0x42, 0x70, 0x3d, 0x80, 0xc1, 0x7b, 0x14, 0x16, 0xc1, 0xff, 0xd4, 0xd9, 0x42, 0x12, 0x14, 0x6b, 0xc1, 0xc2, 0xd8, 0x03, 0xc1, 0xeb, 0xd1, 0xd0, 0x42, 0x21, 0x1f, 0x44, 0xc1, 0x5d, 0xf9, 0xd9, 0xc0, 0x99, 0x19, 0xc9, 0x42, 0x09, 0x8a, 0x0a, 0xc1, 0xf8, 0x31, 0xa2, 0xc0, 0xda, 0x6a, 0xc2, 0x42, 0x78, 0x0b, 0x5e, 0xc0, 0xf9, 0xd5, 0x6e, 0xc0, +0xd0, 0x64, 0xbf, 0x42, 0x79, 0x5c, 0x7c, 0x3f, 0x9c, 0x4b, 0x93, 0xc0, 0x46, 0x16, 0x12, 0x43, 0x3c, 0xf7, 0x5e, 0xbd, 0x61, 0x89, 0xc1, 0xc0, 0xc1, 0x0a, 0x10, 0x43, 0x06, 0x0d, 0xb1, 0xc0, 0x60, 0xc8, 0xe7, 0xc0, 0x50, 0xcd, 0x0c, 0x43, 0x2c, 0xd4, 0x27, 0xc1, 0x61, 0x1a, 0x02, 0xc1, 0xde, 0x84, 0x08, 0x43, 0x58, 0x17, 0x6b, 0xc1, 0x41, 0xc3, 0x0a, 0xc1, 0x9c, 0x64, 0x03, 0x43, 0x12, 0x94, 0x8f, 0xc1, 0x9f, 0x71, 0x0d, 0xc1, 0xf9, 0x53, 0xfb, 0x42, 0x2f, 0xcc, 0xa0, 0xc1, +0xfe, 0x09, 0x0a, 0xc1, 0xb1, 0x32, 0xef, 0x42, 0x2c, 0x65, 0xa8, 0xc1, 0xdd, 0xb0, 0x00, 0xc1, 0xc9, 0xf6, 0xe2, 0x42, 0xf0, 0x05, 0xa6, 0xc1, 0xc2, 0xc0, 0xe2, 0xc0, 0x01, 0x40, 0xd7, 0x42, 0x3e, 0x68, 0x99, 0xc1, 0xba, 0xf2, 0xb8, 0xc0, 0xbd, 0xb4, 0xcc, 0x42, 0x92, 0xdc, 0x82, 0xc1, 0x38, 0x10, 0x84, 0xc0, 0x2c, 0xa5, 0xc3, 0x42, 0x2e, 0x6e, 0x44, 0xc1, 0x67, 0x44, 0xf1, 0xbf, 0xfc, 0xe7, 0xbb, 0x42, 0xda, 0x55, 0xcc, 0xc0, 0xf7, 0x77, 0xf6, 0xbe, 0xb6, 0xa2, 0xb7, 0x42, +0x7a, 0xc4, 0x00, 0xbf, 0xec, 0x2f, 0xb7, 0xbf, 0x63, 0xf0, 0x15, 0x43, 0x91, 0xd0, 0xee, 0xbf, 0xb9, 0xfc, 0x43, 0xc0, 0x8a, 0xa1, 0x13, 0x43, 0xb0, 0xc9, 0x00, 0xc1, 0x80, 0x26, 0x8d, 0xc0, 0x59, 0xf9, 0x0f, 0x43, 0x3b, 0x4e, 0x5a, 0xc1, 0x63, 0x40, 0xad, 0xc0, 0x96, 0x23, 0x0b, 0x43, 0x15, 0x1d, 0x93, 0xc1, 0x20, 0xcd, 0xc0, 0xc0, 0x5f, 0x5a, 0x05, 0x43, 0x62, 0x7f, 0xb0, 0xc1, 0xfd, 0xd9, 0xc6, 0xc0, 0xa3, 0xc5, 0xfd, 0x42, 0x69, 0xef, 0xc3, 0xc1, 0x06, 0x2a, 0xbf, 0xc0, +0x7b, 0x14, 0xf0, 0x42, 0x13, 0x83, 0xcc, 0xc1, 0x5e, 0x0c, 0xaa, 0xc0, 0xa2, 0x45, 0xe2, 0x42, 0xc9, 0xd4, 0xc9, 0xc1, 0xe2, 0x1e, 0x88, 0xc0, 0x9c, 0x04, 0xd5, 0x42, 0x20, 0xd2, 0xbb, 0xc1, 0x8d, 0x23, 0x34, 0xc0, 0x2c, 0x07, 0xc9, 0x42, 0x92, 0xdc, 0xa2, 0xc1, 0x08, 0x77, 0x5b, 0xbf, 0x8d, 0xc6, 0xbe, 0x42, 0x92, 0xcb, 0x7e, 0xc1, 0x0e, 0x86, 0xe2, 0x3e, 0xc3, 0x04, 0xb7, 0x42, 0x31, 0x7c, 0x34, 0x40, 0xd4, 0x26, 0x0e, 0x40, 0xfa, 0x5e, 0x19, 0x43, 0x72, 0x2e, 0x6d, 0xc0, +0xfe, 0xed, 0xda, 0x3e, 0xfe, 0xd4, 0x16, 0x43, 0x12, 0x14, 0x28, 0xc1, 0x6e, 0x12, 0x87, 0xbf, 0xe0, 0xcf, 0x12, 0x43, 0x83, 0x40, 0x85, 0xc1, 0xb3, 0x24, 0x0a, 0xc0, 0xfa, 0x7e, 0x0d, 0x43, 0xbf, 0xfd, 0xae, 0xc1, 0x33, 0x16, 0x35, 0xc0, 0x4e, 0x22, 0x07, 0x43, 0x98, 0x4c, 0xcf, 0xc1, 0xce, 0x6b, 0x42, 0xc0, 0x25, 0x06, 0x00, 0x43, 0x9f, 0xab, 0xe4, 0xc1, 0xf6, 0x7a, 0x31, 0xc0, 0x78, 0xfe, 0xf0, 0x42, 0x02, 0x1a, 0xee, 0xc1, 0x0c, 0x1f, 0x03, 0xc0, 0xe0, 0xcf, 0xe1, 0x42, +0x52, 0x27, 0xeb, 0xc1, 0x07, 0xb7, 0x65, 0xbf, 0x46, 0x36, 0xd3, 0x42, 0x94, 0xf6, 0xdb, 0xc1, 0x02, 0x7f, 0x28, 0x3f, 0xb2, 0xfd, 0xc5, 0x42, 0x5a, 0xe4, 0xc0, 0xc1, 0x33, 0xdc, 0x2a, 0x40, 0x2c, 0x74, 0xbb, 0x42, 0x30, 0x19, 0x9e, 0xc1, 0x49, 0x9d, 0xc9, 0x40, 0xfe, 0x54, 0x1c, 0x43, 0x93, 0x8c, 0xb1, 0xc0, 0x4d, 0xdb, 0x8b, 0x40, 0x1d, 0x9a, 0x19, 0x43, 0x13, 0xd0, 0x4d, 0xc1, 0x1b, 0x99, 0x31, 0x40, 0x67, 0x46, 0x15, 0x43, 0x57, 0xdb, 0x9b, 0xc1, 0xdd, 0x59, 0xcb, 0x3f, +0x56, 0x8e, 0x0f, 0x43, 0x61, 0xc3, 0xc8, 0xc1, 0xfa, 0xd4, 0x5d, 0x3f, 0x05, 0xb6, 0x08, 0x43, 0xf6, 0x86, 0xeb, 0xc1, 0x02, 0x83, 0x24, 0x3f, 0x9e, 0x0f, 0x01, 0x43, 0x41, 0x42, 0x01, 0xc2, 0x05, 0x34, 0x6d, 0x3f, 0x0f, 0xed, 0xf1, 0x42, 0x4c, 0x55, 0x06, 0xc2, 0xe2, 0x70, 0xda, 0x3f, 0x8e, 0x97, 0xe1, 0x42, 0x14, 0xbf, 0x04, 0xc2, 0x12, 0x83, 0x3c, 0x40, 0xcb, 0xe1, 0xd1, 0x42, 0xea, 0x26, 0xf9, 0xc1, 0x67, 0x96, 0x94, 0x40, 0x2d, 0xe1, 0xc3, 0x42, 0x92, 0xed, 0xdb, 0xc1, +0x6a, 0x30, 0xd6, 0x40, 0xa6, 0xca, 0xb9, 0x42, 0x53, 0xb8, 0xbb, 0xc1, 0x09, 0xf9, 0x2b, 0x41, 0xae, 0xc7, 0x1e, 0x43, 0x77, 0xb9, 0xeb, 0xc0, 0x87, 0x5c, 0x0b, 0x41, 0x61, 0xe5, 0x1b, 0x43, 0x19, 0x73, 0x71, 0xc1, 0x78, 0xd1, 0xe0, 0x40, 0xf8, 0x53, 0x17, 0x43, 0xd7, 0xa3, 0xb0, 0xc1, 0xc0, 0xb2, 0xb8, 0x40, 0xfc, 0x49, 0x11, 0x43, 0xc5, 0x0f, 0xe0, 0xc1, 0xe3, 0x4e, 0xa0, 0x40, 0x9e, 0x0f, 0x0a, 0x43, 0xff, 0x61, 0x02, 0xc2, 0x66, 0xbd, 0x98, 0x40, 0xa6, 0xfb, 0x01, 0x43, +0x3f, 0x86, 0x0e, 0xc2, 0x36, 0x59, 0xa2, 0x40, 0xad, 0xdc, 0xf2, 0x42, 0x62, 0xe1, 0x13, 0xc2, 0x35, 0xb5, 0xbc, 0x40, 0x30, 0x9d, 0xe1, 0x42, 0x6e, 0x34, 0x12, 0xc2, 0x47, 0x8f, 0xe6, 0x40, 0xa9, 0x06, 0xd1, 0x42, 0xdd, 0x93, 0x09, 0xc2, 0xb5, 0xe0, 0x10, 0x41, 0xc2, 0x95, 0xc2, 0x42, 0xb1, 0x72, 0xf4, 0xc1, 0x7f, 0xd9, 0x33, 0x41, 0x51, 0x29, 0xb9, 0x42, 0x86, 0xc9, 0xd7, 0xc1, 0x66, 0xf7, 0x77, 0x41, 0x92, 0xad, 0x20, 0x43, 0xa1, 0x21, 0x12, 0xc1, 0xda, 0x1b, 0x56, 0x41, +0x1b, 0xaf, 0x1d, 0x43, 0xd3, 0x3c, 0x89, 0xc1, 0x15, 0x1d, 0x3a, 0x41, 0xa4, 0xf0, 0x18, 0x43, 0xcc, 0x4c, 0xc3, 0xc1, 0x5e, 0x4b, 0x25, 0x41, 0x44, 0xab, 0x12, 0x43, 0x6b, 0x89, 0xf4, 0xc1, 0xc9, 0x9f, 0x18, 0x41, 0xbb, 0x29, 0x0b, 0x43, 0x46, 0x54, 0x0d, 0xc2, 0x8b, 0xb2, 0x14, 0x41, 0x67, 0xc6, 0x02, 0x43, 0x00, 0xef, 0x19, 0xc2, 0x1c, 0xb1, 0x19, 0x41, 0x3e, 0xca, 0xf3, 0x42, 0x48, 0x7f, 0x1f, 0xc2, 0x9e, 0x5e, 0x27, 0x41, 0xc5, 0xe0, 0xe1, 0x42, 0x5b, 0xc2, 0x1d, 0xc2, +0x37, 0x1a, 0x3d, 0x41, 0xea, 0xa6, 0xd0, 0x42, 0xcd, 0xcc, 0x14, 0xc2, 0xd8, 0xf0, 0x60, 0x41, 0x1e, 0xe7, 0xc1, 0x42, 0x05, 0x63, 0x05, 0xc2, 0xaf, 0x25, 0x85, 0x41, 0xeb, 0xf1, 0xb8, 0x42, 0x3f, 0xc6, 0xef, 0xc1, 0x9d, 0x6f, 0xb8, 0x41, 0xad, 0x5c, 0x22, 0x43, 0x19, 0xe2, 0x39, 0xc1, 0x2e, 0x10, 0xa7, 0x41, 0xfc, 0x49, 0x1f, 0x43, 0x51, 0xc9, 0x9e, 0xc1, 0x61, 0xb2, 0x98, 0x41, 0xc7, 0x6b, 0x1a, 0x43, 0xa4, 0x5f, 0xda, 0xc1, 0x1e, 0x05, 0x8e, 0x41, 0x6b, 0xfc, 0x13, 0x43, +0x9c, 0x73, 0x06, 0xc2, 0x7b, 0x83, 0x87, 0x41, 0xb5, 0x48, 0x0c, 0x43, 0xf2, 0x01, 0x1a, 0xc2, 0x2e, 0x7f, 0x85, 0x41, 0xcd, 0xac, 0x03, 0x43, 0xab, 0xf1, 0x26, 0xc2, 0x28, 0x0f, 0x88, 0x41, 0x42, 0x20, 0xf5, 0x42, 0x1e, 0xa7, 0x2c, 0xc2, 0x18, 0x15, 0x8f, 0x41, 0xfb, 0xbe, 0xe2, 0x42, 0x1b, 0xde, 0x2a, 0xc2, 0x99, 0x3b, 0x9a, 0x41, 0xec, 0x11, 0xd1, 0x42, 0x8b, 0xac, 0x21, 0xc2, 0x4f, 0xaf, 0xa9, 0x41, 0x7a, 0x05, 0xc2, 0x42, 0x1b, 0x0d, 0x11, 0xc2, 0x29, 0x5c, 0xbb, 0x41, +0x07, 0x6e, 0xb9, 0x42, 0x25, 0xa4, 0x01, 0xc2, 0xc0, 0xdb, 0xf6, 0x41, 0xcf, 0xd7, 0x22, 0x43, 0xa3, 0x01, 0x5e, 0xc1, 0xe7, 0x8c, 0xe5, 0x41, 0xf0, 0xc7, 0x1f, 0x43, 0x43, 0x9c, 0xb0, 0xc1, 0x76, 0x3e, 0xd7, 0x41, 0x56, 0xee, 0x1a, 0x43, 0x78, 0xfa, 0xeb, 0xc1, 0xc3, 0x64, 0xdf, 0x41, 0xbf, 0xbf, 0x14, 0x43, 0xd3, 0x0d, 0x11, 0xc2, 0x02, 0xab, 0xd6, 0x41, 0x61, 0xe5, 0x0d, 0x43, 0xc1, 0xa8, 0x21, 0xc2, 0xe1, 0x0b, 0xd9, 0x41, 0x2b, 0x67, 0x06, 0x43, 0x8a, 0x9f, 0x2c, 0xc2, +0x64, 0xaa, 0xc6, 0x41, 0x47, 0x61, 0xf6, 0x42, 0x59, 0x39, 0x35, 0xc2, 0x8d, 0xa8, 0xcd, 0x41, 0xe6, 0x10, 0xe4, 0x42, 0xc4, 0x71, 0x33, 0xc2, 0x9c, 0xc4, 0xd8, 0x41, 0x3a, 0x74, 0xd2, 0x42, 0x9a, 0x48, 0x2a, 0xc2, 0xe6, 0xd0, 0xe7, 0x41, 0x9e, 0x8d, 0xc3, 0x42, 0xea, 0x44, 0x19, 0xc2, 0x7b, 0x14, 0xf8, 0x41, 0x0e, 0x5c, 0xba, 0x42, 0x1a, 0x00, 0x07, 0xc2, 0xc3, 0x64, 0x10, 0x42, 0x1d, 0x5a, 0x22, 0x43, 0xfc, 0x18, 0x73, 0xc1, 0x28, 0xed, 0x07, 0x42, 0xa6, 0x5b, 0x1f, 0x43, +0x17, 0xb7, 0xb9, 0xc1, 0xc8, 0x87, 0x05, 0x42, 0xd8, 0x03, 0x1a, 0x43, 0xcf, 0xe6, 0xff, 0xc1, 0x68, 0xa2, 0xf9, 0x41, 0x11, 0x98, 0xff, 0x42, 0x54, 0xc1, 0x34, 0xc2, 0x13, 0x72, 0x08, 0x42, 0x7a, 0x29, 0xec, 0x42, 0x92, 0xdc, 0x3a, 0xc2, 0x94, 0x18, 0x0d, 0x42, 0x80, 0xea, 0xd5, 0x42, 0xc4, 0xe0, 0x32, 0xc2, 0xce, 0x88, 0x13, 0x42, 0x85, 0x9a, 0xc6, 0x42, 0x7c, 0xe1, 0x1d, 0xc2, 0x14, 0xbf, 0x1b, 0x42, 0xa9, 0x86, 0xbc, 0x42, 0x5f, 0x18, 0x07, 0xc2, 0xa1, 0x16, 0x25, 0x42, +0xd1, 0x42, 0x21, 0x43, 0x33, 0xc4, 0x82, 0xc1, 0xf7, 0x35, 0x1e, 0x42, 0x84, 0x40, 0x1d, 0x43, 0x3a, 0x12, 0xda, 0xc1, 0xae, 0x36, 0x39, 0x42, 0x40, 0x95, 0x1f, 0x43, 0xc8, 0x87, 0x8a, 0xc1, 0x9b, 0x66, 0x33, 0x42, 0xa0, 0xda, 0x1c, 0x43, 0x62, 0xa1, 0xd1, 0xc1, 0x64, 0xea, 0x2b, 0x42, 0x98, 0x2e, 0xd9, 0x42, 0x83, 0x2f, 0x35, 0xc2, 0x98, 0x4c, 0x2a, 0x42, 0xc1, 0x0a, 0xeb, 0x42, 0x04, 0xc5, 0x3a, 0xc2, 0x07, 0x01, 0x32, 0x42, 0xea, 0xe6, 0xc9, 0x42, 0x8c, 0x79, 0x22, 0xc2, +0xfc, 0x29, 0x3d, 0x42, 0xa6, 0xbb, 0xbd, 0x42, 0x0b, 0xb5, 0x05, 0xc2, 0x92, 0x7a, 0x4c, 0x42, 0x52, 0x58, 0x1d, 0x43, 0x23, 0xb9, 0x90, 0xc1, 0xa7, 0xe8, 0x47, 0x42, 0x88, 0x36, 0x1b, 0x43, 0xb8, 0x9e, 0xca, 0xc1, 0x00, 0xde, 0x42, 0x42, 0x09, 0xec, 0xdb, 0x42, 0xfa, 0x5c, 0x30, 0xc2, 0xd7, 0xd2, 0x40, 0x42, 0x80, 0x6a, 0xeb, 0x42, 0x78, 0x0b, 0x37, 0xc2, 0x5d, 0x6d, 0x49, 0x42, 0x9c, 0x04, 0xcd, 0x42, 0xa6, 0x1b, 0x20, 0xc2, 0x49, 0xee, 0x55, 0x42, 0x5c, 0x7e, 0xc1, 0x42, +0x6b, 0xab, 0x03, 0xc2, 0x65, 0x99, 0x5e, 0x42, 0xf8, 0x93, 0x1a, 0x43, 0x20, 0x41, 0x95, 0xc1, 0x15, 0x5d, 0x5b, 0x42, 0x5b, 0x64, 0x18, 0x43, 0x7d, 0x9d, 0xc8, 0xc1, 0xbf, 0x7d, 0x56, 0x42, 0xb7, 0xb3, 0xde, 0x42, 0x28, 0x2d, 0x25, 0xc2, 0x46, 0x25, 0x53, 0x42, 0x03, 0x6b, 0xec, 0x42, 0x4b, 0x08, 0x2d, 0xc2, 0x17, 0xf7, 0x5c, 0x42, 0xe0, 0x4f, 0xd1, 0x42, 0xad, 0x29, 0x18, 0xc2, 0x12, 0xf2, 0x6a, 0x42, 0xa4, 0xf0, 0xc6, 0x42, 0xc5, 0x8f, 0xfe, 0xc1, 0x7c, 0x50, 0x6f, 0x42, +0xb1, 0x52, 0x17, 0x43, 0xff, 0x10, 0x98, 0xc1, 0x2c, 0x43, 0x6c, 0x42, 0x54, 0xe3, 0x14, 0x43, 0xbc, 0x63, 0xc8, 0xc1, 0x64, 0x8c, 0x6a, 0x42, 0x44, 0x4b, 0xe1, 0x42, 0x63, 0xdd, 0x14, 0xc2, 0x1c, 0x6b, 0x69, 0x42, 0x6b, 0x7c, 0xed, 0x42, 0xa4, 0x1f, 0x19, 0xc2, 0xcf, 0x15, 0x70, 0x42, 0x4c, 0xb7, 0xd8, 0x42, 0xcb, 0x61, 0x09, 0xc2, 0x13, 0xa1, 0x7e, 0x42, 0xf8, 0x53, 0xce, 0x42, 0xde, 0xf1, 0xec, 0xc1, 0x6f, 0xb0, 0x77, 0x42, 0x1e, 0x56, 0xc1, 0x42, 0x70, 0xce, 0xba, 0xc1, +0x09, 0x79, 0x85, 0x42, 0x15, 0x6e, 0xca, 0x42, 0xdd, 0xa4, 0xb9, 0xc1, 0x65, 0x3b, 0x63, 0x42, 0x9b, 0xb5, 0xba, 0x42, 0x8a, 0x9f, 0xba, 0xc1, 0x34, 0xb1, 0x80, 0x42, 0x9c, 0x64, 0x11, 0x43, 0xde, 0x02, 0xa1, 0xc1, 0xf4, 0x2c, 0x7d, 0x42, 0xc7, 0x2b, 0x10, 0x43, 0xf4, 0xdb, 0xc1, 0xc1, 0xd0, 0xf3, 0x84, 0x42, 0xa0, 0x9a, 0x0d, 0x43, 0xad, 0xe9, 0xa6, 0xc1, 0x0b, 0xe4, 0x88, 0x42, 0xc1, 0x4a, 0x0a, 0x43, 0x98, 0x3b, 0xac, 0xc1, 0x86, 0x6b, 0x36, 0x42, 0x63, 0x70, 0x09, 0x43, +0x35, 0xaf, 0x19, 0xc2, 0x1a, 0x91, 0x33, 0x42, 0xc7, 0x2b, 0x0b, 0x43, 0xa6, 0xdb, 0x16, 0xc2, 0x6f, 0x92, 0x3f, 0x42, 0x6b, 0xdc, 0x0a, 0x43, 0xdc, 0xf9, 0x17, 0xc2, 0x50, 0x0d, 0x3c, 0x42, 0x0b, 0x37, 0x0c, 0x43, 0x23, 0x79, 0x15, 0xc2, 0x72, 0xb9, 0x2d, 0x42, 0x75, 0x73, 0x0a, 0x43, 0x07, 0x5f, 0x17, 0xc2, 0xb6, 0x22, 0x30, 0x42, 0xbf, 0x3f, 0x08, 0x43, 0x9a, 0x77, 0x1a, 0xc2, 0xea, 0xc4, 0x32, 0x42, 0xf8, 0xd3, 0x0c, 0x43, 0x7b, 0x72, 0x13, 0xc2, 0x24, 0x68, 0x2e, 0x42, +0x63, 0x90, 0x0c, 0x43, 0x73, 0x46, 0x13, 0xc2, 0xea, 0x84, 0x39, 0x42, 0x84, 0x60, 0x0d, 0x43, 0x49, 0xcc, 0x12, 0xc2, 0x6f, 0x92, 0x3f, 0x42, 0xe6, 0x50, 0x06, 0x43, 0xc4, 0x82, 0x1c, 0xc2, 0xcc, 0x9d, 0x3a, 0x42, 0x7f, 0xca, 0x07, 0x43, 0xb0, 0xb2, 0x1b, 0xc2, 0xad, 0x9c, 0x47, 0x42, 0xa6, 0xfb, 0x07, 0x43, 0xa2, 0x05, 0x1b, 0xc2, 0xf6, 0x97, 0x43, 0x42, 0xfc, 0x69, 0x09, 0x43, 0x6b, 0xda, 0x19, 0xc2, 0x12, 0x94, 0x34, 0x42, 0xfa, 0x3e, 0x06, 0x43, 0x65, 0x3b, 0x1c, 0xc2, +0xb9, 0x6b, 0x3a, 0x42, 0xf0, 0xa7, 0x04, 0x43, 0x5b, 0xa0, 0x1c, 0xc2, 0xa9, 0x82, 0x49, 0x42, 0x4e, 0x22, 0x04, 0x43, 0xad, 0x7a, 0x1a, 0xc2, 0x57, 0xac, 0x44, 0x42, 0x75, 0x13, 0x05, 0x43, 0x33, 0xf3, 0x1b, 0xc2, 0xb6, 0xa2, 0x4d, 0x42, 0xe4, 0x65, 0x05, 0x43, 0x55, 0x5f, 0x1a, 0xc2, 0xf3, 0x0e, 0x4b, 0x42, 0xe8, 0x9b, 0x06, 0x43, 0xf9, 0x20, 0x1b, 0xc2, 0x69, 0x00, 0x41, 0x42, 0x27, 0x91, 0x03, 0x43, 0x84, 0xbc, 0x1b, 0xc2, 0xa7, 0x57, 0x47, 0x42, 0x94, 0xd8, 0x02, 0x43, +0xc2, 0xc6, 0x19, 0xc2, 0x0e, 0xbe, 0x4d, 0x42, 0xe8, 0x9b, 0x03, 0x43, 0x0f, 0xad, 0x18, 0xc2, 0x02, 0xda, 0x4e, 0x42, 0xee, 0x7c, 0x04, 0x43, 0x25, 0x86, 0x19, 0xc2, 0x0a, 0x17, 0x52, 0x42, 0x00, 0xc0, 0x03, 0x43, 0x44, 0xe9, 0x16, 0xc2, 0x77, 0xad, 0x51, 0x42, 0x6f, 0x72, 0x04, 0x43, 0x87, 0x56, 0x18, 0xc2, 0x36, 0x3c, 0x4d, 0x42, 0xb1, 0x92, 0x02, 0x43, 0x7e, 0x8c, 0x17, 0xc2, 0xbc, 0xc5, 0x52, 0x42, 0xdc, 0xd9, 0x02, 0x43, 0x8e, 0x35, 0x15, 0xc2, 0x15, 0x4c, 0x58, 0x42, +0x77, 0xde, 0x05, 0x43, 0x99, 0xaa, 0x14, 0xc2, 0x74, 0xa4, 0x5b, 0x42, 0xc9, 0x36, 0x05, 0x43, 0x43, 0x1c, 0x11, 0xc2, 0x24, 0xe8, 0x55, 0x42, 0xaa, 0x91, 0x04, 0x43, 0x56, 0x8e, 0x15, 0xc2, 0x8c, 0xb9, 0x57, 0x42, 0x5b, 0xc4, 0x03, 0x43, 0x84, 0x0d, 0x13, 0xc2, 0x48, 0xff, 0x53, 0x42, 0x52, 0x18, 0x05, 0x43, 0x17, 0xb7, 0x17, 0xc2, 0x3a, 0x81, 0x53, 0x42, 0x88, 0x16, 0x06, 0x43, 0xca, 0x32, 0x18, 0xc2, 0x13, 0x03, 0x59, 0x42, 0x7d, 0x7f, 0x07, 0x43, 0x05, 0x74, 0x13, 0xc2, +0x78, 0x7a, 0x52, 0x42, 0xa0, 0x7a, 0x07, 0x43, 0xa9, 0x13, 0x18, 0xc2, 0x9c, 0xe2, 0x57, 0x42, 0x7d, 0x3f, 0x09, 0x43, 0xf5, 0xca, 0x11, 0xc2, 0x61, 0x43, 0x50, 0x42, 0x3c, 0xff, 0x08, 0x43, 0x35, 0x2f, 0x17, 0xc2, 0x63, 0x9d, 0x5d, 0x42, 0x67, 0x06, 0x09, 0x43, 0xc4, 0xb1, 0x0c, 0xc2, 0x9b, 0xd5, 0x5d, 0x42, 0x73, 0x08, 0x07, 0x43, 0xce, 0x08, 0x0f, 0xc2, 0xab, 0xed, 0x54, 0x42, 0xa6, 0xfb, 0x0a, 0x43, 0xf1, 0xf4, 0x0f, 0xc2, 0x8a, 0xdf, 0x4c, 0x42, 0xd1, 0x82, 0x0a, 0x43, +0xa2, 0xa3, 0x15, 0xc2, 0x93, 0x58, 0x50, 0x42, 0x94, 0x98, 0x0c, 0x43, 0x4c, 0x37, 0x0e, 0xc2, 0xbd, 0xc1, 0x48, 0x42, 0xb7, 0xf3, 0x0b, 0x43, 0x0f, 0xdc, 0x13, 0xc2, 0x4a, 0x8c, 0x55, 0x42, 0xc5, 0xe0, 0x0c, 0x43, 0xef, 0xc9, 0x08, 0xc2, 0xdc, 0xc6, 0x5a, 0x42, 0x61, 0x05, 0x0b, 0x43, 0x4f, 0x6f, 0x0a, 0xc2, 0x05, 0xd6, 0x4a, 0x42, 0x0f, 0xed, 0x0d, 0x43, 0x8a, 0x9f, 0x0c, 0xc2, 0xde, 0x71, 0x44, 0x42, 0x75, 0x33, 0x0d, 0x43, 0x84, 0xbc, 0x11, 0xc2, 0x0d, 0x0f, 0x45, 0x42, +0x00, 0xe0, 0x0e, 0x43, 0xe0, 0x5c, 0x0b, 0xc2, 0x75, 0xb1, 0x40, 0x42, 0xa4, 0x30, 0x0e, 0x43, 0xeb, 0xa2, 0x0f, 0xc2, 0x3e, 0x39, 0x47, 0x42, 0x2e, 0x52, 0x0f, 0x43, 0xb8, 0x6f, 0x07, 0xc2, 0x0f, 0xba, 0x4e, 0x42, 0xdc, 0x59, 0x0e, 0x43, 0xec, 0xc0, 0x07, 0xc2, 0x87, 0x56, 0x3f, 0x42, 0x44, 0x4b, 0x0f, 0x43, 0x7a, 0x25, 0x0b, 0xc2, 0x52, 0x67, 0x3e, 0x42, 0xf4, 0xdd, 0x0e, 0x43, 0x78, 0xcb, 0x0d, 0xc2, 0x93, 0x69, 0x39, 0x42, 0x50, 0x0d, 0x0f, 0x43, 0x44, 0xe9, 0x0c, 0xc2, +0xd6, 0x74, 0x3a, 0x42, 0xf6, 0xc8, 0x0e, 0x43, 0x8e, 0xa4, 0x0e, 0xc2, 0x9e, 0x4d, 0x38, 0x42, 0x46, 0x56, 0x0f, 0x43, 0xde, 0xf1, 0x0a, 0xc2, 0x8a, 0xc1, 0x3f, 0x42, 0xb1, 0xb2, 0x0f, 0x43, 0xf3, 0x4e, 0x08, 0xc2, 0x85, 0xab, 0x34, 0x42, 0xea, 0x26, 0x0e, 0x43, 0xfb, 0xfa, 0x0f, 0xc2, 0xc7, 0xcb, 0x37, 0x42, 0xe4, 0x25, 0x0e, 0x43, 0x45, 0xc7, 0x10, 0xc2, 0xf4, 0xfd, 0x31, 0x42, 0x5b, 0x44, 0x0e, 0x43, 0x9c, 0xf3, 0x0e, 0xc2, 0x97, 0x2e, 0x27, 0x42, 0x77, 0x1e, 0x08, 0x43, +0xe8, 0x08, 0x24, 0xc2, 0x8d, 0x68, 0x2b, 0x42, 0x4a, 0x0c, 0x08, 0x43, 0xf4, 0x2c, 0x21, 0xc2, 0x55, 0xb0, 0x2d, 0x42, 0x21, 0x10, 0x05, 0x43, 0xcd, 0x8c, 0x25, 0xc2, 0x83, 0x2f, 0x31, 0x42, 0x73, 0x68, 0x05, 0x43, 0x65, 0x99, 0x22, 0xc2, 0x6d, 0xe7, 0x3a, 0x42, 0x4c, 0x17, 0x04, 0x43, 0x55, 0xf0, 0x1f, 0xc2, 0x0e, 0x5c, 0x38, 0x42, 0x75, 0x73, 0x03, 0x43, 0x0d, 0x0f, 0x23, 0xc2, 0x69, 0xaf, 0x34, 0x42, 0x07, 0xc1, 0x05, 0x43, 0x2c, 0xa5, 0x1f, 0xc2, 0x65, 0x19, 0x37, 0x42, +0xfc, 0x89, 0x13, 0x43, 0xf6, 0xd7, 0x10, 0xc2, 0xf0, 0xa7, 0x38, 0x42, 0xe8, 0xdb, 0x11, 0x43, 0x55, 0x5f, 0x0f, 0xc2, 0xbd, 0x92, 0x2d, 0x42, 0x79, 0x09, 0x12, 0x43, 0xbc, 0x85, 0x17, 0xc2, 0x20, 0x41, 0x30, 0x42, 0xf0, 0x87, 0x10, 0x43, 0xee, 0x1a, 0x15, 0xc2, 0x86, 0xf8, 0x2d, 0x42, 0x59, 0x19, 0x0d, 0x43, 0x8e, 0x24, 0x17, 0xc2, 0x3d, 0x4a, 0x2a, 0x42, 0x00, 0x40, 0x0e, 0x43, 0x56, 0xfd, 0x19, 0xc2, 0xb1, 0xee, 0x32, 0x42, 0x67, 0x06, 0x0f, 0x43, 0xf2, 0xb0, 0x12, 0xc2, +0x0e, 0x9c, 0x26, 0x42, 0xa8, 0x66, 0x0f, 0x43, 0x0a, 0xd7, 0x1c, 0xc2, 0x85, 0x1a, 0x24, 0x42, 0x67, 0xc6, 0x0b, 0x43, 0x73, 0xc6, 0x20, 0xc2, 0xa0, 0x89, 0x28, 0x42, 0xd3, 0x2d, 0x0b, 0x43, 0x84, 0x0d, 0x1e, 0xc2, 0x68, 0xa2, 0x2f, 0x42, 0x5f, 0xfa, 0x07, 0x43, 0x62, 0x50, 0x1e, 0xc2, 0xe9, 0xf7, 0x2c, 0x42, 0x40, 0x95, 0x0a, 0x43, 0x95, 0x54, 0x1b, 0xc2, 0xd8, 0x1f, 0x3f, 0x42, 0xe0, 0x4f, 0x01, 0x43, 0xf3, 0x5f, 0x26, 0xc2, 0xe0, 0xcf, 0x35, 0x42, 0x1b, 0xcf, 0x02, 0x43, +0x7d, 0x2e, 0x26, 0xc2, 0xa6, 0x5b, 0x40, 0x42, 0x96, 0x23, 0x02, 0x43, 0x13, 0xd0, 0x22, 0xc2, 0xef, 0x78, 0x48, 0x42, 0xb9, 0x3e, 0x02, 0x43, 0xd6, 0x45, 0x1d, 0xc2, 0x5b, 0x71, 0x48, 0x42, 0xc9, 0x56, 0x01, 0x43, 0xc9, 0x76, 0x20, 0xc2, 0x73, 0x97, 0x41, 0x42, 0x8e, 0xf7, 0x02, 0x43, 0x7d, 0x3f, 0x1f, 0xc2, 0x6d, 0x67, 0x48, 0x42, 0xd9, 0x6e, 0x00, 0x43, 0x72, 0xa8, 0x23, 0xc2, 0xb3, 0x6a, 0x51, 0x42, 0xb8, 0x1e, 0x00, 0x43, 0x6a, 0x0d, 0x1f, 0xc2, 0x5a, 0x53, 0x50, 0x42, +0xa4, 0x10, 0x01, 0x43, 0xf3, 0xbd, 0x1c, 0xc2, 0xe7, 0x3b, 0x4f, 0x42, 0x4e, 0x02, 0x02, 0x43, 0x7d, 0x6e, 0x1a, 0xc2, 0x06, 0xb0, 0x55, 0x42, 0x7f, 0x4a, 0x02, 0x43, 0xcf, 0x26, 0x17, 0xc2, 0xd0, 0xf7, 0x57, 0x42, 0x4e, 0x62, 0x01, 0x43, 0x21, 0xb0, 0x18, 0xc2, 0x8e, 0x97, 0x5b, 0x42, 0xc9, 0x36, 0x03, 0x43, 0xd2, 0xef, 0x13, 0xc2, 0x78, 0x8b, 0x60, 0x42, 0x98, 0xce, 0x04, 0x43, 0xec, 0x00, 0x11, 0xc2, 0x25, 0x64, 0x5f, 0x42, 0xb8, 0x9e, 0x02, 0x43, 0x67, 0xc4, 0x14, 0xc2, +0xff, 0x21, 0x65, 0x42, 0x96, 0xa3, 0x04, 0x43, 0x45, 0xf6, 0x10, 0xc2, 0xb1, 0x7f, 0x63, 0x42, 0xc5, 0x00, 0x02, 0x43, 0x11, 0x76, 0x15, 0xc2, 0x3a, 0x41, 0x5a, 0x42, 0x6b, 0x7c, 0x00, 0x43, 0xb3, 0x3b, 0x1a, 0xc2, 0x82, 0x15, 0x6d, 0x42, 0x3c, 0x1f, 0x07, 0x43, 0x5b, 0x42, 0x0b, 0xc2, 0x86, 0x49, 0x6a, 0x42, 0xcb, 0x61, 0x04, 0x43, 0x86, 0x38, 0x10, 0xc2, 0x92, 0x0b, 0x68, 0x42, 0x83, 0x00, 0x07, 0x43, 0xd8, 0x1f, 0x0d, 0xc2, 0xfe, 0xc3, 0x63, 0x42, 0x0f, 0xed, 0x06, 0x43, +0x76, 0x20, 0x0e, 0xc2, 0x36, 0x2b, 0x64, 0x42, 0x3d, 0x4a, 0x09, 0x43, 0x9c, 0x44, 0x0b, 0xc2, 0xa7, 0xe8, 0x67, 0x42, 0xaa, 0x91, 0x09, 0x43, 0x50, 0x7c, 0x09, 0xc2, 0x86, 0xc9, 0x67, 0x42, 0x84, 0xc0, 0x0c, 0x43, 0x0a, 0x28, 0x04, 0xc2, 0x35, 0x0d, 0x6c, 0x42, 0xfe, 0xf4, 0x09, 0x43, 0x22, 0x2c, 0x07, 0xc2, 0xf3, 0x4e, 0x64, 0x42, 0x09, 0x2c, 0x0c, 0x43, 0x21, 0x5f, 0x06, 0xc2, 0x20, 0xd2, 0x60, 0x42, 0x52, 0x98, 0x0b, 0x43, 0x81, 0x95, 0x08, 0xc2, 0x6f, 0x92, 0x5a, 0x42, +0x2b, 0xa7, 0x0d, 0x43, 0xd6, 0x16, 0x07, 0xc2, 0x8f, 0x31, 0x5d, 0x42, 0xa4, 0x90, 0x0e, 0x43, 0xbe, 0xdf, 0x04, 0xc2, 0x06, 0xb0, 0x55, 0x42, 0x9c, 0xc4, 0x11, 0x43, 0x07, 0x1f, 0x03, 0xc2, 0xcb, 0xd0, 0x5f, 0x42, 0x1d, 0x7a, 0x0f, 0x43, 0x5e, 0xa9, 0x02, 0xc2, 0x6c, 0xf8, 0x53, 0x42, 0xf4, 0x7d, 0x10, 0x43, 0x8f, 0xd3, 0x04, 0xc2, 0xd1, 0x40, 0x52, 0x42, 0xc9, 0x36, 0x0f, 0x43, 0x17, 0x88, 0x06, 0xc2, 0x63, 0xee, 0x49, 0x42, 0x40, 0x35, 0x10, 0x43, 0x1c, 0x6b, 0x07, 0xc2, +0x7b, 0xd4, 0x4a, 0x42, 0xc1, 0xca, 0x11, 0x43, 0x93, 0xa9, 0x06, 0xc2, 0xdf, 0x8f, 0x41, 0x42, 0x4e, 0x02, 0x14, 0x43, 0xf1, 0x92, 0x0a, 0xc2, 0xc1, 0xb9, 0x4b, 0x42, 0x42, 0x60, 0x13, 0x43, 0xef, 0xe7, 0x05, 0xc2, 0x29, 0xcb, 0x41, 0x42, 0x9c, 0x44, 0x12, 0x43, 0x8e, 0x35, 0x0a, 0xc2, 0xa1, 0x05, 0x42, 0x42, 0x2b, 0x87, 0x10, 0x43, 0x2a, 0xd8, 0x09, 0xc2, 0x94, 0x36, 0x3a, 0x42, 0xd3, 0x2d, 0x10, 0x43, 0x87, 0xe7, 0x0d, 0xc2, 0xd3, 0xeb, 0x46, 0x42, 0x9e, 0x0f, 0x02, 0x43, +0x11, 0xe5, 0x19, 0xc2, 0x42, 0xfe, 0x3f, 0x42, 0x8f, 0xc2, 0x02, 0x43, 0x8a, 0x0e, 0x1c, 0xc2, 0x42, 0xfe, 0x3f, 0x42, 0x8f, 0xc2, 0x02, 0x43, 0x8a, 0x0e, 0x1c, 0xc2, 0x23, 0xf9, 0x38, 0x42, 0xa0, 0xda, 0x03, 0x43, 0x4c, 0x15, 0x1d, 0xc2, 0x24, 0xd7, 0x2d, 0x42, 0xcf, 0xb7, 0x07, 0x43, 0x94, 0x18, 0x1b, 0xc2, 0xd4, 0x5a, 0x2b, 0x42, 0x85, 0x2b, 0x0a, 0x43, 0x5e, 0x0b, 0x18, 0xc2, 0xd4, 0x5a, 0x2b, 0x42, 0x85, 0x2b, 0x0a, 0x43, 0x5e, 0x0b, 0x18, 0xc2, 0x26, 0x82, 0x2c, 0x42, +0xd1, 0x82, 0x0c, 0x43, 0xa0, 0x78, 0x13, 0xc2, 0x23, 0xf9, 0x38, 0x42, 0xa0, 0xda, 0x03, 0x43, 0x4c, 0x15, 0x1d, 0xc2, 0x52, 0xa7, 0x32, 0x42, 0xf6, 0x88, 0x05, 0x43, 0x87, 0xc5, 0x1c, 0xc2, 0x52, 0xa7, 0x32, 0x42, 0xf6, 0x88, 0x05, 0x43, 0x87, 0xc5, 0x1c, 0xc2, 0x24, 0xd7, 0x2d, 0x42, 0xcf, 0xb7, 0x07, 0x43, 0x94, 0x18, 0x1b, 0xc2, 0xa7, 0xa8, 0x53, 0x42, 0x54, 0x23, 0x02, 0x43, 0x4b, 0x59, 0x14, 0xc2, 0x54, 0x81, 0x4d, 0x42, 0x52, 0xd8, 0x01, 0x43, 0x79, 0x47, 0x17, 0xc2, +0x54, 0x81, 0x4d, 0x42, 0x52, 0xd8, 0x01, 0x43, 0x79, 0x47, 0x17, 0xc2, 0xd3, 0xeb, 0x46, 0x42, 0x9e, 0x0f, 0x02, 0x43, 0x11, 0xe5, 0x19, 0xc2, 0x26, 0x82, 0x2c, 0x42, 0xd1, 0x82, 0x0c, 0x43, 0xa0, 0x78, 0x13, 0xc2, 0xc5, 0xcf, 0x30, 0x42, 0xcb, 0x61, 0x0e, 0x43, 0x60, 0xa5, 0x0e, 0xc2, 0xc5, 0xcf, 0x30, 0x42, 0xcb, 0x61, 0x0e, 0x43, 0x60, 0xa5, 0x0e, 0xc2, 0x01, 0xde, 0x37, 0x42, 0x4e, 0x82, 0x0f, 0x43, 0x2c, 0x14, 0x0a, 0xc2, 0xa2, 0xc5, 0x5d, 0x42, 0xd1, 0xa2, 0x04, 0x43, +0xab, 0x0f, 0x0f, 0xc2, 0x2e, 0x32, 0x59, 0x42, 0xf8, 0x13, 0x03, 0x43, 0x29, 0x8b, 0x11, 0xc2, 0xa7, 0xa8, 0x53, 0x42, 0x54, 0x23, 0x02, 0x43, 0x4b, 0x59, 0x14, 0xc2, 0x2e, 0x32, 0x59, 0x42, 0xf8, 0x13, 0x03, 0x43, 0x29, 0x8b, 0x11, 0xc2, 0x01, 0xde, 0x37, 0x42, 0x4e, 0x82, 0x0f, 0x43, 0x2c, 0x14, 0x0a, 0xc2, 0xb5, 0xe6, 0x3f, 0x42, 0xc1, 0xea, 0x0f, 0x43, 0xff, 0xd0, 0x06, 0xc2, 0x15, 0x1d, 0x48, 0x42, 0x98, 0x8e, 0x0f, 0x43, 0xc8, 0x47, 0x05, 0xc2, 0xb5, 0xe6, 0x3f, 0x42, +0xc1, 0xea, 0x0f, 0x43, 0xff, 0xd0, 0x06, 0xc2, 0x19, 0xe2, 0x60, 0x42, 0xb5, 0xc8, 0x08, 0x43, 0x32, 0xd5, 0x09, 0xc2, 0x1b, 0xbc, 0x60, 0x42, 0x58, 0x99, 0x06, 0x43, 0xfc, 0x87, 0x0c, 0xc2, 0xa2, 0xc5, 0x5d, 0x42, 0xd1, 0xa2, 0x04, 0x43, 0xab, 0x0f, 0x0f, 0xc2, 0x1b, 0xbc, 0x60, 0x42, 0x58, 0x99, 0x06, 0x43, 0xfc, 0x87, 0x0c, 0xc2, 0x15, 0x1d, 0x48, 0x42, 0x98, 0x8e, 0x0f, 0x43, 0xc8, 0x47, 0x05, 0xc2, 0x8d, 0x68, 0x50, 0x42, 0x09, 0x8c, 0x0e, 0x43, 0x93, 0xe9, 0x04, 0xc2, +0x3c, 0x2c, 0x58, 0x42, 0x42, 0x00, 0x0d, 0x43, 0xb4, 0x99, 0x05, 0xc2, 0x8d, 0x68, 0x50, 0x42, 0x09, 0x8c, 0x0e, 0x43, 0x93, 0xe9, 0x04, 0xc2, 0x3c, 0x2c, 0x58, 0x42, 0x42, 0x00, 0x0d, 0x43, 0xb4, 0x99, 0x05, 0xc2, 0xf5, 0xca, 0x5d, 0x42, 0x17, 0xf9, 0x0a, 0x43, 0x18, 0x55, 0x07, 0xc2, 0x19, 0xe2, 0x60, 0x42, 0xb5, 0xc8, 0x08, 0x43, 0x32, 0xd5, 0x09, 0xc2, 0xf5, 0xca, 0x5d, 0x42, 0x17, 0xf9, 0x0a, 0x43, 0x18, 0x55, 0x07, 0xc2, 0x42, 0xfe, 0x3f, 0x42, 0x8f, 0xc2, 0x02, 0x43, +0x8a, 0x0e, 0x1c, 0xc2, 0xd3, 0xeb, 0x46, 0x42, 0x9e, 0x0f, 0x02, 0x43, 0x11, 0xe5, 0x19, 0xc2, 0x42, 0xfe, 0x3f, 0x42, 0x8f, 0xc2, 0x02, 0x43, 0x8a, 0x0e, 0x1c, 0xc2, 0x23, 0xf9, 0x38, 0x42, 0xa0, 0xda, 0x03, 0x43, 0x4c, 0x15, 0x1d, 0xc2, 0xd4, 0x5a, 0x2b, 0x42, 0x85, 0x2b, 0x0a, 0x43, 0x5e, 0x0b, 0x18, 0xc2, 0x24, 0xd7, 0x2d, 0x42, 0xcf, 0xb7, 0x07, 0x43, 0x94, 0x18, 0x1b, 0xc2, 0xd4, 0x5a, 0x2b, 0x42, 0x85, 0x2b, 0x0a, 0x43, 0x5e, 0x0b, 0x18, 0xc2, 0x26, 0x82, 0x2c, 0x42, +0xd1, 0x82, 0x0c, 0x43, 0xa0, 0x78, 0x13, 0xc2, 0x52, 0xa7, 0x32, 0x42, 0xf6, 0x88, 0x05, 0x43, 0x87, 0xc5, 0x1c, 0xc2, 0x23, 0xf9, 0x38, 0x42, 0xa0, 0xda, 0x03, 0x43, 0x4c, 0x15, 0x1d, 0xc2, 0x52, 0xa7, 0x32, 0x42, 0xf6, 0x88, 0x05, 0x43, 0x87, 0xc5, 0x1c, 0xc2, 0x24, 0xd7, 0x2d, 0x42, 0xcf, 0xb7, 0x07, 0x43, 0x94, 0x18, 0x1b, 0xc2, 0x54, 0x81, 0x4d, 0x42, 0x52, 0xd8, 0x01, 0x43, 0x79, 0x47, 0x17, 0xc2, 0xa7, 0xa8, 0x53, 0x42, 0x54, 0x23, 0x02, 0x43, 0x4b, 0x59, 0x14, 0xc2, +0x54, 0x81, 0x4d, 0x42, 0x52, 0xd8, 0x01, 0x43, 0x79, 0x47, 0x17, 0xc2, 0xd3, 0xeb, 0x46, 0x42, 0x9e, 0x0f, 0x02, 0x43, 0x11, 0xe5, 0x19, 0xc2, 0x26, 0x82, 0x2c, 0x42, 0xd1, 0x82, 0x0c, 0x43, 0xa0, 0x78, 0x13, 0xc2, 0xc5, 0xcf, 0x30, 0x42, 0xcb, 0x61, 0x0e, 0x43, 0x60, 0xa5, 0x0e, 0xc2, 0xc5, 0xcf, 0x30, 0x42, 0xcb, 0x61, 0x0e, 0x43, 0x60, 0xa5, 0x0e, 0xc2, 0x01, 0xde, 0x37, 0x42, 0x4e, 0x82, 0x0f, 0x43, 0x2c, 0x14, 0x0a, 0xc2, 0x2e, 0x32, 0x59, 0x42, 0xf8, 0x13, 0x03, 0x43, +0x29, 0x8b, 0x11, 0xc2, 0xa2, 0xc5, 0x5d, 0x42, 0xd1, 0xa2, 0x04, 0x43, 0xab, 0x0f, 0x0f, 0xc2, 0x2e, 0x32, 0x59, 0x42, 0xf8, 0x13, 0x03, 0x43, 0x29, 0x8b, 0x11, 0xc2, 0xa7, 0xa8, 0x53, 0x42, 0x54, 0x23, 0x02, 0x43, 0x4b, 0x59, 0x14, 0xc2, 0x01, 0xde, 0x37, 0x42, 0x4e, 0x82, 0x0f, 0x43, 0x2c, 0x14, 0x0a, 0xc2, 0xb5, 0xe6, 0x3f, 0x42, 0xc1, 0xea, 0x0f, 0x43, 0xff, 0xd0, 0x06, 0xc2, 0xb5, 0xe6, 0x3f, 0x42, 0xc1, 0xea, 0x0f, 0x43, 0xff, 0xd0, 0x06, 0xc2, 0x15, 0x1d, 0x48, 0x42, +0x98, 0x8e, 0x0f, 0x43, 0xc8, 0x47, 0x05, 0xc2, 0x1b, 0xbc, 0x60, 0x42, 0x58, 0x99, 0x06, 0x43, 0xfc, 0x87, 0x0c, 0xc2, 0x19, 0xe2, 0x60, 0x42, 0xb5, 0xc8, 0x08, 0x43, 0x32, 0xd5, 0x09, 0xc2, 0x1b, 0xbc, 0x60, 0x42, 0x58, 0x99, 0x06, 0x43, 0xfc, 0x87, 0x0c, 0xc2, 0xa2, 0xc5, 0x5d, 0x42, 0xd1, 0xa2, 0x04, 0x43, 0xab, 0x0f, 0x0f, 0xc2, 0x15, 0x1d, 0x48, 0x42, 0x98, 0x8e, 0x0f, 0x43, 0xc8, 0x47, 0x05, 0xc2, 0x8d, 0x68, 0x50, 0x42, 0x09, 0x8c, 0x0e, 0x43, 0x93, 0xe9, 0x04, 0xc2, +0x8d, 0x68, 0x50, 0x42, 0x09, 0x8c, 0x0e, 0x43, 0x93, 0xe9, 0x04, 0xc2, 0x3c, 0x2c, 0x58, 0x42, 0x42, 0x00, 0x0d, 0x43, 0xb4, 0x99, 0x05, 0xc2, 0xf5, 0xca, 0x5d, 0x42, 0x17, 0xf9, 0x0a, 0x43, 0x18, 0x55, 0x07, 0xc2, 0x3c, 0x2c, 0x58, 0x42, 0x42, 0x00, 0x0d, 0x43, 0xb4, 0x99, 0x05, 0xc2, 0xf5, 0xca, 0x5d, 0x42, 0x17, 0xf9, 0x0a, 0x43, 0x18, 0x55, 0x07, 0xc2, 0x19, 0xe2, 0x60, 0x42, 0xb5, 0xc8, 0x08, 0x43, 0x32, 0xd5, 0x09, 0xc2, 0xd7, 0x41, 0x70, 0x42, 0x98, 0xce, 0x03, 0x43, +0x77, 0xfe, 0x0c, 0xc2, 0x15, 0xdd, 0x68, 0x42, 0x32, 0xe8, 0x00, 0x43, 0x67, 0x55, 0x15, 0xc2, 0x38, 0x56, 0x5c, 0x42, 0x09, 0xec, 0xfd, 0x42, 0xf4, 0x2c, 0x1c, 0xc2, 0x13, 0x50, 0x71, 0x42, 0x7d, 0xdf, 0x0a, 0x43, 0x14, 0xae, 0x01, 0xc2, 0x43, 0x4b, 0x73, 0x42, 0x15, 0x4e, 0x07, 0x43, 0x0c, 0x53, 0x06, 0xc2, 0xcd, 0xcc, 0x2b, 0x42, 0xb8, 0x9e, 0x01, 0x43, 0x02, 0x9a, 0x2e, 0xc2, 0x7b, 0x43, 0x1f, 0x42, 0x83, 0xa0, 0x04, 0x43, 0xba, 0x89, 0x2b, 0xc2, 0xd9, 0x3d, 0x17, 0x42, +0x58, 0x99, 0x08, 0x43, 0x91, 0x7e, 0x29, 0xc2, 0x96, 0xc3, 0x4b, 0x42, 0xcb, 0xa1, 0x16, 0x43, 0xf6, 0x46, 0x00, 0xc2, 0x4a, 0xaa, 0x58, 0x42, 0xa6, 0x7b, 0x14, 0x43, 0x88, 0x52, 0xfb, 0xc1, 0xe7, 0x0c, 0x64, 0x42, 0xf2, 0x72, 0x11, 0x43, 0x8b, 0xdb, 0xf9, 0xc1, 0xb4, 0x59, 0x18, 0x42, 0x96, 0xe3, 0x11, 0x43, 0x39, 0xc5, 0x1e, 0xc2, 0x32, 0x26, 0x22, 0x42, 0x8e, 0x17, 0x15, 0x43, 0x5d, 0xad, 0x16, 0xc2, 0x3c, 0x7d, 0x2f, 0x42, 0x9a, 0xf9, 0x16, 0x43, 0x9c, 0xc4, 0x0d, 0xc2, +0xfb, 0x7a, 0x14, 0x42, 0xc7, 0x6b, 0x0d, 0x43, 0xdd, 0x53, 0x25, 0xc2, 0x0f, 0x0b, 0x46, 0x42, 0xa1, 0x9a, 0xfd, 0x42, 0x71, 0xbd, 0x2a, 0xc2, 0x0c, 0x42, 0x39, 0x42, 0xa7, 0x9b, 0xff, 0x42, 0xad, 0xba, 0x2e, 0xc2, 0xb6, 0x44, 0x51, 0x42, 0x3a, 0xf4, 0xfc, 0x42, 0x5b, 0xf1, 0x23, 0xc2, 0x9a, 0x77, 0x6c, 0x42, 0x0d, 0x22, 0x0e, 0x43, 0x60, 0x65, 0xfc, 0xc1, 0x48, 0xff, 0x3d, 0x42, 0xe0, 0x8f, 0x17, 0x43, 0x9a, 0x08, 0x06, 0xc2, 0x44, 0xba, 0x77, 0x42, 0xae, 0x47, 0x02, 0x43, +0xfd, 0x65, 0x06, 0xc2, 0x30, 0xdd, 0x6d, 0x42, 0xb7, 0x33, 0xfc, 0x42, 0xfa, 0x6d, 0x13, 0xc2, 0xec, 0xef, 0x5f, 0x42, 0x92, 0x6d, 0xf8, 0x42, 0x2a, 0x3a, 0x1f, 0xc2, 0x76, 0x13, 0x7b, 0x42, 0x02, 0xeb, 0x06, 0x43, 0xfe, 0x32, 0xf9, 0xc1, 0x28, 0xbe, 0x77, 0x42, 0x13, 0x83, 0x0b, 0x43, 0x48, 0xd0, 0xee, 0xc1, 0x03, 0x38, 0x20, 0x42, 0x69, 0x51, 0xfe, 0x42, 0x34, 0x80, 0x33, 0xc2, 0x17, 0x59, 0x0d, 0x42, 0xc1, 0xea, 0x02, 0x43, 0x81, 0x04, 0x33, 0xc2, 0xd4, 0x1a, 0x02, 0x42, +0x69, 0xb1, 0x07, 0x43, 0x70, 0x0e, 0x2d, 0xc2, 0xd7, 0x12, 0x5a, 0x42, 0xf2, 0xf2, 0x16, 0x43, 0x30, 0xbb, 0xe2, 0xc1, 0xf3, 0x8e, 0x48, 0x42, 0xe4, 0xa5, 0x19, 0x43, 0xd8, 0xdf, 0xe5, 0xc1, 0x93, 0x47, 0x68, 0x42, 0xfe, 0x74, 0x13, 0x43, 0x01, 0xcd, 0xe4, 0xc1, 0x0c, 0x93, 0x10, 0x42, 0xe8, 0xbb, 0x17, 0x43, 0xe8, 0xd9, 0x0d, 0xc2, 0x0c, 0xc2, 0x01, 0x42, 0xbf, 0xdf, 0x13, 0x43, 0x9a, 0x19, 0x19, 0xc2, 0x60, 0x25, 0x23, 0x42, 0x0a, 0x17, 0x1a, 0x43, 0x8c, 0x39, 0x03, 0xc2, +0x78, 0xfa, 0xf9, 0x41, 0x47, 0xa1, 0x0e, 0x43, 0xfc, 0x07, 0x25, 0xc2, 0xaa, 0x31, 0x42, 0x42, 0x32, 0xc8, 0xf7, 0x42, 0x34, 0x00, 0x31, 0xc2, 0x14, 0xee, 0x31, 0x42, 0x00, 0x80, 0xf9, 0x42, 0xa2, 0x45, 0x34, 0xc2, 0x5b, 0xe4, 0x50, 0x42, 0xb5, 0x88, 0xf7, 0x42, 0xeb, 0x51, 0x28, 0xc2, 0x68, 0x62, 0x71, 0x42, 0x29, 0xbc, 0x0f, 0x43, 0x48, 0x3f, 0xe8, 0xc1, 0x1b, 0x1e, 0x36, 0x42, 0x17, 0xb9, 0x1a, 0x43, 0x5d, 0xdc, 0xf3, 0xc1, 0x2b, 0xa7, 0x81, 0x42, 0x13, 0x23, 0x00, 0x43, +0xfd, 0x65, 0xf8, 0xc1, 0x05, 0xa3, 0x75, 0x42, 0x22, 0xb0, 0xf2, 0x42, 0x9b, 0x15, 0x10, 0xc2, 0xf6, 0x37, 0x81, 0x42, 0x21, 0x90, 0x0b, 0x43, 0x49, 0x2e, 0xcf, 0xc1, 0xb3, 0x0a, 0x84, 0x42, 0x70, 0x3d, 0x06, 0x43, 0xc1, 0xca, 0xd9, 0xc1, 0xd2, 0x4f, 0x91, 0x42, 0x65, 0xbb, 0xe8, 0x42, 0x12, 0x14, 0xbd, 0xc1, 0x22, 0x7d, 0x90, 0x42, 0x4f, 0xe2, 0xe8, 0x42, 0x6b, 0x9a, 0xb2, 0xc1, 0x44, 0x0b, 0x90, 0x42, 0x65, 0x7b, 0xe8, 0x42, 0xc7, 0x3a, 0xb7, 0xc1, 0x11, 0xc7, 0x91, 0x42, +0x9c, 0xc4, 0xe7, 0x42, 0x3d, 0x1b, 0xb5, 0xc1, 0x45, 0xc7, 0x92, 0x42, 0x32, 0x48, 0xea, 0x42, 0xed, 0x0d, 0x98, 0xc1, 0xed, 0x1c, 0x94, 0x42, 0xdc, 0x79, 0xe7, 0x42, 0x3a, 0x01, 0x97, 0xc1, 0x2d, 0x81, 0x91, 0x42, 0xd6, 0xb8, 0xe9, 0x42, 0xe4, 0xa5, 0xa7, 0xc1, 0x0f, 0x2d, 0x93, 0x42, 0x8c, 0xac, 0xe7, 0x42, 0x87, 0x05, 0xa8, 0xc1, 0x8e, 0xb5, 0x94, 0x42, 0xf4, 0xbd, 0xee, 0x42, 0x64, 0xaa, 0xa2, 0xc1, 0xd0, 0xd3, 0x92, 0x42, 0x7a, 0x29, 0xed, 0x42, 0x21, 0x1f, 0xaf, 0xc1, +0x73, 0x57, 0x99, 0x42, 0x7a, 0xe9, 0xf2, 0x42, 0xc8, 0x07, 0xa9, 0xc1, 0x27, 0x91, 0x81, 0x42, 0xc1, 0x0a, 0xf1, 0x42, 0x2c, 0x03, 0x07, 0xc2, 0xb0, 0x81, 0x8b, 0x42, 0x3e, 0xca, 0xfb, 0x42, 0xa3, 0xf0, 0xe0, 0xc1, 0x1a, 0x91, 0x84, 0x42, 0x80, 0xea, 0xf1, 0x42, 0x5e, 0xa9, 0x07, 0xc2, 0x1e, 0xc7, 0x8e, 0x42, 0x0b, 0x97, 0xfb, 0x42, 0x5f, 0xf6, 0xe2, 0xc1, 0xbc, 0xe5, 0x87, 0x42, 0x80, 0xaa, 0xfd, 0x42, 0x27, 0x0f, 0xe4, 0xc1, 0x19, 0xb3, 0x7a, 0x42, 0x65, 0x3b, 0xef, 0x42, +0xa6, 0xf9, 0x0e, 0xc2, 0x45, 0xd6, 0x91, 0x42, 0xb7, 0x33, 0xd6, 0x42, 0xe8, 0xea, 0xa8, 0xc1, 0xc2, 0x57, 0x8c, 0x42, 0x3e, 0x4a, 0xd5, 0x42, 0xc4, 0x31, 0xa1, 0xc1, 0x79, 0xb8, 0x8a, 0x42, 0x26, 0x46, 0xd7, 0x42, 0x4f, 0x1e, 0xd5, 0xc1, 0x56, 0xdd, 0x82, 0x42, 0x57, 0x0e, 0xd7, 0x42, 0x38, 0x56, 0xd7, 0xc1, 0xe4, 0xa3, 0x90, 0x42, 0x21, 0xf0, 0xd3, 0x42, 0xc1, 0x39, 0x74, 0xc1, 0xc2, 0x57, 0x8c, 0x42, 0x3e, 0x4a, 0xd5, 0x42, 0xc4, 0x31, 0xa1, 0xc1, 0xbc, 0xe5, 0x87, 0x42, +0x80, 0xaa, 0xfd, 0x42, 0x27, 0x0f, 0xe4, 0xc1, 0x71, 0x5b, 0x8d, 0x42, 0x83, 0x40, 0x02, 0x43, 0x6d, 0xd6, 0xc7, 0xc1, 0x9b, 0x64, 0x8a, 0x42, 0xe8, 0x7b, 0x02, 0x43, 0xe4, 0x83, 0xc6, 0xc1, 0x25, 0x04, 0x8d, 0x42, 0xaa, 0x51, 0x06, 0x43, 0x83, 0x2f, 0xa2, 0xc1, 0x3e, 0x59, 0x8f, 0x42, 0x23, 0x5b, 0x06, 0x43, 0xad, 0x1c, 0xa6, 0xc1, 0x9b, 0x64, 0x8a, 0x42, 0xe8, 0x7b, 0x02, 0x43, 0xe4, 0x83, 0xc6, 0xc1, 0xd6, 0xf4, 0x92, 0x42, 0x4e, 0xe2, 0x05, 0x43, 0x4a, 0x0c, 0xa9, 0xc1, +0x3f, 0x66, 0x91, 0x42, 0xa2, 0xe5, 0x01, 0x43, 0x04, 0xd6, 0xcb, 0xc1, 0xa4, 0xff, 0x89, 0x42, 0x2e, 0x32, 0xf3, 0x42, 0x22, 0x3d, 0x0a, 0xc2, 0x31, 0x59, 0x92, 0x42, 0x88, 0x96, 0xfc, 0x42, 0xe1, 0x7a, 0xe6, 0xc1, 0x88, 0x83, 0x8e, 0x42, 0x5f, 0xfa, 0xf3, 0x42, 0x3a, 0x23, 0x0b, 0xc2, 0x5e, 0x1a, 0x96, 0x42, 0x96, 0x83, 0xfd, 0x42, 0xb1, 0xae, 0xe9, 0xc1, 0xc6, 0x9c, 0x7c, 0x42, 0x4d, 0xb7, 0xe8, 0x42, 0xb3, 0x6a, 0x15, 0xc2, 0xfa, 0x6d, 0x80, 0x42, 0x7a, 0x69, 0xee, 0x42, +0xdf, 0xe0, 0x11, 0xc2, 0x94, 0xa5, 0x84, 0x42, 0x36, 0x1e, 0xe9, 0x42, 0x2e, 0xb2, 0x19, 0xc2, 0xd3, 0xbc, 0x86, 0x42, 0xd0, 0xb7, 0xee, 0x42, 0xf1, 0x34, 0x14, 0xc2, 0x6e, 0x32, 0x8d, 0x42, 0x80, 0xea, 0xed, 0x42, 0x22, 0xac, 0x14, 0xc2, 0x20, 0x72, 0x8b, 0x42, 0x88, 0x16, 0xe8, 0x42, 0xf3, 0x4e, 0x18, 0xc2, 0x45, 0x96, 0x85, 0x42, 0x6f, 0x92, 0xe2, 0x42, 0xce, 0x59, 0x16, 0xc2, 0x05, 0x23, 0x7e, 0x42, 0x70, 0x3d, 0xe2, 0x42, 0x57, 0xdb, 0x13, 0xc2, 0xde, 0x64, 0x90, 0x42, +0x3a, 0xf4, 0xd7, 0x42, 0xa6, 0xf9, 0xd6, 0xc1, 0x43, 0x7c, 0x89, 0x42, 0x30, 0x5d, 0xda, 0x42, 0xce, 0x59, 0x06, 0xc2, 0x21, 0x2e, 0x83, 0x42, 0xda, 0x0e, 0xda, 0x42, 0x33, 0x62, 0x06, 0xc2, 0xff, 0xd2, 0x95, 0x42, 0x55, 0xa3, 0xd8, 0x42, 0xc6, 0x5c, 0xd8, 0xc1, 0xba, 0xa9, 0x8f, 0x42, 0x0d, 0x42, 0xdc, 0x42, 0x0b, 0x24, 0x05, 0xc2, 0xfc, 0x89, 0x96, 0x42, 0x7c, 0xd4, 0xd6, 0x42, 0x6d, 0x56, 0xab, 0xc1, 0x7e, 0xcc, 0x9b, 0x42, 0xc5, 0xe0, 0xd7, 0x42, 0xa2, 0xc5, 0xa9, 0xc1, +0x43, 0xad, 0x96, 0x42, 0x4a, 0x4c, 0x05, 0x43, 0xd1, 0x11, 0xad, 0xc1, 0xdf, 0x3e, 0x9b, 0x42, 0xc9, 0x76, 0x04, 0x43, 0x20, 0xd2, 0xb1, 0xc1, 0x4b, 0x08, 0x95, 0x42, 0x4a, 0xec, 0x01, 0x43, 0x18, 0x15, 0xd0, 0xc1, 0xe4, 0xa3, 0x98, 0x42, 0x47, 0xe1, 0x01, 0x43, 0x5d, 0xdc, 0xd3, 0xc1, 0xe6, 0xff, 0x8f, 0x42, 0xe8, 0x7b, 0xe9, 0x42, 0xe4, 0xf2, 0x13, 0xc2, 0x21, 0xce, 0x8f, 0x42, 0x34, 0x73, 0xe6, 0x42, 0x3c, 0x3d, 0x14, 0xc2, 0xb4, 0x17, 0x8e, 0x42, 0xcb, 0x21, 0xe2, 0x42, +0x0f, 0xcb, 0x15, 0xc2, 0x69, 0x9e, 0xb1, 0x42, 0xf0, 0x27, 0xdd, 0x42, 0x21, 0x9f, 0xd7, 0xc1, 0x4c, 0xf5, 0xaf, 0x42, 0xee, 0xbc, 0xd8, 0x42, 0xc1, 0xa8, 0xd8, 0xc1, 0x05, 0x94, 0xaa, 0x42, 0x57, 0x4e, 0xdf, 0x42, 0xcb, 0x90, 0xf1, 0xc1, 0xda, 0x3b, 0xa8, 0x42, 0x13, 0x43, 0xdc, 0x42, 0x8b, 0xdb, 0xf4, 0xc1, 0x34, 0x51, 0xaa, 0x42, 0x4e, 0x22, 0xd7, 0x42, 0xbe, 0xb0, 0xd6, 0xc1, 0x4c, 0xd5, 0xa5, 0x42, 0x07, 0x41, 0xd9, 0x42, 0x87, 0x05, 0xed, 0xc1, 0xae, 0xb6, 0xb4, 0x42, +0xf2, 0x92, 0xdb, 0x42, 0x25, 0xf5, 0xc0, 0xc1, 0xf2, 0x10, 0xb3, 0x42, 0x7e, 0x3f, 0xd6, 0x42, 0x05, 0x56, 0xbe, 0xc1, 0x3a, 0x21, 0xae, 0x42, 0xa9, 0x06, 0xd5, 0x42, 0x11, 0x58, 0xba, 0xc1, 0xf3, 0xee, 0xb6, 0x42, 0xbb, 0x29, 0x0a, 0x43, 0x29, 0xba, 0xd9, 0xc1, 0x64, 0x2c, 0xba, 0x42, 0x09, 0x8c, 0x08, 0x43, 0xad, 0x69, 0xde, 0xc1, 0x21, 0xae, 0xb0, 0x42, 0xeb, 0x51, 0x07, 0x43, 0xd9, 0xbd, 0xff, 0xc1, 0x00, 0xef, 0xb3, 0x42, 0xbb, 0x89, 0x05, 0x43, 0xfc, 0x18, 0x03, 0xc2, +0xfc, 0x89, 0xae, 0x42, 0xbf, 0xbf, 0x00, 0x43, 0x37, 0xc9, 0x0d, 0xc2, 0xa7, 0xc8, 0xab, 0x42, 0xc5, 0x00, 0x03, 0x43, 0x05, 0x56, 0x0b, 0xc2, 0xea, 0x26, 0x9b, 0x42, 0x75, 0xd3, 0xed, 0x42, 0xc8, 0xf6, 0xd4, 0xc1, 0x8e, 0x84, 0x94, 0x42, 0xc7, 0x8b, 0xec, 0x42, 0xe0, 0x2d, 0xc7, 0xc1, 0xeb, 0xc2, 0x96, 0x42, 0xa3, 0x85, 0xea, 0x42, 0x68, 0x11, 0xe5, 0xc1, 0x11, 0x47, 0x94, 0x42, 0x66, 0xe6, 0xe7, 0x42, 0x18, 0x84, 0xd0, 0xc1, 0x5b, 0x51, 0x91, 0x42, 0x57, 0x8e, 0xea, 0x42, +0xb5, 0xc8, 0xb8, 0xc1, 0xec, 0x6f, 0x95, 0x42, 0xea, 0x66, 0xe6, 0x42, 0x80, 0x37, 0xea, 0xc1, 0xf4, 0x5b, 0x94, 0x42, 0xa9, 0x06, 0xe6, 0x42, 0x2c, 0x54, 0xfb, 0xc1, 0x25, 0x04, 0x95, 0x42, 0x2a, 0x1c, 0xe7, 0x42, 0xa1, 0x56, 0xbf, 0xc1, 0x68, 0x71, 0x98, 0x42, 0x46, 0xf6, 0xe5, 0x42, 0x77, 0x2d, 0xcb, 0xc1, 0x75, 0xa2, 0x9a, 0x42, 0x88, 0x56, 0xe5, 0x42, 0x62, 0x21, 0xb5, 0xc1, 0xbf, 0x6c, 0x96, 0x42, 0x6f, 0x52, 0xe6, 0x42, 0xff, 0xa1, 0xad, 0xc1, 0xc7, 0x8b, 0x9c, 0x42, +0xf9, 0xd3, 0xe4, 0x42, 0x5e, 0x29, 0xa2, 0xc1, 0x22, 0xec, 0x97, 0x42, 0x61, 0xe5, 0xe5, 0x42, 0x47, 0x83, 0x9b, 0xc1, 0x3a, 0xa3, 0x92, 0x42, 0x8f, 0x42, 0xf5, 0x42, 0xe4, 0x14, 0x0a, 0xc2, 0x1a, 0xe0, 0x99, 0x42, 0x8c, 0xac, 0xfe, 0x42, 0x8b, 0x5b, 0xec, 0xc1, 0x23, 0x5b, 0x97, 0x42, 0x4f, 0xa2, 0xf7, 0x42, 0x7b, 0x94, 0x0a, 0xc2, 0x37, 0x9a, 0x9c, 0x42, 0x9e, 0xaf, 0x00, 0x43, 0xc4, 0xb1, 0xee, 0xc1, 0xb4, 0xf9, 0x95, 0x42, 0x47, 0x61, 0xe8, 0x42, 0xe3, 0x36, 0x01, 0xc2, +0x43, 0x2b, 0x9a, 0x42, 0xab, 0x31, 0xea, 0x42, 0x2d, 0xb2, 0x04, 0xc2, 0x80, 0x48, 0x9a, 0x42, 0x5f, 0x3a, 0xec, 0x42, 0x02, 0x09, 0xf0, 0xc1, 0xbd, 0x74, 0x9e, 0x42, 0x52, 0x38, 0xed, 0x42, 0x28, 0xfe, 0xf6, 0xc1, 0xc9, 0x94, 0xa2, 0x42, 0xde, 0xa4, 0xf1, 0x42, 0xbf, 0xec, 0xe6, 0xc1, 0xb2, 0x7d, 0x9f, 0x42, 0x14, 0x2e, 0xef, 0x42, 0x19, 0x04, 0xde, 0xc1, 0x0a, 0x86, 0x97, 0x42, 0xaf, 0x07, 0xea, 0x42, 0x51, 0xc9, 0x0c, 0xc2, 0xce, 0xc8, 0x92, 0x42, 0x46, 0x76, 0xe8, 0x42, +0xbd, 0x41, 0x0a, 0xc2, 0xb7, 0x31, 0x92, 0x42, 0x77, 0xbe, 0xe5, 0x42, 0x36, 0x2b, 0x08, 0xc2, 0x16, 0xca, 0x91, 0x42, 0x38, 0x89, 0xe6, 0x42, 0x93, 0x29, 0x09, 0xc2, 0x64, 0x2c, 0x92, 0x42, 0xd8, 0xe3, 0xea, 0x42, 0xb3, 0x2a, 0x11, 0xc2, 0xf5, 0x4a, 0x96, 0x42, 0xc1, 0x0a, 0xec, 0x42, 0x1b, 0x2f, 0x12, 0xc2, 0x30, 0xb9, 0x9d, 0x42, 0xcc, 0x4c, 0xf4, 0x42, 0x55, 0xe3, 0xc8, 0xc1, 0xb2, 0xfd, 0xa1, 0x42, 0xf4, 0x3d, 0xf6, 0x42, 0xab, 0x3e, 0xd1, 0xc1, 0x04, 0x76, 0xa5, 0x42, +0x73, 0x28, 0xf8, 0x42, 0x2a, 0x98, 0xd8, 0xc1, 0x36, 0x2b, 0xa8, 0x42, 0x28, 0x71, 0xf9, 0x42, 0xb3, 0x6a, 0xbd, 0xc1, 0xed, 0xad, 0xa4, 0x42, 0x80, 0xaa, 0xf7, 0x42, 0x80, 0x6a, 0xb8, 0xc1, 0xaa, 0x60, 0xa0, 0x42, 0x03, 0xab, 0xf5, 0x42, 0xbe, 0x30, 0xb3, 0xc1, 0xeb, 0xf1, 0xa4, 0x42, 0xea, 0xc6, 0x04, 0x43, 0x04, 0xd6, 0xeb, 0xc1, 0x73, 0x86, 0xa4, 0x42, 0x2d, 0x12, 0x02, 0x43, 0x34, 0x91, 0x06, 0xc2, 0x11, 0x58, 0xa2, 0x42, 0x02, 0x4b, 0x03, 0x43, 0x94, 0x76, 0xee, 0xc1, +0xd5, 0x38, 0xa0, 0x42, 0xea, 0x26, 0xff, 0x42, 0x67, 0x95, 0x09, 0xc2, 0x62, 0xe1, 0xa8, 0x42, 0x83, 0xe0, 0x04, 0x43, 0x07, 0x9f, 0x00, 0xc2, 0x63, 0xfd, 0xa6, 0x42, 0x77, 0xfe, 0x05, 0x43, 0x56, 0xec, 0xe8, 0xc1, 0xd6, 0x05, 0xa9, 0x42, 0xd2, 0x62, 0xf6, 0x42, 0x52, 0x67, 0x07, 0xc2, 0x3d, 0xdb, 0xae, 0x42, 0x55, 0xe3, 0xfc, 0x42, 0x0d, 0x02, 0x04, 0xc2, 0xba, 0x29, 0xaa, 0x42, 0x05, 0x96, 0xf7, 0x42, 0x37, 0x49, 0x00, 0xc2, 0x05, 0xd4, 0xae, 0x42, 0x0f, 0xad, 0xfc, 0x42, +0x57, 0xdb, 0xfb, 0xc1, 0x8c, 0xca, 0xae, 0x42, 0x5d, 0xcf, 0xfc, 0x42, 0x19, 0x73, 0xf2, 0xc1, 0x6d, 0xe7, 0xab, 0x42, 0xb1, 0xb2, 0xf9, 0x42, 0x10, 0x47, 0xf2, 0xc1, 0xc2, 0x66, 0xa8, 0x42, 0xf2, 0x52, 0xf6, 0x42, 0x37, 0xf8, 0xef, 0xc1, 0x72, 0xd9, 0xa5, 0x42, 0xbf, 0x5f, 0xf3, 0x42, 0x81, 0x73, 0xff, 0xc1, 0x70, 0xdf, 0xa3, 0x42, 0xb9, 0x5e, 0xf1, 0x42, 0xdc, 0x06, 0x07, 0xc2, 0x7a, 0xa5, 0xa2, 0x42, 0xb1, 0x72, 0xf1, 0x42, 0xea, 0xb3, 0x0d, 0xc2, 0xe8, 0xf9, 0xa1, 0x42, +0x78, 0x7e, 0xf3, 0x42, 0xed, 0x5e, 0x12, 0xc2, 0xfa, 0x6d, 0xa8, 0x42, 0x22, 0xb0, 0xf6, 0x42, 0x9b, 0x55, 0x0e, 0xc2, 0x6d, 0x14, 0xa8, 0x42, 0xbd, 0x34, 0xf9, 0x42, 0xdf, 0x0f, 0x13, 0xc2, 0x95, 0xe3, 0xae, 0x42, 0x00, 0x80, 0xfe, 0x42, 0x41, 0xf1, 0x09, 0xc2, 0x37, 0xd8, 0xa3, 0x42, 0xd5, 0x38, 0x05, 0x43, 0x8e, 0x97, 0xdc, 0xc1, 0x1d, 0xda, 0xa6, 0x42, 0xeb, 0xd1, 0x05, 0x43, 0xc2, 0x06, 0xc0, 0xc1, 0xb7, 0x40, 0xa6, 0x42, 0x50, 0x6d, 0x06, 0x43, 0x20, 0xd2, 0xdb, 0xc1, +0xd5, 0xe7, 0xa8, 0x42, 0xfc, 0xe9, 0x06, 0x43, 0xaf, 0x25, 0xc1, 0xc1, 0x3e, 0x68, 0xab, 0x42, 0x19, 0x24, 0x08, 0x43, 0x32, 0xc4, 0xc2, 0xc1, 0x6b, 0x9a, 0xa8, 0x42, 0x4e, 0x82, 0x07, 0x43, 0x73, 0x68, 0xdc, 0xc1, 0xde, 0xa2, 0xaa, 0x42, 0x40, 0x35, 0xfc, 0x42, 0xb3, 0x7b, 0xe0, 0xc1, 0x52, 0xf6, 0xad, 0x42, 0x73, 0xe8, 0xfe, 0x42, 0x5d, 0x4b, 0xe3, 0xc1, 0x1d, 0x29, 0xb1, 0x42, 0x11, 0x78, 0x00, 0x43, 0x4d, 0x04, 0xe6, 0xc1, 0x93, 0xe9, 0xb4, 0x42, 0xb7, 0xd3, 0x01, 0x43, +0xba, 0xb8, 0xcd, 0xc1, 0x5e, 0x1a, 0xb1, 0x42, 0x73, 0x48, 0x00, 0x43, 0xa9, 0x82, 0xc9, 0xc1, 0xda, 0xbb, 0xad, 0x42, 0x5c, 0x8f, 0xfd, 0x42, 0xcf, 0x55, 0xc5, 0xc1, 0xd1, 0xe0, 0xac, 0x42, 0x90, 0x22, 0x08, 0x43, 0x56, 0xec, 0xed, 0xc1, 0x2b, 0x76, 0xb1, 0x42, 0x00, 0x60, 0x0a, 0x43, 0xa8, 0x24, 0xce, 0xc1, 0x40, 0x84, 0xb9, 0x42, 0x50, 0x8d, 0x04, 0x43, 0x38, 0x56, 0xd7, 0xc1, 0xbc, 0xe5, 0xb7, 0x42, 0x1b, 0x0f, 0x03, 0x43, 0x03, 0xf8, 0xd1, 0xc1, 0xd3, 0x0b, 0xb4, 0x42, +0xe6, 0xf0, 0x01, 0x43, 0xee, 0xda, 0xf3, 0xc1, 0x44, 0x0b, 0xb3, 0x42, 0x17, 0x19, 0x01, 0x43, 0x04, 0xd6, 0xeb, 0xc1, 0x29, 0xdc, 0x9a, 0x42, 0xd7, 0x23, 0xd9, 0x42, 0xb8, 0x9e, 0xd9, 0xc1, 0x95, 0x54, 0x95, 0x42, 0x28, 0xb1, 0xdc, 0x42, 0xa6, 0xf9, 0x03, 0xc2, 0x82, 0x71, 0x9f, 0x42, 0x5b, 0xe4, 0xd8, 0x42, 0xea, 0x26, 0xd9, 0xc1, 0xbb, 0x78, 0x9a, 0x42, 0x7b, 0x14, 0xdc, 0x42, 0xdf, 0x0f, 0x03, 0xc2, 0x0c, 0xb1, 0x99, 0x42, 0x59, 0x79, 0xe3, 0x42, 0x31, 0x19, 0x07, 0xc2, +0x3a, 0xa1, 0x98, 0x42, 0x01, 0x40, 0xe1, 0x42, 0x6f, 0x92, 0x08, 0xc2, 0xf4, 0x3d, 0x94, 0x42, 0xdc, 0x39, 0xe4, 0x42, 0x09, 0xb9, 0x09, 0xc2, 0x43, 0xed, 0x92, 0x42, 0x8c, 0x2c, 0xe2, 0x42, 0xb5, 0xc8, 0x0b, 0xc2, 0x46, 0xa5, 0x99, 0x42, 0xa9, 0xc6, 0xe5, 0x42, 0xb3, 0x6a, 0xec, 0xc1, 0x15, 0x0c, 0x9d, 0x42, 0x07, 0x81, 0xe5, 0x42, 0xc1, 0x97, 0xd0, 0xc1, 0x43, 0x5c, 0x9f, 0x42, 0x4c, 0xb7, 0xe4, 0x42, 0x2e, 0xff, 0xba, 0xc1, 0xe0, 0xcd, 0xa1, 0x42, 0xa9, 0x46, 0xe5, 0x42, +0xd9, 0xbd, 0xd5, 0xc1, 0x9c, 0x22, 0xa4, 0x42, 0xbb, 0x09, 0xe4, 0x42, 0x1d, 0xc9, 0xc0, 0xc1, 0x72, 0xc8, 0x9f, 0x42, 0x7a, 0xe9, 0xd7, 0x42, 0x9c, 0x33, 0xb0, 0xc1, 0x14, 0xae, 0xa3, 0x42, 0x36, 0x9e, 0xd7, 0x42, 0xcf, 0x55, 0xb4, 0xc1, 0x72, 0x39, 0xa1, 0x42, 0x61, 0x25, 0xe4, 0x42, 0xbd, 0x63, 0xa8, 0xc1, 0xb8, 0xaf, 0xa5, 0x42, 0x3a, 0xf4, 0xe2, 0x42, 0x0f, 0xfa, 0xad, 0xc1, 0xc5, 0xef, 0xa3, 0x42, 0x82, 0x95, 0xd7, 0x42, 0xa1, 0xd6, 0xd6, 0xc1, 0x82, 0x82, 0xa0, 0x42, +0x53, 0xf8, 0xda, 0x42, 0xf5, 0x4a, 0xfb, 0xc1, 0x82, 0x33, 0xa0, 0x42, 0x82, 0x55, 0xdf, 0x42, 0x3a, 0x41, 0x03, 0xc2, 0x95, 0x63, 0xa1, 0x42, 0x61, 0x65, 0xe2, 0x42, 0x5c, 0xfe, 0x02, 0xc2, 0xee, 0xba, 0xa6, 0x42, 0x61, 0x65, 0xe3, 0x42, 0xdb, 0x79, 0xdd, 0xc1, 0xee, 0x4b, 0xaa, 0x42, 0xbf, 0x9f, 0xe2, 0x42, 0xa0, 0x1a, 0xca, 0xc1, 0xbd, 0x83, 0xa7, 0x42, 0x26, 0x86, 0xd6, 0x42, 0x7f, 0xea, 0xb6, 0xc1, 0xf3, 0xff, 0xac, 0x42, 0xd8, 0x63, 0xe2, 0x42, 0xd1, 0x11, 0xb7, 0xc1, +0x23, 0xbb, 0xa2, 0x42, 0xea, 0x46, 0x04, 0x43, 0xfb, 0xcb, 0xbb, 0xc1, 0xd1, 0x00, 0x9f, 0x42, 0x25, 0x06, 0x03, 0x43, 0x6b, 0x1a, 0xdb, 0xc1, 0xfb, 0x1a, 0x9f, 0x42, 0xd3, 0x0d, 0x04, 0x43, 0x27, 0x31, 0xb6, 0xc1, 0x86, 0x58, 0x9c, 0x42, 0xea, 0x06, 0x02, 0x43, 0xa6, 0xf9, 0xd6, 0xc1, 0x24, 0xf7, 0xaa, 0x42, 0x7e, 0x3f, 0xfb, 0x42, 0x1e, 0x96, 0xc1, 0xc1, 0xc7, 0x09, 0xa8, 0x42, 0xa3, 0xf0, 0xf9, 0x42, 0x9b, 0x44, 0xdd, 0xc1, 0x07, 0x6e, 0xa5, 0x42, 0x51, 0xcd, 0xf3, 0x42, +0x81, 0x84, 0xec, 0xc1, 0x78, 0x5a, 0xa1, 0x42, 0xf9, 0x93, 0xf8, 0x42, 0xcb, 0xff, 0x13, 0xc2, 0x39, 0x14, 0x9c, 0x42, 0x7e, 0xbf, 0xf3, 0x42, 0x92, 0x1c, 0x14, 0xc2, 0x8d, 0x06, 0x9c, 0x42, 0x3c, 0x9f, 0xee, 0x42, 0x65, 0x2a, 0x13, 0xc2, 0x3a, 0x21, 0x96, 0x42, 0xd8, 0xe3, 0xf0, 0x42, 0xf0, 0x96, 0x13, 0xc2, 0x16, 0xea, 0x9b, 0x42, 0xd0, 0xf7, 0xfa, 0x42, 0x83, 0xef, 0x0a, 0xc2, 0x96, 0x92, 0x9f, 0x42, 0x0f, 0xed, 0x01, 0x43, 0x76, 0x60, 0xef, 0xc1, 0x53, 0xa5, 0x9e, 0x42, +0xbf, 0x5f, 0xec, 0x42, 0x3a, 0x52, 0x06, 0xc2, 0xb2, 0xfd, 0xa1, 0x42, 0xf0, 0xe7, 0xef, 0x42, 0x7e, 0x3f, 0xfc, 0xc1, 0x3c, 0x2c, 0xa6, 0x42, 0x09, 0xac, 0xfe, 0x42, 0x63, 0x9d, 0x11, 0xc2, 0x67, 0x15, 0x91, 0x42, 0x8c, 0x6c, 0xef, 0x42, 0x54, 0xa3, 0x12, 0xc2, 0x19, 0xb3, 0x7a, 0x42, 0x65, 0x3b, 0xef, 0x42, 0xa6, 0xf9, 0x0e, 0xc2, 0xfb, 0x7a, 0x74, 0x42, 0x75, 0x93, 0xe8, 0x42, 0x40, 0xd3, 0x11, 0xc2, 0x62, 0xb0, 0x88, 0x42, 0x7a, 0xa9, 0xde, 0x42, 0xb1, 0x7f, 0x11, 0xc2, +0x61, 0x52, 0x8f, 0x42, 0x6b, 0x1c, 0x08, 0x43, 0x09, 0xf9, 0x7e, 0xc1, 0x25, 0x04, 0x8d, 0x42, 0xaa, 0x51, 0x06, 0x43, 0x83, 0x2f, 0xa2, 0xc1, 0x01, 0x1c, 0xa5, 0x42, 0xf0, 0xe7, 0x04, 0x43, 0x76, 0xcf, 0xbe, 0xc1, 0x48, 0x5f, 0xba, 0x42, 0xee, 0x7c, 0x06, 0x43, 0x21, 0x9f, 0xdc, 0xc1, 0xee, 0xbc, 0xb3, 0x42, 0xfd, 0xe9, 0xde, 0x42, 0xdf, 0xe0, 0xbf, 0xc1, 0x45, 0xd8, 0xb0, 0x42, 0xc2, 0xf5, 0xdf, 0x42, 0xd2, 0x22, 0xd5, 0xc1, 0x22, 0xec, 0x8f, 0x42, 0x32, 0xc8, 0xe4, 0x42, +0x03, 0x27, 0x10, 0xc2, 0xe6, 0x8e, 0x96, 0x42, 0x28, 0xf1, 0xe4, 0x42, 0x25, 0x86, 0x04, 0xc2, 0x6e, 0x72, 0x9e, 0x42, 0xd6, 0xb8, 0xe5, 0x42, 0xad, 0xd8, 0xed, 0xc1, 0xb0, 0x12, 0x9c, 0x42, 0x96, 0x83, 0xe4, 0x42, 0x5d, 0xdc, 0x01, 0xc2, 0x0a, 0xc8, 0xa2, 0x42, 0x84, 0xc0, 0xe3, 0x42, 0x9a, 0x77, 0xfc, 0xc1, 0x59, 0xd5, 0xa2, 0x42, 0xd8, 0xe3, 0xe4, 0x42, 0xe3, 0x36, 0xee, 0xc1, 0x5d, 0xbc, 0x9c, 0x42, 0x5b, 0x64, 0xec, 0x42, 0xdb, 0x28, 0x0e, 0xc2, 0x92, 0xdc, 0xaa, 0x42, +0xff, 0x14, 0xe1, 0x42, 0xde, 0x24, 0xec, 0xc1, 0xd3, 0x6d, 0xb4, 0x42, 0xc2, 0x75, 0x03, 0x43, 0xa9, 0x93, 0xfd, 0xc1, 0x19, 0xb3, 0x7a, 0x42, 0x65, 0x3b, 0xef, 0x42, 0xa6, 0xf9, 0x0e, 0xc2, 0x50, 0x7c, 0x96, 0x42, 0xd6, 0xb8, 0xf1, 0x42, 0x7f, 0x59, 0xba, 0xc1, 0x5f, 0x98, 0xa1, 0x42, 0x40, 0x15, 0x04, 0x43, 0x4a, 0x7b, 0xdd, 0xc1, 0x25, 0x04, 0x8d, 0x42, 0xaa, 0x51, 0x06, 0x43, 0x83, 0x2f, 0xa2, 0xc1, 0x3a, 0xe3, 0x8b, 0x42, 0x19, 0xe4, 0x07, 0x43, 0xfb, 0x4b, 0xa9, 0xc1, +0x61, 0x52, 0x8f, 0x42, 0x6b, 0x1c, 0x08, 0x43, 0x09, 0xf9, 0x7e, 0xc1, 0x85, 0x7a, 0x88, 0x42, 0x85, 0xab, 0x03, 0x43, 0x62, 0xa1, 0xd1, 0xc1, 0xbc, 0xe5, 0x87, 0x42, 0x80, 0xaa, 0xfd, 0x42, 0x27, 0x0f, 0xe4, 0xc1, 0x19, 0xb3, 0x7a, 0x42, 0x65, 0x3b, 0xef, 0x42, 0xa6, 0xf9, 0x0e, 0xc2, 0x27, 0xe0, 0x86, 0x42, 0xa3, 0x45, 0xfe, 0x42, 0x5e, 0x29, 0xec, 0xc1, 0x84, 0x3c, 0x7b, 0x42, 0xbf, 0x5f, 0xf1, 0x42, 0x7a, 0xf6, 0x0f, 0xc2, 0x8a, 0x4e, 0x72, 0x42, 0x57, 0x4e, 0xeb, 0x42, +0xf1, 0x92, 0x15, 0xc2, 0x7a, 0x69, 0x7a, 0x42, 0x73, 0x28, 0xdc, 0x42, 0xb0, 0xe1, 0xfe, 0xc1, 0x4f, 0x5e, 0x78, 0x42, 0xad, 0x1c, 0xdb, 0x42, 0x29, 0x9c, 0x04, 0xc2, 0x8a, 0xce, 0x74, 0x42, 0x92, 0xed, 0xe2, 0x42, 0x85, 0x1a, 0x0d, 0xc2, 0xba, 0x1a, 0x73, 0x42, 0x77, 0x7e, 0xe2, 0x42, 0x98, 0xcc, 0x10, 0xc2, 0xd2, 0xef, 0x88, 0x42, 0x2a, 0x9c, 0xd1, 0x42, 0xcd, 0x4c, 0xb4, 0xc1, 0xfb, 0x7a, 0x74, 0x42, 0x75, 0x93, 0xe8, 0x42, 0x40, 0xd3, 0x11, 0xc2, 0x8a, 0xce, 0x74, 0x42, +0x92, 0xed, 0xe2, 0x42, 0x85, 0x1a, 0x0d, 0xc2, 0x56, 0xdd, 0x82, 0x42, 0x57, 0x0e, 0xd7, 0x42, 0x38, 0x56, 0xd7, 0xc1, 0x7a, 0x69, 0x7a, 0x42, 0x73, 0x28, 0xdc, 0x42, 0xb0, 0xe1, 0xfe, 0xc1, 0xc0, 0x7b, 0x82, 0x42, 0xb9, 0xde, 0xd3, 0x42, 0x3d, 0x79, 0xe1, 0xc1, 0x8a, 0xce, 0x74, 0x42, 0x92, 0xed, 0xe2, 0x42, 0x85, 0x1a, 0x0d, 0xc2, 0x7a, 0x69, 0x7a, 0x42, 0x73, 0x28, 0xdc, 0x42, 0xb0, 0xe1, 0xfe, 0xc1, 0xe4, 0xa3, 0x90, 0x42, 0x21, 0xf0, 0xd3, 0x42, 0xc1, 0x39, 0x74, 0xc1, +0xc2, 0x57, 0x8c, 0x42, 0x3e, 0x4a, 0xd5, 0x42, 0xc4, 0x31, 0xa1, 0xc1, 0x25, 0x04, 0x8d, 0x42, 0xaa, 0x51, 0x06, 0x43, 0x83, 0x2f, 0xa2, 0xc1, 0x9b, 0x64, 0x8a, 0x42, 0xe8, 0x7b, 0x02, 0x43, 0xe4, 0x83, 0xc6, 0xc1, 0x9b, 0x64, 0x8a, 0x42, 0xe8, 0x7b, 0x02, 0x43, 0xe4, 0x83, 0xc6, 0xc1, 0xbc, 0xe5, 0x87, 0x42, 0x80, 0xaa, 0xfd, 0x42, 0x27, 0x0f, 0xe4, 0xc1, 0xfb, 0x7a, 0x74, 0x42, 0x75, 0x93, 0xe8, 0x42, 0x40, 0xd3, 0x11, 0xc2, 0x19, 0xb3, 0x7a, 0x42, 0x65, 0x3b, 0xef, 0x42, +0xa6, 0xf9, 0x0e, 0xc2, 0x8a, 0xce, 0x74, 0x42, 0x92, 0xed, 0xe2, 0x42, 0x85, 0x1a, 0x0d, 0xc2, 0xfb, 0x7a, 0x74, 0x42, 0x75, 0x93, 0xe8, 0x42, 0x40, 0xd3, 0x11, 0xc2, 0x56, 0xdd, 0x82, 0x42, 0x57, 0x0e, 0xd7, 0x42, 0x38, 0x56, 0xd7, 0xc1, 0x7a, 0x69, 0x7a, 0x42, 0x73, 0x28, 0xdc, 0x42, 0xb0, 0xe1, 0xfe, 0xc1, 0xc2, 0x57, 0x8c, 0x42, 0x3e, 0x4a, 0xd5, 0x42, 0xc4, 0x31, 0xa1, 0xc1, 0x56, 0xdd, 0x82, 0x42, 0x57, 0x0e, 0xd7, 0x42, 0x38, 0x56, 0xd7, 0xc1, 0x56, 0x9d, 0x8e, 0x42, +0xbb, 0xc9, 0xe0, 0x42, 0x6b, 0x09, 0x10, 0xc2, 0xff, 0xa1, 0x88, 0x42, 0xe8, 0x3b, 0xdd, 0x42, 0x91, 0x2d, 0x0d, 0xc2, 0x08, 0xe6, 0xc4, 0x3f, 0x32, 0x75, 0x84, 0x42, 0x10, 0xe9, 0x42, 0xc2, 0xcc, 0xee, 0x2e, 0xc1, 0xad, 0xdc, 0xe1, 0x42, 0x1d, 0x72, 0x00, 0x41, 0x43, 0xc5, 0x1c, 0xc1, 0x8a, 0x41, 0xd8, 0x42, 0x3c, 0x2c, 0xe7, 0x40, 0x7b, 0x8f, 0x00, 0xc1, 0x15, 0xee, 0xce, 0x42, 0x64, 0xe4, 0xca, 0x40, 0x78, 0x5d, 0xb5, 0xc0, 0xd9, 0x3d, 0xc6, 0x42, 0x3f, 0xc6, 0xa8, 0x40, +0xab, 0x90, 0x34, 0xc0, 0x05, 0x52, 0xbe, 0x42, 0x2c, 0x82, 0x81, 0x40, 0xe4, 0x72, 0x87, 0xc2, 0x3a, 0xb4, 0x2a, 0x42, 0x27, 0xda, 0xf1, 0xbf, 0x0d, 0xc3, 0xa7, 0x3f, 0x2e, 0x10, 0xb7, 0x42, 0xbe, 0x82, 0xbd, 0x40, 0x5f, 0x98, 0xed, 0xc0, 0x19, 0xc4, 0xce, 0x42, 0x93, 0x7b, 0x03, 0x41, 0x25, 0x1e, 0x9d, 0xc0, 0x02, 0x0b, 0xc6, 0x42, 0x56, 0xec, 0xf7, 0x40, 0xec, 0xa3, 0xf3, 0xbf, 0x2e, 0x4e, 0xbe, 0x42, 0xbf, 0xd4, 0xe2, 0x40, 0x3a, 0xc1, 0x6c, 0x42, 0xda, 0x9b, 0xb7, 0x42, +0x1d, 0x3d, 0x0f, 0x41, 0xbf, 0x9f, 0x38, 0xc1, 0x7f, 0x6a, 0x22, 0x41, 0x8e, 0x64, 0x9f, 0x41, 0xc7, 0xf4, 0xaf, 0xc0, 0x2f, 0x4c, 0x22, 0x41, 0xa6, 0x8a, 0xae, 0x41, 0x2c, 0xd4, 0x7e, 0xc1, 0xf0, 0x85, 0x22, 0x41, 0x3d, 0x0a, 0x83, 0x41, 0xd7, 0xa3, 0x9a, 0xc1, 0x40, 0xa4, 0x22, 0x41, 0xd3, 0x2b, 0x3a, 0x41, 0x07, 0x4e, 0xb4, 0xc1, 0x89, 0xb0, 0x22, 0x41, 0x6a, 0xd9, 0x8c, 0x40, 0x63, 0x10, 0x21, 0x42, 0x8b, 0xfd, 0x21, 0x41, 0xb8, 0xaf, 0x5a, 0x41, 0x42, 0xe0, 0x02, 0x42, +0xb5, 0x15, 0x22, 0x41, 0x48, 0x3f, 0x94, 0x41, 0x2c, 0x65, 0xb6, 0x41, 0xff, 0x21, 0x22, 0x41, 0x55, 0x9f, 0xad, 0x41, 0xec, 0x9e, 0x63, 0x41, 0x05, 0x34, 0x22, 0x41, 0x9e, 0x5e, 0xb8, 0x41, 0x86, 0xe6, 0x2c, 0x40, 0x27, 0x31, 0x22, 0x41, 0x5d, 0xed, 0xb8, 0x41, 0xad, 0xa9, 0x31, 0x42, 0xb2, 0x0c, 0x22, 0x41, 0xa7, 0x3a, 0xf2, 0x40, 0x24, 0x45, 0xda, 0x40, 0x27, 0x31, 0x22, 0x41, 0x80, 0x26, 0xbd, 0x41, 0xa3, 0x52, 0x3a, 0x42, 0xed, 0x7c, 0x22, 0x41, 0xfd, 0xdb, 0x4d, 0x3f, +0x8c, 0x39, 0xc9, 0xc1, 0x5f, 0x98, 0x22, 0x41, 0x36, 0x3c, 0x0d, 0xc0, 0x24, 0x28, 0x3a, 0x42, 0x9e, 0x5e, 0x22, 0x41, 0xf4, 0xb2, 0x05, 0xc1, 0xbb, 0x96, 0x49, 0xc1, 0x7f, 0x6a, 0x22, 0x41, 0x71, 0x2c, 0xe2, 0xc1, 0xc0, 0x5b, 0xd2, 0xc0, 0x73, 0x46, 0x22, 0x41, 0x0e, 0xad, 0xf0, 0xc1, 0x09, 0xf9, 0x93, 0xc1, 0x62, 0xa1, 0x22, 0x41, 0x5a, 0xe4, 0xcc, 0xc1, 0x24, 0x97, 0xad, 0xc1, 0x86, 0xa7, 0x22, 0x41, 0xc1, 0x39, 0xa4, 0xc1, 0x6b, 0x2b, 0xad, 0xc1, 0x3a, 0x92, 0x22, 0x41, +0x4f, 0xaf, 0x64, 0xc1, 0xc9, 0xa5, 0x22, 0x42, 0xe0, 0x2d, 0x22, 0x41, 0xa6, 0x9b, 0xaf, 0xc1, 0x79, 0xd8, 0x03, 0x42, 0xc3, 0x64, 0x22, 0x41, 0x5d, 0x4b, 0xd9, 0xc1, 0x33, 0xb3, 0xb7, 0x41, 0xf3, 0x8e, 0x22, 0x41, 0xf0, 0xa7, 0xfe, 0xc1, 0xea, 0x73, 0x5d, 0x41, 0x84, 0x9e, 0x22, 0x41, 0x88, 0x96, 0x06, 0xc2, 0x0c, 0x76, 0x07, 0x40, 0x7c, 0x61, 0x22, 0x41, 0xa2, 0xc5, 0x01, 0xc2, 0x54, 0x12, 0x33, 0x42, 0xbb, 0x27, 0x22, 0x41, 0x36, 0x3c, 0x78, 0xc1, 0xbb, 0x61, 0xc1, 0x40, +0x7c, 0x61, 0x22, 0x41, 0xa0, 0x1a, 0x02, 0xc2, 0x51, 0xda, 0xb5, 0xc1, 0x40, 0xa4, 0x22, 0x41, 0x02, 0xc8, 0x0c, 0xc1, 0x82, 0x73, 0x49, 0x41, 0xd6, 0xc5, 0x22, 0x41, 0x33, 0x8a, 0x73, 0xc0, 0x58, 0xf9, 0x2a, 0xc2, 0x41, 0x80, 0xb9, 0x42, 0xa3, 0xaa, 0x4f, 0xc0, 0x36, 0xde, 0x43, 0xc2, 0x9c, 0xc2, 0xbc, 0x42, 0x3d, 0xb8, 0x5b, 0xc0, 0xe4, 0x72, 0x87, 0xc2, 0x3a, 0xb4, 0x2a, 0x42, 0x27, 0xda, 0xf1, 0xbf, 0xd5, 0x98, 0x8a, 0xc2, 0xa8, 0x24, 0x50, 0x42, 0x96, 0xe7, 0xfd, 0xbf, +0x0a, 0x28, 0x8a, 0xc2, 0x04, 0x45, 0x6c, 0x42, 0x55, 0x30, 0xfe, 0xbf, 0x8d, 0x06, 0x88, 0xc2, 0x8c, 0x2c, 0x85, 0x42, 0x92, 0x57, 0xfb, 0xbf, 0x3a, 0xa1, 0x84, 0xc2, 0xd6, 0xf4, 0x96, 0x42, 0xa6, 0x96, 0x07, 0xc0, 0x68, 0x80, 0x76, 0xc2, 0xe1, 0x5a, 0xad, 0x42, 0xb4, 0x59, 0x3d, 0xc0, 0x1d, 0xc9, 0x5d, 0xc2, 0x95, 0xf4, 0xb8, 0x42, 0x10, 0xc7, 0x58, 0xc0, 0x36, 0xde, 0x43, 0xc2, 0x9c, 0xc2, 0xbc, 0x42, 0x3d, 0xb8, 0x5b, 0xc0, 0x9e, 0x8d, 0x14, 0xc2, 0xe2, 0xe7, 0xb1, 0x42, +0x76, 0x89, 0x3e, 0xc0, 0xea, 0x73, 0x03, 0xc2, 0xf0, 0x05, 0xa7, 0x42, 0x31, 0xeb, 0xf9, 0xbf, 0xc9, 0x54, 0xe9, 0xc1, 0x42, 0xbe, 0xa0, 0x42, 0x71, 0xfe, 0xd6, 0xbf, 0x9c, 0xc4, 0xa8, 0xc1, 0x8d, 0x28, 0x81, 0x42, 0x37, 0xda, 0x26, 0x42, 0x2a, 0x29, 0xe2, 0xc1, 0xc9, 0x65, 0x76, 0x42, 0xc8, 0xb6, 0x2a, 0x42, 0x7a, 0x4e, 0xca, 0x3f, 0xb7, 0xa0, 0x85, 0x42, 0x5b, 0xf1, 0x24, 0x42, 0xb1, 0xbf, 0x29, 0xc1, 0xc2, 0x26, 0x83, 0x42, 0x05, 0x12, 0x25, 0x42, 0x60, 0xd4, 0xa4, 0xc1, +0xb6, 0xe2, 0xf4, 0x41, 0x8a, 0x41, 0x3c, 0x42, 0x30, 0x99, 0xdf, 0xc1, 0x18, 0xe6, 0x11, 0x42, 0xc0, 0x8a, 0x3a, 0x42, 0xc8, 0x07, 0x00, 0xc2, 0x2b, 0x47, 0x2d, 0x42, 0x59, 0x06, 0x37, 0x42, 0xcb, 0x50, 0x05, 0xc2, 0xe4, 0x83, 0x48, 0x42, 0x5d, 0x6d, 0x33, 0x42, 0x81, 0x78, 0x1d, 0xc1, 0xb6, 0x04, 0xd1, 0x41, 0xad, 0x9c, 0x3c, 0x42, 0xfb, 0x8b, 0x00, 0xc2, 0x88, 0xf4, 0x61, 0x42, 0xe3, 0x54, 0x2f, 0x42, 0x71, 0xe6, 0x47, 0x40, 0xde, 0x82, 0xc0, 0x41, 0x3b, 0x1f, 0x3d, 0x42, +0x9f, 0x3c, 0x83, 0x41, 0xaa, 0x71, 0xbf, 0x41, 0x7e, 0x3b, 0x3c, 0x42, 0xac, 0x7a, 0xef, 0x41, 0x05, 0x34, 0xcf, 0x41, 0x2a, 0x18, 0x3a, 0x42, 0x3e, 0x57, 0x5b, 0x41, 0x64, 0x8c, 0x89, 0x42, 0xcc, 0x6e, 0x24, 0x42, 0x7c, 0xe1, 0xd3, 0x41, 0x4d, 0x84, 0x8a, 0x42, 0x96, 0x32, 0x25, 0x42, 0x08, 0xe6, 0xc4, 0x3f, 0x32, 0x75, 0x84, 0x42, 0x10, 0xe9, 0x42, 0xc2, 0x8d, 0x28, 0x32, 0xc1, 0x5f, 0xfa, 0x82, 0x42, 0x65, 0xc8, 0x42, 0xc2, 0x35, 0xef, 0xad, 0xc1, 0x04, 0x05, 0x80, 0x42, +0x44, 0x29, 0x45, 0xc2, 0x50, 0xeb, 0xe9, 0xc1, 0x5d, 0x2d, 0x73, 0x42, 0xd6, 0x05, 0x49, 0xc2, 0x58, 0x28, 0x01, 0xc2, 0x40, 0x93, 0x2c, 0x42, 0x78, 0x8b, 0x54, 0xc2, 0xad, 0xfa, 0x06, 0xc2, 0x8f, 0x31, 0x45, 0x42, 0xe3, 0x94, 0x51, 0xc2, 0x33, 0x22, 0xa3, 0xc1, 0xd8, 0xdf, 0xf9, 0x41, 0xe5, 0x21, 0x59, 0xc2, 0xcd, 0xaa, 0xde, 0xc1, 0xd8, 0x70, 0x13, 0x42, 0xb1, 0x72, 0x57, 0xc2, 0x07, 0xce, 0x20, 0xc1, 0x1a, 0xaf, 0xd4, 0x41, 0xb4, 0x08, 0x5a, 0xc2, 0xb7, 0x51, 0x03, 0xc2, +0xab, 0x7e, 0x5d, 0x42, 0x7e, 0xbb, 0x4d, 0xc2, 0xf0, 0xa7, 0x2e, 0x40, 0xbf, 0x6c, 0xc1, 0x41, 0xcb, 0x50, 0x5b, 0xc2, 0x92, 0x3a, 0x7e, 0x41, 0xc9, 0x54, 0xbf, 0x41, 0x8c, 0xec, 0x5a, 0xc2, 0xf6, 0x06, 0xec, 0x41, 0xcc, 0x5d, 0xd0, 0x41, 0xe3, 0x54, 0x58, 0xc2, 0x74, 0x24, 0x5a, 0x41, 0xc0, 0xbb, 0x87, 0x42, 0x64, 0x8c, 0x42, 0xc2, 0x23, 0xdb, 0xd5, 0x41, 0x5d, 0x0d, 0x88, 0x42, 0x88, 0x23, 0x43, 0xc2 + }; + + + static byte[] k_rgIndices = + { + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x05, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x05, 0x00, 0x05, 0x00, 0x10, 0x00, 0x12, 0x00, 0x10, 0x00, 0x13, 0x00, 0x12, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x13, 0x00, 0x10, 0x00, 0x15, 0x00, 0x15, 0x00, 0x10, 0x00, 0x11, 0x00, 0x16, 0x00, 0x06, 0x00, 0x12, 0x00, 0x12, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x09, 0x00, 0x09, 0x00, 0x16, 0x00, 0x17, 0x00, 0x16, 0x00, 0x18, 0x00, 0x17, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x18, 0x00, 0x16, 0x00, +0x14, 0x00, 0x14, 0x00, 0x16, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x0b, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x1e, 0x00, 0x1d, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x13, 0x00, 0x22, 0x00, 0x22, 0x00, 0x13, 0x00, 0x15, 0x00, 0x13, 0x00, 0x21, 0x00, 0x14, 0x00, 0x14, 0x00, 0x21, 0x00, 0x23, 0x00, +0x21, 0x00, 0x24, 0x00, 0x23, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x24, 0x00, 0x21, 0x00, 0x26, 0x00, 0x26, 0x00, 0x21, 0x00, 0x22, 0x00, 0x27, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x20, 0x00, 0x20, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2a, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x29, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x29, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x29, 0x00, 0x28, 0x00, 0x28, 0x00, +0x29, 0x00, 0x20, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x32, 0x00, 0x32, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x33, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x2c, 0x00, 0x33, 0x00, 0x34, 0x00, 0x32, 0x00, 0x32, 0x00, 0x34, 0x00, 0x31, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x37, 0x00, 0x36, 0x00, 0x38, 0x00, 0x36, 0x00, 0x2f, 0x00, +0x38, 0x00, 0x38, 0x00, 0x2f, 0x00, 0x31, 0x00, 0x34, 0x00, 0x39, 0x00, 0x31, 0x00, 0x31, 0x00, 0x39, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x3c, 0x00, 0x3e, 0x00, 0x3c, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x35, 0x00, 0x37, 0x00, 0x3a, 0x00, 0x3f, 0x00, 0x37, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x40, 0x00, 0x3d, 0x00, +0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x43, 0x00, 0x42, 0x00, 0x44, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x45, 0x00, 0x44, 0x00, 0x46, 0x00, 0x44, 0x00, 0x47, 0x00, 0x46, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x47, 0x00, 0x44, 0x00, 0x49, 0x00, 0x49, 0x00, 0x44, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4b, 0x00, 0x4d, 0x00, 0x4b, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4a, 0x00, 0x4f, 0x00, 0x4a, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4f, 0x00, +0x43, 0x00, 0x45, 0x00, 0x43, 0x00, 0x4a, 0x00, 0x41, 0x00, 0x41, 0x00, 0x4a, 0x00, 0x4c, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x50, 0x00, 0x51, 0x00, 0x4f, 0x00, 0x45, 0x00, 0x50, 0x00, 0x50, 0x00, 0x45, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x55, 0x00, 0x54, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x59, 0x00, 0x58, 0x00, 0x5a, 0x00, 0x58, 0x00, 0x5b, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x54, 0x00, 0x53, 0x00, +0x5d, 0x00, 0x5d, 0x00, 0x53, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x61, 0x00, 0x60, 0x00, 0x62, 0x00, 0x60, 0x00, 0x53, 0x00, 0x62, 0x00, 0x62, 0x00, 0x53, 0x00, 0x55, 0x00, 0x53, 0x00, 0x60, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x60, 0x00, 0x63, 0x00, 0x60, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x64, 0x00, 0x64, 0x00, 0x66, 0x00, 0x63, 0x00, 0x66, 0x00, 0x67, 0x00, 0x63, 0x00, 0x63, 0x00, 0x67, 0x00, 0x5e, 0x00, +0x67, 0x00, 0x66, 0x00, 0x68, 0x00, 0x68, 0x00, 0x66, 0x00, 0x69, 0x00, 0x66, 0x00, 0x65, 0x00, 0x69, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x70, 0x00, 0x70, 0x00, 0x65, 0x00, 0x64, 0x00, 0x6c, 0x00, 0x6b, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x71, 0x00, 0x18, 0x00, 0x23, 0x00, 0x23, 0x00, +0x18, 0x00, 0x14, 0x00, 0x18, 0x00, 0x71, 0x00, 0x19, 0x00, 0x19, 0x00, 0x71, 0x00, 0x72, 0x00, 0x71, 0x00, 0x73, 0x00, 0x72, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x73, 0x00, 0x71, 0x00, 0x25, 0x00, 0x25, 0x00, 0x71, 0x00, 0x23, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x77, 0x00, 0x76, 0x00, 0x78, 0x00, 0x76, 0x00, 0x79, 0x00, 0x78, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x24, 0x00, 0x7b, 0x00, 0x25, 0x00, 0x25, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7b, 0x00, 0x7d, 0x00, +0x7c, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7d, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7b, 0x00, 0x80, 0x00, 0x7b, 0x00, 0x24, 0x00, 0x80, 0x00, 0x80, 0x00, 0x24, 0x00, 0x26, 0x00, 0x73, 0x00, 0x81, 0x00, 0x74, 0x00, 0x74, 0x00, 0x81, 0x00, 0x82, 0x00, 0x81, 0x00, 0x83, 0x00, 0x82, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x83, 0x00, 0x81, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x81, 0x00, 0x7c, 0x00, 0x81, 0x00, 0x73, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x73, 0x00, 0x25, 0x00, +0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x87, 0x00, 0x86, 0x00, 0x88, 0x00, 0x79, 0x00, 0x85, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x85, 0x00, 0x87, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x8a, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x8e, 0x00, 0x4c, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x8f, 0x00, 0x41, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x92, 0x00, 0x91, 0x00, 0x93, 0x00, 0x91, 0x00, 0x94, 0x00, 0x93, 0x00, 0x93, 0x00, +0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x98, 0x00, 0x97, 0x00, 0x99, 0x00, 0x97, 0x00, 0x3b, 0x00, 0x99, 0x00, 0x99, 0x00, 0x3b, 0x00, 0x3d, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x49, 0x00, 0x49, 0x00, 0x9b, 0x00, 0x47, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x47, 0x00, 0x47, 0x00, 0x9c, 0x00, 0x48, 0x00, 0x9c, 0x00, 0x9b, 0x00, 0x96, 0x00, 0x96, 0x00, 0x9b, 0x00, 0x97, 0x00, 0x9b, 0x00, 0x9a, 0x00, 0x97, 0x00, 0x97, 0x00, 0x9a, 0x00, 0x3b, 0x00, 0x40, 0x00, 0x9d, 0x00, +0x3d, 0x00, 0x3d, 0x00, 0x9d, 0x00, 0x99, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x99, 0x00, 0x99, 0x00, 0x9e, 0x00, 0x98, 0x00, 0x9f, 0x00, 0x52, 0x00, 0x46, 0x00, 0x46, 0x00, 0x52, 0x00, 0x45, 0x00, 0x46, 0x00, 0x48, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x48, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0xa2, 0x00, 0x5a, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0xa3, 0x00, 0x59, 0x00, 0xa3, 0x00, 0xa2, 0x00, 0x95, 0x00, 0x95, 0x00, 0xa2, 0x00, 0x93, 0x00, +0xa2, 0x00, 0xa1, 0x00, 0x93, 0x00, 0x93, 0x00, 0xa1, 0x00, 0x92, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0xa5, 0x00, 0xa7, 0x00, 0xa5, 0x00, 0xa8, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xa8, 0x00, 0xa5, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0xa5, 0x00, 0x6e, 0x00, 0xa5, 0x00, 0xa4, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0xa4, 0x00, 0x6d, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0xab, 0x00, 0x92, 0x00, 0xac, 0x00, 0xad, 0x00, 0x68, 0x00, 0x68, 0x00, +0xad, 0x00, 0x67, 0x00, 0xad, 0x00, 0x5d, 0x00, 0x67, 0x00, 0x67, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5b, 0x00, 0xaa, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0xaa, 0x00, 0xa1, 0x00, 0x70, 0x00, 0xae, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0xae, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xae, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xae, 0x00, 0x5f, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x5f, 0x00, 0x61, 0x00, 0x5f, 0x00, 0xae, 0x00, 0x64, 0x00, 0x64, 0x00, 0xae, 0x00, 0x70, 0x00, 0x9e, 0x00, 0xb0, 0x00, +0x98, 0x00, 0x98, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb0, 0x00, 0xb2, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xb5, 0x00, 0xa0, 0x00, 0xb5, 0x00, 0xb4, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xb4, 0x00, 0xb8, 0x00, 0xb4, 0x00, 0xb9, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xb9, 0x00, 0xb4, 0x00, 0x96, 0x00, 0x96, 0x00, 0xb4, 0x00, 0xb6, 0x00, 0xba, 0x00, 0xb9, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xb9, 0x00, 0xb1, 0x00, +0xb1, 0x00, 0xb9, 0x00, 0x98, 0x00, 0x98, 0x00, 0xb9, 0x00, 0x96, 0x00, 0xb5, 0x00, 0xbb, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xbb, 0x00, 0x9f, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xbc, 0x00, 0x52, 0x00, 0xbc, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xbb, 0x00, 0xbe, 0x00, 0xbb, 0x00, 0xb5, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xb5, 0x00, 0xb7, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xc0, 0x00, 0x0e, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc3, 0x00, +0xc2, 0x00, 0xc4, 0x00, 0xc2, 0x00, 0xbf, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0xbf, 0x00, 0x0f, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0x03, 0x00, 0x03, 0x00, 0xc6, 0x00, 0x02, 0x00, 0xc0, 0x00, 0xc7, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xc7, 0x00, 0x1b, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0xc9, 0x00, 0xc3, 0x00, 0xc9, 0x00, 0xc8, 0x00, 0xca, 0x00, 0xca, 0x00, 0xc8, 0x00, 0xcb, 0x00, 0xc8, 0x00, 0x0a, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0xc8, 0x00, +0x0f, 0x00, 0x0f, 0x00, 0xc8, 0x00, 0xc4, 0x00, 0xc6, 0x00, 0xcc, 0x00, 0x02, 0x00, 0x02, 0x00, 0xcc, 0x00, 0x11, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0x11, 0x00, 0x11, 0x00, 0xcd, 0x00, 0x15, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xcf, 0x00, 0xd1, 0x00, 0xcf, 0x00, 0xd2, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd5, 0x00, 0xd7, 0x00, 0xd5, 0x00, 0xd4, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xd4, 0x00, 0xd9, 0x00, +0xd2, 0x00, 0xda, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0xda, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xda, 0x00, 0xdd, 0x00, 0xde, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xdf, 0x00, 0xe1, 0x00, 0xdf, 0x00, 0xd6, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xe2, 0x00, 0xe3, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0xe3, 0x00, 0xdc, 0x00, 0xe3, 0x00, 0xe2, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0xe2, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe8, 0x00, +0xe7, 0x00, 0xe9, 0x00, 0xe7, 0x00, 0xde, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xde, 0x00, 0xe0, 0x00, 0xea, 0x00, 0x9a, 0x00, 0xeb, 0x00, 0xeb, 0x00, 0x9a, 0x00, 0x49, 0x00, 0x9a, 0x00, 0xea, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0xea, 0x00, 0x3c, 0x00, 0xea, 0x00, 0xec, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0xec, 0x00, 0x35, 0x00, 0x9c, 0x00, 0xb6, 0x00, 0x48, 0x00, 0x48, 0x00, 0xb6, 0x00, 0xa0, 0x00, 0xb6, 0x00, 0x9c, 0x00, 0x96, 0x00, 0xec, 0x00, 0xed, 0x00, 0x35, 0x00, 0x35, 0x00, 0xed, 0x00, +0x36, 0x00, 0xed, 0x00, 0xee, 0x00, 0x36, 0x00, 0x36, 0x00, 0xee, 0x00, 0x2f, 0x00, 0xee, 0x00, 0xef, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0xef, 0x00, 0x30, 0x00, 0x30, 0x00, 0xef, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0xef, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x2a, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2a, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xf4, 0x00, 0xca, 0x00, 0xf3, 0x00, 0x1d, 0x00, 0xf2, 0x00, +0xf2, 0x00, 0x1d, 0x00, 0x1f, 0x00, 0x1d, 0x00, 0xf3, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xf3, 0x00, 0xcb, 0x00, 0xcd, 0x00, 0xf5, 0x00, 0x15, 0x00, 0x15, 0x00, 0xf5, 0x00, 0x22, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0x22, 0x00, 0x22, 0x00, 0xf6, 0x00, 0x26, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0x26, 0x00, 0x26, 0x00, 0xf7, 0x00, 0x80, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0x80, 0x00, 0x80, 0x00, 0xf8, 0x00, 0x7f, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0xfa, 0x00, 0xfc, 0x00, 0xf8, 0x00, +0xf9, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0xf9, 0x00, 0xfb, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0xfe, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0xfd, 0x00, 0xff, 0x00, 0xff, 0x00, 0xfd, 0x00, 0x89, 0x00, 0x00, 0x01, 0x01, 0x01, 0x86, 0x00, 0x86, 0x00, 0x01, 0x01, 0x88, 0x00, 0x02, 0x01, 0x03, 0x01, 0x00, 0x01, 0x00, 0x01, 0x03, 0x01, 0x01, 0x01, 0x8b, 0x00, 0x8f, 0x00, 0x89, 0x00, 0x89, 0x00, 0x8f, 0x00, 0xff, 0x00, 0x04, 0x01, 0x42, 0x00, 0x8b, 0x00, 0x42, 0x00, 0x41, 0x00, +0x8b, 0x00, 0x8b, 0x00, 0x41, 0x00, 0x8f, 0x00, 0x05, 0x01, 0x06, 0x01, 0xf7, 0x00, 0xf7, 0x00, 0x06, 0x01, 0xf8, 0x00, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x09, 0x01, 0x08, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x07, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0x07, 0x01, 0x09, 0x01, 0x0d, 0x01, 0x05, 0x01, 0xf6, 0x00, 0xf6, 0x00, 0x05, 0x01, 0xf7, 0x00, 0x0e, 0x01, 0x0f, 0x01, 0xf9, 0x00, 0xf9, 0x00, 0x0f, 0x01, 0xfa, 0x00, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x12, 0x01, 0x11, 0x01, 0x13, 0x01, +0x08, 0x01, 0x10, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x10, 0x01, 0x12, 0x01, 0x06, 0x01, 0x0e, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0x0e, 0x01, 0xf9, 0x00, 0xf3, 0x00, 0x14, 0x01, 0xf4, 0x00, 0xf4, 0x00, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x18, 0x01, 0x17, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1b, 0x01, 0x1d, 0x01, 0x14, 0x01, 0xf3, 0x00, 0x1e, 0x01, 0x1e, 0x01, 0xf3, 0x00, 0xf2, 0x00, 0x1f, 0x01, 0x0d, 0x01, 0xf5, 0x00, 0xf5, 0x00, +0x0d, 0x01, 0xf6, 0x00, 0x20, 0x01, 0x0b, 0x01, 0x21, 0x01, 0x21, 0x01, 0x0b, 0x01, 0x0c, 0x01, 0xf1, 0x00, 0x22, 0x01, 0xf2, 0x00, 0xf2, 0x00, 0x22, 0x01, 0x1e, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x23, 0x01, 0x23, 0x01, 0x1d, 0x01, 0x24, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x25, 0x01, 0x24, 0x01, 0x26, 0x01, 0x22, 0x01, 0xf1, 0x00, 0x27, 0x01, 0x27, 0x01, 0xf1, 0x00, 0xf0, 0x00, 0xef, 0x00, 0x28, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0x28, 0x01, 0x27, 0x01, 0x25, 0x01, 0x26, 0x01, +0x29, 0x01, 0x29, 0x01, 0x26, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x29, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2d, 0x01, 0x28, 0x01, 0xee, 0x00, 0xee, 0x00, 0x28, 0x01, 0xef, 0x00, 0x2e, 0x01, 0x2f, 0x01, 0xea, 0x00, 0xea, 0x00, 0x2f, 0x01, 0xec, 0x00, 0x30, 0x01, 0x31, 0x01, 0x32, 0x01, 0x32, 0x01, 0x31, 0x01, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x36, 0x01, 0x35, 0x01, 0x37, 0x01, 0x38, 0x01, 0x2e, 0x01, 0xeb, 0x00, 0xeb, 0x00, 0x2e, 0x01, 0xea, 0x00, +0x39, 0x01, 0x2d, 0x01, 0xed, 0x00, 0xed, 0x00, 0x2d, 0x01, 0xee, 0x00, 0x3a, 0x01, 0x2b, 0x01, 0x3b, 0x01, 0x3b, 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x31, 0x01, 0x3a, 0x01, 0x33, 0x01, 0x33, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x2f, 0x01, 0x39, 0x01, 0xec, 0x00, 0xec, 0x00, 0x39, 0x01, 0xed, 0x00, 0xfd, 0x00, 0x3c, 0x01, 0x89, 0x00, 0x89, 0x00, 0x3c, 0x01, 0x8a, 0x00, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x3e, 0x01, 0x40, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x11, 0x01, 0x11, 0x01, +0x40, 0x01, 0x13, 0x01, 0x3c, 0x01, 0xfd, 0x00, 0x0f, 0x01, 0x0f, 0x01, 0xfd, 0x00, 0xfa, 0x00, 0x41, 0x01, 0x42, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x42, 0x01, 0x3e, 0x01, 0x43, 0x01, 0x44, 0x01, 0x41, 0x01, 0x41, 0x01, 0x44, 0x01, 0x42, 0x01, 0x45, 0x01, 0x46, 0x01, 0x7a, 0x00, 0x7a, 0x00, 0x46, 0x01, 0x78, 0x00, 0x77, 0x00, 0x78, 0x00, 0x47, 0x01, 0x47, 0x01, 0x78, 0x00, 0x46, 0x01, 0x48, 0x01, 0x49, 0x01, 0x88, 0x00, 0x88, 0x00, 0x49, 0x01, 0x87, 0x00, 0x7a, 0x00, 0x87, 0x00, +0x45, 0x01, 0x45, 0x01, 0x87, 0x00, 0x49, 0x01, 0x4a, 0x01, 0xce, 0x00, 0x4b, 0x01, 0x4b, 0x01, 0xce, 0x00, 0xd0, 0x00, 0xd9, 0x00, 0x4c, 0x01, 0xd8, 0x00, 0xd8, 0x00, 0x4c, 0x01, 0x4d, 0x01, 0x47, 0x01, 0x4e, 0x01, 0x77, 0x00, 0x77, 0x00, 0x4e, 0x01, 0x75, 0x00, 0xd8, 0x00, 0x4d, 0x01, 0xd5, 0x00, 0xd5, 0x00, 0x4d, 0x01, 0x4f, 0x01, 0xd5, 0x00, 0x4f, 0x01, 0xd7, 0x00, 0xd7, 0x00, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0x00, 0x50, 0x01, 0xe1, 0x00, 0xe1, 0x00, 0x50, 0x01, 0x51, 0x01, +0xe0, 0x00, 0xe1, 0x00, 0x52, 0x01, 0x52, 0x01, 0xe1, 0x00, 0x51, 0x01, 0x53, 0x01, 0x54, 0x01, 0xe8, 0x00, 0xe8, 0x00, 0x54, 0x01, 0xe6, 0x00, 0xe4, 0x00, 0xe5, 0x00, 0x55, 0x01, 0x55, 0x01, 0xe5, 0x00, 0x56, 0x01, 0x52, 0x01, 0x57, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0x57, 0x01, 0xe9, 0x00, 0xe8, 0x00, 0xe9, 0x00, 0x53, 0x01, 0x53, 0x01, 0xe9, 0x00, 0x57, 0x01, 0x58, 0x01, 0x01, 0x01, 0x59, 0x01, 0x59, 0x01, 0x01, 0x01, 0x03, 0x01, 0x48, 0x01, 0x88, 0x00, 0x58, 0x01, 0x58, 0x01, +0x88, 0x00, 0x01, 0x01, 0x59, 0x01, 0x03, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0x03, 0x01, 0x02, 0x01, 0x5a, 0x01, 0x02, 0x01, 0x5b, 0x01, 0x5b, 0x01, 0x02, 0x01, 0x5c, 0x01, 0x5c, 0x01, 0xe4, 0x00, 0x5b, 0x01, 0x5b, 0x01, 0xe4, 0x00, 0x55, 0x01, 0x00, 0x01, 0x5d, 0x01, 0x02, 0x01, 0x02, 0x01, 0x5d, 0x01, 0x5c, 0x01, 0xe3, 0x00, 0x5d, 0x01, 0xdc, 0x00, 0xdc, 0x00, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x5e, 0x01, 0x85, 0x00, 0x85, 0x00, 0x5e, 0x01, 0x86, 0x00, 0x5f, 0x01, 0x60, 0x01, +0xdb, 0x00, 0xdb, 0x00, 0x60, 0x01, 0xd3, 0x00, 0x61, 0x01, 0x60, 0x01, 0x76, 0x00, 0x76, 0x00, 0x60, 0x01, 0x79, 0x00, 0x61, 0x01, 0x62, 0x01, 0xd1, 0x00, 0xd1, 0x00, 0x62, 0x01, 0xd0, 0x00, 0x62, 0x01, 0x75, 0x00, 0x63, 0x01, 0x63, 0x01, 0x75, 0x00, 0x4e, 0x01, 0x62, 0x01, 0x63, 0x01, 0xd0, 0x00, 0xd0, 0x00, 0x63, 0x01, 0x4b, 0x01, 0x64, 0x01, 0x20, 0x01, 0x65, 0x01, 0x65, 0x01, 0x20, 0x01, 0x21, 0x01, 0x66, 0x01, 0x67, 0x01, 0x15, 0x01, 0x15, 0x01, 0x67, 0x01, 0xf4, 0x00, +0x67, 0x01, 0x68, 0x01, 0xf4, 0x00, 0xf4, 0x00, 0x68, 0x01, 0xca, 0x00, 0x69, 0x01, 0x68, 0x01, 0xcc, 0x00, 0xcc, 0x00, 0x68, 0x01, 0xcd, 0x00, 0xc9, 0x00, 0x69, 0x01, 0xc3, 0x00, 0xc3, 0x00, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6a, 0x01, 0xc5, 0x00, 0xc5, 0x00, 0x6a, 0x01, 0xc6, 0x00, 0x10, 0x01, 0x08, 0x01, 0x49, 0x01, 0x49, 0x01, 0x08, 0x01, 0x45, 0x01, 0x11, 0x01, 0x10, 0x01, 0x48, 0x01, 0x48, 0x01, 0x10, 0x01, 0x49, 0x01, 0x0b, 0x01, 0x20, 0x01, 0x47, 0x01, 0x47, 0x01, +0x20, 0x01, 0x4e, 0x01, 0x08, 0x01, 0x07, 0x01, 0x45, 0x01, 0x45, 0x01, 0x07, 0x01, 0x46, 0x01, 0x07, 0x01, 0x0b, 0x01, 0x46, 0x01, 0x46, 0x01, 0x0b, 0x01, 0x47, 0x01, 0x58, 0x01, 0x3f, 0x01, 0x48, 0x01, 0x48, 0x01, 0x3f, 0x01, 0x11, 0x01, 0x3f, 0x01, 0x58, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x58, 0x01, 0x59, 0x01, 0x20, 0x01, 0x64, 0x01, 0x4e, 0x01, 0x4e, 0x01, 0x64, 0x01, 0x63, 0x01, 0x17, 0x01, 0x16, 0x01, 0x65, 0x01, 0x65, 0x01, 0x16, 0x01, 0x64, 0x01, 0x4f, 0x01, 0x23, 0x01, +0x50, 0x01, 0x50, 0x01, 0x23, 0x01, 0x25, 0x01, 0x23, 0x01, 0x4f, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x4f, 0x01, 0x4d, 0x01, 0x18, 0x01, 0x4a, 0x01, 0x16, 0x01, 0x16, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x1a, 0x01, 0x4d, 0x01, 0x4d, 0x01, 0x1a, 0x01, 0x1c, 0x01, 0x29, 0x01, 0x51, 0x01, 0x25, 0x01, 0x25, 0x01, 0x51, 0x01, 0x50, 0x01, 0x29, 0x01, 0x2b, 0x01, 0x51, 0x01, 0x51, 0x01, 0x2b, 0x01, 0x52, 0x01, 0x2b, 0x01, 0x3a, 0x01, 0x52, 0x01, 0x52, 0x01, 0x3a, 0x01, 0x57, 0x01, +0x3a, 0x01, 0x31, 0x01, 0x57, 0x01, 0x57, 0x01, 0x31, 0x01, 0x53, 0x01, 0x43, 0x01, 0x34, 0x01, 0x44, 0x01, 0x44, 0x01, 0x34, 0x01, 0x36, 0x01, 0x34, 0x01, 0x43, 0x01, 0x55, 0x01, 0x55, 0x01, 0x43, 0x01, 0x5b, 0x01, 0x31, 0x01, 0x30, 0x01, 0x53, 0x01, 0x53, 0x01, 0x30, 0x01, 0x54, 0x01, 0x35, 0x01, 0x34, 0x01, 0x56, 0x01, 0x56, 0x01, 0x34, 0x01, 0x55, 0x01, 0x5a, 0x01, 0x41, 0x01, 0x59, 0x01, 0x59, 0x01, 0x41, 0x01, 0x3d, 0x01, 0x1a, 0x00, 0x6c, 0x01, 0x1c, 0x00, 0x1c, 0x00, +0x6c, 0x01, 0x6d, 0x01, 0x6c, 0x01, 0x1a, 0x00, 0x6e, 0x01, 0x6e, 0x01, 0x1a, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x6f, 0x01, 0x28, 0x00, 0x28, 0x00, 0x6f, 0x01, 0x70, 0x01, 0x6f, 0x01, 0x27, 0x00, 0x6d, 0x01, 0x6d, 0x01, 0x27, 0x00, 0x1c, 0x00, 0x2d, 0x00, 0x71, 0x01, 0x2e, 0x00, 0x2e, 0x00, 0x71, 0x01, 0x72, 0x01, 0x71, 0x01, 0x2d, 0x00, 0x70, 0x01, 0x70, 0x01, 0x2d, 0x00, 0x28, 0x00, 0x73, 0x01, 0x74, 0x01, 0x33, 0x00, 0x33, 0x00, 0x74, 0x01, 0x34, 0x00, 0x72, 0x01, 0x73, 0x01, +0x2e, 0x00, 0x2e, 0x00, 0x73, 0x01, 0x33, 0x00, 0x75, 0x01, 0x76, 0x01, 0x39, 0x00, 0x39, 0x00, 0x76, 0x01, 0x3a, 0x00, 0x74, 0x01, 0x75, 0x01, 0x34, 0x00, 0x34, 0x00, 0x75, 0x01, 0x39, 0x00, 0x77, 0x01, 0x78, 0x01, 0x3f, 0x00, 0x3f, 0x00, 0x78, 0x01, 0x40, 0x00, 0x76, 0x01, 0x77, 0x01, 0x3a, 0x00, 0x3a, 0x00, 0x77, 0x01, 0x3f, 0x00, 0x79, 0x01, 0x7a, 0x01, 0x9d, 0x00, 0x9d, 0x00, 0x7a, 0x01, 0x9e, 0x00, 0x9d, 0x00, 0x40, 0x00, 0x79, 0x01, 0x79, 0x01, 0x40, 0x00, 0x78, 0x01, +0x7b, 0x01, 0x7c, 0x01, 0xb0, 0x00, 0xb0, 0x00, 0x7c, 0x01, 0xb2, 0x00, 0xb0, 0x00, 0x9e, 0x00, 0x7b, 0x01, 0x7b, 0x01, 0x9e, 0x00, 0x7a, 0x01, 0xc7, 0x00, 0x7d, 0x01, 0x1b, 0x00, 0x1b, 0x00, 0x7d, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x50, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0x50, 0x00, 0x52, 0x00, 0x50, 0x00, 0x7e, 0x01, 0x51, 0x00, 0x51, 0x00, 0x7e, 0x01, 0x7f, 0x01, 0x7e, 0x01, 0x80, 0x01, 0x7f, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x7e, 0x01, 0xbc, 0x00, 0x80, 0x01, 0x80, 0x01, +0xbc, 0x00, 0xbd, 0x00, 0x82, 0x01, 0x83, 0x01, 0xbd, 0x00, 0xbd, 0x00, 0x83, 0x01, 0x80, 0x01, 0x83, 0x01, 0x84, 0x01, 0x80, 0x01, 0x80, 0x01, 0x84, 0x01, 0x81, 0x01, 0x84, 0x01, 0x83, 0x01, 0x85, 0x01, 0x85, 0x01, 0x83, 0x01, 0x86, 0x01, 0x83, 0x01, 0x82, 0x01, 0x86, 0x01, 0x86, 0x01, 0x82, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0xb7, 0x00, 0xb7, 0x00, 0x89, 0x01, 0xbe, 0x00, 0x89, 0x01, 0x82, 0x01, 0xbe, 0x00, 0xbe, 0x00, 0x82, 0x01, 0xbd, 0x00, 0x82, 0x01, 0x89, 0x01, +0x87, 0x01, 0x87, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x89, 0x01, 0x88, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x88, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x88, 0x01, 0xb8, 0x00, 0xb8, 0x00, 0x88, 0x01, 0xb7, 0x00, 0x88, 0x01, 0x8c, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8d, 0x01, 0x8c, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0x8c, 0x01, 0x8f, 0x01, 0x8c, 0x01, 0xb8, 0x00, 0x8f, 0x01, 0x8f, 0x01, 0xb8, 0x00, 0xba, 0x00, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x90, 0x01, 0x8f, 0x01, 0x91, 0x01, +0x8f, 0x01, 0xba, 0x00, 0x91, 0x01, 0x91, 0x01, 0xba, 0x00, 0xb3, 0x00, 0xb2, 0x00, 0x92, 0x01, 0xb3, 0x00, 0xb3, 0x00, 0x92, 0x01, 0x91, 0x01, 0x91, 0x01, 0x92, 0x01, 0x90, 0x01, 0x90, 0x01, 0x92, 0x01, 0x93, 0x01, 0x7c, 0x01, 0x94, 0x01, 0xb2, 0x00, 0xb2, 0x00, 0x94, 0x01, 0x92, 0x01, 0x94, 0x01, 0x95, 0x01, 0x92, 0x01, 0x92, 0x01, 0x95, 0x01, 0x93, 0x01, 0x8b, 0x00, 0x8c, 0x00, 0x04, 0x01, 0x04, 0x01, 0x8c, 0x00, 0x96, 0x01, 0x04, 0x01, 0xeb, 0x00, 0x42, 0x00, 0x42, 0x00, +0xeb, 0x00, 0x49, 0x00, 0x96, 0x01, 0x38, 0x01, 0x04, 0x01, 0x04, 0x01, 0x38, 0x01, 0xeb, 0x00, 0x6a, 0x01, 0x6b, 0x01, 0xc3, 0x00, 0xc3, 0x00, 0x6b, 0x01, 0xc1, 0x00, 0x6a, 0x01, 0x69, 0x01, 0xc6, 0x00, 0xc6, 0x00, 0x69, 0x01, 0xcc, 0x00, 0xca, 0x00, 0x68, 0x01, 0xc9, 0x00, 0xc9, 0x00, 0x68, 0x01, 0x69, 0x01, 0x68, 0x01, 0x67, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0x67, 0x01, 0xf5, 0x00, 0xf5, 0x00, 0x67, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x67, 0x01, 0x66, 0x01, 0x63, 0x01, 0x64, 0x01, +0x4b, 0x01, 0x4b, 0x01, 0x64, 0x01, 0x16, 0x01, 0x62, 0x01, 0x61, 0x01, 0x75, 0x00, 0x75, 0x00, 0x61, 0x01, 0x76, 0x00, 0x60, 0x01, 0x61, 0x01, 0xd3, 0x00, 0xd3, 0x00, 0x61, 0x01, 0xd1, 0x00, 0x60, 0x01, 0x5f, 0x01, 0x79, 0x00, 0x79, 0x00, 0x5f, 0x01, 0x85, 0x00, 0xdc, 0x00, 0x5e, 0x01, 0xdb, 0x00, 0xdb, 0x00, 0x5e, 0x01, 0x5f, 0x01, 0x86, 0x00, 0x5e, 0x01, 0x00, 0x01, 0x00, 0x01, 0x5e, 0x01, 0x5d, 0x01, 0xe4, 0x00, 0x5c, 0x01, 0xe3, 0x00, 0xe3, 0x00, 0x5c, 0x01, 0x5d, 0x01, +0x5b, 0x01, 0x43, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0x43, 0x01, 0x41, 0x01, 0x08, 0x00, 0x09, 0x00, 0x97, 0x01, 0x97, 0x01, 0x09, 0x00, 0x98, 0x01, 0x09, 0x00, 0x17, 0x00, 0x98, 0x01, 0x98, 0x01, 0x17, 0x00, 0x99, 0x01, 0x17, 0x00, 0x19, 0x00, 0x99, 0x01, 0x99, 0x01, 0x19, 0x00, 0x9a, 0x01, 0x6c, 0x01, 0x9b, 0x01, 0x6d, 0x01, 0x6d, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x6e, 0x01, 0x9d, 0x01, 0x6c, 0x01, 0x6c, 0x01, 0x9d, 0x01, 0x9b, 0x01, 0x6f, 0x01, 0x9e, 0x01, 0x70, 0x01, 0x70, 0x01, +0x9e, 0x01, 0x9f, 0x01, 0x6f, 0x01, 0x6d, 0x01, 0x9e, 0x01, 0x9e, 0x01, 0x6d, 0x01, 0x9c, 0x01, 0x71, 0x01, 0xa0, 0x01, 0x72, 0x01, 0x72, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0x70, 0x01, 0x9f, 0x01, 0x71, 0x01, 0x71, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0x73, 0x01, 0xa2, 0x01, 0x74, 0x01, 0x74, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0x72, 0x01, 0xa1, 0x01, 0x73, 0x01, 0x73, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0x75, 0x01, 0xa4, 0x01, 0x76, 0x01, 0x76, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0x74, 0x01, 0xa3, 0x01, +0x75, 0x01, 0x75, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0x78, 0x01, 0x77, 0x01, 0xa6, 0x01, 0xa6, 0x01, 0x77, 0x01, 0xa7, 0x01, 0x76, 0x01, 0xa5, 0x01, 0x77, 0x01, 0x77, 0x01, 0xa5, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xaa, 0x01, 0xa9, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0xad, 0x01, 0xa9, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xac, 0x01, 0xac, 0x01, 0xaf, 0x01, 0xad, 0x01, 0x55, 0x00, 0x56, 0x00, 0xb0, 0x01, 0xb0, 0x01, 0x56, 0x00, 0xb1, 0x01, +0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xb3, 0x01, 0xb5, 0x01, 0x61, 0x00, 0x62, 0x00, 0xb6, 0x01, 0xb6, 0x01, 0x62, 0x00, 0xb7, 0x01, 0x62, 0x00, 0x55, 0x00, 0xb7, 0x01, 0xb7, 0x01, 0x55, 0x00, 0xb0, 0x01, 0x19, 0x00, 0x72, 0x00, 0x9a, 0x01, 0x9a, 0x01, 0x72, 0x00, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbb, 0x01, 0xba, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xbf, 0x01, 0xbe, 0x01, 0xc0, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xc1, 0x01, 0xc1, 0x01, +0xab, 0x01, 0xc2, 0x01, 0x79, 0x01, 0xc3, 0x01, 0x7a, 0x01, 0x7a, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0x78, 0x01, 0xa6, 0x01, 0x79, 0x01, 0x79, 0x01, 0xa6, 0x01, 0xc3, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xc6, 0x01, 0xb4, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc5, 0x01, 0xc5, 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xa6, 0x00, 0xa7, 0x00, 0xc7, 0x01, 0xc7, 0x01, 0xa7, 0x00, 0xc8, 0x01, 0xa7, 0x00, 0xa9, 0x00, 0xc8, 0x01, 0xc8, 0x01, 0xa9, 0x00, 0xc9, 0x01, 0xa9, 0x00, 0xaf, 0x00, +0xc9, 0x01, 0xc9, 0x01, 0xaf, 0x00, 0xca, 0x01, 0xaf, 0x00, 0x61, 0x00, 0xca, 0x01, 0xca, 0x01, 0x61, 0x00, 0xb6, 0x01, 0x7b, 0x01, 0xcb, 0x01, 0x7c, 0x01, 0x7c, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0x7a, 0x01, 0xc4, 0x01, 0x7b, 0x01, 0x7b, 0x01, 0xc4, 0x01, 0xcb, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xae, 0x01, 0xae, 0x01, 0xce, 0x01, 0xaf, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xcd, 0x01, 0xcd, 0x01, 0xd0, 0x01, 0xce, 0x01, 0x7d, 0x01, 0xd1, 0x01, 0x6e, 0x01, 0x6e, 0x01, 0xd1, 0x01, 0x9d, 0x01, +0xd2, 0x01, 0xd3, 0x01, 0xcf, 0x01, 0xcf, 0x01, 0xd3, 0x01, 0xd0, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd2, 0x01, 0xd2, 0x01, 0xd5, 0x01, 0xd3, 0x01, 0x95, 0x01, 0x94, 0x01, 0xd6, 0x01, 0xd6, 0x01, 0x94, 0x01, 0xd7, 0x01, 0x94, 0x01, 0x7c, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0x7c, 0x01, 0xcc, 0x01, 0xd8, 0x01, 0xd9, 0x01, 0xda, 0x01, 0xda, 0x01, 0xd9, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xd8, 0x01, 0xdd, 0x01, 0xdd, 0x01, 0xd8, 0x01, 0xda, 0x01, 0xde, 0x01, 0xdc, 0x01, 0xdf, 0x01, 0xdf, 0x01, +0xdc, 0x01, 0xdd, 0x01, 0xe0, 0x01, 0xde, 0x01, 0xe1, 0x01, 0xe1, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe4, 0x01, 0xe3, 0x01, 0xe5, 0x01, 0xe3, 0x01, 0xe6, 0x01, 0xe5, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xd9, 0x01, 0xd8, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0xd8, 0x01, 0xe9, 0x01, 0xd8, 0x01, 0xdc, 0x01, 0xe9, 0x01, 0xe9, 0x01, 0xdc, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xea, 0x01, 0xea, 0x01, 0xec, 0x01, 0xe9, 0x01, 0xec, 0x01, 0xed, 0x01, +0xe9, 0x01, 0xe9, 0x01, 0xed, 0x01, 0xe8, 0x01, 0xdc, 0x01, 0xde, 0x01, 0xea, 0x01, 0xea, 0x01, 0xde, 0x01, 0xee, 0x01, 0xde, 0x01, 0xe0, 0x01, 0xee, 0x01, 0xee, 0x01, 0xe0, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xef, 0x01, 0xef, 0x01, 0xf1, 0x01, 0xee, 0x01, 0xf1, 0x01, 0xeb, 0x01, 0xee, 0x01, 0xee, 0x01, 0xeb, 0x01, 0xea, 0x01, 0xe6, 0x01, 0xe3, 0x01, 0xf2, 0x01, 0xf2, 0x01, 0xe3, 0x01, 0xf3, 0x01, 0xe3, 0x01, 0xe2, 0x01, 0xf3, 0x01, 0xf3, 0x01, 0xe2, 0x01, 0xf4, 0x01, +0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xf6, 0x01, 0xf8, 0x01, 0xf6, 0x01, 0xe2, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xe2, 0x01, 0xe4, 0x01, 0xed, 0x01, 0xec, 0x01, 0xf9, 0x01, 0xf9, 0x01, 0xec, 0x01, 0xfa, 0x01, 0xec, 0x01, 0xeb, 0x01, 0xfa, 0x01, 0xfa, 0x01, 0xeb, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfb, 0x01, 0xfb, 0x01, 0xfd, 0x01, 0xfa, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xfa, 0x01, 0xfa, 0x01, 0xfe, 0x01, 0xf9, 0x01, 0xe2, 0x01, 0xf6, 0x01, 0xf4, 0x01, 0xf4, 0x01, +0xf6, 0x01, 0xff, 0x01, 0xf6, 0x01, 0xf5, 0x01, 0xff, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00, 0x02, 0x01, 0x02, 0xf5, 0x01, 0x02, 0x02, 0x02, 0x02, 0xf5, 0x01, 0xf7, 0x01, 0x03, 0x02, 0x01, 0x02, 0x04, 0x02, 0x04, 0x02, 0x01, 0x02, 0x02, 0x02, 0xf5, 0x01, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x01, 0x02, 0x05, 0x02, 0x01, 0x02, 0x03, 0x02, 0x05, 0x02, 0x05, 0x02, 0x03, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x09, 0x02, 0x08, 0x02, 0x0a, 0x02, 0x0a, 0x02, 0x03, 0x02, +0x09, 0x02, 0x09, 0x02, 0x03, 0x02, 0x04, 0x02, 0x03, 0x02, 0x0a, 0x02, 0x06, 0x02, 0x06, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x08, 0x02, 0x0c, 0x02, 0x0a, 0x02, 0x0a, 0x02, 0x0c, 0x02, 0x0b, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x0f, 0x02, 0x0e, 0x02, 0x10, 0x02, 0x08, 0x02, 0x07, 0x02, 0x10, 0x02, 0x10, 0x02, 0x07, 0x02, 0x0f, 0x02, 0x0c, 0x02, 0x08, 0x02, 0x11, 0x02, 0x11, 0x02, 0x08, 0x02, 0x10, 0x02, 0x0e, 0x02, 0x12, 0x02, 0x10, 0x02, 0x10, 0x02, 0x12, 0x02, 0x11, 0x02, +0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x15, 0x02, 0x14, 0x02, 0x16, 0x02, 0x0e, 0x02, 0x0d, 0x02, 0x16, 0x02, 0x16, 0x02, 0x0d, 0x02, 0x15, 0x02, 0x12, 0x02, 0x0e, 0x02, 0x17, 0x02, 0x17, 0x02, 0x0e, 0x02, 0x16, 0x02, 0x14, 0x02, 0x18, 0x02, 0x16, 0x02, 0x16, 0x02, 0x18, 0x02, 0x17, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1b, 0x02, 0x1a, 0x02, 0x1c, 0x02, 0x1a, 0x02, 0x1d, 0x02, 0x1c, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x1e, 0x02, 0x1e, 0x02, +0x20, 0x02, 0x1c, 0x02, 0x20, 0x02, 0x21, 0x02, 0x1c, 0x02, 0x1c, 0x02, 0x21, 0x02, 0x1b, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x24, 0x02, 0x23, 0x02, 0x25, 0x02, 0x23, 0x02, 0x26, 0x02, 0x25, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x1d, 0x02, 0x1a, 0x02, 0x27, 0x02, 0x27, 0x02, 0x1a, 0x02, 0x25, 0x02, 0x1a, 0x02, 0x19, 0x02, 0x25, 0x02, 0x25, 0x02, 0x19, 0x02, 0x24, 0x02, 0x27, 0x02, 0x26, 0x02, 0x28, 0x02, 0x28, 0x02, 0x26, 0x02, 0x29, 0x02, 0x27, 0x02, 0x28, 0x02, +0x1d, 0x02, 0x1d, 0x02, 0x28, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2d, 0x02, 0x2c, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, 0x02, 0x31, 0x02, 0x30, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x32, 0x02, 0x32, 0x02, 0x34, 0x02, 0x31, 0x02, 0x35, 0x02, 0x2b, 0x02, 0x36, 0x02, 0x36, 0x02, 0x2b, 0x02, 0x2d, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x39, 0x02, 0x38, 0x02, 0x3a, 0x02, 0x2c, 0x02, 0x2b, 0x02, 0x3a, 0x02, 0x3a, 0x02, 0x2b, 0x02, 0x39, 0x02, +0x2b, 0x02, 0x35, 0x02, 0x39, 0x02, 0x39, 0x02, 0x35, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x37, 0x02, 0x3b, 0x02, 0x3b, 0x02, 0x37, 0x02, 0x39, 0x02, 0x3d, 0x02, 0x3c, 0x02, 0x3e, 0x02, 0x3e, 0x02, 0x3c, 0x02, 0x3b, 0x02, 0x35, 0x02, 0x3f, 0x02, 0x3b, 0x02, 0x3b, 0x02, 0x3f, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x3e, 0x02, 0x3e, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x3d, 0x02, 0x41, 0x02, 0x41, 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x45, 0x02, +0x44, 0x02, 0x46, 0x02, 0x46, 0x02, 0x47, 0x02, 0x45, 0x02, 0x45, 0x02, 0x47, 0x02, 0x48, 0x02, 0x3c, 0x02, 0x3d, 0x02, 0x48, 0x02, 0x48, 0x02, 0x3d, 0x02, 0x45, 0x02, 0x42, 0x02, 0x43, 0x02, 0x3d, 0x02, 0x3d, 0x02, 0x43, 0x02, 0x45, 0x02, 0xeb, 0x01, 0xf1, 0x01, 0xfb, 0x01, 0xfb, 0x01, 0xf1, 0x01, 0x49, 0x02, 0xf1, 0x01, 0xf0, 0x01, 0x49, 0x02, 0x49, 0x02, 0xf0, 0x01, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4a, 0x02, 0x4a, 0x02, 0x4c, 0x02, 0x49, 0x02, 0x4c, 0x02, 0xfc, 0x01, +0x49, 0x02, 0x49, 0x02, 0xfc, 0x01, 0xfb, 0x01, 0x4d, 0x02, 0x4e, 0x02, 0x4f, 0x02, 0x4f, 0x02, 0x4e, 0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x50, 0x02, 0x50, 0x02, 0x52, 0x02, 0x4f, 0x02, 0xfd, 0x01, 0xfc, 0x01, 0x53, 0x02, 0x53, 0x02, 0xfc, 0x01, 0x54, 0x02, 0x55, 0x02, 0x56, 0x02, 0x54, 0x02, 0x54, 0x02, 0x56, 0x02, 0x53, 0x02, 0x56, 0x02, 0x57, 0x02, 0x53, 0x02, 0x53, 0x02, 0x57, 0x02, 0x58, 0x02, 0xfe, 0x01, 0xfd, 0x01, 0x58, 0x02, 0x58, 0x02, 0xfd, 0x01, 0x53, 0x02, +0x4c, 0x02, 0x4b, 0x02, 0x59, 0x02, 0x59, 0x02, 0x4b, 0x02, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x5a, 0x02, 0x5a, 0x02, 0x5c, 0x02, 0x59, 0x02, 0x5c, 0x02, 0x55, 0x02, 0x59, 0x02, 0x59, 0x02, 0x55, 0x02, 0x54, 0x02, 0xfc, 0x01, 0x4c, 0x02, 0x54, 0x02, 0x54, 0x02, 0x4c, 0x02, 0x59, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x5f, 0x02, 0x5e, 0x02, 0x60, 0x02, 0x52, 0x02, 0x51, 0x02, 0x60, 0x02, 0x60, 0x02, 0x51, 0x02, 0x5f, 0x02, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x63, 0x02, +0x62, 0x02, 0x64, 0x02, 0x65, 0x02, 0x22, 0x02, 0x66, 0x02, 0x66, 0x02, 0x22, 0x02, 0x24, 0x02, 0x19, 0x02, 0x67, 0x02, 0x24, 0x02, 0x24, 0x02, 0x67, 0x02, 0x66, 0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x6a, 0x02, 0x69, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, 0x6b, 0x02, 0x6b, 0x02, 0x6d, 0x02, 0x6a, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x70, 0x02, 0x6f, 0x02, 0x71, 0x02, 0x14, 0x02, 0x13, 0x02, 0x71, 0x02, 0x71, 0x02, 0x13, 0x02, 0x70, 0x02, 0x72, 0x02, 0x21, 0x02, +0x73, 0x02, 0x73, 0x02, 0x21, 0x02, 0x20, 0x02, 0x1f, 0x02, 0x74, 0x02, 0x20, 0x02, 0x20, 0x02, 0x74, 0x02, 0x73, 0x02, 0x74, 0x02, 0x6e, 0x02, 0x73, 0x02, 0x73, 0x02, 0x6e, 0x02, 0x70, 0x02, 0x13, 0x02, 0x72, 0x02, 0x70, 0x02, 0x70, 0x02, 0x72, 0x02, 0x73, 0x02, 0x18, 0x02, 0x14, 0x02, 0x75, 0x02, 0x75, 0x02, 0x14, 0x02, 0x71, 0x02, 0x6f, 0x02, 0x76, 0x02, 0x71, 0x02, 0x71, 0x02, 0x76, 0x02, 0x75, 0x02, 0x77, 0x02, 0x1e, 0x02, 0x2a, 0x02, 0x2a, 0x02, 0x1e, 0x02, 0x1d, 0x02, +0x78, 0x02, 0x1f, 0x02, 0x77, 0x02, 0x77, 0x02, 0x1f, 0x02, 0x1e, 0x02, 0x79, 0x02, 0x33, 0x02, 0x7a, 0x02, 0x7a, 0x02, 0x33, 0x02, 0x32, 0x02, 0x30, 0x02, 0x7b, 0x02, 0x32, 0x02, 0x32, 0x02, 0x7b, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x6c, 0x02, 0x7a, 0x02, 0x7a, 0x02, 0x6c, 0x02, 0x6b, 0x02, 0x69, 0x02, 0x79, 0x02, 0x6b, 0x02, 0x6b, 0x02, 0x79, 0x02, 0x7a, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x7e, 0x02, 0x7d, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, 0x02, 0x7f, 0x02, 0x7f, 0x02, +0x81, 0x02, 0x7e, 0x02, 0x81, 0x02, 0x47, 0x02, 0x7e, 0x02, 0x7e, 0x02, 0x47, 0x02, 0x46, 0x02, 0x44, 0x02, 0x7c, 0x02, 0x46, 0x02, 0x46, 0x02, 0x7c, 0x02, 0x7e, 0x02, 0x79, 0x02, 0x69, 0x02, 0x82, 0x02, 0x82, 0x02, 0x69, 0x02, 0x83, 0x02, 0x40, 0x02, 0x3f, 0x02, 0x84, 0x02, 0x84, 0x02, 0x3f, 0x02, 0x85, 0x02, 0x35, 0x02, 0x36, 0x02, 0x3f, 0x02, 0x3f, 0x02, 0x36, 0x02, 0x85, 0x02, 0x34, 0x02, 0x33, 0x02, 0x82, 0x02, 0x82, 0x02, 0x33, 0x02, 0x79, 0x02, 0x47, 0x02, 0x81, 0x02, +0x48, 0x02, 0x48, 0x02, 0x81, 0x02, 0x86, 0x02, 0x81, 0x02, 0x80, 0x02, 0x86, 0x02, 0x86, 0x02, 0x80, 0x02, 0x87, 0x02, 0x38, 0x02, 0x37, 0x02, 0x87, 0x02, 0x87, 0x02, 0x37, 0x02, 0x86, 0x02, 0x37, 0x02, 0x3c, 0x02, 0x86, 0x02, 0x86, 0x02, 0x3c, 0x02, 0x48, 0x02, 0x76, 0x02, 0x6f, 0x02, 0x88, 0x02, 0x88, 0x02, 0x6f, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, 0x02, 0x89, 0x02, 0x89, 0x02, 0x8b, 0x02, 0x88, 0x02, 0x78, 0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8d, 0x02, 0x8c, 0x02, 0x8e, 0x02, +0x8c, 0x02, 0x8f, 0x02, 0x8e, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x90, 0x02, 0x91, 0x02, 0x8e, 0x02, 0x8e, 0x02, 0x91, 0x02, 0x92, 0x02, 0x92, 0x02, 0x6e, 0x02, 0x8e, 0x02, 0x8e, 0x02, 0x6e, 0x02, 0x8d, 0x02, 0x91, 0x02, 0x8a, 0x02, 0x92, 0x02, 0x92, 0x02, 0x8a, 0x02, 0x89, 0x02, 0x6f, 0x02, 0x6e, 0x02, 0x89, 0x02, 0x89, 0x02, 0x6e, 0x02, 0x92, 0x02, 0x8c, 0x02, 0x78, 0x02, 0x93, 0x02, 0x93, 0x02, 0x78, 0x02, 0x77, 0x02, 0x2a, 0x02, 0x94, 0x02, 0x77, 0x02, 0x77, 0x02, +0x94, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x93, 0x02, 0x93, 0x02, 0x95, 0x02, 0x96, 0x02, 0x8f, 0x02, 0x8c, 0x02, 0x96, 0x02, 0x96, 0x02, 0x8c, 0x02, 0x93, 0x02, 0xe6, 0x01, 0x97, 0x02, 0xe7, 0x01, 0xe7, 0x01, 0x97, 0x02, 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9b, 0x02, 0x9a, 0x02, 0x9c, 0x02, 0xe7, 0x01, 0x98, 0x02, 0x9c, 0x02, 0x9c, 0x02, 0x98, 0x02, 0x9b, 0x02, 0xd9, 0x01, 0x9d, 0x02, 0xdb, 0x01, 0xdb, 0x01, 0x9d, 0x02, 0x9e, 0x02, 0x97, 0x02, 0xe6, 0x01, +0x9f, 0x02, 0x9f, 0x02, 0xe6, 0x01, 0xf2, 0x01, 0x9a, 0x02, 0xa0, 0x02, 0x9c, 0x02, 0x9c, 0x02, 0xa0, 0x02, 0xa1, 0x02, 0xa0, 0x02, 0xa2, 0x02, 0xa1, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa3, 0x02, 0xe4, 0x01, 0xe5, 0x01, 0xa3, 0x02, 0xa3, 0x02, 0xe5, 0x01, 0xa1, 0x02, 0xe5, 0x01, 0xe7, 0x01, 0xa1, 0x02, 0xa1, 0x02, 0xe7, 0x01, 0x9c, 0x02, 0x9d, 0x02, 0xd9, 0x01, 0xa4, 0x02, 0xa4, 0x02, 0xd9, 0x01, 0xe8, 0x01, 0xed, 0x01, 0xa5, 0x02, 0xe8, 0x01, 0xe8, 0x01, 0xa5, 0x02, 0xa4, 0x02, +0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa8, 0x02, 0xa7, 0x02, 0xa9, 0x02, 0xaa, 0x02, 0xab, 0x02, 0xa9, 0x02, 0xa9, 0x02, 0xab, 0x02, 0xa8, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xae, 0x02, 0xad, 0x02, 0xaf, 0x02, 0xad, 0x02, 0xb0, 0x02, 0xaf, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xab, 0x02, 0xaa, 0x02, 0xb2, 0x02, 0xb2, 0x02, 0xaa, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb3, 0x02, 0xb3, 0x02, 0xb5, 0x02, 0xb2, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb8, 0x02, +0xb7, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xac, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xac, 0x02, 0xae, 0x02, 0xb5, 0x02, 0xb4, 0x02, 0xba, 0x02, 0xba, 0x02, 0xb4, 0x02, 0xbb, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xba, 0x02, 0xba, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc0, 0x02, 0xbf, 0x02, 0xc1, 0x02, 0xb7, 0x02, 0xb6, 0x02, 0xc1, 0x02, 0xc1, 0x02, 0xb6, 0x02, 0xc0, 0x02, 0x21, 0x02, 0x72, 0x02, 0xc2, 0x02, 0xc2, 0x02, 0x72, 0x02, 0xc3, 0x02, 0x72, 0x02, 0x13, 0x02, +0xc3, 0x02, 0xc3, 0x02, 0x13, 0x02, 0x15, 0x02, 0x0d, 0x02, 0xc4, 0x02, 0x15, 0x02, 0x15, 0x02, 0xc4, 0x02, 0xc3, 0x02, 0x1f, 0x02, 0x78, 0x02, 0x74, 0x02, 0x74, 0x02, 0x78, 0x02, 0x8d, 0x02, 0x8d, 0x02, 0x6e, 0x02, 0x74, 0x02, 0xc4, 0x02, 0x0d, 0x02, 0xc5, 0x02, 0xc5, 0x02, 0x0d, 0x02, 0x0f, 0x02, 0x07, 0x02, 0xc6, 0x02, 0x0f, 0x02, 0x0f, 0x02, 0xc6, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0x07, 0x02, 0xc7, 0x02, 0xc7, 0x02, 0x07, 0x02, 0x09, 0x02, 0x09, 0x02, 0x04, 0x02, 0xc7, 0x02, +0xc7, 0x02, 0x04, 0x02, 0xc8, 0x02, 0x04, 0x02, 0x02, 0x02, 0xc8, 0x02, 0xc8, 0x02, 0x02, 0x02, 0xc9, 0x02, 0x02, 0x02, 0xf7, 0x01, 0xc9, 0x02, 0xc9, 0x02, 0xf7, 0x01, 0xca, 0x02, 0xa2, 0x02, 0xcb, 0x02, 0xa3, 0x02, 0xa3, 0x02, 0xcb, 0x02, 0xcc, 0x02, 0xf7, 0x01, 0xf8, 0x01, 0xca, 0x02, 0xca, 0x02, 0xf8, 0x01, 0xcc, 0x02, 0xf8, 0x01, 0xe4, 0x01, 0xcc, 0x02, 0xcc, 0x02, 0xe4, 0x01, 0xa3, 0x02, 0xa5, 0x02, 0xed, 0x01, 0xcd, 0x02, 0xcd, 0x02, 0xed, 0x01, 0xf9, 0x01, 0xfe, 0x01, +0xce, 0x02, 0xf9, 0x01, 0xf9, 0x01, 0xce, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xfe, 0x01, 0xcf, 0x02, 0xcf, 0x02, 0xfe, 0x01, 0x58, 0x02, 0x57, 0x02, 0xd0, 0x02, 0x58, 0x02, 0x58, 0x02, 0xd0, 0x02, 0xcf, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd3, 0x02, 0xd2, 0x02, 0xd4, 0x02, 0xd0, 0x02, 0x57, 0x02, 0xd4, 0x02, 0xd4, 0x02, 0x57, 0x02, 0xd3, 0x02, 0xd1, 0x02, 0xd5, 0x02, 0xd2, 0x02, 0xd2, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd5, 0x02, 0xd7, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0xd7, 0x02, +0x64, 0x02, 0x5d, 0x02, 0xd8, 0x02, 0x5e, 0x02, 0x5e, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xd9, 0x02, 0xdb, 0x02, 0xdb, 0x02, 0xd9, 0x02, 0xd8, 0x02, 0xd7, 0x02, 0x67, 0x02, 0x64, 0x02, 0x64, 0x02, 0x67, 0x02, 0x63, 0x02, 0xdc, 0x02, 0x63, 0x02, 0x1b, 0x02, 0x63, 0x02, 0x67, 0x02, 0x1b, 0x02, 0x67, 0x02, 0x19, 0x02, 0x1b, 0x02, 0xd0, 0x02, 0xdd, 0x02, 0xcf, 0x02, 0xcf, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe1, 0x02, 0xe0, 0x02, 0xe2, 0x02, +0xe3, 0x02, 0xe4, 0x02, 0xdf, 0x02, 0xdf, 0x02, 0xe4, 0x02, 0xe0, 0x02, 0xe5, 0x02, 0xce, 0x02, 0xde, 0x02, 0xde, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd2, 0x02, 0xe6, 0x02, 0xd4, 0x02, 0xd4, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xea, 0x02, 0xe9, 0x02, 0xeb, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe8, 0x02, 0xe8, 0x02, 0xe2, 0x02, 0xe9, 0x02, 0xdd, 0x02, 0xd0, 0x02, 0xe7, 0x02, 0xe7, 0x02, 0xd0, 0x02, 0xd4, 0x02, 0xcc, 0x02, 0xcb, 0x02, 0xec, 0x02, 0xec, 0x02, +0xcb, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf0, 0x02, 0xef, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf4, 0x02, 0xf3, 0x02, 0xf5, 0x02, 0xca, 0x02, 0xcc, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xcc, 0x02, 0xec, 0x02, 0xce, 0x02, 0xe5, 0x02, 0xcd, 0x02, 0xcd, 0x02, 0xe5, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xe3, 0x02, 0xe3, 0x02, 0xf9, 0x02, 0xe4, 0x02, 0xc9, 0x02, 0xca, 0x02, 0xfa, 0x02, 0xfa, 0x02, 0xca, 0x02, 0xf6, 0x02, 0xf3, 0x02, 0xfb, 0x02, +0xf5, 0x02, 0xf5, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfb, 0x02, 0xfd, 0x02, 0xfc, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xc8, 0x02, 0xc9, 0x02, 0xff, 0x02, 0xff, 0x02, 0xc9, 0x02, 0xfa, 0x02, 0xc7, 0x02, 0xc8, 0x02, 0x00, 0x03, 0x00, 0x03, 0xc8, 0x02, 0xff, 0x02, 0xfd, 0x02, 0x01, 0x03, 0xfe, 0x02, 0xfe, 0x02, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x01, 0x03, 0x01, 0x03, 0x04, 0x03, 0x02, 0x03, 0x05, 0x03, 0xc6, 0x02, 0x00, 0x03, 0x00, 0x03, 0xc6, 0x02, 0xc7, 0x02, +0xc4, 0x02, 0x06, 0x03, 0xc3, 0x02, 0xc3, 0x02, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0a, 0x03, 0x09, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0e, 0x03, 0x0d, 0x03, 0x0f, 0x03, 0x10, 0x03, 0xc2, 0x02, 0x07, 0x03, 0x07, 0x03, 0xc2, 0x02, 0xc3, 0x02, 0xc6, 0x02, 0x05, 0x03, 0xc5, 0x02, 0xc5, 0x02, 0x05, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x03, 0x03, 0x03, 0x03, 0x13, 0x03, 0x04, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x12, 0x03, 0x12, 0x03, +0x0b, 0x03, 0x13, 0x03, 0x06, 0x03, 0xc4, 0x02, 0x11, 0x03, 0x11, 0x03, 0xc4, 0x02, 0xc5, 0x02, 0xd6, 0x02, 0x64, 0x02, 0x14, 0x03, 0x14, 0x03, 0x64, 0x02, 0x62, 0x02, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x16, 0x03, 0x18, 0x03, 0x16, 0x03, 0xea, 0x02, 0x18, 0x03, 0x18, 0x03, 0xea, 0x02, 0xeb, 0x02, 0xd2, 0x02, 0xd6, 0x02, 0xe6, 0x02, 0xe6, 0x02, 0xd6, 0x02, 0x14, 0x03, 0x19, 0x03, 0x15, 0x03, 0x1a, 0x03, 0x1a, 0x03, 0x15, 0x03, 0x17, 0x03, 0x1b, 0x03, 0x19, 0x03, +0x1c, 0x03, 0x1c, 0x03, 0x19, 0x03, 0x1a, 0x03, 0x1d, 0x03, 0x51, 0x02, 0x1e, 0x03, 0x1e, 0x03, 0x51, 0x02, 0x50, 0x02, 0x1e, 0x03, 0x50, 0x02, 0x1f, 0x03, 0x1f, 0x03, 0x50, 0x02, 0x4e, 0x02, 0x20, 0x03, 0x5d, 0x02, 0x21, 0x03, 0x21, 0x03, 0x5d, 0x02, 0x5f, 0x02, 0x21, 0x03, 0x5f, 0x02, 0x1d, 0x03, 0x1d, 0x03, 0x5f, 0x02, 0x51, 0x02, 0x22, 0x03, 0x23, 0x03, 0xa6, 0x02, 0xa6, 0x02, 0x23, 0x03, 0xa7, 0x02, 0xb1, 0x02, 0xb0, 0x02, 0x24, 0x03, 0x24, 0x03, 0xb0, 0x02, 0x25, 0x03, +0x1f, 0x03, 0x4e, 0x02, 0x26, 0x03, 0x26, 0x03, 0x4e, 0x02, 0x4d, 0x02, 0x27, 0x03, 0x25, 0x03, 0xad, 0x02, 0xad, 0x02, 0x25, 0x03, 0xb0, 0x02, 0xad, 0x02, 0xac, 0x02, 0x27, 0x03, 0x27, 0x03, 0xac, 0x02, 0x28, 0x03, 0x29, 0x03, 0x28, 0x03, 0xb9, 0x02, 0xb9, 0x02, 0x28, 0x03, 0xac, 0x02, 0x29, 0x03, 0xb9, 0x02, 0x2a, 0x03, 0x2a, 0x03, 0xb9, 0x02, 0xb7, 0x02, 0x2b, 0x03, 0xbf, 0x02, 0x2c, 0x03, 0x2c, 0x03, 0xbf, 0x02, 0xbe, 0x02, 0x2d, 0x03, 0xbd, 0x02, 0x2e, 0x03, 0x2e, 0x03, +0xbd, 0x02, 0xbc, 0x02, 0x2a, 0x03, 0xb7, 0x02, 0x2f, 0x03, 0x2f, 0x03, 0xb7, 0x02, 0xc1, 0x02, 0x2f, 0x03, 0xc1, 0x02, 0x2b, 0x03, 0x2b, 0x03, 0xc1, 0x02, 0xbf, 0x02, 0x30, 0x03, 0x31, 0x03, 0xd8, 0x02, 0xd8, 0x02, 0x31, 0x03, 0xdb, 0x02, 0xd8, 0x02, 0x5d, 0x02, 0x30, 0x03, 0x30, 0x03, 0x5d, 0x02, 0x20, 0x03, 0x31, 0x03, 0x32, 0x03, 0xdb, 0x02, 0xdb, 0x02, 0x32, 0x03, 0xda, 0x02, 0x32, 0x03, 0x33, 0x03, 0xda, 0x02, 0xda, 0x02, 0x33, 0x03, 0x34, 0x03, 0x2e, 0x03, 0xbc, 0x02, +0x33, 0x03, 0x33, 0x03, 0xbc, 0x02, 0x34, 0x03, 0xd9, 0x02, 0xda, 0x02, 0x35, 0x03, 0x35, 0x03, 0xda, 0x02, 0x34, 0x03, 0xb4, 0x02, 0x36, 0x03, 0xbb, 0x02, 0xbb, 0x02, 0x36, 0x03, 0x35, 0x03, 0x5e, 0x02, 0x36, 0x03, 0x60, 0x02, 0x60, 0x02, 0x36, 0x03, 0x37, 0x03, 0xaa, 0x02, 0x38, 0x03, 0xb3, 0x02, 0xb3, 0x02, 0x38, 0x03, 0x37, 0x03, 0x52, 0x02, 0x38, 0x03, 0x4f, 0x02, 0x4f, 0x02, 0x38, 0x03, 0x39, 0x03, 0xa7, 0x02, 0x3a, 0x03, 0xa9, 0x02, 0xa9, 0x02, 0x3a, 0x03, 0x39, 0x03, +0x26, 0x03, 0x4d, 0x02, 0x3b, 0x03, 0x3b, 0x03, 0x4d, 0x02, 0x3a, 0x03, 0x23, 0x03, 0x3b, 0x03, 0xa7, 0x02, 0xa7, 0x02, 0x3b, 0x03, 0x3a, 0x03, 0xf9, 0x02, 0xf8, 0x02, 0x3c, 0x03, 0x3c, 0x03, 0xf8, 0x02, 0x3d, 0x03, 0xcb, 0x02, 0x3e, 0x03, 0xed, 0x02, 0xed, 0x02, 0x3e, 0x03, 0x3f, 0x03, 0xa2, 0x02, 0x40, 0x03, 0xcb, 0x02, 0xcb, 0x02, 0x40, 0x03, 0x3e, 0x03, 0xa5, 0x02, 0x40, 0x03, 0xa4, 0x02, 0xa4, 0x02, 0x40, 0x03, 0x41, 0x03, 0xa0, 0x02, 0x9a, 0x02, 0x41, 0x03, 0x41, 0x03, +0x9a, 0x02, 0x42, 0x03, 0x9d, 0x02, 0x42, 0x03, 0x9e, 0x02, 0x9e, 0x02, 0x42, 0x03, 0x43, 0x03, 0x1d, 0x03, 0xe1, 0x02, 0x21, 0x03, 0x21, 0x03, 0xe1, 0x02, 0xe8, 0x02, 0xea, 0x02, 0x20, 0x03, 0xe8, 0x02, 0xe8, 0x02, 0x20, 0x03, 0x21, 0x03, 0xe3, 0x02, 0x1f, 0x03, 0xf8, 0x02, 0xf8, 0x02, 0x1f, 0x03, 0x26, 0x03, 0xe1, 0x02, 0x1d, 0x03, 0xdf, 0x02, 0xdf, 0x02, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, 0xe3, 0x02, 0x1e, 0x03, 0x1e, 0x03, 0xe3, 0x02, 0xdf, 0x02, 0x30, 0x03, 0x20, 0x03, +0x16, 0x03, 0x16, 0x03, 0x20, 0x03, 0xea, 0x02, 0x31, 0x03, 0x30, 0x03, 0x15, 0x03, 0x15, 0x03, 0x30, 0x03, 0x16, 0x03, 0xf8, 0x02, 0x26, 0x03, 0x3d, 0x03, 0x3d, 0x03, 0x26, 0x03, 0x3b, 0x03, 0x3d, 0x03, 0xee, 0x02, 0x3c, 0x03, 0x3c, 0x03, 0xee, 0x02, 0xf0, 0x02, 0x27, 0x03, 0x28, 0x03, 0xfb, 0x02, 0xfb, 0x02, 0x28, 0x03, 0xfd, 0x02, 0x25, 0x03, 0x27, 0x03, 0xf3, 0x02, 0xf3, 0x02, 0x27, 0x03, 0xfb, 0x02, 0x23, 0x03, 0x22, 0x03, 0xee, 0x02, 0xee, 0x02, 0x22, 0x03, 0xef, 0x02, +0x24, 0x03, 0x25, 0x03, 0xf2, 0x02, 0xf2, 0x02, 0x25, 0x03, 0xf3, 0x02, 0x28, 0x03, 0x29, 0x03, 0xfd, 0x02, 0xfd, 0x02, 0x29, 0x03, 0x01, 0x03, 0x2a, 0x03, 0x03, 0x03, 0x29, 0x03, 0x29, 0x03, 0x03, 0x03, 0x01, 0x03, 0x03, 0x03, 0x2a, 0x03, 0x12, 0x03, 0x12, 0x03, 0x2a, 0x03, 0x2f, 0x03, 0x2b, 0x03, 0x0a, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x0a, 0x03, 0x12, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x0c, 0x03, 0x0c, 0x03, 0x1c, 0x03, 0x0d, 0x03, 0x0c, 0x03, 0x2e, 0x03, 0x1b, 0x03, 0x1b, 0x03, +0x2e, 0x03, 0x33, 0x03, 0x0a, 0x03, 0x2b, 0x03, 0x08, 0x03, 0x08, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0x2e, 0x03, 0x0c, 0x03, 0x2d, 0x03, 0x2d, 0x03, 0x0c, 0x03, 0x0e, 0x03, 0x32, 0x03, 0x31, 0x03, 0x19, 0x03, 0x19, 0x03, 0x31, 0x03, 0x15, 0x03, 0x44, 0x03, 0xe0, 0x01, 0x45, 0x03, 0x45, 0x03, 0xe0, 0x01, 0xe1, 0x01, 0xe0, 0x01, 0x44, 0x03, 0xef, 0x01, 0xef, 0x01, 0x44, 0x03, 0x46, 0x03, 0x47, 0x03, 0xf0, 0x01, 0x46, 0x03, 0x46, 0x03, 0xf0, 0x01, 0xef, 0x01, 0xf3, 0x01, 0xf4, 0x01, +0x9b, 0x01, 0x9b, 0x01, 0xf4, 0x01, 0x9c, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0x9d, 0x01, 0x9d, 0x01, 0xf3, 0x01, 0x9b, 0x01, 0xff, 0x01, 0x00, 0x02, 0x9e, 0x01, 0x9e, 0x01, 0x00, 0x02, 0x9f, 0x01, 0xf4, 0x01, 0xff, 0x01, 0x9c, 0x01, 0x9c, 0x01, 0xff, 0x01, 0x9e, 0x01, 0x06, 0x02, 0xa1, 0x01, 0x05, 0x02, 0x05, 0x02, 0xa1, 0x01, 0xa0, 0x01, 0x00, 0x02, 0x05, 0x02, 0x9f, 0x01, 0x9f, 0x01, 0x05, 0x02, 0xa0, 0x01, 0x0c, 0x02, 0xa3, 0x01, 0x0b, 0x02, 0x0b, 0x02, 0xa3, 0x01, 0xa2, 0x01, +0xa1, 0x01, 0x06, 0x02, 0xa2, 0x01, 0xa2, 0x01, 0x06, 0x02, 0x0b, 0x02, 0x12, 0x02, 0xa5, 0x01, 0x11, 0x02, 0x11, 0x02, 0xa5, 0x01, 0xa4, 0x01, 0xa3, 0x01, 0x0c, 0x02, 0xa4, 0x01, 0xa4, 0x01, 0x0c, 0x02, 0x11, 0x02, 0x18, 0x02, 0xa6, 0x01, 0x17, 0x02, 0x17, 0x02, 0xa6, 0x01, 0xa7, 0x01, 0xa5, 0x01, 0x12, 0x02, 0xa7, 0x01, 0xa7, 0x01, 0x12, 0x02, 0x17, 0x02, 0x23, 0x02, 0x22, 0x02, 0xa9, 0x01, 0xa9, 0x01, 0x22, 0x02, 0xab, 0x01, 0x26, 0x02, 0x23, 0x02, 0xad, 0x01, 0xad, 0x01, +0x23, 0x02, 0xa9, 0x01, 0x26, 0x02, 0xad, 0x01, 0x29, 0x02, 0x29, 0x02, 0xad, 0x01, 0xaf, 0x01, 0x2c, 0x02, 0x48, 0x03, 0x2e, 0x02, 0x2e, 0x02, 0x48, 0x03, 0x49, 0x03, 0xb4, 0x01, 0x30, 0x02, 0xb2, 0x01, 0xb2, 0x01, 0x30, 0x02, 0x2f, 0x02, 0x38, 0x02, 0x4a, 0x03, 0x3a, 0x02, 0x3a, 0x02, 0x4a, 0x03, 0x4b, 0x03, 0x48, 0x03, 0x2c, 0x02, 0x4b, 0x03, 0x4b, 0x03, 0x2c, 0x02, 0x3a, 0x02, 0xf0, 0x01, 0x47, 0x03, 0x4a, 0x02, 0x4a, 0x02, 0x47, 0x03, 0x4c, 0x03, 0xb9, 0x01, 0x4b, 0x02, +0x4c, 0x03, 0x4c, 0x03, 0x4b, 0x02, 0x4a, 0x02, 0x4b, 0x02, 0xb9, 0x01, 0x5a, 0x02, 0x5a, 0x02, 0xb9, 0x01, 0xbb, 0x01, 0x4d, 0x03, 0x5b, 0x02, 0xbb, 0x01, 0xbb, 0x01, 0x5b, 0x02, 0x5a, 0x02, 0x6c, 0x02, 0xc0, 0x01, 0x6d, 0x02, 0x6d, 0x02, 0xc0, 0x01, 0xbe, 0x01, 0xab, 0x01, 0x22, 0x02, 0xc2, 0x01, 0xc2, 0x01, 0x22, 0x02, 0x65, 0x02, 0x76, 0x02, 0xc4, 0x01, 0x75, 0x02, 0x75, 0x02, 0xc4, 0x01, 0xc3, 0x01, 0x75, 0x02, 0xc3, 0x01, 0x18, 0x02, 0x18, 0x02, 0xc3, 0x01, 0xa6, 0x01, +0x7b, 0x02, 0x30, 0x02, 0xc6, 0x01, 0xc6, 0x01, 0x30, 0x02, 0xb4, 0x01, 0x6c, 0x02, 0x7b, 0x02, 0xc0, 0x01, 0xc0, 0x01, 0x7b, 0x02, 0xc6, 0x01, 0x7d, 0x02, 0x4e, 0x03, 0x7f, 0x02, 0x7f, 0x02, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x80, 0x02, 0x4f, 0x03, 0x4f, 0x03, 0x80, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x50, 0x03, 0x87, 0x02, 0x87, 0x02, 0x50, 0x03, 0x51, 0x03, 0x4a, 0x03, 0x38, 0x02, 0x51, 0x03, 0x51, 0x03, 0x38, 0x02, 0x87, 0x02, 0x8b, 0x02, 0xcc, 0x01, 0x88, 0x02, 0x88, 0x02, +0xcc, 0x01, 0xcb, 0x01, 0x88, 0x02, 0xcb, 0x01, 0x76, 0x02, 0x76, 0x02, 0xcb, 0x01, 0xc4, 0x01, 0x29, 0x02, 0xaf, 0x01, 0x52, 0x03, 0x52, 0x03, 0xaf, 0x01, 0xce, 0x01, 0xd0, 0x01, 0x53, 0x03, 0xce, 0x01, 0xce, 0x01, 0x53, 0x03, 0x52, 0x03, 0x9f, 0x02, 0xf2, 0x01, 0xd1, 0x01, 0xd1, 0x01, 0xf2, 0x01, 0x9d, 0x01, 0x2a, 0x02, 0x28, 0x02, 0x94, 0x02, 0x94, 0x02, 0x28, 0x02, 0x54, 0x03, 0x28, 0x02, 0x29, 0x02, 0x54, 0x03, 0x54, 0x03, 0x29, 0x02, 0x52, 0x03, 0x53, 0x03, 0x55, 0x03, +0x52, 0x03, 0x52, 0x03, 0x55, 0x03, 0x54, 0x03, 0x55, 0x03, 0x95, 0x02, 0x54, 0x03, 0x54, 0x03, 0x95, 0x02, 0x94, 0x02, 0x53, 0x03, 0xd0, 0x01, 0x56, 0x03, 0x56, 0x03, 0xd0, 0x01, 0xd3, 0x01, 0x57, 0x03, 0x56, 0x03, 0xd5, 0x01, 0xd5, 0x01, 0x56, 0x03, 0xd3, 0x01, 0x95, 0x02, 0x55, 0x03, 0x58, 0x03, 0x58, 0x03, 0x55, 0x03, 0x59, 0x03, 0x55, 0x03, 0x53, 0x03, 0x59, 0x03, 0x59, 0x03, 0x53, 0x03, 0x56, 0x03, 0x57, 0x03, 0x5a, 0x03, 0x56, 0x03, 0x56, 0x03, 0x5a, 0x03, 0x59, 0x03, +0x5b, 0x03, 0x58, 0x03, 0x5a, 0x03, 0x5a, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5c, 0x03, 0x8f, 0x02, 0x5d, 0x03, 0x5d, 0x03, 0x8f, 0x02, 0x96, 0x02, 0x96, 0x02, 0x95, 0x02, 0x5d, 0x03, 0x5d, 0x03, 0x95, 0x02, 0x58, 0x03, 0x5b, 0x03, 0x5e, 0x03, 0x58, 0x03, 0x58, 0x03, 0x5e, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x5d, 0x03, 0x5d, 0x03, 0x5f, 0x03, 0x5c, 0x03, 0x90, 0x02, 0x8f, 0x02, 0x60, 0x03, 0x60, 0x03, 0x8f, 0x02, 0x5c, 0x03, 0x5f, 0x03, 0x61, 0x03, 0x5c, 0x03, 0x5c, 0x03, +0x61, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x60, 0x03, 0x60, 0x03, 0x62, 0x03, 0x63, 0x03, 0x91, 0x02, 0x90, 0x02, 0x63, 0x03, 0x63, 0x03, 0x90, 0x02, 0x60, 0x03, 0x62, 0x03, 0x64, 0x03, 0x63, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x8a, 0x02, 0x91, 0x02, 0x65, 0x03, 0x65, 0x03, 0x91, 0x02, 0x63, 0x03, 0x8b, 0x02, 0x8a, 0x02, 0x66, 0x03, 0x66, 0x03, 0x8a, 0x02, 0x65, 0x03, 0x64, 0x03, 0x67, 0x03, 0x65, 0x03, 0x65, 0x03, 0x67, 0x03, 0x66, 0x03, 0xcc, 0x01, 0x8b, 0x02, +0xd7, 0x01, 0xd7, 0x01, 0x8b, 0x02, 0x66, 0x03, 0x67, 0x03, 0xd6, 0x01, 0x66, 0x03, 0x66, 0x03, 0xd6, 0x01, 0xd7, 0x01, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6a, 0x03, 0x69, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x68, 0x03, 0x68, 0x03, 0x6d, 0x03, 0x69, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x6c, 0x03, 0x6c, 0x03, 0x6f, 0x03, 0x6d, 0x03, 0x70, 0x03, 0x71, 0x03, 0x6e, 0x03, 0x6e, 0x03, 0x71, 0x03, 0x6f, 0x03, 0x72, 0x03, 0x73, 0x03, 0x70, 0x03, 0x70, 0x03, 0x73, 0x03, 0x71, 0x03, +0x74, 0x03, 0x75, 0x03, 0x72, 0x03, 0x72, 0x03, 0x75, 0x03, 0x73, 0x03, 0x76, 0x03, 0x77, 0x03, 0x74, 0x03, 0x74, 0x03, 0x77, 0x03, 0x75, 0x03, 0x78, 0x03, 0x79, 0x03, 0x76, 0x03, 0x76, 0x03, 0x79, 0x03, 0x77, 0x03, 0x78, 0x03, 0x7a, 0x03, 0x79, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7a, 0x03, 0x7c, 0x03, 0x7b, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x7c, 0x03, 0x7c, 0x03, 0x7f, 0x03, 0x7d, 0x03, 0x80, 0x03, 0x81, 0x03, 0x7e, 0x03, 0x7e, 0x03, +0x81, 0x03, 0x7f, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x84, 0x03, 0x83, 0x03, 0x85, 0x03, 0x69, 0x03, 0x86, 0x03, 0x6b, 0x03, 0x6b, 0x03, 0x86, 0x03, 0x87, 0x03, 0x6d, 0x03, 0x88, 0x03, 0x69, 0x03, 0x69, 0x03, 0x88, 0x03, 0x86, 0x03, 0x6f, 0x03, 0x89, 0x03, 0x6d, 0x03, 0x6d, 0x03, 0x89, 0x03, 0x88, 0x03, 0x71, 0x03, 0x8a, 0x03, 0x6f, 0x03, 0x6f, 0x03, 0x8a, 0x03, 0x89, 0x03, 0x73, 0x03, 0x8b, 0x03, 0x71, 0x03, 0x71, 0x03, 0x8b, 0x03, 0x8a, 0x03, 0x75, 0x03, 0x8c, 0x03, +0x73, 0x03, 0x73, 0x03, 0x8c, 0x03, 0x8b, 0x03, 0x77, 0x03, 0x8d, 0x03, 0x75, 0x03, 0x75, 0x03, 0x8d, 0x03, 0x8c, 0x03, 0x79, 0x03, 0x8e, 0x03, 0x77, 0x03, 0x77, 0x03, 0x8e, 0x03, 0x8d, 0x03, 0x79, 0x03, 0x7b, 0x03, 0x8e, 0x03, 0x8e, 0x03, 0x7b, 0x03, 0x8f, 0x03, 0x7b, 0x03, 0x7d, 0x03, 0x8f, 0x03, 0x8f, 0x03, 0x7d, 0x03, 0x90, 0x03, 0x7f, 0x03, 0x91, 0x03, 0x7d, 0x03, 0x7d, 0x03, 0x91, 0x03, 0x90, 0x03, 0x92, 0x03, 0x81, 0x03, 0x93, 0x03, 0x93, 0x03, 0x81, 0x03, 0x85, 0x03, +0x86, 0x03, 0x94, 0x03, 0x87, 0x03, 0x87, 0x03, 0x94, 0x03, 0x95, 0x03, 0x88, 0x03, 0x96, 0x03, 0x86, 0x03, 0x86, 0x03, 0x96, 0x03, 0x94, 0x03, 0x89, 0x03, 0x97, 0x03, 0x88, 0x03, 0x88, 0x03, 0x97, 0x03, 0x96, 0x03, 0x8a, 0x03, 0x98, 0x03, 0x89, 0x03, 0x89, 0x03, 0x98, 0x03, 0x97, 0x03, 0x8b, 0x03, 0x99, 0x03, 0x8a, 0x03, 0x8a, 0x03, 0x99, 0x03, 0x98, 0x03, 0x8c, 0x03, 0x9a, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x9a, 0x03, 0x99, 0x03, 0x8d, 0x03, 0x9b, 0x03, 0x8c, 0x03, 0x8c, 0x03, +0x9b, 0x03, 0x9a, 0x03, 0x8e, 0x03, 0x9c, 0x03, 0x8d, 0x03, 0x8d, 0x03, 0x9c, 0x03, 0x9b, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x9c, 0x03, 0x9c, 0x03, 0x8f, 0x03, 0x9d, 0x03, 0x90, 0x03, 0x9e, 0x03, 0x8f, 0x03, 0x8f, 0x03, 0x9e, 0x03, 0x9d, 0x03, 0x91, 0x03, 0x9f, 0x03, 0x90, 0x03, 0x90, 0x03, 0x9f, 0x03, 0x9e, 0x03, 0xa0, 0x03, 0x92, 0x03, 0xa1, 0x03, 0xa1, 0x03, 0x92, 0x03, 0x93, 0x03, 0x95, 0x03, 0x94, 0x03, 0xa2, 0x03, 0xa2, 0x03, 0x94, 0x03, 0xa3, 0x03, 0x96, 0x03, 0xa4, 0x03, +0x94, 0x03, 0x94, 0x03, 0xa4, 0x03, 0xa3, 0x03, 0x97, 0x03, 0xa5, 0x03, 0x96, 0x03, 0x96, 0x03, 0xa5, 0x03, 0xa4, 0x03, 0x98, 0x03, 0xa6, 0x03, 0x97, 0x03, 0x97, 0x03, 0xa6, 0x03, 0xa5, 0x03, 0x99, 0x03, 0xa7, 0x03, 0x98, 0x03, 0x98, 0x03, 0xa7, 0x03, 0xa6, 0x03, 0x9a, 0x03, 0xa8, 0x03, 0x99, 0x03, 0x99, 0x03, 0xa8, 0x03, 0xa7, 0x03, 0x9b, 0x03, 0xa9, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0xa9, 0x03, 0xa8, 0x03, 0x9c, 0x03, 0xaa, 0x03, 0x9b, 0x03, 0x9b, 0x03, 0xaa, 0x03, 0xa9, 0x03, +0x9c, 0x03, 0x9d, 0x03, 0xaa, 0x03, 0xaa, 0x03, 0x9d, 0x03, 0xab, 0x03, 0x9e, 0x03, 0xac, 0x03, 0x9d, 0x03, 0x9d, 0x03, 0xac, 0x03, 0xab, 0x03, 0x9f, 0x03, 0xad, 0x03, 0x9e, 0x03, 0x9e, 0x03, 0xad, 0x03, 0xac, 0x03, 0xae, 0x03, 0xa0, 0x03, 0xaf, 0x03, 0xaf, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, 0x03, 0xb0, 0x03, 0xb0, 0x03, 0xa3, 0x03, 0xb1, 0x03, 0xa4, 0x03, 0xb2, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xb2, 0x03, 0xb1, 0x03, 0xa5, 0x03, 0xb3, 0x03, 0xa4, 0x03, 0xa4, 0x03, +0xb3, 0x03, 0xb2, 0x03, 0xa6, 0x03, 0xb4, 0x03, 0xa5, 0x03, 0xa5, 0x03, 0xb4, 0x03, 0xb3, 0x03, 0xa7, 0x03, 0xb5, 0x03, 0xa6, 0x03, 0xa6, 0x03, 0xb5, 0x03, 0xb4, 0x03, 0xa8, 0x03, 0xb6, 0x03, 0xa7, 0x03, 0xa7, 0x03, 0xb6, 0x03, 0xb5, 0x03, 0xa9, 0x03, 0xb7, 0x03, 0xa8, 0x03, 0xa8, 0x03, 0xb7, 0x03, 0xb6, 0x03, 0xaa, 0x03, 0xb8, 0x03, 0xa9, 0x03, 0xa9, 0x03, 0xb8, 0x03, 0xb7, 0x03, 0xaa, 0x03, 0xab, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xab, 0x03, 0xb9, 0x03, 0xac, 0x03, 0xba, 0x03, +0xab, 0x03, 0xab, 0x03, 0xba, 0x03, 0xb9, 0x03, 0xad, 0x03, 0xbb, 0x03, 0xac, 0x03, 0xac, 0x03, 0xbb, 0x03, 0xba, 0x03, 0xbc, 0x03, 0xae, 0x03, 0xbd, 0x03, 0xbd, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, 0x03, 0xbe, 0x03, 0xbe, 0x03, 0xb1, 0x03, 0xbf, 0x03, 0xb2, 0x03, 0xc0, 0x03, 0xb1, 0x03, 0xb1, 0x03, 0xc0, 0x03, 0xbf, 0x03, 0xb3, 0x03, 0xc1, 0x03, 0xb2, 0x03, 0xb2, 0x03, 0xc1, 0x03, 0xc0, 0x03, 0xb4, 0x03, 0xc2, 0x03, 0xb3, 0x03, 0xb3, 0x03, 0xc2, 0x03, 0xc1, 0x03, +0xb5, 0x03, 0xc3, 0x03, 0xb4, 0x03, 0xb4, 0x03, 0xc3, 0x03, 0xc2, 0x03, 0xb6, 0x03, 0xc4, 0x03, 0xb5, 0x03, 0xb5, 0x03, 0xc4, 0x03, 0xc3, 0x03, 0xb7, 0x03, 0xc5, 0x03, 0xb6, 0x03, 0xb6, 0x03, 0xc5, 0x03, 0xc4, 0x03, 0xb8, 0x03, 0xc6, 0x03, 0xb7, 0x03, 0xb7, 0x03, 0xc6, 0x03, 0xc5, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xc6, 0x03, 0xc6, 0x03, 0xb9, 0x03, 0xc7, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xc7, 0x03, 0xc7, 0x03, 0xba, 0x03, 0xc8, 0x03, 0xbb, 0x03, 0xc9, 0x03, 0xba, 0x03, 0xba, 0x03, +0xc9, 0x03, 0xc8, 0x03, 0x87, 0x01, 0xbc, 0x03, 0x86, 0x01, 0x86, 0x01, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xca, 0x03, 0xca, 0x03, 0xbf, 0x03, 0xcb, 0x03, 0xc0, 0x03, 0xcc, 0x03, 0xbf, 0x03, 0xbf, 0x03, 0xcc, 0x03, 0xcb, 0x03, 0xc1, 0x03, 0xcd, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xcd, 0x03, 0xcc, 0x03, 0xc2, 0x03, 0xce, 0x03, 0xc1, 0x03, 0xc1, 0x03, 0xce, 0x03, 0xcd, 0x03, 0xc3, 0x03, 0xcf, 0x03, 0xc2, 0x03, 0xc2, 0x03, 0xcf, 0x03, 0xce, 0x03, 0xc4, 0x03, 0xd0, 0x03, +0xc3, 0x03, 0xc3, 0x03, 0xd0, 0x03, 0xcf, 0x03, 0xc5, 0x03, 0xd1, 0x03, 0xc4, 0x03, 0xc4, 0x03, 0xd1, 0x03, 0xd0, 0x03, 0xc6, 0x03, 0xd2, 0x03, 0xc5, 0x03, 0xc5, 0x03, 0xd2, 0x03, 0xd1, 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xd2, 0x03, 0xd2, 0x03, 0xc7, 0x03, 0xd3, 0x03, 0xc7, 0x03, 0xc8, 0x03, 0xd3, 0x03, 0xd3, 0x03, 0xc8, 0x03, 0xd4, 0x03, 0xc9, 0x03, 0xd5, 0x03, 0xc8, 0x03, 0xc8, 0x03, 0xd5, 0x03, 0xd4, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xd6, 0x03, 0xd6, 0x03, 0xcb, 0x03, 0xd7, 0x03, +0xcc, 0x03, 0xd8, 0x03, 0xcb, 0x03, 0xcb, 0x03, 0xd8, 0x03, 0xd7, 0x03, 0xcd, 0x03, 0xd9, 0x03, 0xcc, 0x03, 0xcc, 0x03, 0xd9, 0x03, 0xd8, 0x03, 0xce, 0x03, 0xda, 0x03, 0xcd, 0x03, 0xcd, 0x03, 0xda, 0x03, 0xd9, 0x03, 0xcf, 0x03, 0xdb, 0x03, 0xce, 0x03, 0xce, 0x03, 0xdb, 0x03, 0xda, 0x03, 0xd0, 0x03, 0xdc, 0x03, 0xcf, 0x03, 0xcf, 0x03, 0xdc, 0x03, 0xdb, 0x03, 0xd1, 0x03, 0xdd, 0x03, 0xd0, 0x03, 0xd0, 0x03, 0xdd, 0x03, 0xdc, 0x03, 0xd2, 0x03, 0xde, 0x03, 0xd1, 0x03, 0xd1, 0x03, +0xde, 0x03, 0xdd, 0x03, 0xd2, 0x03, 0xd3, 0x03, 0xde, 0x03, 0xde, 0x03, 0xd3, 0x03, 0xdf, 0x03, 0xd3, 0x03, 0xd4, 0x03, 0xdf, 0x03, 0xdf, 0x03, 0xd4, 0x03, 0xe0, 0x03, 0xd5, 0x03, 0xe1, 0x03, 0xd4, 0x03, 0xd4, 0x03, 0xe1, 0x03, 0xe0, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xe2, 0x03, 0xe2, 0x03, 0xd7, 0x03, 0xe3, 0x03, 0xd8, 0x03, 0xe4, 0x03, 0xd7, 0x03, 0xd7, 0x03, 0xe4, 0x03, 0xe3, 0x03, 0xd9, 0x03, 0xe5, 0x03, 0xd8, 0x03, 0xd8, 0x03, 0xe5, 0x03, 0xe4, 0x03, 0xda, 0x03, 0xe6, 0x03, +0xd9, 0x03, 0xd9, 0x03, 0xe6, 0x03, 0xe5, 0x03, 0xdb, 0x03, 0xe7, 0x03, 0xda, 0x03, 0xda, 0x03, 0xe7, 0x03, 0xe6, 0x03, 0xdc, 0x03, 0xe8, 0x03, 0xdb, 0x03, 0xdb, 0x03, 0xe8, 0x03, 0xe7, 0x03, 0xdd, 0x03, 0xe9, 0x03, 0xdc, 0x03, 0xdc, 0x03, 0xe9, 0x03, 0xe8, 0x03, 0xde, 0x03, 0xea, 0x03, 0xdd, 0x03, 0xdd, 0x03, 0xea, 0x03, 0xe9, 0x03, 0xde, 0x03, 0xdf, 0x03, 0xea, 0x03, 0xea, 0x03, 0xdf, 0x03, 0xeb, 0x03, 0xdf, 0x03, 0xe0, 0x03, 0xeb, 0x03, 0xeb, 0x03, 0xe0, 0x03, 0xec, 0x03, +0xe1, 0x03, 0xed, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xed, 0x03, 0xec, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xee, 0x03, 0xee, 0x03, 0xe3, 0x03, 0xef, 0x03, 0xe4, 0x03, 0xf0, 0x03, 0xe3, 0x03, 0xe3, 0x03, 0xf0, 0x03, 0xef, 0x03, 0xe5, 0x03, 0xf1, 0x03, 0xe4, 0x03, 0xe4, 0x03, 0xf1, 0x03, 0xf0, 0x03, 0xe6, 0x03, 0xf2, 0x03, 0xe5, 0x03, 0xe5, 0x03, 0xf2, 0x03, 0xf1, 0x03, 0xe7, 0x03, 0xf3, 0x03, 0xe6, 0x03, 0xe6, 0x03, 0xf3, 0x03, 0xf2, 0x03, 0xe8, 0x03, 0xf4, 0x03, 0xe7, 0x03, 0xe7, 0x03, +0xf4, 0x03, 0xf3, 0x03, 0xe9, 0x03, 0xf5, 0x03, 0xe8, 0x03, 0xe8, 0x03, 0xf5, 0x03, 0xf4, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xea, 0x03, 0xf6, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xf6, 0x03, 0xf6, 0x03, 0xeb, 0x03, 0xf7, 0x03, 0xeb, 0x03, 0xec, 0x03, 0xf7, 0x03, 0xf7, 0x03, 0xec, 0x03, 0xf8, 0x03, 0xec, 0x03, 0xed, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xed, 0x03, 0xf9, 0x03, 0xee, 0x03, 0xef, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xef, 0x03, 0xfb, 0x03, 0xf0, 0x03, 0xfc, 0x03, +0xef, 0x03, 0xef, 0x03, 0xfc, 0x03, 0xfb, 0x03, 0xf1, 0x03, 0xfd, 0x03, 0xf0, 0x03, 0xf0, 0x03, 0xfd, 0x03, 0xfc, 0x03, 0xf2, 0x03, 0xfe, 0x03, 0xf1, 0x03, 0xf1, 0x03, 0xfe, 0x03, 0xfd, 0x03, 0xf3, 0x03, 0xff, 0x03, 0xf2, 0x03, 0xf2, 0x03, 0xff, 0x03, 0xfe, 0x03, 0xf4, 0x03, 0x00, 0x04, 0xf3, 0x03, 0xf3, 0x03, 0x00, 0x04, 0xff, 0x03, 0xf5, 0x03, 0x01, 0x04, 0xf4, 0x03, 0xf4, 0x03, 0x01, 0x04, 0x00, 0x04, 0xf5, 0x03, 0xf6, 0x03, 0x01, 0x04, 0x01, 0x04, 0xf6, 0x03, 0x02, 0x04, +0xf6, 0x03, 0xf7, 0x03, 0x02, 0x04, 0x02, 0x04, 0xf7, 0x03, 0x03, 0x04, 0xf8, 0x03, 0x04, 0x04, 0xf7, 0x03, 0xf7, 0x03, 0x04, 0x04, 0x03, 0x04, 0xf8, 0x03, 0xf9, 0x03, 0x04, 0x04, 0x04, 0x04, 0xf9, 0x03, 0x05, 0x04, 0xfa, 0x03, 0xfb, 0x03, 0x06, 0x04, 0x06, 0x04, 0xfb, 0x03, 0x07, 0x04, 0xfb, 0x03, 0xfc, 0x03, 0x07, 0x04, 0x07, 0x04, 0xfc, 0x03, 0x08, 0x04, 0xfc, 0x03, 0xfd, 0x03, 0x08, 0x04, 0x08, 0x04, 0xfd, 0x03, 0x09, 0x04, 0xfd, 0x03, 0xfe, 0x03, 0x09, 0x04, 0x09, 0x04, +0xfe, 0x03, 0x0a, 0x04, 0xff, 0x03, 0x0b, 0x04, 0xfe, 0x03, 0xfe, 0x03, 0x0b, 0x04, 0x0a, 0x04, 0x00, 0x04, 0x0c, 0x04, 0xff, 0x03, 0xff, 0x03, 0x0c, 0x04, 0x0b, 0x04, 0x01, 0x04, 0x0d, 0x04, 0x00, 0x04, 0x00, 0x04, 0x0d, 0x04, 0x0c, 0x04, 0x01, 0x04, 0x02, 0x04, 0x0d, 0x04, 0x0d, 0x04, 0x02, 0x04, 0x0e, 0x04, 0x03, 0x04, 0x0f, 0x04, 0x02, 0x04, 0x02, 0x04, 0x0f, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x10, 0x04, 0x03, 0x04, 0x03, 0x04, 0x10, 0x04, 0x0f, 0x04, 0x05, 0x04, 0x11, 0x04, +0x04, 0x04, 0x04, 0x04, 0x11, 0x04, 0x10, 0x04, 0x06, 0x04, 0x07, 0x04, 0x12, 0x04, 0x12, 0x04, 0x07, 0x04, 0x13, 0x04, 0x07, 0x04, 0x08, 0x04, 0x13, 0x04, 0x13, 0x04, 0x08, 0x04, 0x14, 0x04, 0x08, 0x04, 0x09, 0x04, 0x14, 0x04, 0x14, 0x04, 0x09, 0x04, 0x15, 0x04, 0x0c, 0x04, 0x0d, 0x04, 0x16, 0x04, 0x0e, 0x04, 0x17, 0x04, 0x0d, 0x04, 0x0d, 0x04, 0x17, 0x04, 0x16, 0x04, 0x0f, 0x04, 0x18, 0x04, 0x0e, 0x04, 0x0e, 0x04, 0x18, 0x04, 0x17, 0x04, 0x10, 0x04, 0x19, 0x04, 0x0f, 0x04, +0x0f, 0x04, 0x19, 0x04, 0x18, 0x04, 0x11, 0x04, 0x1a, 0x04, 0x10, 0x04, 0x10, 0x04, 0x1a, 0x04, 0x19, 0x04, 0x12, 0x04, 0x13, 0x04, 0x1b, 0x04, 0x1b, 0x04, 0x13, 0x04, 0x1c, 0x04, 0x13, 0x04, 0x14, 0x04, 0x1c, 0x04, 0x1c, 0x04, 0x14, 0x04, 0x1d, 0x04, 0x1b, 0x04, 0x1c, 0x04, 0x1e, 0x04, 0x1e, 0x04, 0x1c, 0x04, 0x1f, 0x04, 0x1d, 0x04, 0x20, 0x04, 0x1c, 0x04, 0x1c, 0x04, 0x20, 0x04, 0x1f, 0x04, 0x21, 0x04, 0x22, 0x04, 0x18, 0x04, 0x18, 0x04, 0x22, 0x04, 0x17, 0x04, 0x19, 0x04, +0x23, 0x04, 0x18, 0x04, 0x18, 0x04, 0x23, 0x04, 0x21, 0x04, 0x1a, 0x04, 0x24, 0x04, 0x19, 0x04, 0x19, 0x04, 0x24, 0x04, 0x23, 0x04, 0x1e, 0x04, 0x1f, 0x04, 0x25, 0x04, 0x25, 0x04, 0x1f, 0x04, 0x26, 0x04, 0x20, 0x04, 0x27, 0x04, 0x1f, 0x04, 0x1f, 0x04, 0x27, 0x04, 0x26, 0x04, 0x28, 0x04, 0x22, 0x04, 0x29, 0x04, 0x29, 0x04, 0x22, 0x04, 0x21, 0x04, 0x21, 0x04, 0x23, 0x04, 0x29, 0x04, 0x29, 0x04, 0x23, 0x04, 0x2a, 0x04, 0x24, 0x04, 0x2b, 0x04, 0x23, 0x04, 0x23, 0x04, 0x2b, 0x04, +0x2a, 0x04, 0x25, 0x04, 0x26, 0x04, 0x2c, 0x04, 0x2c, 0x04, 0x26, 0x04, 0x2d, 0x04, 0x26, 0x04, 0x27, 0x04, 0x2d, 0x04, 0x2d, 0x04, 0x27, 0x04, 0x2e, 0x04, 0x2f, 0x04, 0x30, 0x04, 0x29, 0x04, 0x29, 0x04, 0x30, 0x04, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2f, 0x04, 0x2f, 0x04, 0x2a, 0x04, 0x31, 0x04, 0x2b, 0x04, 0x32, 0x04, 0x2a, 0x04, 0x2a, 0x04, 0x32, 0x04, 0x31, 0x04, 0x2c, 0x04, 0x2d, 0x04, 0x33, 0x04, 0x33, 0x04, 0x2d, 0x04, 0x34, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x34, 0x04, +0x34, 0x04, 0x2e, 0x04, 0x35, 0x04, 0x30, 0x04, 0x2f, 0x04, 0x36, 0x04, 0x36, 0x04, 0x2f, 0x04, 0x37, 0x04, 0x2f, 0x04, 0x31, 0x04, 0x37, 0x04, 0x37, 0x04, 0x31, 0x04, 0x38, 0x04, 0x31, 0x04, 0x32, 0x04, 0x38, 0x04, 0x38, 0x04, 0x32, 0x04, 0x39, 0x04, 0x32, 0x04, 0x3a, 0x04, 0x39, 0x04, 0x39, 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3a, 0x04, 0x3d, 0x04, 0x3d, 0x04, 0x3a, 0x04, 0x3e, 0x04, 0x33, 0x04, 0x34, 0x04, 0x3f, 0x04, 0x3f, 0x04, 0x34, 0x04, 0x40, 0x04, 0x34, 0x04, +0x35, 0x04, 0x40, 0x04, 0x40, 0x04, 0x35, 0x04, 0x41, 0x04, 0x42, 0x04, 0x43, 0x04, 0x44, 0x04, 0x44, 0x04, 0x43, 0x04, 0x45, 0x04, 0x68, 0x03, 0x6a, 0x03, 0x46, 0x04, 0x6c, 0x03, 0x68, 0x03, 0x46, 0x04, 0x6e, 0x03, 0x6c, 0x03, 0x46, 0x04, 0x70, 0x03, 0x6e, 0x03, 0x46, 0x04, 0x72, 0x03, 0x70, 0x03, 0x46, 0x04, 0x74, 0x03, 0x72, 0x03, 0x46, 0x04, 0x76, 0x03, 0x74, 0x03, 0x46, 0x04, 0x78, 0x03, 0x76, 0x03, 0x46, 0x04, 0x7a, 0x03, 0x78, 0x03, 0x46, 0x04, 0x7c, 0x03, 0x7a, 0x03, +0x46, 0x04, 0x7e, 0x03, 0x7c, 0x03, 0x46, 0x04, 0x7e, 0x03, 0x46, 0x04, 0x80, 0x03, 0x82, 0x03, 0x84, 0x03, 0x46, 0x04, 0x47, 0x04, 0x48, 0x04, 0x49, 0x04, 0x49, 0x04, 0x48, 0x04, 0x4a, 0x04, 0x49, 0x04, 0x4b, 0x04, 0x47, 0x04, 0x47, 0x04, 0x4b, 0x04, 0x4c, 0x04, 0x4d, 0x04, 0x4e, 0x04, 0x49, 0x04, 0x49, 0x04, 0x4e, 0x04, 0x4b, 0x04, 0x49, 0x04, 0x4a, 0x04, 0x4d, 0x04, 0x4d, 0x04, 0x4a, 0x04, 0x4f, 0x04, 0x50, 0x04, 0x51, 0x04, 0x52, 0x04, 0x52, 0x04, 0x51, 0x04, 0x53, 0x04, +0x52, 0x04, 0x54, 0x04, 0x50, 0x04, 0x50, 0x04, 0x54, 0x04, 0x55, 0x04, 0x47, 0x04, 0x4c, 0x04, 0x52, 0x04, 0x52, 0x04, 0x4c, 0x04, 0x54, 0x04, 0x52, 0x04, 0x53, 0x04, 0x47, 0x04, 0x47, 0x04, 0x53, 0x04, 0x48, 0x04, 0x56, 0x04, 0x57, 0x04, 0x58, 0x04, 0x58, 0x04, 0x57, 0x04, 0x59, 0x04, 0x58, 0x04, 0x5a, 0x04, 0x56, 0x04, 0x56, 0x04, 0x5a, 0x04, 0x5b, 0x04, 0x50, 0x04, 0x55, 0x04, 0x58, 0x04, 0x58, 0x04, 0x55, 0x04, 0x5a, 0x04, 0x58, 0x04, 0x59, 0x04, 0x50, 0x04, 0x50, 0x04, +0x59, 0x04, 0x51, 0x04, 0x5c, 0x04, 0x5d, 0x04, 0x5e, 0x04, 0x5e, 0x04, 0x5d, 0x04, 0x5f, 0x04, 0x5f, 0x04, 0x60, 0x04, 0x5e, 0x04, 0x5e, 0x04, 0x60, 0x04, 0x61, 0x04, 0x56, 0x04, 0x5b, 0x04, 0x5f, 0x04, 0x5f, 0x04, 0x5b, 0x04, 0x60, 0x04, 0x5f, 0x04, 0x5d, 0x04, 0x56, 0x04, 0x56, 0x04, 0x5d, 0x04, 0x57, 0x04, 0x62, 0x04, 0x63, 0x04, 0x64, 0x04, 0x64, 0x04, 0x63, 0x04, 0x65, 0x04, 0x61, 0x04, 0x62, 0x04, 0x5e, 0x04, 0x5e, 0x04, 0x62, 0x04, 0x64, 0x04, 0x64, 0x04, 0x65, 0x04, +0x66, 0x04, 0x66, 0x04, 0x65, 0x04, 0x67, 0x04, 0x68, 0x04, 0x69, 0x04, 0x6a, 0x04, 0x6a, 0x04, 0x69, 0x04, 0x6b, 0x04, 0x6c, 0x04, 0x6d, 0x04, 0x6b, 0x04, 0x6b, 0x04, 0x6d, 0x04, 0x6a, 0x04, 0x63, 0x04, 0x6c, 0x04, 0x65, 0x04, 0x65, 0x04, 0x6c, 0x04, 0x6b, 0x04, 0x69, 0x04, 0x67, 0x04, 0x6b, 0x04, 0x6b, 0x04, 0x67, 0x04, 0x65, 0x04, 0x6e, 0x04, 0x6f, 0x04, 0x70, 0x04, 0x70, 0x04, 0x6f, 0x04, 0x71, 0x04, 0x72, 0x04, 0x73, 0x04, 0x71, 0x04, 0x71, 0x04, 0x73, 0x04, 0x70, 0x04, +0x6d, 0x04, 0x72, 0x04, 0x6a, 0x04, 0x6a, 0x04, 0x72, 0x04, 0x71, 0x04, 0x6f, 0x04, 0x68, 0x04, 0x71, 0x04, 0x71, 0x04, 0x68, 0x04, 0x6a, 0x04, 0x74, 0x04, 0x75, 0x04, 0x76, 0x04, 0x76, 0x04, 0x75, 0x04, 0x77, 0x04, 0x78, 0x04, 0x79, 0x04, 0x77, 0x04, 0x77, 0x04, 0x79, 0x04, 0x76, 0x04, 0x73, 0x04, 0x78, 0x04, 0x70, 0x04, 0x70, 0x04, 0x78, 0x04, 0x77, 0x04, 0x75, 0x04, 0x6e, 0x04, 0x77, 0x04, 0x77, 0x04, 0x6e, 0x04, 0x70, 0x04, 0x7a, 0x04, 0x7b, 0x04, 0x7c, 0x04, 0x7c, 0x04, +0x7b, 0x04, 0x7d, 0x04, 0x7e, 0x04, 0x7f, 0x04, 0x7d, 0x04, 0x7d, 0x04, 0x7f, 0x04, 0x7c, 0x04, 0x79, 0x04, 0x7e, 0x04, 0x76, 0x04, 0x76, 0x04, 0x7e, 0x04, 0x7d, 0x04, 0x7b, 0x04, 0x74, 0x04, 0x7d, 0x04, 0x7d, 0x04, 0x74, 0x04, 0x76, 0x04, 0x4d, 0x04, 0x4f, 0x04, 0x80, 0x04, 0x80, 0x04, 0x4f, 0x04, 0x81, 0x04, 0x80, 0x04, 0x82, 0x04, 0x4d, 0x04, 0x4d, 0x04, 0x82, 0x04, 0x4e, 0x04, 0x7c, 0x04, 0x7f, 0x04, 0x80, 0x04, 0x80, 0x04, 0x7f, 0x04, 0x82, 0x04, 0x80, 0x04, 0x81, 0x04, +0x7c, 0x04, 0x7c, 0x04, 0x81, 0x04, 0x7a, 0x04, 0x75, 0x04, 0x74, 0x04, 0x4a, 0x04, 0x4a, 0x04, 0x74, 0x04, 0x4f, 0x04, 0x83, 0x04, 0x84, 0x04, 0x85, 0x04, 0x85, 0x04, 0x84, 0x04, 0x86, 0x04, 0x87, 0x04, 0x88, 0x04, 0x89, 0x04, 0x89, 0x04, 0x88, 0x04, 0x86, 0x04, 0x8a, 0x04, 0x8b, 0x04, 0x8c, 0x04, 0x8c, 0x04, 0x8b, 0x04, 0x8d, 0x04, 0x8e, 0x04, 0x8f, 0x04, 0x90, 0x04, 0x90, 0x04, 0x8f, 0x04, 0x8d, 0x04, 0x91, 0x04, 0x92, 0x04, 0x90, 0x04, 0x90, 0x04, 0x92, 0x04, 0x93, 0x04, +0x94, 0x04, 0x95, 0x04, 0x85, 0x04, 0x85, 0x04, 0x95, 0x04, 0x93, 0x04, 0x96, 0x04, 0x97, 0x04, 0x98, 0x04, 0x98, 0x04, 0x97, 0x04, 0x89, 0x04, 0x99, 0x04, 0x9a, 0x04, 0x9b, 0x04, 0x9b, 0x04, 0x9a, 0x04, 0x97, 0x04, 0x9c, 0x04, 0x9d, 0x04, 0x9b, 0x04, 0x9b, 0x04, 0x9d, 0x04, 0x9e, 0x04, 0x9f, 0x04, 0x9e, 0x04, 0xa0, 0x04, 0xa0, 0x04, 0x9e, 0x04, 0xa1, 0x04, 0xa2, 0x04, 0xa3, 0x04, 0xa4, 0x04, 0xa4, 0x04, 0xa3, 0x04, 0xa5, 0x04, 0xa6, 0x04, 0xa3, 0x04, 0xa7, 0x04, 0xa7, 0x04, +0xa3, 0x04, 0xa1, 0x04, 0xa8, 0x04, 0xa9, 0x04, 0xaa, 0x04, 0xaa, 0x04, 0xa9, 0x04, 0xa5, 0x04, 0xab, 0x04, 0xa9, 0x04, 0xac, 0x04, 0xac, 0x04, 0xa9, 0x04, 0xad, 0x04, 0xae, 0x04, 0xaf, 0x04, 0xb0, 0x04, 0xb0, 0x04, 0xaf, 0x04, 0xad, 0x04, 0xb1, 0x04, 0xaf, 0x04, 0xb2, 0x04, 0xb2, 0x04, 0xaf, 0x04, 0xb3, 0x04, 0xb4, 0x04, 0xb5, 0x04, 0xb6, 0x04, 0xb6, 0x04, 0xb5, 0x04, 0xb3, 0x04, 0xb7, 0x04, 0xb5, 0x04, 0xb8, 0x04, 0xb8, 0x04, 0xb5, 0x04, 0xb9, 0x04, 0xba, 0x04, 0xbb, 0x04, +0xbc, 0x04, 0xbc, 0x04, 0xbb, 0x04, 0xb9, 0x04, 0xbd, 0x04, 0xbb, 0x04, 0xbe, 0x04, 0xbe, 0x04, 0xbb, 0x04, 0x8c, 0x04, 0x5a, 0x04, 0xbf, 0x04, 0x5b, 0x04, 0x5b, 0x04, 0xbf, 0x04, 0xc0, 0x04, 0xc1, 0x04, 0x5a, 0x04, 0xc2, 0x04, 0xc2, 0x04, 0x5a, 0x04, 0x55, 0x04, 0x4b, 0x04, 0xc3, 0x04, 0x4c, 0x04, 0x4c, 0x04, 0xc3, 0x04, 0xc4, 0x04, 0xc5, 0x04, 0x4b, 0x04, 0xc6, 0x04, 0xc6, 0x04, 0x4b, 0x04, 0x4e, 0x04, 0x54, 0x04, 0xc7, 0x04, 0x55, 0x04, 0x55, 0x04, 0xc7, 0x04, 0xc8, 0x04, +0xc9, 0x04, 0x54, 0x04, 0xca, 0x04, 0xca, 0x04, 0x54, 0x04, 0x4c, 0x04, 0x60, 0x04, 0xcb, 0x04, 0x61, 0x04, 0x61, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0x60, 0x04, 0xce, 0x04, 0xce, 0x04, 0x60, 0x04, 0x5b, 0x04, 0x82, 0x04, 0xcf, 0x04, 0x4e, 0x04, 0x4e, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd1, 0x04, 0x82, 0x04, 0xd2, 0x04, 0xd2, 0x04, 0x82, 0x04, 0x7f, 0x04, 0x63, 0x04, 0x62, 0x04, 0xd3, 0x04, 0xd3, 0x04, 0x62, 0x04, 0xd4, 0x04, 0x62, 0x04, 0x61, 0x04, 0xd5, 0x04, 0xd5, 0x04, +0x61, 0x04, 0xd6, 0x04, 0x7f, 0x04, 0x7e, 0x04, 0xd7, 0x04, 0xd7, 0x04, 0x7e, 0x04, 0xd8, 0x04, 0x7e, 0x04, 0x79, 0x04, 0xd9, 0x04, 0xd9, 0x04, 0x79, 0x04, 0xda, 0x04, 0x6d, 0x04, 0x6c, 0x04, 0xdb, 0x04, 0xdb, 0x04, 0x6c, 0x04, 0xdc, 0x04, 0x6c, 0x04, 0x63, 0x04, 0xdd, 0x04, 0xdd, 0x04, 0x63, 0x04, 0xde, 0x04, 0x79, 0x04, 0x78, 0x04, 0xdf, 0x04, 0xdf, 0x04, 0x78, 0x04, 0xe0, 0x04, 0x78, 0x04, 0x73, 0x04, 0xe1, 0x04, 0xe1, 0x04, 0x73, 0x04, 0xe2, 0x04, 0x73, 0x04, 0x72, 0x04, +0xe3, 0x04, 0xe3, 0x04, 0x72, 0x04, 0xe4, 0x04, 0x72, 0x04, 0x6d, 0x04, 0xe5, 0x04, 0xe5, 0x04, 0x6d, 0x04, 0xe6, 0x04, 0xe7, 0x04, 0x9a, 0x04, 0xe8, 0x04, 0xe8, 0x04, 0x9a, 0x04, 0x99, 0x04, 0x9a, 0x04, 0xe9, 0x04, 0x87, 0x04, 0x87, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0x95, 0x04, 0xec, 0x04, 0xec, 0x04, 0x95, 0x04, 0x94, 0x04, 0x8e, 0x04, 0x95, 0x04, 0xed, 0x04, 0xed, 0x04, 0x95, 0x04, 0xee, 0x04, 0x87, 0x04, 0xef, 0x04, 0x88, 0x04, 0x88, 0x04, 0xef, 0x04, 0xf0, 0x04, +0xf1, 0x04, 0x94, 0x04, 0xf2, 0x04, 0xf2, 0x04, 0x94, 0x04, 0x88, 0x04, 0xf3, 0x04, 0x9f, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0x9f, 0x04, 0xa0, 0x04, 0xf5, 0x04, 0x99, 0x04, 0xf6, 0x04, 0xf6, 0x04, 0x99, 0x04, 0x9f, 0x04, 0xf7, 0x04, 0xf8, 0x04, 0x8e, 0x04, 0x8e, 0x04, 0xf8, 0x04, 0x8f, 0x04, 0xbe, 0x04, 0x8f, 0x04, 0xf9, 0x04, 0xf9, 0x04, 0x8f, 0x04, 0xfa, 0x04, 0xfb, 0x04, 0xa2, 0x04, 0xfc, 0x04, 0xfc, 0x04, 0xa2, 0x04, 0xa4, 0x04, 0xfd, 0x04, 0xa0, 0x04, 0xfe, 0x04, 0xfe, 0x04, +0xa0, 0x04, 0xa2, 0x04, 0xff, 0x04, 0x00, 0x05, 0xbe, 0x04, 0xbe, 0x04, 0x00, 0x05, 0xbd, 0x04, 0xb8, 0x04, 0xbd, 0x04, 0x01, 0x05, 0x01, 0x05, 0xbd, 0x04, 0x02, 0x05, 0x03, 0x05, 0xab, 0x04, 0x04, 0x05, 0x04, 0x05, 0xab, 0x04, 0xac, 0x04, 0x05, 0x05, 0xa4, 0x04, 0x06, 0x05, 0x06, 0x05, 0xa4, 0x04, 0xab, 0x04, 0x07, 0x05, 0x08, 0x05, 0xb8, 0x04, 0xb8, 0x04, 0x08, 0x05, 0xb7, 0x04, 0xb2, 0x04, 0xb7, 0x04, 0x09, 0x05, 0x09, 0x05, 0xb7, 0x04, 0x0a, 0x05, 0xb2, 0x04, 0x0b, 0x05, +0xb1, 0x04, 0xb1, 0x04, 0x0b, 0x05, 0x0c, 0x05, 0x0d, 0x05, 0xac, 0x04, 0x0e, 0x05, 0x0e, 0x05, 0xac, 0x04, 0xb1, 0x04, 0xa6, 0x04, 0x0f, 0x05, 0xaa, 0x04, 0xaa, 0x04, 0x0f, 0x05, 0x10, 0x05, 0xa6, 0x04, 0xa7, 0x04, 0x0f, 0x05, 0x0f, 0x05, 0xa7, 0x04, 0x11, 0x05, 0xa8, 0x04, 0x12, 0x05, 0xb0, 0x04, 0xb0, 0x04, 0x12, 0x05, 0x13, 0x05, 0x12, 0x05, 0xa8, 0x04, 0x10, 0x05, 0x10, 0x05, 0xa8, 0x04, 0xaa, 0x04, 0x98, 0x04, 0x84, 0x04, 0x14, 0x05, 0x14, 0x05, 0x84, 0x04, 0x15, 0x05, +0x84, 0x04, 0x83, 0x04, 0x15, 0x05, 0x15, 0x05, 0x83, 0x04, 0x16, 0x05, 0xb4, 0x04, 0x17, 0x05, 0xbc, 0x04, 0xbc, 0x04, 0x17, 0x05, 0x18, 0x05, 0x17, 0x05, 0xb4, 0x04, 0x19, 0x05, 0x19, 0x05, 0xb4, 0x04, 0xb6, 0x04, 0x91, 0x04, 0x8b, 0x04, 0x1a, 0x05, 0x1a, 0x05, 0x8b, 0x04, 0x1b, 0x05, 0x1b, 0x05, 0x8b, 0x04, 0x1c, 0x05, 0x1c, 0x05, 0x8b, 0x04, 0x8a, 0x04, 0x83, 0x04, 0x92, 0x04, 0x16, 0x05, 0x16, 0x05, 0x92, 0x04, 0x1d, 0x05, 0x92, 0x04, 0x91, 0x04, 0x1d, 0x05, 0x1d, 0x05, +0x91, 0x04, 0x1a, 0x05, 0x9c, 0x04, 0x96, 0x04, 0x1e, 0x05, 0x1e, 0x05, 0x96, 0x04, 0x1f, 0x05, 0x96, 0x04, 0x98, 0x04, 0x1f, 0x05, 0x1f, 0x05, 0x98, 0x04, 0x14, 0x05, 0xa7, 0x04, 0x9d, 0x04, 0x11, 0x05, 0x11, 0x05, 0x9d, 0x04, 0x20, 0x05, 0x9d, 0x04, 0x9c, 0x04, 0x20, 0x05, 0x20, 0x05, 0x9c, 0x04, 0x1e, 0x05, 0xae, 0x04, 0x21, 0x05, 0xb6, 0x04, 0xb6, 0x04, 0x21, 0x05, 0x19, 0x05, 0x21, 0x05, 0xae, 0x04, 0x13, 0x05, 0x13, 0x05, 0xae, 0x04, 0xb0, 0x04, 0xba, 0x04, 0x22, 0x05, +0x8a, 0x04, 0x8a, 0x04, 0x22, 0x05, 0x1c, 0x05, 0x22, 0x05, 0xba, 0x04, 0x18, 0x05, 0x18, 0x05, 0xba, 0x04, 0xbc, 0x04, 0x23, 0x05, 0x24, 0x05, 0x0f, 0x05, 0x0f, 0x05, 0x24, 0x05, 0x10, 0x05, 0x25, 0x05, 0x23, 0x05, 0x11, 0x05, 0x11, 0x05, 0x23, 0x05, 0x0f, 0x05, 0x12, 0x05, 0x26, 0x05, 0x13, 0x05, 0x13, 0x05, 0x26, 0x05, 0x27, 0x05, 0x26, 0x05, 0x12, 0x05, 0x24, 0x05, 0x24, 0x05, 0x12, 0x05, 0x10, 0x05, 0x28, 0x05, 0x29, 0x05, 0x15, 0x05, 0x15, 0x05, 0x29, 0x05, 0x14, 0x05, +0x2a, 0x05, 0x28, 0x05, 0x16, 0x05, 0x16, 0x05, 0x28, 0x05, 0x15, 0x05, 0x17, 0x05, 0x2b, 0x05, 0x18, 0x05, 0x18, 0x05, 0x2b, 0x05, 0x2c, 0x05, 0x2b, 0x05, 0x17, 0x05, 0x2d, 0x05, 0x2d, 0x05, 0x17, 0x05, 0x19, 0x05, 0x1b, 0x05, 0x2e, 0x05, 0x1a, 0x05, 0x1a, 0x05, 0x2e, 0x05, 0x2f, 0x05, 0x2e, 0x05, 0x1b, 0x05, 0x30, 0x05, 0x30, 0x05, 0x1b, 0x05, 0x1c, 0x05, 0x31, 0x05, 0x2a, 0x05, 0x1d, 0x05, 0x1d, 0x05, 0x2a, 0x05, 0x16, 0x05, 0x2f, 0x05, 0x31, 0x05, 0x1a, 0x05, 0x1a, 0x05, +0x31, 0x05, 0x1d, 0x05, 0x32, 0x05, 0x33, 0x05, 0x1f, 0x05, 0x1f, 0x05, 0x33, 0x05, 0x1e, 0x05, 0x29, 0x05, 0x32, 0x05, 0x14, 0x05, 0x14, 0x05, 0x32, 0x05, 0x1f, 0x05, 0x34, 0x05, 0x25, 0x05, 0x20, 0x05, 0x20, 0x05, 0x25, 0x05, 0x11, 0x05, 0x33, 0x05, 0x34, 0x05, 0x1e, 0x05, 0x1e, 0x05, 0x34, 0x05, 0x20, 0x05, 0x21, 0x05, 0x35, 0x05, 0x19, 0x05, 0x19, 0x05, 0x35, 0x05, 0x2d, 0x05, 0x35, 0x05, 0x21, 0x05, 0x27, 0x05, 0x27, 0x05, 0x21, 0x05, 0x13, 0x05, 0x22, 0x05, 0x36, 0x05, +0x1c, 0x05, 0x1c, 0x05, 0x36, 0x05, 0x30, 0x05, 0x36, 0x05, 0x22, 0x05, 0x2c, 0x05, 0x2c, 0x05, 0x22, 0x05, 0x18, 0x05, 0x7b, 0x04, 0x7a, 0x04, 0x74, 0x04, 0x74, 0x04, 0x7a, 0x04, 0x4f, 0x04, 0x7a, 0x04, 0x81, 0x04, 0x4f, 0x04, 0x48, 0x04, 0x53, 0x04, 0x6e, 0x04, 0x6e, 0x04, 0x53, 0x04, 0x6f, 0x04, 0x4a, 0x04, 0x48, 0x04, 0x75, 0x04, 0x75, 0x04, 0x48, 0x04, 0x6e, 0x04, 0x53, 0x04, 0x51, 0x04, 0x6f, 0x04, 0x6f, 0x04, 0x51, 0x04, 0x68, 0x04, 0x5d, 0x04, 0x5c, 0x04, 0x57, 0x04, +0x67, 0x04, 0x57, 0x04, 0x66, 0x04, 0x57, 0x04, 0x5c, 0x04, 0x66, 0x04, 0x59, 0x04, 0x69, 0x04, 0x51, 0x04, 0x51, 0x04, 0x69, 0x04, 0x68, 0x04, 0x66, 0x04, 0x5c, 0x04, 0x64, 0x04, 0x64, 0x04, 0x5c, 0x04, 0x5e, 0x04, 0x57, 0x04, 0x67, 0x04, 0x59, 0x04, 0x59, 0x04, 0x67, 0x04, 0x69, 0x04, 0x24, 0x05, 0x23, 0x05, 0x37, 0x05, 0x37, 0x05, 0x23, 0x05, 0x38, 0x05, 0x23, 0x05, 0x25, 0x05, 0x38, 0x05, 0x38, 0x05, 0x25, 0x05, 0x36, 0x04, 0x26, 0x05, 0x39, 0x05, 0x27, 0x05, 0x27, 0x05, +0x39, 0x05, 0x3a, 0x05, 0x28, 0x05, 0x16, 0x04, 0x29, 0x05, 0x29, 0x05, 0x16, 0x04, 0x17, 0x04, 0x28, 0x05, 0x2a, 0x05, 0x16, 0x04, 0x16, 0x04, 0x2a, 0x05, 0x0c, 0x04, 0x2b, 0x05, 0x2e, 0x04, 0x2c, 0x05, 0x2c, 0x05, 0x2e, 0x04, 0x27, 0x04, 0x2d, 0x05, 0x35, 0x04, 0x2b, 0x05, 0x2b, 0x05, 0x35, 0x04, 0x2e, 0x04, 0x2f, 0x05, 0x2e, 0x05, 0x0a, 0x04, 0x0a, 0x04, 0x2e, 0x05, 0x15, 0x04, 0x2e, 0x05, 0x30, 0x05, 0x15, 0x04, 0x15, 0x04, 0x30, 0x05, 0x1d, 0x04, 0x31, 0x05, 0x0b, 0x04, +0x2a, 0x05, 0x2a, 0x05, 0x0b, 0x04, 0x0c, 0x04, 0x31, 0x05, 0x2f, 0x05, 0x0b, 0x04, 0x0b, 0x04, 0x2f, 0x05, 0x0a, 0x04, 0x33, 0x05, 0x32, 0x05, 0x28, 0x04, 0x28, 0x04, 0x32, 0x05, 0x22, 0x04, 0x32, 0x05, 0x29, 0x05, 0x22, 0x04, 0x22, 0x04, 0x29, 0x05, 0x17, 0x04, 0x34, 0x05, 0x33, 0x05, 0x30, 0x04, 0x30, 0x04, 0x33, 0x05, 0x28, 0x04, 0x2d, 0x05, 0x35, 0x05, 0x35, 0x04, 0x35, 0x04, 0x35, 0x05, 0x41, 0x04, 0x27, 0x05, 0x3a, 0x05, 0x35, 0x05, 0x35, 0x05, 0x3a, 0x05, 0x41, 0x04, +0x30, 0x05, 0x36, 0x05, 0x1d, 0x04, 0x1d, 0x04, 0x36, 0x05, 0x20, 0x04, 0x36, 0x05, 0x2c, 0x05, 0x20, 0x04, 0x20, 0x04, 0x2c, 0x05, 0x27, 0x04, 0x24, 0x05, 0x37, 0x05, 0x26, 0x05, 0x26, 0x05, 0x37, 0x05, 0x39, 0x05, 0x1d, 0x04, 0x14, 0x04, 0x15, 0x04, 0x15, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x34, 0x05, 0x30, 0x04, 0x25, 0x05, 0x25, 0x05, 0x30, 0x04, 0x36, 0x04, 0x3b, 0x05, 0x3c, 0x05, 0x3d, 0x05, 0x3c, 0x05, 0x3e, 0x05, 0x3f, 0x05, 0x3f, 0x05, 0x3e, 0x05, 0x3d, 0x05, 0x40, 0x05, +0x41, 0x05, 0x42, 0x05, 0x42, 0x05, 0x41, 0x05, 0x43, 0x05, 0x41, 0x05, 0x40, 0x05, 0x44, 0x05, 0x44, 0x05, 0x40, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, 0x40, 0x05, 0x40, 0x05, 0x47, 0x05, 0x45, 0x05, 0x48, 0x05, 0x49, 0x05, 0x4a, 0x05, 0x4a, 0x05, 0x49, 0x05, 0x46, 0x05, 0x46, 0x05, 0x40, 0x05, 0x4a, 0x05, 0x4a, 0x05, 0x40, 0x05, 0x42, 0x05, 0x4b, 0x05, 0x4c, 0x05, 0x4d, 0x05, 0x4d, 0x05, 0x4c, 0x05, 0x4e, 0x05, 0x4f, 0x05, 0x4e, 0x05, 0x50, 0x05, 0x50, 0x05, 0x4e, 0x05, +0x4c, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, 0x05, 0x53, 0x05, 0x52, 0x05, 0x54, 0x05, 0x55, 0x05, 0x54, 0x05, 0x56, 0x05, 0x56, 0x05, 0x54, 0x05, 0x57, 0x05, 0x4c, 0x05, 0x58, 0x05, 0x59, 0x05, 0x59, 0x05, 0x58, 0x05, 0x5a, 0x05, 0x58, 0x05, 0x5b, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5b, 0x05, 0x5d, 0x05, 0x5b, 0x05, 0x58, 0x05, 0x5e, 0x05, 0x5e, 0x05, 0x58, 0x05, 0x5f, 0x05, 0x58, 0x05, 0x4c, 0x05, 0x5f, 0x05, 0x5f, 0x05, 0x4c, 0x05, 0x4b, 0x05, 0x60, 0x05, 0x61, 0x05, 0x62, 0x05, +0x62, 0x05, 0x61, 0x05, 0x63, 0x05, 0x4d, 0x05, 0x63, 0x05, 0x4b, 0x05, 0x4b, 0x05, 0x63, 0x05, 0x61, 0x05, 0x64, 0x05, 0x65, 0x05, 0x66, 0x05, 0x66, 0x05, 0x65, 0x05, 0x67, 0x05, 0x65, 0x05, 0x68, 0x05, 0x67, 0x05, 0x67, 0x05, 0x68, 0x05, 0x69, 0x05, 0x68, 0x05, 0x65, 0x05, 0x6a, 0x05, 0x6a, 0x05, 0x65, 0x05, 0x6b, 0x05, 0x6b, 0x05, 0x65, 0x05, 0x64, 0x05, 0x6c, 0x05, 0x6d, 0x05, 0x53, 0x05, 0x53, 0x05, 0x6d, 0x05, 0x6e, 0x05, 0x6d, 0x05, 0x6c, 0x05, 0x6f, 0x05, 0x6f, 0x05, +0x6c, 0x05, 0x70, 0x05, 0x6c, 0x05, 0x71, 0x05, 0x70, 0x05, 0x70, 0x05, 0x71, 0x05, 0x72, 0x05, 0x71, 0x05, 0x73, 0x05, 0x72, 0x05, 0x72, 0x05, 0x73, 0x05, 0x74, 0x05, 0x73, 0x05, 0x71, 0x05, 0x55, 0x05, 0x55, 0x05, 0x71, 0x05, 0x54, 0x05, 0x71, 0x05, 0x6c, 0x05, 0x54, 0x05, 0x54, 0x05, 0x6c, 0x05, 0x53, 0x05, 0x75, 0x05, 0x76, 0x05, 0x77, 0x05, 0x77, 0x05, 0x76, 0x05, 0x78, 0x05, 0x78, 0x05, 0x76, 0x05, 0x60, 0x05, 0x60, 0x05, 0x76, 0x05, 0x61, 0x05, 0x76, 0x05, 0x5f, 0x05, +0x61, 0x05, 0x61, 0x05, 0x5f, 0x05, 0x4b, 0x05, 0x76, 0x05, 0x75, 0x05, 0x5f, 0x05, 0x5f, 0x05, 0x75, 0x05, 0x5e, 0x05, 0x69, 0x05, 0x68, 0x05, 0x79, 0x05, 0x79, 0x05, 0x68, 0x05, 0x7a, 0x05, 0x7a, 0x05, 0x68, 0x05, 0x7b, 0x05, 0x7c, 0x05, 0x7d, 0x05, 0x7e, 0x05, 0x7e, 0x05, 0x7d, 0x05, 0x7f, 0x05, 0x7d, 0x05, 0x7c, 0x05, 0x80, 0x05, 0x80, 0x05, 0x7c, 0x05, 0x81, 0x05, 0x82, 0x05, 0x83, 0x05, 0x84, 0x05, 0x84, 0x05, 0x83, 0x05, 0x85, 0x05, 0x85, 0x05, 0x83, 0x05, 0x86, 0x05, +0x86, 0x05, 0x83, 0x05, 0x87, 0x05, 0x83, 0x05, 0x7d, 0x05, 0x87, 0x05, 0x87, 0x05, 0x7d, 0x05, 0x80, 0x05, 0x83, 0x05, 0x82, 0x05, 0x7d, 0x05, 0x7d, 0x05, 0x82, 0x05, 0x7f, 0x05, 0x88, 0x05, 0x89, 0x05, 0x8a, 0x05, 0x8a, 0x05, 0x89, 0x05, 0x8b, 0x05, 0x89, 0x05, 0x8c, 0x05, 0x8b, 0x05, 0x8b, 0x05, 0x8c, 0x05, 0x8d, 0x05, 0x8e, 0x05, 0x8f, 0x05, 0x90, 0x05, 0x90, 0x05, 0x8f, 0x05, 0x91, 0x05, 0x8e, 0x05, 0x3c, 0x05, 0x8f, 0x05, 0x8f, 0x05, 0x3c, 0x05, 0x3b, 0x05, 0x92, 0x05, +0x93, 0x05, 0x90, 0x05, 0x90, 0x05, 0x93, 0x05, 0x8e, 0x05, 0x8e, 0x05, 0x94, 0x05, 0x3c, 0x05, 0x3c, 0x05, 0x94, 0x05, 0x3e, 0x05, 0x94, 0x05, 0x8e, 0x05, 0x95, 0x05, 0x95, 0x05, 0x8e, 0x05, 0x93, 0x05, 0x96, 0x05, 0x97, 0x05, 0x98, 0x05, 0x98, 0x05, 0x97, 0x05, 0x99, 0x05, 0x97, 0x05, 0x41, 0x05, 0x99, 0x05, 0x99, 0x05, 0x41, 0x05, 0x44, 0x05, 0x41, 0x05, 0x97, 0x05, 0x43, 0x05, 0x43, 0x05, 0x97, 0x05, 0x9a, 0x05, 0x97, 0x05, 0x96, 0x05, 0x9a, 0x05, 0x9a, 0x05, 0x96, 0x05, +0x9b, 0x05, 0x62, 0x05, 0x9c, 0x05, 0x60, 0x05, 0x60, 0x05, 0x9c, 0x05, 0x9d, 0x05, 0x9e, 0x05, 0x9d, 0x05, 0x9f, 0x05, 0x9f, 0x05, 0x9d, 0x05, 0x9c, 0x05, 0xa0, 0x05, 0xa1, 0x05, 0xa2, 0x05, 0xa2, 0x05, 0xa1, 0x05, 0xa3, 0x05, 0xa1, 0x05, 0xa4, 0x05, 0xa3, 0x05, 0xa3, 0x05, 0xa4, 0x05, 0xa5, 0x05, 0xa4, 0x05, 0xa1, 0x05, 0x91, 0x05, 0x91, 0x05, 0xa1, 0x05, 0x90, 0x05, 0xa6, 0x05, 0xa0, 0x05, 0xa7, 0x05, 0xa7, 0x05, 0xa0, 0x05, 0xa2, 0x05, 0x93, 0x05, 0x92, 0x05, 0xa8, 0x05, +0xa9, 0x05, 0xa8, 0x05, 0x92, 0x05, 0xa9, 0x05, 0xa6, 0x05, 0x79, 0x05, 0x79, 0x05, 0xa6, 0x05, 0xaa, 0x05, 0xa6, 0x05, 0xa7, 0x05, 0xaa, 0x05, 0xaa, 0x05, 0xa7, 0x05, 0xab, 0x05, 0xac, 0x05, 0xa4, 0x05, 0xad, 0x05, 0xad, 0x05, 0xa4, 0x05, 0x91, 0x05, 0xa4, 0x05, 0xac, 0x05, 0xa5, 0x05, 0xa5, 0x05, 0xac, 0x05, 0xae, 0x05, 0xac, 0x05, 0xaf, 0x05, 0xae, 0x05, 0xae, 0x05, 0xaf, 0x05, 0xb0, 0x05, 0xaf, 0x05, 0xac, 0x05, 0xb1, 0x05, 0xb1, 0x05, 0xac, 0x05, 0xad, 0x05, 0xb2, 0x05, +0xb3, 0x05, 0xb4, 0x05, 0xb4, 0x05, 0xb3, 0x05, 0xb5, 0x05, 0xb6, 0x05, 0xb5, 0x05, 0xb7, 0x05, 0xb7, 0x05, 0xb5, 0x05, 0xb3, 0x05, 0xb8, 0x05, 0xb9, 0x05, 0xba, 0x05, 0xba, 0x05, 0xb9, 0x05, 0xbb, 0x05, 0xb9, 0x05, 0xbc, 0x05, 0xbb, 0x05, 0xbb, 0x05, 0xbc, 0x05, 0xbd, 0x05, 0xbc, 0x05, 0xb9, 0x05, 0xbe, 0x05, 0xbe, 0x05, 0xb9, 0x05, 0xbf, 0x05, 0xb9, 0x05, 0xb8, 0x05, 0xbf, 0x05, 0xbf, 0x05, 0xb8, 0x05, 0xc0, 0x05, 0xc1, 0x05, 0xc2, 0x05, 0xc3, 0x05, 0xc3, 0x05, 0xc2, 0x05, +0xc4, 0x05, 0xc2, 0x05, 0xc5, 0x05, 0xc4, 0x05, 0xc4, 0x05, 0xc5, 0x05, 0x8d, 0x05, 0xc2, 0x05, 0xb8, 0x05, 0xc5, 0x05, 0xc5, 0x05, 0xb8, 0x05, 0xba, 0x05, 0xb8, 0x05, 0xc2, 0x05, 0xc0, 0x05, 0xc0, 0x05, 0xc2, 0x05, 0xc1, 0x05, 0xc6, 0x05, 0xc7, 0x05, 0xc8, 0x05, 0xc8, 0x05, 0xc7, 0x05, 0xc9, 0x05, 0xc7, 0x05, 0xca, 0x05, 0xc9, 0x05, 0xc9, 0x05, 0xca, 0x05, 0xcb, 0x05, 0xca, 0x05, 0xc7, 0x05, 0xb6, 0x05, 0xb6, 0x05, 0xc7, 0x05, 0xb5, 0x05, 0xc7, 0x05, 0xc6, 0x05, 0xb5, 0x05, +0xb5, 0x05, 0xc6, 0x05, 0xb4, 0x05, 0xcc, 0x05, 0xbc, 0x05, 0xcd, 0x05, 0xcd, 0x05, 0xbc, 0x05, 0xbe, 0x05, 0xbc, 0x05, 0xcc, 0x05, 0xbd, 0x05, 0xbd, 0x05, 0xcc, 0x05, 0xce, 0x05, 0xcc, 0x05, 0xcf, 0x05, 0xce, 0x05, 0xce, 0x05, 0xcf, 0x05, 0xd0, 0x05, 0xcf, 0x05, 0xcc, 0x05, 0xd1, 0x05, 0xd1, 0x05, 0xcc, 0x05, 0xcd, 0x05, 0xb7, 0x05, 0xd2, 0x05, 0xb6, 0x05, 0xb6, 0x05, 0xd2, 0x05, 0xca, 0x05, 0xd3, 0x05, 0xcb, 0x05, 0xd2, 0x05, 0xd2, 0x05, 0xcb, 0x05, 0xca, 0x05, 0xd4, 0x05, +0xd5, 0x05, 0xd6, 0x05, 0xd6, 0x05, 0xd5, 0x05, 0xd7, 0x05, 0xd5, 0x05, 0xd4, 0x05, 0xd0, 0x05, 0xd0, 0x05, 0xd4, 0x05, 0xce, 0x05, 0xce, 0x05, 0xd4, 0x05, 0xbd, 0x05, 0xbd, 0x05, 0xd4, 0x05, 0xbb, 0x05, 0xd4, 0x05, 0xd6, 0x05, 0xbb, 0x05, 0xbb, 0x05, 0xd6, 0x05, 0xba, 0x05, 0xd8, 0x05, 0xd9, 0x05, 0x70, 0x05, 0x70, 0x05, 0xd9, 0x05, 0x6f, 0x05, 0xd9, 0x05, 0xd8, 0x05, 0xda, 0x05, 0xda, 0x05, 0xd8, 0x05, 0xdb, 0x05, 0xdc, 0x05, 0xdd, 0x05, 0xde, 0x05, 0xde, 0x05, 0xdd, 0x05, +0xdf, 0x05, 0x93, 0x05, 0xe0, 0x05, 0x95, 0x05, 0x95, 0x05, 0xe0, 0x05, 0xe1, 0x05, 0xe2, 0x05, 0xe3, 0x05, 0xe4, 0x05, 0xe4, 0x05, 0xe3, 0x05, 0xe1, 0x05, 0xd8, 0x05, 0xe5, 0x05, 0xdb, 0x05, 0xdb, 0x05, 0xe5, 0x05, 0xe6, 0x05, 0xe5, 0x05, 0xe7, 0x05, 0xe6, 0x05, 0xe6, 0x05, 0xe7, 0x05, 0xe8, 0x05, 0xe7, 0x05, 0xe5, 0x05, 0x74, 0x05, 0x74, 0x05, 0xe5, 0x05, 0x72, 0x05, 0xe5, 0x05, 0xd8, 0x05, 0x72, 0x05, 0x72, 0x05, 0xd8, 0x05, 0x70, 0x05, 0xe9, 0x05, 0x96, 0x05, 0xe3, 0x05, +0xe3, 0x05, 0x96, 0x05, 0x98, 0x05, 0x96, 0x05, 0xe9, 0x05, 0x9b, 0x05, 0x9b, 0x05, 0xe9, 0x05, 0xea, 0x05, 0xe9, 0x05, 0xeb, 0x05, 0xea, 0x05, 0xea, 0x05, 0xeb, 0x05, 0xec, 0x05, 0xeb, 0x05, 0xe9, 0x05, 0xe2, 0x05, 0xe2, 0x05, 0xe9, 0x05, 0xe3, 0x05, 0xed, 0x05, 0xee, 0x05, 0xdb, 0x05, 0xdb, 0x05, 0xee, 0x05, 0xda, 0x05, 0xdd, 0x05, 0xef, 0x05, 0xdf, 0x05, 0xdf, 0x05, 0xef, 0x05, 0xf0, 0x05, 0xf1, 0x05, 0xe2, 0x05, 0xf2, 0x05, 0xf2, 0x05, 0xe2, 0x05, 0xe4, 0x05, 0xf3, 0x05, +0xf4, 0x05, 0xe8, 0x05, 0xe8, 0x05, 0xf4, 0x05, 0xe6, 0x05, 0xf4, 0x05, 0xed, 0x05, 0xe6, 0x05, 0xe6, 0x05, 0xed, 0x05, 0xdb, 0x05, 0xeb, 0x05, 0xf5, 0x05, 0xec, 0x05, 0xec, 0x05, 0xf5, 0x05, 0xf6, 0x05, 0xf5, 0x05, 0xeb, 0x05, 0xf1, 0x05, 0xf1, 0x05, 0xeb, 0x05, 0xe2, 0x05, 0xef, 0x05, 0x7c, 0x05, 0xf0, 0x05, 0xf0, 0x05, 0x7c, 0x05, 0x7e, 0x05, 0x86, 0x05, 0x87, 0x05, 0xf3, 0x05, 0xf3, 0x05, 0x87, 0x05, 0xf4, 0x05, 0x87, 0x05, 0x80, 0x05, 0xf4, 0x05, 0xf4, 0x05, 0x80, 0x05, +0xed, 0x05, 0xf7, 0x05, 0xf8, 0x05, 0xf9, 0x05, 0xf9, 0x05, 0xf8, 0x05, 0xfa, 0x05, 0xf8, 0x05, 0xf7, 0x05, 0x9e, 0x05, 0x9e, 0x05, 0xf7, 0x05, 0x9d, 0x05, 0xf7, 0x05, 0x78, 0x05, 0x9d, 0x05, 0x9d, 0x05, 0x78, 0x05, 0x60, 0x05, 0x78, 0x05, 0xf7, 0x05, 0x77, 0x05, 0x77, 0x05, 0xf7, 0x05, 0xf9, 0x05, 0xfb, 0x05, 0xfc, 0x05, 0xb0, 0x05, 0xb0, 0x05, 0xfc, 0x05, 0xae, 0x05, 0xfc, 0x05, 0xfd, 0x05, 0xae, 0x05, 0xae, 0x05, 0xfd, 0x05, 0xa5, 0x05, 0xfd, 0x05, 0xfc, 0x05, 0xbe, 0x05, +0xbe, 0x05, 0xfc, 0x05, 0xcd, 0x05, 0xfc, 0x05, 0xfb, 0x05, 0xcd, 0x05, 0xcd, 0x05, 0xfb, 0x05, 0xd1, 0x05, 0xfe, 0x05, 0xff, 0x05, 0xc3, 0x05, 0xc3, 0x05, 0xff, 0x05, 0x00, 0x06, 0xff, 0x05, 0x01, 0x06, 0x00, 0x06, 0x00, 0x06, 0x01, 0x06, 0xab, 0x05, 0x9f, 0x05, 0x02, 0x06, 0x9e, 0x05, 0x9e, 0x05, 0x02, 0x06, 0x03, 0x06, 0xb4, 0x05, 0x03, 0x06, 0xb2, 0x05, 0xb2, 0x05, 0x03, 0x06, 0x02, 0x06, 0x04, 0x06, 0x05, 0x06, 0xc0, 0x05, 0xc0, 0x05, 0x05, 0x06, 0xbf, 0x05, 0x05, 0x06, +0xfd, 0x05, 0xbf, 0x05, 0xbf, 0x05, 0xfd, 0x05, 0xbe, 0x05, 0xfd, 0x05, 0x05, 0x06, 0xa5, 0x05, 0xa5, 0x05, 0x05, 0x06, 0xa3, 0x05, 0x05, 0x06, 0x04, 0x06, 0xa3, 0x05, 0xa3, 0x05, 0x04, 0x06, 0xa2, 0x05, 0xd3, 0x05, 0xd2, 0x05, 0x88, 0x05, 0x88, 0x05, 0xd2, 0x05, 0x89, 0x05, 0xd2, 0x05, 0xb7, 0x05, 0x89, 0x05, 0x89, 0x05, 0xb7, 0x05, 0x8c, 0x05, 0xb7, 0x05, 0xb3, 0x05, 0x8c, 0x05, 0x8c, 0x05, 0xb3, 0x05, 0x06, 0x06, 0xb3, 0x05, 0xb2, 0x05, 0x06, 0x06, 0x06, 0x06, 0xb2, 0x05, +0xfe, 0x05, 0x9f, 0x05, 0x9c, 0x05, 0x01, 0x06, 0x01, 0x06, 0x9c, 0x05, 0x07, 0x06, 0x9c, 0x05, 0x62, 0x05, 0x07, 0x06, 0x07, 0x06, 0x62, 0x05, 0x69, 0x05, 0x62, 0x05, 0x63, 0x05, 0x69, 0x05, 0x69, 0x05, 0x63, 0x05, 0x67, 0x05, 0x63, 0x05, 0x4d, 0x05, 0x67, 0x05, 0x67, 0x05, 0x4d, 0x05, 0x66, 0x05, 0x08, 0x06, 0x64, 0x05, 0x09, 0x06, 0x09, 0x06, 0x64, 0x05, 0x66, 0x05, 0x0a, 0x06, 0x6a, 0x05, 0x6b, 0x05, 0xdc, 0x05, 0xd9, 0x05, 0xdd, 0x05, 0xdd, 0x05, 0xd9, 0x05, 0xda, 0x05, +0xee, 0x05, 0xef, 0x05, 0xda, 0x05, 0xda, 0x05, 0xef, 0x05, 0xdd, 0x05, 0x81, 0x05, 0x7c, 0x05, 0xee, 0x05, 0xee, 0x05, 0x7c, 0x05, 0xef, 0x05, 0x0b, 0x06, 0x5b, 0x05, 0x0c, 0x06, 0x0c, 0x06, 0x5b, 0x05, 0x0d, 0x06, 0x0d, 0x06, 0x5b, 0x05, 0x0e, 0x06, 0x0e, 0x06, 0x5b, 0x05, 0x5e, 0x05, 0x75, 0x05, 0x0f, 0x06, 0x5e, 0x05, 0x5e, 0x05, 0x0f, 0x06, 0x0e, 0x06, 0x0f, 0x06, 0x75, 0x05, 0x10, 0x06, 0x10, 0x06, 0x75, 0x05, 0x77, 0x05, 0xf9, 0x05, 0x11, 0x06, 0x77, 0x05, 0x77, 0x05, +0x11, 0x06, 0x10, 0x06, 0xf9, 0x05, 0xfa, 0x05, 0x11, 0x06, 0x11, 0x06, 0xfa, 0x05, 0x12, 0x06, 0xfa, 0x05, 0x13, 0x06, 0x12, 0x06, 0x12, 0x06, 0x13, 0x06, 0x14, 0x06, 0x13, 0x06, 0xc8, 0x05, 0x14, 0x06, 0x14, 0x06, 0xc8, 0x05, 0x15, 0x06, 0xc8, 0x05, 0xc9, 0x05, 0x15, 0x06, 0x15, 0x06, 0xc9, 0x05, 0x16, 0x06, 0xc9, 0x05, 0xcb, 0x05, 0x16, 0x06, 0x16, 0x06, 0xcb, 0x05, 0x17, 0x06, 0xcb, 0x05, 0xd3, 0x05, 0x17, 0x06, 0x17, 0x06, 0xd3, 0x05, 0x18, 0x06, 0xd3, 0x05, 0x88, 0x05, +0x18, 0x06, 0x18, 0x06, 0x88, 0x05, 0x19, 0x06, 0x1a, 0x06, 0x1b, 0x06, 0x8a, 0x05, 0x8a, 0x05, 0x1b, 0x06, 0x1c, 0x06, 0x1b, 0x06, 0x1a, 0x06, 0x1d, 0x06, 0x1d, 0x06, 0x1a, 0x06, 0xd7, 0x05, 0x1e, 0x06, 0xd5, 0x05, 0x1f, 0x06, 0x1f, 0x06, 0xd5, 0x05, 0xd0, 0x05, 0xd5, 0x05, 0x1e, 0x06, 0xd7, 0x05, 0xd7, 0x05, 0x1e, 0x06, 0x1d, 0x06, 0xcf, 0x05, 0x20, 0x06, 0xd0, 0x05, 0xd0, 0x05, 0x20, 0x06, 0x1f, 0x06, 0x20, 0x06, 0xcf, 0x05, 0x21, 0x06, 0x21, 0x06, 0xcf, 0x05, 0xd1, 0x05, +0x22, 0x06, 0xfb, 0x05, 0x23, 0x06, 0x23, 0x06, 0xfb, 0x05, 0xb0, 0x05, 0xfb, 0x05, 0x22, 0x06, 0xd1, 0x05, 0xd1, 0x05, 0x22, 0x06, 0x21, 0x06, 0xaf, 0x05, 0x24, 0x06, 0xb0, 0x05, 0xb0, 0x05, 0x24, 0x06, 0x23, 0x06, 0x24, 0x06, 0xaf, 0x05, 0x25, 0x06, 0x25, 0x06, 0xaf, 0x05, 0xb1, 0x05, 0x49, 0x05, 0x48, 0x05, 0xb1, 0x05, 0xb1, 0x05, 0x48, 0x05, 0x25, 0x06, 0x82, 0x05, 0x26, 0x06, 0x7f, 0x05, 0x7f, 0x05, 0x26, 0x06, 0x27, 0x06, 0x26, 0x06, 0xf5, 0x05, 0x27, 0x06, 0x27, 0x06, +0xf5, 0x05, 0xf1, 0x05, 0xf5, 0x05, 0x26, 0x06, 0xf6, 0x05, 0xf6, 0x05, 0x26, 0x06, 0x28, 0x06, 0x26, 0x06, 0x82, 0x05, 0x28, 0x06, 0x28, 0x06, 0x82, 0x05, 0x84, 0x05, 0x19, 0x06, 0x88, 0x05, 0x1c, 0x06, 0x1c, 0x06, 0x88, 0x05, 0x8a, 0x05, 0x29, 0x06, 0xa8, 0x05, 0xde, 0x05, 0xde, 0x05, 0xa8, 0x05, 0x2a, 0x06, 0xa8, 0x05, 0x29, 0x06, 0x93, 0x05, 0x93, 0x05, 0x29, 0x06, 0xe0, 0x05, 0x29, 0x06, 0x2b, 0x06, 0xe0, 0x05, 0xe0, 0x05, 0x2b, 0x06, 0x2c, 0x06, 0x2b, 0x06, 0x29, 0x06, +0xdf, 0x05, 0xdf, 0x05, 0x29, 0x06, 0xde, 0x05, 0x01, 0x06, 0x07, 0x06, 0xab, 0x05, 0xab, 0x05, 0x07, 0x06, 0xaa, 0x05, 0xaa, 0x05, 0x07, 0x06, 0x79, 0x05, 0x79, 0x05, 0x07, 0x06, 0x69, 0x05, 0x2d, 0x06, 0x2b, 0x06, 0xf0, 0x05, 0xf0, 0x05, 0x2b, 0x06, 0xdf, 0x05, 0x2b, 0x06, 0x2d, 0x06, 0x2c, 0x06, 0x2c, 0x06, 0x2d, 0x06, 0x2e, 0x06, 0x04, 0x06, 0x2f, 0x06, 0xa2, 0x05, 0xa2, 0x05, 0x2f, 0x06, 0xa7, 0x05, 0xa7, 0x05, 0x2f, 0x06, 0xab, 0x05, 0xab, 0x05, 0x2f, 0x06, 0x00, 0x06, +0x2f, 0x06, 0xc1, 0x05, 0x00, 0x06, 0x00, 0x06, 0xc1, 0x05, 0xc3, 0x05, 0x2f, 0x06, 0x04, 0x06, 0xc1, 0x05, 0xc1, 0x05, 0x04, 0x06, 0xc0, 0x05, 0x30, 0x06, 0x2d, 0x06, 0x7e, 0x05, 0x7e, 0x05, 0x2d, 0x06, 0xf0, 0x05, 0x2d, 0x06, 0x30, 0x06, 0x2e, 0x06, 0x2e, 0x06, 0x30, 0x06, 0xf2, 0x05, 0x8c, 0x05, 0x06, 0x06, 0x8d, 0x05, 0x8d, 0x05, 0x06, 0x06, 0xc4, 0x05, 0x06, 0x06, 0xfe, 0x05, 0xc4, 0x05, 0xc4, 0x05, 0xfe, 0x05, 0xc3, 0x05, 0x27, 0x06, 0x30, 0x06, 0x7f, 0x05, 0x7f, 0x05, +0x30, 0x06, 0x7e, 0x05, 0x1a, 0x06, 0x31, 0x06, 0xd7, 0x05, 0xd7, 0x05, 0x31, 0x06, 0xd6, 0x05, 0x31, 0x06, 0xc5, 0x05, 0xd6, 0x05, 0xd6, 0x05, 0xc5, 0x05, 0xba, 0x05, 0xc5, 0x05, 0x31, 0x06, 0x8d, 0x05, 0x8d, 0x05, 0x31, 0x06, 0x8b, 0x05, 0x31, 0x06, 0x1a, 0x06, 0x8b, 0x05, 0x8b, 0x05, 0x1a, 0x06, 0x8a, 0x05, 0x80, 0x05, 0x81, 0x05, 0xed, 0x05, 0xed, 0x05, 0x81, 0x05, 0xee, 0x05, 0x4d, 0x05, 0x4e, 0x05, 0x66, 0x05, 0x66, 0x05, 0x4e, 0x05, 0x32, 0x06, 0x79, 0x05, 0x7a, 0x05, +0xa9, 0x05, 0x7a, 0x05, 0x2a, 0x06, 0xa9, 0x05, 0xa8, 0x05, 0xa9, 0x05, 0x2a, 0x06, 0x33, 0x06, 0x49, 0x05, 0xad, 0x05, 0xad, 0x05, 0x49, 0x05, 0xb1, 0x05, 0x49, 0x05, 0x33, 0x06, 0x46, 0x05, 0x46, 0x05, 0x33, 0x06, 0x47, 0x05, 0x8f, 0x05, 0x33, 0x06, 0x91, 0x05, 0x91, 0x05, 0x33, 0x06, 0xad, 0x05, 0xf8, 0x05, 0x34, 0x06, 0xfa, 0x05, 0xfa, 0x05, 0x34, 0x06, 0x13, 0x06, 0x34, 0x06, 0xc6, 0x05, 0x13, 0x06, 0x13, 0x06, 0xc6, 0x05, 0xc8, 0x05, 0xc6, 0x05, 0x34, 0x06, 0xb4, 0x05, +0xb4, 0x05, 0x34, 0x06, 0x03, 0x06, 0x34, 0x06, 0xf8, 0x05, 0x03, 0x06, 0x03, 0x06, 0xf8, 0x05, 0x9e, 0x05, 0xb2, 0x05, 0x02, 0x06, 0xfe, 0x05, 0xfe, 0x05, 0x02, 0x06, 0xff, 0x05, 0x02, 0x06, 0x9f, 0x05, 0xff, 0x05, 0xff, 0x05, 0x9f, 0x05, 0x01, 0x06, 0x92, 0x05, 0xa0, 0x05, 0xa9, 0x05, 0xa9, 0x05, 0xa0, 0x05, 0xa6, 0x05, 0xa1, 0x05, 0xa0, 0x05, 0x90, 0x05, 0x90, 0x05, 0xa0, 0x05, 0x92, 0x05, 0x2c, 0x06, 0x2e, 0x06, 0xe4, 0x05, 0xe4, 0x05, 0x2e, 0x06, 0xf2, 0x05, 0xe0, 0x05, +0x2c, 0x06, 0xe1, 0x05, 0xe1, 0x05, 0x2c, 0x06, 0xe4, 0x05, 0xf2, 0x05, 0x30, 0x06, 0xf1, 0x05, 0xf1, 0x05, 0x30, 0x06, 0x27, 0x06, 0xe3, 0x05, 0x98, 0x05, 0xe1, 0x05, 0xe1, 0x05, 0x98, 0x05, 0x95, 0x05, 0x99, 0x05, 0x94, 0x05, 0x98, 0x05, 0x98, 0x05, 0x94, 0x05, 0x95, 0x05, 0x94, 0x05, 0x99, 0x05, 0x3e, 0x05, 0x3e, 0x05, 0x99, 0x05, 0x44, 0x05, 0x44, 0x05, 0x45, 0x05, 0x3e, 0x05, 0x3e, 0x05, 0x45, 0x05, 0x3d, 0x05, 0x47, 0x05, 0x3b, 0x05, 0x45, 0x05, 0x45, 0x05, 0x3b, 0x05, +0x3d, 0x05, 0x33, 0x06, 0x8f, 0x05, 0x47, 0x05, 0x47, 0x05, 0x8f, 0x05, 0x3b, 0x05, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x37, 0x06, 0x36, 0x06, 0x38, 0x06, 0x39, 0x06, 0x36, 0x06, 0x39, 0x05, 0x39, 0x05, 0x36, 0x06, 0x45, 0x04, 0x39, 0x05, 0x45, 0x04, 0x3a, 0x05, 0x3a, 0x05, 0x45, 0x04, 0x43, 0x04, 0x40, 0x04, 0x41, 0x04, 0x43, 0x04, 0x43, 0x04, 0x41, 0x04, 0x3a, 0x05, 0x3f, 0x04, 0x40, 0x04, 0x42, 0x04, 0x42, 0x04, 0x40, 0x04, 0x43, 0x04, 0x3a, 0x06, 0x3b, 0x06, 0x3c, 0x06, +0x3c, 0x06, 0x3b, 0x06, 0x3d, 0x06, 0x3e, 0x06, 0x3b, 0x06, 0x36, 0x04, 0x36, 0x04, 0x3b, 0x06, 0x38, 0x05, 0x3f, 0x06, 0x40, 0x06, 0x41, 0x06, 0x41, 0x06, 0x40, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x45, 0x06, 0x44, 0x06, 0x3b, 0x04, 0x3a, 0x06, 0x39, 0x06, 0x37, 0x05, 0x37, 0x05, 0x39, 0x06, 0x39, 0x05, 0x3f, 0x06, 0x3e, 0x06, 0x37, 0x04, 0x37, 0x04, 0x3e, 0x06, 0x36, 0x04, 0x46, 0x06, 0x47, 0x06, 0x64, 0x05, 0x64, 0x05, 0x47, 0x06, 0x6b, 0x05, 0x53, 0x05, +0x6e, 0x05, 0x48, 0x06, 0x48, 0x06, 0x6e, 0x05, 0x49, 0x06, 0x4a, 0x06, 0x40, 0x06, 0x39, 0x04, 0x39, 0x04, 0x40, 0x06, 0x38, 0x04, 0x6e, 0x05, 0x6b, 0x05, 0x4b, 0x06, 0x4b, 0x06, 0x6b, 0x05, 0x4c, 0x06, 0x36, 0x06, 0x35, 0x06, 0x45, 0x04, 0x45, 0x04, 0x35, 0x06, 0x44, 0x04, 0x44, 0x06, 0x43, 0x06, 0x4d, 0x06, 0x4d, 0x06, 0x43, 0x06, 0x4e, 0x06, 0x4f, 0x06, 0x36, 0x06, 0x50, 0x06, 0x50, 0x06, 0x36, 0x06, 0x39, 0x06, 0x51, 0x06, 0x39, 0x06, 0x52, 0x06, 0x52, 0x06, 0x39, 0x06, +0x3a, 0x06, 0x38, 0x05, 0x3b, 0x06, 0x37, 0x05, 0x37, 0x05, 0x3b, 0x06, 0x3a, 0x06, 0x3b, 0x06, 0x3e, 0x06, 0x53, 0x06, 0x53, 0x06, 0x3e, 0x06, 0x54, 0x06, 0x3e, 0x06, 0x3f, 0x06, 0x55, 0x06, 0x55, 0x06, 0x3f, 0x06, 0x56, 0x06, 0x40, 0x06, 0x3f, 0x06, 0x38, 0x04, 0x38, 0x04, 0x3f, 0x06, 0x37, 0x04, 0x40, 0x06, 0x4a, 0x06, 0x57, 0x06, 0x57, 0x06, 0x4a, 0x06, 0x58, 0x06, 0x4a, 0x06, 0x44, 0x06, 0x59, 0x06, 0x59, 0x06, 0x44, 0x06, 0x5a, 0x06, 0x5b, 0x06, 0xdc, 0x05, 0x2a, 0x06, +0x2a, 0x06, 0xdc, 0x05, 0xde, 0x05, 0xd9, 0x05, 0xdc, 0x05, 0x6f, 0x05, 0x6f, 0x05, 0xdc, 0x05, 0x5b, 0x06, 0x6d, 0x05, 0x6f, 0x05, 0x5c, 0x06, 0x5c, 0x06, 0x6f, 0x05, 0x5b, 0x06, 0x5b, 0x06, 0x2a, 0x06, 0x7b, 0x05, 0x7b, 0x05, 0x2a, 0x06, 0x7a, 0x05, 0x5c, 0x06, 0x5b, 0x06, 0x0a, 0x06, 0x0a, 0x06, 0x5b, 0x06, 0x7b, 0x05, 0x5c, 0x06, 0x0a, 0x06, 0x6e, 0x05, 0x6e, 0x05, 0x0a, 0x06, 0x6b, 0x05, 0x6e, 0x05, 0x6d, 0x05, 0x5c, 0x06, 0x0a, 0x06, 0x7b, 0x05, 0x6a, 0x05, 0x6a, 0x05, +0x7b, 0x05, 0x68, 0x05, 0x39, 0x04, 0x3b, 0x04, 0x4a, 0x06, 0x4a, 0x06, 0x3b, 0x04, 0x44, 0x06, 0x81, 0x03, 0x92, 0x03, 0x7f, 0x03, 0x7f, 0x03, 0x92, 0x03, 0x91, 0x03, 0x92, 0x03, 0xa0, 0x03, 0x91, 0x03, 0x91, 0x03, 0xa0, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xae, 0x03, 0x9f, 0x03, 0x9f, 0x03, 0xae, 0x03, 0xad, 0x03, 0xae, 0x03, 0xbc, 0x03, 0xad, 0x03, 0xad, 0x03, 0xbc, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xc9, 0x03, 0xc9, 0x03, 0xbc, 0x03, 0x87, 0x01, 0x87, 0x01, 0x8a, 0x01, +0xc9, 0x03, 0xc9, 0x03, 0x8a, 0x01, 0xd5, 0x03, 0x2b, 0x04, 0x3e, 0x04, 0x32, 0x04, 0x32, 0x04, 0x3e, 0x04, 0x3a, 0x04, 0x6b, 0x03, 0x5d, 0x06, 0x6a, 0x03, 0x6a, 0x03, 0x5d, 0x06, 0x5e, 0x06, 0x5d, 0x06, 0x5f, 0x06, 0x5e, 0x06, 0x5e, 0x06, 0x5f, 0x06, 0x60, 0x06, 0x5f, 0x06, 0x61, 0x06, 0x60, 0x06, 0x60, 0x06, 0x61, 0x06, 0x62, 0x06, 0x61, 0x06, 0x63, 0x06, 0x62, 0x06, 0x62, 0x06, 0x63, 0x06, 0x64, 0x06, 0x63, 0x06, 0x65, 0x06, 0x64, 0x06, 0x64, 0x06, 0x65, 0x06, 0x66, 0x06, +0x65, 0x06, 0x67, 0x06, 0x66, 0x06, 0x66, 0x06, 0x67, 0x06, 0x68, 0x06, 0x67, 0x06, 0x69, 0x06, 0x68, 0x06, 0x68, 0x06, 0x69, 0x06, 0x6a, 0x06, 0x69, 0x06, 0x6b, 0x06, 0x6a, 0x06, 0x6a, 0x06, 0x6b, 0x06, 0x6c, 0x06, 0x6c, 0x06, 0x6b, 0x06, 0x6d, 0x06, 0x6d, 0x06, 0x6b, 0x06, 0x6e, 0x06, 0x6d, 0x06, 0x6e, 0x06, 0x6f, 0x06, 0x6f, 0x06, 0x6e, 0x06, 0x70, 0x06, 0x70, 0x06, 0x71, 0x06, 0x6f, 0x06, 0x6f, 0x06, 0x71, 0x06, 0x72, 0x06, 0x71, 0x06, 0x73, 0x06, 0x72, 0x06, 0x72, 0x06, +0x73, 0x06, 0x74, 0x06, 0x73, 0x06, 0x75, 0x06, 0x74, 0x06, 0x74, 0x06, 0x75, 0x06, 0x76, 0x06, 0x87, 0x03, 0x77, 0x06, 0x6b, 0x03, 0x6b, 0x03, 0x77, 0x06, 0x5d, 0x06, 0x77, 0x06, 0x78, 0x06, 0x5d, 0x06, 0x5d, 0x06, 0x78, 0x06, 0x5f, 0x06, 0x78, 0x06, 0x79, 0x06, 0x5f, 0x06, 0x5f, 0x06, 0x79, 0x06, 0x61, 0x06, 0x79, 0x06, 0x7a, 0x06, 0x61, 0x06, 0x61, 0x06, 0x7a, 0x06, 0x63, 0x06, 0x7a, 0x06, 0x7b, 0x06, 0x63, 0x06, 0x63, 0x06, 0x7b, 0x06, 0x65, 0x06, 0x7b, 0x06, 0x7c, 0x06, +0x65, 0x06, 0x65, 0x06, 0x7c, 0x06, 0x67, 0x06, 0x7c, 0x06, 0x7d, 0x06, 0x67, 0x06, 0x67, 0x06, 0x7d, 0x06, 0x69, 0x06, 0x7d, 0x06, 0x7e, 0x06, 0x69, 0x06, 0x69, 0x06, 0x7e, 0x06, 0x6b, 0x06, 0x6b, 0x06, 0x7e, 0x06, 0x6e, 0x06, 0x6e, 0x06, 0x7e, 0x06, 0x7f, 0x06, 0x6e, 0x06, 0x7f, 0x06, 0x70, 0x06, 0x70, 0x06, 0x7f, 0x06, 0x80, 0x06, 0x80, 0x06, 0x81, 0x06, 0x70, 0x06, 0x70, 0x06, 0x81, 0x06, 0x71, 0x06, 0x82, 0x06, 0x83, 0x06, 0x73, 0x06, 0x73, 0x06, 0x83, 0x06, 0x75, 0x06, +0x95, 0x03, 0x84, 0x06, 0x87, 0x03, 0x87, 0x03, 0x84, 0x06, 0x77, 0x06, 0x84, 0x06, 0x85, 0x06, 0x77, 0x06, 0x77, 0x06, 0x85, 0x06, 0x78, 0x06, 0x85, 0x06, 0x86, 0x06, 0x78, 0x06, 0x78, 0x06, 0x86, 0x06, 0x79, 0x06, 0x86, 0x06, 0x87, 0x06, 0x79, 0x06, 0x79, 0x06, 0x87, 0x06, 0x7a, 0x06, 0x87, 0x06, 0x88, 0x06, 0x7a, 0x06, 0x7a, 0x06, 0x88, 0x06, 0x7b, 0x06, 0x88, 0x06, 0x89, 0x06, 0x7b, 0x06, 0x7b, 0x06, 0x89, 0x06, 0x7c, 0x06, 0x89, 0x06, 0x8a, 0x06, 0x7c, 0x06, 0x7c, 0x06, +0x8a, 0x06, 0x7d, 0x06, 0x8a, 0x06, 0x8b, 0x06, 0x7d, 0x06, 0x7d, 0x06, 0x8b, 0x06, 0x7e, 0x06, 0x7e, 0x06, 0x8b, 0x06, 0x7f, 0x06, 0x7f, 0x06, 0x8b, 0x06, 0x8c, 0x06, 0x7f, 0x06, 0x8c, 0x06, 0x80, 0x06, 0x80, 0x06, 0x8c, 0x06, 0x8d, 0x06, 0x80, 0x06, 0x8d, 0x06, 0x81, 0x06, 0x81, 0x06, 0x8d, 0x06, 0x8e, 0x06, 0x8f, 0x06, 0x90, 0x06, 0x82, 0x06, 0x82, 0x06, 0x90, 0x06, 0x83, 0x06, 0x95, 0x03, 0xa2, 0x03, 0x84, 0x06, 0x84, 0x06, 0xa2, 0x03, 0x91, 0x06, 0x91, 0x06, 0x92, 0x06, +0x84, 0x06, 0x84, 0x06, 0x92, 0x06, 0x85, 0x06, 0x92, 0x06, 0x93, 0x06, 0x85, 0x06, 0x85, 0x06, 0x93, 0x06, 0x86, 0x06, 0x93, 0x06, 0x94, 0x06, 0x86, 0x06, 0x86, 0x06, 0x94, 0x06, 0x87, 0x06, 0x94, 0x06, 0x95, 0x06, 0x87, 0x06, 0x87, 0x06, 0x95, 0x06, 0x88, 0x06, 0x95, 0x06, 0x96, 0x06, 0x88, 0x06, 0x88, 0x06, 0x96, 0x06, 0x89, 0x06, 0x96, 0x06, 0x97, 0x06, 0x89, 0x06, 0x89, 0x06, 0x97, 0x06, 0x8a, 0x06, 0x97, 0x06, 0x98, 0x06, 0x8a, 0x06, 0x8a, 0x06, 0x98, 0x06, 0x8b, 0x06, +0x8b, 0x06, 0x98, 0x06, 0x8c, 0x06, 0x8c, 0x06, 0x98, 0x06, 0x99, 0x06, 0x99, 0x06, 0x9a, 0x06, 0x8c, 0x06, 0x8c, 0x06, 0x9a, 0x06, 0x8d, 0x06, 0x8d, 0x06, 0x9a, 0x06, 0x8e, 0x06, 0x8e, 0x06, 0x9a, 0x06, 0x9b, 0x06, 0x9c, 0x06, 0x9d, 0x06, 0x8f, 0x06, 0x8f, 0x06, 0x9d, 0x06, 0x90, 0x06, 0xa2, 0x03, 0xb0, 0x03, 0x91, 0x06, 0x91, 0x06, 0xb0, 0x03, 0x9e, 0x06, 0x9e, 0x06, 0x9f, 0x06, 0x91, 0x06, 0x91, 0x06, 0x9f, 0x06, 0x92, 0x06, 0x9f, 0x06, 0xa0, 0x06, 0x92, 0x06, 0x92, 0x06, +0xa0, 0x06, 0x93, 0x06, 0xa0, 0x06, 0xa1, 0x06, 0x93, 0x06, 0x93, 0x06, 0xa1, 0x06, 0x94, 0x06, 0xa1, 0x06, 0xa2, 0x06, 0x94, 0x06, 0x94, 0x06, 0xa2, 0x06, 0x95, 0x06, 0xa2, 0x06, 0xa3, 0x06, 0x95, 0x06, 0x95, 0x06, 0xa3, 0x06, 0x96, 0x06, 0xa3, 0x06, 0xa4, 0x06, 0x96, 0x06, 0x96, 0x06, 0xa4, 0x06, 0x97, 0x06, 0xa4, 0x06, 0xa5, 0x06, 0x97, 0x06, 0x97, 0x06, 0xa5, 0x06, 0x98, 0x06, 0x98, 0x06, 0xa5, 0x06, 0x99, 0x06, 0x99, 0x06, 0xa5, 0x06, 0xa6, 0x06, 0xa6, 0x06, 0xa7, 0x06, +0x99, 0x06, 0x99, 0x06, 0xa7, 0x06, 0x9a, 0x06, 0xa7, 0x06, 0xa8, 0x06, 0x9a, 0x06, 0x9a, 0x06, 0xa8, 0x06, 0x9b, 0x06, 0xa9, 0x06, 0xaa, 0x06, 0x9c, 0x06, 0x9c, 0x06, 0xaa, 0x06, 0x9d, 0x06, 0xb0, 0x03, 0xbe, 0x03, 0x9e, 0x06, 0x9e, 0x06, 0xbe, 0x03, 0xab, 0x06, 0xab, 0x06, 0xac, 0x06, 0x9e, 0x06, 0x9e, 0x06, 0xac, 0x06, 0x9f, 0x06, 0xac, 0x06, 0xad, 0x06, 0x9f, 0x06, 0x9f, 0x06, 0xad, 0x06, 0xa0, 0x06, 0xad, 0x06, 0xae, 0x06, 0xa0, 0x06, 0xa0, 0x06, 0xae, 0x06, 0xa1, 0x06, +0xae, 0x06, 0xaf, 0x06, 0xa1, 0x06, 0xa1, 0x06, 0xaf, 0x06, 0xa2, 0x06, 0xaf, 0x06, 0xb0, 0x06, 0xa2, 0x06, 0xa2, 0x06, 0xb0, 0x06, 0xa3, 0x06, 0xb0, 0x06, 0xb1, 0x06, 0xa3, 0x06, 0xa3, 0x06, 0xb1, 0x06, 0xa4, 0x06, 0xb1, 0x06, 0xb2, 0x06, 0xa4, 0x06, 0xa4, 0x06, 0xb2, 0x06, 0xa5, 0x06, 0xa5, 0x06, 0xb2, 0x06, 0xa6, 0x06, 0xa6, 0x06, 0xb2, 0x06, 0xb3, 0x06, 0xb3, 0x06, 0xb4, 0x06, 0xa6, 0x06, 0xa6, 0x06, 0xb4, 0x06, 0xa7, 0x06, 0xb4, 0x06, 0xb5, 0x06, 0xa7, 0x06, 0xa7, 0x06, +0xb5, 0x06, 0xa8, 0x06, 0xb6, 0x06, 0xaa, 0x06, 0xd4, 0x01, 0xd4, 0x01, 0xaa, 0x06, 0xd5, 0x01, 0xbe, 0x03, 0xca, 0x03, 0xab, 0x06, 0xab, 0x06, 0xca, 0x03, 0xb7, 0x06, 0xb7, 0x06, 0xb8, 0x06, 0xab, 0x06, 0xab, 0x06, 0xb8, 0x06, 0xac, 0x06, 0xb8, 0x06, 0xb9, 0x06, 0xac, 0x06, 0xac, 0x06, 0xb9, 0x06, 0xad, 0x06, 0xb9, 0x06, 0xba, 0x06, 0xad, 0x06, 0xad, 0x06, 0xba, 0x06, 0xae, 0x06, 0xba, 0x06, 0xbb, 0x06, 0xae, 0x06, 0xae, 0x06, 0xbb, 0x06, 0xaf, 0x06, 0xbb, 0x06, 0xbc, 0x06, +0xaf, 0x06, 0xaf, 0x06, 0xbc, 0x06, 0xb0, 0x06, 0xbc, 0x06, 0xbd, 0x06, 0xb0, 0x06, 0xb0, 0x06, 0xbd, 0x06, 0xb1, 0x06, 0xbd, 0x06, 0xbe, 0x06, 0xb1, 0x06, 0xb1, 0x06, 0xbe, 0x06, 0xb2, 0x06, 0xb2, 0x06, 0xbe, 0x06, 0xb3, 0x06, 0xb3, 0x06, 0xbe, 0x06, 0xbf, 0x06, 0xb3, 0x06, 0xbf, 0x06, 0xb4, 0x06, 0xb4, 0x06, 0xbf, 0x06, 0xc0, 0x06, 0xc0, 0x06, 0xc1, 0x06, 0xb4, 0x06, 0xb4, 0x06, 0xc1, 0x06, 0xb5, 0x06, 0xca, 0x03, 0xd6, 0x03, 0xb7, 0x06, 0xb7, 0x06, 0xd6, 0x03, 0xc2, 0x06, +0xc2, 0x06, 0xc3, 0x06, 0xb7, 0x06, 0xb7, 0x06, 0xc3, 0x06, 0xb8, 0x06, 0xc3, 0x06, 0xc4, 0x06, 0xb8, 0x06, 0xb8, 0x06, 0xc4, 0x06, 0xb9, 0x06, 0xc4, 0x06, 0xc5, 0x06, 0xb9, 0x06, 0xb9, 0x06, 0xc5, 0x06, 0xba, 0x06, 0xc5, 0x06, 0xc6, 0x06, 0xba, 0x06, 0xba, 0x06, 0xc6, 0x06, 0xbb, 0x06, 0xc6, 0x06, 0xc7, 0x06, 0xbb, 0x06, 0xbb, 0x06, 0xc7, 0x06, 0xbc, 0x06, 0xc7, 0x06, 0xc8, 0x06, 0xbc, 0x06, 0xbc, 0x06, 0xc8, 0x06, 0xbd, 0x06, 0xc8, 0x06, 0xc9, 0x06, 0xbd, 0x06, 0xbd, 0x06, +0xc9, 0x06, 0xbe, 0x06, 0xbe, 0x06, 0xc9, 0x06, 0xbf, 0x06, 0xbf, 0x06, 0xc9, 0x06, 0xca, 0x06, 0xca, 0x06, 0xcb, 0x06, 0xbf, 0x06, 0xbf, 0x06, 0xcb, 0x06, 0xc0, 0x06, 0xcb, 0x06, 0xcc, 0x06, 0xc0, 0x06, 0xc0, 0x06, 0xcc, 0x06, 0xc1, 0x06, 0xd6, 0x03, 0xe2, 0x03, 0xc2, 0x06, 0xc2, 0x06, 0xe2, 0x03, 0xcd, 0x06, 0xcd, 0x06, 0xce, 0x06, 0xc2, 0x06, 0xc2, 0x06, 0xce, 0x06, 0xc3, 0x06, 0xce, 0x06, 0xcf, 0x06, 0xc3, 0x06, 0xc3, 0x06, 0xcf, 0x06, 0xc4, 0x06, 0xcf, 0x06, 0xd0, 0x06, +0xc4, 0x06, 0xc4, 0x06, 0xd0, 0x06, 0xc5, 0x06, 0xd0, 0x06, 0xd1, 0x06, 0xc5, 0x06, 0xc5, 0x06, 0xd1, 0x06, 0xc6, 0x06, 0xd1, 0x06, 0xd2, 0x06, 0xc6, 0x06, 0xc6, 0x06, 0xd2, 0x06, 0xc7, 0x06, 0xd2, 0x06, 0xd3, 0x06, 0xc7, 0x06, 0xc7, 0x06, 0xd3, 0x06, 0xc8, 0x06, 0xd3, 0x06, 0xd4, 0x06, 0xc8, 0x06, 0xc8, 0x06, 0xd4, 0x06, 0xc9, 0x06, 0xc9, 0x06, 0xd4, 0x06, 0xca, 0x06, 0xca, 0x06, 0xd4, 0x06, 0xd5, 0x06, 0xd5, 0x06, 0xd6, 0x06, 0xca, 0x06, 0xca, 0x06, 0xd6, 0x06, 0xcb, 0x06, +0xd6, 0x06, 0xd7, 0x06, 0xcb, 0x06, 0xcb, 0x06, 0xd7, 0x06, 0xcc, 0x06, 0xe2, 0x03, 0xee, 0x03, 0xcd, 0x06, 0xcd, 0x06, 0xee, 0x03, 0xd8, 0x06, 0xd8, 0x06, 0xd9, 0x06, 0xcd, 0x06, 0xcd, 0x06, 0xd9, 0x06, 0xce, 0x06, 0xd9, 0x06, 0xda, 0x06, 0xce, 0x06, 0xce, 0x06, 0xda, 0x06, 0xcf, 0x06, 0xda, 0x06, 0xdb, 0x06, 0xcf, 0x06, 0xcf, 0x06, 0xdb, 0x06, 0xd0, 0x06, 0xdb, 0x06, 0xdc, 0x06, 0xd0, 0x06, 0xd0, 0x06, 0xdc, 0x06, 0xd1, 0x06, 0xdc, 0x06, 0xdd, 0x06, 0xd1, 0x06, 0xd1, 0x06, +0xdd, 0x06, 0xd2, 0x06, 0xdd, 0x06, 0xde, 0x06, 0xd2, 0x06, 0xd2, 0x06, 0xde, 0x06, 0xd3, 0x06, 0xde, 0x06, 0xdf, 0x06, 0xd3, 0x06, 0xd3, 0x06, 0xdf, 0x06, 0xd4, 0x06, 0xd4, 0x06, 0xdf, 0x06, 0xd5, 0x06, 0xd5, 0x06, 0xdf, 0x06, 0xe0, 0x06, 0xd5, 0x06, 0xe0, 0x06, 0xd6, 0x06, 0xd6, 0x06, 0xe0, 0x06, 0xe1, 0x06, 0xd6, 0x06, 0xe1, 0x06, 0xd7, 0x06, 0xd7, 0x06, 0xe1, 0x06, 0xe2, 0x06, 0xee, 0x03, 0xfa, 0x03, 0xd8, 0x06, 0xd8, 0x06, 0xfa, 0x03, 0xe3, 0x06, 0xe3, 0x06, 0xe4, 0x06, +0xd8, 0x06, 0xd8, 0x06, 0xe4, 0x06, 0xd9, 0x06, 0xe4, 0x06, 0xe5, 0x06, 0xd9, 0x06, 0xd9, 0x06, 0xe5, 0x06, 0xda, 0x06, 0xe5, 0x06, 0xe6, 0x06, 0xda, 0x06, 0xda, 0x06, 0xe6, 0x06, 0xdb, 0x06, 0xe6, 0x06, 0xe7, 0x06, 0xdb, 0x06, 0xdb, 0x06, 0xe7, 0x06, 0xdc, 0x06, 0xe7, 0x06, 0xe8, 0x06, 0xdc, 0x06, 0xdc, 0x06, 0xe8, 0x06, 0xdd, 0x06, 0xe8, 0x06, 0xe9, 0x06, 0xdd, 0x06, 0xdd, 0x06, 0xe9, 0x06, 0xde, 0x06, 0xde, 0x06, 0xe9, 0x06, 0xdf, 0x06, 0xdf, 0x06, 0xe9, 0x06, 0xea, 0x06, +0xdf, 0x06, 0xea, 0x06, 0xe0, 0x06, 0xe0, 0x06, 0xea, 0x06, 0xeb, 0x06, 0xe0, 0x06, 0xeb, 0x06, 0xe1, 0x06, 0xe1, 0x06, 0xeb, 0x06, 0xec, 0x06, 0xe1, 0x06, 0xec, 0x06, 0xe2, 0x06, 0xe2, 0x06, 0xec, 0x06, 0xed, 0x06, 0xfa, 0x03, 0x06, 0x04, 0xe3, 0x06, 0xe3, 0x06, 0x06, 0x04, 0xee, 0x06, 0xe3, 0x06, 0xee, 0x06, 0xe4, 0x06, 0xe4, 0x06, 0xee, 0x06, 0xef, 0x06, 0xe4, 0x06, 0xef, 0x06, 0xe5, 0x06, 0xe5, 0x06, 0xef, 0x06, 0xf0, 0x06, 0xe5, 0x06, 0xf0, 0x06, 0xe6, 0x06, 0xe6, 0x06, +0xf0, 0x06, 0xf1, 0x06, 0xf1, 0x06, 0xf2, 0x06, 0xe6, 0x06, 0xe6, 0x06, 0xf2, 0x06, 0xe7, 0x06, 0xf2, 0x06, 0xf3, 0x06, 0xe7, 0x06, 0xe7, 0x06, 0xf3, 0x06, 0xe8, 0x06, 0xf3, 0x06, 0xf4, 0x06, 0xe8, 0x06, 0xe8, 0x06, 0xf4, 0x06, 0xe9, 0x06, 0xe9, 0x06, 0xf4, 0x06, 0xea, 0x06, 0xea, 0x06, 0xf4, 0x06, 0xf5, 0x06, 0xea, 0x06, 0xf5, 0x06, 0xeb, 0x06, 0xeb, 0x06, 0xf5, 0x06, 0xf6, 0x06, 0xeb, 0x06, 0xf6, 0x06, 0xec, 0x06, 0xec, 0x06, 0xf6, 0x06, 0xf7, 0x06, 0xec, 0x06, 0xf7, 0x06, +0xed, 0x06, 0xed, 0x06, 0xf7, 0x06, 0xf8, 0x06, 0x06, 0x04, 0x12, 0x04, 0xee, 0x06, 0xee, 0x06, 0x12, 0x04, 0xf9, 0x06, 0xee, 0x06, 0xf9, 0x06, 0xef, 0x06, 0xef, 0x06, 0xf9, 0x06, 0xfa, 0x06, 0xef, 0x06, 0xfa, 0x06, 0xf0, 0x06, 0xf0, 0x06, 0xfa, 0x06, 0xfb, 0x06, 0xf3, 0x06, 0xfc, 0x06, 0xf4, 0x06, 0xfc, 0x06, 0xfd, 0x06, 0xf4, 0x06, 0xf4, 0x06, 0xfd, 0x06, 0xf5, 0x06, 0xfd, 0x06, 0xfe, 0x06, 0xf5, 0x06, 0xf5, 0x06, 0xfe, 0x06, 0xf6, 0x06, 0xfe, 0x06, 0xff, 0x06, 0xf6, 0x06, +0xf6, 0x06, 0xff, 0x06, 0xf7, 0x06, 0xf7, 0x06, 0xff, 0x06, 0xf8, 0x06, 0xf8, 0x06, 0xff, 0x06, 0x00, 0x07, 0x12, 0x04, 0x1b, 0x04, 0xf9, 0x06, 0xf9, 0x06, 0x1b, 0x04, 0x01, 0x07, 0xf9, 0x06, 0x01, 0x07, 0xfa, 0x06, 0xfa, 0x06, 0x01, 0x07, 0x02, 0x07, 0x1b, 0x04, 0x1e, 0x04, 0x01, 0x07, 0x01, 0x07, 0x1e, 0x04, 0x03, 0x07, 0x03, 0x07, 0x04, 0x07, 0x01, 0x07, 0x01, 0x07, 0x04, 0x07, 0x02, 0x07, 0x05, 0x07, 0xfe, 0x06, 0x06, 0x07, 0x06, 0x07, 0xfe, 0x06, 0xfd, 0x06, 0x05, 0x07, +0x07, 0x07, 0xfe, 0x06, 0xfe, 0x06, 0x07, 0x07, 0xff, 0x06, 0xff, 0x06, 0x07, 0x07, 0x00, 0x07, 0x00, 0x07, 0x07, 0x07, 0x08, 0x07, 0x1e, 0x04, 0x25, 0x04, 0x03, 0x07, 0x03, 0x07, 0x25, 0x04, 0x09, 0x07, 0x09, 0x07, 0x0a, 0x07, 0x03, 0x07, 0x03, 0x07, 0x0a, 0x07, 0x04, 0x07, 0x05, 0x07, 0x06, 0x07, 0x0b, 0x07, 0x0b, 0x07, 0x06, 0x07, 0x0c, 0x07, 0x05, 0x07, 0x0b, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0b, 0x07, 0x0d, 0x07, 0x07, 0x07, 0x0d, 0x07, 0x08, 0x07, 0x08, 0x07, 0x0d, 0x07, +0x0e, 0x07, 0x25, 0x04, 0x2c, 0x04, 0x09, 0x07, 0x09, 0x07, 0x2c, 0x04, 0x0f, 0x07, 0x09, 0x07, 0x0f, 0x07, 0x0a, 0x07, 0x0a, 0x07, 0x0f, 0x07, 0x10, 0x07, 0x11, 0x07, 0x0b, 0x07, 0x12, 0x07, 0x12, 0x07, 0x0b, 0x07, 0x0c, 0x07, 0x0b, 0x07, 0x11, 0x07, 0x0d, 0x07, 0x0d, 0x07, 0x11, 0x07, 0x13, 0x07, 0x0d, 0x07, 0x13, 0x07, 0x0e, 0x07, 0x0e, 0x07, 0x13, 0x07, 0x14, 0x07, 0x2c, 0x04, 0x33, 0x04, 0x0f, 0x07, 0x0f, 0x07, 0x33, 0x04, 0x15, 0x07, 0x0f, 0x07, 0x15, 0x07, 0x10, 0x07, +0x10, 0x07, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x11, 0x07, 0x18, 0x07, 0x18, 0x07, 0x11, 0x07, 0x12, 0x07, 0x11, 0x07, 0x17, 0x07, 0x13, 0x07, 0x13, 0x07, 0x17, 0x07, 0x19, 0x07, 0x13, 0x07, 0x19, 0x07, 0x14, 0x07, 0x14, 0x07, 0x19, 0x07, 0x1a, 0x07, 0x14, 0x07, 0x1a, 0x07, 0x1b, 0x07, 0x1b, 0x07, 0x1a, 0x07, 0x1c, 0x07, 0x1b, 0x07, 0x3c, 0x04, 0x1d, 0x07, 0x1d, 0x07, 0x3c, 0x04, 0x3d, 0x04, 0x33, 0x04, 0x3f, 0x04, 0x15, 0x07, 0x15, 0x07, 0x3f, 0x04, 0x1e, 0x07, 0x15, 0x07, +0x1e, 0x07, 0x16, 0x07, 0x16, 0x07, 0x1e, 0x07, 0x1f, 0x07, 0x42, 0x04, 0x44, 0x04, 0x20, 0x07, 0x20, 0x07, 0x44, 0x04, 0x21, 0x07, 0x5e, 0x06, 0x46, 0x04, 0x6a, 0x03, 0x60, 0x06, 0x46, 0x04, 0x5e, 0x06, 0x62, 0x06, 0x46, 0x04, 0x60, 0x06, 0x64, 0x06, 0x46, 0x04, 0x62, 0x06, 0x66, 0x06, 0x46, 0x04, 0x64, 0x06, 0x68, 0x06, 0x46, 0x04, 0x66, 0x06, 0x6a, 0x06, 0x46, 0x04, 0x68, 0x06, 0x6c, 0x06, 0x46, 0x04, 0x6a, 0x06, 0x6d, 0x06, 0x46, 0x04, 0x6c, 0x06, 0x6f, 0x06, 0x46, 0x04, +0x6d, 0x06, 0x72, 0x06, 0x46, 0x04, 0x6f, 0x06, 0x72, 0x06, 0x74, 0x06, 0x46, 0x04, 0x76, 0x06, 0x46, 0x04, 0x74, 0x06, 0x22, 0x07, 0x23, 0x07, 0x24, 0x07, 0x24, 0x07, 0x23, 0x07, 0x25, 0x07, 0x23, 0x07, 0x22, 0x07, 0x26, 0x07, 0x26, 0x07, 0x22, 0x07, 0x27, 0x07, 0x28, 0x07, 0x23, 0x07, 0x29, 0x07, 0x29, 0x07, 0x23, 0x07, 0x26, 0x07, 0x23, 0x07, 0x28, 0x07, 0x25, 0x07, 0x25, 0x07, 0x28, 0x07, 0x2a, 0x07, 0x2b, 0x07, 0x2c, 0x07, 0x2d, 0x07, 0x2d, 0x07, 0x2c, 0x07, 0x2e, 0x07, +0x2c, 0x07, 0x2b, 0x07, 0x2f, 0x07, 0x2f, 0x07, 0x2b, 0x07, 0x30, 0x07, 0x22, 0x07, 0x2c, 0x07, 0x27, 0x07, 0x27, 0x07, 0x2c, 0x07, 0x2f, 0x07, 0x2c, 0x07, 0x22, 0x07, 0x2e, 0x07, 0x2e, 0x07, 0x22, 0x07, 0x24, 0x07, 0x31, 0x07, 0x32, 0x07, 0x33, 0x07, 0x33, 0x07, 0x32, 0x07, 0x34, 0x07, 0x32, 0x07, 0x31, 0x07, 0x35, 0x07, 0x35, 0x07, 0x31, 0x07, 0x36, 0x07, 0x2b, 0x07, 0x32, 0x07, 0x30, 0x07, 0x30, 0x07, 0x32, 0x07, 0x35, 0x07, 0x32, 0x07, 0x2b, 0x07, 0x34, 0x07, 0x34, 0x07, +0x2b, 0x07, 0x2d, 0x07, 0x37, 0x07, 0x38, 0x07, 0x39, 0x07, 0x39, 0x07, 0x38, 0x07, 0x3a, 0x07, 0x37, 0x07, 0x39, 0x07, 0x3b, 0x07, 0x3b, 0x07, 0x39, 0x07, 0x3c, 0x07, 0x31, 0x07, 0x37, 0x07, 0x36, 0x07, 0x36, 0x07, 0x37, 0x07, 0x3b, 0x07, 0x37, 0x07, 0x31, 0x07, 0x38, 0x07, 0x38, 0x07, 0x31, 0x07, 0x33, 0x07, 0x3d, 0x07, 0x3e, 0x07, 0x3f, 0x07, 0x3f, 0x07, 0x3e, 0x07, 0x40, 0x07, 0x3f, 0x07, 0x40, 0x07, 0x39, 0x07, 0x39, 0x07, 0x40, 0x07, 0x3c, 0x07, 0x3f, 0x07, 0x41, 0x07, +0x3d, 0x07, 0x3d, 0x07, 0x41, 0x07, 0x42, 0x07, 0x43, 0x07, 0x44, 0x07, 0x45, 0x07, 0x45, 0x07, 0x44, 0x07, 0x46, 0x07, 0x45, 0x07, 0x47, 0x07, 0x43, 0x07, 0x43, 0x07, 0x47, 0x07, 0x48, 0x07, 0x43, 0x07, 0x48, 0x07, 0x3d, 0x07, 0x3d, 0x07, 0x48, 0x07, 0x3e, 0x07, 0x3d, 0x07, 0x42, 0x07, 0x43, 0x07, 0x43, 0x07, 0x42, 0x07, 0x44, 0x07, 0x49, 0x07, 0x4a, 0x07, 0x4b, 0x07, 0x4b, 0x07, 0x4a, 0x07, 0x4c, 0x07, 0x4b, 0x07, 0x4d, 0x07, 0x49, 0x07, 0x49, 0x07, 0x4d, 0x07, 0x4e, 0x07, +0x49, 0x07, 0x4e, 0x07, 0x45, 0x07, 0x45, 0x07, 0x4e, 0x07, 0x47, 0x07, 0x45, 0x07, 0x46, 0x07, 0x49, 0x07, 0x49, 0x07, 0x46, 0x07, 0x4a, 0x07, 0x4f, 0x07, 0x50, 0x07, 0x51, 0x07, 0x51, 0x07, 0x50, 0x07, 0x52, 0x07, 0x51, 0x07, 0x53, 0x07, 0x4f, 0x07, 0x4f, 0x07, 0x53, 0x07, 0x54, 0x07, 0x4f, 0x07, 0x54, 0x07, 0x4b, 0x07, 0x4b, 0x07, 0x54, 0x07, 0x4d, 0x07, 0x4b, 0x07, 0x4c, 0x07, 0x4f, 0x07, 0x4f, 0x07, 0x4c, 0x07, 0x50, 0x07, 0x55, 0x07, 0x56, 0x07, 0x57, 0x07, 0x57, 0x07, +0x56, 0x07, 0x58, 0x07, 0x57, 0x07, 0x59, 0x07, 0x55, 0x07, 0x55, 0x07, 0x59, 0x07, 0x5a, 0x07, 0x55, 0x07, 0x5a, 0x07, 0x51, 0x07, 0x51, 0x07, 0x5a, 0x07, 0x53, 0x07, 0x51, 0x07, 0x52, 0x07, 0x55, 0x07, 0x55, 0x07, 0x52, 0x07, 0x56, 0x07, 0x28, 0x07, 0x5b, 0x07, 0x2a, 0x07, 0x2a, 0x07, 0x5b, 0x07, 0x5c, 0x07, 0x5b, 0x07, 0x28, 0x07, 0x5d, 0x07, 0x5d, 0x07, 0x28, 0x07, 0x29, 0x07, 0x57, 0x07, 0x5b, 0x07, 0x59, 0x07, 0x59, 0x07, 0x5b, 0x07, 0x5d, 0x07, 0x5b, 0x07, 0x57, 0x07, +0x5c, 0x07, 0x5c, 0x07, 0x57, 0x07, 0x58, 0x07, 0x2a, 0x07, 0x52, 0x07, 0x25, 0x07, 0x25, 0x07, 0x52, 0x07, 0x50, 0x07, 0x5e, 0x07, 0x5f, 0x07, 0x60, 0x07, 0x60, 0x07, 0x5f, 0x07, 0x61, 0x07, 0x62, 0x07, 0x63, 0x07, 0x64, 0x07, 0x64, 0x07, 0x63, 0x07, 0x61, 0x07, 0x65, 0x07, 0x66, 0x07, 0x67, 0x07, 0x67, 0x07, 0x66, 0x07, 0x68, 0x07, 0x69, 0x07, 0x6a, 0x07, 0x6b, 0x07, 0x6b, 0x07, 0x6a, 0x07, 0x68, 0x07, 0x6c, 0x07, 0x6a, 0x07, 0x6d, 0x07, 0x6d, 0x07, 0x6a, 0x07, 0x6e, 0x07, +0x6f, 0x07, 0x5f, 0x07, 0x70, 0x07, 0x70, 0x07, 0x5f, 0x07, 0x6e, 0x07, 0x71, 0x07, 0x72, 0x07, 0x73, 0x07, 0x73, 0x07, 0x72, 0x07, 0x63, 0x07, 0x74, 0x07, 0x75, 0x07, 0x76, 0x07, 0x76, 0x07, 0x75, 0x07, 0x73, 0x07, 0x77, 0x07, 0x75, 0x07, 0x78, 0x07, 0x78, 0x07, 0x75, 0x07, 0x79, 0x07, 0x7a, 0x07, 0x7b, 0x07, 0x79, 0x07, 0x79, 0x07, 0x7b, 0x07, 0x7c, 0x07, 0x7d, 0x07, 0x7e, 0x07, 0x7f, 0x07, 0x7f, 0x07, 0x7e, 0x07, 0x80, 0x07, 0x81, 0x07, 0x82, 0x07, 0x7f, 0x07, 0x7f, 0x07, +0x82, 0x07, 0x7c, 0x07, 0x83, 0x07, 0x84, 0x07, 0x85, 0x07, 0x85, 0x07, 0x84, 0x07, 0x80, 0x07, 0x86, 0x07, 0x87, 0x07, 0x85, 0x07, 0x85, 0x07, 0x87, 0x07, 0x88, 0x07, 0x89, 0x07, 0x8a, 0x07, 0x8b, 0x07, 0x8b, 0x07, 0x8a, 0x07, 0x88, 0x07, 0x8c, 0x07, 0x8d, 0x07, 0x8b, 0x07, 0x8b, 0x07, 0x8d, 0x07, 0x8e, 0x07, 0x8f, 0x07, 0x90, 0x07, 0x91, 0x07, 0x91, 0x07, 0x90, 0x07, 0x8e, 0x07, 0x92, 0x07, 0x93, 0x07, 0x91, 0x07, 0x91, 0x07, 0x93, 0x07, 0x94, 0x07, 0x95, 0x07, 0x96, 0x07, +0x97, 0x07, 0x97, 0x07, 0x96, 0x07, 0x94, 0x07, 0x98, 0x07, 0x99, 0x07, 0x97, 0x07, 0x97, 0x07, 0x99, 0x07, 0x66, 0x07, 0x9a, 0x07, 0x9b, 0x07, 0x36, 0x07, 0x36, 0x07, 0x9b, 0x07, 0x35, 0x07, 0x9c, 0x07, 0x9d, 0x07, 0x35, 0x07, 0x35, 0x07, 0x9d, 0x07, 0x30, 0x07, 0x9e, 0x07, 0x9f, 0x07, 0x27, 0x07, 0x27, 0x07, 0x9f, 0x07, 0x26, 0x07, 0xa0, 0x07, 0xa1, 0x07, 0x26, 0x07, 0x26, 0x07, 0xa1, 0x07, 0x29, 0x07, 0xa2, 0x07, 0xa3, 0x07, 0x30, 0x07, 0x30, 0x07, 0xa3, 0x07, 0x2f, 0x07, +0xa4, 0x07, 0xa5, 0x07, 0x2f, 0x07, 0x2f, 0x07, 0xa5, 0x07, 0x27, 0x07, 0xa6, 0x07, 0xa7, 0x07, 0x3c, 0x07, 0x3c, 0x07, 0xa7, 0x07, 0x3b, 0x07, 0xa8, 0x07, 0xa9, 0x07, 0x3b, 0x07, 0x3b, 0x07, 0xa9, 0x07, 0x36, 0x07, 0xaa, 0x07, 0xab, 0x07, 0x29, 0x07, 0x29, 0x07, 0xab, 0x07, 0x5d, 0x07, 0xac, 0x07, 0xad, 0x07, 0x5d, 0x07, 0x5d, 0x07, 0xad, 0x07, 0x59, 0x07, 0x3e, 0x07, 0xae, 0x07, 0x40, 0x07, 0x40, 0x07, 0xae, 0x07, 0xaf, 0x07, 0xb0, 0x07, 0x3c, 0x07, 0xb1, 0x07, 0xb1, 0x07, +0x3c, 0x07, 0x40, 0x07, 0x59, 0x07, 0xb2, 0x07, 0x5a, 0x07, 0x5a, 0x07, 0xb2, 0x07, 0xb3, 0x07, 0xb4, 0x07, 0x53, 0x07, 0xb5, 0x07, 0xb5, 0x07, 0x53, 0x07, 0x5a, 0x07, 0x47, 0x07, 0xb6, 0x07, 0x48, 0x07, 0x48, 0x07, 0xb6, 0x07, 0xb7, 0x07, 0xb8, 0x07, 0x3e, 0x07, 0xb9, 0x07, 0xb9, 0x07, 0x3e, 0x07, 0x48, 0x07, 0x53, 0x07, 0xba, 0x07, 0x54, 0x07, 0x54, 0x07, 0xba, 0x07, 0xbb, 0x07, 0xbc, 0x07, 0x4d, 0x07, 0xbd, 0x07, 0xbd, 0x07, 0x4d, 0x07, 0x54, 0x07, 0x4d, 0x07, 0xbe, 0x07, +0x4e, 0x07, 0x4e, 0x07, 0xbe, 0x07, 0xbf, 0x07, 0xc0, 0x07, 0x47, 0x07, 0xc1, 0x07, 0xc1, 0x07, 0x47, 0x07, 0x4e, 0x07, 0xc2, 0x07, 0xc3, 0x07, 0x76, 0x07, 0x76, 0x07, 0xc3, 0x07, 0x74, 0x07, 0x76, 0x07, 0x62, 0x07, 0xc4, 0x07, 0xc4, 0x07, 0x62, 0x07, 0xc5, 0x07, 0xc6, 0x07, 0xc7, 0x07, 0x70, 0x07, 0x70, 0x07, 0xc7, 0x07, 0x6f, 0x07, 0xc8, 0x07, 0x70, 0x07, 0xc9, 0x07, 0xc9, 0x07, 0x70, 0x07, 0x69, 0x07, 0xca, 0x07, 0xcb, 0x07, 0x64, 0x07, 0x64, 0x07, 0xcb, 0x07, 0x62, 0x07, +0x64, 0x07, 0x6f, 0x07, 0xcc, 0x07, 0xcc, 0x07, 0x6f, 0x07, 0xcd, 0x07, 0xce, 0x07, 0xcf, 0x07, 0x7a, 0x07, 0x7a, 0x07, 0xcf, 0x07, 0x7b, 0x07, 0x7a, 0x07, 0x74, 0x07, 0xd0, 0x07, 0xd0, 0x07, 0x74, 0x07, 0xd1, 0x07, 0xd2, 0x07, 0x69, 0x07, 0xd3, 0x07, 0xd3, 0x07, 0x69, 0x07, 0x6b, 0x07, 0xd4, 0x07, 0x6b, 0x07, 0xd5, 0x07, 0xd5, 0x07, 0x6b, 0x07, 0x99, 0x07, 0xd6, 0x07, 0xd7, 0x07, 0x7d, 0x07, 0x7d, 0x07, 0xd7, 0x07, 0x7e, 0x07, 0x7d, 0x07, 0x7b, 0x07, 0xd8, 0x07, 0xd8, 0x07, +0x7b, 0x07, 0xd9, 0x07, 0xda, 0x07, 0x99, 0x07, 0xdb, 0x07, 0xdb, 0x07, 0x99, 0x07, 0x98, 0x07, 0xdc, 0x07, 0x98, 0x07, 0xdd, 0x07, 0xdd, 0x07, 0x98, 0x07, 0x93, 0x07, 0xde, 0x07, 0xdf, 0x07, 0x86, 0x07, 0x86, 0x07, 0xdf, 0x07, 0x87, 0x07, 0x86, 0x07, 0x7e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x7e, 0x07, 0xe1, 0x07, 0xe2, 0x07, 0x93, 0x07, 0xe3, 0x07, 0xe3, 0x07, 0x93, 0x07, 0x92, 0x07, 0xe4, 0x07, 0x92, 0x07, 0xe5, 0x07, 0xe5, 0x07, 0x92, 0x07, 0x8d, 0x07, 0xe6, 0x07, 0xe7, 0x07, +0x8c, 0x07, 0x8c, 0x07, 0xe7, 0x07, 0x8d, 0x07, 0x8c, 0x07, 0x87, 0x07, 0xe8, 0x07, 0xe8, 0x07, 0x87, 0x07, 0xe9, 0x07, 0xea, 0x07, 0xeb, 0x07, 0x84, 0x07, 0x84, 0x07, 0xeb, 0x07, 0x81, 0x07, 0xec, 0x07, 0x82, 0x07, 0xeb, 0x07, 0xeb, 0x07, 0x82, 0x07, 0x81, 0x07, 0xed, 0x07, 0xee, 0x07, 0x8a, 0x07, 0x8a, 0x07, 0xee, 0x07, 0x83, 0x07, 0xee, 0x07, 0xea, 0x07, 0x83, 0x07, 0x83, 0x07, 0xea, 0x07, 0x84, 0x07, 0x72, 0x07, 0xef, 0x07, 0x60, 0x07, 0x60, 0x07, 0xef, 0x07, 0xf0, 0x07, +0xf1, 0x07, 0x5e, 0x07, 0xf0, 0x07, 0xf0, 0x07, 0x5e, 0x07, 0x60, 0x07, 0xf2, 0x07, 0xf3, 0x07, 0x96, 0x07, 0x96, 0x07, 0xf3, 0x07, 0x8f, 0x07, 0xf3, 0x07, 0xf4, 0x07, 0x8f, 0x07, 0x8f, 0x07, 0xf4, 0x07, 0x90, 0x07, 0x6c, 0x07, 0xf5, 0x07, 0x67, 0x07, 0x67, 0x07, 0xf5, 0x07, 0xf6, 0x07, 0xf6, 0x07, 0xf7, 0x07, 0x67, 0x07, 0x67, 0x07, 0xf7, 0x07, 0x65, 0x07, 0x5e, 0x07, 0xf1, 0x07, 0x6d, 0x07, 0x6d, 0x07, 0xf1, 0x07, 0xf8, 0x07, 0xf5, 0x07, 0x6c, 0x07, 0xf8, 0x07, 0xf8, 0x07, +0x6c, 0x07, 0x6d, 0x07, 0x77, 0x07, 0xf9, 0x07, 0x71, 0x07, 0x71, 0x07, 0xf9, 0x07, 0xfa, 0x07, 0xef, 0x07, 0x72, 0x07, 0xfa, 0x07, 0xfa, 0x07, 0x72, 0x07, 0x71, 0x07, 0x82, 0x07, 0xec, 0x07, 0x78, 0x07, 0x78, 0x07, 0xec, 0x07, 0xfb, 0x07, 0xf9, 0x07, 0x77, 0x07, 0xfb, 0x07, 0xfb, 0x07, 0x77, 0x07, 0x78, 0x07, 0xf4, 0x07, 0xfc, 0x07, 0x90, 0x07, 0x90, 0x07, 0xfc, 0x07, 0x89, 0x07, 0xfc, 0x07, 0xed, 0x07, 0x89, 0x07, 0x89, 0x07, 0xed, 0x07, 0x8a, 0x07, 0xf7, 0x07, 0xfd, 0x07, +0x65, 0x07, 0x65, 0x07, 0xfd, 0x07, 0x95, 0x07, 0xfd, 0x07, 0xf2, 0x07, 0x95, 0x07, 0x95, 0x07, 0xf2, 0x07, 0x96, 0x07, 0xea, 0x07, 0xfe, 0x07, 0xeb, 0x07, 0xeb, 0x07, 0xfe, 0x07, 0xff, 0x07, 0x00, 0x08, 0xec, 0x07, 0xff, 0x07, 0xff, 0x07, 0xec, 0x07, 0xeb, 0x07, 0xee, 0x07, 0xed, 0x07, 0x01, 0x08, 0x01, 0x08, 0xed, 0x07, 0x02, 0x08, 0xea, 0x07, 0xee, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xee, 0x07, 0x01, 0x08, 0xef, 0x07, 0x03, 0x08, 0xf0, 0x07, 0xf0, 0x07, 0x03, 0x08, 0x04, 0x08, +0x05, 0x08, 0xf1, 0x07, 0x04, 0x08, 0x04, 0x08, 0xf1, 0x07, 0xf0, 0x07, 0xf3, 0x07, 0xf2, 0x07, 0x06, 0x08, 0x06, 0x08, 0xf2, 0x07, 0x07, 0x08, 0xf4, 0x07, 0xf3, 0x07, 0x08, 0x08, 0x08, 0x08, 0xf3, 0x07, 0x06, 0x08, 0xf6, 0x07, 0xf5, 0x07, 0x09, 0x08, 0x09, 0x08, 0xf5, 0x07, 0x0a, 0x08, 0xf7, 0x07, 0xf6, 0x07, 0x0b, 0x08, 0x0b, 0x08, 0xf6, 0x07, 0x09, 0x08, 0xf1, 0x07, 0x05, 0x08, 0xf8, 0x07, 0xf8, 0x07, 0x05, 0x08, 0x0c, 0x08, 0x0a, 0x08, 0xf5, 0x07, 0x0c, 0x08, 0x0c, 0x08, +0xf5, 0x07, 0xf8, 0x07, 0xf9, 0x07, 0x0d, 0x08, 0xfa, 0x07, 0xfa, 0x07, 0x0d, 0x08, 0x0e, 0x08, 0x03, 0x08, 0xef, 0x07, 0x0e, 0x08, 0x0e, 0x08, 0xef, 0x07, 0xfa, 0x07, 0xec, 0x07, 0x00, 0x08, 0xfb, 0x07, 0xfb, 0x07, 0x00, 0x08, 0x0f, 0x08, 0x0d, 0x08, 0xf9, 0x07, 0x0f, 0x08, 0x0f, 0x08, 0xf9, 0x07, 0xfb, 0x07, 0xfc, 0x07, 0xf4, 0x07, 0x10, 0x08, 0x10, 0x08, 0xf4, 0x07, 0x08, 0x08, 0xed, 0x07, 0xfc, 0x07, 0x02, 0x08, 0x02, 0x08, 0xfc, 0x07, 0x10, 0x08, 0xfd, 0x07, 0xf7, 0x07, +0x11, 0x08, 0x11, 0x08, 0xf7, 0x07, 0x0b, 0x08, 0xf2, 0x07, 0xfd, 0x07, 0x07, 0x08, 0x07, 0x08, 0xfd, 0x07, 0x11, 0x08, 0x56, 0x07, 0x52, 0x07, 0x58, 0x07, 0x52, 0x07, 0x2a, 0x07, 0x58, 0x07, 0x2a, 0x07, 0x5c, 0x07, 0x58, 0x07, 0x24, 0x07, 0x4c, 0x07, 0x2e, 0x07, 0x2e, 0x07, 0x4c, 0x07, 0x4a, 0x07, 0x25, 0x07, 0x50, 0x07, 0x24, 0x07, 0x24, 0x07, 0x50, 0x07, 0x4c, 0x07, 0x2e, 0x07, 0x4a, 0x07, 0x2d, 0x07, 0x2d, 0x07, 0x4a, 0x07, 0x46, 0x07, 0x38, 0x07, 0x33, 0x07, 0x3a, 0x07, +0x42, 0x07, 0x41, 0x07, 0x33, 0x07, 0x33, 0x07, 0x41, 0x07, 0x3a, 0x07, 0x46, 0x07, 0x44, 0x07, 0x2d, 0x07, 0x2d, 0x07, 0x44, 0x07, 0x34, 0x07, 0x39, 0x07, 0x3a, 0x07, 0x3f, 0x07, 0x3f, 0x07, 0x3a, 0x07, 0x41, 0x07, 0x33, 0x07, 0x34, 0x07, 0x42, 0x07, 0x42, 0x07, 0x34, 0x07, 0x44, 0x07, 0xfe, 0x07, 0x12, 0x08, 0xff, 0x07, 0xff, 0x07, 0x12, 0x08, 0x13, 0x08, 0xff, 0x07, 0x13, 0x08, 0x00, 0x08, 0x00, 0x08, 0x13, 0x08, 0x18, 0x07, 0x14, 0x08, 0x15, 0x08, 0x02, 0x08, 0x02, 0x08, +0x15, 0x08, 0x01, 0x08, 0xfd, 0x06, 0xfc, 0x06, 0x03, 0x08, 0x03, 0x08, 0xfc, 0x06, 0x04, 0x08, 0x04, 0x08, 0xfc, 0x06, 0x05, 0x08, 0x05, 0x08, 0xfc, 0x06, 0xf3, 0x06, 0x0a, 0x07, 0x10, 0x07, 0x07, 0x08, 0x07, 0x08, 0x10, 0x07, 0x06, 0x08, 0x10, 0x07, 0x16, 0x07, 0x06, 0x08, 0x06, 0x08, 0x16, 0x07, 0x08, 0x08, 0x0a, 0x08, 0xf1, 0x06, 0x09, 0x08, 0x09, 0x08, 0xf1, 0x06, 0xfb, 0x06, 0x09, 0x08, 0xfb, 0x06, 0x0b, 0x08, 0x0b, 0x08, 0xfb, 0x06, 0x02, 0x07, 0xf3, 0x06, 0xf2, 0x06, +0x05, 0x08, 0x05, 0x08, 0xf2, 0x06, 0x0c, 0x08, 0x0c, 0x08, 0xf2, 0x06, 0x0a, 0x08, 0x0a, 0x08, 0xf2, 0x06, 0xf1, 0x06, 0x0d, 0x08, 0x0c, 0x07, 0x0e, 0x08, 0x0e, 0x08, 0x0c, 0x07, 0x06, 0x07, 0x0e, 0x08, 0x06, 0x07, 0x03, 0x08, 0x03, 0x08, 0x06, 0x07, 0xfd, 0x06, 0x0f, 0x08, 0x12, 0x07, 0x0d, 0x08, 0x0d, 0x08, 0x12, 0x07, 0x0c, 0x07, 0x08, 0x08, 0x16, 0x07, 0x10, 0x08, 0x10, 0x08, 0x16, 0x07, 0x1f, 0x07, 0x1f, 0x07, 0x14, 0x08, 0x10, 0x08, 0x10, 0x08, 0x14, 0x08, 0x02, 0x08, +0x0b, 0x08, 0x02, 0x07, 0x11, 0x08, 0x11, 0x08, 0x02, 0x07, 0x04, 0x07, 0x11, 0x08, 0x04, 0x07, 0x07, 0x08, 0x07, 0x08, 0x04, 0x07, 0x0a, 0x07, 0x15, 0x08, 0x12, 0x08, 0x01, 0x08, 0x01, 0x08, 0x12, 0x08, 0xfe, 0x07, 0x02, 0x07, 0xfb, 0x06, 0xfa, 0x06, 0xfb, 0x06, 0xf1, 0x06, 0xf0, 0x06, 0x0f, 0x08, 0x00, 0x08, 0x12, 0x07, 0x12, 0x07, 0x00, 0x08, 0x18, 0x07, 0x16, 0x08, 0x17, 0x08, 0x18, 0x08, 0x17, 0x08, 0x19, 0x08, 0x18, 0x08, 0x18, 0x08, 0x19, 0x08, 0x16, 0x08, 0x1a, 0x08, +0x42, 0x05, 0x1b, 0x08, 0x1b, 0x08, 0x42, 0x05, 0x43, 0x05, 0x1c, 0x08, 0x1a, 0x08, 0x1d, 0x08, 0x1d, 0x08, 0x1a, 0x08, 0x1b, 0x08, 0x1a, 0x08, 0x1c, 0x08, 0x1e, 0x08, 0x1e, 0x08, 0x1c, 0x08, 0x1f, 0x08, 0x4a, 0x05, 0x1e, 0x08, 0x48, 0x05, 0x48, 0x05, 0x1e, 0x08, 0x20, 0x08, 0x42, 0x05, 0x1a, 0x08, 0x4a, 0x05, 0x4a, 0x05, 0x1a, 0x08, 0x1e, 0x08, 0x21, 0x08, 0x22, 0x08, 0x23, 0x08, 0x23, 0x08, 0x22, 0x08, 0x24, 0x08, 0x22, 0x08, 0x21, 0x08, 0x25, 0x08, 0x25, 0x08, 0x21, 0x08, +0x26, 0x08, 0x27, 0x08, 0x28, 0x08, 0x29, 0x08, 0x29, 0x08, 0x28, 0x08, 0x2a, 0x08, 0x55, 0x05, 0x2b, 0x08, 0x27, 0x08, 0x27, 0x08, 0x2b, 0x08, 0x2c, 0x08, 0x22, 0x08, 0x2d, 0x08, 0x2e, 0x08, 0x2e, 0x08, 0x2d, 0x08, 0x2f, 0x08, 0x30, 0x08, 0x31, 0x08, 0x32, 0x08, 0x32, 0x08, 0x31, 0x08, 0x2e, 0x08, 0x31, 0x08, 0x33, 0x08, 0x2e, 0x08, 0x2e, 0x08, 0x33, 0x08, 0x34, 0x08, 0x24, 0x08, 0x22, 0x08, 0x34, 0x08, 0x34, 0x08, 0x22, 0x08, 0x2e, 0x08, 0x35, 0x08, 0x36, 0x08, 0x37, 0x08, +0x37, 0x08, 0x36, 0x08, 0x38, 0x08, 0x23, 0x08, 0x24, 0x08, 0x35, 0x08, 0x35, 0x08, 0x24, 0x08, 0x36, 0x08, 0x39, 0x08, 0x3a, 0x08, 0x3b, 0x08, 0x3b, 0x08, 0x3a, 0x08, 0x3c, 0x08, 0x3d, 0x08, 0x3e, 0x08, 0x3c, 0x08, 0x3c, 0x08, 0x3e, 0x08, 0x3b, 0x08, 0x3e, 0x08, 0x3f, 0x08, 0x3b, 0x08, 0x3f, 0x08, 0x40, 0x08, 0x3b, 0x08, 0x3b, 0x08, 0x40, 0x08, 0x39, 0x08, 0x41, 0x08, 0x29, 0x08, 0x42, 0x08, 0x42, 0x08, 0x29, 0x08, 0x43, 0x08, 0x44, 0x08, 0x41, 0x08, 0x45, 0x08, 0x45, 0x08, +0x41, 0x08, 0x42, 0x08, 0x41, 0x08, 0x44, 0x08, 0x46, 0x08, 0x46, 0x08, 0x44, 0x08, 0x47, 0x08, 0x74, 0x05, 0x73, 0x05, 0x47, 0x08, 0x47, 0x08, 0x73, 0x05, 0x46, 0x08, 0x73, 0x05, 0x55, 0x05, 0x46, 0x08, 0x46, 0x08, 0x55, 0x05, 0x27, 0x08, 0x29, 0x08, 0x41, 0x08, 0x27, 0x08, 0x27, 0x08, 0x41, 0x08, 0x46, 0x08, 0x48, 0x08, 0x49, 0x08, 0x4a, 0x08, 0x4a, 0x08, 0x49, 0x08, 0x4b, 0x08, 0x4b, 0x08, 0x38, 0x08, 0x4a, 0x08, 0x4a, 0x08, 0x38, 0x08, 0x36, 0x08, 0x24, 0x08, 0x34, 0x08, +0x36, 0x08, 0x36, 0x08, 0x34, 0x08, 0x4a, 0x08, 0x33, 0x08, 0x48, 0x08, 0x34, 0x08, 0x34, 0x08, 0x48, 0x08, 0x4a, 0x08, 0x3d, 0x08, 0x4c, 0x08, 0x3e, 0x08, 0x3e, 0x08, 0x4c, 0x08, 0x4d, 0x08, 0x4d, 0x08, 0x4e, 0x08, 0x3e, 0x08, 0x4f, 0x08, 0x50, 0x08, 0x51, 0x08, 0x51, 0x08, 0x50, 0x08, 0x52, 0x08, 0x50, 0x08, 0x53, 0x08, 0x52, 0x08, 0x52, 0x08, 0x53, 0x08, 0x54, 0x08, 0x55, 0x08, 0x84, 0x05, 0x56, 0x08, 0x56, 0x08, 0x84, 0x05, 0x85, 0x05, 0x85, 0x05, 0x86, 0x05, 0x56, 0x08, +0x56, 0x08, 0x86, 0x05, 0x57, 0x08, 0x53, 0x08, 0x50, 0x08, 0x57, 0x08, 0x57, 0x08, 0x50, 0x08, 0x56, 0x08, 0x4f, 0x08, 0x55, 0x08, 0x50, 0x08, 0x50, 0x08, 0x55, 0x08, 0x56, 0x08, 0x58, 0x08, 0x59, 0x08, 0x5a, 0x08, 0x5a, 0x08, 0x59, 0x08, 0x5b, 0x08, 0x5c, 0x08, 0x5d, 0x08, 0x5b, 0x08, 0x5b, 0x08, 0x5d, 0x08, 0x5a, 0x08, 0x5e, 0x08, 0x5f, 0x08, 0x60, 0x08, 0x60, 0x08, 0x5f, 0x08, 0x61, 0x08, 0x62, 0x08, 0x16, 0x08, 0x5f, 0x08, 0x5f, 0x08, 0x16, 0x08, 0x61, 0x08, 0x61, 0x08, +0x63, 0x08, 0x60, 0x08, 0x60, 0x08, 0x63, 0x08, 0x64, 0x08, 0x19, 0x08, 0x65, 0x08, 0x16, 0x08, 0x16, 0x08, 0x65, 0x08, 0x61, 0x08, 0x65, 0x08, 0x66, 0x08, 0x61, 0x08, 0x61, 0x08, 0x66, 0x08, 0x63, 0x08, 0x67, 0x08, 0x68, 0x08, 0x69, 0x08, 0x69, 0x08, 0x68, 0x08, 0x6a, 0x08, 0x68, 0x08, 0x1d, 0x08, 0x6a, 0x08, 0x6a, 0x08, 0x1d, 0x08, 0x1b, 0x08, 0x1b, 0x08, 0x43, 0x05, 0x6a, 0x08, 0x6a, 0x08, 0x43, 0x05, 0x9a, 0x05, 0x9b, 0x05, 0x69, 0x08, 0x9a, 0x05, 0x9a, 0x05, 0x69, 0x08, +0x6a, 0x08, 0x37, 0x08, 0x38, 0x08, 0x6b, 0x08, 0x6b, 0x08, 0x38, 0x08, 0x6c, 0x08, 0x6b, 0x08, 0x6c, 0x08, 0x6d, 0x08, 0x6d, 0x08, 0x6c, 0x08, 0x6e, 0x08, 0x6f, 0x08, 0x70, 0x08, 0x71, 0x08, 0x71, 0x08, 0x70, 0x08, 0x72, 0x08, 0x73, 0x08, 0x74, 0x08, 0x72, 0x08, 0x72, 0x08, 0x74, 0x08, 0x71, 0x08, 0x74, 0x08, 0x5e, 0x08, 0x71, 0x08, 0x71, 0x08, 0x5e, 0x08, 0x60, 0x08, 0x70, 0x08, 0x6f, 0x08, 0x75, 0x08, 0x75, 0x08, 0x6f, 0x08, 0x76, 0x08, 0x63, 0x08, 0x77, 0x08, 0x64, 0x08, +0x78, 0x08, 0x64, 0x08, 0x77, 0x08, 0x78, 0x08, 0x4c, 0x08, 0x76, 0x08, 0x76, 0x08, 0x4c, 0x08, 0x79, 0x08, 0x7a, 0x08, 0x75, 0x08, 0x79, 0x08, 0x79, 0x08, 0x75, 0x08, 0x76, 0x08, 0x5e, 0x08, 0x74, 0x08, 0x7b, 0x08, 0x7b, 0x08, 0x74, 0x08, 0x7c, 0x08, 0x74, 0x08, 0x73, 0x08, 0x7c, 0x08, 0x7c, 0x08, 0x73, 0x08, 0x7d, 0x08, 0x7e, 0x08, 0x7f, 0x08, 0x7d, 0x08, 0x7d, 0x08, 0x7f, 0x08, 0x7c, 0x08, 0x7f, 0x08, 0x80, 0x08, 0x7c, 0x08, 0x7c, 0x08, 0x80, 0x08, 0x7b, 0x08, 0x81, 0x08, +0x82, 0x08, 0x83, 0x08, 0x83, 0x08, 0x82, 0x08, 0x84, 0x08, 0x82, 0x08, 0x81, 0x08, 0x85, 0x08, 0x85, 0x08, 0x81, 0x08, 0x86, 0x08, 0x87, 0x08, 0x88, 0x08, 0x89, 0x08, 0x89, 0x08, 0x88, 0x08, 0x8a, 0x08, 0x8b, 0x08, 0x8c, 0x08, 0x8a, 0x08, 0x8a, 0x08, 0x8c, 0x08, 0x89, 0x08, 0x8c, 0x08, 0x8d, 0x08, 0x89, 0x08, 0x89, 0x08, 0x8d, 0x08, 0x8e, 0x08, 0x8f, 0x08, 0x87, 0x08, 0x8e, 0x08, 0x8e, 0x08, 0x87, 0x08, 0x89, 0x08, 0x90, 0x08, 0x91, 0x08, 0x92, 0x08, 0x92, 0x08, 0x91, 0x08, +0x93, 0x08, 0x5c, 0x08, 0x94, 0x08, 0x93, 0x08, 0x93, 0x08, 0x94, 0x08, 0x92, 0x08, 0x88, 0x08, 0x87, 0x08, 0x94, 0x08, 0x94, 0x08, 0x87, 0x08, 0x92, 0x08, 0x87, 0x08, 0x8f, 0x08, 0x92, 0x08, 0x92, 0x08, 0x8f, 0x08, 0x90, 0x08, 0x95, 0x08, 0x96, 0x08, 0x97, 0x08, 0x97, 0x08, 0x96, 0x08, 0x98, 0x08, 0x99, 0x08, 0x9a, 0x08, 0x98, 0x08, 0x98, 0x08, 0x9a, 0x08, 0x97, 0x08, 0x9a, 0x08, 0x86, 0x08, 0x97, 0x08, 0x97, 0x08, 0x86, 0x08, 0x81, 0x08, 0x83, 0x08, 0x95, 0x08, 0x81, 0x08, +0x81, 0x08, 0x95, 0x08, 0x97, 0x08, 0x8d, 0x08, 0x8c, 0x08, 0x9b, 0x08, 0x9b, 0x08, 0x8c, 0x08, 0x9c, 0x08, 0x8c, 0x08, 0x8b, 0x08, 0x9c, 0x08, 0x9c, 0x08, 0x8b, 0x08, 0x9d, 0x08, 0x9e, 0x08, 0x9f, 0x08, 0x9d, 0x08, 0x9d, 0x08, 0x9f, 0x08, 0x9c, 0x08, 0x9f, 0x08, 0xa0, 0x08, 0x9c, 0x08, 0x9c, 0x08, 0xa0, 0x08, 0x9b, 0x08, 0x85, 0x08, 0x86, 0x08, 0xa1, 0x08, 0xa1, 0x08, 0x86, 0x08, 0x9a, 0x08, 0xa2, 0x08, 0xa1, 0x08, 0x99, 0x08, 0x99, 0x08, 0xa1, 0x08, 0x9a, 0x08, 0xa3, 0x08, +0xa4, 0x08, 0xa5, 0x08, 0xa5, 0x08, 0xa4, 0x08, 0xa6, 0x08, 0xa4, 0x08, 0x9e, 0x08, 0xa6, 0x08, 0xa6, 0x08, 0x9e, 0x08, 0x9d, 0x08, 0x9d, 0x08, 0x8b, 0x08, 0xa6, 0x08, 0xa6, 0x08, 0x8b, 0x08, 0x8a, 0x08, 0x88, 0x08, 0xa5, 0x08, 0x8a, 0x08, 0x8a, 0x08, 0xa5, 0x08, 0xa6, 0x08, 0xa7, 0x08, 0x44, 0x08, 0xa8, 0x08, 0xa8, 0x08, 0x44, 0x08, 0x45, 0x08, 0xa9, 0x08, 0xa7, 0x08, 0xaa, 0x08, 0xaa, 0x08, 0xa7, 0x08, 0xa8, 0x08, 0xab, 0x08, 0xac, 0x08, 0xad, 0x08, 0xad, 0x08, 0xac, 0x08, +0xae, 0x08, 0x63, 0x08, 0x66, 0x08, 0xaf, 0x08, 0xaf, 0x08, 0x66, 0x08, 0xb0, 0x08, 0xb0, 0x08, 0xb1, 0x08, 0xb2, 0x08, 0xb2, 0x08, 0xb1, 0x08, 0xb3, 0x08, 0xa7, 0x08, 0xa9, 0x08, 0xb4, 0x08, 0xb4, 0x08, 0xa9, 0x08, 0xb5, 0x08, 0xe8, 0x05, 0xe7, 0x05, 0xb5, 0x08, 0xb5, 0x08, 0xe7, 0x05, 0xb4, 0x08, 0xe7, 0x05, 0x74, 0x05, 0xb4, 0x08, 0xb4, 0x08, 0x74, 0x05, 0x47, 0x08, 0x44, 0x08, 0xa7, 0x08, 0x47, 0x08, 0x47, 0x08, 0xa7, 0x08, 0xb4, 0x08, 0x67, 0x08, 0x69, 0x08, 0xb1, 0x08, +0xb1, 0x08, 0x69, 0x08, 0xb6, 0x08, 0x69, 0x08, 0x9b, 0x05, 0xb6, 0x08, 0xb6, 0x08, 0x9b, 0x05, 0xea, 0x05, 0xec, 0x05, 0xb7, 0x08, 0xea, 0x05, 0xea, 0x05, 0xb7, 0x08, 0xb6, 0x08, 0xb7, 0x08, 0xb3, 0x08, 0xb6, 0x08, 0xb6, 0x08, 0xb3, 0x08, 0xb1, 0x08, 0xb8, 0x08, 0xa9, 0x08, 0xb9, 0x08, 0xb9, 0x08, 0xa9, 0x08, 0xaa, 0x08, 0xac, 0x08, 0xab, 0x08, 0xba, 0x08, 0xba, 0x08, 0xab, 0x08, 0xbb, 0x08, 0xb2, 0x08, 0xb3, 0x08, 0xbc, 0x08, 0xbc, 0x08, 0xb3, 0x08, 0xbd, 0x08, 0xf3, 0x05, +0xe8, 0x05, 0xbe, 0x08, 0xbe, 0x08, 0xe8, 0x05, 0xb5, 0x08, 0xa9, 0x08, 0xb8, 0x08, 0xb5, 0x08, 0xb5, 0x08, 0xb8, 0x08, 0xbe, 0x08, 0xb7, 0x08, 0xec, 0x05, 0xbf, 0x08, 0xbf, 0x08, 0xec, 0x05, 0xf6, 0x05, 0xb3, 0x08, 0xb7, 0x08, 0xbd, 0x08, 0xbd, 0x08, 0xb7, 0x08, 0xbf, 0x08, 0xba, 0x08, 0xbb, 0x08, 0x52, 0x08, 0x52, 0x08, 0xbb, 0x08, 0x51, 0x08, 0x86, 0x05, 0xf3, 0x05, 0x57, 0x08, 0x57, 0x08, 0xf3, 0x05, 0xbe, 0x08, 0xb8, 0x08, 0x53, 0x08, 0xbe, 0x08, 0xbe, 0x08, 0x53, 0x08, +0x57, 0x08, 0xc0, 0x08, 0xc1, 0x08, 0xc2, 0x08, 0xc2, 0x08, 0xc1, 0x08, 0xc3, 0x08, 0xc1, 0x08, 0x6e, 0x08, 0xc3, 0x08, 0xc3, 0x08, 0x6e, 0x08, 0x6c, 0x08, 0x38, 0x08, 0x4b, 0x08, 0x6c, 0x08, 0x6c, 0x08, 0x4b, 0x08, 0xc3, 0x08, 0x4b, 0x08, 0x49, 0x08, 0xc3, 0x08, 0xc3, 0x08, 0x49, 0x08, 0xc2, 0x08, 0xc4, 0x08, 0x7e, 0x08, 0xc5, 0x08, 0xc5, 0x08, 0x7e, 0x08, 0x7d, 0x08, 0x73, 0x08, 0xc6, 0x08, 0x7d, 0x08, 0x7d, 0x08, 0xc6, 0x08, 0xc5, 0x08, 0xc6, 0x08, 0x8d, 0x08, 0xc5, 0x08, +0xc5, 0x08, 0x8d, 0x08, 0x9b, 0x08, 0xa0, 0x08, 0xc4, 0x08, 0x9b, 0x08, 0x9b, 0x08, 0xc4, 0x08, 0xc5, 0x08, 0xc7, 0x08, 0x91, 0x08, 0xc8, 0x08, 0xc8, 0x08, 0x91, 0x08, 0xc9, 0x08, 0x7a, 0x08, 0xca, 0x08, 0xc9, 0x08, 0xc9, 0x08, 0xca, 0x08, 0xc8, 0x08, 0x6d, 0x08, 0x6e, 0x08, 0xcb, 0x08, 0xcb, 0x08, 0x6e, 0x08, 0xcc, 0x08, 0x83, 0x08, 0x84, 0x08, 0xcc, 0x08, 0xcc, 0x08, 0x84, 0x08, 0xcb, 0x08, 0xcd, 0x08, 0x8f, 0x08, 0xce, 0x08, 0xce, 0x08, 0x8f, 0x08, 0x8e, 0x08, 0x8d, 0x08, +0xc6, 0x08, 0x8e, 0x08, 0x8e, 0x08, 0xc6, 0x08, 0xce, 0x08, 0xc6, 0x08, 0x73, 0x08, 0xce, 0x08, 0xce, 0x08, 0x73, 0x08, 0x72, 0x08, 0x70, 0x08, 0xcd, 0x08, 0x72, 0x08, 0x72, 0x08, 0xcd, 0x08, 0xce, 0x08, 0xa2, 0x08, 0x58, 0x08, 0xa1, 0x08, 0xa1, 0x08, 0x58, 0x08, 0x5a, 0x08, 0x5d, 0x08, 0x85, 0x08, 0x5a, 0x08, 0x5a, 0x08, 0x85, 0x08, 0xa1, 0x08, 0x85, 0x08, 0x5d, 0x08, 0x82, 0x08, 0x82, 0x08, 0x5d, 0x08, 0xcf, 0x08, 0xc7, 0x08, 0x84, 0x08, 0xcf, 0x08, 0xcf, 0x08, 0x84, 0x08, +0x82, 0x08, 0x6d, 0x08, 0xca, 0x08, 0x6b, 0x08, 0x6b, 0x08, 0xca, 0x08, 0xd0, 0x08, 0x3d, 0x08, 0x37, 0x08, 0xd0, 0x08, 0xd0, 0x08, 0x37, 0x08, 0x6b, 0x08, 0x37, 0x08, 0x3d, 0x08, 0x35, 0x08, 0x35, 0x08, 0x3d, 0x08, 0x3c, 0x08, 0x3a, 0x08, 0x23, 0x08, 0x3c, 0x08, 0x3c, 0x08, 0x23, 0x08, 0x35, 0x08, 0x3a, 0x08, 0x39, 0x08, 0xd1, 0x08, 0xd1, 0x08, 0x39, 0x08, 0xd2, 0x08, 0xd3, 0x08, 0x40, 0x08, 0x3f, 0x08, 0xae, 0x08, 0xac, 0x08, 0xa8, 0x08, 0xa8, 0x08, 0xac, 0x08, 0xaa, 0x08, +0xac, 0x08, 0xba, 0x08, 0xaa, 0x08, 0xaa, 0x08, 0xba, 0x08, 0xb9, 0x08, 0xba, 0x08, 0x52, 0x08, 0xb9, 0x08, 0xb9, 0x08, 0x52, 0x08, 0x54, 0x08, 0xd4, 0x08, 0x0d, 0x06, 0xd5, 0x08, 0xd5, 0x08, 0x0d, 0x06, 0x31, 0x08, 0x0d, 0x06, 0x0e, 0x06, 0x31, 0x08, 0x31, 0x08, 0x0e, 0x06, 0x33, 0x08, 0x0e, 0x06, 0x0f, 0x06, 0x33, 0x08, 0x33, 0x08, 0x0f, 0x06, 0x48, 0x08, 0x0f, 0x06, 0x10, 0x06, 0x48, 0x08, 0x48, 0x08, 0x10, 0x06, 0x49, 0x08, 0x10, 0x06, 0x11, 0x06, 0x49, 0x08, 0x49, 0x08, +0x11, 0x06, 0xc2, 0x08, 0x12, 0x06, 0xc0, 0x08, 0x11, 0x06, 0x11, 0x06, 0xc0, 0x08, 0xc2, 0x08, 0xc0, 0x08, 0x12, 0x06, 0xd6, 0x08, 0xd6, 0x08, 0x12, 0x06, 0x14, 0x06, 0x15, 0x06, 0x96, 0x08, 0x14, 0x06, 0x14, 0x06, 0x96, 0x08, 0xd6, 0x08, 0x96, 0x08, 0x15, 0x06, 0x98, 0x08, 0x98, 0x08, 0x15, 0x06, 0x16, 0x06, 0x17, 0x06, 0x99, 0x08, 0x16, 0x06, 0x16, 0x06, 0x99, 0x08, 0x98, 0x08, 0x18, 0x06, 0xa2, 0x08, 0x17, 0x06, 0x17, 0x06, 0xa2, 0x08, 0x99, 0x08, 0x19, 0x06, 0x58, 0x08, +0x18, 0x06, 0x18, 0x06, 0x58, 0x08, 0xa2, 0x08, 0x1c, 0x06, 0x1b, 0x06, 0x59, 0x08, 0x59, 0x08, 0x1b, 0x06, 0xd7, 0x08, 0x1b, 0x06, 0x1d, 0x06, 0xd7, 0x08, 0xd7, 0x08, 0x1d, 0x06, 0xa3, 0x08, 0x1e, 0x06, 0x1f, 0x06, 0xa4, 0x08, 0xa4, 0x08, 0x1f, 0x06, 0x9e, 0x08, 0x1d, 0x06, 0x1e, 0x06, 0xa3, 0x08, 0xa3, 0x08, 0x1e, 0x06, 0xa4, 0x08, 0x1f, 0x06, 0x20, 0x06, 0x9e, 0x08, 0x9e, 0x08, 0x20, 0x06, 0x9f, 0x08, 0x20, 0x06, 0x21, 0x06, 0x9f, 0x08, 0x9f, 0x08, 0x21, 0x06, 0xa0, 0x08, +0x22, 0x06, 0x23, 0x06, 0xc4, 0x08, 0xc4, 0x08, 0x23, 0x06, 0x7e, 0x08, 0x21, 0x06, 0x22, 0x06, 0xa0, 0x08, 0xa0, 0x08, 0x22, 0x06, 0xc4, 0x08, 0x23, 0x06, 0x24, 0x06, 0x7e, 0x08, 0x7e, 0x08, 0x24, 0x06, 0x7f, 0x08, 0x24, 0x06, 0x25, 0x06, 0x7f, 0x08, 0x7f, 0x08, 0x25, 0x06, 0x80, 0x08, 0x25, 0x06, 0x48, 0x05, 0x80, 0x08, 0x80, 0x08, 0x48, 0x05, 0x20, 0x08, 0x55, 0x08, 0x4f, 0x08, 0xd8, 0x08, 0xd8, 0x08, 0x4f, 0x08, 0xd9, 0x08, 0xbd, 0x08, 0xbf, 0x08, 0xd9, 0x08, 0xd9, 0x08, +0xbf, 0x08, 0xd8, 0x08, 0xbf, 0x08, 0xf6, 0x05, 0xd8, 0x08, 0xd8, 0x08, 0xf6, 0x05, 0x28, 0x06, 0x84, 0x05, 0x55, 0x08, 0x28, 0x06, 0x28, 0x06, 0x55, 0x08, 0xd8, 0x08, 0x19, 0x06, 0x1c, 0x06, 0x58, 0x08, 0x58, 0x08, 0x1c, 0x06, 0x59, 0x08, 0xda, 0x08, 0x77, 0x08, 0xad, 0x08, 0xad, 0x08, 0x77, 0x08, 0xdb, 0x08, 0x77, 0x08, 0x63, 0x08, 0xdb, 0x08, 0xdb, 0x08, 0x63, 0x08, 0xaf, 0x08, 0xdc, 0x08, 0xdd, 0x08, 0xaf, 0x08, 0xaf, 0x08, 0xdd, 0x08, 0xdb, 0x08, 0xdd, 0x08, 0xab, 0x08, +0xdb, 0x08, 0xdb, 0x08, 0xab, 0x08, 0xad, 0x08, 0xca, 0x08, 0x7a, 0x08, 0xd0, 0x08, 0xd0, 0x08, 0x7a, 0x08, 0x79, 0x08, 0x3d, 0x08, 0xd0, 0x08, 0x4c, 0x08, 0x4c, 0x08, 0xd0, 0x08, 0x79, 0x08, 0xab, 0x08, 0xdd, 0x08, 0xbb, 0x08, 0xbb, 0x08, 0xdd, 0x08, 0xde, 0x08, 0xdd, 0x08, 0xdc, 0x08, 0xde, 0x08, 0xde, 0x08, 0xdc, 0x08, 0xdf, 0x08, 0xcd, 0x08, 0x70, 0x08, 0xe0, 0x08, 0xe0, 0x08, 0x70, 0x08, 0x75, 0x08, 0x75, 0x08, 0x7a, 0x08, 0xe0, 0x08, 0xe0, 0x08, 0x7a, 0x08, 0xc9, 0x08, +0x91, 0x08, 0x90, 0x08, 0xc9, 0x08, 0xc9, 0x08, 0x90, 0x08, 0xe0, 0x08, 0x8f, 0x08, 0xcd, 0x08, 0x90, 0x08, 0x90, 0x08, 0xcd, 0x08, 0xe0, 0x08, 0xbb, 0x08, 0xde, 0x08, 0x51, 0x08, 0x51, 0x08, 0xde, 0x08, 0xe1, 0x08, 0xdf, 0x08, 0xbc, 0x08, 0xde, 0x08, 0xde, 0x08, 0xbc, 0x08, 0xe1, 0x08, 0x5d, 0x08, 0x5c, 0x08, 0xcf, 0x08, 0xcf, 0x08, 0x5c, 0x08, 0x93, 0x08, 0x91, 0x08, 0xc7, 0x08, 0x93, 0x08, 0x93, 0x08, 0xc7, 0x08, 0xcf, 0x08, 0xd9, 0x08, 0x4f, 0x08, 0xe1, 0x08, 0xe1, 0x08, +0x4f, 0x08, 0x51, 0x08, 0xd7, 0x08, 0xa3, 0x08, 0xe2, 0x08, 0xe2, 0x08, 0xa3, 0x08, 0xa5, 0x08, 0x88, 0x08, 0x94, 0x08, 0xa5, 0x08, 0xa5, 0x08, 0x94, 0x08, 0xe2, 0x08, 0x94, 0x08, 0x5c, 0x08, 0xe2, 0x08, 0xe2, 0x08, 0x5c, 0x08, 0x5b, 0x08, 0x59, 0x08, 0xd7, 0x08, 0x5b, 0x08, 0x5b, 0x08, 0xd7, 0x08, 0xe2, 0x08, 0x53, 0x08, 0xb8, 0x08, 0x54, 0x08, 0x54, 0x08, 0xb8, 0x08, 0xb9, 0x08, 0x23, 0x08, 0x3a, 0x08, 0x21, 0x08, 0x21, 0x08, 0x3a, 0x08, 0xe3, 0x08, 0x4c, 0x08, 0x78, 0x08, +0x4d, 0x08, 0x4d, 0x08, 0x78, 0x08, 0xda, 0x08, 0x77, 0x08, 0xda, 0x08, 0x78, 0x08, 0x80, 0x08, 0x20, 0x08, 0x7b, 0x08, 0x7b, 0x08, 0x20, 0x08, 0xe4, 0x08, 0x20, 0x08, 0x1e, 0x08, 0xe4, 0x08, 0x1e, 0x08, 0x1f, 0x08, 0xe4, 0x08, 0x5f, 0x08, 0x5e, 0x08, 0xe4, 0x08, 0xe4, 0x08, 0x5e, 0x08, 0x7b, 0x08, 0xc1, 0x08, 0xc0, 0x08, 0xe5, 0x08, 0xe5, 0x08, 0xc0, 0x08, 0xd6, 0x08, 0x96, 0x08, 0x95, 0x08, 0xd6, 0x08, 0xd6, 0x08, 0x95, 0x08, 0xe5, 0x08, 0x95, 0x08, 0x83, 0x08, 0xe5, 0x08, +0xe5, 0x08, 0x83, 0x08, 0xcc, 0x08, 0x6e, 0x08, 0xc1, 0x08, 0xcc, 0x08, 0xcc, 0x08, 0xc1, 0x08, 0xe5, 0x08, 0x84, 0x08, 0xc7, 0x08, 0xcb, 0x08, 0xcb, 0x08, 0xc7, 0x08, 0xc8, 0x08, 0xca, 0x08, 0x6d, 0x08, 0xc8, 0x08, 0xc8, 0x08, 0x6d, 0x08, 0xcb, 0x08, 0x64, 0x08, 0x78, 0x08, 0x6f, 0x08, 0x6f, 0x08, 0x78, 0x08, 0x76, 0x08, 0x64, 0x08, 0x6f, 0x08, 0x60, 0x08, 0x60, 0x08, 0x6f, 0x08, 0x71, 0x08, 0xdc, 0x08, 0xb2, 0x08, 0xdf, 0x08, 0xdf, 0x08, 0xb2, 0x08, 0xbc, 0x08, 0xb2, 0x08, +0xdc, 0x08, 0xb0, 0x08, 0xb0, 0x08, 0xdc, 0x08, 0xaf, 0x08, 0xbc, 0x08, 0xbd, 0x08, 0xe1, 0x08, 0xe1, 0x08, 0xbd, 0x08, 0xd9, 0x08, 0x66, 0x08, 0x67, 0x08, 0xb0, 0x08, 0xb0, 0x08, 0x67, 0x08, 0xb1, 0x08, 0x68, 0x08, 0x67, 0x08, 0x65, 0x08, 0x65, 0x08, 0x67, 0x08, 0x66, 0x08, 0x65, 0x08, 0x19, 0x08, 0x68, 0x08, 0x68, 0x08, 0x19, 0x08, 0x1d, 0x08, 0x17, 0x08, 0x1c, 0x08, 0x19, 0x08, 0x19, 0x08, 0x1c, 0x08, 0x1d, 0x08, 0x1f, 0x08, 0x1c, 0x08, 0x62, 0x08, 0x62, 0x08, 0x1c, 0x08, +0x17, 0x08, 0xe4, 0x08, 0x1f, 0x08, 0x5f, 0x08, 0x5f, 0x08, 0x1f, 0x08, 0x62, 0x08, 0xe6, 0x08, 0xe7, 0x08, 0xe8, 0x08, 0xe8, 0x08, 0xe7, 0x08, 0x35, 0x06, 0x21, 0x07, 0xe7, 0x08, 0x15, 0x08, 0x15, 0x08, 0xe7, 0x08, 0xe9, 0x08, 0x15, 0x08, 0x14, 0x08, 0x21, 0x07, 0x21, 0x07, 0x14, 0x08, 0x20, 0x07, 0x14, 0x08, 0x1f, 0x07, 0x20, 0x07, 0x20, 0x07, 0x1f, 0x07, 0x1e, 0x07, 0x3f, 0x04, 0x42, 0x04, 0x1e, 0x07, 0x1e, 0x07, 0x42, 0x04, 0x20, 0x07, 0xea, 0x08, 0xeb, 0x08, 0xec, 0x08, +0xec, 0x08, 0xeb, 0x08, 0xed, 0x08, 0x18, 0x07, 0x13, 0x08, 0xee, 0x08, 0xee, 0x08, 0x13, 0x08, 0xed, 0x08, 0xef, 0x08, 0xf0, 0x08, 0xf1, 0x08, 0xf1, 0x08, 0xf0, 0x08, 0xf2, 0x08, 0x1c, 0x07, 0xf3, 0x08, 0x45, 0x06, 0x45, 0x06, 0xf3, 0x08, 0x43, 0x06, 0x15, 0x08, 0xe9, 0x08, 0x12, 0x08, 0x12, 0x08, 0xe9, 0x08, 0xec, 0x08, 0x18, 0x07, 0xee, 0x08, 0x17, 0x07, 0x17, 0x07, 0xee, 0x08, 0xf2, 0x08, 0x39, 0x08, 0x40, 0x08, 0xf4, 0x08, 0xf4, 0x08, 0x40, 0x08, 0xf5, 0x08, 0x29, 0x08, +0xf6, 0x08, 0x43, 0x08, 0x43, 0x08, 0xf6, 0x08, 0xf7, 0x08, 0x19, 0x07, 0xf0, 0x08, 0x1a, 0x07, 0x1a, 0x07, 0xf0, 0x08, 0xf8, 0x08, 0xf9, 0x08, 0x40, 0x08, 0xfa, 0x08, 0xfa, 0x08, 0x40, 0x08, 0x43, 0x08, 0x44, 0x04, 0x35, 0x06, 0x21, 0x07, 0x21, 0x07, 0x35, 0x06, 0xe7, 0x08, 0xfb, 0x08, 0x43, 0x06, 0xfc, 0x08, 0xfc, 0x08, 0x43, 0x06, 0xf3, 0x08, 0xfd, 0x08, 0xfe, 0x08, 0xe7, 0x08, 0xe7, 0x08, 0xfe, 0x08, 0xe9, 0x08, 0xff, 0x08, 0x00, 0x09, 0xe9, 0x08, 0xe9, 0x08, 0x00, 0x09, +0xec, 0x08, 0x13, 0x08, 0x12, 0x08, 0xed, 0x08, 0xed, 0x08, 0x12, 0x08, 0xec, 0x08, 0x01, 0x09, 0xee, 0x08, 0x02, 0x09, 0x02, 0x09, 0xee, 0x08, 0xed, 0x08, 0x03, 0x09, 0xf2, 0x08, 0x04, 0x09, 0x04, 0x09, 0xf2, 0x08, 0xee, 0x08, 0x17, 0x07, 0xf2, 0x08, 0x19, 0x07, 0x19, 0x07, 0xf2, 0x08, 0xf0, 0x08, 0x05, 0x09, 0xf8, 0x08, 0x06, 0x09, 0x06, 0x09, 0xf8, 0x08, 0xf0, 0x08, 0x07, 0x09, 0xf3, 0x08, 0x08, 0x09, 0x08, 0x09, 0xf3, 0x08, 0xf8, 0x08, 0x09, 0x09, 0xda, 0x08, 0xae, 0x08, +0xae, 0x08, 0xda, 0x08, 0xad, 0x08, 0x09, 0x09, 0xae, 0x08, 0x45, 0x08, 0x45, 0x08, 0xae, 0x08, 0xa8, 0x08, 0x09, 0x09, 0x45, 0x08, 0x0a, 0x09, 0x0a, 0x09, 0x45, 0x08, 0x42, 0x08, 0x4d, 0x08, 0xda, 0x08, 0x4e, 0x08, 0x4e, 0x08, 0xda, 0x08, 0x09, 0x09, 0x4e, 0x08, 0x09, 0x09, 0xd3, 0x08, 0xd3, 0x08, 0x09, 0x09, 0x0a, 0x09, 0x40, 0x08, 0xd3, 0x08, 0x43, 0x08, 0x43, 0x08, 0xd3, 0x08, 0x0a, 0x09, 0x43, 0x08, 0x0a, 0x09, 0x42, 0x08, 0x3e, 0x08, 0x4e, 0x08, 0x3f, 0x08, 0x3f, 0x08, +0x4e, 0x08, 0xd3, 0x08, 0x1a, 0x07, 0xf8, 0x08, 0x1c, 0x07, 0x1c, 0x07, 0xf8, 0x08, 0xf3, 0x08, 0x81, 0x06, 0x82, 0x06, 0x71, 0x06, 0x71, 0x06, 0x82, 0x06, 0x73, 0x06, 0x8e, 0x06, 0x8f, 0x06, 0x81, 0x06, 0x81, 0x06, 0x8f, 0x06, 0x82, 0x06, 0x9b, 0x06, 0x9c, 0x06, 0x8e, 0x06, 0x8e, 0x06, 0x9c, 0x06, 0x8f, 0x06, 0xa8, 0x06, 0xa9, 0x06, 0x9b, 0x06, 0x9b, 0x06, 0xa9, 0x06, 0x9c, 0x06, 0xa8, 0x06, 0xb5, 0x06, 0xa9, 0x06, 0xa9, 0x06, 0xb5, 0x06, 0x57, 0x03, 0xc1, 0x06, 0x5a, 0x03, +0xb5, 0x06, 0xb5, 0x06, 0x5a, 0x03, 0x57, 0x03, 0x08, 0x07, 0x1d, 0x07, 0x67, 0x03, 0x0e, 0x07, 0x14, 0x07, 0x1d, 0x07, 0x1d, 0x07, 0x14, 0x07, 0x1b, 0x07, 0x92, 0x04, 0x83, 0x04, 0x93, 0x04, 0x93, 0x04, 0x83, 0x04, 0x85, 0x04, 0x84, 0x04, 0x98, 0x04, 0x86, 0x04, 0x86, 0x04, 0x98, 0x04, 0x89, 0x04, 0x88, 0x04, 0x94, 0x04, 0x86, 0x04, 0x86, 0x04, 0x94, 0x04, 0x85, 0x04, 0x95, 0x04, 0x8e, 0x04, 0x93, 0x04, 0x93, 0x04, 0x8e, 0x04, 0x90, 0x04, 0x9a, 0x04, 0x87, 0x04, 0x97, 0x04, +0x97, 0x04, 0x87, 0x04, 0x89, 0x04, 0x8b, 0x04, 0x91, 0x04, 0x8d, 0x04, 0x8d, 0x04, 0x91, 0x04, 0x90, 0x04, 0x96, 0x04, 0x9c, 0x04, 0x97, 0x04, 0x97, 0x04, 0x9c, 0x04, 0x9b, 0x04, 0x8f, 0x04, 0xbe, 0x04, 0x8d, 0x04, 0x8d, 0x04, 0xbe, 0x04, 0x8c, 0x04, 0x9f, 0x04, 0x99, 0x04, 0x9e, 0x04, 0x9e, 0x04, 0x99, 0x04, 0x9b, 0x04, 0x8a, 0x04, 0x8c, 0x04, 0xba, 0x04, 0xba, 0x04, 0x8c, 0x04, 0xbb, 0x04, 0xa7, 0x04, 0xa1, 0x04, 0x9d, 0x04, 0x9d, 0x04, 0xa1, 0x04, 0x9e, 0x04, 0xb8, 0x04, +0xb9, 0x04, 0xbd, 0x04, 0xbd, 0x04, 0xb9, 0x04, 0xbb, 0x04, 0xa0, 0x04, 0xa1, 0x04, 0xa2, 0x04, 0xa2, 0x04, 0xa1, 0x04, 0xa3, 0x04, 0xbc, 0x04, 0xb9, 0x04, 0xb4, 0x04, 0xb4, 0x04, 0xb9, 0x04, 0xb5, 0x04, 0xaa, 0x04, 0xa5, 0x04, 0xa6, 0x04, 0xa6, 0x04, 0xa5, 0x04, 0xa3, 0x04, 0xb2, 0x04, 0xb3, 0x04, 0xb7, 0x04, 0xb7, 0x04, 0xb3, 0x04, 0xb5, 0x04, 0xa4, 0x04, 0xa5, 0x04, 0xab, 0x04, 0xab, 0x04, 0xa5, 0x04, 0xa9, 0x04, 0xb6, 0x04, 0xb3, 0x04, 0xae, 0x04, 0xae, 0x04, 0xb3, 0x04, +0xaf, 0x04, 0xb0, 0x04, 0xad, 0x04, 0xa8, 0x04, 0xa8, 0x04, 0xad, 0x04, 0xa9, 0x04, 0xac, 0x04, 0xad, 0x04, 0xb1, 0x04, 0xb1, 0x04, 0xad, 0x04, 0xaf, 0x04, 0x60, 0x07, 0x61, 0x07, 0x72, 0x07, 0x72, 0x07, 0x61, 0x07, 0x63, 0x07, 0x6d, 0x07, 0x6e, 0x07, 0x5e, 0x07, 0x5e, 0x07, 0x6e, 0x07, 0x5f, 0x07, 0x64, 0x07, 0x61, 0x07, 0x6f, 0x07, 0x6f, 0x07, 0x61, 0x07, 0x5f, 0x07, 0x76, 0x07, 0x73, 0x07, 0x62, 0x07, 0x62, 0x07, 0x73, 0x07, 0x63, 0x07, 0x70, 0x07, 0x6e, 0x07, 0x69, 0x07, +0x69, 0x07, 0x6e, 0x07, 0x6a, 0x07, 0x71, 0x07, 0x73, 0x07, 0x77, 0x07, 0x77, 0x07, 0x73, 0x07, 0x75, 0x07, 0x67, 0x07, 0x68, 0x07, 0x6c, 0x07, 0x6c, 0x07, 0x68, 0x07, 0x6a, 0x07, 0x7a, 0x07, 0x79, 0x07, 0x74, 0x07, 0x74, 0x07, 0x79, 0x07, 0x75, 0x07, 0x6b, 0x07, 0x68, 0x07, 0x99, 0x07, 0x99, 0x07, 0x68, 0x07, 0x66, 0x07, 0x82, 0x07, 0x78, 0x07, 0x7c, 0x07, 0x7c, 0x07, 0x78, 0x07, 0x79, 0x07, 0x65, 0x07, 0x95, 0x07, 0x66, 0x07, 0x66, 0x07, 0x95, 0x07, 0x97, 0x07, 0x7b, 0x07, +0x7d, 0x07, 0x7c, 0x07, 0x7c, 0x07, 0x7d, 0x07, 0x7f, 0x07, 0x93, 0x07, 0x98, 0x07, 0x94, 0x07, 0x94, 0x07, 0x98, 0x07, 0x97, 0x07, 0x84, 0x07, 0x81, 0x07, 0x80, 0x07, 0x80, 0x07, 0x81, 0x07, 0x7f, 0x07, 0x96, 0x07, 0x8f, 0x07, 0x94, 0x07, 0x94, 0x07, 0x8f, 0x07, 0x91, 0x07, 0x7e, 0x07, 0x86, 0x07, 0x80, 0x07, 0x80, 0x07, 0x86, 0x07, 0x85, 0x07, 0x8d, 0x07, 0x92, 0x07, 0x8e, 0x07, 0x8e, 0x07, 0x92, 0x07, 0x91, 0x07, 0x8a, 0x07, 0x83, 0x07, 0x88, 0x07, 0x88, 0x07, 0x83, 0x07, +0x85, 0x07, 0x90, 0x07, 0x89, 0x07, 0x8e, 0x07, 0x8e, 0x07, 0x89, 0x07, 0x8b, 0x07, 0x87, 0x07, 0x8c, 0x07, 0x88, 0x07, 0x88, 0x07, 0x8c, 0x07, 0x8b, 0x07, 0x63, 0x02, 0xdc, 0x02, 0x61, 0x02, 0x61, 0x02, 0xdc, 0x02, 0x0b, 0x09, 0x21, 0x02, 0xc2, 0x02, 0x1b, 0x02, 0x1b, 0x02, 0xc2, 0x02, 0xdc, 0x02, 0x0b, 0x09, 0xdc, 0x02, 0x10, 0x03, 0x10, 0x03, 0xdc, 0x02, 0xc2, 0x02, 0x9a, 0x02, 0x99, 0x02, 0x42, 0x03, 0x42, 0x03, 0x99, 0x02, 0x43, 0x03, 0xa4, 0x02, 0x41, 0x03, 0x9d, 0x02, +0x9d, 0x02, 0x41, 0x03, 0x42, 0x03, 0xa2, 0x02, 0xa0, 0x02, 0x40, 0x03, 0x40, 0x03, 0xa0, 0x02, 0x41, 0x03, 0xcd, 0x02, 0x3e, 0x03, 0xa5, 0x02, 0xa5, 0x02, 0x3e, 0x03, 0x40, 0x03, 0xcd, 0x02, 0xf7, 0x02, 0x3e, 0x03, 0x3e, 0x03, 0xf7, 0x02, 0x3f, 0x03, 0xee, 0x02, 0x3d, 0x03, 0x23, 0x03, 0x23, 0x03, 0x3d, 0x03, 0x3b, 0x03, 0x4f, 0x02, 0x39, 0x03, 0x4d, 0x02, 0x4d, 0x02, 0x39, 0x03, 0x3a, 0x03, 0xa9, 0x02, 0x39, 0x03, 0xaa, 0x02, 0xaa, 0x02, 0x39, 0x03, 0x38, 0x03, 0x60, 0x02, +0x37, 0x03, 0x52, 0x02, 0x52, 0x02, 0x37, 0x03, 0x38, 0x03, 0xb3, 0x02, 0x37, 0x03, 0xb4, 0x02, 0xb4, 0x02, 0x37, 0x03, 0x36, 0x03, 0x5e, 0x02, 0xd9, 0x02, 0x36, 0x03, 0x36, 0x03, 0xd9, 0x02, 0x35, 0x03, 0xbc, 0x02, 0xbb, 0x02, 0x34, 0x03, 0x34, 0x03, 0xbb, 0x02, 0x35, 0x03, 0x19, 0x03, 0x1b, 0x03, 0x32, 0x03, 0x32, 0x03, 0x1b, 0x03, 0x33, 0x03, 0xed, 0x06, 0xf8, 0x06, 0x61, 0x03, 0x61, 0x03, 0xf8, 0x06, 0x62, 0x03, 0xe2, 0x06, 0xed, 0x06, 0x5f, 0x03, 0x5f, 0x03, 0xed, 0x06, +0x61, 0x03, 0xd7, 0x06, 0xe2, 0x06, 0x5e, 0x03, 0x5e, 0x03, 0xe2, 0x06, 0x5f, 0x03, 0xcc, 0x06, 0xd7, 0x06, 0x5b, 0x03, 0x5b, 0x03, 0xd7, 0x06, 0x5e, 0x03, 0x64, 0x03, 0x62, 0x03, 0x00, 0x07, 0x00, 0x07, 0x62, 0x03, 0xf8, 0x06, 0x67, 0x03, 0x64, 0x03, 0x08, 0x07, 0x08, 0x07, 0x64, 0x03, 0x00, 0x07, 0x67, 0x03, 0x1d, 0x07, 0xd6, 0x01, 0xd6, 0x01, 0x1d, 0x07, 0x3d, 0x04, 0xd6, 0x01, 0x3d, 0x04, 0x95, 0x01, 0x95, 0x01, 0x3d, 0x04, 0x3e, 0x04, 0x5a, 0x03, 0xc1, 0x06, 0x5b, 0x03, +0x5b, 0x03, 0xc1, 0x06, 0xcc, 0x06, 0x0c, 0x09, 0x76, 0x06, 0x0d, 0x09, 0x0d, 0x09, 0x76, 0x06, 0x75, 0x06, 0x57, 0x03, 0xd5, 0x01, 0xa9, 0x06, 0xa9, 0x06, 0xd5, 0x01, 0xaa, 0x06, 0x0e, 0x09, 0x0d, 0x09, 0x83, 0x06, 0x83, 0x06, 0x0d, 0x09, 0x75, 0x06, 0x0f, 0x09, 0x0e, 0x09, 0x90, 0x06, 0x90, 0x06, 0x0e, 0x09, 0x83, 0x06, 0x0f, 0x09, 0x90, 0x06, 0x10, 0x09, 0x10, 0x09, 0x90, 0x06, 0x9d, 0x06, 0xb6, 0x06, 0x10, 0x09, 0xaa, 0x06, 0xaa, 0x06, 0x10, 0x09, 0x9d, 0x06, 0xbb, 0x01, +0xbc, 0x01, 0x4d, 0x03, 0x4d, 0x03, 0xbc, 0x01, 0x11, 0x09, 0x72, 0x00, 0x74, 0x00, 0xb8, 0x01, 0xb8, 0x01, 0x74, 0x00, 0xba, 0x01, 0x11, 0x04, 0x90, 0x01, 0x1a, 0x04, 0x1a, 0x04, 0x90, 0x01, 0x93, 0x01, 0x11, 0x04, 0x05, 0x04, 0x90, 0x01, 0x90, 0x01, 0x05, 0x04, 0x8e, 0x01, 0x81, 0x03, 0x80, 0x03, 0x85, 0x03, 0x85, 0x03, 0x80, 0x03, 0x84, 0x03, 0x85, 0x01, 0x86, 0x01, 0x12, 0x09, 0x12, 0x09, 0x86, 0x01, 0xbd, 0x03, 0x13, 0x09, 0x93, 0x03, 0x83, 0x03, 0x83, 0x03, 0x93, 0x03, +0x85, 0x03, 0x14, 0x09, 0xa1, 0x03, 0x13, 0x09, 0x13, 0x09, 0xa1, 0x03, 0x93, 0x03, 0x15, 0x09, 0xaf, 0x03, 0x14, 0x09, 0x14, 0x09, 0xaf, 0x03, 0xa1, 0x03, 0x12, 0x09, 0xbd, 0x03, 0x15, 0x09, 0x15, 0x09, 0xbd, 0x03, 0xaf, 0x03, 0xe1, 0x03, 0xd5, 0x03, 0x8b, 0x01, 0x8b, 0x01, 0xd5, 0x03, 0x8a, 0x01, 0x8b, 0x01, 0x8d, 0x01, 0xe1, 0x03, 0xe1, 0x03, 0x8d, 0x01, 0xed, 0x03, 0xed, 0x03, 0x8d, 0x01, 0xf9, 0x03, 0xf9, 0x03, 0x8d, 0x01, 0x8e, 0x01, 0x05, 0x04, 0xf9, 0x03, 0x8e, 0x01, +0x95, 0x01, 0x3e, 0x04, 0x16, 0x09, 0x16, 0x09, 0x93, 0x01, 0x95, 0x01, 0x1c, 0x07, 0x45, 0x06, 0x1b, 0x07, 0x1b, 0x07, 0x45, 0x06, 0x3c, 0x04, 0x3a, 0x04, 0x3c, 0x04, 0x3b, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x45, 0x06, 0x01, 0x00, 0x17, 0x09, 0x03, 0x00, 0x03, 0x00, 0x17, 0x09, 0x18, 0x09, 0x04, 0x00, 0x19, 0x09, 0x01, 0x00, 0x01, 0x00, 0x19, 0x09, 0x17, 0x09, 0x07, 0x00, 0x1a, 0x09, 0x04, 0x00, 0x04, 0x00, 0x1a, 0x09, 0x19, 0x09, 0x08, 0x00, 0x1b, 0x09, 0x07, 0x00, 0x07, 0x00, +0x1b, 0x09, 0x1a, 0x09, 0xc0, 0x00, 0xbf, 0x00, 0x1c, 0x09, 0x1c, 0x09, 0xbf, 0x00, 0x1d, 0x09, 0xc2, 0x00, 0xc1, 0x00, 0x1e, 0x09, 0x1e, 0x09, 0xc1, 0x00, 0x1f, 0x09, 0xbf, 0x00, 0xc2, 0x00, 0x1d, 0x09, 0x1d, 0x09, 0xc2, 0x00, 0x1e, 0x09, 0x03, 0x00, 0x18, 0x09, 0xc5, 0x00, 0xc5, 0x00, 0x18, 0x09, 0x20, 0x09, 0xc7, 0x00, 0xc0, 0x00, 0x21, 0x09, 0x21, 0x09, 0xc0, 0x00, 0x1c, 0x09, 0xc5, 0x00, 0x20, 0x09, 0x6b, 0x01, 0x6b, 0x01, 0x20, 0x09, 0x22, 0x09, 0x7d, 0x01, 0xc7, 0x00, +0x23, 0x09, 0x23, 0x09, 0xc7, 0x00, 0x21, 0x09, 0x6b, 0x01, 0x22, 0x09, 0xc1, 0x00, 0xc1, 0x00, 0x22, 0x09, 0x1f, 0x09, 0x1b, 0x09, 0x08, 0x00, 0x24, 0x09, 0x24, 0x09, 0x08, 0x00, 0x97, 0x01, 0x7d, 0x01, 0x23, 0x09, 0xd1, 0x01, 0xd1, 0x01, 0x23, 0x09, 0x25, 0x09, 0xda, 0x01, 0xdb, 0x01, 0x26, 0x09, 0x26, 0x09, 0xdb, 0x01, 0x27, 0x09, 0xdd, 0x01, 0xda, 0x01, 0x28, 0x09, 0x28, 0x09, 0xda, 0x01, 0x26, 0x09, 0xdf, 0x01, 0xdd, 0x01, 0x29, 0x09, 0x29, 0x09, 0xdd, 0x01, 0x28, 0x09, +0xdf, 0x01, 0x29, 0x09, 0xe1, 0x01, 0xe1, 0x01, 0x29, 0x09, 0x2a, 0x09, 0x97, 0x02, 0x2b, 0x09, 0x98, 0x02, 0x98, 0x02, 0x2b, 0x09, 0x2c, 0x09, 0x9b, 0x02, 0x2d, 0x09, 0x99, 0x02, 0x99, 0x02, 0x2d, 0x09, 0x2e, 0x09, 0x98, 0x02, 0x2c, 0x09, 0x9b, 0x02, 0x9b, 0x02, 0x2c, 0x09, 0x2d, 0x09, 0xdb, 0x01, 0x9e, 0x02, 0x27, 0x09, 0x27, 0x09, 0x9e, 0x02, 0x2f, 0x09, 0x9f, 0x02, 0x30, 0x09, 0x97, 0x02, 0x97, 0x02, 0x30, 0x09, 0x2b, 0x09, 0x9e, 0x02, 0x43, 0x03, 0x2f, 0x09, 0x2f, 0x09, +0x43, 0x03, 0x31, 0x09, 0xe1, 0x01, 0x2a, 0x09, 0x45, 0x03, 0x45, 0x03, 0x2a, 0x09, 0x32, 0x09, 0xd1, 0x01, 0x25, 0x09, 0x9f, 0x02, 0x9f, 0x02, 0x25, 0x09, 0x30, 0x09, 0x43, 0x03, 0x99, 0x02, 0x31, 0x09, 0x31, 0x09, 0x99, 0x02, 0x2e, 0x09, 0x18, 0x09, 0x17, 0x09, 0x33, 0x09, 0x17, 0x09, 0x19, 0x09, 0x33, 0x09, 0x19, 0x09, 0x1a, 0x09, 0x33, 0x09, 0x1a, 0x09, 0x1b, 0x09, 0x33, 0x09, 0x1c, 0x09, 0x1d, 0x09, 0x33, 0x09, 0x1e, 0x09, 0x1f, 0x09, 0x33, 0x09, 0x1d, 0x09, 0x1e, 0x09, +0x33, 0x09, 0x20, 0x09, 0x18, 0x09, 0x33, 0x09, 0x21, 0x09, 0x1c, 0x09, 0x33, 0x09, 0x22, 0x09, 0x20, 0x09, 0x33, 0x09, 0x23, 0x09, 0x21, 0x09, 0x33, 0x09, 0x1f, 0x09, 0x22, 0x09, 0x33, 0x09, 0x1b, 0x09, 0x24, 0x09, 0x33, 0x09, 0x24, 0x09, 0x32, 0x09, 0x33, 0x09, 0x25, 0x09, 0x23, 0x09, 0x33, 0x09, 0x26, 0x09, 0x27, 0x09, 0x33, 0x09, 0x28, 0x09, 0x26, 0x09, 0x33, 0x09, 0x29, 0x09, 0x28, 0x09, 0x33, 0x09, 0x2a, 0x09, 0x29, 0x09, 0x33, 0x09, 0x2c, 0x09, 0x2b, 0x09, 0x33, 0x09, +0x2e, 0x09, 0x2d, 0x09, 0x33, 0x09, 0x2d, 0x09, 0x2c, 0x09, 0x33, 0x09, 0x27, 0x09, 0x2f, 0x09, 0x33, 0x09, 0x2b, 0x09, 0x30, 0x09, 0x33, 0x09, 0x2f, 0x09, 0x31, 0x09, 0x33, 0x09, 0x32, 0x09, 0x2a, 0x09, 0x33, 0x09, 0x30, 0x09, 0x25, 0x09, 0x33, 0x09, 0x31, 0x09, 0x2e, 0x09, 0x33, 0x09, 0x3e, 0x04, 0x2b, 0x04, 0x16, 0x09, 0x16, 0x09, 0x2b, 0x04, 0x24, 0x04, 0x1a, 0x04, 0x93, 0x01, 0x24, 0x04, 0x24, 0x04, 0x93, 0x01, 0x16, 0x09, 0x08, 0x07, 0x0e, 0x07, 0x1d, 0x07, 0x32, 0x09, +0x24, 0x09, 0x45, 0x03, 0x45, 0x03, 0x24, 0x09, 0x97, 0x01, 0x59, 0x00, 0x34, 0x09, 0x57, 0x00, 0x57, 0x00, 0x34, 0x09, 0x35, 0x09, 0x46, 0x03, 0x44, 0x03, 0x99, 0x01, 0x99, 0x01, 0x44, 0x03, 0x98, 0x01, 0x44, 0x03, 0x45, 0x03, 0x98, 0x01, 0x98, 0x01, 0x45, 0x03, 0x97, 0x01, 0x47, 0x03, 0x46, 0x03, 0x9a, 0x01, 0x9a, 0x01, 0x46, 0x03, 0x99, 0x01, 0x47, 0x03, 0x9a, 0x01, 0x4c, 0x03, 0x4c, 0x03, 0x9a, 0x01, 0xb8, 0x01, 0x4c, 0x03, 0xb8, 0x01, 0xb9, 0x01, 0xb9, 0x01, 0xb8, 0x01, +0xba, 0x01, 0x74, 0x00, 0x82, 0x00, 0xba, 0x01, 0xba, 0x01, 0x82, 0x00, 0xbc, 0x01, 0x82, 0x00, 0x84, 0x00, 0xbc, 0x01, 0xbc, 0x01, 0x84, 0x00, 0x11, 0x09, 0x4e, 0x03, 0x36, 0x09, 0x4f, 0x03, 0x4f, 0x03, 0x36, 0x09, 0x37, 0x09, 0x4f, 0x03, 0x37, 0x09, 0x50, 0x03, 0x50, 0x03, 0x37, 0x09, 0x38, 0x09, 0x50, 0x03, 0x38, 0x09, 0x51, 0x03, 0x51, 0x03, 0x38, 0x09, 0x39, 0x09, 0x51, 0x03, 0x39, 0x09, 0x4a, 0x03, 0x4a, 0x03, 0x39, 0x09, 0x3a, 0x09, 0x4b, 0x03, 0x4a, 0x03, 0x3b, 0x09, +0x3b, 0x09, 0x4a, 0x03, 0x3a, 0x09, 0x48, 0x03, 0x4b, 0x03, 0x3c, 0x09, 0x3c, 0x09, 0x4b, 0x03, 0x3b, 0x09, 0x48, 0x03, 0x3c, 0x09, 0x49, 0x03, 0x49, 0x03, 0x3c, 0x09, 0x3d, 0x09, 0x34, 0x09, 0x59, 0x00, 0x3e, 0x09, 0x3e, 0x09, 0x59, 0x00, 0xa3, 0x00, 0x95, 0x00, 0x3f, 0x09, 0xa3, 0x00, 0xa3, 0x00, 0x3f, 0x09, 0x3e, 0x09, 0x94, 0x00, 0x40, 0x09, 0x95, 0x00, 0x95, 0x00, 0x40, 0x09, 0x3f, 0x09, 0x8d, 0x00, 0x4d, 0x00, 0xc1, 0x01, 0xc1, 0x01, 0x4d, 0x00, 0xaa, 0x01, 0x4b, 0x00, +0xa8, 0x01, 0x4d, 0x00, 0x4d, 0x00, 0xa8, 0x01, 0xaa, 0x01, 0x4e, 0x00, 0xac, 0x01, 0x4b, 0x00, 0x4b, 0x00, 0xac, 0x01, 0xa8, 0x01, 0x4e, 0x00, 0x51, 0x00, 0xac, 0x01, 0xac, 0x01, 0x51, 0x00, 0xae, 0x01, 0x51, 0x00, 0x7f, 0x01, 0xae, 0x01, 0xae, 0x01, 0x7f, 0x01, 0xcd, 0x01, 0x7f, 0x01, 0x81, 0x01, 0xcd, 0x01, 0xcd, 0x01, 0x81, 0x01, 0xcf, 0x01, 0x84, 0x01, 0xd2, 0x01, 0x81, 0x01, 0x81, 0x01, 0xd2, 0x01, 0xcf, 0x01, 0x85, 0x01, 0xd4, 0x01, 0x84, 0x01, 0x84, 0x01, 0xd4, 0x01, +0xd2, 0x01, 0x12, 0x09, 0xb6, 0x06, 0x85, 0x01, 0x85, 0x01, 0xb6, 0x06, 0xd4, 0x01, 0x15, 0x09, 0x10, 0x09, 0x12, 0x09, 0x12, 0x09, 0x10, 0x09, 0xb6, 0x06, 0x15, 0x09, 0x14, 0x09, 0x10, 0x09, 0x10, 0x09, 0x14, 0x09, 0x0f, 0x09, 0x14, 0x09, 0x13, 0x09, 0x0f, 0x09, 0x0f, 0x09, 0x13, 0x09, 0x0e, 0x09, 0x13, 0x09, 0x83, 0x03, 0x0e, 0x09, 0x0e, 0x09, 0x83, 0x03, 0x0d, 0x09, 0x83, 0x03, 0x82, 0x03, 0x0d, 0x09, 0x0d, 0x09, 0x82, 0x03, 0x0c, 0x09, 0x46, 0x04, 0x0c, 0x09, 0x82, 0x03, +0x76, 0x06, 0x0c, 0x09, 0x46, 0x04, 0x46, 0x04, 0x84, 0x03, 0x80, 0x03, 0x3e, 0x01, 0x41, 0x09, 0x40, 0x01, 0x40, 0x01, 0x41, 0x09, 0x42, 0x09, 0x44, 0x01, 0x43, 0x09, 0x42, 0x01, 0x42, 0x01, 0x43, 0x09, 0x44, 0x09, 0x42, 0x01, 0x44, 0x09, 0x3e, 0x01, 0x3e, 0x01, 0x44, 0x09, 0x41, 0x09, 0x0c, 0x01, 0x09, 0x01, 0x45, 0x09, 0x45, 0x09, 0x09, 0x01, 0x46, 0x09, 0x0a, 0x01, 0x12, 0x01, 0x47, 0x09, 0x47, 0x09, 0x12, 0x01, 0x48, 0x09, 0x09, 0x01, 0x0a, 0x01, 0x46, 0x09, 0x46, 0x09, +0x0a, 0x01, 0x47, 0x09, 0x21, 0x01, 0x0c, 0x01, 0x49, 0x09, 0x49, 0x09, 0x0c, 0x01, 0x45, 0x09, 0x40, 0x01, 0x42, 0x09, 0x13, 0x01, 0x13, 0x01, 0x42, 0x09, 0x4a, 0x09, 0x12, 0x01, 0x13, 0x01, 0x48, 0x09, 0x48, 0x09, 0x13, 0x01, 0x4a, 0x09, 0x1b, 0x01, 0x14, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x14, 0x01, 0x1e, 0x01, 0x65, 0x01, 0x4b, 0x09, 0x17, 0x01, 0x17, 0x01, 0x4b, 0x09, 0x4c, 0x09, 0x17, 0x01, 0x4c, 0x09, 0x19, 0x01, 0x19, 0x01, 0x4c, 0x09, 0x4d, 0x09, 0x1d, 0x01, 0x1e, 0x01, +0x24, 0x01, 0x24, 0x01, 0x1e, 0x01, 0x22, 0x01, 0x65, 0x01, 0x21, 0x01, 0x4b, 0x09, 0x4b, 0x09, 0x21, 0x01, 0x49, 0x09, 0x24, 0x01, 0x22, 0x01, 0x26, 0x01, 0x26, 0x01, 0x22, 0x01, 0x27, 0x01, 0x26, 0x01, 0x27, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x27, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x2a, 0x01, 0x2d, 0x01, 0x2d, 0x01, 0x2a, 0x01, 0x28, 0x01, 0x3b, 0x01, 0x2c, 0x01, 0x39, 0x01, 0x39, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x36, 0x01, 0x37, 0x01, 0x4e, 0x09, 0x4e, 0x09, 0x37, 0x01, 0x4f, 0x09, +0x33, 0x01, 0x3b, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0x3b, 0x01, 0x39, 0x01, 0x32, 0x01, 0x33, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x33, 0x01, 0x2f, 0x01, 0x44, 0x01, 0x36, 0x01, 0x43, 0x09, 0x43, 0x09, 0x36, 0x01, 0x4e, 0x09, 0x1c, 0x03, 0x1a, 0x03, 0x50, 0x09, 0x50, 0x09, 0x1a, 0x03, 0x51, 0x09, 0x17, 0x03, 0x18, 0x03, 0x52, 0x09, 0x52, 0x09, 0x18, 0x03, 0x53, 0x09, 0x1a, 0x03, 0x17, 0x03, 0x51, 0x09, 0x51, 0x09, 0x17, 0x03, 0x52, 0x09, 0xe2, 0x02, 0x54, 0x09, 0xe9, 0x02, 0xe9, 0x02, +0x54, 0x09, 0x55, 0x09, 0xe4, 0x02, 0x56, 0x09, 0xe0, 0x02, 0xe0, 0x02, 0x56, 0x09, 0x57, 0x09, 0xe0, 0x02, 0x57, 0x09, 0xe2, 0x02, 0xe2, 0x02, 0x57, 0x09, 0x54, 0x09, 0xf9, 0x02, 0x58, 0x09, 0xe4, 0x02, 0xe4, 0x02, 0x58, 0x09, 0x56, 0x09, 0x18, 0x03, 0xeb, 0x02, 0x53, 0x09, 0x53, 0x09, 0xeb, 0x02, 0x59, 0x09, 0xe9, 0x02, 0x55, 0x09, 0xeb, 0x02, 0xeb, 0x02, 0x55, 0x09, 0x59, 0x09, 0x3c, 0x03, 0xf0, 0x02, 0x5a, 0x09, 0x5a, 0x09, 0xf0, 0x02, 0x5b, 0x09, 0xf4, 0x02, 0xf5, 0x02, +0xec, 0x02, 0xec, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0x5b, 0x09, 0x5b, 0x09, 0xf1, 0x02, 0x5c, 0x09, 0xf5, 0x02, 0xfc, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xfc, 0x02, 0xfa, 0x02, 0x3c, 0x03, 0x5a, 0x09, 0xf9, 0x02, 0xf9, 0x02, 0x5a, 0x09, 0x58, 0x09, 0xfc, 0x02, 0xfe, 0x02, 0xfa, 0x02, 0xfa, 0x02, 0xfe, 0x02, 0xff, 0x02, 0xfe, 0x02, 0x02, 0x03, 0xff, 0x02, 0xff, 0x02, 0x02, 0x03, 0x00, 0x03, 0x04, 0x03, 0x05, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x03, 0x00, 0x03, +0x13, 0x03, 0x11, 0x03, 0x04, 0x03, 0x04, 0x03, 0x11, 0x03, 0x05, 0x03, 0x0b, 0x03, 0x06, 0x03, 0x13, 0x03, 0x13, 0x03, 0x06, 0x03, 0x11, 0x03, 0x0d, 0x03, 0x5d, 0x09, 0x0f, 0x03, 0x0f, 0x03, 0x5d, 0x09, 0x5e, 0x09, 0x09, 0x03, 0x07, 0x03, 0x0b, 0x03, 0x0b, 0x03, 0x07, 0x03, 0x06, 0x03, 0x1c, 0x03, 0x50, 0x09, 0x0d, 0x03, 0x0d, 0x03, 0x50, 0x09, 0x5d, 0x09, 0x62, 0x08, 0x17, 0x08, 0x16, 0x08, 0x3d, 0x05, 0x3c, 0x05, 0x3f, 0x05 + }; + + static byte[] k_rgNormals = + { +0x39, 0xb8, 0x44, 0xbe, 0xea, 0x3f, 0x6f, 0xbf, 0x8f, 0x52, 0x99, 0x3e, 0xc9, 0x54, 0x81, 0xbd, 0x14, 0x5e, 0x7e, 0xbf, 0x2b, 0x4c, 0xbf, 0x3d, 0x7b, 0x83, 0xef, 0xbd, 0x2b, 0xdb, 0x6b, 0xbf, 0x98, 0xdb, 0xbd, 0x3e, 0x25, 0xca, 0x1e, 0xbd, 0x93, 0x35, 0x7e, 0xbf, 0xcb, 0x68, 0xe4, 0x3d, 0xe4, 0x9e, 0xae, 0xbd, 0x00, 0x72, 0x7e, 0xbf, 0xb7, 0x7a, 0x8e, 0x3d, 0x1a, 0x34, 0x84, 0xbe, 0xe5, 0x2b, 0x71, 0xbf, 0x05, 0x32, 0x5b, 0x3e, 0x28, 0x48, 0x9c, 0xbe, 0x84, 0xb9, 0x71, 0xbf, +0x69, 0xdf, 0xfc, 0x3d, 0xf5, 0xf7, 0xd2, 0xbd, 0x76, 0x6e, 0x7e, 0xbf, 0x70, 0x20, 0x24, 0x3d, 0x83, 0xf8, 0xe0, 0xbd, 0xfe, 0x62, 0x7e, 0xbf, 0x6e, 0xd8, 0xb6, 0x3c, 0x22, 0xc6, 0xa3, 0xbe, 0xee, 0x09, 0x72, 0xbf, 0x09, 0xdf, 0x7b, 0x3d, 0x77, 0xba, 0x73, 0x3e, 0x54, 0x37, 0x4f, 0xbf, 0x0d, 0x6c, 0x09, 0x3f, 0xc5, 0x8a, 0xca, 0x3e, 0x11, 0x51, 0x54, 0xbf, 0x10, 0x02, 0xca, 0x3e, 0x26, 0xdf, 0xa4, 0x3e, 0xe4, 0x31, 0x27, 0xbf, 0xb8, 0x75, 0x2f, 0x3f, 0x34, 0x0f, 0x0c, 0x3f, +0x5d, 0x70, 0x2a, 0xbf, 0x58, 0xe2, 0x01, 0x3f, 0xfe, 0xd4, 0x68, 0x3e, 0xe7, 0x70, 0x71, 0xbf, 0xf8, 0x52, 0x78, 0x3e, 0xa5, 0xdd, 0x18, 0x3e, 0x96, 0x07, 0x6d, 0xbf, 0xea, 0xad, 0xb1, 0x3e, 0xa0, 0xff, 0x9e, 0xbe, 0x3b, 0x17, 0x52, 0xbf, 0x35, 0x95, 0xf5, 0x3e, 0xff, 0x79, 0x3a, 0xbe, 0x8c, 0x4a, 0x4a, 0xbf, 0x81, 0xcd, 0x15, 0x3f, 0x57, 0x24, 0xd6, 0xbe, 0x34, 0x65, 0x57, 0xbf, 0xa7, 0x3b, 0xaf, 0x3e, 0x6b, 0x82, 0xd0, 0xbe, 0x75, 0x04, 0x2c, 0xbf, 0x64, 0x5b, 0x1e, 0x3f, +0xfa, 0x7d, 0x0b, 0xbf, 0x46, 0x3f, 0x36, 0xbf, 0xcb, 0xd6, 0xe2, 0x3e, 0xf4, 0xfe, 0x6f, 0xbe, 0xde, 0x3b, 0x1e, 0xbf, 0xbe, 0x16, 0x40, 0x3f, 0xc4, 0xd0, 0xf2, 0xbe, 0x29, 0x7b, 0x5b, 0xbf, 0x10, 0xe8, 0x4c, 0x3e, 0x7c, 0xed, 0xf1, 0xbe, 0x00, 0x1b, 0x60, 0xbf, 0x79, 0xb1, 0xd0, 0x3d, 0x97, 0xe3, 0x19, 0xbf, 0x29, 0x25, 0x40, 0xbf, 0xa2, 0x7d, 0x8c, 0x3e, 0x4f, 0xea, 0x17, 0xbf, 0xf6, 0x9a, 0x4a, 0xbf, 0xc4, 0x22, 0x16, 0x3e, 0x86, 0x91, 0xfe, 0x3e, 0x27, 0x6b, 0x58, 0xbf, +0x96, 0xe9, 0x47, 0x3e, 0xdc, 0x83, 0x90, 0x3e, 0x7e, 0x19, 0x74, 0xbf, 0x51, 0x2f, 0xd8, 0x3d, 0x8a, 0x20, 0x2e, 0x3f, 0x49, 0xbb, 0x2d, 0xbf, 0x97, 0xe3, 0x8d, 0x3e, 0xfd, 0x15, 0xca, 0x3e, 0xa5, 0x12, 0x02, 0xbf, 0x5d, 0xfa, 0x43, 0x3f, 0x1a, 0xdc, 0x26, 0x3f, 0xe9, 0xef, 0x01, 0xbf, 0xee, 0x41, 0x10, 0x3f, 0xe8, 0x6a, 0xf3, 0x3e, 0x10, 0xe7, 0xc1, 0xbe, 0x1b, 0x48, 0x4b, 0x3f, 0x00, 0x8d, 0x3a, 0x3f, 0x78, 0x7a, 0xb5, 0xbe, 0x04, 0x01, 0x16, 0x3f, 0xfe, 0xb4, 0xf1, 0xbe, +0x95, 0x09, 0x07, 0xbf, 0x85, 0xd1, 0x34, 0x3f, 0x4d, 0x67, 0x8f, 0xbe, 0xfd, 0xfa, 0xe9, 0xbe, 0xef, 0x1e, 0x58, 0x3f, 0x56, 0x44, 0x21, 0xbf, 0x06, 0xf0, 0x16, 0xbf, 0xc7, 0x68, 0x01, 0x3f, 0x01, 0x89, 0x06, 0xbf, 0x81, 0x3d, 0xce, 0xbe, 0x0a, 0xd7, 0x3f, 0x3f, 0x66, 0x32, 0x30, 0xbf, 0xb9, 0x88, 0xf7, 0xbe, 0xea, 0x76, 0x0a, 0x3f, 0x11, 0xff, 0xb0, 0xbe, 0x41, 0xd3, 0xaa, 0xbe, 0xd7, 0x84, 0x60, 0x3f, 0x91, 0x28, 0x4c, 0x3f, 0xd0, 0xb4, 0x00, 0xbf, 0x44, 0xc3, 0xaa, 0x3e, +0x6a, 0x6d, 0x5e, 0x3f, 0x45, 0x11, 0xaa, 0xbe, 0x38, 0xf3, 0xbb, 0x3e, 0x03, 0x7c, 0x47, 0x3f, 0xa0, 0x52, 0x55, 0xbe, 0xf0, 0x51, 0x17, 0x3f, 0x0e, 0x86, 0x0e, 0x3f, 0x53, 0xeb, 0x6d, 0xbe, 0x62, 0x2b, 0x4c, 0x3f, 0xf5, 0x85, 0x1c, 0x3f, 0xe4, 0x13, 0xb2, 0xbd, 0x0c, 0x59, 0x49, 0x3f, 0x61, 0x54, 0x4e, 0x3f, 0xf3, 0xc8, 0x9f, 0xbd, 0x9b, 0x37, 0x16, 0x3f, 0x0d, 0xa9, 0x66, 0x3f, 0xe8, 0x4f, 0x4b, 0xbe, 0x75, 0x77, 0xc5, 0x3e, 0x5a, 0xb7, 0x69, 0x3f, 0x2f, 0xfb, 0x95, 0xbd, +0x26, 0x89, 0xcd, 0x3e, 0xe2, 0x59, 0x16, 0x3f, 0xa6, 0x44, 0xa2, 0x3e, 0xa0, 0xa6, 0x3e, 0x3f, 0x11, 0x55, 0x20, 0x3f, 0x1b, 0xf4, 0xe5, 0x3d, 0x13, 0x7e, 0x45, 0x3f, 0x02, 0x7f, 0x44, 0x3f, 0xe2, 0xb1, 0x97, 0x3e, 0xf1, 0x81, 0x11, 0x3f, 0xbe, 0xbe, 0x4e, 0x3f, 0x05, 0x34, 0xd1, 0x3d, 0x8e, 0xb0, 0x14, 0x3f, 0xee, 0xec, 0x67, 0x3f, 0x0b, 0xeb, 0xc6, 0x3d, 0x5d, 0xfb, 0xd2, 0x3e, 0xf3, 0x74, 0x5e, 0x3f, 0x0e, 0xda, 0x8b, 0x3e, 0x56, 0x46, 0xd3, 0x3e, 0x99, 0xf3, 0xbc, 0x3e, +0x0a, 0x0f, 0x2a, 0x3f, 0x73, 0x67, 0x26, 0x3f, 0x6d, 0x1e, 0xff, 0x3e, 0xcc, 0x9a, 0x00, 0x3f, 0xe2, 0xe6, 0x34, 0x3f, 0xd5, 0x97, 0x15, 0x3f, 0x1a, 0x14, 0x19, 0x3f, 0x08, 0x72, 0x0c, 0x3f, 0x89, 0x5f, 0x31, 0x3f, 0x5d, 0x16, 0xeb, 0x3e, 0xd6, 0x54, 0x0e, 0x3f, 0x29, 0x25, 0x50, 0x3f, 0xbd, 0x8a, 0xd4, 0x3e, 0xbe, 0xfa, 0xd0, 0x3e, 0x02, 0x49, 0x40, 0x3f, 0xf8, 0xde, 0x03, 0x3f, 0x51, 0x66, 0xd3, 0x3e, 0x00, 0xfb, 0x48, 0x3e, 0xa8, 0x55, 0x44, 0x3f, 0xfd, 0x68, 0x1c, 0x3f, +0xe2, 0x3e, 0x8a, 0x3e, 0x8f, 0x31, 0x37, 0x3f, 0x25, 0xeb, 0x24, 0x3f, 0x03, 0x04, 0xc3, 0x3e, 0xd1, 0x1e, 0x3b, 0x3f, 0x6a, 0xf6, 0x10, 0x3f, 0x00, 0x70, 0xf4, 0x3e, 0x88, 0x0f, 0x2c, 0x3f, 0x54, 0xe4, 0x10, 0x3f, 0xe0, 0x65, 0x2a, 0x3f, 0x8d, 0x24, 0x1d, 0x3f, 0x40, 0x51, 0xd9, 0x3e, 0xb6, 0x62, 0x0f, 0x3f, 0x1b, 0x83, 0x36, 0x3f, 0x96, 0x04, 0xd8, 0x3e, 0x93, 0xa6, 0x11, 0xbe, 0x2c, 0x81, 0x64, 0x3f, 0xed, 0x0c, 0xdb, 0x3e, 0x2f, 0x69, 0xec, 0xbd, 0xbe, 0x4b, 0x4d, 0x3f, +0xdc, 0x0d, 0x16, 0x3f, 0xfb, 0x23, 0x3c, 0xbe, 0xad, 0xbe, 0x66, 0x3f, 0xea, 0xcd, 0xc8, 0x3e, 0xd4, 0x46, 0x15, 0xbe, 0xd4, 0xb9, 0x52, 0x3f, 0xd4, 0x7d, 0x0c, 0x3f, 0x79, 0xb2, 0x4b, 0xbe, 0xfc, 0xc1, 0x70, 0x3f, 0xcd, 0x1d, 0x8d, 0x3e, 0x3e, 0xb1, 0x2e, 0xbe, 0x62, 0x65, 0x64, 0x3f, 0xd1, 0x23, 0xd6, 0x3e, 0x94, 0xda, 0xab, 0xbd, 0xa9, 0xdc, 0x48, 0x3f, 0x31, 0x41, 0x1d, 0x3f, 0xcd, 0x94, 0xd6, 0xbd, 0xb7, 0x40, 0x56, 0x3f, 0x9d, 0x85, 0x09, 0x3f, 0x3f, 0xfb, 0x91, 0xbd, +0x30, 0x47, 0x43, 0x3f, 0x23, 0x87, 0x24, 0x3f, 0x58, 0xaa, 0x1b, 0xbe, 0x59, 0xc2, 0x76, 0x3f, 0xd8, 0xd6, 0x5f, 0x3e, 0x97, 0x3b, 0x33, 0xbd, 0x84, 0xd7, 0x7e, 0x3f, 0xf9, 0xba, 0xac, 0x3d, 0xaf, 0x7b, 0xab, 0xbd, 0xf9, 0x49, 0x75, 0x3f, 0xd9, 0x23, 0x8c, 0x3e, 0xd8, 0x25, 0xea, 0x3d, 0x32, 0xaf, 0x7b, 0x3f, 0x97, 0x1d, 0x12, 0x3e, 0xe2, 0x5a, 0x1d, 0xbe, 0x59, 0xa1, 0x7c, 0x3f, 0x22, 0x6e, 0x4e, 0x3d, 0x2f, 0x17, 0x41, 0xbe, 0xaf, 0x99, 0x78, 0x3f, 0x77, 0xdb, 0x15, 0x3e, +0x06, 0x46, 0x8e, 0xbe, 0xc3, 0x81, 0x74, 0x3f, 0xa4, 0x6f, 0xd2, 0x3d, 0x39, 0x9b, 0x8e, 0xbe, 0x14, 0xb4, 0x75, 0x3f, 0xaf, 0x95, 0x10, 0x3d, 0x09, 0x4f, 0x88, 0xbe, 0x72, 0xa6, 0x71, 0x3f, 0xcf, 0xd8, 0x47, 0x3e, 0x84, 0x2a, 0xfd, 0xbe, 0xe9, 0x61, 0x24, 0x3f, 0x6e, 0xf8, 0x15, 0x3f, 0xe4, 0x4a, 0xfd, 0xbd, 0x77, 0x81, 0x3e, 0x3f, 0x0b, 0x0d, 0x28, 0x3f, 0x8c, 0xa0, 0x05, 0xbf, 0xf4, 0xdc, 0x46, 0x3f, 0x91, 0x5e, 0xb4, 0x3e, 0xa6, 0x26, 0xc1, 0xbd, 0xa5, 0x6a, 0x6b, 0x3f, +0xfa, 0x43, 0xc3, 0x3e, 0xa6, 0x26, 0xc1, 0xbd, 0xa5, 0x6a, 0x6b, 0x3f, 0xfa, 0x43, 0xc3, 0x3e, 0xe4, 0x4a, 0xfd, 0xbd, 0x77, 0x81, 0x3e, 0x3f, 0x0b, 0x0d, 0x28, 0x3f, 0x84, 0xbb, 0xb3, 0x3e, 0x4c, 0xc6, 0x5d, 0x3f, 0x24, 0xf2, 0xb5, 0x3e, 0x7b, 0x2e, 0x93, 0x3e, 0x6e, 0xa3, 0x39, 0x3f, 0xfd, 0x2e, 0x20, 0x3f, 0xac, 0xe5, 0xae, 0xbd, 0xae, 0xbc, 0x28, 0x3f, 0x45, 0x46, 0x3f, 0x3f, 0xaa, 0x63, 0x65, 0x3e, 0x53, 0x97, 0x30, 0x3f, 0x2d, 0x3f, 0x30, 0x3f, 0xac, 0xe5, 0xae, 0xbd, +0xae, 0xbc, 0x28, 0x3f, 0x45, 0x46, 0x3f, 0x3f, 0x93, 0xa9, 0xd2, 0xbe, 0x13, 0x9e, 0x10, 0x3f, 0xb0, 0x1a, 0x37, 0x3f, 0xe5, 0x7c, 0x65, 0xbf, 0xd1, 0xcc, 0x9b, 0x3e, 0x90, 0xf5, 0xa4, 0x3e, 0x0e, 0x87, 0x41, 0xbf, 0x3a, 0xad, 0xf3, 0x3e, 0x0c, 0x1e, 0xe6, 0x3e, 0xcc, 0x09, 0x6e, 0xbf, 0xa1, 0x65, 0x9d, 0x3e, 0xb1, 0x16, 0x4f, 0x3e, 0x77, 0xd7, 0x4d, 0xbf, 0x38, 0xbe, 0x06, 0x3f, 0x65, 0x8e, 0x8d, 0x3e, 0x87, 0xc3, 0x26, 0xbf, 0xb7, 0x43, 0xdb, 0x3e, 0x43, 0x55, 0x20, 0x3f, +0x27, 0x16, 0x50, 0xbf, 0x42, 0xb1, 0x85, 0x3e, 0x9d, 0x4b, 0x05, 0x3f, 0x77, 0x69, 0x33, 0xbf, 0xe8, 0xf6, 0x12, 0x3e, 0xd2, 0xe0, 0x32, 0x3f, 0xc6, 0x6a, 0x07, 0xbf, 0xfc, 0x19, 0xae, 0x3e, 0x78, 0x0c, 0x47, 0x3f, 0x2e, 0xaa, 0xa5, 0xbe, 0xc6, 0x6c, 0x01, 0x3f, 0xf0, 0xc0, 0x4c, 0x3f, 0x5a, 0x0d, 0x89, 0xbe, 0x30, 0x12, 0xd2, 0x3e, 0x2c, 0x2d, 0x5f, 0x3f, 0x99, 0xf3, 0xc4, 0xbe, 0xb6, 0xf6, 0x5e, 0x3e, 0x1f, 0xa2, 0x65, 0x3f, 0x1e, 0x6d, 0x04, 0xbf, 0x7e, 0xc4, 0xaf, 0xbc, +0xbc, 0x04, 0x5b, 0x3f, 0x19, 0x02, 0x34, 0xbf, 0x36, 0x3c, 0x3d, 0xbe, 0xf4, 0xc4, 0x2f, 0x3f, 0x3d, 0x65, 0x4d, 0xbf, 0x79, 0x94, 0x0a, 0xbd, 0xac, 0x8e, 0x18, 0x3f, 0x19, 0x59, 0x4e, 0xbf, 0x2c, 0xbb, 0x88, 0xbe, 0x8b, 0x36, 0x07, 0x3f, 0x2b, 0xbf, 0x60, 0xbf, 0x6e, 0xfa, 0x13, 0xbe, 0x45, 0xb8, 0xe9, 0x3e, 0xc0, 0x04, 0x6e, 0xbf, 0x95, 0x26, 0x25, 0xbb, 0x13, 0x7f, 0xbc, 0x3e, 0xb8, 0xaa, 0x64, 0xbf, 0x8d, 0x61, 0xee, 0x3d, 0x08, 0x59, 0xde, 0x3e, 0x72, 0x87, 0x31, 0xbf, +0x88, 0xd6, 0x22, 0xbf, 0x0c, 0x3e, 0xad, 0x3e, 0x53, 0x93, 0x34, 0xbf, 0x2c, 0x0e, 0x2f, 0xbf, 0x30, 0x2c, 0x3f, 0x3e, 0xb2, 0x80, 0x41, 0xbf, 0x22, 0x51, 0x08, 0xbf, 0xf6, 0x0a, 0xc3, 0x3e, 0x70, 0xea, 0x4b, 0xbf, 0x18, 0x05, 0x11, 0xbf, 0xb2, 0x47, 0x58, 0x3e, 0xce, 0x8c, 0x9e, 0xbd, 0x66, 0x4b, 0x76, 0xbe, 0x6c, 0xb1, 0x77, 0x3f, 0x04, 0xe8, 0xb7, 0xbd, 0xd3, 0xf4, 0x09, 0xbe, 0x51, 0x9f, 0x7c, 0x3f, 0xf9, 0xd8, 0x0d, 0xbe, 0x7f, 0xbd, 0x62, 0xbe, 0x2e, 0x1d, 0x77, 0x3f, +0xdb, 0x87, 0x2c, 0xbe, 0xc6, 0x87, 0xf9, 0xbd, 0xb6, 0x67, 0x7a, 0x3f, 0xcc, 0x7f, 0xe8, 0xbd, 0xb2, 0x82, 0x1f, 0xbd, 0x4e, 0x26, 0x7e, 0x3f, 0xea, 0xb2, 0x48, 0xbe, 0xfe, 0x42, 0x8f, 0xbc, 0xb5, 0xfe, 0x7a, 0x3f, 0x74, 0x29, 0x1a, 0xbf, 0x9b, 0xe3, 0x94, 0xbe, 0x36, 0x56, 0x3e, 0x3f, 0x7b, 0x10, 0x3e, 0xbf, 0x1b, 0xf2, 0xbf, 0xbe, 0x21, 0x21, 0x0e, 0x3f, 0x19, 0x02, 0x34, 0xbf, 0x36, 0x3c, 0x3d, 0xbe, 0xf4, 0xc4, 0x2f, 0x3f, 0x19, 0x59, 0x4e, 0xbf, 0x2c, 0xbb, 0x88, 0xbe, +0x8b, 0x36, 0x07, 0x3f, 0x1e, 0x6d, 0x04, 0xbf, 0x7e, 0xc4, 0xaf, 0xbc, 0xbc, 0x04, 0x5b, 0x3f, 0x6e, 0xa7, 0xdd, 0xbe, 0x8f, 0x18, 0x4d, 0xbe, 0xa8, 0xff, 0x60, 0x3f, 0x33, 0x6f, 0x51, 0xbf, 0x7d, 0xeb, 0xd3, 0xbe, 0xa9, 0x68, 0xcc, 0x3e, 0xe6, 0x3a, 0x61, 0xbf, 0x93, 0xe3, 0xd6, 0xbe, 0xd0, 0x7e, 0x64, 0x3e, 0x65, 0x19, 0x62, 0xbf, 0xa8, 0xfe, 0x91, 0xbe, 0x94, 0xa5, 0xbe, 0x3e, 0x01, 0xbd, 0x70, 0xbf, 0xe0, 0xd9, 0x86, 0xbe, 0x14, 0x5c, 0x5c, 0x3e, 0x0a, 0x29, 0xff, 0xbd, +0x94, 0x4e, 0xa4, 0x3d, 0x6b, 0x2c, 0x7d, 0x3f, 0xac, 0x52, 0xfa, 0xbd, 0x4f, 0x3c, 0x37, 0x3e, 0xbc, 0xea, 0x79, 0x3f, 0x43, 0x3c, 0x52, 0xbe, 0x3c, 0xf4, 0xbd, 0x3d, 0x44, 0x6b, 0x79, 0x3f, 0xae, 0xb8, 0x48, 0xbe, 0xbf, 0x7c, 0x42, 0x3e, 0xaa, 0x47, 0x76, 0x3f, 0x46, 0x79, 0x86, 0xbd, 0x5d, 0x51, 0x36, 0x3f, 0x7d, 0xec, 0x32, 0x3f, 0x0b, 0xb3, 0xb0, 0xbd, 0xe4, 0x83, 0x2a, 0x3f, 0x2e, 0xaa, 0x3d, 0x3f, 0x4e, 0x28, 0x44, 0xbd, 0x35, 0x61, 0x47, 0x3f, 0xac, 0x1a, 0x20, 0x3f, +0x4d, 0x9f, 0x5d, 0xbd, 0xe6, 0x94, 0x3c, 0x3f, 0x68, 0x92, 0x2c, 0x3f, 0x6b, 0x9a, 0xa7, 0x3e, 0x9f, 0x1e, 0x6b, 0x3f, 0x27, 0x68, 0x63, 0x3e, 0xca, 0xa6, 0x1c, 0x3d, 0xd6, 0x6f, 0x72, 0x3f, 0xd0, 0x45, 0xa3, 0x3e, 0xe3, 0x1b, 0x8a, 0xbd, 0xa2, 0x7c, 0x69, 0x3f, 0xdf, 0x17, 0xcf, 0x3e, 0xe3, 0x1b, 0x8a, 0xbd, 0xa2, 0x7c, 0x69, 0x3f, 0xdf, 0x17, 0xcf, 0x3e, 0xca, 0xa6, 0x1c, 0x3d, 0xd6, 0x6f, 0x72, 0x3f, 0xd0, 0x45, 0xa3, 0x3e, 0x87, 0x34, 0xaa, 0x3c, 0x1a, 0x33, 0x5d, 0x3f, +0xdb, 0xc1, 0x00, 0x3f, 0x43, 0x1e, 0x99, 0x3e, 0x9f, 0x3a, 0x5e, 0x3f, 0x87, 0xde, 0xca, 0x3e, 0x6b, 0x9a, 0xa7, 0x3e, 0x9f, 0x1e, 0x6b, 0x3f, 0x27, 0x68, 0x63, 0x3e, 0xa9, 0xdb, 0x19, 0x3f, 0xdc, 0xf4, 0x3f, 0x3f, 0x09, 0xa7, 0x8d, 0x3e, 0xf5, 0x10, 0xcd, 0x3d, 0x8a, 0xac, 0x49, 0x3f, 0xa3, 0x95, 0x1b, 0x3f, 0x77, 0x31, 0x0d, 0x3e, 0xfc, 0xfb, 0x4c, 0x3f, 0x79, 0x3c, 0x15, 0x3f, 0x32, 0xc9, 0x80, 0x3e, 0x7f, 0x31, 0x4b, 0x3f, 0x11, 0xc8, 0x0d, 0x3f, 0xad, 0x18, 0x96, 0x3e, +0x03, 0x60, 0x48, 0x3f, 0x2e, 0x8c, 0x0c, 0x3f, 0x87, 0x6a, 0x0a, 0x3d, 0x52, 0xb8, 0x42, 0x3f, 0xb6, 0xf7, 0x25, 0x3f, 0xba, 0x30, 0x52, 0x3c, 0xc2, 0xf7, 0x4a, 0x3f, 0x7f, 0xfa, 0x1b, 0x3f, 0x94, 0xa0, 0xbf, 0xba, 0x2f, 0x50, 0x4e, 0x3f, 0x9b, 0x8f, 0x17, 0x3f, 0x66, 0xbd, 0xf0, 0x3e, 0x4e, 0x43, 0x48, 0x3f, 0xf0, 0x34, 0xd1, 0x3e, 0xd4, 0x2c, 0xd0, 0x3e, 0x66, 0xf9, 0x52, 0x3f, 0x60, 0xe8, 0xc9, 0x3e, 0xf3, 0x90, 0x69, 0xbe, 0x2a, 0x6f, 0x6b, 0x3f, 0x2e, 0xac, 0xa3, 0x3e, +0x50, 0xc6, 0x18, 0xbe, 0x0c, 0x90, 0x60, 0x3f, 0x04, 0xa8, 0xe9, 0x3e, 0xfd, 0x4e, 0x63, 0x3e, 0x9b, 0x90, 0x46, 0x3f, 0xd0, 0x41, 0x17, 0x3f, 0x66, 0x4d, 0xf4, 0x3e, 0x91, 0x09, 0x38, 0x3f, 0x55, 0x67, 0x01, 0x3f, 0xba, 0x68, 0x24, 0x3f, 0xb0, 0xe3, 0x33, 0x3f, 0x43, 0xc9, 0x9c, 0x3e, 0x65, 0x19, 0x62, 0xbf, 0xa8, 0xfe, 0x91, 0xbe, 0x94, 0xa5, 0xbe, 0x3e, 0xe6, 0x23, 0x71, 0xbf, 0xd7, 0xa4, 0x1b, 0xbe, 0x5f, 0x46, 0x99, 0x3e, 0x01, 0xbd, 0x70, 0xbf, 0xe0, 0xd9, 0x86, 0xbe, +0x14, 0x5c, 0x5c, 0x3e, 0x7f, 0x2e, 0x7a, 0xbf, 0xb7, 0xf1, 0xc7, 0xbd, 0xa3, 0xaf, 0x40, 0x3e, 0x19, 0x3c, 0x78, 0xbf, 0xa9, 0x2e, 0xe0, 0x3c, 0x34, 0xb9, 0x78, 0x3e, 0x61, 0xf9, 0x7b, 0xbf, 0x55, 0x4c, 0x85, 0x3d, 0x49, 0x29, 0x28, 0x3e, 0x3f, 0xc7, 0xa7, 0xbd, 0xb2, 0x2b, 0x29, 0x3f, 0x97, 0xfd, 0x3e, 0x3f, 0xd2, 0x50, 0x13, 0xbe, 0x80, 0xb9, 0x22, 0x3f, 0x6f, 0x2a, 0x42, 0x3f, 0xd2, 0x50, 0x13, 0xbe, 0x80, 0xb9, 0x22, 0x3f, 0x6f, 0x2a, 0x42, 0x3f, 0x3f, 0xc7, 0xa7, 0xbd, +0xb2, 0x2b, 0x29, 0x3f, 0x97, 0xfd, 0x3e, 0x3f, 0xe0, 0x64, 0x73, 0xbf, 0x8b, 0x51, 0x37, 0x3e, 0x7a, 0x89, 0x81, 0x3e, 0x49, 0x2d, 0x78, 0xbf, 0x7d, 0xea, 0x38, 0x3e, 0xd9, 0x0a, 0x2a, 0x3e, 0x4d, 0x13, 0xde, 0x3e, 0x2f, 0x8a, 0x4a, 0x3f, 0xe3, 0xc3, 0xdc, 0x3e, 0xad, 0xbe, 0x92, 0x3e, 0x2b, 0x12, 0x3b, 0x3f, 0x02, 0x9c, 0x1e, 0x3f, 0x2d, 0xcc, 0x22, 0x3f, 0xcd, 0xaa, 0xff, 0x3e, 0x27, 0xa3, 0x16, 0x3f, 0xf3, 0x04, 0xd2, 0x3e, 0x39, 0xee, 0xd4, 0x3e, 0x9f, 0xc8, 0x4f, 0x3f, +0xa7, 0x92, 0x81, 0xbd, 0x99, 0xf3, 0x3c, 0x3f, 0x4d, 0xf6, 0x2b, 0x3f, 0x8a, 0x1c, 0x72, 0xbe, 0xea, 0x07, 0x49, 0x3f, 0x24, 0x7d, 0x12, 0x3f, 0x7e, 0x6d, 0xfd, 0xbc, 0xb8, 0x03, 0x55, 0x3f, 0x97, 0xc4, 0x0d, 0x3f, 0x7c, 0xb6, 0xb6, 0xbe, 0x64, 0xe6, 0xba, 0x3e, 0x3a, 0x21, 0x5c, 0x3f, 0x40, 0xa2, 0xc9, 0xbd, 0x24, 0x42, 0xbb, 0x3e, 0x3d, 0xed, 0x6c, 0x3f, 0x7c, 0x80, 0xee, 0x3d, 0xe4, 0x4b, 0x34, 0x3f, 0x0f, 0x47, 0x33, 0x3f, 0xd7, 0x33, 0x24, 0x3e, 0x8e, 0x20, 0xbd, 0x3e, +0x65, 0x53, 0x6a, 0x3f, 0x22, 0xc3, 0xc2, 0xbe, 0xf7, 0x70, 0x51, 0x3f, 0xd5, 0xca, 0xdc, 0x3e, 0xa7, 0x75, 0xfb, 0xbe, 0xd8, 0xd3, 0x52, 0x3f, 0xf4, 0x52, 0x91, 0x3e, 0x6c, 0x7a, 0x4c, 0xbf, 0xea, 0x7a, 0x9a, 0x3e, 0xe5, 0x42, 0x05, 0x3f, 0x8c, 0x62, 0x19, 0xbf, 0x0d, 0xa5, 0xae, 0x3e, 0xd2, 0x6d, 0x39, 0x3f, 0xe8, 0xdb, 0x42, 0x3d, 0x44, 0x19, 0x7e, 0xbf, 0x6e, 0x4e, 0xe5, 0x3d, 0x78, 0x09, 0x8e, 0x3d, 0x37, 0xa7, 0x7e, 0xbf, 0x44, 0x6a, 0x9a, 0x3d, 0x96, 0x75, 0x7f, 0x3c, +0x30, 0x9e, 0x7d, 0xbf, 0x65, 0x72, 0x0a, 0x3e, 0x20, 0x7f, 0xe9, 0x3c, 0x9d, 0xbb, 0x7d, 0xbf, 0x3e, 0xce, 0x04, 0x3e, 0x84, 0xef, 0x3d, 0x3d, 0x14, 0xe8, 0x67, 0xbf, 0x4c, 0x8a, 0xd7, 0x3e, 0x7b, 0xf2, 0xb0, 0x3d, 0xa0, 0x4e, 0x69, 0xbf, 0xcc, 0x0d, 0xce, 0x3e, 0xbb, 0x5e, 0x9a, 0xbc, 0xd5, 0xec, 0x7d, 0xbf, 0x71, 0xab, 0x00, 0x3e, 0xfd, 0xbc, 0x69, 0xbd, 0xa3, 0xe9, 0x68, 0xbf, 0x29, 0x78, 0xd2, 0x3e, 0x9a, 0xb2, 0xb3, 0x3d, 0x20, 0xea, 0x7e, 0xbf, 0x3e, 0x41, 0xe2, 0x3c, +0xe5, 0x2b, 0x01, 0x3e, 0x3f, 0x8d, 0x47, 0xbf, 0xfd, 0x12, 0x1d, 0x3f, 0x77, 0x86, 0x89, 0x3d, 0xff, 0xb3, 0x42, 0xbf, 0x4c, 0x52, 0x25, 0x3f, 0x2b, 0x68, 0x9a, 0x3d, 0x33, 0xa7, 0x13, 0xbf, 0x4b, 0x3c, 0x50, 0x3f, 0xf1, 0x66, 0x1d, 0x3e, 0xc6, 0xa4, 0x1b, 0xbf, 0xd3, 0x67, 0x47, 0x3f, 0x43, 0x91, 0xae, 0xbd, 0x8e, 0x93, 0x42, 0xbf, 0x85, 0xec, 0x24, 0x3f, 0x6a, 0x14, 0xd2, 0xbd, 0x90, 0xf5, 0x10, 0xbf, 0x1c, 0x5d, 0x51, 0x3f, 0x7c, 0xb4, 0x38, 0x3d, 0x12, 0x2d, 0x69, 0xbe, +0xd2, 0x01, 0x79, 0x3f, 0x6f, 0x0c, 0x41, 0x3d, 0xd9, 0x22, 0x09, 0xbe, 0x1e, 0x68, 0x7d, 0x3f, 0xc4, 0xed, 0xd0, 0x3b, 0x29, 0x91, 0x74, 0xbe, 0x03, 0x96, 0x78, 0x3f, 0x5b, 0x5e, 0xb9, 0x3b, 0x9d, 0xba, 0x22, 0xbe, 0x1f, 0xbe, 0x7c, 0x3f, 0x0f, 0x27, 0x70, 0x3d, 0xb1, 0x6f, 0x27, 0xbd, 0x5c, 0x58, 0x7f, 0x3f, 0x38, 0xf8, 0x42, 0x3b, 0x74, 0x42, 0x68, 0xbd, 0x4a, 0x96, 0x7f, 0x3f, 0x6f, 0x0c, 0x41, 0x3d, 0xd9, 0x22, 0x09, 0xbe, 0x1e, 0x68, 0x7d, 0x3f, 0xc0, 0xb2, 0x02, 0x3e, +0xed, 0x28, 0xee, 0xbd, 0xa6, 0x27, 0x7c, 0x3f, 0x0f, 0x27, 0x70, 0x3d, 0xb1, 0x6f, 0x27, 0xbd, 0x5c, 0x58, 0x7f, 0x3f, 0x07, 0xef, 0x1b, 0x3e, 0xf5, 0xbe, 0x71, 0xbc, 0x72, 0xfc, 0x7c, 0x3f, 0x56, 0x11, 0xce, 0x3d, 0x76, 0x15, 0x52, 0xbe, 0x1d, 0x3a, 0x79, 0x3f, 0x7c, 0xb4, 0x38, 0x3d, 0x12, 0x2d, 0x69, 0xbe, 0xd2, 0x01, 0x79, 0x3f, 0xf9, 0xd7, 0x72, 0x3d, 0x30, 0x9c, 0x8b, 0x3d, 0x06, 0xf4, 0x7e, 0x3f, 0x29, 0x05, 0xdd, 0xbb, 0x42, 0x5a, 0x63, 0x3d, 0x80, 0x99, 0x7f, 0x3f, +0x0f, 0x9c, 0xb3, 0xbc, 0xe9, 0xf2, 0x26, 0x3e, 0x23, 0x83, 0x7c, 0x3f, 0x58, 0x1c, 0x4e, 0x3d, 0x06, 0xf6, 0x38, 0x3e, 0xa7, 0x75, 0x7b, 0x3f, 0x58, 0x1c, 0x4e, 0x3d, 0x06, 0xf6, 0x38, 0x3e, 0xa7, 0x75, 0x7b, 0x3f, 0xf9, 0xd7, 0x72, 0x3d, 0x30, 0x9c, 0x8b, 0x3d, 0x06, 0xf4, 0x7e, 0x3f, 0x57, 0xec, 0x1f, 0x3e, 0x99, 0xf2, 0x61, 0x3e, 0xf7, 0x77, 0x76, 0x3f, 0x69, 0xaa, 0x27, 0x3e, 0xb0, 0xe4, 0xca, 0x3d, 0xb3, 0x44, 0x7b, 0x3f, 0x7e, 0x71, 0xa9, 0x3c, 0x30, 0xbc, 0xa2, 0x3e, +0xc1, 0xaa, 0x72, 0x3f, 0x15, 0x01, 0x4e, 0xbd, 0x91, 0x2a, 0xa2, 0x3e, 0x74, 0x7a, 0x72, 0x3f, 0x65, 0xfe, 0xb1, 0xbd, 0x38, 0xd6, 0x05, 0x3f, 0x72, 0x17, 0x59, 0x3f, 0xbb, 0x2a, 0xd0, 0xbc, 0xb4, 0xaf, 0x08, 0x3f, 0x7d, 0x5b, 0x58, 0x3f, 0xbb, 0x2a, 0xd0, 0xbc, 0xb4, 0xaf, 0x08, 0x3f, 0x7d, 0x5b, 0x58, 0x3f, 0x7e, 0x71, 0xa9, 0x3c, 0x30, 0xbc, 0xa2, 0x3e, 0xc1, 0xaa, 0x72, 0x3f, 0xa9, 0x4f, 0x92, 0x3d, 0xce, 0x1a, 0x04, 0x3f, 0x7b, 0x84, 0x5a, 0x3f, 0xfc, 0xc7, 0x02, 0x3e, +0x9e, 0xb6, 0xb6, 0x3e, 0x08, 0xe6, 0x6c, 0x3f, 0xfc, 0x55, 0xa0, 0x3d, 0x3b, 0xc6, 0x3d, 0x3f, 0x61, 0xa5, 0x2a, 0x3f, 0xc2, 0x13, 0x7a, 0xbd, 0x63, 0x42, 0x44, 0x3f, 0xa5, 0xa0, 0x23, 0x3f, 0x1f, 0x83, 0x55, 0x3e, 0xeb, 0xe1, 0x2b, 0x3f, 0x88, 0x0d, 0x36, 0x3f, 0x6a, 0x67, 0xa0, 0x3e, 0x77, 0xd9, 0xff, 0x3e, 0xdc, 0xbb, 0x4e, 0x3f, 0x86, 0xe3, 0xc1, 0x3e, 0x42, 0x05, 0x9f, 0x3e, 0xe4, 0x31, 0x5f, 0x3f, 0xa0, 0xf9, 0xcc, 0x3e, 0x85, 0xee, 0xf2, 0x3d, 0xae, 0x9d, 0x68, 0x3f, +0x9b, 0x59, 0xc3, 0x3e, 0x7d, 0x25, 0x90, 0xbd, 0x6f, 0xf2, 0x6b, 0x3f, 0xb6, 0x83, 0xa9, 0x3e, 0xcf, 0x2c, 0x69, 0xbe, 0x3c, 0x6c, 0x6a, 0x3f, 0xd4, 0x46, 0x85, 0x3e, 0x7b, 0xdd, 0xba, 0xbe, 0xe9, 0xd5, 0x64, 0x3f, 0xbb, 0x62, 0x36, 0x3e, 0xd5, 0x3d, 0xf2, 0xbe, 0x97, 0xe0, 0x5c, 0x3f, 0x79, 0x20, 0x92, 0x3d, 0x74, 0x5d, 0xf8, 0xbe, 0xe6, 0x1d, 0x5f, 0x3f, 0xad, 0xfc, 0x02, 0xbe, 0xee, 0x98, 0xd2, 0xbe, 0x35, 0x08, 0x67, 0x3f, 0x60, 0x58, 0x5e, 0xbe, 0xa1, 0x67, 0x8b, 0xbe, +0x72, 0xf9, 0x6f, 0x3f, 0x52, 0x7e, 0x92, 0xbe, 0x0e, 0xa1, 0xea, 0xbd, 0xb5, 0x89, 0x73, 0x3f, 0x91, 0x7d, 0x98, 0xbe, 0x19, 0x8e, 0x67, 0x3c, 0xf7, 0x5a, 0x74, 0x3f, 0x6f, 0xb7, 0x84, 0xbe, 0xb6, 0xba, 0x1c, 0x3e, 0x2e, 0x20, 0x74, 0x3f, 0xaa, 0x9b, 0x5b, 0xbe, 0x90, 0xbc, 0xa3, 0x3e, 0xd9, 0x42, 0x6c, 0x3f, 0x99, 0xf3, 0xc4, 0xbe, 0xb6, 0xf6, 0x5e, 0x3e, 0x1f, 0xa2, 0x65, 0x3f, 0x5a, 0x0d, 0x89, 0xbe, 0x30, 0x12, 0xd2, 0x3e, 0x2c, 0x2d, 0x5f, 0x3f, 0xf0, 0x8b, 0x1b, 0xbe, +0x04, 0x55, 0x07, 0x3f, 0xff, 0xcb, 0x55, 0x3f, 0xd2, 0x50, 0x13, 0xbe, 0x80, 0xb9, 0x22, 0x3f, 0x6f, 0x2a, 0x42, 0x3f, 0x87, 0x34, 0xaa, 0x3c, 0x1a, 0x33, 0x5d, 0x3f, 0xdb, 0xc1, 0x00, 0x3f, 0x6a, 0x50, 0xd4, 0xbd, 0xf7, 0x3c, 0x97, 0x3e, 0xe6, 0x21, 0x73, 0x3f, 0x2f, 0xc1, 0x29, 0xbe, 0xee, 0x5c, 0xa0, 0x3e, 0xfa, 0x62, 0x6f, 0x3f, 0xcc, 0x5d, 0xab, 0xbd, 0xbc, 0x5c, 0xfc, 0x3e, 0xd9, 0xb5, 0x5d, 0x3f, 0x87, 0x6b, 0xf5, 0xbd, 0xb3, 0xb3, 0xf0, 0x3e, 0x94, 0xda, 0x5f, 0x3f, +0x56, 0x61, 0xb3, 0xbd, 0x34, 0x4b, 0x46, 0x3f, 0x2d, 0x5a, 0x20, 0x3f, 0x48, 0x8b, 0x83, 0xbe, 0x35, 0xd0, 0xfc, 0xbd, 0x4e, 0x61, 0x75, 0x3f, 0xfa, 0xd1, 0x90, 0xbe, 0xe6, 0x05, 0x58, 0x3c, 0xcf, 0x85, 0x75, 0x3f, 0x1d, 0xe8, 0xc1, 0xbe, 0x70, 0xb2, 0x8d, 0xbe, 0xf8, 0x16, 0x62, 0x3f, 0xfb, 0x78, 0xe0, 0xbe, 0x67, 0x9a, 0x90, 0xbd, 0xab, 0x5f, 0x65, 0x3f, 0xf2, 0x06, 0xc8, 0xbe, 0xc6, 0x68, 0x8d, 0xbe, 0x47, 0xcc, 0x60, 0x3f, 0xcb, 0x13, 0xe0, 0xbe, 0x74, 0x25, 0x82, 0xbd, +0x0b, 0x9b, 0x65, 0x3f, 0xf8, 0xc6, 0x80, 0xbe, 0x78, 0xd0, 0xdc, 0xbe, 0xbc, 0xcf, 0x5d, 0x3f, 0x80, 0x80, 0x8d, 0xbe, 0x71, 0x93, 0xe9, 0xbe, 0x00, 0x8b, 0x58, 0x3f, 0xc3, 0xd3, 0x4b, 0xbe, 0x64, 0x3f, 0x9b, 0xbe, 0xff, 0x90, 0x6e, 0x3f, 0xd0, 0x99, 0x8c, 0xbe, 0x31, 0x7e, 0x0a, 0x3e, 0x02, 0xb6, 0x73, 0x3f, 0x61, 0xe2, 0x7f, 0xbe, 0x95, 0x82, 0x96, 0x3e, 0xbe, 0x2d, 0x6c, 0x3f, 0xcd, 0x5a, 0xe2, 0xbe, 0xbc, 0xe8, 0xcb, 0x3d, 0x4c, 0x34, 0x64, 0x3f, 0xa9, 0x6b, 0xd5, 0xbe, +0x33, 0x6d, 0x97, 0x3e, 0x91, 0x09, 0x5c, 0x3f, 0x8b, 0x6f, 0xe0, 0xbe, 0xd8, 0x7d, 0xe7, 0x3d, 0x5b, 0x44, 0x64, 0x3f, 0x5f, 0x5f, 0xd3, 0xbe, 0xd0, 0xed, 0xa5, 0x3e, 0x1d, 0xe8, 0x59, 0x3f, 0x95, 0x27, 0x20, 0x3e, 0x6d, 0xaa, 0xfe, 0xbe, 0x86, 0x72, 0x5a, 0x3f, 0xf4, 0x86, 0x7b, 0x3d, 0xb8, 0x22, 0x09, 0xbf, 0x2d, 0x99, 0x57, 0x3f, 0xd5, 0xcd, 0x05, 0x3d, 0xbf, 0xef, 0xef, 0xbe, 0xb9, 0xfe, 0x61, 0x3f, 0x22, 0xff, 0x4c, 0x3d, 0x99, 0x2b, 0x0f, 0xbf, 0xcb, 0xd5, 0x53, 0x3f, +0x4c, 0xa4, 0xf4, 0x3d, 0xe7, 0x6e, 0xe7, 0xbe, 0x1f, 0x4c, 0x62, 0x3f, 0xd7, 0x50, 0x1a, 0x3e, 0x61, 0x50, 0x06, 0xbf, 0x52, 0x7e, 0x56, 0x3f, 0x4c, 0xa4, 0xf4, 0x3d, 0xe7, 0x6e, 0xe7, 0xbe, 0x1f, 0x4c, 0x62, 0x3f, 0xd7, 0x50, 0x1a, 0x3e, 0x61, 0x50, 0x06, 0xbf, 0x52, 0x7e, 0x56, 0x3f, 0xad, 0xbf, 0x55, 0x3e, 0x2b, 0x14, 0xb9, 0xbe, 0x6a, 0xa1, 0x68, 0x3f, 0x0b, 0x79, 0x74, 0x3e, 0x7b, 0xbd, 0xd3, 0xbe, 0x4e, 0xed, 0x60, 0x3f, 0x3f, 0xff, 0x6d, 0x3e, 0x7b, 0x86, 0xc8, 0xbe, +0x21, 0xe9, 0x63, 0x3f, 0x4a, 0xd3, 0x00, 0xbe, 0xa5, 0x15, 0xe7, 0xbe, 0x30, 0x29, 0x62, 0x3f, 0x3c, 0xc0, 0x03, 0xbe, 0x84, 0x63, 0xee, 0xbe, 0xbb, 0x26, 0x60, 0x3f, 0x2c, 0x9e, 0x1a, 0xbe, 0x74, 0xed, 0x07, 0xbf, 0x04, 0x76, 0x55, 0x3f, 0x83, 0x6c, 0x91, 0x3e, 0x6a, 0xdb, 0x70, 0xbe, 0xd3, 0xf4, 0x6d, 0x3f, 0xee, 0xee, 0x89, 0x3e, 0x57, 0x92, 0x4c, 0xbe, 0x17, 0x2c, 0x71, 0x3f, 0xdc, 0x47, 0x96, 0x3e, 0xde, 0x39, 0x74, 0xbe, 0x3f, 0xfc, 0x6c, 0x3f, 0xf9, 0x86, 0x92, 0x3e, +0x4c, 0x53, 0x04, 0xbd, 0x2d, 0x27, 0x75, 0x3f, 0xf1, 0x2e, 0x9f, 0x3e, 0x14, 0x75, 0x66, 0xbd, 0xda, 0xe2, 0x72, 0x3f, 0xda, 0x1f, 0xa0, 0x3e, 0xf4, 0xfb, 0x7e, 0xbd, 0xb1, 0xa2, 0x72, 0x3f, 0xca, 0x35, 0xa5, 0x3e, 0x8b, 0x18, 0xf6, 0x3d, 0x8a, 0x58, 0x70, 0x3f, 0x60, 0xc8, 0x92, 0x3e, 0x5d, 0x6e, 0x00, 0x3e, 0xc8, 0x24, 0x73, 0x3f, 0x9f, 0x38, 0xa0, 0x3e, 0xbf, 0x7d, 0xfd, 0x3d, 0xae, 0x11, 0x71, 0x3f, 0xef, 0x36, 0x8f, 0x3e, 0xed, 0x9c, 0x96, 0x3e, 0xcf, 0xf5, 0x69, 0x3f, +0x70, 0x99, 0x9b, 0x3e, 0x85, 0x97, 0xa0, 0x3e, 0x87, 0x4b, 0x66, 0x3f, 0xe1, 0x42, 0x9e, 0x3e, 0x55, 0x6d, 0x9f, 0x3e, 0x2c, 0x0b, 0x66, 0x3f, 0x4b, 0xe9, 0x19, 0x3d, 0x49, 0xf4, 0x4e, 0x3f, 0xa2, 0x60, 0x16, 0x3f, 0x82, 0xe4, 0x2d, 0x3e, 0xf1, 0xd9, 0x32, 0x3f, 0x7c, 0xed, 0x31, 0x3f, 0xff, 0x05, 0x82, 0xba, 0x0a, 0xbc, 0x47, 0x3f, 0xaf, 0x21, 0x20, 0x3f, 0xc4, 0x93, 0x0d, 0x3e, 0x49, 0x69, 0x2e, 0x3f, 0x81, 0x05, 0x38, 0x3f, 0x52, 0xd4, 0x99, 0x3c, 0xf2, 0x96, 0x53, 0x3f, +0x07, 0x06, 0x10, 0x3f, 0xdc, 0x67, 0x25, 0x3e, 0x89, 0x27, 0x37, 0x3f, 0x4f, 0x03, 0x2e, 0x3f, 0xd4, 0xb7, 0xcc, 0xbd, 0xc4, 0x27, 0x4d, 0x3f, 0xbe, 0xf8, 0x16, 0x3f, 0xff, 0x05, 0x82, 0xba, 0x0a, 0xbc, 0x47, 0x3f, 0xaf, 0x21, 0x20, 0x3f, 0xf6, 0x07, 0xca, 0xbd, 0xee, 0x5a, 0x5a, 0x3f, 0xe7, 0x38, 0x03, 0x3f, 0x52, 0xd4, 0x99, 0x3c, 0xf2, 0x96, 0x53, 0x3f, 0x07, 0x06, 0x10, 0x3f, 0xfd, 0x4c, 0x9d, 0xbd, 0xcc, 0x96, 0x50, 0x3f, 0x04, 0x1b, 0x13, 0x3f, 0xb6, 0x9d, 0x86, 0x3e, +0xc8, 0xea, 0x02, 0x3f, 0x6d, 0x71, 0x51, 0x3f, 0xa1, 0x66, 0x78, 0x3e, 0x0b, 0xea, 0xfb, 0x3e, 0xfa, 0x0a, 0x56, 0x3f, 0x2c, 0x9a, 0x86, 0x3e, 0xe0, 0x81, 0x05, 0x3f, 0xbc, 0xcd, 0x4f, 0x3f, 0xfc, 0x34, 0x3e, 0xbe, 0x0e, 0xd8, 0xfd, 0x3e, 0x34, 0x2d, 0x59, 0x3f, 0x7b, 0x16, 0x24, 0xbe, 0xac, 0xe3, 0x38, 0x3f, 0x4f, 0x3f, 0x2c, 0x3f, 0x20, 0xd4, 0x15, 0xbe, 0xe8, 0xd8, 0x45, 0x3f, 0x8c, 0x14, 0x1e, 0x3f, 0x3b, 0x1c, 0xa5, 0xbe, 0x67, 0x61, 0x07, 0x3f, 0xbe, 0xfa, 0x48, 0x3f, +0x0c, 0xcb, 0x9f, 0xbe, 0xb9, 0xc6, 0x13, 0x3f, 0x91, 0x2b, 0x41, 0x3f, 0xf7, 0xca, 0x9c, 0xbd, 0xdc, 0x45, 0x4c, 0x3f, 0xe5, 0x0c, 0x19, 0x3f, 0xe0, 0x9f, 0x92, 0xbd, 0x72, 0x15, 0x57, 0x3f, 0x95, 0x9e, 0x09, 0x3f, 0xf3, 0xe7, 0xdb, 0xbd, 0x9d, 0x65, 0x4e, 0x3f, 0x9e, 0xee, 0x14, 0x3f, 0xba, 0x65, 0xe7, 0xbd, 0xc7, 0x49, 0x59, 0x3f, 0x4f, 0x3b, 0x04, 0x3f, 0x1d, 0x3c, 0x93, 0xbe, 0x39, 0xee, 0x94, 0xbc, 0x7d, 0x24, 0x75, 0x3f, 0xfc, 0xc5, 0x7c, 0xbe, 0x31, 0xce, 0x1f, 0xbe, +0xf5, 0xd6, 0x74, 0x3f, 0xaa, 0xb8, 0x31, 0xbe, 0x15, 0xe3, 0x94, 0xbe, 0xad, 0xdf, 0x70, 0x3f, 0x71, 0x04, 0x91, 0xbe, 0xe1, 0x40, 0x68, 0x3e, 0x54, 0x8d, 0x6e, 0x3f, 0xb9, 0x55, 0x98, 0xbe, 0x8c, 0xbf, 0xcd, 0x3d, 0xaa, 0x0c, 0x73, 0x3f, 0x4d, 0xd7, 0x93, 0x3d, 0xb5, 0x88, 0xa8, 0xbe, 0xab, 0x06, 0x71, 0x3f, 0x99, 0x2c, 0x6e, 0x3c, 0x29, 0x24, 0xa9, 0xbe, 0x46, 0x99, 0x71, 0x3f, 0x4d, 0xd7, 0x93, 0x3d, 0xb5, 0x88, 0xa8, 0xbe, 0xab, 0x06, 0x71, 0x3f, 0x00, 0xc8, 0x19, 0x3e, +0x61, 0xaa, 0x89, 0xbe, 0x8f, 0x8e, 0x73, 0x3f, 0xf7, 0x5b, 0xbb, 0xbd, 0x65, 0xc7, 0xae, 0xbe, 0xd5, 0x7a, 0x6f, 0x3f, 0xa7, 0x03, 0x59, 0x3e, 0x65, 0xe0, 0x10, 0xbe, 0xa8, 0x8c, 0x77, 0x3f, 0x7b, 0x32, 0x6f, 0x3e, 0x10, 0x91, 0x1a, 0xbc, 0xef, 0xe7, 0x78, 0x3f, 0x23, 0x9c, 0x76, 0x3e, 0x73, 0x82, 0xf6, 0x3d, 0x15, 0x8c, 0x76, 0x3f, 0xdc, 0x65, 0x6f, 0x3e, 0x4b, 0x56, 0x85, 0x3e, 0xa2, 0xcf, 0x6f, 0x3f, 0xf2, 0xb6, 0xd2, 0x3d, 0xb1, 0xf9, 0x1c, 0x3f, 0x73, 0x80, 0x48, 0x3f, +0x53, 0x07, 0xf9, 0xbc, 0x3b, 0xab, 0x31, 0x3f, 0xf6, 0x24, 0x38, 0x3f, 0x6b, 0x27, 0xca, 0xbd, 0xc9, 0xe8, 0x2c, 0x3f, 0x1e, 0x15, 0x3b, 0x3f, 0x53, 0x07, 0xf9, 0xbc, 0x3b, 0xab, 0x31, 0x3f, 0xf6, 0x24, 0x38, 0x3f, 0x06, 0xd6, 0x51, 0x3e, 0x64, 0x90, 0xdb, 0x3e, 0xcd, 0x3c, 0x61, 0x3f, 0x9c, 0x88, 0x6e, 0xbe, 0xe7, 0xa9, 0xc6, 0x3e, 0x6a, 0x48, 0x64, 0x3f, 0x87, 0xa7, 0x07, 0xbe, 0x4a, 0xb2, 0x0e, 0x3f, 0x70, 0xd1, 0x51, 0x3f, 0xfa, 0x63, 0x9a, 0xbd, 0x89, 0x7d, 0x22, 0x3f, +0x65, 0xe0, 0x44, 0x3f, 0x4b, 0x59, 0xc6, 0xbd, 0xba, 0x10, 0x27, 0x3f, 0x95, 0x61, 0x40, 0x3f, 0xa3, 0x3a, 0xbd, 0xbd, 0xdb, 0x6e, 0x02, 0x3f, 0x97, 0x01, 0x5b, 0x3f, 0x08, 0x74, 0xa6, 0xbd, 0xf9, 0x12, 0xa2, 0x3e, 0x39, 0xf1, 0x71, 0x3f, 0x85, 0xce, 0x8b, 0xbd, 0xea, 0x23, 0x30, 0x3e, 0xff, 0x93, 0x7b, 0x3f, 0xf7, 0x72, 0x5f, 0xbd, 0x1d, 0xc9, 0x85, 0x3d, 0x3c, 0x12, 0x7f, 0x3f, 0x55, 0x86, 0x31, 0xbd, 0x7e, 0x1e, 0x63, 0xbd, 0x78, 0x5d, 0x7f, 0x3f, 0x9d, 0xbc, 0x08, 0xbd, +0x35, 0xf0, 0x23, 0xbe, 0xb0, 0x8d, 0x7c, 0x3f, 0x2b, 0x89, 0xec, 0xbc, 0xa6, 0x3f, 0x7b, 0xbe, 0x84, 0x10, 0x78, 0x3f, 0xc6, 0x69, 0x08, 0xbd, 0x45, 0x0f, 0xac, 0xbe, 0x06, 0xf6, 0x70, 0x3f, 0x89, 0x7e, 0x2d, 0xbd, 0x9a, 0x78, 0xef, 0xbe, 0x4f, 0x03, 0x62, 0x3f, 0x0a, 0xbd, 0x3e, 0xbd, 0xc0, 0x5d, 0x0e, 0xbf, 0xa4, 0x6d, 0x54, 0x3f, 0x0d, 0x50, 0x1a, 0xbd, 0x1a, 0xfd, 0x04, 0xbf, 0x9c, 0x88, 0x5a, 0x3f, 0x55, 0xdc, 0xb8, 0xbc, 0x59, 0x33, 0xea, 0xbe, 0x14, 0x93, 0x63, 0x3f, +0x60, 0x5a, 0x54, 0xbc, 0x15, 0x90, 0x0e, 0xbf, 0xdd, 0x9a, 0x54, 0x3f, 0xb8, 0x5c, 0xfd, 0xbb, 0xd2, 0xfd, 0x40, 0xbf, 0x73, 0x2f, 0x28, 0x3f, 0x34, 0x83, 0x78, 0xbb, 0x28, 0x44, 0x68, 0xbf, 0x56, 0x4a, 0xd7, 0x3e, 0x0b, 0x9a, 0x96, 0xba, 0xcf, 0xbf, 0x7d, 0xbf, 0xb3, 0x7a, 0x07, 0x3e, 0x63, 0x28, 0x03, 0x3f, 0xa6, 0x7d, 0x5b, 0xbf, 0x0d, 0xc6, 0x48, 0x3d, 0xec, 0x9e, 0x34, 0x3f, 0x32, 0x55, 0x34, 0xbf, 0xc6, 0x6b, 0x9e, 0x3d, 0x71, 0x1c, 0x98, 0x3e, 0x70, 0x5e, 0x74, 0xbf, +0x90, 0x87, 0xbe, 0x3c, 0xac, 0xc5, 0x57, 0x3f, 0x45, 0x65, 0x07, 0xbf, 0x0a, 0x63, 0xcb, 0x3d, 0x63, 0x25, 0x6e, 0x3f, 0x03, 0x98, 0xb2, 0xbe, 0x89, 0x06, 0xe9, 0x3d, 0x99, 0xd5, 0x77, 0x3f, 0x62, 0x9c, 0x5f, 0xbe, 0xbb, 0x97, 0xfb, 0x3d, 0x3a, 0x91, 0x7c, 0x3f, 0x77, 0xbb, 0xbe, 0xbd, 0x6c, 0x3f, 0x09, 0x3e, 0x43, 0x55, 0x7c, 0x3f, 0x07, 0x0b, 0xa7, 0x3d, 0xe9, 0x28, 0x17, 0x3e, 0x5b, 0xeb, 0x73, 0x3f, 0xdf, 0xfe, 0x84, 0x3e, 0x83, 0xdd, 0x20, 0x3e, 0xd7, 0x13, 0x65, 0x3f, +0x4c, 0xdd, 0xd5, 0x3e, 0x81, 0x3e, 0x21, 0x3e, 0xca, 0x17, 0x58, 0x3f, 0x39, 0xd0, 0x03, 0x3f, 0xb9, 0x1a, 0x19, 0x3e, 0x0f, 0x29, 0x46, 0x3f, 0x1c, 0x60, 0x1e, 0x3f, 0x77, 0xbc, 0x09, 0x3e, 0x9a, 0x7b, 0x2c, 0x3f, 0x42, 0xb0, 0x3a, 0x3f, 0x91, 0x5e, 0xf4, 0x3d, 0x63, 0x23, 0x18, 0x3f, 0xa5, 0xbb, 0x4b, 0x3f, 0x64, 0xb1, 0xed, 0x3d, 0x7d, 0x3f, 0x05, 0x3f, 0xa0, 0x89, 0x58, 0x3f, 0xca, 0xfd, 0xee, 0x3d, 0x40, 0x6b, 0x06, 0x3f, 0xb6, 0x85, 0x57, 0x3f, 0xac, 0x36, 0xff, 0x3d, +0xd3, 0xfa, 0x43, 0x3f, 0xb3, 0x25, 0x1f, 0x3f, 0x20, 0xb5, 0x29, 0x3e, 0xcb, 0xda, 0xc6, 0x3d, 0x8e, 0xc9, 0x7e, 0xbf, 0xa0, 0x6e, 0xa0, 0x3b, 0x83, 0xbe, 0x10, 0xbf, 0x08, 0x39, 0x4f, 0x3f, 0xcb, 0x2c, 0x22, 0x3e, 0x02, 0x7f, 0x1c, 0xbf, 0xfd, 0x11, 0x4a, 0x3f, 0xbe, 0x4b, 0x69, 0x3d, 0xc6, 0xbf, 0x6b, 0xbf, 0xeb, 0xfe, 0x71, 0x3e, 0x1b, 0xb9, 0x9e, 0x3e, 0x89, 0xb7, 0x7a, 0xbf, 0xff, 0x77, 0x14, 0x3e, 0x73, 0x2f, 0x10, 0x3e, 0xc1, 0xfd, 0x3c, 0xbf, 0x56, 0x99, 0xb9, 0xbe, +0xe4, 0x9f, 0x11, 0x3f, 0x9a, 0x96, 0x54, 0xbf, 0xa9, 0x66, 0xd6, 0xbe, 0xfe, 0x26, 0xbc, 0x3e, 0x90, 0x30, 0x58, 0xbf, 0x9e, 0x45, 0xff, 0xbe, 0x38, 0x48, 0x48, 0x3e, 0x60, 0x06, 0x2b, 0xbf, 0x9e, 0xb7, 0x35, 0xbf, 0xbc, 0x92, 0x64, 0x3e, 0xe5, 0x29, 0x23, 0xbf, 0xbd, 0x35, 0x2c, 0xbf, 0x19, 0x6e, 0xc0, 0x3e, 0x85, 0xcc, 0x0d, 0xbf, 0x65, 0xc7, 0x22, 0xbf, 0x07, 0x98, 0x09, 0x3f, 0x8e, 0x3f, 0xb1, 0xbe, 0xac, 0x02, 0x95, 0xbe, 0x50, 0x52, 0x64, 0x3f, 0xfc, 0x70, 0x10, 0xbf, +0xc3, 0x46, 0xa9, 0xbe, 0x36, 0xac, 0x41, 0x3f, 0x11, 0x52, 0xdf, 0xbe, 0x35, 0x0d, 0x1e, 0xbf, 0xff, 0x97, 0x27, 0x3f, 0xc4, 0x5e, 0x88, 0xbe, 0xb7, 0xec, 0x20, 0xbf, 0x5e, 0x0e, 0x3b, 0x3f, 0xb1, 0xa8, 0xc8, 0xbd, 0x92, 0xce, 0x80, 0xbe, 0x52, 0x7e, 0x76, 0x3f, 0x01, 0xf6, 0xb1, 0xbd, 0x9d, 0xd7, 0x24, 0xbf, 0xee, 0x98, 0x42, 0x3f, 0xf1, 0x2e, 0xf7, 0x3d, 0xeb, 0x01, 0x33, 0xbf, 0xc8, 0x61, 0x34, 0x3f, 0x41, 0x0f, 0x35, 0x3e, 0x60, 0x3f, 0x64, 0xbe, 0x87, 0x6b, 0x75, 0x3f, +0x0d, 0xfe, 0xbe, 0x3e, 0xa5, 0x86, 0x2e, 0xbf, 0xc1, 0x1c, 0x21, 0x3f, 0xa5, 0x2d, 0xee, 0x3e, 0xfc, 0xfd, 0x42, 0xbe, 0xf4, 0x4e, 0x5d, 0x3f, 0xac, 0xc9, 0x3f, 0x3f, 0x0c, 0xce, 0x10, 0xbe, 0xac, 0xa8, 0x25, 0x3f, 0xd5, 0x73, 0x12, 0x3f, 0x20, 0x99, 0x2e, 0xbf, 0x03, 0x44, 0xe9, 0x3e, 0xcc, 0xf0, 0x7b, 0x3f, 0xed, 0x9e, 0xbc, 0x3c, 0x93, 0x18, 0x34, 0x3e, 0x8e, 0x05, 0x3d, 0x3f, 0x0e, 0x14, 0x28, 0xbf, 0xc0, 0xce, 0x1d, 0x3e, 0x48, 0xdc, 0xc3, 0xbd, 0xc8, 0x07, 0x45, 0x3f, +0x74, 0x9a, 0x21, 0x3f, 0x1d, 0xe8, 0xe1, 0xbd, 0x50, 0x6f, 0x7e, 0xbf, 0x2d, 0x27, 0xa1, 0x3b, 0x27, 0x4f, 0xa1, 0xbe, 0x4f, 0xeb, 0x72, 0xbf, 0x36, 0x3e, 0x93, 0x3c, 0xeb, 0x57, 0xea, 0xbe, 0x92, 0x76, 0x63, 0xbf, 0x54, 0x3b, 0x03, 0x3d, 0xfa, 0xcf, 0x16, 0xbf, 0x90, 0xa2, 0x4e, 0xbf, 0xc9, 0xcb, 0x1a, 0x3d, 0x29, 0x93, 0x02, 0x3f, 0xc8, 0xce, 0x5b, 0xbf, 0x77, 0x12, 0x51, 0xbd, 0x7d, 0xcb, 0x34, 0x3f, 0x00, 0x00, 0x34, 0xbf, 0xb5, 0x8b, 0xa9, 0xbd, 0xb5, 0xc0, 0x96, 0x3e, +0x81, 0x94, 0x74, 0xbf, 0x68, 0x40, 0xbd, 0xbc, 0x57, 0x07, 0x58, 0x3f, 0x60, 0x73, 0x06, 0xbf, 0xa6, 0xf0, 0xe0, 0xbd, 0xb7, 0xd0, 0x6d, 0x3f, 0xcc, 0x5f, 0xb1, 0xbe, 0x5d, 0x88, 0x05, 0xbe, 0x77, 0xf5, 0x76, 0x3f, 0x10, 0xae, 0x60, 0xbe, 0xc0, 0x3f, 0x15, 0xbe, 0x8e, 0x5c, 0x7b, 0x3f, 0x2b, 0xbd, 0xd6, 0xbd, 0xa5, 0xa2, 0x21, 0xbe, 0x9d, 0x29, 0x7c, 0x3f, 0x68, 0x03, 0x70, 0x3d, 0x81, 0x22, 0x26, 0xbe, 0xf0, 0x4b, 0x75, 0x3f, 0xde, 0x1e, 0x74, 0x3e, 0x18, 0x08, 0x22, 0xbe, +0xba, 0xd7, 0x65, 0x3f, 0x72, 0xfd, 0xd3, 0x3e, 0x65, 0x8a, 0x19, 0xbe, 0x05, 0x50, 0x54, 0x3f, 0x80, 0xba, 0x09, 0x3f, 0x87, 0x6a, 0x1a, 0xbe, 0x40, 0xbe, 0x28, 0x3f, 0x10, 0x04, 0x3c, 0x3f, 0x67, 0x7e, 0x25, 0xbe, 0xa1, 0x67, 0x3f, 0x3f, 0xc5, 0x00, 0x25, 0x3f, 0x43, 0xab, 0x23, 0xbe, 0x1e, 0xe2, 0x1f, 0x3d, 0x1a, 0xc4, 0x7f, 0x3f, 0x0a, 0xd8, 0x8e, 0x3c, 0x2a, 0x8d, 0x98, 0x3c, 0xf7, 0x72, 0x7f, 0x3f, 0x9c, 0xc4, 0x80, 0xbd, 0xd9, 0xb3, 0x87, 0x3e, 0xf4, 0xa6, 0x76, 0x3f, +0xc1, 0xe3, 0x1b, 0x3d, 0x4a, 0xb6, 0x7a, 0x3e, 0x49, 0x69, 0x76, 0x3f, 0x27, 0x84, 0xee, 0xbd, 0x36, 0xcb, 0x05, 0xbe, 0x2e, 0xc9, 0x7d, 0x3f, 0x76, 0x53, 0x4a, 0x3c, 0x0a, 0x69, 0x0d, 0xbe, 0x63, 0x7b, 0x7d, 0x3f, 0xf7, 0xe6, 0xb7, 0xbc, 0x0f, 0xed, 0x8b, 0xbe, 0x6c, 0x3e, 0x76, 0x3f, 0x26, 0x8a, 0x10, 0x3c, 0x27, 0x6b, 0x8c, 0xbe, 0x27, 0x2f, 0x76, 0x3f, 0xaa, 0xb9, 0xdc, 0x39, 0x01, 0x13, 0x04, 0xbf, 0xa6, 0xee, 0x5a, 0x3f, 0x8b, 0x17, 0x4b, 0x3d, 0xa7, 0x75, 0x5b, 0xbd, +0x62, 0x85, 0x7f, 0x3f, 0x6b, 0x47, 0xf1, 0x3c, 0x3c, 0xde, 0x64, 0xbd, 0x11, 0xe0, 0x74, 0x3f, 0x72, 0x86, 0x92, 0xbe, 0xa7, 0x75, 0x5b, 0xbd, 0x62, 0x85, 0x7f, 0x3f, 0x6b, 0x47, 0xf1, 0x3c, 0xf9, 0x2f, 0xb0, 0x3e, 0xb9, 0x19, 0x66, 0x3f, 0x69, 0xfc, 0x8a, 0xbe, 0x60, 0x06, 0xbb, 0x3e, 0xd4, 0x45, 0x6e, 0x3f, 0x85, 0xb1, 0x85, 0x3c, 0xde, 0xe8, 0x73, 0xbf, 0x4a, 0x62, 0x99, 0x3e, 0x42, 0xe9, 0x4b, 0x3d, 0x65, 0x00, 0x54, 0xbf, 0xbf, 0xd1, 0x0e, 0x3f, 0xf9, 0xdb, 0x5e, 0x3d, +0xbe, 0x33, 0x36, 0xbf, 0xd1, 0x92, 0x33, 0xbf, 0xd0, 0x47, 0x19, 0x3d, 0xc9, 0xe5, 0x4f, 0xbf, 0x31, 0x27, 0x14, 0xbf, 0x3f, 0xe5, 0x98, 0xbd, 0xae, 0x81, 0x51, 0xbf, 0x5f, 0xd0, 0x12, 0xbf, 0x87, 0xa4, 0x16, 0x3d, 0x8f, 0xdf, 0x67, 0xbf, 0x8d, 0x08, 0xd6, 0xbe, 0x4a, 0xb2, 0x8e, 0xbd, 0x53, 0x07, 0x69, 0xbf, 0xc2, 0xfb, 0xd2, 0xbe, 0xaa, 0x0f, 0x24, 0x3d, 0x8b, 0xff, 0x03, 0x3f, 0x00, 0xac, 0x5a, 0x3f, 0x59, 0x6e, 0x89, 0x3d, 0xf9, 0xb8, 0x06, 0x3f, 0xd3, 0xdd, 0x55, 0x3f, +0x1e, 0x54, 0x22, 0xbe, 0x33, 0xa5, 0x35, 0x3f, 0x75, 0x90, 0x33, 0x3f, 0x57, 0x05, 0x8a, 0x3d, 0xed, 0x28, 0x36, 0x3f, 0x7f, 0x65, 0x2d, 0x3f, 0x44, 0x4e, 0x3f, 0xbe, 0x8b, 0xff, 0x03, 0x3f, 0x00, 0xac, 0x5a, 0x3f, 0x59, 0x6e, 0x89, 0x3d, 0xf9, 0xb8, 0x06, 0x3f, 0xd3, 0xdd, 0x55, 0x3f, 0x1e, 0x54, 0x22, 0xbe, 0x1e, 0x54, 0x16, 0x3f, 0x7d, 0x3d, 0x4b, 0x3f, 0x62, 0x87, 0x21, 0xbe, 0x5d, 0x37, 0x01, 0x3f, 0xb8, 0x92, 0x59, 0x3f, 0xec, 0xf9, 0x1a, 0xbe, 0xf9, 0xda, 0x27, 0x3f, +0x8c, 0x11, 0x41, 0x3f, 0x00, 0x90, 0x13, 0x3d, 0xe0, 0xbc, 0x20, 0x3f, 0x29, 0x04, 0x3e, 0x3f, 0x11, 0xc6, 0x6f, 0xbe, 0x4a, 0x5c, 0x77, 0xbf, 0xea, 0x92, 0x81, 0xbe, 0xc2, 0xde, 0x44, 0x3d, 0xcd, 0xe9, 0x7e, 0xbf, 0xe8, 0xbb, 0x9b, 0xbd, 0x01, 0x68, 0x54, 0x3d, 0xf4, 0xc5, 0x7e, 0xbf, 0x59, 0x4f, 0xad, 0x3d, 0xef, 0xad, 0x48, 0x3d, 0xd7, 0x81, 0x7b, 0xbf, 0x75, 0xe4, 0x38, 0x3e, 0x68, 0xb2, 0x3f, 0x3d, 0x9d, 0x2d, 0x00, 0x3f, 0x43, 0x73, 0x59, 0x3f, 0x38, 0xba, 0x2a, 0xbe, +0x49, 0x0f, 0x33, 0x3f, 0x67, 0x9e, 0x2c, 0x3f, 0x05, 0x88, 0x72, 0xbe, 0x61, 0x17, 0x25, 0xbf, 0x23, 0xa3, 0x43, 0x3f, 0x0d, 0xfc, 0x28, 0x3c, 0x42, 0x78, 0x28, 0xbf, 0xb4, 0xab, 0x40, 0x3f, 0x77, 0xbd, 0xb4, 0x3c, 0x32, 0x3b, 0x7f, 0xbf, 0xfd, 0x32, 0x58, 0x3d, 0xe6, 0x20, 0x68, 0x3d, 0xba, 0xbe, 0x7f, 0xbf, 0xb4, 0x21, 0xff, 0x3c, 0x1a, 0xe0, 0x02, 0x3d, 0xfc, 0xfd, 0xc2, 0x3d, 0xe0, 0xd5, 0x7e, 0xbf, 0x28, 0xef, 0x63, 0xbb, 0x01, 0x17, 0x54, 0xbf, 0x76, 0x1a, 0x0d, 0xbf, +0xc2, 0xfb, 0xca, 0x3d, 0xe0, 0x62, 0x55, 0xbf, 0xe1, 0x5e, 0x0d, 0xbf, 0x14, 0x5e, 0x82, 0x3c, 0x98, 0x4b, 0x2e, 0xbf, 0x44, 0x16, 0x39, 0xbf, 0x2a, 0xfe, 0xef, 0x3d, 0x3f, 0x52, 0x34, 0xbf, 0xf6, 0xb6, 0x35, 0xbf, 0xec, 0x84, 0x97, 0x39, 0x44, 0xc3, 0x42, 0x3f, 0x6a, 0x6d, 0x1a, 0xbf, 0xde, 0x21, 0x75, 0xbe, 0xe9, 0x45, 0x71, 0x3f, 0x28, 0x28, 0x05, 0x3e, 0x26, 0xac, 0x9d, 0xbe, 0x44, 0x32, 0x44, 0xbe, 0xb9, 0x16, 0x6d, 0xbf, 0xb3, 0x5c, 0xa6, 0xbe, 0xcd, 0x8d, 0xe9, 0xbd, +0xc7, 0x0f, 0x69, 0xbf, 0x40, 0xa0, 0xcb, 0xbe, 0x2b, 0xa2, 0x66, 0xbd, 0x68, 0x5e, 0x7e, 0xbf, 0xf5, 0xf6, 0xc7, 0xbd, 0xfd, 0x67, 0x0d, 0xbd, 0xbf, 0x0c, 0x7e, 0xbf, 0x59, 0x33, 0xf2, 0xbd, 0x64, 0x20, 0x87, 0xbe, 0xb3, 0x24, 0x70, 0xbf, 0x90, 0xdd, 0x65, 0xbe, 0xa9, 0x87, 0xa8, 0xbd, 0x96, 0x95, 0x7e, 0xbf, 0x76, 0xa5, 0x85, 0xbd, 0x0c, 0x58, 0x9a, 0xbe, 0x69, 0xfd, 0x71, 0xbf, 0x97, 0xab, 0xff, 0xbd, 0xe4, 0x49, 0xd2, 0xbd, 0x51, 0x82, 0x7e, 0xbf, 0xcc, 0x0d, 0x06, 0xbd, +0x36, 0xc8, 0x9c, 0xbe, 0x68, 0x3a, 0x73, 0xbf, 0x47, 0x1f, 0x73, 0xbd, 0xd8, 0xf4, 0xe0, 0xbd, 0xba, 0x6a, 0x7e, 0xbf, 0x78, 0x44, 0x85, 0xbc, 0xe7, 0xc6, 0x08, 0x3f, 0x6a, 0xbe, 0x2a, 0xbf, 0x17, 0xf2, 0x04, 0xbf, 0x9e, 0x3f, 0xc5, 0x3e, 0x77, 0x7f, 0x54, 0xbf, 0x93, 0x6f, 0xce, 0xbe, 0x4e, 0x63, 0xa3, 0x3e, 0x82, 0xc9, 0x25, 0xbf, 0x85, 0x22, 0x31, 0xbf, 0x9b, 0x57, 0x75, 0x3e, 0x4b, 0x1f, 0x4e, 0xbf, 0x37, 0xe1, 0x0a, 0xbf, 0x8c, 0x14, 0x6a, 0x3e, 0x58, 0x6f, 0x70, 0xbf, +0xcb, 0x2f, 0x83, 0xbe, 0xa1, 0x13, 0x22, 0x3e, 0xd4, 0x29, 0x6b, 0xbf, 0xbb, 0x63, 0xb9, 0xbe, 0x82, 0xc4, 0x36, 0xbe, 0x67, 0xb8, 0x41, 0xbf, 0xb9, 0xff, 0x20, 0xbf, 0x64, 0x76, 0x9e, 0xbe, 0x74, 0x27, 0x4c, 0xbf, 0x67, 0x96, 0x04, 0xbf, 0x79, 0x78, 0xd7, 0xbe, 0xf2, 0xee, 0x54, 0xbf, 0x3e, 0x59, 0xb9, 0xbe, 0x6d, 0xe5, 0x09, 0xbf, 0xc6, 0x6e, 0x33, 0xbf, 0xa6, 0x5e, 0xef, 0xbe, 0x30, 0xd4, 0xc9, 0xbe, 0xf2, 0x5e, 0x25, 0xbf, 0x9f, 0x58, 0x27, 0xbf, 0x44, 0x17, 0x64, 0xbe, +0xd5, 0x94, 0x14, 0xbf, 0xe8, 0x84, 0x48, 0xbf, 0x3f, 0x8b, 0xed, 0xbe, 0x77, 0xbe, 0x5b, 0xbf, 0xb1, 0x34, 0x60, 0xbe, 0x6c, 0x40, 0xec, 0xbe, 0x41, 0x60, 0x61, 0xbf, 0xa8, 0x8f, 0xe0, 0xbd, 0x8f, 0x8c, 0x19, 0xbf, 0xb2, 0x4b, 0x48, 0xbf, 0xc8, 0x98, 0x2b, 0xbe, 0xbf, 0xd4, 0x17, 0xbf, 0x22, 0x8d, 0x3e, 0xbf, 0xc0, 0x24, 0x9d, 0xbe, 0xa0, 0x6b, 0x8f, 0x3e, 0xaf, 0xcc, 0x73, 0xbf, 0x1b, 0x48, 0xf7, 0xbd, 0x71, 0x73, 0xfa, 0x3e, 0xe2, 0x91, 0x58, 0xbf, 0xeb, 0x54, 0x59, 0xbe, +0x95, 0xba, 0x2c, 0x3f, 0x9c, 0x85, 0x2d, 0xbf, 0x61, 0x8b, 0x95, 0xbe, 0xe2, 0x59, 0x36, 0x3f, 0x28, 0xd3, 0xb0, 0xbe, 0xad, 0x6b, 0x1c, 0xbf, 0x42, 0x3e, 0x24, 0x3f, 0x95, 0xf0, 0xfc, 0xbe, 0xef, 0x37, 0x16, 0xbf, 0xb0, 0x54, 0xef, 0x3e, 0x9d, 0xd5, 0xba, 0xbe, 0x32, 0x21, 0x4e, 0xbf, 0xad, 0x4c, 0xc8, 0x3e, 0x6a, 0xa3, 0xfa, 0xbe, 0x88, 0x80, 0x47, 0xbf, 0xc4, 0x09, 0x84, 0xbe, 0x81, 0xb3, 0xdc, 0xbe, 0x21, 0x5c, 0x5d, 0xbf, 0xe2, 0x93, 0xe6, 0xbe, 0x3b, 0x37, 0x05, 0xbf, +0x88, 0xbc, 0x39, 0xbf, 0x20, 0x5d, 0x1c, 0xbf, 0x4d, 0xa2, 0x16, 0xbf, 0x90, 0xa1, 0x07, 0xbf, 0x1c, 0x41, 0x2a, 0xbf, 0x59, 0x18, 0xfa, 0xbe, 0xa1, 0x9c, 0x10, 0xbf, 0x54, 0x54, 0x01, 0xbf, 0x88, 0x67, 0xd1, 0xbe, 0x4c, 0x8b, 0x42, 0xbf, 0x09, 0x34, 0xa0, 0xbe, 0x52, 0x45, 0xa1, 0xbe, 0xae, 0x62, 0x65, 0xbf, 0x66, 0xd9, 0x4b, 0x3f, 0x7d, 0xe9, 0xfd, 0xbe, 0xd1, 0x5a, 0xb1, 0xbe, 0x12, 0xa1, 0x5d, 0x3f, 0xab, 0x41, 0xa8, 0xbe, 0xc3, 0x46, 0xc1, 0xbe, 0xac, 0xab, 0x42, 0x3f, +0xa7, 0x92, 0x51, 0xbe, 0x8a, 0xc7, 0x1d, 0xbf, 0x7d, 0x92, 0x0b, 0x3f, 0xf3, 0x1b, 0x66, 0xbe, 0x61, 0xc0, 0x4e, 0xbf, 0xa7, 0xae, 0x48, 0x3f, 0x06, 0x67, 0xb0, 0xbd, 0xcb, 0x67, 0x1d, 0xbf, 0x0e, 0xf9, 0x17, 0x3f, 0xa7, 0xce, 0xa3, 0xbd, 0x7e, 0xfd, 0x4c, 0xbf, 0x6c, 0x79, 0x65, 0x3f, 0x2b, 0x89, 0x4c, 0xbe, 0x99, 0x9c, 0xca, 0xbe, 0x60, 0x01, 0x68, 0x3f, 0xf4, 0xa6, 0xc2, 0xbd, 0x26, 0xe1, 0xd2, 0xbe, 0xaa, 0x2d, 0x0d, 0x3f, 0x42, 0x06, 0x82, 0x3e, 0x83, 0x6a, 0x4b, 0xbf, +0x24, 0xf0, 0x3f, 0x3f, 0x01, 0x13, 0x68, 0x3e, 0x13, 0x27, 0x1f, 0xbf, 0x70, 0xce, 0x18, 0x3f, 0x0f, 0xf1, 0xaf, 0x3d, 0x44, 0x36, 0x4c, 0xbf, 0x4a, 0x7a, 0x48, 0x3f, 0x10, 0xce, 0x67, 0x3d, 0x1e, 0x8a, 0x1e, 0xbf, 0x1e, 0xbf, 0x67, 0x3f, 0x26, 0x88, 0x3a, 0x3d, 0x1f, 0x46, 0xd8, 0xbe, 0xcd, 0x76, 0x61, 0x3f, 0xba, 0xa3, 0x5f, 0x3e, 0x34, 0x2f, 0xd7, 0xbe, 0x26, 0x35, 0xac, 0x3e, 0xfa, 0x7f, 0x19, 0x3f, 0x21, 0xe7, 0x39, 0xbf, 0xe3, 0x70, 0x12, 0x3f, 0x27, 0x11, 0x15, 0x3f, +0xa4, 0xe2, 0x13, 0xbf, 0xe8, 0x88, 0xec, 0x3e, 0xf2, 0xce, 0xd9, 0x3e, 0x61, 0x38, 0x47, 0xbf, 0x7f, 0x13, 0x2e, 0x3f, 0x44, 0x4c, 0xd1, 0x3e, 0xc3, 0xd3, 0x1b, 0xbf, 0x55, 0xa0, 0x52, 0x3f, 0xc0, 0x06, 0xcc, 0x3e, 0x88, 0x84, 0xcf, 0xbe, 0x2a, 0x18, 0x3d, 0x3f, 0x13, 0xd4, 0x0c, 0x3f, 0x29, 0x77, 0xc7, 0xbe, 0xe4, 0x13, 0x22, 0x3e, 0xb9, 0xc3, 0x36, 0x3f, 0x1b, 0x9e, 0x2e, 0xbf, 0xbe, 0xbc, 0xc0, 0x3e, 0xe3, 0x37, 0x39, 0x3f, 0xf3, 0x21, 0x14, 0xbf, 0xfd, 0xd7, 0x69, 0x3e, +0xbe, 0x87, 0x2f, 0x3f, 0x63, 0xf0, 0x30, 0xbf, 0x45, 0x2b, 0xef, 0x3e, 0x62, 0x13, 0x2d, 0x3f, 0xb5, 0xe0, 0x11, 0xbf, 0xfd, 0xfa, 0x25, 0x3f, 0xc1, 0x53, 0x28, 0x3f, 0x6b, 0x7e, 0xc4, 0xbe, 0x0d, 0x8c, 0x10, 0x3f, 0x17, 0x9a, 0x3b, 0x3f, 0xf1, 0x65, 0xc2, 0xbe, 0x85, 0x23, 0x08, 0xbe, 0x96, 0x3d, 0x65, 0x3f, 0x84, 0x7f, 0xd9, 0xbe, 0xa0, 0xdb, 0x2b, 0xbe, 0xce, 0x38, 0x69, 0x3f, 0x0e, 0xd9, 0xc0, 0xbe, 0x6e, 0xa6, 0xc2, 0xbd, 0x33, 0x8c, 0x4f, 0x3f, 0xce, 0xe0, 0x13, 0xbf, +0x77, 0x9c, 0x02, 0xbe, 0x98, 0x88, 0x57, 0x3f, 0x65, 0x38, 0x06, 0xbf, 0xd8, 0xd2, 0x43, 0xbe, 0x65, 0x17, 0x70, 0x3f, 0x0b, 0x43, 0x94, 0xbe, 0x9d, 0xf6, 0x24, 0xbe, 0xc2, 0x4c, 0x63, 0x3f, 0xba, 0xa2, 0xdc, 0xbe, 0x0c, 0x05, 0xcc, 0xbd, 0x7f, 0xbf, 0x54, 0x3f, 0xc2, 0x15, 0x0c, 0xbf, 0x9e, 0x09, 0x8d, 0xbd, 0x0c, 0x56, 0x48, 0x3f, 0x77, 0x66, 0x1e, 0xbf, 0x3f, 0x53, 0x2f, 0xbd, 0x0e, 0xb9, 0x41, 0x3f, 0xb5, 0xfe, 0x26, 0xbf, 0x8d, 0x43, 0x7d, 0x3d, 0x53, 0xaf, 0x77, 0x3f, +0xbc, 0x00, 0x7b, 0xbe, 0x71, 0x58, 0xba, 0xbd, 0x28, 0xf3, 0x7b, 0x3f, 0x3a, 0xad, 0x1b, 0xbe, 0xde, 0x56, 0xda, 0xbd, 0x4d, 0x10, 0x75, 0x3f, 0x1b, 0x9f, 0x89, 0xbe, 0x7e, 0x8e, 0x2f, 0xbe, 0xe5, 0x7c, 0x75, 0x3f, 0x4a, 0x5c, 0x67, 0xbe, 0xc1, 0x3a, 0x2e, 0xbe, 0x6b, 0x64, 0x7b, 0x3f, 0x17, 0xef, 0xa7, 0xbd, 0x8b, 0x54, 0x48, 0xbe, 0x5b, 0x96, 0x77, 0x3f, 0x90, 0x49, 0x26, 0xbe, 0xbd, 0xa9, 0x90, 0xbe, 0x9a, 0xcd, 0x73, 0x3f, 0x17, 0x2e, 0xeb, 0xbd, 0xd7, 0xbe, 0x90, 0xbe, +0x4a, 0x5e, 0x75, 0x3f, 0x4b, 0xe9, 0x19, 0xbd, 0x03, 0x79, 0x86, 0xbe, 0x0e, 0xda, 0x6f, 0x3f, 0x77, 0x2e, 0x6c, 0xbe, 0xeb, 0x57, 0xea, 0xbe, 0x1d, 0xe3, 0x1a, 0x3f, 0x93, 0xc8, 0x26, 0xbf, 0x23, 0x48, 0xfd, 0xbe, 0xb4, 0x1d, 0x37, 0x3f, 0xb2, 0xb7, 0xfc, 0xbe, 0xca, 0x17, 0xb4, 0xbd, 0x84, 0xb7, 0x33, 0x3f, 0xe2, 0xea, 0x34, 0xbf, 0xce, 0x1a, 0x9c, 0xbd, 0x91, 0x7f, 0x52, 0x3f, 0x63, 0x61, 0x10, 0xbf, 0xce, 0x1a, 0x9c, 0xbd, 0x91, 0x7f, 0x52, 0x3f, 0x63, 0x61, 0x10, 0xbf, +0x00, 0xab, 0xa3, 0x3e, 0x72, 0x18, 0x44, 0x3f, 0x54, 0xc7, 0x0e, 0xbf, 0xca, 0x17, 0xb4, 0xbd, 0x84, 0xb7, 0x33, 0x3f, 0xe2, 0xea, 0x34, 0xbf, 0x5a, 0xf4, 0x96, 0x3e, 0x4c, 0xe1, 0x31, 0x3f, 0x14, 0xec, 0x27, 0xbf, 0x58, 0x8d, 0x65, 0x3e, 0x3e, 0xcc, 0x2e, 0x3f, 0x2e, 0x03, 0x32, 0xbf, 0x0f, 0x7e, 0x82, 0xbd, 0xbf, 0x46, 0x26, 0x3f, 0xdc, 0xf6, 0x41, 0xbf, 0xe0, 0x2f, 0xc6, 0xbe, 0x7b, 0xd9, 0x0e, 0x3f, 0x31, 0xe9, 0x3b, 0xbf, 0x0f, 0x7e, 0x82, 0xbd, 0xbf, 0x46, 0x26, 0x3f, +0xdc, 0xf6, 0x41, 0xbf, 0x13, 0x63, 0x65, 0xbf, 0x13, 0xee, 0x85, 0x3e, 0x69, 0xaa, 0xb7, 0xbe, 0x1d, 0xaa, 0x71, 0xbf, 0x3d, 0x7d, 0x8c, 0x3e, 0xfa, 0x9c, 0x3b, 0xbe, 0x94, 0x31, 0x3e, 0xbf, 0xe5, 0xef, 0xde, 0x3e, 0x9a, 0x24, 0x02, 0xbf, 0xe0, 0x68, 0x4f, 0xbf, 0xd0, 0xf1, 0xf9, 0x3e, 0x3a, 0x1f, 0xa6, 0xbe, 0x30, 0x49, 0x25, 0xbf, 0x2e, 0x1d, 0xd3, 0x3e, 0xf0, 0x8a, 0x24, 0xbf, 0x55, 0xa3, 0x4f, 0xbf, 0x21, 0x39, 0x79, 0x3e, 0xbf, 0x29, 0x08, 0xbf, 0xf4, 0xfb, 0x32, 0xbf, +0x37, 0x6c, 0x0b, 0x3e, 0xbc, 0xae, 0x33, 0xbf, 0x8a, 0xe8, 0x07, 0xbf, 0xdb, 0xdf, 0xa9, 0x3e, 0x51, 0xa0, 0x47, 0xbf, 0xf7, 0xc7, 0x9b, 0xbe, 0x78, 0xed, 0x02, 0x3f, 0x45, 0xbc, 0x4d, 0xbf, 0xb0, 0x74, 0x7e, 0xbe, 0xd2, 0x37, 0xd1, 0x3e, 0x28, 0xd3, 0x60, 0xbf, 0x59, 0x52, 0xc6, 0xbe, 0x88, 0xbe, 0x4b, 0x3e, 0x08, 0x74, 0x66, 0xbf, 0xe6, 0x02, 0x03, 0xbf, 0xf6, 0x07, 0x0a, 0xbd, 0x5d, 0xc4, 0x5b, 0xbf, 0x1b, 0x2c, 0x30, 0xbf, 0x29, 0x97, 0x36, 0xbe, 0x13, 0x0b, 0x34, 0xbf, +0xd2, 0x70, 0x4a, 0xbf, 0x3a, 0x5a, 0x85, 0xbe, 0x81, 0xcd, 0x0d, 0xbf, 0x68, 0x5d, 0x4b, 0xbf, 0x36, 0x94, 0x5a, 0xbc, 0x21, 0x75, 0x1b, 0xbf, 0x8a, 0x3e, 0x5f, 0xbf, 0xc6, 0x8b, 0xe5, 0xbd, 0x68, 0xec, 0xf3, 0xbe, 0x43, 0x8c, 0x6b, 0xbf, 0x54, 0x39, 0x2d, 0x3d, 0xc4, 0x5b, 0xc7, 0xbe, 0xb0, 0x70, 0x62, 0xbf, 0x3a, 0xb2, 0x02, 0x3e, 0x62, 0xb9, 0xe5, 0xbe, 0x83, 0x4d, 0x2d, 0xbf, 0x11, 0x01, 0x23, 0xbf, 0x60, 0x04, 0xbd, 0xbe, 0x3d, 0xd3, 0x33, 0xbf, 0x5f, 0xb6, 0x2d, 0xbf, +0x68, 0xec, 0x5b, 0xbe, 0x6e, 0xc0, 0x47, 0xbf, 0x6c, 0xe7, 0x13, 0xbf, 0x28, 0x43, 0x75, 0xbe, 0xdf, 0xdc, 0x3b, 0xbf, 0x2b, 0x6c, 0x0a, 0xbf, 0xbd, 0x8c, 0xd2, 0xbe, 0x91, 0xb7, 0xbc, 0xbd, 0x7f, 0xdd, 0x39, 0xbe, 0xcf, 0xa3, 0x7a, 0xbf, 0x78, 0xd5, 0x13, 0xbe, 0x53, 0x76, 0x2a, 0xbe, 0x31, 0xb5, 0x79, 0xbf, 0x4b, 0xab, 0xc1, 0xbd, 0x3e, 0x25, 0x87, 0xbd, 0xcf, 0x4a, 0x7e, 0xbf, 0xee, 0x42, 0x23, 0xbe, 0xdd, 0x79, 0xa2, 0xbd, 0x68, 0xe8, 0x7b, 0xbf, 0x87, 0x8b, 0x2c, 0xbe, +0xf6, 0xcf, 0xd3, 0xb8, 0xe7, 0x56, 0x7c, 0xbf, 0x6d, 0x00, 0xd6, 0xbd, 0x53, 0xe8, 0x3c, 0x3c, 0xdd, 0x94, 0x7e, 0xbf, 0xdf, 0xa3, 0x16, 0xbf, 0x31, 0x9a, 0x95, 0xbe, 0x86, 0xff, 0x40, 0xbf, 0xc0, 0xed, 0x39, 0xbf, 0xed, 0x48, 0xbd, 0xbe, 0x08, 0x5b, 0x14, 0xbf, 0xd2, 0x70, 0x4a, 0xbf, 0x3a, 0x5a, 0x85, 0xbe, 0x81, 0xcd, 0x0d, 0xbf, 0x1b, 0x2c, 0x30, 0xbf, 0x29, 0x97, 0x36, 0xbe, 0x13, 0x0b, 0x34, 0xbf, 0xe6, 0x02, 0x03, 0xbf, 0xf6, 0x07, 0x0a, 0xbd, 0x5d, 0xc4, 0x5b, 0xbf, +0x72, 0x88, 0xd0, 0xbe, 0xec, 0x86, 0x4d, 0xbe, 0xad, 0x16, 0x64, 0xbf, 0xb2, 0xbb, 0x4c, 0xbf, 0x11, 0x53, 0xd2, 0xbe, 0x52, 0x27, 0xe0, 0xbe, 0xa2, 0x96, 0x5e, 0xbf, 0xe0, 0x7f, 0xdb, 0xbe, 0x70, 0x40, 0x7b, 0xbe, 0x3f, 0x52, 0x70, 0xbf, 0xc6, 0x32, 0x85, 0xbe, 0xd8, 0x62, 0x67, 0xbe, 0xb2, 0x9e, 0x5e, 0xbf, 0xcd, 0xb1, 0x8c, 0xbe, 0x85, 0x06, 0xd2, 0xbe, 0xc5, 0x04, 0x25, 0xbe, 0x1c, 0xd1, 0x2d, 0x3e, 0x9b, 0xe3, 0x78, 0xbf, 0x5b, 0x28, 0xb9, 0xbd, 0x81, 0xcd, 0x39, 0x3e, +0x36, 0xaf, 0x7a, 0xbf, 0x77, 0xa0, 0x2e, 0xbe, 0xac, 0xe1, 0xa2, 0x3d, 0x55, 0x6d, 0x7b, 0xbf, 0xfb, 0xe8, 0xd4, 0xbd, 0x93, 0x8c, 0xbc, 0x3d, 0x06, 0x85, 0x7d, 0xbf, 0x59, 0x15, 0x61, 0xbd, 0xf5, 0x68, 0x3e, 0x3f, 0xf0, 0x88, 0x2a, 0xbf, 0x92, 0x25, 0xd3, 0xbd, 0xfd, 0x2b, 0x2b, 0x3f, 0xf9, 0x84, 0x3c, 0xbf, 0x29, 0xcc, 0x7b, 0xbd, 0xa4, 0x8d, 0x47, 0x3f, 0x5f, 0x95, 0x1f, 0xbf, 0xa8, 0xc7, 0xb6, 0xbd, 0xe5, 0xd4, 0x36, 0x3f, 0xd8, 0xb9, 0x31, 0xbf, 0x35, 0x96, 0xa0, 0x3e, +0x8a, 0x1d, 0x61, 0x3f, 0x09, 0x6f, 0xb7, 0xbe, 0x01, 0xa2, 0xe0, 0x3c, 0xb7, 0x26, 0x71, 0x3f, 0x74, 0x43, 0xab, 0xbe, 0x26, 0x1d, 0xa5, 0xbd, 0xbd, 0x50, 0x64, 0x3f, 0x9c, 0xe0, 0xe3, 0xbe, 0x26, 0x1d, 0xa5, 0xbd, 0xbd, 0x50, 0x64, 0x3f, 0x9c, 0xe0, 0xe3, 0xbe, 0x2e, 0xfe, 0xb6, 0x3c, 0xa9, 0xbd, 0x54, 0x3f, 0x95, 0x48, 0x0e, 0xbf, 0x01, 0xa2, 0xe0, 0x3c, 0xb7, 0x26, 0x71, 0x3f, 0x74, 0x43, 0xab, 0xbe, 0xd4, 0x0d, 0x94, 0x3e, 0x48, 0xc3, 0x59, 0x3f, 0x67, 0xd0, 0xe0, 0xbe, +0x58, 0x56, 0x0e, 0x3f, 0x9b, 0x04, 0x33, 0x3f, 0x29, 0x08, 0xe6, 0xbe, 0x35, 0x96, 0xa0, 0x3e, 0x8a, 0x1d, 0x61, 0x3f, 0x09, 0x6f, 0xb7, 0xbe, 0x1c, 0x5b, 0x4f, 0x3d, 0xfd, 0x11, 0x46, 0x3f, 0xb4, 0xaa, 0x21, 0xbf, 0xf0, 0x30, 0x6d, 0x3e, 0x87, 0xde, 0x4e, 0x3f, 0x59, 0xa7, 0x0a, 0xbf, 0x1d, 0x72, 0xd3, 0x3d, 0xac, 0xab, 0x3e, 0x3f, 0x37, 0xc4, 0x28, 0xbf, 0xda, 0xe5, 0x93, 0x3e, 0x1d, 0x8f, 0x45, 0x3f, 0x74, 0x0b, 0x11, 0xbf, 0x78, 0xd2, 0x02, 0x3d, 0xd9, 0x7b, 0x39, 0x3f, +0x9e, 0x40, 0x30, 0xbf, 0xf1, 0x2b, 0x56, 0x3b, 0xca, 0xfc, 0x3f, 0x3f, 0x15, 0x57, 0x29, 0xbf, 0x91, 0x64, 0xd6, 0xbc, 0x95, 0xee, 0x4a, 0x3f, 0x70, 0xea, 0x1b, 0xbf, 0xa9, 0xda, 0xf6, 0x3e, 0xe0, 0x83, 0x4b, 0x3f, 0xc7, 0x80, 0xbc, 0xbe, 0xca, 0xe1, 0xcb, 0x3e, 0xdf, 0xf9, 0x59, 0x3f, 0x63, 0xb4, 0xae, 0xbe, 0x02, 0x62, 0x62, 0xbe, 0x0a, 0xd8, 0x66, 0x3f, 0x27, 0x33, 0xbe, 0xbe, 0xa5, 0x11, 0x13, 0xbe, 0x96, 0xd0, 0x59, 0x3f, 0x02, 0x63, 0x01, 0xbf, 0xbd, 0xff, 0x6f, 0x3e, +0xc8, 0x5b, 0x3e, 0x3f, 0xb1, 0x4f, 0x20, 0xbf, 0xe4, 0x2c, 0xec, 0x3e, 0x99, 0x2e, 0x34, 0x3f, 0xba, 0x4b, 0x0a, 0xbf, 0x59, 0xe0, 0x0f, 0x3f, 0x25, 0x5a, 0x26, 0x3f, 0x75, 0x01, 0x03, 0xbf, 0xb2, 0x9e, 0x5e, 0xbf, 0xcd, 0xb1, 0x8c, 0xbe, 0x85, 0x06, 0xd2, 0xbe, 0x3f, 0x52, 0x70, 0xbf, 0xc6, 0x32, 0x85, 0xbe, 0xd8, 0x62, 0x67, 0xbe, 0xce, 0xc1, 0x6f, 0xbf, 0xd3, 0x4d, 0x02, 0xbe, 0x9b, 0x3a, 0xa7, 0xbe, 0xbc, 0x3b, 0x7a, 0xbf, 0xcb, 0xd6, 0xba, 0xbd, 0x3f, 0xe3, 0x42, 0xbe, +0x9f, 0xe7, 0x7b, 0xbf, 0xb9, 0xc1, 0x90, 0x3d, 0x32, 0x75, 0x27, 0xbe, 0x2e, 0x1a, 0x76, 0xbf, 0x0e, 0x82, 0x4e, 0x3d, 0x8d, 0x9b, 0x8a, 0xbe, 0xe1, 0x23, 0x62, 0xbd, 0x48, 0xc3, 0x25, 0x3f, 0xd5, 0x92, 0x42, 0xbf, 0x13, 0x96, 0xf8, 0xbd, 0xa2, 0xeb, 0x1e, 0x3f, 0x88, 0x47, 0x46, 0xbf, 0x13, 0x96, 0xf8, 0xbd, 0xa2, 0xeb, 0x1e, 0x3f, 0x88, 0x47, 0x46, 0xbf, 0xe1, 0x23, 0x62, 0xbd, 0x48, 0xc3, 0x25, 0x3f, 0xd5, 0x92, 0x42, 0xbf, 0x32, 0xc8, 0x71, 0xbf, 0xe9, 0xd7, 0x26, 0x3e, +0x60, 0x1e, 0x92, 0xbe, 0x06, 0x0d, 0x79, 0xbf, 0xf5, 0x9d, 0x2f, 0x3e, 0x50, 0x19, 0x1f, 0xbe, 0x40, 0x8a, 0xca, 0x3e, 0x3e, 0x04, 0x59, 0x3f, 0xe1, 0xee, 0xb4, 0xbe, 0x3d, 0x44, 0x73, 0x3e, 0x81, 0xed, 0x4c, 0x3f, 0x87, 0xdc, 0x0c, 0xbf, 0xc8, 0x93, 0xb4, 0x3e, 0xd5, 0x07, 0x12, 0x3f, 0x60, 0xe4, 0x3d, 0xbf, 0xa9, 0x6b, 0x11, 0x3f, 0x85, 0xea, 0x26, 0x3f, 0x97, 0x8f, 0x00, 0xbf, 0xbb, 0xb7, 0x62, 0xbe, 0x9b, 0x3b, 0x46, 0x3f, 0x40, 0xbf, 0x17, 0xbf, 0xcf, 0x2e, 0x5f, 0xbd, +0x3b, 0x8f, 0x4e, 0x3f, 0xab, 0x94, 0x16, 0xbf, 0x8a, 0x39, 0xa8, 0xbd, 0x3e, 0x7b, 0x3a, 0x3f, 0x3a, 0x1f, 0x2e, 0xbf, 0x8a, 0x59, 0xaf, 0xbe, 0xf2, 0x23, 0xe6, 0x3e, 0xb5, 0x34, 0x53, 0xbf, 0xb3, 0x7b, 0xf2, 0xbd, 0xf8, 0xaa, 0xdd, 0x3e, 0xb1, 0xc3, 0x64, 0xbf, 0x12, 0xa1, 0xd1, 0x3d, 0x24, 0xb9, 0xf4, 0x3e, 0xe3, 0x54, 0x5f, 0xbf, 0x88, 0x9c, 0x7e, 0x3d, 0x37, 0x35, 0x3c, 0x3f, 0x53, 0xcd, 0x2c, 0xbf, 0xab, 0x07, 0xb4, 0xbe, 0x3a, 0xae, 0x52, 0x3f, 0x7e, 0x72, 0xe4, 0xbe, +0xd1, 0x06, 0xe8, 0xbe, 0xc5, 0xfe, 0x56, 0x3f, 0xc0, 0x05, 0x99, 0xbe, 0x3e, 0xe9, 0x40, 0xbf, 0xad, 0xf6, 0xd0, 0x3e, 0x63, 0xed, 0x03, 0xbf, 0x8a, 0xc8, 0x10, 0xbf, 0x1e, 0x54, 0xea, 0x3e, 0x90, 0xa1, 0x2f, 0xbf, 0x3d, 0xb7, 0x90, 0x3d, 0x02, 0x7d, 0x7e, 0xbf, 0x37, 0xa9, 0xa8, 0xbd, 0xc3, 0x46, 0x59, 0x3d, 0x17, 0xd6, 0x7d, 0xbf, 0xb3, 0x7b, 0xf2, 0xbd, 0x90, 0x6a, 0x58, 0x3c, 0xc0, 0x75, 0x7d, 0xbf, 0xa3, 0x40, 0x0f, 0xbe, 0x7c, 0x0e, 0x2c, 0x3d, 0x58, 0x3b, 0x66, 0xbf, +0x49, 0xd5, 0xde, 0xbe, 0x92, 0x21, 0x07, 0x3d, 0x79, 0x8d, 0x7d, 0xbf, 0x0b, 0x27, 0x09, 0xbe, 0x96, 0x95, 0xc6, 0x3d, 0x62, 0x9c, 0x67, 0xbf, 0xed, 0x60, 0xd4, 0xbe, 0xfd, 0xdb, 0x65, 0xbd, 0x94, 0xdc, 0x65, 0xbf, 0xdf, 0x8b, 0xdf, 0xbe, 0x21, 0x1e, 0x89, 0xbc, 0xe0, 0xa0, 0x7d, 0xbf, 0x93, 0xff, 0x09, 0xbe, 0x0a, 0x14, 0xb1, 0x3d, 0x86, 0xe2, 0x7e, 0xbf, 0x2f, 0xdb, 0x0e, 0xbd, 0x39, 0x08, 0x7a, 0x3d, 0xf3, 0x02, 0x40, 0xbf, 0xa6, 0x97, 0x28, 0xbf, 0xa2, 0x7d, 0x0c, 0x3e, +0xf6, 0x45, 0x46, 0xbf, 0x22, 0x15, 0x1e, 0xbf, 0xef, 0xc7, 0x8d, 0x3d, 0xba, 0xf8, 0x13, 0xbf, 0x57, 0x26, 0x50, 0xbf, 0x07, 0xb3, 0x29, 0x3e, 0xfd, 0x84, 0x1b, 0xbf, 0x0d, 0xdf, 0x46, 0xbf, 0xf2, 0xcd, 0xb6, 0xbd, 0xeb, 0x36, 0x3c, 0xbf, 0xde, 0x03, 0x2c, 0xbf, 0x23, 0xf6, 0xe9, 0xbd, 0x8a, 0x74, 0x0b, 0xbf, 0x32, 0xae, 0x54, 0xbf, 0x65, 0x1c, 0xa3, 0x3c, 0x5e, 0x2c, 0x6c, 0xbe, 0xc8, 0x0b, 0x79, 0xbf, 0x2c, 0x9e, 0xfa, 0xbc, 0xe7, 0x1c, 0x5c, 0xbe, 0xa3, 0xe4, 0x79, 0xbf, +0x9e, 0x42, 0x2e, 0x3b, 0x39, 0x9a, 0xc3, 0xbd, 0x2c, 0xd4, 0x7e, 0xbf, 0x4f, 0x3b, 0x3c, 0xbd, 0x4c, 0x34, 0xc8, 0xbd, 0x8c, 0x80, 0x7e, 0xbf, 0xcd, 0x91, 0x55, 0xbd, 0x0d, 0x17, 0x39, 0x3c, 0xad, 0xa2, 0x7f, 0xbf, 0x23, 0x65, 0x0b, 0x3b, 0x39, 0xee, 0x94, 0x3c, 0xfd, 0xf4, 0x7f, 0xbf, 0xfd, 0x2f, 0xf7, 0x3d, 0x19, 0x56, 0x71, 0x3c, 0xb9, 0x19, 0x7e, 0xbf, 0x94, 0x2f, 0xe8, 0x3d, 0xbb, 0xb7, 0xe2, 0xbd, 0x05, 0xc4, 0x7c, 0xbf, 0x23, 0x65, 0x0b, 0x3b, 0x39, 0xee, 0x94, 0x3c, +0xfd, 0xf4, 0x7f, 0xbf, 0x9e, 0x42, 0x2e, 0x3b, 0x39, 0x9a, 0xc3, 0xbd, 0x2c, 0xd4, 0x7e, 0xbf, 0x86, 0x1d, 0xc6, 0x3d, 0x6d, 0x91, 0x64, 0xbe, 0x2b, 0x4f, 0x78, 0xbf, 0x65, 0x1c, 0xa3, 0x3c, 0x5e, 0x2c, 0x6c, 0xbe, 0xc8, 0x0b, 0x79, 0xbf, 0xf8, 0x1b, 0x6d, 0xbb, 0x93, 0x53, 0x0b, 0x3e, 0x1f, 0x9e, 0x7d, 0xbf, 0x27, 0x17, 0x63, 0xbd, 0x5d, 0x88, 0xf5, 0x3d, 0xc6, 0xc1, 0x7d, 0xbf, 0xee, 0xe9, 0x6a, 0xbd, 0x3c, 0xa2, 0x72, 0x3e, 0xa6, 0x46, 0x78, 0xbf, 0xef, 0xac, 0x5d, 0xbc, +0xad, 0xf8, 0x86, 0x3e, 0xa2, 0xeb, 0x76, 0xbf, 0xef, 0xac, 0x5d, 0xbc, 0xad, 0xf8, 0x86, 0x3e, 0xa2, 0xeb, 0x76, 0xbf, 0x10, 0xcf, 0xb2, 0x3d, 0x45, 0xb7, 0x96, 0x3e, 0x59, 0xa2, 0x73, 0xbf, 0xf8, 0x1b, 0x6d, 0xbb, 0x93, 0x53, 0x0b, 0x3e, 0x1f, 0x9e, 0x7d, 0xbf, 0xed, 0x0b, 0xe8, 0x3d, 0xf4, 0xbf, 0x1c, 0x3e, 0x7f, 0x50, 0x7b, 0xbf, 0x82, 0x8d, 0xeb, 0xbc, 0x47, 0x56, 0xbe, 0x3e, 0x01, 0x8a, 0x6d, 0xbf, 0x43, 0x37, 0x7b, 0xbd, 0x0f, 0x42, 0xb8, 0x3e, 0xc5, 0x54, 0x6e, 0xbf, +0xa4, 0xc1, 0x8d, 0xbd, 0x5b, 0xb3, 0xf5, 0x3e, 0x97, 0xe5, 0x5f, 0xbf, 0x24, 0x7f, 0x30, 0xbd, 0xbe, 0x6b, 0xf8, 0x3e, 0x57, 0x93, 0x5f, 0xbf, 0x24, 0x7f, 0x30, 0xbd, 0xbe, 0x6b, 0xf8, 0x3e, 0x57, 0x93, 0x5f, 0xbf, 0x18, 0xd0, 0x8b, 0x3c, 0xc4, 0x78, 0xf5, 0x3e, 0xf1, 0x9d, 0x60, 0xbf, 0x82, 0x8d, 0xeb, 0xbc, 0x47, 0x56, 0xbe, 0x3e, 0x01, 0x8a, 0x6d, 0xbf, 0x17, 0x9e, 0x57, 0x3d, 0xd4, 0xd7, 0xcb, 0x3e, 0xfc, 0x72, 0x6a, 0xbf, 0x5a, 0xf1, 0x0d, 0xbd, 0xc5, 0xc8, 0x42, 0x3f, +0x7e, 0xe1, 0x25, 0xbf, 0x0c, 0x8e, 0x92, 0x3d, 0xc6, 0x6a, 0x3b, 0x3f, 0x0d, 0x6c, 0x2d, 0xbf, 0x59, 0x8a, 0x44, 0x3e, 0xad, 0x69, 0x22, 0x3f, 0xd9, 0xaf, 0x3f, 0xbf, 0x83, 0x85, 0x9b, 0x3e, 0xda, 0xc7, 0xea, 0x3e, 0xcd, 0xcb, 0x55, 0xbf, 0x57, 0xd0, 0xc4, 0x3e, 0xd8, 0x65, 0x90, 0x3e, 0x2d, 0x08, 0x61, 0xbf, 0xec, 0xf5, 0xd6, 0x3e, 0xb3, 0x5d, 0xe1, 0x3d, 0x62, 0xa1, 0x66, 0xbf, 0x33, 0x17, 0xd0, 0x3e, 0xa5, 0xba, 0x80, 0xbd, 0x3e, 0x59, 0x69, 0xbf, 0x97, 0x39, 0xb5, 0x3e, +0x17, 0xb7, 0x61, 0xbe, 0xb8, 0xae, 0x68, 0xbf, 0x4b, 0x21, 0x90, 0x3e, 0x1b, 0x65, 0xb5, 0xbe, 0x62, 0x4a, 0x64, 0xbf, 0x35, 0x43, 0x8a, 0x3d, 0xea, 0x08, 0x00, 0xbf, 0xf3, 0x01, 0x5d, 0xbf, 0xe7, 0x50, 0x46, 0x3e, 0x0a, 0xa0, 0xf0, 0xbe, 0xe6, 0x75, 0x5c, 0xbf, 0x80, 0x2b, 0x19, 0xbe, 0xa2, 0x62, 0xd4, 0xbe, 0x54, 0xc4, 0x65, 0xbf, 0xfd, 0xd7, 0x69, 0xbe, 0xa4, 0x00, 0x99, 0xbe, 0x48, 0x34, 0x6d, 0xbf, 0xaa, 0x9b, 0x93, 0xbe, 0xfa, 0x9a, 0x25, 0xbe, 0xe5, 0x9b, 0x71, 0xbf, +0x78, 0xef, 0x98, 0xbe, 0x59, 0x86, 0xb8, 0xbc, 0xa7, 0x3e, 0x74, 0xbf, 0xb0, 0x74, 0x7e, 0xbe, 0xd2, 0x37, 0xd1, 0x3e, 0x28, 0xd3, 0x60, 0xbf, 0xe4, 0x67, 0x43, 0xbe, 0x67, 0x62, 0x9a, 0x3e, 0x70, 0x25, 0x6f, 0xbf, 0x59, 0x52, 0xc6, 0xbe, 0x88, 0xbe, 0x4b, 0x3e, 0x08, 0x74, 0x66, 0xbf, 0xa4, 0x52, 0x7c, 0xbe, 0x9d, 0x4b, 0x01, 0x3e, 0xef, 0xfd, 0x75, 0xbf, 0x13, 0x96, 0xf8, 0xbd, 0xa2, 0xeb, 0x1e, 0x3f, 0x88, 0x47, 0x46, 0xbf, 0x2a, 0xc6, 0x19, 0xbe, 0x51, 0x2e, 0x05, 0x3f, +0x19, 0x39, 0x57, 0xbf, 0x2e, 0xfe, 0xb6, 0x3c, 0xa9, 0xbd, 0x54, 0x3f, 0x95, 0x48, 0x0e, 0xbf, 0x9a, 0xd0, 0x04, 0xbe, 0xaf, 0x3e, 0x9e, 0x3e, 0xf0, 0x30, 0x71, 0xbf, 0xa3, 0x05, 0x88, 0xbd, 0x8f, 0x38, 0x9c, 0x3e, 0xdf, 0x32, 0x73, 0xbf, 0xcf, 0xa0, 0x61, 0xbd, 0x6e, 0xa4, 0xec, 0x3e, 0xc0, 0x93, 0x62, 0xbf, 0xf1, 0x67, 0xb8, 0xbd, 0xda, 0xe3, 0xe5, 0x3e, 0x42, 0x94, 0x63, 0xbf, 0xc0, 0xe8, 0x92, 0xbd, 0x5c, 0x57, 0x44, 0x3f, 0xab, 0x3e, 0x23, 0xbf, 0x4b, 0xe6, 0x90, 0xbe, +0xb5, 0x8b, 0xe9, 0xbc, 0xf8, 0x6c, 0x75, 0xbf, 0x59, 0x50, 0x90, 0xbe, 0xe4, 0x85, 0x44, 0xbe, 0x1a, 0xa8, 0x70, 0xbf, 0xa4, 0xa9, 0x9e, 0xbe, 0xb1, 0xa5, 0x77, 0xbe, 0x6b, 0x64, 0x6b, 0xbf, 0xa3, 0xe5, 0xa8, 0xbe, 0xa2, 0x7a, 0x83, 0xbe, 0x9b, 0x8e, 0x68, 0xbf, 0x2b, 0xdf, 0xb3, 0xbe, 0x0d, 0xaa, 0xad, 0xbd, 0x7d, 0xb2, 0x6e, 0xbf, 0x23, 0x66, 0xbe, 0xbe, 0x48, 0x32, 0xab, 0xbd, 0xd1, 0xac, 0x6c, 0xbf, 0x5c, 0x1b, 0x7a, 0xbe, 0xd9, 0xb5, 0xbd, 0xbe, 0xf9, 0x68, 0x65, 0xbf, +0x66, 0x15, 0x86, 0xbe, 0xe2, 0xb0, 0xcc, 0xbe, 0xe3, 0xde, 0x60, 0xbf, 0x90, 0xbf, 0x74, 0xbe, 0xd1, 0xb1, 0xb3, 0xbe, 0x65, 0xc6, 0x67, 0xbf, 0x93, 0xff, 0x69, 0xbe, 0xf1, 0x0c, 0x8a, 0x3e, 0x1c, 0x7a, 0x6f, 0xbf, 0xd2, 0xab, 0x81, 0xbe, 0xd8, 0xf2, 0xea, 0x3d, 0xfb, 0xe7, 0x75, 0xbf, 0x8b, 0xa6, 0xc3, 0xbe, 0xbc, 0x21, 0x8d, 0x3d, 0xc8, 0xe9, 0x6b, 0xbf, 0x9f, 0xaa, 0xca, 0xbe, 0x1e, 0xa5, 0xb2, 0x3d, 0x1c, 0x07, 0x6a, 0xbf, 0xb1, 0x87, 0xc6, 0xbe, 0x4b, 0xe5, 0x85, 0x3e, +0x6b, 0x46, 0x62, 0xbf, 0xac, 0x02, 0xcd, 0xbe, 0x1b, 0x2d, 0x97, 0x3e, 0xed, 0x11, 0x5e, 0xbf, 0xef, 0xe5, 0x2e, 0x3e, 0x48, 0x32, 0xfb, 0xbe, 0x9c, 0xbe, 0x5a, 0xbf, 0xd0, 0x99, 0x74, 0x3d, 0xff, 0x91, 0x09, 0xbf, 0x42, 0x5a, 0x57, 0xbf, 0xe1, 0xed, 0xc1, 0x3c, 0x54, 0xe5, 0xfb, 0xbe, 0xcd, 0xca, 0x5e, 0xbf, 0x79, 0x57, 0x0d, 0x3e, 0xff, 0x1f, 0xf7, 0xbe, 0x66, 0x67, 0x5d, 0xbf, 0x20, 0xd1, 0x44, 0x3d, 0xbe, 0xda, 0x15, 0xbf, 0x0a, 0x31, 0x4f, 0xbf, 0x29, 0xb0, 0x30, 0x3e, +0xf4, 0xfa, 0x0b, 0xbf, 0x1f, 0xbd, 0x51, 0xbf, 0x79, 0x57, 0x0d, 0x3e, 0xff, 0x1f, 0xf7, 0xbe, 0x66, 0x67, 0x5d, 0xbf, 0x07, 0x3d, 0x7b, 0x3e, 0xcc, 0x41, 0xc8, 0xbe, 0x66, 0x14, 0x63, 0xbf, 0x29, 0xb0, 0x30, 0x3e, 0xf4, 0xfa, 0x0b, 0xbf, 0x1f, 0xbd, 0x51, 0xbf, 0x85, 0x09, 0x8b, 0x3e, 0xa3, 0xe8, 0xd9, 0xbe, 0xdf, 0xfa, 0x5c, 0xbf, 0xaa, 0xb8, 0x81, 0x3e, 0xda, 0x36, 0xc4, 0xbe, 0xa6, 0x62, 0x63, 0xbf, 0xa5, 0xda, 0x27, 0xbe, 0x0f, 0xd0, 0xed, 0xbe, 0xcd, 0xca, 0x5e, 0xbf, +0xdd, 0xd1, 0x1f, 0xbe, 0xa5, 0x66, 0xdf, 0xbe, 0x88, 0xda, 0x62, 0xbf, 0x0f, 0x48, 0x32, 0xbe, 0x71, 0xe8, 0xfd, 0xbe, 0x18, 0xca, 0x59, 0xbf, 0xb2, 0x67, 0x9f, 0x3e, 0x72, 0xc3, 0x6f, 0xbe, 0xc9, 0xc6, 0x6b, 0xbf, 0xda, 0xff, 0xa0, 0x3e, 0x15, 0x1d, 0x69, 0xbe, 0x35, 0xec, 0x6b, 0xbf, 0x75, 0xe7, 0xa9, 0x3e, 0x6d, 0x90, 0x81, 0xbe, 0x6e, 0xa4, 0x68, 0xbf, 0x4e, 0x7e, 0xab, 0x3e, 0x97, 0x53, 0x42, 0xbd, 0x10, 0xe8, 0x70, 0xbf, 0x74, 0xb3, 0xb7, 0x3e, 0x12, 0x2c, 0x8e, 0xbd, +0x12, 0x4b, 0x6e, 0xbf, 0xcd, 0x3d, 0xb4, 0x3e, 0xb7, 0x43, 0x83, 0xbd, 0xdc, 0x0c, 0x6f, 0xbf, 0xb0, 0x71, 0xbd, 0x3e, 0xc7, 0xb7, 0xf7, 0x3d, 0x96, 0xce, 0x6b, 0xbf, 0x41, 0xd7, 0xa6, 0x3e, 0x8d, 0x28, 0x0d, 0x3e, 0xbd, 0x70, 0x6f, 0xbf, 0xf2, 0x22, 0xbb, 0x3e, 0xf5, 0xd9, 0x01, 0x3e, 0xe8, 0x10, 0x6c, 0xbf, 0x75, 0x72, 0x96, 0x3e, 0xc0, 0xaf, 0xa9, 0x3e, 0xe4, 0x84, 0x65, 0xbf, 0x6c, 0x09, 0xb1, 0x3e, 0xc8, 0xb1, 0xad, 0x3e, 0xb6, 0xf5, 0x5f, 0xbf, 0x6c, 0x07, 0xb3, 0x3e, +0xe0, 0x13, 0xa3, 0x3e, 0xcd, 0x8d, 0x61, 0xbf, 0x22, 0x8a, 0x39, 0x3e, 0x63, 0xd5, 0x38, 0x3f, 0x13, 0xf1, 0x2a, 0xbf, 0x8b, 0x8c, 0x4e, 0x3d, 0x96, 0x75, 0x53, 0x3f, 0x52, 0xb7, 0x0f, 0xbf, 0x49, 0x10, 0xae, 0xb8, 0xa6, 0x7b, 0x45, 0x3f, 0x75, 0xe6, 0x22, 0xbf, 0x74, 0x9b, 0xf0, 0x3c, 0x6f, 0xd6, 0x5c, 0x3f, 0x9a, 0x44, 0x01, 0xbf, 0x57, 0xd1, 0xff, 0x3d, 0x92, 0xad, 0x2e, 0x3f, 0xcb, 0x64, 0x38, 0xbf, 0x60, 0x94, 0x30, 0x3e, 0xd1, 0xcf, 0x40, 0x3f, 0xa1, 0x83, 0x22, 0xbf, +0xc0, 0x24, 0xb5, 0xbd, 0x14, 0x07, 0x4c, 0x3f, 0x2c, 0xf5, 0x18, 0xbf, 0x20, 0x96, 0xad, 0xbd, 0xeb, 0xe4, 0x60, 0x3f, 0x0a, 0xbb, 0xf0, 0xbe, 0x49, 0x10, 0xae, 0xb8, 0xa6, 0x7b, 0x45, 0x3f, 0x75, 0xe6, 0x22, 0xbf, 0x74, 0x9b, 0xf0, 0x3c, 0x6f, 0xd6, 0x5c, 0x3f, 0x9a, 0x44, 0x01, 0xbf, 0xfc, 0xde, 0x66, 0xbd, 0x8a, 0x21, 0x51, 0x3f, 0x24, 0xf1, 0x12, 0xbf, 0x30, 0x0d, 0x93, 0x3e, 0x05, 0xfc, 0x06, 0x3f, 0xa2, 0xb7, 0x4c, 0xbf, 0x4a, 0xd1, 0x6a, 0x3e, 0xb6, 0xbd, 0x05, 0x3f, +0xd1, 0x3e, 0x52, 0xbf, 0xcf, 0xa0, 0x91, 0x3e, 0xf8, 0xc0, 0x0e, 0x3f, 0x77, 0xa3, 0x47, 0xbf, 0xc1, 0x37, 0x3d, 0xbe, 0xfc, 0x6f, 0xf5, 0x3e, 0xe4, 0xa1, 0x5b, 0xbf, 0xc5, 0xe3, 0x22, 0xbe, 0x09, 0xa8, 0x34, 0x3f, 0x48, 0xc0, 0x30, 0xbf, 0xdf, 0x19, 0x9d, 0xbe, 0xef, 0x8f, 0x03, 0x3f, 0x1a, 0x14, 0x4d, 0xbf, 0x0d, 0x8b, 0x21, 0xbe, 0x93, 0xe2, 0x43, 0x3f, 0x3e, 0xcb, 0x1f, 0xbf, 0xdd, 0x96, 0xa0, 0xbe, 0xd6, 0x17, 0x11, 0x3f, 0xc0, 0x07, 0x43, 0xbf, 0xc7, 0x81, 0x97, 0xbd, +0x62, 0x2c, 0x47, 0x3f, 0xbf, 0xb5, 0x1f, 0xbf, 0xb3, 0x09, 0x90, 0xbd, 0xa2, 0xec, 0x55, 0x3f, 0xef, 0x74, 0x0b, 0xbf, 0xf6, 0xcf, 0xb3, 0xbd, 0x29, 0xb1, 0x4b, 0x3f, 0xc2, 0x6d, 0x19, 0xbf, 0xc6, 0x87, 0xb9, 0xbd, 0x56, 0xf4, 0x5b, 0x3f, 0x60, 0xe9, 0x00, 0xbf, 0xf3, 0x93, 0x7a, 0xbe, 0x43, 0x6f, 0xf1, 0xbc, 0x36, 0x1a, 0x78, 0xbf, 0xee, 0x79, 0x6e, 0xbe, 0x66, 0xf4, 0x13, 0xbe, 0xb1, 0x32, 0x76, 0xbf, 0x09, 0x32, 0x42, 0xbe, 0x70, 0x0b, 0x86, 0xbe, 0x0b, 0x41, 0x72, 0xbf, +0xa6, 0x09, 0x7b, 0xbe, 0xba, 0x32, 0x48, 0x3e, 0xd3, 0x16, 0x73, 0xbf, 0xb9, 0xc1, 0x80, 0xbe, 0x3a, 0x3e, 0x9a, 0x3d, 0x85, 0x05, 0x77, 0xbf, 0xcc, 0xd2, 0x8e, 0x3d, 0x9c, 0xdf, 0xb0, 0xbe, 0x35, 0x93, 0x6f, 0xbf, 0x9e, 0x08, 0xe2, 0xbb, 0x0d, 0x6c, 0xa5, 0xbe, 0x89, 0x43, 0x72, 0xbf, 0xcc, 0xd2, 0x8e, 0x3d, 0x9c, 0xdf, 0xb0, 0xbe, 0x35, 0x93, 0x6f, 0xbf, 0xac, 0xc7, 0x2d, 0x3e, 0xe4, 0x13, 0x9a, 0xbe, 0x8e, 0x3c, 0x70, 0xbf, 0x76, 0xfe, 0xed, 0xbd, 0x72, 0x8b, 0xa1, 0xbe, +0x5d, 0x18, 0x71, 0xbf, 0x66, 0xdc, 0x74, 0x3e, 0xa6, 0xee, 0x2a, 0xbe, 0x59, 0xdf, 0x74, 0xbf, 0xde, 0x00, 0x83, 0x3e, 0xbd, 0x72, 0x3d, 0xbc, 0xea, 0x75, 0x77, 0xbf, 0xec, 0xa2, 0x78, 0x3e, 0x3c, 0x4f, 0x1c, 0x3e, 0xc4, 0x3e, 0x75, 0xbf, 0x15, 0x1f, 0x4f, 0x3e, 0x1e, 0x51, 0xa1, 0x3e, 0x2c, 0x61, 0x6d, 0xbf, 0xcf, 0xa2, 0x77, 0x3d, 0x21, 0x74, 0x10, 0x3f, 0x82, 0xc8, 0x52, 0xbf, 0x92, 0xb2, 0x05, 0xbd, 0x09, 0x6b, 0x1b, 0x3f, 0x81, 0x40, 0x4b, 0xbf, 0x92, 0xb2, 0x05, 0xbd, +0x09, 0x6b, 0x1b, 0x3f, 0x81, 0x40, 0x4b, 0xbf, 0xa4, 0x37, 0x9c, 0xbd, 0x7b, 0x4b, 0x19, 0x3f, 0xb5, 0x18, 0x4c, 0xbf, 0x94, 0x4e, 0x14, 0x3e, 0x72, 0x6d, 0xe8, 0x3e, 0x7b, 0x11, 0x61, 0xbf, 0x95, 0xd6, 0x4f, 0xbe, 0x47, 0x75, 0xba, 0x3e, 0x9f, 0xb0, 0x68, 0xbf, 0x64, 0xb1, 0xed, 0xbd, 0x37, 0x1c, 0x06, 0x3f, 0xf2, 0x06, 0x58, 0xbf, 0x20, 0x09, 0x7b, 0xbd, 0x59, 0xf9, 0x15, 0x3f, 0x3b, 0xe0, 0x4e, 0xbf, 0x5f, 0xd1, 0x8d, 0xbd, 0x0c, 0x40, 0x17, 0x3f, 0x7a, 0xc7, 0x4d, 0xbf, +0xf7, 0xc7, 0x7b, 0xbd, 0x2e, 0x3a, 0xf1, 0x3e, 0xc8, 0x41, 0x61, 0xbf, 0xf0, 0x4e, 0x7e, 0xbd, 0x28, 0xd2, 0xad, 0x3e, 0x45, 0x45, 0x70, 0xbf, 0xa9, 0xda, 0x8e, 0xbd, 0x15, 0x3b, 0x5a, 0x3e, 0x0f, 0x7b, 0x79, 0xbf, 0x5e, 0x0e, 0x9b, 0xbd, 0x86, 0x1c, 0xdb, 0x3d, 0x9f, 0xca, 0x7d, 0xbf, 0x3f, 0x1b, 0x99, 0xbd, 0x90, 0x82, 0x27, 0x3c, 0x28, 0x45, 0x7f, 0xbf, 0x72, 0xfe, 0x86, 0xbd, 0x21, 0xcc, 0xad, 0xbd, 0x8b, 0x84, 0x7e, 0xbf, 0xb2, 0xd8, 0x66, 0xbd, 0xdc, 0x2a, 0x48, 0xbe, +0x83, 0xa5, 0x7a, 0xbf, 0x3b, 0xa6, 0x6e, 0xbd, 0x52, 0x0c, 0xa0, 0xbe, 0x8d, 0xb6, 0x72, 0xbf, 0xaf, 0xce, 0x91, 0xbd, 0xbf, 0xd5, 0x0e, 0xbf, 0x26, 0xaa, 0x53, 0xbf, 0x3d, 0x48, 0x8f, 0xbd, 0xca, 0x6e, 0xee, 0xbe, 0x7c, 0xd6, 0x61, 0xbf, 0x8c, 0x68, 0x3b, 0xbd, 0x27, 0xf2, 0xf4, 0xbe, 0x67, 0x7f, 0x60, 0xbf, 0xf1, 0x67, 0x78, 0xbd, 0x04, 0xca, 0x06, 0xbf, 0x55, 0x16, 0x59, 0xbf, 0x7e, 0xab, 0xf5, 0xbc, 0xaa, 0x9d, 0x0d, 0xbf, 0xd5, 0x1f, 0x55, 0xbf, 0x6e, 0xa2, 0x96, 0xbc, +0x85, 0xd1, 0x3c, 0xbf, 0xfb, 0xcd, 0x2c, 0xbf, 0xa4, 0xe1, 0x14, 0xbc, 0xb1, 0xbe, 0x65, 0xbf, 0x20, 0xd0, 0xe1, 0xbe, 0x00, 0x18, 0xcf, 0xba, 0x2e, 0x70, 0x7d, 0xbf, 0xe1, 0x7e, 0x10, 0xbe, 0x62, 0xdc, 0x9d, 0xbe, 0xff, 0x78, 0x73, 0xbf, 0x53, 0x7a, 0xa6, 0xbc, 0x7f, 0xbd, 0xe2, 0xbd, 0x55, 0x6a, 0x7e, 0xbf, 0x83, 0xfa, 0x16, 0xbc, 0xba, 0x12, 0xe9, 0xbe, 0xac, 0xc9, 0x63, 0xbf, 0xb6, 0xda, 0x03, 0xbd, 0x53, 0xb2, 0x18, 0xbf, 0xa7, 0x07, 0x4d, 0xbf, 0xeb, 0x1b, 0x58, 0xbd, +0x92, 0xeb, 0x02, 0xbf, 0x5e, 0xbd, 0x52, 0x3f, 0xf1, 0x7e, 0x7c, 0xbe, 0x3c, 0xde, 0x64, 0xbd, 0x11, 0xe0, 0x74, 0x3f, 0x72, 0x86, 0x92, 0xbe, 0x32, 0xc6, 0x73, 0xbf, 0x8d, 0x28, 0x95, 0x3e, 0x23, 0x4a, 0xbb, 0xbd, 0x2c, 0x11, 0x54, 0xbf, 0x56, 0xd7, 0x09, 0x3f, 0xe1, 0x27, 0x1e, 0xbe, 0xcb, 0x81, 0x36, 0xbf, 0x0b, 0x9a, 0x32, 0xbf, 0x5c, 0x05, 0x91, 0xbd, 0x49, 0xd5, 0x76, 0xbf, 0x27, 0x17, 0x83, 0xbe, 0x2d, 0x97, 0x8d, 0xbd, 0x49, 0xd5, 0x76, 0xbf, 0x27, 0x17, 0x83, 0xbe, +0x2d, 0x97, 0x8d, 0xbd, 0xd2, 0x87, 0x7e, 0xbf, 0x78, 0xf1, 0x9e, 0xbd, 0x9e, 0xd1, 0x96, 0xbd, 0x64, 0x57, 0x7e, 0xbf, 0x9e, 0x42, 0xae, 0x3d, 0xe8, 0x4c, 0x9a, 0xbd, 0xb1, 0xfb, 0x7a, 0xbf, 0x29, 0x09, 0x39, 0x3e, 0xe1, 0xb4, 0xa0, 0xbd, 0xf8, 0x54, 0x1e, 0xbf, 0x03, 0x06, 0x49, 0x3f, 0x74, 0x9b, 0xf0, 0xbc, 0x38, 0x2d, 0x7c, 0xbf, 0x92, 0x25, 0x13, 0x3e, 0x3e, 0x41, 0xc2, 0xbd, 0xd7, 0x50, 0x0a, 0xbf, 0x17, 0x7f, 0x53, 0x3f, 0xa4, 0xa8, 0x23, 0xbe, 0xbb, 0x62, 0x66, 0xbf, +0x37, 0xc2, 0x9a, 0x3e, 0xf8, 0xe1, 0xa0, 0xbe, 0x83, 0xde, 0x5b, 0xbf, 0x67, 0x7d, 0xfa, 0xbe, 0x23, 0x4a, 0x1b, 0xbe, 0xa2, 0x2a, 0x36, 0xbf, 0xac, 0x52, 0x2e, 0xbf, 0x6d, 0x37, 0x31, 0xbe, 0xde, 0x92, 0x44, 0xbf, 0xc5, 0x92, 0x8a, 0xbe, 0x1a, 0xa4, 0x14, 0xbf, 0x65, 0x50, 0x59, 0xbf, 0x23, 0x4d, 0xc4, 0xbe, 0x2b, 0x4d, 0xba, 0xbe, 0x32, 0x04, 0x2c, 0xbf, 0x5d, 0x15, 0x28, 0xbf, 0x2a, 0x6f, 0xaf, 0xbe, 0x64, 0x21, 0x1a, 0xbf, 0xc1, 0x3b, 0x1d, 0xbf, 0xb3, 0x9a, 0x02, 0xbf, +0x86, 0xab, 0xc3, 0xbe, 0xdc, 0x29, 0x0d, 0xbe, 0xa7, 0xeb, 0x69, 0xbf, 0x8c, 0x83, 0x1b, 0xbf, 0xe4, 0x9f, 0x39, 0xbe, 0x09, 0xfc, 0x45, 0xbf, 0x5a, 0xf3, 0xfb, 0xbe, 0x36, 0x39, 0x10, 0xbf, 0x47, 0xe6, 0x29, 0xbf, 0x43, 0xe5, 0xa7, 0xbe, 0x7d, 0x79, 0x09, 0xbf, 0x9c, 0xf8, 0x46, 0xbf, 0xaf, 0x20, 0x0d, 0xbe, 0xdc, 0xd9, 0x07, 0xbe, 0xae, 0x45, 0x7b, 0xbf, 0x0c, 0x8f, 0x0d, 0xbe, 0x9f, 0x57, 0x0c, 0xbf, 0x63, 0x28, 0x53, 0xbf, 0xd9, 0x3f, 0x8f, 0x3d, 0x07, 0xec, 0x12, 0xbf, +0x54, 0xe0, 0x50, 0xbf, 0x99, 0x7c, 0xf3, 0x3d, 0xb9, 0x55, 0xf0, 0xbd, 0x17, 0x67, 0x7c, 0xbf, 0xd0, 0x0c, 0x8a, 0x3e, 0xef, 0xad, 0x20, 0xbf, 0x88, 0xf5, 0x3a, 0xbf, 0x3e, 0x7b, 0xd6, 0x3e, 0xb2, 0x64, 0xae, 0xbd, 0x50, 0x6e, 0x67, 0xbf, 0x94, 0x4a, 0x40, 0x3f, 0xa7, 0x22, 0x95, 0x3c, 0xd0, 0xee, 0x28, 0xbf, 0x08, 0xe5, 0xfd, 0x3e, 0x74, 0xb4, 0x32, 0xbf, 0x0c, 0x3b, 0x04, 0xbf, 0x48, 0xc5, 0x73, 0xbf, 0x47, 0xac, 0x05, 0x3d, 0x2d, 0x76, 0x9b, 0x3e, 0xda, 0x72, 0x6e, 0xbf, +0x98, 0x18, 0x2b, 0x3e, 0x62, 0x83, 0xa5, 0x3e, 0x57, 0x95, 0x75, 0xbf, 0x9b, 0x3a, 0x0f, 0x3d, 0x04, 0x74, 0x8f, 0x3e, 0xb4, 0x58, 0x72, 0xbf, 0x54, 0xfc, 0x2f, 0x3e, 0x97, 0x8c, 0x8b, 0x3e, 0x6d, 0xe1, 0x71, 0xbf, 0x65, 0x1a, 0xcd, 0x3c, 0x7b, 0x32, 0xa7, 0x3e, 0xdd, 0x5e, 0x6a, 0xbf, 0xbc, 0x94, 0x1a, 0x3e, 0x9e, 0xec, 0xbe, 0x3e, 0x1d, 0x05, 0x70, 0xbf, 0xc5, 0x8e, 0x46, 0x3c, 0xe9, 0xf3, 0xb1, 0x3e, 0x7b, 0x65, 0x66, 0xbf, 0xfb, 0xe3, 0xfd, 0x3d, 0x7b, 0xf9, 0xd5, 0x3e, +0x81, 0x41, 0x6e, 0xbf, 0xe9, 0x7f, 0xb9, 0xbb, 0x78, 0x46, 0xbb, 0x3e, 0x20, 0xb8, 0x62, 0xbf, 0x15, 0x18, 0xb2, 0x3d, 0x21, 0x92, 0xe9, 0x3e, 0x27, 0xbc, 0x6c, 0xbf, 0x04, 0x6e, 0xdd, 0xbc, 0xf2, 0x5d, 0xc2, 0x3e, 0x18, 0x96, 0x5f, 0xbf, 0x5e, 0x65, 0x2d, 0x3d, 0xb1, 0x6a, 0xf8, 0x3e, 0x50, 0x72, 0x6b, 0xbf, 0xd1, 0xcf, 0x54, 0xbd, 0x3a, 0x3d, 0xc7, 0x3e, 0xda, 0x1a, 0x5d, 0xbf, 0x94, 0xbd, 0x25, 0xbc, 0xd6, 0x00, 0x01, 0x3f, 0xd5, 0x77, 0x6a, 0xbf, 0x32, 0x04, 0xa0, 0xbd, +0x99, 0x99, 0xc9, 0x3e, 0x44, 0x69, 0x5b, 0xbf, 0x2b, 0x30, 0x84, 0xbd, 0x8c, 0xd9, 0x02, 0x3f, 0xec, 0xf6, 0x69, 0xbf, 0x35, 0x44, 0xd5, 0xbd, 0xad, 0xdb, 0xc8, 0x3e, 0x64, 0xac, 0x5a, 0xbf, 0x8d, 0x9a, 0xef, 0xbd, 0x0b, 0xb2, 0x01, 0x3f, 0x53, 0xe7, 0x69, 0xbf, 0x33, 0x54, 0x05, 0xbe, 0xda, 0x1e, 0xc5, 0x3e, 0xd5, 0xb1, 0x5a, 0xbf, 0xb3, 0xd0, 0x2e, 0xbe, 0x84, 0x62, 0xfb, 0x3e, 0xec, 0x4b, 0x6a, 0xbf, 0x7c, 0x80, 0x1e, 0xbe, 0x81, 0x7b, 0xbe, 0x3e, 0x6f, 0x63, 0x5b, 0xbf, +0xea, 0x25, 0x66, 0xbe, 0xfc, 0x6f, 0xed, 0x3e, 0xaa, 0x27, 0x6b, 0xbf, 0x12, 0xc2, 0x33, 0xbe, 0x22, 0x50, 0xb5, 0x3e, 0x5a, 0xd7, 0x5c, 0xbf, 0x49, 0xf4, 0x8a, 0xbe, 0xec, 0x85, 0xda, 0x3e, 0xa9, 0xa2, 0x6c, 0xbf, 0xfb, 0x94, 0x43, 0xbe, 0x54, 0x1a, 0xa9, 0x3e, 0x46, 0xec, 0x5f, 0xbf, 0xde, 0x00, 0x9b, 0xbe, 0xa8, 0xc8, 0xc1, 0x3e, 0xf3, 0x54, 0x6f, 0xbf, 0x2a, 0xe0, 0x4e, 0xbe, 0xdf, 0x6a, 0x95, 0x3e, 0x04, 0x71, 0x66, 0xbf, 0xcd, 0xaf, 0xa6, 0xbe, 0xa2, 0x24, 0x94, 0x3e, +0x5e, 0x49, 0x6e, 0xbf, 0xc5, 0xab, 0x4c, 0xbe, 0xea, 0xae, 0x9c, 0x3e, 0x19, 0xfe, 0x63, 0xbf, 0xfc, 0xa7, 0xa3, 0xbe, 0x12, 0xa5, 0xa5, 0x3e, 0x42, 0x60, 0x65, 0xbf, 0xd7, 0x33, 0x94, 0x3e, 0x1a, 0x6a, 0xac, 0x3e, 0x4d, 0x31, 0x6b, 0xbf, 0xcb, 0x9f, 0x97, 0x3e, 0xd2, 0xc2, 0x85, 0x3e, 0x67, 0x42, 0x5f, 0xbf, 0xfa, 0x27, 0x88, 0x3e, 0x2b, 0x4d, 0xd2, 0x3e, 0xfa, 0x45, 0x59, 0xbf, 0x5d, 0xdf, 0x67, 0x3e, 0xf7, 0xaf, 0xf4, 0x3e, 0x40, 0xbf, 0x53, 0xbf, 0xa1, 0xda, 0x30, 0x3e, +0xfb, 0xe8, 0x08, 0x3f, 0x10, 0x01, 0x4f, 0xbf, 0x3b, 0x19, 0xdc, 0x3d, 0x09, 0x15, 0x14, 0x3f, 0xb3, 0x5b, 0x4b, 0xbf, 0xf7, 0x92, 0x06, 0x3d, 0xaa, 0x46, 0x1b, 0x3f, 0xc8, 0x0b, 0x49, 0xbf, 0xee, 0xe8, 0x3f, 0xbd, 0xfb, 0x06, 0x1e, 0x3f, 0x5e, 0x11, 0x48, 0xbf, 0x28, 0xb3, 0x01, 0xbe, 0x8d, 0x63, 0x1c, 0x3f, 0x73, 0x2b, 0x48, 0xbf, 0x11, 0xc8, 0x55, 0xbe, 0x31, 0x5f, 0x16, 0x3f, 0xdc, 0x2d, 0x49, 0xbf, 0xaa, 0x43, 0x96, 0xbe, 0x58, 0x59, 0x0b, 0x3f, 0x75, 0x3f, 0x4b, 0xbf, +0x1c, 0xed, 0xb8, 0xbe, 0x23, 0x6a, 0xfa, 0x3e, 0x12, 0x9f, 0x4f, 0xbf, 0x13, 0x98, 0xce, 0xbe, 0x0d, 0xe1, 0xd8, 0x3e, 0x6b, 0xd2, 0x55, 0xbf, 0x10, 0x74, 0xdc, 0xbe, 0x82, 0x1d, 0xaf, 0x3e, 0x9a, 0xeb, 0x58, 0xbf, 0x38, 0xbe, 0xce, 0x3e, 0xbb, 0x96, 0xb0, 0x3e, 0xf1, 0x82, 0x60, 0xbf, 0x2a, 0x35, 0xd3, 0x3e, 0x16, 0x4c, 0x7c, 0x3e, 0xd9, 0xec, 0x50, 0xbf, 0xdf, 0xfc, 0xbe, 0x3e, 0xe7, 0xfb, 0xe1, 0x3e, 0xc2, 0x14, 0x49, 0xbf, 0x4f, 0x94, 0xa4, 0x3e, 0x28, 0x64, 0x07, 0x3f, +0x70, 0xd1, 0x41, 0xbf, 0x08, 0xe6, 0x80, 0x3e, 0xb9, 0x53, 0x1a, 0x3f, 0x98, 0x84, 0x3b, 0xbf, 0xc2, 0x4c, 0x2b, 0x3e, 0x67, 0xef, 0x28, 0x3f, 0x56, 0x7d, 0x36, 0xbf, 0x11, 0x71, 0x93, 0x3d, 0xb3, 0x96, 0x32, 0x3f, 0x06, 0x0f, 0x33, 0xbf, 0x96, 0xb3, 0xf7, 0xbc, 0x96, 0xcb, 0x36, 0x3f, 0x6f, 0x80, 0x31, 0xbf, 0xf7, 0x3d, 0x0a, 0xbe, 0x16, 0x34, 0x35, 0x3f, 0x30, 0xd8, 0x31, 0xbf, 0xe5, 0x0b, 0x7a, 0xbe, 0x48, 0x34, 0x2d, 0x3f, 0xc0, 0x3d, 0x33, 0xbf, 0x29, 0x57, 0xb8, 0xbe, +0xcf, 0xd6, 0x1d, 0x3f, 0x5c, 0xc7, 0x34, 0xbf, 0xcd, 0x39, 0xe8, 0xbe, 0xba, 0x2f, 0x0b, 0x3f, 0xbc, 0x3c, 0x39, 0xbf, 0xd2, 0xaa, 0x02, 0xbf, 0xbc, 0xe6, 0xed, 0x3e, 0x10, 0xeb, 0x41, 0xbf, 0x9a, 0xd1, 0x0b, 0xbf, 0x75, 0x1c, 0xb7, 0x3e, 0x23, 0x81, 0x52, 0xbf, 0x20, 0x7f, 0x05, 0x3f, 0x9b, 0x53, 0x69, 0x3e, 0xf5, 0x46, 0x49, 0xbf, 0xa0, 0xc5, 0x02, 0x3f, 0x82, 0x03, 0xb2, 0x3e, 0x40, 0x89, 0x3f, 0xbf, 0xda, 0x53, 0xf2, 0x3e, 0x99, 0x11, 0xee, 0x3e, 0x0a, 0xf8, 0x35, 0xbf, +0x31, 0x25, 0xd2, 0x3e, 0xb0, 0x3a, 0x12, 0x3f, 0xb4, 0x1f, 0x2d, 0xbf, 0x1c, 0xb1, 0xa6, 0x3e, 0xd8, 0x2a, 0x29, 0x3f, 0xc5, 0x74, 0x25, 0xbf, 0x3d, 0x2c, 0x64, 0x3e, 0x28, 0xd5, 0x3a, 0x3f, 0x69, 0x55, 0x1f, 0xbf, 0xfe, 0x46, 0xdb, 0x3d, 0xf2, 0x7c, 0x46, 0x3f, 0x7f, 0x12, 0x1b, 0xbf, 0xbb, 0x5f, 0x85, 0xbc, 0x1a, 0xa5, 0x4b, 0x3f, 0x72, 0xf8, 0x18, 0xbf, 0xb6, 0x83, 0x11, 0xbe, 0x79, 0x05, 0x4a, 0x3f, 0xc8, 0x5c, 0x19, 0xbf, 0xa5, 0xf9, 0x8b, 0xbe, 0xd2, 0xa8, 0x40, 0x3f, +0x3d, 0x0a, 0x1b, 0xbf, 0x90, 0x11, 0xd8, 0xbe, 0x8d, 0xb4, 0x2c, 0x3f, 0x85, 0x79, 0x1b, 0xbf, 0xd9, 0xcf, 0x0a, 0xbf, 0xc2, 0xa4, 0x14, 0x3f, 0xcf, 0xd5, 0x1e, 0xbf, 0xf3, 0x02, 0x1c, 0xbf, 0x52, 0xba, 0xfc, 0x3e, 0x55, 0xc0, 0x29, 0xbf, 0x21, 0x1d, 0x26, 0xbf, 0x30, 0x11, 0xbf, 0x3e, 0x7c, 0x7d, 0x41, 0xbf, 0x9f, 0x1a, 0x1f, 0x3f, 0xbc, 0x08, 0x53, 0x3e, 0x32, 0xc7, 0x36, 0xbf, 0x0f, 0xf1, 0x1b, 0x3f, 0xad, 0xc0, 0xb0, 0x3e, 0x2d, 0x76, 0x2b, 0xbf, 0x40, 0xbe, 0x10, 0x3f, +0x2d, 0x77, 0xf6, 0x3e, 0xab, 0x5c, 0x20, 0xbf, 0x6d, 0x02, 0xfc, 0x3e, 0x1f, 0xbc, 0x1a, 0x3f, 0x08, 0x1b, 0x16, 0xbf, 0x68, 0x7a, 0xc9, 0x3e, 0x18, 0x43, 0x35, 0x3f, 0xdb, 0x35, 0x0d, 0xbf, 0xfe, 0x64, 0x8c, 0x3e, 0xb9, 0xa9, 0x49, 0x3f, 0xe6, 0x1e, 0x06, 0xbf, 0xf2, 0x5c, 0x0f, 0x3e, 0xb1, 0x16, 0x57, 0x3f, 0x23, 0x31, 0x01, 0xbf, 0x9d, 0x7f, 0x3b, 0xbb, 0x47, 0x02, 0x5d, 0x3f, 0x98, 0x4c, 0xfd, 0xbe, 0x6e, 0xa5, 0x17, 0xbe, 0x08, 0x39, 0x5b, 0x3f, 0xb6, 0x67, 0xfe, 0xbe, +0x61, 0xe2, 0x97, 0xbe, 0x3a, 0xc7, 0x50, 0x3f, 0x1e, 0xdf, 0x02, 0xbf, 0xe6, 0xca, 0xf0, 0xbe, 0xe9, 0x27, 0x38, 0x3f, 0xb0, 0x00, 0x06, 0xbf, 0x45, 0x62, 0x1a, 0xbf, 0x05, 0x18, 0x1a, 0x3f, 0x4b, 0x8e, 0x0b, 0xbf, 0xb1, 0x50, 0x2b, 0xbf, 0xa6, 0x45, 0x01, 0x3f, 0xcb, 0xf5, 0x16, 0xbf, 0x42, 0x5f, 0x36, 0xbf, 0xab, 0xce, 0xc2, 0x3e, 0x62, 0xd8, 0x2d, 0xbf, 0x7b, 0x14, 0x36, 0x3f, 0xcc, 0xee, 0x39, 0x3e, 0xc8, 0xd0, 0x21, 0xbf, 0x98, 0x89, 0x32, 0x3f, 0xd4, 0xed, 0xac, 0x3e, +0x47, 0x1d, 0x15, 0xbf, 0x35, 0xee, 0x25, 0x3f, 0x42, 0x24, 0xfb, 0x3e, 0x32, 0xae, 0x08, 0xbf, 0x2c, 0xd6, 0x10, 0x3f, 0xdb, 0xdc, 0x20, 0x3f, 0x77, 0x66, 0xfa, 0xbe, 0xa9, 0xd8, 0xe8, 0x3e, 0xf8, 0x8a, 0x3e, 0x3f, 0xb6, 0x82, 0xe6, 0xbe, 0x4e, 0x43, 0xa4, 0x3e, 0xb1, 0x52, 0x55, 0x3f, 0xee, 0xaf, 0xd6, 0xbe, 0x25, 0x79, 0x2e, 0x3e, 0x2c, 0x47, 0x64, 0x3f, 0x1d, 0xb0, 0xcb, 0xbe, 0x20, 0xeb, 0x29, 0x3c, 0xdb, 0xda, 0x6a, 0x3f, 0x86, 0x02, 0xc6, 0xbe, 0x6f, 0xd7, 0x1b, 0xbe, +0xf1, 0xd7, 0x68, 0x3f, 0xb0, 0x1e, 0xc7, 0xbe, 0x80, 0x10, 0xa1, 0xbe, 0xf3, 0xab, 0x5d, 0x3f, 0x44, 0x6b, 0xd5, 0xbe, 0x47, 0xca, 0xfe, 0xbe, 0xbf, 0xba, 0x42, 0x3f, 0xc0, 0x06, 0xec, 0xbe, 0xd9, 0x3e, 0x20, 0xbf, 0x53, 0x07, 0x21, 0x3f, 0x02, 0xf0, 0x17, 0xbf, 0xfd, 0x30, 0x4a, 0x3f, 0x68, 0x79, 0x1e, 0x3e, 0x86, 0xc7, 0x0a, 0xbf, 0x7e, 0x51, 0x46, 0x3f, 0xcd, 0xaf, 0xa6, 0x3e, 0x35, 0xcf, 0xf9, 0xbe, 0xf6, 0x7d, 0x38, 0x3f, 0xb6, 0x2b, 0xfc, 0x3e, 0xf7, 0xad, 0xde, 0xbe, +0x07, 0x5e, 0x21, 0x3f, 0xec, 0x9e, 0x24, 0x3f, 0xe6, 0xae, 0xc5, 0xbe, 0xd5, 0x3d, 0x02, 0x3f, 0x61, 0xfc, 0x44, 0x3f, 0x5d, 0x15, 0xb0, 0xbe, 0x4b, 0x75, 0xb9, 0x3e, 0x7a, 0xc7, 0x5d, 0x3f, 0x42, 0xea, 0x9e, 0xbe, 0x2c, 0x9e, 0x4a, 0x3e, 0xc8, 0x06, 0x6e, 0x3f, 0x7b, 0xf8, 0x92, 0xbe, 0x1b, 0x68, 0xbe, 0x3c, 0x70, 0x27, 0x75, 0x3f, 0xb4, 0xca, 0x8c, 0xbe, 0xdb, 0xc0, 0x1d, 0xbe, 0x5e, 0xf3, 0x72, 0x3f, 0xc8, 0x5d, 0x8c, 0xbe, 0xd3, 0x2f, 0xa9, 0xbe, 0xa9, 0x33, 0x67, 0x3f, +0x24, 0x7d, 0x9a, 0xbe, 0xe4, 0xbc, 0x03, 0xbf, 0x25, 0x76, 0x4d, 0x3f, 0xa8, 0xc5, 0xb8, 0xbe, 0x61, 0x6e, 0x23, 0xbf, 0x1c, 0x0b, 0x2e, 0x3f, 0x7e, 0x1d, 0x00, 0xbf, 0x56, 0x46, 0x5b, 0x3f, 0x1b, 0x10, 0x01, 0x3e, 0x51, 0x10, 0xe4, 0xbe, 0xcd, 0x1f, 0x57, 0x3f, 0x28, 0x2b, 0x9e, 0x3e, 0x09, 0x6c, 0xc6, 0xbe, 0x0f, 0x46, 0x48, 0x3f, 0x2a, 0xab, 0xf9, 0x3e, 0x78, 0x7e, 0xa9, 0xbe, 0x5c, 0x73, 0x2f, 0x3f, 0x91, 0x0b, 0x26, 0x3f, 0x29, 0xe8, 0x8e, 0xbe, 0xa1, 0x13, 0x0e, 0x3f, +0x5e, 0x9c, 0x48, 0x3f, 0x5e, 0xf2, 0x6f, 0xbe, 0xd1, 0xcc, 0xcb, 0x3e, 0x1b, 0x0e, 0x63, 0x3f, 0x50, 0x89, 0x4b, 0xbe, 0x5c, 0x92, 0x63, 0x3e, 0x3a, 0x5b, 0x74, 0x3f, 0x72, 0x35, 0x32, 0xbe, 0x99, 0xd7, 0x11, 0x3d, 0xb7, 0xed, 0x7b, 0x3f, 0x75, 0x03, 0x25, 0xbe, 0x52, 0x7f, 0x1d, 0xbe, 0x36, 0x91, 0x79, 0x3f, 0x80, 0x80, 0x25, 0xbe, 0x7c, 0x0f, 0xaf, 0xbe, 0x83, 0xfc, 0x6c, 0x3f, 0xc3, 0xb8, 0x3b, 0xbe, 0x1f, 0xf2, 0x06, 0xbf, 0x12, 0x6c, 0x54, 0x3f, 0x65, 0x34, 0x62, 0xbe, +0x61, 0x37, 0x28, 0xbf, 0xb6, 0x80, 0x38, 0x3f, 0x2b, 0x84, 0xcd, 0xbe, 0x0a, 0x2f, 0x69, 0x3f, 0x62, 0x4a, 0xc4, 0x3d, 0x3f, 0xe2, 0xaf, 0xbe, 0x3d, 0xd2, 0x64, 0x3f, 0xe7, 0x8d, 0x93, 0x3e, 0x9f, 0xc7, 0x90, 0xbe, 0xc7, 0x2a, 0x55, 0x3f, 0x2a, 0xc4, 0xf3, 0x3e, 0xa2, 0x0c, 0x65, 0xbe, 0x7a, 0x00, 0x3b, 0x3f, 0x59, 0x30, 0x25, 0x3f, 0x81, 0x93, 0x2d, 0xbe, 0x2b, 0xdb, 0x17, 0x3f, 0xe1, 0x79, 0x49, 0x3f, 0xd4, 0x99, 0xfb, 0xbd, 0xf5, 0x2d, 0xdb, 0x3e, 0x98, 0x35, 0x65, 0x3f, +0x16, 0xdc, 0xaf, 0xbd, 0x1f, 0x2e, 0x79, 0x3e, 0x7e, 0x54, 0x77, 0x3f, 0xc7, 0xb7, 0x77, 0xbd, 0x93, 0xa9, 0x42, 0x3d, 0xd1, 0x3d, 0x7f, 0x3f, 0x20, 0xd4, 0x45, 0xbd, 0xc1, 0xaa, 0x1a, 0xbe, 0xc6, 0xc2, 0x7c, 0x3f, 0x96, 0x96, 0x51, 0xbd, 0xe7, 0x8f, 0xb1, 0xbe, 0x37, 0xc1, 0x6f, 0x3f, 0x8f, 0x17, 0x92, 0xbd, 0xe7, 0x70, 0x09, 0xbf, 0x0d, 0x34, 0x57, 0x3f, 0xb8, 0xca, 0xb3, 0xbd, 0xd7, 0x2f, 0x30, 0xbf, 0x89, 0x5c, 0x38, 0x3f, 0xb6, 0x62, 0x8f, 0xbe, 0x73, 0x49, 0x75, 0x3f, +0xb4, 0xe7, 0x72, 0x3d, 0xfa, 0x22, 0x61, 0xbe, 0x16, 0xc0, 0x70, 0x3f, 0x82, 0xc6, 0x84, 0x3e, 0x1d, 0xaf, 0x20, 0xbe, 0x97, 0x70, 0x60, 0x3f, 0xff, 0xcc, 0xe8, 0x3e, 0xda, 0x74, 0xc4, 0xbd, 0xf9, 0x2e, 0x45, 0x3f, 0xba, 0x67, 0x21, 0x3f, 0x02, 0x83, 0x24, 0xbd, 0xc8, 0x97, 0x20, 0x3f, 0x2f, 0x19, 0x47, 0x3f, 0x7e, 0x6d, 0xfd, 0x3b, 0xcc, 0x44, 0xe9, 0x3e, 0xce, 0xe0, 0x63, 0x3f, 0xc7, 0x10, 0x40, 0x3d, 0xc5, 0x8e, 0x86, 0x3e, 0x91, 0xb5, 0x76, 0x3f, 0x9b, 0xad, 0x9c, 0x3d, +0x40, 0x31, 0x72, 0x3d, 0xf7, 0xcc, 0x7e, 0x3f, 0x3d, 0x2c, 0xb4, 0x3d, 0xd8, 0x0f, 0x11, 0xbe, 0x5d, 0x6a, 0x7c, 0x3f, 0xf7, 0x3a, 0xa9, 0x3d, 0xba, 0x6b, 0xb1, 0xbe, 0x72, 0x34, 0x6f, 0x3f, 0x5c, 0xac, 0x88, 0x3d, 0x63, 0x09, 0x0b, 0xbf, 0xe5, 0x45, 0x56, 0x3f, 0xb9, 0xe1, 0x37, 0x3d, 0x16, 0xf6, 0x34, 0xbf, 0x52, 0xb6, 0x34, 0x3f, 0xbf, 0x26, 0x0b, 0xbe, 0x1c, 0x97, 0x7d, 0x3f, 0x3f, 0xc4, 0x86, 0x3c, 0xb8, 0x78, 0x98, 0xbd, 0xc7, 0xf4, 0x78, 0x3f, 0x8d, 0x0c, 0x62, 0x3e, +0x31, 0x08, 0x2c, 0xbc, 0x73, 0x46, 0x68, 0x3f, 0x4d, 0x31, 0xd7, 0x3e, 0x67, 0xb7, 0x56, 0x3d, 0x72, 0x4e, 0x4c, 0x3f, 0xd2, 0xab, 0x19, 0x3f, 0x57, 0xee, 0xe5, 0x3d, 0x47, 0xc6, 0x26, 0x3f, 0x6e, 0x15, 0x40, 0x3f, 0xf8, 0xfc, 0x30, 0x3e, 0xff, 0x59, 0xf3, 0x3e, 0xba, 0xd8, 0x5c, 0x3f, 0x4f, 0x03, 0x66, 0x3e, 0xdc, 0xb7, 0x92, 0x3e, 0x8b, 0x6d, 0x6e, 0x3f, 0x12, 0xf5, 0x72, 0x3e, 0xdd, 0x3f, 0xb6, 0x3d, 0xf8, 0xa4, 0x77, 0x3f, 0x0e, 0x85, 0x5f, 0x3e, 0x8c, 0x6c, 0xe7, 0xbd, +0x7d, 0x25, 0x78, 0x3f, 0xad, 0x89, 0x55, 0x3e, 0xc2, 0x50, 0xaf, 0xbe, 0x94, 0x86, 0x6a, 0x3f, 0xde, 0x57, 0x55, 0x3e, 0x1b, 0x66, 0x0c, 0xbf, 0xa0, 0x50, 0x4f, 0x3f, 0xdd, 0xd3, 0x35, 0x3e, 0x69, 0xe2, 0x39, 0xbf, 0x8d, 0x0c, 0x2a, 0x3f, 0x19, 0x3d, 0x37, 0x3c, 0x8a, 0xe4, 0x7f, 0x3f, 0xab, 0xb3, 0xda, 0xbc, 0x56, 0x64, 0x94, 0x3d, 0xf1, 0x45, 0x7b, 0x3f, 0xbb, 0x44, 0x35, 0x3e, 0xaf, 0x94, 0x05, 0x3e, 0x02, 0xf1, 0x6a, 0x3f, 0x88, 0x13, 0xc0, 0x3e, 0x01, 0xf6, 0x31, 0x3e, +0xbe, 0x87, 0x4f, 0x3f, 0xc0, 0x22, 0x0f, 0x3f, 0xfc, 0x1c, 0x4f, 0x3e, 0x71, 0x70, 0x2d, 0x3f, 0x18, 0x09, 0x35, 0x3f, 0x1b, 0x4b, 0x90, 0x3e, 0x77, 0xbb, 0xee, 0x3e, 0x26, 0xab, 0x56, 0x3f, 0xb5, 0x6a, 0xc7, 0x3e, 0x65, 0x56, 0x8f, 0x3e, 0xd3, 0xa0, 0x60, 0x3f, 0xc7, 0x9d, 0xc2, 0x3e, 0x8c, 0x69, 0x16, 0x3e, 0xbd, 0xc7, 0x69, 0x3f, 0x2b, 0xfb, 0xb6, 0x3e, 0x50, 0xa8, 0x27, 0xbd, 0x05, 0xdd, 0x6e, 0x3f, 0x2e, 0x1f, 0xb1, 0x3e, 0x0f, 0x7c, 0xa4, 0xbe, 0xcd, 0xac, 0x61, 0x3f, +0xce, 0x31, 0xb0, 0x3e, 0xdb, 0x33, 0x0f, 0xbf, 0x91, 0x0c, 0x41, 0x3f, 0x66, 0xdb, 0xa9, 0x3e, 0x88, 0x9d, 0x3d, 0xbf, 0x3a, 0x90, 0x15, 0x3f, 0xb2, 0x67, 0x0f, 0x3e, 0x49, 0xf2, 0x7c, 0x3f, 0x06, 0x2a, 0x83, 0xbd, 0x3c, 0xda, 0x48, 0x3e, 0x4c, 0xa8, 0x78, 0x3f, 0xec, 0xa5, 0x09, 0x3e, 0x20, 0x98, 0x63, 0x3e, 0x4a, 0x61, 0x6a, 0x3f, 0x16, 0xa2, 0xab, 0x3e, 0x89, 0x60, 0x5c, 0x3e, 0xf2, 0x96, 0x53, 0x3f, 0xd4, 0x27, 0x05, 0x3f, 0xd1, 0x57, 0xf8, 0x3e, 0x60, 0x94, 0x50, 0x3e, +0x2c, 0xb6, 0x59, 0x3f, 0x74, 0x97, 0x0c, 0x3f, 0x19, 0xe4, 0xae, 0x3d, 0xc8, 0xd1, 0x54, 0x3f, 0x02, 0xd4, 0x04, 0x3f, 0x96, 0x59, 0x8c, 0xbe, 0x9d, 0x49, 0x4f, 0x3f, 0x93, 0x1b, 0xfd, 0x3e, 0x47, 0x3e, 0x0f, 0xbf, 0x62, 0x4c, 0x2a, 0x3f, 0x4e, 0xf1, 0xf8, 0x3e, 0x26, 0x8b, 0x37, 0xbf, 0x48, 0xc5, 0xff, 0x3e, 0xfe, 0x27, 0x7f, 0x3e, 0xb7, 0xb8, 0x76, 0x3f, 0x22, 0x37, 0xc3, 0xbd, 0xd4, 0xf2, 0x93, 0x3e, 0x54, 0xfc, 0x73, 0x3f, 0x21, 0x03, 0xb9, 0x3d, 0x45, 0x10, 0x8f, 0x3e, +0xeb, 0x1a, 0x69, 0x3f, 0xe4, 0xf6, 0x9b, 0x3e, 0x0c, 0x1e, 0xb6, 0x3e, 0x1e, 0x17, 0x6d, 0x3f, 0x0d, 0x88, 0x00, 0xbe, 0xdc, 0xbb, 0xc6, 0x3e, 0xea, 0xca, 0x6b, 0x3f, 0xbb, 0x0f, 0x00, 0x3d, 0xdf, 0xe1, 0xce, 0x3e, 0x42, 0x5e, 0x67, 0x3f, 0xbb, 0x7b, 0x10, 0x3e, 0x46, 0x7c, 0x2f, 0x3f, 0x58, 0x37, 0x5e, 0xbe, 0xdd, 0xea, 0x31, 0x3f, 0x90, 0xdb, 0x33, 0x3f, 0xf9, 0xbf, 0xc3, 0x3d, 0xd3, 0x85, 0x34, 0x3f, 0x6b, 0x28, 0x21, 0x3f, 0x04, 0x70, 0x07, 0xbf, 0x69, 0xac, 0x11, 0x3f, +0xe7, 0xfd, 0x17, 0x3f, 0xa0, 0x6d, 0x31, 0xbf, 0xe7, 0x51, 0xd1, 0x3e, 0x8c, 0xa3, 0xea, 0x3e, 0xb6, 0x14, 0x60, 0x3f, 0x87, 0xfa, 0x1d, 0xbe, 0x3c, 0x4d, 0xfe, 0x3e, 0xad, 0x14, 0x5e, 0x3f, 0x0b, 0x5f, 0xdf, 0xbc, 0x17, 0x2e, 0x07, 0x3f, 0x1d, 0x3a, 0x59, 0x3f, 0xe5, 0x5c, 0x0a, 0x3d, 0x0a, 0xf7, 0x4e, 0x3f, 0x35, 0xcf, 0xb1, 0x3d, 0x8e, 0x05, 0x15, 0x3f, 0x59, 0x88, 0x4e, 0x3f, 0xeb, 0xab, 0x1b, 0xbe, 0x8c, 0x2b, 0x12, 0x3f, 0xed, 0x7f, 0x40, 0x3f, 0x5b, 0x7d, 0xed, 0xbe, +0x5a, 0xd4, 0xef, 0x3e, 0x2f, 0xdc, 0x2d, 0x3f, 0xaa, 0xef, 0x28, 0xbf, 0xf8, 0x8c, 0xa4, 0x3e, 0x7a, 0x33, 0x0e, 0x3f, 0x22, 0xc2, 0x4f, 0x3f, 0x83, 0x87, 0x39, 0xbe, 0x1e, 0xe1, 0x18, 0x3f, 0xd5, 0x94, 0x4c, 0x3f, 0xc8, 0xec, 0x8c, 0xbd, 0x3a, 0x40, 0x24, 0x3f, 0xf8, 0x4e, 0x44, 0x3f, 0x57, 0x25, 0x91, 0xbc, 0xd7, 0x14, 0x64, 0x3f, 0xf1, 0xd6, 0xd9, 0xbd, 0x0f, 0x0a, 0xe2, 0x3e, 0xf1, 0xd2, 0x5d, 0x3f, 0x98, 0x4e, 0x8b, 0x3d, 0xfd, 0x31, 0xfd, 0x3e, 0x52, 0xf1, 0x5f, 0x3f, +0x30, 0x2c, 0xbf, 0xbe, 0xb9, 0x19, 0x9e, 0x3e, 0xa4, 0x18, 0x50, 0x3f, 0x5d, 0xfa, 0x0b, 0xbf, 0xc9, 0x73, 0x4d, 0x3e, 0x6e, 0xda, 0x2c, 0x3f, 0xcf, 0xbc, 0x34, 0x3f, 0x2a, 0xc9, 0x5a, 0xbe, 0x5d, 0x87, 0x36, 0x3f, 0x12, 0x31, 0x31, 0x3f, 0x2b, 0x69, 0xe5, 0xbd, 0x6d, 0x8f, 0x42, 0x3f, 0x0d, 0xe0, 0x25, 0x3f, 0xbb, 0x27, 0x4f, 0xbd, 0xab, 0xb4, 0x61, 0x3f, 0x7f, 0x69, 0xb1, 0x3d, 0xed, 0x7e, 0xed, 0x3e, 0x2d, 0x41, 0x6a, 0x3f, 0xa9, 0x85, 0x12, 0xbe, 0xcf, 0x11, 0xc1, 0x3e, +0xc3, 0x5f, 0x6b, 0x3f, 0xd1, 0xea, 0xac, 0xbe, 0x51, 0x4c, 0x4e, 0x3e, 0x68, 0xad, 0x64, 0x3f, 0x0e, 0xf3, 0xdd, 0xbe, 0x02, 0x9b, 0xf3, 0x3d, 0xd6, 0x8f, 0x3d, 0x3f, 0x84, 0x47, 0x2b, 0xbf, 0x0a, 0x68, 0x82, 0x3d, 0x43, 0x00, 0x5c, 0x3f, 0xed, 0xd6, 0x02, 0xbf, 0x7e, 0x51, 0x82, 0x3c, 0x94, 0xa2, 0x25, 0x3f, 0xb1, 0xc1, 0x3e, 0xbf, 0x58, 0x8d, 0x25, 0xbe, 0xdd, 0x0a, 0x05, 0x3f, 0x6b, 0x49, 0x57, 0xbf, 0xaf, 0x42, 0x1a, 0xbe, 0x64, 0x3f, 0x1f, 0x3f, 0xe3, 0x37, 0x45, 0xbf, +0x73, 0x2c, 0x0f, 0x3e, 0x3c, 0x4f, 0x48, 0x3f, 0x7b, 0xf4, 0x12, 0x3f, 0x04, 0x1b, 0x77, 0xbe, 0xfa, 0x0a, 0x52, 0x3f, 0x7a, 0x1c, 0x0e, 0x3f, 0xbe, 0xd8, 0x0b, 0xbe, 0x24, 0x80, 0x5b, 0x3f, 0xdd, 0xed, 0x02, 0x3f, 0x45, 0x82, 0x69, 0xbd, 0xa5, 0x82, 0x4e, 0x3f, 0x12, 0x67, 0x09, 0x3f, 0xfd, 0x4c, 0x7d, 0xbe, 0xb4, 0xca, 0x5c, 0x3f, 0x02, 0x0d, 0xfe, 0x3e, 0x2f, 0x33, 0xcc, 0xbd, 0x14, 0x76, 0x51, 0x3f, 0x06, 0x2d, 0x04, 0x3f, 0xb7, 0x7b, 0x81, 0xbe, 0x4f, 0x04, 0x61, 0x3f, +0xf6, 0x60, 0xf2, 0x3e, 0xe8, 0x6a, 0x6b, 0xbd, 0x80, 0x7d, 0x74, 0xbf, 0xee, 0x3f, 0xb2, 0xbd, 0xa4, 0x1b, 0x91, 0x3e, 0xe5, 0x7f, 0xea, 0x3e, 0xe8, 0x4a, 0xac, 0x3e, 0xb1, 0xa2, 0x52, 0x3f, 0x21, 0x74, 0x0c, 0x3f, 0x0d, 0xa8, 0xdf, 0x3e, 0xdd, 0x7d, 0x36, 0x3f, 0xe5, 0x61, 0xd1, 0x3e, 0xbc, 0xb1, 0xe0, 0x3e, 0x8d, 0xd3, 0x4c, 0x3f, 0xcc, 0x61, 0xff, 0x3e, 0x50, 0x1a, 0x02, 0x3f, 0xd8, 0xbb, 0x33, 0x3f, 0x43, 0xe6, 0xea, 0x3e, 0x1b, 0xb9, 0xd6, 0x3e, 0x6e, 0x89, 0x48, 0x3f, +0x07, 0x27, 0xfa, 0x3e, 0xb2, 0x82, 0x97, 0x3e, 0x58, 0x20, 0x52, 0x3f, 0x59, 0x4f, 0xad, 0x3e, 0xb2, 0x2c, 0x0c, 0x3f, 0x29, 0xe7, 0x43, 0x3f, 0x92, 0x74, 0xcd, 0x3e, 0x04, 0x71, 0x0a, 0x3f, 0xff, 0x40, 0x3d, 0x3f, 0x8b, 0x53, 0xe5, 0x3e, 0x39, 0xf0, 0x12, 0x3f, 0xfa, 0x7d, 0x2f, 0x3f, 0x68, 0x94, 0x12, 0x3f, 0x6c, 0x3f, 0xb9, 0x3d, 0xbf, 0x99, 0x50, 0x3f, 0xdc, 0xf3, 0x28, 0x3f, 0x34, 0x68, 0x78, 0x3e, 0x4f, 0x07, 0x36, 0x3f, 0x0d, 0xff, 0x01, 0x3f, 0xbb, 0x26, 0x64, 0x3e, +0xc4, 0x08, 0x55, 0x3f, 0x92, 0xcd, 0x19, 0x3f, 0x13, 0x98, 0xb6, 0x3e, 0x78, 0x27, 0x37, 0x3f, 0x13, 0x81, 0x06, 0x3f, 0x63, 0x98, 0x33, 0x3e, 0xe6, 0x23, 0x55, 0x3f, 0x63, 0xb7, 0x17, 0x3f, 0xcb, 0x12, 0x9d, 0x3d, 0x28, 0x43, 0x4d, 0x3f, 0x7f, 0x4d, 0x32, 0x3f, 0x7c, 0x9d, 0x24, 0xbe, 0xd5, 0x06, 0x33, 0x3f, 0x0c, 0x40, 0x3f, 0x3f, 0xdc, 0x0f, 0x78, 0xbd, 0x85, 0x77, 0x29, 0x3f, 0x82, 0xc6, 0x24, 0x3f, 0xfe, 0x62, 0x36, 0xbd, 0xd0, 0x96, 0x43, 0x3f, 0xe5, 0x63, 0x37, 0x3f, +0x4b, 0xad, 0xb7, 0x3d, 0xa7, 0x22, 0x31, 0x3f, 0x4a, 0x0c, 0x2e, 0x3f, 0x23, 0x12, 0x85, 0xbb, 0xaa, 0xba, 0x3b, 0x3f, 0xa6, 0x7c, 0x40, 0x3f, 0x3b, 0x51, 0x92, 0xbd, 0xc5, 0xc7, 0x27, 0x3f, 0x75, 0x00, 0x54, 0x3f, 0x1d, 0x01, 0x6c, 0xbe, 0x35, 0xce, 0x02, 0x3f, 0x52, 0x47, 0x43, 0x3f, 0xee, 0x22, 0x4c, 0xbe, 0x29, 0x79, 0x1d, 0x3f, 0xfa, 0x25, 0x56, 0x3f, 0x88, 0x0d, 0x96, 0xbe, 0x52, 0x0b, 0xed, 0x3e, 0xa6, 0xf0, 0x40, 0x3f, 0x77, 0xbd, 0x84, 0xbe, 0xed, 0x9c, 0x1a, 0x3f, +0x99, 0xb8, 0x4d, 0x3f, 0x94, 0x6c, 0x05, 0xbe, 0x0d, 0xab, 0x14, 0x3f, 0xde, 0x74, 0x5b, 0x3f, 0x0c, 0x76, 0x33, 0xbe, 0xe7, 0xe2, 0xf7, 0x3e, 0x24, 0xf2, 0x69, 0x3f, 0x99, 0x0c, 0x27, 0xbe, 0xae, 0x61, 0xbe, 0x3e, 0x4a, 0x79, 0x75, 0x3f, 0xee, 0x7b, 0x54, 0xbd, 0xf9, 0xdb, 0x8e, 0x3e, 0xc4, 0xb1, 0x6a, 0x3f, 0x91, 0x81, 0x4c, 0xbe, 0x5d, 0x18, 0xb1, 0x3e, 0x0e, 0x65, 0x74, 0x3f, 0xe0, 0x2e, 0x7b, 0xbc, 0x59, 0x35, 0x98, 0x3e, 0x67, 0x42, 0x63, 0x3f, 0x06, 0xbb, 0x11, 0xbe, +0xc3, 0x28, 0xe0, 0x3e, 0x3e, 0xe9, 0x60, 0x3f, 0x40, 0x4c, 0xc2, 0x3c, 0x3e, 0x3f, 0xf4, 0x3e, 0x51, 0x49, 0x49, 0x3f, 0xc9, 0x03, 0xb9, 0x3e, 0x0e, 0x4e, 0x00, 0x3f, 0xfd, 0x83, 0x58, 0x3f, 0xab, 0xe8, 0x4f, 0x3e, 0x27, 0xa1, 0xfc, 0x3e, 0xfb, 0xb1, 0x61, 0x3f, 0xca, 0x8c, 0xbf, 0x3e, 0x98, 0x4e, 0x93, 0x3e, 0x75, 0x3a, 0x70, 0x3f, 0xcf, 0x2d, 0x44, 0x3e, 0x18, 0x41, 0x93, 0x3e, 0x83, 0xf6, 0x76, 0x3f, 0x94, 0xbe, 0x10, 0x3e, 0x7e, 0x8a, 0x63, 0x3e, 0xdd, 0x7c, 0x6b, 0x3f, +0x03, 0x77, 0xb0, 0x3e, 0xd5, 0xb0, 0x3f, 0x3e, 0x3c, 0x49, 0x2a, 0x3f, 0x4b, 0xab, 0x09, 0x3f, 0x91, 0x9c, 0x04, 0x3f, 0xdd, 0x5f, 0x39, 0x3f, 0x71, 0xe8, 0xed, 0x3e, 0x18, 0x78, 0x02, 0x3f, 0x8d, 0x5f, 0x3c, 0x3f, 0x43, 0xe7, 0x19, 0x3f, 0x96, 0x90, 0x9f, 0x3e, 0x70, 0xb0, 0x4f, 0x3f, 0x8f, 0xde, 0x00, 0x3f, 0x08, 0x3c, 0x98, 0x3e, 0x24, 0xef, 0x58, 0x3f, 0x11, 0xc5, 0x00, 0x3f, 0x6e, 0x13, 0x2e, 0x3e, 0x22, 0xdf, 0x41, 0x3f, 0x56, 0x63, 0x21, 0x3f, 0x83, 0x86, 0x2e, 0x3e, +0x44, 0xdc, 0x0c, 0x3f, 0xff, 0x91, 0x29, 0x3f, 0x9e, 0x27, 0x02, 0x3f, 0xda, 0xa8, 0x1a, 0x3f, 0xcc, 0x79, 0x1a, 0x3f, 0x1d, 0x3e, 0x05, 0x3f, 0x0f, 0x0b, 0x0d, 0x3f, 0x08, 0x57, 0x44, 0x3f, 0xc5, 0x71, 0xa8, 0x3e, 0x5c, 0x74, 0x26, 0x3f, 0x72, 0xf9, 0x2f, 0x3f, 0x47, 0xac, 0xa5, 0x3e, 0xff, 0xb0, 0x25, 0x3f, 0x02, 0x67, 0x3d, 0x3f, 0x54, 0x00, 0x3c, 0x3e, 0xf9, 0x49, 0x05, 0x3f, 0x7b, 0xbe, 0x52, 0x3f, 0x87, 0xc2, 0x67, 0x3e, 0x98, 0x89, 0xaa, 0x3e, 0x83, 0xc1, 0x45, 0x3f, +0x7b, 0x69, 0x0a, 0x3f, 0xe7, 0x8c, 0xe8, 0x3e, 0x1e, 0x16, 0x42, 0x3f, 0xd6, 0x8d, 0xef, 0x3e, 0xb4, 0x1e, 0x6e, 0x3e, 0xb5, 0x4f, 0x57, 0x3f, 0xe0, 0x10, 0xfa, 0x3e, 0xff, 0x22, 0xc8, 0x3e, 0x2d, 0xce, 0x58, 0x3f, 0x6c, 0x95, 0xb8, 0x3e, 0x0b, 0xb5, 0xbe, 0x3e, 0x9e, 0x7c, 0x5e, 0x3f, 0x48, 0xa7, 0xa6, 0x3e, 0x77, 0xf2, 0x91, 0x3e, 0xb6, 0xd6, 0x53, 0x3f, 0xda, 0xab, 0xf7, 0x3e, 0x99, 0x49, 0x74, 0x3e, 0x79, 0x73, 0x34, 0x3f, 0x0d, 0x02, 0x2b, 0x3f, 0xc6, 0xf7, 0xad, 0x3e, +0x7c, 0x63, 0x2c, 0x3f, 0x4d, 0x15, 0x28, 0x3f, 0x81, 0x3f, 0xa4, 0x3e, 0xaa, 0x0a, 0x31, 0x3f, 0x8a, 0xac, 0x25, 0x3f, 0x19, 0x76, 0x54, 0x3f, 0xef, 0xfd, 0xa5, 0x3e, 0x2a, 0x72, 0xe8, 0x3e, 0xda, 0xc4, 0x49, 0x3f, 0x57, 0x7c, 0xd3, 0x3e, 0xe0, 0x9c, 0xe9, 0x3e, 0xf6, 0x5c, 0x5e, 0x3f, 0x03, 0x22, 0xbc, 0x3e, 0x7a, 0x33, 0xaa, 0x3e, 0x6e, 0xa7, 0x51, 0x3f, 0x5c, 0x1d, 0xe0, 0x3e, 0x32, 0xfe, 0xbd, 0x3e, 0x96, 0x42, 0x18, 0x3f, 0xf0, 0xfc, 0x42, 0x3f, 0xd7, 0xa4, 0x83, 0xbe, +0x0a, 0x9d, 0x3b, 0x3f, 0x42, 0x06, 0x16, 0x3f, 0xe8, 0xf8, 0xb0, 0xbe, 0xa8, 0xff, 0x40, 0x3f, 0x9b, 0xa9, 0x08, 0x3f, 0x05, 0x12, 0xc4, 0x3e, 0xfa, 0xec, 0x5c, 0x3f, 0xde, 0xac, 0x51, 0x3e, 0x92, 0x79, 0xec, 0x3e, 0xbd, 0x01, 0x5e, 0x3f, 0xca, 0x53, 0x46, 0x3e, 0x01, 0xde, 0xea, 0x3e, 0x57, 0x92, 0x68, 0x3f, 0xd2, 0xe0, 0xb6, 0xbc, 0xc1, 0xab, 0xd5, 0x3e, 0x12, 0xdc, 0x70, 0x3f, 0xd1, 0xcd, 0xfe, 0xb9, 0x31, 0x77, 0xad, 0x3e, 0x94, 0x66, 0x77, 0x3f, 0xb5, 0x1b, 0x2d, 0xbe, +0xe2, 0x3a, 0x46, 0xbe, 0x7c, 0x63, 0x6c, 0x3f, 0xeb, 0x55, 0xc4, 0xbe, 0xee, 0x25, 0x8d, 0x3c, 0x80, 0x7e, 0x73, 0x3f, 0x74, 0x40, 0xd2, 0x3d, 0x30, 0x13, 0x95, 0x3e, 0x6c, 0x08, 0x5e, 0x3f, 0x7e, 0xc5, 0x4a, 0x3e, 0x4e, 0xd1, 0xe9, 0x3e, 0xf7, 0x5b, 0x5b, 0x3f, 0x79, 0xcb, 0x85, 0x3e, 0x38, 0x87, 0xe3, 0x3e, 0xb4, 0x8d, 0x6b, 0x3f, 0x92, 0x41, 0x86, 0x3e, 0xdd, 0xeb, 0x94, 0x3e, 0xc0, 0x91, 0x58, 0x3f, 0xbf, 0x48, 0xc0, 0x3e, 0xd1, 0xce, 0xc1, 0xbe, 0xae, 0x2a, 0x6f, 0x3f, +0x61, 0x6d, 0xec, 0x3d, 0x7e, 0xc3, 0xac, 0xbe, 0x4d, 0x85, 0x34, 0x3f, 0x59, 0xf7, 0x17, 0x3f, 0x2f, 0x8a, 0xc6, 0x3e, 0x96, 0x23, 0x38, 0x3f, 0xde, 0x92, 0x18, 0x3f, 0x05, 0xc2, 0xb6, 0x3e, 0x87, 0x6b, 0x39, 0x3f, 0x67, 0x47, 0x0a, 0x3f, 0xf9, 0x66, 0xdb, 0x3e, 0xee, 0xb2, 0xcf, 0x3e, 0xc6, 0xf7, 0x69, 0x3f, 0x8b, 0x89, 0x4d, 0xbc, 0x1e, 0x1b, 0xf9, 0x3e, 0xa3, 0xaf, 0x5c, 0x3f, 0x69, 0x57, 0x11, 0xbe, 0x54, 0xc6, 0x37, 0x3f, 0x88, 0x10, 0x1b, 0x3f, 0x96, 0xb3, 0xaf, 0x3e, +0xd6, 0xe3, 0x3a, 0x3f, 0xb2, 0x9b, 0x15, 0x3f, 0xaa, 0x63, 0xb5, 0x3e, 0x8f, 0xc6, 0x39, 0x3f, 0x54, 0xe1, 0x0f, 0x3f, 0x7f, 0x31, 0xcb, 0x3e, 0x5a, 0xa0, 0x31, 0x3f, 0x0f, 0x7d, 0x17, 0x3f, 0x19, 0x1b, 0xd2, 0x3e, 0xb5, 0xf9, 0x9f, 0x3e, 0xbc, 0xce, 0x6e, 0x3f, 0xc0, 0xb1, 0x37, 0x3e, 0x04, 0x8c, 0x5e, 0x3e, 0xe7, 0x50, 0x5e, 0x3f, 0x6b, 0x2d, 0xe4, 0x3e, 0x42, 0x3d, 0x21, 0x3f, 0x59, 0xa6, 0x0b, 0x3f, 0x4c, 0x8c, 0x0d, 0x3f, 0xd8, 0x2a, 0x31, 0x3e, 0xee, 0xc9, 0x33, 0x3f, +0xf8, 0xc6, 0x30, 0x3f, 0xca, 0xbe, 0x13, 0x3f, 0xed, 0x4a, 0xeb, 0x3e, 0xd9, 0xd1, 0x2c, 0x3f, 0xb6, 0x81, 0x5b, 0x3e, 0xf5, 0x12, 0x07, 0x3f, 0x59, 0x6d, 0x52, 0x3f, 0xde, 0x3b, 0x1a, 0x3f, 0xee, 0x3e, 0xc7, 0x3e, 0xfa, 0x63, 0x32, 0x3f, 0x1c, 0x7d, 0x30, 0x3f, 0x1d, 0xb0, 0xc3, 0x3e, 0x98, 0x86, 0x1d, 0x3f, 0xb6, 0x2b, 0x30, 0x3f, 0xc8, 0xec, 0xfc, 0x3e, 0x8d, 0x0a, 0x08, 0x3f, 0x73, 0x2f, 0x4c, 0x3f, 0xab, 0x21, 0xb9, 0x3e, 0x2b, 0x31, 0xf7, 0x3e, 0x7c, 0xd4, 0x2b, 0x3f, +0x6e, 0xdc, 0xba, 0x3e, 0x91, 0x2b, 0x25, 0x3f, 0xe3, 0x6e, 0x40, 0x3f, 0x2a, 0x35, 0xab, 0x3e, 0x55, 0x86, 0x11, 0x3f, 0x59, 0x6b, 0xa0, 0x3e, 0x16, 0xf9, 0xcd, 0x3e, 0xe7, 0x37, 0x5c, 0x3f, 0x5e, 0x7f, 0xd2, 0x3e, 0xc0, 0x77, 0xa3, 0x3e, 0x21, 0x95, 0x5a, 0x3f, 0xe1, 0xd0, 0x37, 0x3f, 0xc0, 0x97, 0xc2, 0x3e, 0xbb, 0x44, 0x15, 0x3f, 0x13, 0x63, 0x49, 0x3f, 0xf6, 0x23, 0xd5, 0x3e, 0x4c, 0x6d, 0xe9, 0x3e, 0xb0, 0xe1, 0x39, 0x3f, 0x43, 0xe6, 0xca, 0x3e, 0xe0, 0xd8, 0x0f, 0x3f, +0xe1, 0x79, 0x4d, 0x3f, 0x85, 0x40, 0xce, 0x3e, 0x6d, 0x37, 0xe1, 0x3e, 0xe2, 0x76, 0xf0, 0x3e, 0x53, 0xb0, 0x76, 0x3e, 0xac, 0x6e, 0x59, 0x3f, 0xdc, 0xd8, 0xfc, 0x3e, 0xbb, 0xef, 0xf8, 0x3d, 0x6a, 0x6b, 0x5c, 0x3f, 0x8c, 0xda, 0x35, 0x3f, 0xba, 0xf2, 0xb9, 0x3e, 0x43, 0x57, 0x1a, 0x3f, 0x6b, 0x10, 0x46, 0x3f, 0xa6, 0xed, 0x9f, 0x3e, 0x6d, 0x1c, 0x0d, 0x3f, 0x13, 0x0b, 0x38, 0x3f, 0x4e, 0xb4, 0x83, 0x3e, 0x7b, 0x4f, 0x25, 0x3f, 0x97, 0x70, 0x44, 0x3f, 0x61, 0xfe, 0xc2, 0x3e, +0x3c, 0x11, 0x04, 0x3f, 0x64, 0xe5, 0x07, 0x3f, 0x32, 0x3c, 0x36, 0xbd, 0x2f, 0xa7, 0x58, 0x3f, 0x22, 0xa5, 0x1d, 0x3f, 0xb1, 0xc3, 0x80, 0xbe, 0xe1, 0x26, 0x3f, 0x3f, 0x7b, 0x84, 0x46, 0x3f, 0x43, 0x71, 0xe7, 0x3d, 0x29, 0x07, 0x1f, 0x3f, 0xa2, 0xb3, 0x58, 0x3f, 0x7d, 0x08, 0x5a, 0x3e, 0x77, 0xd7, 0xf9, 0x3e, 0xb8, 0x77, 0x59, 0x3f, 0x26, 0x3a, 0x4b, 0x3c, 0x46, 0x08, 0x07, 0x3f, 0x1e, 0x33, 0x50, 0x3f, 0x2c, 0x28, 0x7c, 0x3e, 0x83, 0xf6, 0x06, 0x3f, 0xfa, 0x5d, 0x3c, 0x3f, +0x57, 0x43, 0xda, 0xbe, 0x46, 0xb3, 0x06, 0x3f, 0xa8, 0xa7, 0x57, 0x3f, 0xae, 0xb6, 0xf2, 0xbe, 0xbb, 0x2b, 0x83, 0x3e, 0x5d, 0x1a, 0x43, 0x3f, 0xe6, 0x3b, 0x78, 0x3d, 0xfb, 0x03, 0x25, 0x3f, 0x5d, 0x1a, 0x43, 0x3f, 0xe6, 0x3b, 0x78, 0x3d, 0xfb, 0x03, 0x25, 0x3f, 0x8c, 0x9e, 0x2b, 0x3f, 0x86, 0x3b, 0xd7, 0x3d, 0x39, 0x0a, 0x3c, 0x3f, 0x8c, 0x9e, 0x2b, 0x3f, 0x86, 0x3b, 0xd7, 0x3d, 0x39, 0x0a, 0x3c, 0x3f, 0xb5, 0x32, 0x09, 0x3f, 0x6e, 0xd8, 0xb6, 0x3e, 0xe4, 0xd7, 0x43, 0x3f, +0xb5, 0x32, 0x09, 0x3f, 0x6e, 0xd8, 0xb6, 0x3e, 0xe4, 0xd7, 0x43, 0x3f, 0x0c, 0x04, 0x05, 0x3f, 0x2b, 0x14, 0xf1, 0x3e, 0xbe, 0x84, 0x36, 0x3f, 0x0c, 0x04, 0x05, 0x3f, 0x2b, 0x14, 0xf1, 0x3e, 0xbe, 0x84, 0x36, 0x3f, 0x90, 0xbc, 0x17, 0x3f, 0x79, 0xce, 0x16, 0x3e, 0x4e, 0xb5, 0x4a, 0x3f, 0x90, 0xbc, 0x17, 0x3f, 0x79, 0xce, 0x16, 0x3e, 0x4e, 0xb5, 0x4a, 0x3f, 0x40, 0x16, 0x0a, 0x3f, 0x53, 0x58, 0x69, 0x3e, 0x51, 0x85, 0x4f, 0x3f, 0x40, 0x16, 0x0a, 0x3f, 0x53, 0x58, 0x69, 0x3e, +0x51, 0x85, 0x4f, 0x3f, 0x2f, 0x8a, 0x56, 0x3f, 0x4c, 0xdf, 0x2b, 0xbd, 0x89, 0x42, 0x0b, 0x3f, 0x2f, 0x8a, 0x56, 0x3f, 0x4c, 0xdf, 0x2b, 0xbd, 0x89, 0x42, 0x0b, 0x3f, 0x43, 0x1d, 0x4e, 0x3f, 0x24, 0x7e, 0xc5, 0x3c, 0xd5, 0xb4, 0x17, 0x3f, 0x43, 0x1d, 0x4e, 0x3f, 0x24, 0x7e, 0xc5, 0x3c, 0xd5, 0xb4, 0x17, 0x3f, 0x58, 0x00, 0xeb, 0x3e, 0x11, 0xdf, 0x11, 0x3f, 0xae, 0x80, 0x2e, 0x3f, 0x58, 0x00, 0xeb, 0x3e, 0x11, 0xdf, 0x11, 0x3f, 0xae, 0x80, 0x2e, 0x3f, 0xa0, 0xfd, 0xb8, 0x3e, +0x81, 0xaf, 0x3c, 0x3f, 0xa0, 0x36, 0x12, 0x3f, 0xa0, 0xfd, 0xb8, 0x3e, 0x81, 0xaf, 0x3c, 0x3f, 0xa0, 0x36, 0x12, 0x3f, 0xf3, 0x1b, 0x6e, 0x3f, 0x8c, 0x2f, 0xda, 0xbd, 0x51, 0xf5, 0xb3, 0x3e, 0xf3, 0x1b, 0x6e, 0x3f, 0x8c, 0x2f, 0xda, 0xbd, 0x51, 0xf5, 0xb3, 0x3e, 0x00, 0x73, 0x61, 0x3f, 0xb9, 0x4e, 0xe3, 0xbd, 0xa7, 0xce, 0xeb, 0x3e, 0x00, 0x73, 0x61, 0x3f, 0xb9, 0x4e, 0xe3, 0xbd, 0xa7, 0xce, 0xeb, 0x3e, 0xfc, 0x36, 0xa4, 0x3e, 0x02, 0x80, 0x5b, 0x3f, 0xbf, 0x0c, 0xce, 0x3e, +0xfc, 0x36, 0xa4, 0x3e, 0x02, 0x80, 0x5b, 0x3f, 0xbf, 0x0c, 0xce, 0x3e, 0x43, 0xff, 0xe4, 0x3e, 0x8f, 0xfe, 0x5b, 0x3f, 0xe3, 0xe1, 0x7d, 0x3e, 0x43, 0xff, 0xe4, 0x3e, 0x8f, 0xfe, 0x5b, 0x3f, 0xe3, 0xe1, 0x7d, 0x3e, 0x79, 0xaa, 0x73, 0x3f, 0x6d, 0x56, 0x6d, 0x3e, 0x34, 0x9d, 0x4d, 0x3e, 0x79, 0xaa, 0x73, 0x3f, 0x6d, 0x56, 0x6d, 0x3e, 0x34, 0x9d, 0x4d, 0x3e, 0xa6, 0xd3, 0x76, 0x3f, 0x33, 0xe0, 0xac, 0x3c, 0xc7, 0x66, 0x87, 0x3e, 0xa6, 0xd3, 0x76, 0x3f, 0x33, 0xe0, 0xac, 0x3c, +0xc7, 0x66, 0x87, 0x3e, 0x70, 0x3f, 0x14, 0x3f, 0x1f, 0xf4, 0x4c, 0x3f, 0xf1, 0x9c, 0x1d, 0x3e, 0x70, 0x3f, 0x14, 0x3f, 0x1f, 0xf4, 0x4c, 0x3f, 0xf1, 0x9c, 0x1d, 0x3e, 0x3b, 0x8b, 0x32, 0x3f, 0x0a, 0xa0, 0x34, 0x3f, 0xef, 0x8a, 0x00, 0x3e, 0x3b, 0x8b, 0x32, 0x3f, 0x0a, 0xa0, 0x34, 0x3f, 0xef, 0x8a, 0x00, 0x3e, 0xaa, 0x64, 0x50, 0x3f, 0x9a, 0xeb, 0x10, 0x3f, 0x95, 0x0b, 0x05, 0x3e, 0xaa, 0x64, 0x50, 0x3f, 0x9a, 0xeb, 0x10, 0x3f, 0x95, 0x0b, 0x05, 0x3e, 0xe4, 0xdb, 0x63, 0x3f, +0xca, 0xa6, 0xdc, 0x3e, 0xf2, 0x06, 0x18, 0x3e, 0xe4, 0xdb, 0x63, 0x3f, 0xca, 0xa6, 0xdc, 0x3e, 0xf2, 0x06, 0x18, 0x3e, 0x9e, 0x45, 0xef, 0x3c, 0x48, 0xa8, 0x61, 0x3f, 0xe7, 0x51, 0xf1, 0xbe, 0x9e, 0x45, 0xef, 0x3c, 0x48, 0xa8, 0x61, 0x3f, 0xe7, 0x51, 0xf1, 0xbe, 0x0e, 0x87, 0xc5, 0x3d, 0x21, 0x76, 0x3a, 0x3f, 0x86, 0xa9, 0x2d, 0xbf, 0x0e, 0x87, 0xc5, 0x3d, 0x21, 0x76, 0x3a, 0x3f, 0x86, 0xa9, 0x2d, 0xbf, 0x3b, 0xdf, 0xef, 0x3e, 0x1b, 0x99, 0x47, 0x3d, 0x7c, 0xd2, 0x61, 0xbf, +0x3b, 0xdf, 0xef, 0x3e, 0x1b, 0x99, 0x47, 0x3d, 0x7c, 0xd2, 0x61, 0xbf, 0xab, 0x59, 0x23, 0x3f, 0x8b, 0xc3, 0x81, 0xbe, 0x58, 0x20, 0x3a, 0xbf, 0xab, 0x59, 0x23, 0x3f, 0x8b, 0xc3, 0x81, 0xbe, 0x58, 0x20, 0x3a, 0xbf, 0x0b, 0x9a, 0x36, 0x3e, 0x91, 0xf3, 0x02, 0x3f, 0xe0, 0x2e, 0x57, 0xbf, 0x0b, 0x9a, 0x36, 0x3e, 0x91, 0xf3, 0x02, 0x3f, 0xe0, 0x2e, 0x57, 0xbf, 0x1c, 0x26, 0xa2, 0x3e, 0x98, 0x4c, 0x9d, 0x3e, 0x9d, 0xbb, 0x65, 0xbf, 0x1c, 0x26, 0xa2, 0x3e, 0x98, 0x4c, 0x9d, 0x3e, +0x9d, 0xbb, 0x65, 0xbf, 0x7a, 0x1b, 0x6b, 0xbe, 0x2f, 0x17, 0x79, 0x3f, 0xc3, 0xf4, 0xbd, 0x3c, 0x7a, 0x1b, 0x6b, 0xbe, 0x2f, 0x17, 0x79, 0x3f, 0xc3, 0xf4, 0xbd, 0x3c, 0xb5, 0xfa, 0xca, 0xbd, 0x94, 0x16, 0x76, 0x3f, 0xe3, 0xa5, 0x83, 0xbe, 0xb5, 0xfa, 0xca, 0xbd, 0x94, 0x16, 0x76, 0x3f, 0xe3, 0xa5, 0x83, 0xbe, 0xa8, 0xe4, 0x30, 0x3f, 0xe0, 0x66, 0x0d, 0xbf, 0xca, 0xbf, 0xee, 0xbe, 0xa8, 0xe4, 0x30, 0x3f, 0xe0, 0x66, 0x0d, 0xbf, 0xca, 0xbf, 0xee, 0xbe, 0xd0, 0x5e, 0x1d, 0x3f, +0xc3, 0x64, 0x46, 0xbf, 0x9f, 0x3a, 0x16, 0xbe, 0xd0, 0x5e, 0x1d, 0x3f, 0xc3, 0x64, 0x46, 0xbf, 0x9f, 0x3a, 0x16, 0xbe, 0x62, 0x67, 0x5a, 0xbe, 0x5f, 0xb3, 0x2c, 0x3f, 0x92, 0xe9, 0x34, 0x3f, 0x62, 0x67, 0x5a, 0xbe, 0x5f, 0xb3, 0x2c, 0x3f, 0x92, 0xe9, 0x34, 0x3f, 0x54, 0xe3, 0x8d, 0xbe, 0x0b, 0x61, 0x61, 0x3f, 0x06, 0x0d, 0xc5, 0x3e, 0x54, 0xe3, 0x8d, 0xbe, 0x0b, 0x61, 0x61, 0x3f, 0x06, 0x0d, 0xc5, 0x3e, 0x48, 0xa8, 0x05, 0x3f, 0xa9, 0xdc, 0x54, 0xbf, 0xf6, 0x60, 0x42, 0x3e, +0x48, 0xa8, 0x05, 0x3f, 0xa9, 0xdc, 0x54, 0xbf, 0xf6, 0x60, 0x42, 0x3e, 0xab, 0x78, 0xd3, 0x3e, 0xa9, 0x88, 0x33, 0xbf, 0x77, 0xbd, 0x14, 0x3f, 0xab, 0x78, 0xd3, 0x3e, 0xa9, 0x88, 0x33, 0xbf, 0x77, 0xbd, 0x14, 0x3f, 0x3f, 0xc4, 0x86, 0x3c, 0xc5, 0xe6, 0x9b, 0x3e, 0xa7, 0xce, 0x73, 0x3f, 0x3f, 0xc4, 0x86, 0x3c, 0xc5, 0xe6, 0x9b, 0x3e, 0xa7, 0xce, 0x73, 0x3f, 0x26, 0xc3, 0xd1, 0xbd, 0x23, 0xda, 0xf6, 0x3e, 0x38, 0xbe, 0x5e, 0x3f, 0x26, 0xc3, 0xd1, 0xbd, 0x23, 0xda, 0xf6, 0x3e, +0x38, 0xbe, 0x5e, 0x3f, 0xf0, 0x86, 0xa4, 0x3e, 0xa6, 0x25, 0xe6, 0xbe, 0xc0, 0x5e, 0x55, 0x3f, 0xf0, 0x86, 0xa4, 0x3e, 0xa6, 0x25, 0xe6, 0xbe, 0xc0, 0x5e, 0x55, 0x3f, 0x28, 0x46, 0x76, 0x3e, 0x35, 0xd4, 0x80, 0xbe, 0xe7, 0xfd, 0x6f, 0x3f, 0x28, 0x46, 0x76, 0x3e, 0x35, 0xd4, 0x80, 0xbe, 0xe7, 0xfd, 0x6f, 0x3f, 0x22, 0xdf, 0x35, 0x3e, 0x49, 0x81, 0x45, 0xbd, 0x94, 0xa0, 0x7b, 0x3f, 0x22, 0xdf, 0x35, 0x3e, 0x49, 0x81, 0x45, 0xbd, 0x94, 0xa0, 0x7b, 0x3f, 0xf5, 0xf6, 0xe7, 0x3d, +0x18, 0x41, 0x13, 0x3e, 0xa3, 0xac, 0x7b, 0x3f, 0xf5, 0xf6, 0xe7, 0x3d, 0x18, 0x41, 0x13, 0x3e, 0xa3, 0xac, 0x7b, 0x3f, 0x19, 0x54, 0x5b, 0x3f, 0xcd, 0x1f, 0x73, 0x3e, 0x4d, 0x68, 0xea, 0x3e, 0xf6, 0x62, 0x6c, 0x3f, 0x5f, 0xb4, 0x57, 0x3e, 0x3c, 0x4f, 0xa4, 0x3e, 0xab, 0xce, 0x4e, 0x3f, 0xba, 0x65, 0xaf, 0x3e, 0x04, 0x91, 0xf5, 0x3e, 0x9a, 0x25, 0x6d, 0x3f, 0x59, 0xdb, 0x9c, 0x3e, 0xa2, 0x5e, 0x60, 0x3e, 0x39, 0x9d, 0x64, 0x3f, 0xa1, 0x80, 0xcd, 0x3e, 0xf2, 0x5f, 0x50, 0x3e, +0xad, 0xa5, 0x30, 0x3f, 0x2d, 0xeb, 0xce, 0x3e, 0xc3, 0xb6, 0x19, 0x3f, 0x00, 0x1e, 0x35, 0x3f, 0x3e, 0x7a, 0xb3, 0x3e, 0xe3, 0x18, 0x1d, 0x3f, 0xd1, 0x92, 0x33, 0x3f, 0x87, 0xf8, 0x97, 0x3e, 0xd6, 0xe0, 0x25, 0x3f, 0x79, 0xaf, 0x4a, 0x3f, 0xdf, 0xc4, 0x04, 0x3f, 0x68, 0x40, 0xa5, 0x3e, 0x88, 0xb8, 0x41, 0x3f, 0x21, 0x3d, 0x11, 0x3f, 0xf9, 0x4c, 0xa6, 0x3e, 0x3a, 0x57, 0x54, 0x3f, 0x52, 0x0a, 0xf2, 0x3e, 0xfc, 0x55, 0x98, 0x3e, 0x00, 0xaa, 0x1c, 0x3f, 0xee, 0x5b, 0xdd, 0x3e, +0x26, 0x89, 0x29, 0x3f, 0x32, 0x39, 0x19, 0x3f, 0xa2, 0xd5, 0x09, 0x3f, 0x2b, 0xdb, 0x17, 0x3f, 0xb2, 0xd8, 0x22, 0x3f, 0xf2, 0xee, 0x18, 0x3f, 0xea, 0x06, 0xfa, 0x3e, 0xd8, 0x64, 0x29, 0x3f, 0x03, 0x78, 0xab, 0x3e, 0xed, 0xba, 0x2b, 0x3f, 0xbd, 0x52, 0x4a, 0x3f, 0xcd, 0x01, 0xb2, 0x3e, 0x52, 0x26, 0x01, 0x3f, 0x3d, 0x27, 0x39, 0x3f, 0x36, 0xc9, 0xbf, 0x3e, 0xb1, 0x85, 0x14, 0x3f, 0x8b, 0xdc, 0x4f, 0x3f, 0x74, 0x5f, 0xbe, 0x3e, 0x56, 0x62, 0xe6, 0x3e, 0x8e, 0x20, 0x5d, 0x3f, +0x97, 0x91, 0xe2, 0x3e, 0xd7, 0xc0, 0x76, 0x3e, 0x95, 0x7d, 0x33, 0x3f, 0x89, 0xb4, 0x19, 0x3f, 0x29, 0xea, 0xc4, 0x3e, 0xc1, 0xc9, 0x6e, 0x3f, 0x8a, 0x73, 0x24, 0x3e, 0x21, 0x3d, 0xa5, 0x3e, 0x4c, 0x89, 0x78, 0x3f, 0x16, 0x88, 0x2e, 0x3e, 0xe5, 0x98, 0x2c, 0x3e, 0xf8, 0x35, 0x62, 0x3f, 0xe5, 0xee, 0x33, 0x3e, 0x4d, 0x2e, 0xde, 0x3e, 0x77, 0x48, 0x75, 0x3f, 0xf4, 0x4e, 0x8d, 0x3e, 0x65, 0xfc, 0x9b, 0x3d, 0x4f, 0x21, 0x6b, 0x3f, 0xc4, 0x43, 0xc8, 0x3e, 0xf7, 0x21, 0x6f, 0x3d, +0x35, 0x96, 0x18, 0x3f, 0x68, 0xb0, 0x89, 0x3e, 0x4b, 0xaf, 0x41, 0x3f, 0x91, 0xb6, 0x21, 0x3f, 0xdd, 0x3c, 0x75, 0x3e, 0xa1, 0xbf, 0x3c, 0x3f, 0x35, 0xb7, 0x06, 0x3f, 0xe1, 0xef, 0x97, 0x3e, 0x54, 0x00, 0x4c, 0x3f, 0xe9, 0x9d, 0x36, 0x3f, 0x8d, 0x46, 0x32, 0x3f, 0x90, 0xf9, 0xa0, 0x3d, 0x91, 0x9d, 0x1b, 0x3f, 0x3b, 0xfd, 0x48, 0x3f, 0xa5, 0x11, 0xf3, 0x3d, 0x30, 0xba, 0x50, 0x3f, 0xe4, 0x2d, 0x13, 0x3f, 0xe7, 0x37, 0x8c, 0x3d, 0xc2, 0x87, 0xa2, 0x3e, 0xe1, 0x60, 0x3f, 0x3f, +0x4b, 0x5a, 0x15, 0x3f, 0x60, 0x56, 0xa8, 0x3e, 0x78, 0x80, 0x1b, 0x3f, 0xb4, 0x1f, 0x39, 0x3f, 0xf1, 0xd4, 0xc3, 0x3e, 0xbe, 0x17, 0x53, 0x3f, 0x8b, 0x6e, 0xd5, 0x3e, 0xea, 0xaf, 0xd7, 0x3e, 0xde, 0x3d, 0xd8, 0x3e, 0xee, 0x76, 0x4d, 0x3f, 0x69, 0xc7, 0x31, 0x3f, 0xf4, 0x6b, 0x3b, 0x3e, 0xdd, 0x24, 0x32, 0x3f, 0x30, 0x7e, 0x4a, 0x3f, 0xf5, 0x0f, 0x12, 0x3e, 0x27, 0x50, 0x18, 0x3f, 0xc6, 0xfb, 0x59, 0x3f, 0x0c, 0x5c, 0x1e, 0x3e, 0xc4, 0x43, 0x00, 0x3f, 0xaf, 0xce, 0x61, 0x3f, +0xd8, 0x2c, 0xef, 0x3e, 0x3b, 0xe0, 0x7a, 0x3d, 0x76, 0xfb, 0xfc, 0x3e, 0x52, 0x9e, 0x55, 0x3f, 0xac, 0xe6, 0x79, 0x3e, 0xc9, 0xad, 0x6d, 0x3f, 0xa6, 0xd1, 0x94, 0x3e, 0xe6, 0xe9, 0x6c, 0x3e, 0xc1, 0xfc, 0x65, 0x3f, 0x5a, 0x2c, 0x75, 0x3e, 0x1a, 0x85, 0xbc, 0x3e, 0x50, 0x8b, 0x6d, 0x3f, 0x50, 0x70, 0xb9, 0x3e, 0xe7, 0xfc, 0xb4, 0x3d, 0x22, 0xf8, 0x67, 0x3f, 0x38, 0x86, 0xd8, 0x3e, 0xb3, 0x95, 0x17, 0xbc, 0x8d, 0x99, 0x00, 0x3f, 0x63, 0x08, 0x08, 0xbf, 0x6a, 0x9f, 0x2e, 0xbf, +0x63, 0x7e, 0xf6, 0x3e, 0x24, 0x46, 0x0f, 0x3d, 0x72, 0x33, 0x60, 0xbf, 0xc1, 0x55, 0x52, 0x3f, 0x5e, 0x9c, 0xf8, 0x3b, 0x79, 0xea, 0x11, 0xbf, 0x33, 0xa7, 0x93, 0x3e, 0xdc, 0x0c, 0x6f, 0x3f, 0x64, 0xe8, 0x58, 0xbe, 0x79, 0xe6, 0x19, 0x3f, 0x94, 0xfa, 0x72, 0x3d, 0x8e, 0x02, 0x4c, 0xbf, 0x85, 0x0b, 0x7d, 0x3f, 0xb0, 0x02, 0x3c, 0x3d, 0xd4, 0xd7, 0x13, 0xbe, 0x38, 0x4d, 0x1b, 0x3f, 0x4e, 0x61, 0x49, 0x3f, 0x72, 0x15, 0xeb, 0xbd, 0x44, 0xfb, 0x78, 0x3f, 0x7c, 0xed, 0x99, 0x3c, +0xe2, 0x5a, 0x6d, 0xbe, 0xda, 0x92, 0x21, 0x3f, 0x75, 0x1a, 0x41, 0x3f, 0x01, 0x16, 0x39, 0xbe, 0x34, 0x63, 0x01, 0x3f, 0xa6, 0xb3, 0x5b, 0x3f, 0xd1, 0x77, 0xb7, 0xbd, 0xdc, 0xbb, 0x7a, 0x3f, 0xe3, 0x6e, 0x00, 0x3e, 0x27, 0xde, 0x21, 0xbe, 0x9d, 0x65, 0x2e, 0x3f, 0x21, 0x59, 0x34, 0xbf, 0x18, 0xd0, 0x4b, 0xbe, 0x68, 0x5a, 0x26, 0x3f, 0x7c, 0x9a, 0x2b, 0xbf, 0x29, 0x77, 0xb7, 0xbe, 0xb9, 0xff, 0xf8, 0x3e, 0x05, 0xa8, 0x5d, 0xbf, 0xaf, 0x95, 0xf0, 0xbd, 0x1a, 0x85, 0xe4, 0x3e, +0xf1, 0xd6, 0x5d, 0xbf, 0x8b, 0xa9, 0x64, 0xbe, 0xce, 0xfb, 0x3f, 0x3f, 0x75, 0xaf, 0x23, 0xbf, 0xd1, 0xaf, 0x2d, 0xbe, 0xa9, 0x68, 0x6c, 0x3e, 0xbf, 0xec, 0x3e, 0x3f, 0x87, 0xf8, 0x1f, 0x3f, 0x65, 0x56, 0x03, 0x3f, 0x91, 0x28, 0x28, 0x3f, 0x1d, 0x74, 0x0d, 0x3f, 0x88, 0x64, 0x28, 0x3e, 0xd0, 0x7a, 0x50, 0x3f, 0x53, 0x7a, 0x0e, 0x3f, 0x7a, 0x37, 0xde, 0x3e, 0x57, 0xb3, 0x3a, 0x3f, 0x0a, 0x67, 0x07, 0x3f, 0x17, 0xd3, 0x40, 0x3f, 0x05, 0xd8, 0xf7, 0x3e, 0x86, 0x04, 0xe4, 0x3e, +0x17, 0xd3, 0x40, 0x3f, 0x05, 0xd8, 0xf7, 0x3e, 0x86, 0x04, 0xe4, 0x3e, 0xba, 0xf8, 0x0b, 0x3e, 0x4a, 0xb6, 0x7a, 0xbf, 0x75, 0x93, 0x18, 0x3e, 0xba, 0xf8, 0x0b, 0x3e, 0x4a, 0xb6, 0x7a, 0xbf, 0x75, 0x93, 0x18, 0x3e, 0x42, 0x40, 0xfe, 0x3d, 0x2d, 0x27, 0x79, 0xbf, 0x63, 0xef, 0x45, 0x3e, 0x6f, 0x46, 0x3d, 0x3e, 0xe7, 0x51, 0x79, 0xbf, 0x38, 0xd9, 0x06, 0x3e, 0x1b, 0x2a, 0x26, 0x3e, 0x37, 0x8a, 0x7c, 0xbf, 0x0e, 0x86, 0xba, 0xbc, 0xa5, 0x49, 0x59, 0x3e, 0x3e, 0xcf, 0x77, 0xbf, +0xaf, 0x24, 0x09, 0x3e, 0xa5, 0x49, 0x59, 0x3e, 0x3e, 0xcf, 0x77, 0xbf, 0xaf, 0x24, 0x09, 0x3e, 0xd1, 0x03, 0xcf, 0x3e, 0x83, 0xde, 0x3f, 0x3f, 0x09, 0x32, 0x06, 0x3f, 0xd0, 0x5f, 0x14, 0x3f, 0x63, 0x98, 0x27, 0x3f, 0x2e, 0x75, 0xf8, 0x3e, 0xd0, 0x5f, 0x14, 0x3f, 0x63, 0x98, 0x27, 0x3f, 0x2e, 0x75, 0xf8, 0x3e, 0xf8, 0xe2, 0x7b, 0x3e, 0xa9, 0xbe, 0x63, 0x3f, 0xe2, 0x01, 0xc5, 0x3e, 0xa8, 0xe0, 0x88, 0x3e, 0xca, 0xdf, 0x55, 0x3f, 0x73, 0xd8, 0xf5, 0x3e, 0xa8, 0xe0, 0x88, 0x3e, +0xca, 0xdf, 0x55, 0x3f, 0x73, 0xd8, 0xf5, 0x3e, 0x3b, 0xfb, 0xb2, 0x3e, 0x64, 0xea, 0x5e, 0x3f, 0xfe, 0x0a, 0xb1, 0x3e, 0x85, 0x06, 0xa2, 0x3e, 0xc3, 0x0b, 0x42, 0x3f, 0xb8, 0x02, 0x12, 0x3f, 0xcc, 0x61, 0x57, 0x3e, 0xe2, 0x77, 0x43, 0x3f, 0x16, 0x4c, 0x1c, 0x3f, 0xfd, 0x15, 0x32, 0x3e, 0xc7, 0xf1, 0x43, 0x3f, 0x2c, 0x9e, 0x1e, 0x3f, 0x34, 0x2d, 0x99, 0x3e, 0x6e, 0x85, 0x3c, 0x3f, 0x97, 0x56, 0x1b, 0x3f, 0xa2, 0xf0, 0x49, 0x3e, 0x7e, 0x8c, 0x49, 0x3f, 0xf4, 0x8c, 0x15, 0x3f, +0x14, 0x21, 0x55, 0x3e, 0x5d, 0x51, 0x1a, 0x3e, 0x5e, 0x67, 0x77, 0x3f, 0xba, 0x83, 0xe8, 0x3e, 0xbe, 0x4f, 0x15, 0x3e, 0x08, 0x01, 0x61, 0x3f, 0xb6, 0x9d, 0x46, 0x3e, 0x9d, 0x0e, 0x28, 0x3f, 0xe4, 0x9e, 0x3a, 0x3f, 0x5c, 0xc9, 0xae, 0x3e, 0x5e, 0x48, 0x1b, 0x3f, 0x1c, 0xcf, 0x37, 0x3f, 0x2a, 0xc4, 0x33, 0x3f, 0xb9, 0xfd, 0x72, 0x3c, 0x60, 0x39, 0x36, 0x3f, 0x26, 0x34, 0x21, 0x3f, 0x0e, 0x4d, 0xd1, 0x3e, 0xb5, 0x1b, 0x29, 0x3f, 0x6e, 0xc2, 0xed, 0x3e, 0xeb, 0x8a, 0x99, 0xbe, +0x86, 0x54, 0x55, 0x3f, 0x97, 0x8b, 0x48, 0x3e, 0x44, 0x16, 0xf1, 0xbe, 0x48, 0x35, 0x5c, 0x3f, 0x20, 0x45, 0x7d, 0x3e, 0x22, 0xff, 0x74, 0xbf, 0x2a, 0x1a, 0x1b, 0x3e, 0xd7, 0xdd, 0xcc, 0x3e, 0xff, 0x96, 0x58, 0xbf, 0xd1, 0x5b, 0xb4, 0x3e, 0xb0, 0xe3, 0x1f, 0x3e, 0xcd, 0xcd, 0x57, 0xbf, 0x9f, 0xc8, 0x03, 0x3f, 0x22, 0x8a, 0xf9, 0x3e, 0xe6, 0x05, 0x4c, 0xbf, 0x5c, 0xae, 0xb6, 0x3e, 0xfa, 0x27, 0x78, 0x3e, 0x2a, 0x8d, 0x74, 0xbf, 0x16, 0x85, 0x2d, 0x3e, 0xdd, 0x5b, 0x61, 0x3e, +0xb3, 0xd3, 0x77, 0xbf, 0xd7, 0xbd, 0xf5, 0x3d, 0xb4, 0x3b, 0x14, 0x3e, 0x4a, 0x7c, 0x7a, 0xbf, 0xaa, 0xb7, 0x16, 0x3e, 0xd4, 0x99, 0x3b, 0x3e, 0xdf, 0x8b, 0x7b, 0xbf, 0x47, 0x72, 0xf9, 0xbc, 0x67, 0x7d, 0x8a, 0x3d, 0x87, 0x69, 0x7f, 0xbf, 0x0d, 0x52, 0x70, 0x3b, 0xcc, 0xce, 0xaa, 0x3e, 0xe4, 0x9e, 0x62, 0x3f, 0x80, 0xf4, 0xa5, 0x3e, 0x93, 0x6f, 0x86, 0x3e, 0xa0, 0x6d, 0x49, 0x3f, 0xe3, 0xfb, 0x0e, 0x3f, 0x77, 0x2f, 0x9f, 0x3e, 0x2b, 0xdb, 0x67, 0x3f, 0x64, 0x90, 0x93, 0x3e, +0xef, 0x00, 0x7f, 0x3e, 0xe4, 0x69, 0x51, 0x3f, 0x5e, 0xbb, 0x04, 0x3f, 0xbe, 0x16, 0x74, 0x3f, 0x90, 0x65, 0xe1, 0xbd, 0xc4, 0xb4, 0x8f, 0x3e, 0x51, 0x4b, 0x7b, 0x3f, 0x22, 0x70, 0x84, 0xbd, 0xf0, 0xe0, 0x37, 0x3e, 0x6d, 0x3c, 0x54, 0x3f, 0x97, 0x56, 0xcb, 0xbe, 0xd6, 0x8b, 0xc9, 0x3e, 0x6d, 0x1a, 0x47, 0x3f, 0x13, 0xf4, 0xd7, 0xbe, 0xe4, 0x9e, 0xee, 0x3e, 0x68, 0xe7, 0x44, 0x3f, 0x25, 0x3d, 0x14, 0xbf, 0xd7, 0x6b, 0x8a, 0x3e, 0x13, 0xb8, 0x6d, 0x3f, 0x8d, 0xeb, 0x1f, 0x3e, +0xff, 0x5c, 0xac, 0x3e, 0x77, 0xf5, 0x7e, 0x3f, 0x88, 0xd7, 0x35, 0x3d, 0xa8, 0x8f, 0xa0, 0x3d, 0xa0, 0xe0, 0x82, 0x3e, 0x21, 0x5c, 0x69, 0xbf, 0x15, 0xe3, 0xa4, 0x3e, 0xc8, 0xed, 0xe7, 0x3e, 0xd0, 0xb7, 0x45, 0xbf, 0x8b, 0xff, 0xe3, 0x3e, 0x11, 0x51, 0x7c, 0x3f, 0x22, 0x6d, 0x63, 0xbc, 0xae, 0x7e, 0x2c, 0xbe, 0x9e, 0x5e, 0x39, 0x3f, 0x7f, 0x6a, 0x30, 0xbf, 0x5d, 0xa3, 0xe5, 0x3c, 0xdc, 0xb8, 0x75, 0x3f, 0x00, 0xe3, 0x19, 0xbd, 0x43, 0x53, 0x8e, 0xbe, 0xbf, 0x49, 0x2b, 0x3f, +0x53, 0xb2, 0x38, 0xbf, 0x5f, 0x96, 0x36, 0xbe, 0x04, 0x58, 0xa4, 0x3d, 0xa5, 0x2c, 0x7f, 0xbf, 0xac, 0xc5, 0xa7, 0x39, 0x23, 0x6a, 0x12, 0x3e, 0xe3, 0x89, 0x78, 0xbf, 0xec, 0xf7, 0x44, 0x3e, 0xb5, 0xa7, 0xcc, 0x3e, 0x76, 0x54, 0x61, 0x3f, 0xcd, 0x04, 0x83, 0x3e, 0xdc, 0xb9, 0xc0, 0x3e, 0x9c, 0x6d, 0x3e, 0x3f, 0x63, 0x60, 0x0d, 0x3f, 0xbe, 0x6b, 0x6c, 0x3f, 0x51, 0xd9, 0xc0, 0x3e, 0x8c, 0x48, 0x94, 0x3d, 0x39, 0xd5, 0x6e, 0x3f, 0x92, 0x04, 0x81, 0x3e, 0xa4, 0xa8, 0x83, 0x3e, +0xdc, 0xa0, 0xae, 0x3e, 0xb3, 0x5e, 0x10, 0x3f, 0xd7, 0x88, 0x40, 0x3f, 0x4f, 0xb1, 0x66, 0x3f, 0x66, 0x49, 0x80, 0x3d, 0x38, 0xa2, 0xdb, 0x3e, 0x58, 0xe2, 0x09, 0x3f, 0x1b, 0x11, 0x0c, 0x3d, 0x34, 0x84, 0x57, 0xbf, 0x5c, 0xca, 0x91, 0x3e, 0xe4, 0x68, 0x26, 0xbf, 0x79, 0x5c, 0x34, 0xbf, 0x4c, 0x55, 0xf2, 0x3e, 0x3e, 0x79, 0x34, 0xbf, 0xeb, 0x37, 0x07, 0xbf, 0x11, 0xc2, 0x93, 0x3e, 0x7a, 0xc5, 0x37, 0xbf, 0xec, 0x30, 0x22, 0xbf, 0xb6, 0x2d, 0x2a, 0x3f, 0xb1, 0xf9, 0x30, 0xbf, +0x44, 0xfb, 0x90, 0xbe, 0x3a, 0xe7, 0x2f, 0x3f, 0x9a, 0x05, 0x1a, 0x3f, 0x0d, 0x88, 0xd0, 0xbe, 0x7e, 0x35, 0x47, 0x3e, 0x80, 0x80, 0x71, 0x3f, 0x74, 0x96, 0x89, 0xbe, 0xd2, 0x17, 0x12, 0x3e, 0xd6, 0xac, 0x77, 0x3f, 0x04, 0xe2, 0x55, 0xbe, 0x2e, 0xe4, 0x21, 0x3e, 0x0d, 0x35, 0x7a, 0x3f, 0x25, 0xe8, 0x0f, 0xbe, 0xfa, 0xd1, 0x88, 0x3e, 0x44, 0xfb, 0x74, 0x3f, 0x69, 0xe0, 0xe7, 0xbd, 0x3e, 0xb0, 0xe3, 0x3d, 0x5e, 0xd5, 0x79, 0x3f, 0x19, 0x38, 0x40, 0xbe, 0xab, 0x93, 0x53, 0x3e, +0xd6, 0xfe, 0x76, 0x3f, 0xe2, 0x70, 0x26, 0xbe, 0xbe, 0x82, 0x94, 0x3e, 0x8f, 0x8e, 0x73, 0x3f, 0x87, 0xfc, 0xd3, 0xbd, 0x35, 0x79, 0x4a, 0x3e, 0xbf, 0x46, 0x7a, 0x3f, 0x86, 0x8d, 0x92, 0xbd, 0x66, 0x87, 0x08, 0x3e, 0x49, 0x13, 0x3b, 0x3f, 0x4e, 0x63, 0x2b, 0x3f, 0x30, 0x9f, 0xac, 0xbc, 0xe3, 0xc5, 0x46, 0x3f, 0xc1, 0x3b, 0x21, 0x3f, 0x2a, 0xe6, 0x88, 0xbe, 0xdd, 0x9a, 0x3c, 0x3f, 0x3f, 0xfe, 0x1e, 0x3f, 0x79, 0x22, 0x48, 0xbd, 0xe5, 0x42, 0x31, 0x3f, 0xd8, 0x46, 0x38, 0x3f, +0x3f, 0x90, 0x00, 0x3f, 0x74, 0x7d, 0x57, 0xbf, 0x02, 0xd6, 0x4a, 0xbe, 0x14, 0xea, 0xb1, 0x3e, 0x1e, 0xc0, 0x52, 0xbf, 0x88, 0xd7, 0xe5, 0xbe, 0x03, 0x27, 0xbb, 0x3e, 0x41, 0xf4, 0x68, 0xbf, 0xfb, 0x78, 0x48, 0xbe, 0x84, 0x83, 0xa5, 0x3e, 0x5f, 0x08, 0x55, 0xbf, 0x75, 0xb0, 0xe6, 0xbe, 0xa5, 0xd7, 0x8e, 0x3e, 0x00, 0xac, 0x3e, 0xbf, 0xc7, 0x2c, 0x1b, 0xbf, 0x7e, 0xff, 0x9e, 0x3e, 0x55, 0x6b, 0x39, 0xbf, 0xd5, 0x97, 0x1d, 0xbf, 0x73, 0xd6, 0x23, 0x3f, 0x9f, 0x72, 0x40, 0xbf, +0x91, 0xd4, 0x22, 0x3e, 0xf2, 0xee, 0xf0, 0x3e, 0x0f, 0x80, 0x58, 0xbf, 0xfd, 0xdc, 0x80, 0x3e, 0xf4, 0x87, 0x6e, 0x3f, 0x38, 0xa1, 0xb8, 0x3e, 0x8f, 0xfd, 0x2c, 0xbd, 0x98, 0xf7, 0x58, 0x3f, 0xfd, 0xda, 0x06, 0xbf, 0x34, 0xbd, 0x84, 0xbd, 0x67, 0x2b, 0x3b, 0x3f, 0xc8, 0x5e, 0xbf, 0xbe, 0x04, 0x1c, 0x12, 0x3f, 0x62, 0xbb, 0x0b, 0x3f, 0x6a, 0x4f, 0xe1, 0xbe, 0x87, 0x89, 0x36, 0x3f, 0xf2, 0x25, 0xac, 0x3e, 0xd0, 0x63, 0x4c, 0xbf, 0x09, 0xc0, 0xff, 0xbe, 0x5f, 0xb5, 0x92, 0x3e, +0xc0, 0xcd, 0x4e, 0xbf, 0x7b, 0xdc, 0x03, 0xbf, 0x2b, 0xdb, 0xc7, 0x3e, 0x01, 0x69, 0x47, 0xbf, 0xf5, 0x48, 0xfb, 0xbe, 0xc3, 0x2e, 0xca, 0x3e, 0x6f, 0x7f, 0x66, 0xbf, 0x23, 0x14, 0x3b, 0xbe, 0x65, 0x51, 0xe8, 0x3e, 0x1d, 0x90, 0x60, 0xbf, 0xdc, 0xb9, 0x20, 0xbe, 0xc0, 0xae, 0xb6, 0x3e, 0xcb, 0x2d, 0x69, 0xbf, 0x83, 0x6d, 0x54, 0xbe, 0x8a, 0x06, 0x19, 0xbe, 0x28, 0xf3, 0x23, 0x3f, 0xc2, 0xda, 0x40, 0x3f, 0xba, 0x9e, 0x18, 0xbe, 0x57, 0x5e, 0x2a, 0x3f, 0xac, 0x3a, 0x3b, 0x3f, +0xdf, 0x35, 0xb0, 0xbe, 0x56, 0xf2, 0x31, 0x3f, 0xc0, 0x94, 0x21, 0x3f, 0x65, 0x1c, 0xb3, 0xbe, 0x6f, 0x9f, 0x31, 0x3f, 0xc4, 0x23, 0x21, 0x3f, 0x9a, 0x95, 0xa5, 0xbe, 0x63, 0x97, 0x34, 0x3f, 0xe6, 0x74, 0x21, 0x3f, 0x5f, 0x7a, 0x0b, 0xbe, 0x42, 0xce, 0x33, 0x3f, 0x94, 0xdb, 0x32, 0x3f, 0x5e, 0xd8, 0x2e, 0x3f, 0x39, 0xb6, 0x2e, 0xbf, 0x02, 0x48, 0x85, 0xbe, 0xc9, 0x54, 0x19, 0x3f, 0xc1, 0x38, 0x34, 0xbf, 0x5e, 0x67, 0xc3, 0xbe, 0x4a, 0x5e, 0x45, 0x3f, 0xa7, 0x3c, 0x12, 0xbf, +0x4d, 0x2c, 0x90, 0xbe, 0x0b, 0x42, 0x21, 0x3f, 0xe8, 0xf9, 0x27, 0xbf, 0x7b, 0xc0, 0xd4, 0xbe, 0xf1, 0x9b, 0xda, 0x3e, 0xd9, 0x96, 0x31, 0xbf, 0x7c, 0x7e, 0x14, 0xbf, 0x72, 0x17, 0xf1, 0x3e, 0x40, 0x85, 0x2f, 0xbf, 0xfc, 0x1d, 0x0e, 0xbf, 0x19, 0xc9, 0xce, 0x3e, 0x22, 0x39, 0x31, 0xbf, 0x2b, 0x18, 0x19, 0xbf, 0x2f, 0x14, 0x0c, 0x3f, 0x34, 0x2a, 0x3c, 0xbf, 0x1d, 0x04, 0xcd, 0xbe, 0xdb, 0xa3, 0x23, 0x3f, 0xe4, 0xdc, 0x3a, 0xbf, 0x69, 0xe0, 0x77, 0xbe, 0xfe, 0x9d, 0x41, 0x3f, +0x1a, 0x6d, 0x25, 0xbf, 0xb0, 0x01, 0xd1, 0x3d, 0x0f, 0x7f, 0x51, 0x3f, 0x49, 0xd5, 0x12, 0xbf, 0x96, 0x77, 0x15, 0x3d, 0xb4, 0xe5, 0x40, 0x3f, 0xa3, 0x03, 0x9a, 0xbe, 0xa0, 0xa7, 0x15, 0x3f, 0x41, 0x9b, 0x50, 0x3f, 0x88, 0x4a, 0x23, 0xbe, 0xd6, 0xa9, 0x0e, 0x3f, 0x14, 0x94, 0x6a, 0x3f, 0x67, 0x62, 0xca, 0xbe, 0xff, 0x3e, 0x83, 0xbd, 0xe1, 0x5e, 0x0d, 0xbf, 0x57, 0xb2, 0x37, 0x3f, 0x48, 0x4f, 0xd9, 0x3e, 0x1e, 0xc6, 0x0c, 0xbf, 0x50, 0x36, 0x39, 0x3f, 0x08, 0xaf, 0xd5, 0x3e, +0x0a, 0x2f, 0x31, 0xbf, 0x23, 0xa1, 0x31, 0x3f, 0xd2, 0x8e, 0x4b, 0x3e, 0xc6, 0x69, 0x30, 0xbf, 0x38, 0x14, 0x32, 0x3f, 0xf6, 0xee, 0x4f, 0x3e, 0x24, 0x5e, 0xe6, 0xbe, 0x4f, 0xae, 0x45, 0x3f, 0x24, 0xb4, 0xe5, 0x3e, 0xb6, 0x13, 0x15, 0xbf, 0x98, 0xda, 0x46, 0x3f, 0x5f, 0x93, 0x75, 0x3e, 0xd3, 0x6b, 0xdb, 0x3e, 0x44, 0x4c, 0x41, 0xbf, 0x02, 0x0d, 0xfe, 0xbe, 0x27, 0x0f, 0xeb, 0x3e, 0xb8, 0x74, 0x3c, 0xbf, 0x52, 0x9d, 0xfe, 0xbe, 0x08, 0xb0, 0xf0, 0x3e, 0xbf, 0x9c, 0x41, 0xbf, +0xe4, 0xf5, 0xe8, 0xbe, 0xe8, 0xbc, 0x1a, 0x3f, 0x08, 0x00, 0x46, 0xbf, 0xb7, 0x79, 0x43, 0xbe, 0x45, 0xb7, 0x12, 0x3f, 0x82, 0xe5, 0x48, 0xbf, 0x1c, 0xb2, 0x71, 0xbe, 0x95, 0xd7, 0x1e, 0x3f, 0x57, 0x7b, 0x44, 0xbf, 0x39, 0xee, 0x24, 0xbe, 0xee, 0x5e, 0x1e, 0xbe, 0x4e, 0x98, 0x54, 0x3f, 0x9b, 0x02, 0x09, 0x3f, 0x46, 0x0a, 0x55, 0xbe, 0x88, 0xf5, 0x6e, 0x3f, 0x5d, 0xa3, 0x95, 0x3e, 0x15, 0x56, 0x26, 0x3f, 0xfb, 0x3b, 0x2b, 0xbf, 0xd1, 0xe6, 0xb8, 0xbe, 0x31, 0xb3, 0x2f, 0x3f, +0x23, 0x69, 0x2f, 0xbf, 0x74, 0xb1, 0x79, 0xbe, 0xd5, 0x06, 0x57, 0x3f, 0x8b, 0xde, 0xf9, 0xbe, 0x2e, 0x02, 0x73, 0xbe, 0x20, 0xd3, 0x5e, 0x3f, 0x7c, 0x9c, 0xe9, 0xbe, 0xb3, 0x61, 0x3d, 0xbe, 0x15, 0x53, 0xe9, 0x3d, 0xe5, 0x9c, 0x78, 0xbf, 0x76, 0x8d, 0x56, 0x3e, 0x64, 0x20, 0xd7, 0x3e, 0x63, 0x47, 0x47, 0xbf, 0xeb, 0xc7, 0xee, 0x3e, 0x65, 0xfc, 0xbb, 0x3e, 0x35, 0x61, 0x43, 0xbf, 0x36, 0x1e, 0x08, 0x3f, 0x35, 0x41, 0xd4, 0xbc, 0x4e, 0x09, 0x78, 0xbf, 0x31, 0x08, 0x7c, 0x3e, +0x98, 0xbf, 0x42, 0x3f, 0xee, 0x76, 0x6d, 0xbe, 0x3c, 0x31, 0x1b, 0x3f, 0x74, 0xb1, 0x35, 0x3f, 0xb3, 0xb3, 0x28, 0xbe, 0x92, 0x57, 0x2f, 0x3f, 0x26, 0x39, 0x3c, 0x3f, 0xf6, 0xb3, 0x00, 0x3f, 0xf0, 0xc0, 0xe8, 0x3e, 0xa4, 0x55, 0x2d, 0x3f, 0xff, 0xb1, 0x04, 0x3f, 0x4d, 0xba, 0x05, 0x3f, 0xc2, 0xc2, 0x19, 0x3e, 0xae, 0x63, 0x7c, 0x3f, 0xef, 0x59, 0x97, 0xbd, 0x17, 0xd5, 0xe2, 0x3d, 0x86, 0xac, 0x7a, 0x3f, 0xd2, 0x1b, 0x2e, 0xbe, 0xf5, 0xf1, 0xd0, 0x3d, 0x0f, 0x0d, 0x7b, 0x3f, +0xc2, 0xfb, 0x2a, 0xbe, 0xe1, 0x42, 0xbe, 0x3d, 0x48, 0xfd, 0x79, 0x3f, 0xd5, 0x06, 0x47, 0xbe, 0x5f, 0xd2, 0x18, 0x3e, 0x2b, 0x32, 0x7a, 0x3f, 0x32, 0xcc, 0x19, 0xbe, 0x6c, 0x77, 0x0f, 0x3d, 0x4c, 0x50, 0x7b, 0xbf, 0x13, 0xb6, 0x3f, 0x3e, 0x8a, 0xe3, 0xc0, 0xbd, 0xe0, 0xf6, 0x78, 0xbf, 0xd9, 0x0a, 0x5a, 0x3e, 0xbc, 0x92, 0x24, 0xbd, 0x59, 0xa2, 0x7f, 0xbf, 0x28, 0x5f, 0x10, 0x3d, 0xb5, 0xa6, 0x09, 0xbe, 0xd8, 0x2a, 0x7d, 0xbf, 0xe1, 0x7e, 0x80, 0x3d, 0xbc, 0xe9, 0xd6, 0x3d, +0xce, 0x32, 0x7b, 0x3f, 0x85, 0x96, 0x25, 0xbe, 0x90, 0xf7, 0x1a, 0x3e, 0x5d, 0x6e, 0x7c, 0x3f, 0x93, 0xaa, 0x8d, 0xbd, 0xef, 0x36, 0x8f, 0x3d, 0x68, 0x77, 0x7c, 0x3f, 0x25, 0xb0, 0x19, 0xbe, 0x35, 0xb7, 0xc2, 0x3d, 0xc5, 0x1e, 0x7e, 0x3f, 0xc8, 0x26, 0x99, 0xbd, 0x21, 0xcb, 0x02, 0xbd, 0x78, 0xb8, 0x75, 0xbf, 0x29, 0xb2, 0x8e, 0x3e, 0x67, 0xb3, 0xca, 0x3e, 0x64, 0x73, 0x45, 0xbf, 0x39, 0x2a, 0xff, 0x3e, 0x32, 0x03, 0x41, 0x3f, 0xbf, 0x10, 0x8a, 0xbe, 0xf7, 0x59, 0x19, 0x3f, +0x2c, 0xbc, 0x4f, 0x3f, 0xd6, 0xfc, 0xb0, 0x3e, 0x63, 0x41, 0xf1, 0x3e, 0x71, 0x37, 0x68, 0x3e, 0x42, 0x95, 0x76, 0x3f, 0xc2, 0xa5, 0x13, 0xbe, 0x0b, 0x99, 0x7b, 0x3e, 0xce, 0xa7, 0x76, 0x3f, 0x27, 0xbb, 0xd9, 0xbd, 0x57, 0xb3, 0x4e, 0xbe, 0x1f, 0xd8, 0x79, 0xbf, 0x81, 0x79, 0xa8, 0x3d, 0xed, 0x2a, 0x14, 0xbe, 0xae, 0xba, 0x76, 0xbf, 0xe0, 0x62, 0x65, 0x3e, 0xde, 0x1e, 0x74, 0x3e, 0x38, 0x31, 0x74, 0x3f, 0xdd, 0xd2, 0x3a, 0xbe, 0x00, 0xc7, 0x86, 0x3e, 0xc7, 0x0f, 0x75, 0x3f, +0xb8, 0x39, 0xf5, 0xbd, 0xb2, 0x9c, 0x84, 0x3b, 0xd1, 0x3c, 0x5c, 0x3f, 0x06, 0x80, 0x02, 0x3f, 0x54, 0x19, 0xa6, 0xbe, 0x83, 0xc0, 0x52, 0x3f, 0xe4, 0x83, 0xee, 0x3e, 0x46, 0x7b, 0x0c, 0x3e, 0xde, 0x39, 0x74, 0x3f, 0xfb, 0x78, 0x88, 0x3e, 0xb0, 0x70, 0x62, 0xbe, 0x79, 0x56, 0x72, 0x3f, 0xfb, 0x1f, 0x70, 0x3e, 0xf6, 0x7c, 0x0d, 0x3f, 0x3f, 0xe4, 0x51, 0xbf, 0xb1, 0xf9, 0x18, 0xbe, 0xad, 0x13, 0xdf, 0x3e, 0xda, 0xae, 0x40, 0xbf, 0x80, 0xbb, 0xfc, 0xbe, 0xeb, 0x01, 0xbb, 0x3e, +0x64, 0xaf, 0x33, 0xbf, 0x87, 0x8b, 0x1c, 0xbf, 0x4c, 0x6f, 0xb7, 0x3e, 0xf9, 0xf4, 0x98, 0x3e, 0x8e, 0x70, 0x62, 0x3f, 0xf5, 0xf5, 0xbc, 0x3e, 0xc4, 0x07, 0x86, 0x3e, 0x6f, 0x4b, 0x64, 0x3f, 0x9f, 0x3a, 0x2e, 0x3f, 0x72, 0xc2, 0xbc, 0xbe, 0xb5, 0x16, 0x22, 0x3f, 0x47, 0x55, 0xb3, 0x3e, 0x72, 0x33, 0x8c, 0x3e, 0xb1, 0x4e, 0x65, 0x3f, 0xe1, 0x96, 0xcf, 0xbd, 0x5b, 0x22, 0x27, 0x3f, 0x30, 0x2b, 0x40, 0x3f, 0x8a, 0xc8, 0xa0, 0xbe, 0xf6, 0x7b, 0x36, 0x3f, 0xe3, 0x89, 0x20, 0x3f, +0x10, 0x3f, 0x07, 0x3f, 0x5f, 0xb2, 0x51, 0xbf, 0x9f, 0xcb, 0x64, 0xbe, 0xce, 0xe2, 0xe5, 0x3e, 0x9a, 0xd1, 0x47, 0xbf, 0xf7, 0xad, 0xde, 0xbe, 0xfe, 0x0c, 0xaf, 0x3e, 0x5f, 0xed, 0xd8, 0x3e, 0x0e, 0xbc, 0x56, 0x3f, 0x6c, 0x43, 0x01, 0x3f, 0xc7, 0x2d, 0xae, 0x3e, 0x0d, 0x15, 0x4b, 0x3f, 0xe7, 0xe0, 0x39, 0x3e, 0x5f, 0xeb, 0xd2, 0x3e, 0xd9, 0x97, 0x64, 0x3f, 0xe7, 0xe0, 0x39, 0x3e, 0x5f, 0xeb, 0xd2, 0x3e, 0xd9, 0x97, 0x64, 0x3f, 0xf3, 0x74, 0xee, 0x3e, 0xd3, 0x4c, 0x1b, 0xbf, +0x7c, 0xee, 0x24, 0x3f, 0x4f, 0xaf, 0x14, 0xbd, 0x4b, 0x91, 0x70, 0x3f, 0x3b, 0x17, 0xae, 0x3e, 0x4f, 0xaf, 0x14, 0xbd, 0x4b, 0x91, 0x70, 0x3f, 0x3b, 0x17, 0xae, 0x3e, 0xca, 0x32, 0x84, 0x3d, 0x0c, 0x02, 0x7f, 0x3f, 0xfb, 0xb2, 0x74, 0xbd, 0xc6, 0xa5, 0x92, 0x3e, 0x9f, 0x77, 0x73, 0x3f, 0x37, 0xc3, 0xed, 0xbd, 0x7a, 0xc5, 0x93, 0x3e, 0x12, 0x4a, 0x73, 0x3f, 0x01, 0x4b, 0xee, 0xbd, 0x05, 0x30, 0x8d, 0x3e, 0x2b, 0x34, 0x74, 0x3f, 0x13, 0x43, 0xf2, 0xbd, 0x63, 0x9a, 0x19, 0x3e, +0xe9, 0x46, 0x7c, 0x3f, 0x7c, 0x7f, 0xa3, 0xbd, 0xea, 0x1f, 0x24, 0xbe, 0x83, 0xa3, 0x7c, 0x3f, 0x59, 0x87, 0xa3, 0x3c, 0x4f, 0xcc, 0x0e, 0xbf, 0xb1, 0xe1, 0x4d, 0x3f, 0x4a, 0x0c, 0x52, 0x3e, 0x28, 0x60, 0x07, 0xbf, 0xec, 0x85, 0x56, 0x3f, 0x34, 0xf2, 0x09, 0x3e, 0xfd, 0xa2, 0x30, 0xbf, 0x0b, 0x25, 0x33, 0x3f, 0xb5, 0x6c, 0x3d, 0x3e, 0xc0, 0x3c, 0x34, 0xbf, 0xb1, 0x35, 0x2f, 0x3f, 0xdf, 0xfd, 0x41, 0x3e, 0x7d, 0x96, 0x23, 0xbf, 0xef, 0x1a, 0x40, 0x3f, 0xb4, 0x00, 0x2d, 0x3e, +0xef, 0x37, 0x9a, 0xbe, 0x33, 0x88, 0x73, 0x3f, 0x37, 0x6d, 0x86, 0x3d, 0x99, 0xd8, 0xa4, 0x3e, 0xbd, 0x8a, 0x70, 0x3f, 0xcc, 0x99, 0xed, 0xbd, 0x32, 0x76, 0x7a, 0x3f, 0x5a, 0xb9, 0x37, 0xbe, 0xb6, 0xf2, 0xd2, 0xbd, 0xb0, 0x54, 0x73, 0x3f, 0x22, 0xfa, 0x15, 0xbe, 0x62, 0x4a, 0x8c, 0xbe, 0x63, 0x60, 0x5d, 0x3f, 0x2e, 0x38, 0xdb, 0x3e, 0xfa, 0x5f, 0x86, 0xbe, 0x8f, 0x4e, 0x5d, 0x3f, 0x92, 0x93, 0xe1, 0xbe, 0x1c, 0xcf, 0x77, 0xbe, 0x39, 0x7e, 0x38, 0x3f, 0x71, 0x54, 0x2a, 0xbf, +0x43, 0x71, 0x47, 0xbe, 0xf0, 0xbf, 0x21, 0x3f, 0x43, 0xc8, 0x41, 0xbf, 0xc4, 0xb5, 0x2a, 0xbe, 0x5c, 0xe7, 0x23, 0x3f, 0xc4, 0xcf, 0x3f, 0xbf, 0x05, 0x6e, 0x2d, 0xbe, 0x1b, 0xa0, 0x20, 0x3f, 0x68, 0xca, 0x42, 0xbf, 0x2e, 0x55, 0x29, 0xbe, 0x40, 0xc0, 0x0a, 0x3f, 0xa9, 0x2e, 0x54, 0xbf, 0xc8, 0x25, 0x0e, 0xbe, 0x13, 0x98, 0xde, 0x3e, 0x41, 0xf0, 0x64, 0xbf, 0xc3, 0x10, 0xd9, 0xbd, 0xc5, 0xfe, 0xca, 0x3e, 0xc5, 0xc5, 0x69, 0xbf, 0x7a, 0x6e, 0xc1, 0xbd, 0x6e, 0xa3, 0xc1, 0x3e, +0xa2, 0xd3, 0x6b, 0xbf, 0x9a, 0x3e, 0xbb, 0xbd, 0x05, 0xe0, 0x3b, 0x3f, 0xca, 0xa4, 0x22, 0x3f, 0x9f, 0x1f, 0x76, 0xbe, 0x66, 0x68, 0x38, 0x3f, 0x1b, 0x11, 0x30, 0x3f, 0x8f, 0x34, 0xb8, 0xbd, 0x6b, 0x9b, 0x3e, 0x3f, 0xe3, 0xdf, 0x1f, 0x3f, 0x84, 0x7f, 0x71, 0xbe, 0x4f, 0x04, 0xb1, 0x3e, 0xba, 0xb8, 0x6d, 0x3f, 0x64, 0x06, 0x0a, 0x3e, 0xf7, 0x3d, 0x7e, 0x3f, 0x16, 0xf7, 0xbf, 0x3d, 0x74, 0x62, 0x8f, 0x3d, 0x79, 0x5a, 0xb6, 0x3e, 0x29, 0xcf, 0x6c, 0x3f, 0xa9, 0x4e, 0x07, 0x3e, +0x68, 0xcd, 0x3f, 0x3e, 0xe4, 0x68, 0x7a, 0x3f, 0x9e, 0x76, 0xb8, 0xbd, 0x78, 0x9a, 0x00, 0x3f, 0x50, 0xe2, 0x5b, 0x3f, 0x96, 0xaf, 0xcb, 0x3d, 0xb8, 0xae, 0x80, 0x3e, 0xe9, 0x5f, 0x76, 0x3f, 0xf7, 0x02, 0xd3, 0xbd, 0xf2, 0x41, 0x27, 0x3f, 0x2c, 0x66, 0x3c, 0xbf, 0x88, 0xd7, 0x35, 0x3e, 0xcd, 0xaf, 0x26, 0x3f, 0x61, 0x70, 0x41, 0x3f, 0x27, 0xf9, 0x91, 0x3d, 0x59, 0x2f, 0x76, 0x3f, 0x1e, 0xf9, 0x83, 0xbe, 0x18, 0xcc, 0xbf, 0xbd, 0x33, 0xc3, 0x56, 0x3e, 0x29, 0x95, 0x58, 0x3f, +0xdc, 0xf5, 0xfa, 0x3e, 0xac, 0x6e, 0xbd, 0x3e, 0x1f, 0x67, 0x4e, 0xbf, 0x15, 0x54, 0xec, 0xbe, 0x7a, 0x38, 0xf9, 0xbe, 0xdb, 0x6e, 0x42, 0x3f, 0xc3, 0xf1, 0xdc, 0x3e, 0xc6, 0x19, 0x67, 0x3f, 0xe4, 0x13, 0xaa, 0x3e, 0xcb, 0xf4, 0x8b, 0xbe, 0x30, 0xf0, 0x70, 0x3f, 0x69, 0x72, 0xa1, 0x3e, 0xa5, 0xf8, 0xf8, 0xbd, 0x5e, 0xa1, 0x73, 0x3f, 0x7e, 0x70, 0x3e, 0x3e, 0x21, 0x3c, 0x7a, 0xbe, 0x5e, 0xa1, 0x73, 0x3f, 0x7e, 0x70, 0x3e, 0x3e, 0x21, 0x3c, 0x7a, 0xbe, 0xa7, 0xe8, 0x74, 0x3f, +0xd0, 0xb4, 0x94, 0x3e, 0x6a, 0x13, 0xa7, 0x3c, 0x5c, 0xe4, 0x76, 0x3f, 0x78, 0x46, 0x6b, 0x3e, 0x0c, 0xe8, 0x05, 0x3e, 0x4d, 0xd7, 0x73, 0x3f, 0x61, 0x89, 0x07, 0x3e, 0x8b, 0x6b, 0x8c, 0x3e, 0x95, 0xd6, 0x7f, 0x3f, 0xf5, 0x7f, 0x0e, 0xbd, 0xcc, 0x99, 0xed, 0xbb, 0x95, 0xd6, 0x7f, 0x3f, 0xf5, 0x7f, 0x0e, 0xbd, 0xcc, 0x99, 0xed, 0xbb, 0xa7, 0xc9, 0x70, 0x3f, 0x47, 0xc7, 0x55, 0xbb, 0x98, 0xdb, 0xad, 0x3e, 0x4b, 0x20, 0x79, 0x3f, 0xfa, 0x44, 0x0e, 0xbe, 0xe1, 0xeb, 0x3b, 0x3e, +0xc7, 0x80, 0x7c, 0x3f, 0x1c, 0xea, 0x27, 0xbe, 0x43, 0x1b, 0x80, 0x3c, 0x4a, 0x40, 0x7c, 0x3f, 0xc3, 0xd5, 0x41, 0xbd, 0x55, 0xbe, 0x27, 0xbe, 0x4a, 0x40, 0x7c, 0x3f, 0xc3, 0xd5, 0x41, 0xbd, 0x55, 0xbe, 0x27, 0xbe, 0x4e, 0xd3, 0x5f, 0x3f, 0x17, 0x2c, 0xdd, 0xbe, 0xb3, 0x96, 0x62, 0xbe, 0x82, 0xff, 0x71, 0x3f, 0xa5, 0xf2, 0xa6, 0xbe, 0xce, 0xa7, 0x0e, 0xbc, 0xd9, 0xd1, 0x4c, 0x3f, 0x4b, 0xe5, 0x11, 0xbf, 0xee, 0xcd, 0x3f, 0xbe, 0x52, 0x60, 0x01, 0x3d, 0xb0, 0x53, 0x3c, 0xbe, +0xdc, 0x80, 0x7b, 0x3f, 0x52, 0x60, 0x01, 0x3d, 0xb0, 0x53, 0x3c, 0xbe, 0xdc, 0x80, 0x7b, 0x3f, 0x85, 0xe9, 0xfb, 0xbc, 0x96, 0x5a, 0x73, 0xbf, 0xd4, 0x26, 0x9e, 0x3e, 0x85, 0xe9, 0xfb, 0xbc, 0x96, 0x5a, 0x73, 0xbf, 0xd4, 0x26, 0x9e, 0x3e, 0xf0, 0x31, 0x7c, 0x3f, 0xf2, 0x23, 0x2e, 0xbe, 0x11, 0xfe, 0xc5, 0x3c, 0x60, 0x22, 0x0e, 0xbe, 0x11, 0x1b, 0x2c, 0xbf, 0x39, 0x27, 0x3a, 0x3f, 0x60, 0x22, 0x0e, 0xbe, 0x11, 0x1b, 0x2c, 0xbf, 0x39, 0x27, 0x3a, 0x3f, 0x11, 0xc5, 0x68, 0x3f, +0xf4, 0xde, 0xd0, 0xbe, 0xf7, 0x3a, 0xa9, 0xbd, 0x11, 0xc5, 0x68, 0x3f, 0xf4, 0xde, 0xd0, 0xbe, 0xf7, 0x3a, 0xa9, 0xbd, 0x7f, 0xd9, 0x79, 0x3f, 0xd6, 0x1f, 0x31, 0x3e, 0x69, 0xaa, 0x07, 0xbe, 0x7f, 0xd9, 0x79, 0x3f, 0xd6, 0x1f, 0x31, 0x3e, 0x69, 0xaa, 0x07, 0xbe, 0x64, 0xea, 0x7a, 0x3f, 0xc5, 0xa7, 0x40, 0x3e, 0x55, 0x68, 0x80, 0xbd, 0x64, 0xea, 0x7a, 0x3f, 0xc5, 0xa7, 0x40, 0x3e, 0x55, 0x68, 0x80, 0xbd, 0xad, 0x4e, 0x7a, 0x3f, 0x8c, 0x2f, 0x9a, 0xbd, 0x3b, 0x6e, 0x48, 0x3e, +0xad, 0x4e, 0x7a, 0x3f, 0x8c, 0x2f, 0x9a, 0xbd, 0x3b, 0x6e, 0x48, 0x3e, 0xd5, 0x42, 0x7d, 0x3f, 0xdd, 0xce, 0xde, 0xbd, 0x2c, 0x0e, 0xc7, 0x3d, 0xd5, 0x42, 0x7d, 0x3f, 0xdd, 0xce, 0xde, 0xbd, 0x2c, 0x0e, 0xc7, 0x3d, 0xd6, 0x39, 0x7a, 0x3f, 0x0b, 0x26, 0xfe, 0x3d, 0x7a, 0xfc, 0x2e, 0xbe, 0xd6, 0x39, 0x7a, 0x3f, 0x0b, 0x26, 0xfe, 0x3d, 0x7a, 0xfc, 0x2e, 0xbe, 0xf4, 0x86, 0x7f, 0x3f, 0x2e, 0x74, 0x65, 0x3d, 0xa8, 0x8f, 0xc0, 0x3c, 0xf4, 0x86, 0x7f, 0x3f, 0x2e, 0x74, 0x65, 0x3d, +0xa8, 0x8f, 0xc0, 0x3c, 0x9c, 0xdc, 0x4b, 0x3f, 0x30, 0x12, 0x06, 0xbf, 0xd4, 0xef, 0x9a, 0x3e, 0x5e, 0xbd, 0xf2, 0x3e, 0x37, 0x16, 0x3c, 0xbf, 0xa9, 0x6c, 0xf8, 0x3e, 0x21, 0x06, 0x76, 0xbf, 0xa7, 0x03, 0x29, 0x3e, 0x44, 0x14, 0x63, 0x3e, 0xc2, 0x4c, 0x77, 0xbf, 0xa6, 0x29, 0x02, 0x3d, 0x82, 0x57, 0x83, 0x3e, 0x41, 0x64, 0x79, 0xbf, 0x86, 0x1d, 0x16, 0x3e, 0x86, 0xca, 0x2f, 0x3e, 0xea, 0xec, 0x78, 0xbf, 0xb3, 0xd1, 0xb9, 0x3c, 0x4e, 0xf0, 0x6d, 0x3e, 0x76, 0x1b, 0x7c, 0xbf, +0x23, 0xbb, 0xf2, 0x3d, 0x38, 0x10, 0x02, 0x3e, 0x41, 0x0e, 0x7a, 0xbf, 0x51, 0x16, 0x3e, 0x3c, 0xba, 0x10, 0x5b, 0x3e, 0xc4, 0x26, 0x7e, 0xbf, 0xb4, 0xaa, 0xa5, 0x3d, 0x62, 0x68, 0xb5, 0x3d, 0xd2, 0xfb, 0x7a, 0xbf, 0x20, 0x43, 0xc7, 0xbb, 0x27, 0xa0, 0x49, 0x3e, 0xbe, 0x68, 0x7f, 0xbf, 0x47, 0x71, 0x0e, 0x3d, 0x00, 0xe2, 0x6e, 0x3d, 0x65, 0xab, 0x7b, 0xbf, 0x1b, 0x65, 0xfd, 0xbc, 0x8c, 0xdb, 0x38, 0x3e, 0xf8, 0xc3, 0x7f, 0xbf, 0xf3, 0x54, 0x87, 0xbc, 0x26, 0xa8, 0x21, 0x3d, +0xac, 0xc9, 0x7b, 0xbf, 0x72, 0x8c, 0x64, 0xbd, 0xa1, 0xf2, 0x2f, 0x3e, 0x71, 0x38, 0x7f, 0xbf, 0x46, 0x7a, 0x91, 0xbd, 0xb0, 0xc4, 0x03, 0x3d, 0x85, 0x79, 0x7b, 0xbf, 0xfa, 0xd3, 0xa6, 0xbd, 0x46, 0x96, 0x2c, 0x3e, 0x71, 0xc9, 0x7d, 0xbf, 0xb0, 0xe6, 0x00, 0xbe, 0x3c, 0xa1, 0x17, 0x3d, 0x99, 0xbb, 0x7a, 0xbf, 0xaa, 0xef, 0xdc, 0xbd, 0x3b, 0xa6, 0x2e, 0x3e, 0x9c, 0xa4, 0x79, 0xbf, 0x4b, 0xad, 0x07, 0xbe, 0xd0, 0xb7, 0x35, 0x3e, 0x9c, 0x87, 0x7b, 0xbf, 0x41, 0x99, 0x36, 0xbe, +0x74, 0x96, 0x59, 0x3d, 0x5d, 0x4b, 0x78, 0xbf, 0xab, 0x40, 0x1d, 0xbe, 0xe0, 0x81, 0x41, 0x3e, 0x40, 0x9f, 0x78, 0xbf, 0x4d, 0x64, 0x66, 0xbe, 0x2a, 0x1c, 0xa1, 0x3d, 0xd7, 0x32, 0x75, 0xbf, 0x16, 0x17, 0x87, 0xbe, 0x4c, 0x6d, 0xe9, 0x3d, 0x59, 0xc2, 0x76, 0xbf, 0xc3, 0x45, 0x2e, 0xbe, 0x64, 0xad, 0x51, 0x3e, 0x9c, 0x8a, 0x70, 0xbf, 0x7f, 0xbc, 0x97, 0xbe, 0xbb, 0x42, 0x2f, 0x3e, 0xce, 0xa5, 0x74, 0xbf, 0xaa, 0xd1, 0x3b, 0xbe, 0xee, 0xec, 0x6b, 0x3e, 0x8f, 0x8b, 0x6a, 0xbf, +0x09, 0xff, 0xa2, 0xbe, 0xa3, 0x3e, 0x79, 0x3e, 0x8e, 0x94, 0x71, 0xbf, 0x52, 0x7d, 0x47, 0xbe, 0x35, 0xef, 0x88, 0x3e, 0xb1, 0xa8, 0x70, 0xbf, 0xb3, 0x60, 0x92, 0x3e, 0xfa, 0x44, 0x3e, 0x3e, 0x30, 0x9e, 0x75, 0xbf, 0x8f, 0x89, 0x84, 0x3e, 0x42, 0x93, 0xe4, 0x3d, 0xc5, 0xae, 0x79, 0xbf, 0xba, 0x82, 0x5d, 0x3e, 0x1d, 0xe1, 0x34, 0x3d, 0x97, 0xaa, 0x7c, 0xbf, 0x3d, 0x2c, 0x24, 0x3e, 0xac, 0x38, 0x55, 0xbc, 0xb0, 0x74, 0x7e, 0xbf, 0xd2, 0x6f, 0xbf, 0x3d, 0x77, 0xf5, 0x6a, 0xbd, +0xb9, 0xfd, 0x7e, 0xbf, 0xfd, 0xa1, 0x99, 0x3c, 0x6e, 0x88, 0xb1, 0xbd, 0x20, 0x44, 0x7e, 0xbf, 0x46, 0x03, 0x78, 0xbd, 0xf9, 0x15, 0xcb, 0xbd, 0x1e, 0x52, 0x7c, 0xbf, 0xba, 0xf4, 0x0f, 0xbe, 0x0e, 0xd6, 0xbf, 0xbd, 0xe9, 0x0f, 0x79, 0xbf, 0x1f, 0xa2, 0x61, 0xbe, 0xfa, 0x98, 0x8f, 0xbd, 0x8f, 0xa8, 0x74, 0xbf, 0x4a, 0xd2, 0x95, 0xbe, 0x6e, 0xa6, 0x02, 0xbd, 0x16, 0x13, 0x6f, 0xbf, 0x75, 0xb0, 0xb6, 0xbe, 0xd3, 0xa2, 0xbe, 0x3c, 0xda, 0x90, 0x67, 0xbf, 0x54, 0x56, 0xd3, 0xbe, +0x4a, 0xb6, 0xda, 0x3d, 0xb8, 0xca, 0x5f, 0xbf, 0x97, 0xfd, 0xe2, 0xbe, 0x09, 0xdc, 0x4a, 0x3e, 0x6a, 0xa6, 0x67, 0xbf, 0xf6, 0x5e, 0xcc, 0x3e, 0x5e, 0x63, 0x17, 0x3e, 0xce, 0x18, 0x6e, 0xbf, 0x30, 0x48, 0xba, 0x3e, 0x1b, 0xf5, 0x50, 0x3d, 0x92, 0x5b, 0x73, 0xbf, 0x54, 0xc8, 0x9d, 0x3e, 0xba, 0x14, 0x17, 0xbd, 0x0a, 0x31, 0x77, 0xbf, 0x3a, 0xac, 0x70, 0x3e, 0x2b, 0xfa, 0xe3, 0xbd, 0xee, 0x76, 0x79, 0xbf, 0x8e, 0x5c, 0x17, 0x3e, 0xee, 0x0a, 0x2d, 0xbe, 0x4c, 0x1b, 0x7a, 0xbf, +0xb0, 0xfe, 0x4f, 0x3d, 0xc3, 0x2c, 0x54, 0xbe, 0x14, 0x21, 0x79, 0xbf, 0x7e, 0x6f, 0x53, 0xbd, 0xf0, 0xa4, 0x65, 0xbe, 0xce, 0x88, 0x76, 0xbf, 0x68, 0x97, 0x1f, 0xbe, 0xb7, 0x07, 0x61, 0xbe, 0x01, 0xf6, 0x71, 0xbf, 0xa4, 0xfa, 0x86, 0xbe, 0xd7, 0x6c, 0x45, 0xbe, 0x65, 0x18, 0x6b, 0xbf, 0x71, 0x20, 0xbc, 0xbe, 0x7b, 0xa3, 0x16, 0xbe, 0x8f, 0x6c, 0x62, 0xbf, 0x5f, 0xb0, 0xeb, 0xbe, 0xda, 0x1b, 0x9c, 0xbd, 0x96, 0xae, 0x58, 0xbf, 0xda, 0x1f, 0x08, 0xbf, 0x5e, 0x65, 0xed, 0x3c, +0xc5, 0x1b, 0x51, 0xbf, 0x06, 0xbd, 0x0f, 0xbf, 0xf6, 0x95, 0x07, 0x3e, 0xcb, 0x2f, 0x5b, 0xbf, 0xac, 0x57, 0x01, 0x3f, 0xfd, 0x16, 0xdd, 0x3d, 0x00, 0x01, 0x63, 0xbf, 0x98, 0xa2, 0xec, 0x3e, 0xaa, 0x2b, 0x1f, 0xbc, 0x42, 0x5c, 0x69, 0xbf, 0x93, 0xe4, 0xc9, 0x3e, 0xf5, 0x7f, 0xee, 0xbd, 0xfd, 0xf6, 0x6d, 0xbf, 0xe5, 0x47, 0x9c, 0x3e, 0xa4, 0xc3, 0x53, 0xbe, 0x97, 0xaa, 0x70, 0xbf, 0xdf, 0xfb, 0x4b, 0x3e, 0x94, 0xa2, 0x8d, 0xbe, 0x38, 0x66, 0x71, 0xbf, 0x3f, 0x8e, 0xa6, 0x3d, +0x2c, 0x46, 0xa5, 0xbe, 0xdc, 0x2e, 0x70, 0xbf, 0x3e, 0xea, 0x2f, 0xbd, 0x1c, 0xcf, 0xaf, 0xbe, 0x7c, 0xee, 0x6c, 0xbf, 0xac, 0xe5, 0x2e, 0xbe, 0xc7, 0x0f, 0xad, 0xbe, 0xa1, 0x2d, 0x67, 0xbf, 0x40, 0x34, 0x9b, 0xbe, 0xe5, 0xd3, 0x9b, 0xbe, 0x0b, 0x7f, 0x5e, 0xbf, 0xd4, 0xb7, 0xdc, 0xbe, 0xc4, 0x43, 0x78, 0xbe, 0x60, 0x5b, 0x53, 0xbf, 0xf6, 0xeb, 0x0a, 0xbf, 0xe6, 0x3d, 0x1e, 0xbe, 0x11, 0x6b, 0x49, 0xbf, 0xa0, 0x88, 0x1d, 0xbf, 0xe7, 0xde, 0x43, 0xbd, 0x48, 0x87, 0x43, 0xbf, +0x77, 0x49, 0x24, 0xbf, 0xcf, 0xda, 0x8d, 0x3d, 0xc0, 0x92, 0x4b, 0xbf, 0x28, 0x46, 0x1a, 0x3f, 0x1c, 0x08, 0x89, 0x3d, 0x01, 0xa2, 0x54, 0xbf, 0xe7, 0x70, 0x0d, 0x3f, 0x9a, 0x98, 0x8e, 0xbd, 0xc6, 0xf9, 0x5b, 0xbf, 0x47, 0x75, 0xf2, 0x3e, 0xa4, 0xff, 0x45, 0xbe, 0x17, 0x47, 0x61, 0xbf, 0x38, 0x6a, 0xbd, 0x3e, 0x2f, 0x88, 0x98, 0xbe, 0xb7, 0x5d, 0x64, 0xbf, 0x9b, 0xc8, 0x7c, 0x3e, 0xea, 0xd0, 0xc1, 0xbe, 0x12, 0x2d, 0x65, 0xbf, 0x7d, 0xaf, 0xe1, 0x3d, 0x0e, 0x13, 0xdd, 0xbe, +0xf1, 0xbd, 0x63, 0xbf, 0x69, 0x52, 0x0a, 0xbd, 0xa9, 0x31, 0xe9, 0xbe, 0xcd, 0x1e, 0x60, 0xbf, 0x2e, 0x3d, 0x3a, 0xbe, 0x92, 0x3e, 0xe5, 0xbe, 0xa6, 0x48, 0x5a, 0xbf, 0xf0, 0x85, 0xa9, 0xbe, 0xc8, 0xea, 0xce, 0xbe, 0x16, 0xde, 0x51, 0xbf, 0xc5, 0x39, 0xf2, 0xbe, 0xdf, 0x34, 0xa5, 0xbe, 0xe1, 0xed, 0x45, 0xbf, 0x18, 0xee, 0x18, 0xbf, 0xce, 0x14, 0x5a, 0xbe, 0x85, 0x79, 0x3b, 0xbf, 0xaa, 0x0f, 0x2c, 0xbf, 0xd1, 0x06, 0xe0, 0xbd, 0x5e, 0x2c, 0x34, 0xbf, 0x42, 0xcc, 0x35, 0xbf, +0xc7, 0xf3, 0x99, 0x3c, 0x35, 0x29, 0x39, 0xbf, 0x58, 0xa9, 0x30, 0x3f, 0x74, 0xce, 0xcf, 0x3c, 0xad, 0x51, 0x43, 0xbf, 0x86, 0x38, 0x22, 0x3f, 0x2e, 0xe7, 0x02, 0xbe, 0x5d, 0x8a, 0x4b, 0xbf, 0xb3, 0x7a, 0x0b, 0x3f, 0x44, 0x6c, 0x88, 0xbe, 0x64, 0x77, 0x51, 0xbf, 0xe3, 0x54, 0xdb, 0x3e, 0x59, 0x4c, 0xc4, 0xbe, 0x36, 0xe7, 0x54, 0xbf, 0x9e, 0x95, 0x94, 0x3e, 0x6a, 0x65, 0xf2, 0xbe, 0x4b, 0xca, 0x55, 0xbf, 0x41, 0x4a, 0x0c, 0x3e, 0x74, 0x61, 0x08, 0xbf, 0x80, 0x2c, 0x54, 0xbf, +0xde, 0x90, 0xc6, 0xbc, 0x7a, 0x1b, 0x0f, 0xbf, 0x4c, 0x53, 0x50, 0xbf, 0xcb, 0xbd, 0x40, 0xbe, 0xc2, 0xc3, 0x0c, 0xbf, 0x90, 0x83, 0x4a, 0xbf, 0x4c, 0x6b, 0xb3, 0xbe, 0x25, 0x5c, 0x00, 0xbf, 0xc6, 0xf7, 0x41, 0xbf, 0xdd, 0xd3, 0x01, 0xbf, 0x7b, 0x4e, 0xd2, 0xbe, 0x2f, 0x50, 0x36, 0xbf, 0x2a, 0x02, 0x24, 0xbf, 0x55, 0xf5, 0x92, 0xbe, 0x2f, 0x33, 0x2c, 0xbf, 0x13, 0xd7, 0x39, 0xbf, 0x8e, 0xc9, 0x12, 0x3e, 0x59, 0x50, 0x24, 0xbf, 0xe5, 0x43, 0x44, 0x3f, 0xb8, 0xaf, 0x83, 0xbc, +0xdb, 0x6d, 0x2f, 0xbf, 0x83, 0x6d, 0x34, 0x3f, 0x8a, 0xe4, 0x3b, 0xbe, 0xce, 0x6b, 0x38, 0xbf, 0x7c, 0x7f, 0x1b, 0x3f, 0x8c, 0x68, 0xab, 0xbe, 0x7e, 0xe4, 0x3e, 0xbf, 0x46, 0xb4, 0xf5, 0x3e, 0x08, 0xac, 0xec, 0xbe, 0xca, 0xa4, 0x42, 0xbf, 0x3f, 0x56, 0xa8, 0x3e, 0x16, 0x68, 0x0f, 0xbf, 0xb2, 0x9d, 0x43, 0xbf, 0xef, 0x53, 0x25, 0x3e, 0xa8, 0xe1, 0x1f, 0xbf, 0x44, 0xdb, 0x41, 0xbf, 0x37, 0x8d, 0x6d, 0xbc, 0x84, 0x28, 0x27, 0xbf, 0x24, 0x99, 0x3d, 0xbf, 0x33, 0x6c, 0x44, 0xbe, +0xd3, 0xda, 0x24, 0xbf, 0x7a, 0xa7, 0x36, 0xbf, 0xf1, 0x7e, 0xbc, 0xbe, 0xf5, 0x9c, 0x18, 0xbf, 0x2e, 0x56, 0x2c, 0xbf, 0x4f, 0x1e, 0x0a, 0xbf, 0x4b, 0x75, 0x01, 0xbf, 0x37, 0x33, 0x22, 0xbf, 0x0e, 0xa1, 0x2a, 0xbf, 0x3a, 0x20, 0xc9, 0xbe, 0x18, 0x5e, 0x0d, 0xbf, 0x07, 0xee, 0x54, 0x3f, 0x26, 0xfe, 0x68, 0xbd, 0x95, 0x49, 0x19, 0xbf, 0x3d, 0xee, 0x43, 0x3f, 0x3f, 0xaa, 0x71, 0xbe, 0x13, 0xf1, 0x22, 0xbf, 0xae, 0x2c, 0x29, 0x3f, 0x62, 0xa0, 0xcb, 0xbe, 0x9b, 0xe6, 0x29, 0xbf, +0x9d, 0x2b, 0x06, 0x3f, 0x9d, 0xa1, 0x08, 0xbf, 0x8d, 0xf1, 0x2d, 0xbf, 0x84, 0x7f, 0xb9, 0x3e, 0xf3, 0x54, 0x23, 0xbf, 0x75, 0x01, 0x2f, 0xbf, 0x7b, 0xbd, 0x3b, 0x3e, 0x30, 0xd9, 0x34, 0xbf, 0x85, 0x22, 0x2d, 0xbf, 0xf4, 0x4d, 0x9a, 0xbb, 0x14, 0x92, 0x3c, 0xbf, 0xfb, 0x78, 0x28, 0xbf, 0xa7, 0x5b, 0x46, 0xbe, 0x56, 0x43, 0x3a, 0xbf, 0x6d, 0xfe, 0x1f, 0xbf, 0x82, 0x55, 0xc5, 0xbe, 0x29, 0xca, 0x2d, 0xbf, 0x71, 0xc4, 0x12, 0xbf, 0x73, 0x49, 0x11, 0xbf, 0xe4, 0x48, 0x17, 0xbf, +0x91, 0x2a, 0x0a, 0xbf, 0x0b, 0x7e, 0x2b, 0xbf, 0x1f, 0x86, 0x02, 0xbf, 0x6b, 0x62, 0xe9, 0xbe, 0x5e, 0x83, 0x62, 0x3f, 0x92, 0xb2, 0xc5, 0xbd, 0x85, 0x41, 0x01, 0xbf, 0xaf, 0x99, 0x50, 0x3f, 0x29, 0xce, 0x91, 0xbe, 0x1d, 0x76, 0x0b, 0xbf, 0x49, 0x67, 0x34, 0x3f, 0xb2, 0xbb, 0xe8, 0xbe, 0x67, 0xd6, 0x12, 0xbf, 0xdf, 0x8b, 0x0f, 0x3f, 0xb1, 0xde, 0x18, 0xbf, 0x1c, 0x25, 0x17, 0xbf, 0xba, 0xf4, 0xc7, 0x3e, 0xb7, 0xd1, 0x34, 0xbf, 0x0e, 0x4e, 0x18, 0xbf, 0xde, 0x55, 0x4f, 0x3e, +0x1d, 0x21, 0x47, 0xbf, 0x89, 0x5e, 0x16, 0xbf, 0xfc, 0x00, 0xa4, 0x3b, 0x06, 0x2e, 0x4f, 0xbf, 0x17, 0x7d, 0x11, 0xbf, 0x9f, 0x04, 0x46, 0xbe, 0x66, 0xbd, 0x4c, 0xbf, 0x10, 0x1f, 0x08, 0xbf, 0x05, 0x6b, 0xcc, 0xbe, 0x1a, 0x35, 0x3f, 0xbf, 0x3e, 0xb2, 0xf1, 0xbe, 0x92, 0xb1, 0x16, 0xbf, 0x58, 0xff, 0x27, 0xbf, 0x91, 0x62, 0xe0, 0xbe, 0xda, 0xe7, 0x29, 0xbf, 0x27, 0x2e, 0x1b, 0xbf, 0x42, 0x5d, 0xac, 0xbe, 0x9f, 0x59, 0x6e, 0x3f, 0xbd, 0x1a, 0x10, 0xbe, 0x10, 0x95, 0xc6, 0xbe, +0x8e, 0xb1, 0x5b, 0x3f, 0xa5, 0x2f, 0xac, 0xbe, 0x12, 0xf8, 0xdb, 0xbe, 0xdf, 0x52, 0x3e, 0x3f, 0x05, 0x36, 0x03, 0xbf, 0xb6, 0x81, 0xeb, 0xbe, 0xf9, 0xf5, 0x17, 0x3f, 0xe5, 0x0c, 0x29, 0xbf, 0x3f, 0xab, 0xf4, 0xbe, 0x83, 0x4d, 0xd5, 0x3e, 0xa9, 0xfa, 0x45, 0xbf, 0x6c, 0x41, 0xf7, 0xbe, 0xdd, 0x79, 0x62, 0x3e, 0xe2, 0xe6, 0x58, 0xbf, 0xde, 0x59, 0xf3, 0xbe, 0x7b, 0x16, 0x84, 0x3c, 0x94, 0x32, 0x61, 0xbf, 0xef, 0x3c, 0xe9, 0xbe, 0x63, 0x5f, 0x42, 0xbe, 0x59, 0xa7, 0x5e, 0xbf, +0x38, 0xf9, 0xd5, 0xbe, 0x3a, 0xe7, 0xcf, 0xbe, 0x41, 0x0c, 0x50, 0xbf, 0xc5, 0x04, 0xb5, 0xbe, 0x29, 0xae, 0x1a, 0xbf, 0x57, 0xce, 0x36, 0xbf, 0xfb, 0xad, 0x9d, 0xbe, 0x2b, 0xa6, 0x2a, 0xbf, 0x7a, 0xc7, 0x2d, 0xbf, 0xf6, 0x5c, 0x46, 0xbe, 0x77, 0x81, 0x76, 0x3f, 0x93, 0x52, 0x40, 0xbe, 0x6b, 0x2d, 0x7c, 0xbe, 0x2e, 0x6e, 0x63, 0x3f, 0x70, 0x5c, 0xc6, 0xbe, 0x15, 0xc5, 0x93, 0xbe, 0xf0, 0x4b, 0x45, 0x3f, 0x11, 0x6f, 0x11, 0xbf, 0xdf, 0x4e, 0xa2, 0xbe, 0x95, 0xf3, 0x1d, 0x3f, +0x0e, 0x65, 0x38, 0xbf, 0x59, 0x14, 0xa6, 0xbe, 0x36, 0x04, 0xdf, 0x3e, 0xe0, 0xf4, 0x56, 0xbf, 0xe2, 0x06, 0xa4, 0xbe, 0x2a, 0xe0, 0x7e, 0x3e, 0x8f, 0xfc, 0x69, 0xbf, 0xb8, 0x01, 0xa7, 0xbe, 0x1e, 0xa7, 0x28, 0x3d, 0xca, 0xc4, 0x71, 0xbf, 0xdf, 0xc2, 0xa2, 0xbe, 0x26, 0x1c, 0x3a, 0xbe, 0x22, 0x38, 0x6e, 0xbf, 0x97, 0x1c, 0x8f, 0xbe, 0xaf, 0x0b, 0xcf, 0xbe, 0xa6, 0xee, 0x5e, 0xbf, 0x2b, 0x68, 0x5a, 0xbe, 0xc1, 0x52, 0x1d, 0xbf, 0xca, 0x6e, 0x42, 0xbf, 0x78, 0x7b, 0x20, 0xbe, +0x4e, 0xb9, 0x2e, 0xbf, 0x40, 0xc0, 0x36, 0xbf, 0xfd, 0x4f, 0x3e, 0xbd, 0x78, 0xd4, 0x78, 0x3f, 0x6d, 0xe7, 0x6b, 0xbe, 0x0f, 0x9c, 0xd3, 0xbd, 0x07, 0x23, 0x66, 0x3f, 0x24, 0xee, 0xd9, 0xbe, 0x83, 0x4e, 0x28, 0xbe, 0x81, 0x94, 0x48, 0x3f, 0xcb, 0x67, 0x19, 0xbf, 0x33, 0x88, 0x5f, 0xbe, 0x68, 0xcc, 0x24, 0x3f, 0x1e, 0xc3, 0x3b, 0xbf, 0x12, 0x50, 0x61, 0xbe, 0x1c, 0x9a, 0xda, 0x3e, 0x3b, 0x89, 0x60, 0xbf, 0x90, 0x4c, 0x27, 0xbe, 0x09, 0xfa, 0x83, 0x3e, 0x8a, 0xc9, 0x73, 0xbf, +0x7b, 0xa4, 0x41, 0xbe, 0x52, 0xd7, 0xba, 0x3d, 0x33, 0x4b, 0x7a, 0xbf, 0x03, 0xd0, 0x48, 0xbe, 0x4d, 0x4e, 0x0d, 0xbe, 0xec, 0x87, 0x78, 0xbf, 0x94, 0x48, 0x22, 0xbe, 0x1e, 0xc0, 0xca, 0xbe, 0x8b, 0x8b, 0x67, 0xbf, 0x62, 0xd9, 0x8c, 0xbd, 0xdf, 0x6f, 0x20, 0xbf, 0xf6, 0xb5, 0x46, 0xbf, 0x1b, 0x62, 0x3c, 0x3c, 0xd1, 0xeb, 0x33, 0xbf, 0x51, 0x16, 0x36, 0xbf, 0x7e, 0x90, 0xa5, 0x3d, 0x80, 0x49, 0x76, 0x3f, 0xca, 0x6b, 0x85, 0xbe, 0x71, 0x21, 0x8f, 0xbb, 0x35, 0xb8, 0x65, 0x3f, +0xc7, 0xf3, 0xe1, 0xbe, 0x13, 0x7d, 0xde, 0xbd, 0x88, 0xef, 0x4c, 0x3f, 0x8f, 0xe0, 0x16, 0xbf, 0x06, 0x46, 0x9e, 0xbd, 0x6a, 0xa1, 0x24, 0x3e, 0xde, 0xe4, 0x7b, 0xbf, 0xda, 0x02, 0x42, 0xbd, 0xe4, 0x4b, 0xa8, 0xbb, 0x8d, 0xb5, 0x7f, 0xbf, 0x46, 0x98, 0x62, 0xbd, 0x84, 0xf0, 0xc0, 0xbe, 0x5b, 0xb4, 0x6c, 0xbf, 0x90, 0x49, 0xc6, 0x3c, 0x76, 0xf8, 0x23, 0xbf, 0x56, 0x7f, 0x44, 0xbf, 0x98, 0x33, 0xfb, 0x3d, 0x99, 0x0c, 0x3f, 0xbf, 0x6c, 0x7b, 0x27, 0xbf, 0x78, 0x61, 0x3b, 0x3e, +0x03, 0xcf, 0x71, 0x3f, 0x5c, 0x92, 0x8b, 0xbe, 0xf0, 0xf8, 0x76, 0x3d, 0x8d, 0x99, 0x64, 0x3f, 0x80, 0x62, 0xe4, 0xbe, 0xc6, 0xf8, 0x98, 0x3e, 0x9d, 0xf5, 0x69, 0x3f, 0x31, 0xb2, 0x8c, 0xbe, 0x3e, 0xb2, 0x81, 0x3e, 0x99, 0x45, 0x64, 0x3f, 0xf5, 0x11, 0xc0, 0xbe, 0x93, 0x38, 0xeb, 0x3d, 0xce, 0x38, 0xad, 0xbe, 0x3b, 0x1a, 0x6f, 0xbf, 0x03, 0x5f, 0xd1, 0x3d, 0x8b, 0xc6, 0x5a, 0x3c, 0xc2, 0xa2, 0x7e, 0xbf, 0x49, 0x68, 0x1b, 0x3e, 0x85, 0x5c, 0x1d, 0xbf, 0xb3, 0x26, 0x46, 0xbf, +0x84, 0x83, 0x7d, 0x3e, 0x9f, 0x1f, 0x4a, 0xbf, 0x05, 0xc1, 0x0f, 0xbf, 0x0d, 0x52, 0xd8, 0x3e, 0xc5, 0x8c, 0x5c, 0x3f, 0xb7, 0x27, 0x90, 0xbe, 0x99, 0x29, 0xd5, 0x3e, 0x14, 0xed, 0x56, 0x3f, 0xc0, 0xb2, 0xb2, 0xbe, 0x79, 0x75, 0xbe, 0x3e, 0xf1, 0xbc, 0x8c, 0xbe, 0x6a, 0xf8, 0x62, 0xbf, 0xfc, 0xfb, 0xb4, 0x3e, 0x4e, 0x62, 0x90, 0x3c, 0x1e, 0x6e, 0x6f, 0xbf, 0x4a, 0xb3, 0xc1, 0x3e, 0xef, 0xe2, 0x01, 0xbf, 0xb9, 0x34, 0x46, 0xbf, 0xcf, 0xda, 0xc5, 0x3e, 0x8e, 0xe8, 0x3a, 0xbf, +0xcc, 0x45, 0x10, 0xbf, 0x1d, 0xc7, 0x07, 0x3f, 0xb1, 0x35, 0x4b, 0x3f, 0xd8, 0x65, 0x98, 0xbe, 0x14, 0x5e, 0x0a, 0x3f, 0xd9, 0x5b, 0x42, 0x3f, 0x83, 0xa2, 0xb9, 0xbe, 0x4c, 0xc1, 0x16, 0x3f, 0xd5, 0x23, 0x4d, 0xbe, 0x4b, 0x72, 0x48, 0xbf, 0x6d, 0x90, 0x11, 0x3f, 0x26, 0xc3, 0x71, 0x3c, 0xb9, 0x8d, 0x52, 0xbf, 0x61, 0x1b, 0x15, 0x3f, 0x70, 0x24, 0xb0, 0xbe, 0xb1, 0x89, 0x3c, 0xbf, 0xc7, 0x62, 0x13, 0x3f, 0xaa, 0xb8, 0x11, 0xbf, 0x13, 0x43, 0x16, 0xbf, 0x57, 0x04, 0x27, 0x3f, +0x28, 0x0e, 0x30, 0x3f, 0x39, 0x0b, 0xa3, 0xbe, 0x71, 0xaf, 0x28, 0x3f, 0xe9, 0x80, 0x24, 0x3f, 0xba, 0x32, 0xc8, 0xbe, 0x5a, 0x80, 0x12, 0x3f, 0x32, 0xaf, 0x63, 0xbe, 0x94, 0x12, 0x4a, 0xbf, 0x39, 0x2a, 0x07, 0x3f, 0x6d, 0x1b, 0x06, 0x3d, 0x3a, 0x3f, 0x59, 0xbf, 0x16, 0xbf, 0x25, 0x3f, 0xc4, 0x5c, 0x8a, 0xbe, 0x3c, 0x6c, 0x36, 0xbf, 0xc6, 0x33, 0x38, 0x3f, 0xbc, 0x41, 0xb4, 0xbe, 0x53, 0x3d, 0x19, 0xbf, 0xee, 0xb3, 0x16, 0x3f, 0x53, 0x58, 0x39, 0xbf, 0xe4, 0x15, 0xb8, 0xbe, +0x85, 0xee, 0x42, 0x3f, 0xf9, 0x66, 0x03, 0xbf, 0x4f, 0xb1, 0xca, 0xbe, 0x85, 0xd0, 0xd9, 0x3e, 0x72, 0x6a, 0x53, 0xbf, 0x99, 0x82, 0xbd, 0xbe, 0x4b, 0x1f, 0x42, 0x3f, 0x67, 0x60, 0x0c, 0x3f, 0x5d, 0x85, 0xb4, 0xbe, 0x4d, 0xa0, 0x40, 0x3f, 0xbc, 0xb0, 0xfd, 0x3e, 0x38, 0x2f, 0xde, 0xbe, 0x67, 0x47, 0x46, 0x3f, 0xf6, 0x41, 0xf6, 0x3e, 0x21, 0x57, 0xd2, 0xbe, 0xf9, 0x4b, 0x43, 0x3f, 0x3c, 0x33, 0xe9, 0x3e, 0x67, 0xf1, 0xea, 0xbe, 0x72, 0xa4, 0x73, 0xbd, 0x61, 0x6c, 0x99, 0x3e, +0xca, 0xc2, 0x73, 0xbf, 0x65, 0x8a, 0xb9, 0xbd, 0xb2, 0x66, 0xcc, 0x3e, 0xf3, 0x90, 0x69, 0xbf, 0x91, 0xd0, 0x96, 0x3d, 0x55, 0x6c, 0xcc, 0x3e, 0xa5, 0xf3, 0x69, 0xbf, 0x36, 0xb0, 0x15, 0x3d, 0x2a, 0x37, 0xf1, 0x3e, 0x77, 0x9d, 0x61, 0xbf, 0xe3, 0x1a, 0x1f, 0xbd, 0x05, 0x32, 0xc3, 0x3e, 0xeb, 0x74, 0x6c, 0xbf, 0xa3, 0xb1, 0xf6, 0xbc, 0x93, 0x52, 0x88, 0x3e, 0x7b, 0xa3, 0x76, 0xbf, 0x35, 0x07, 0x08, 0xbe, 0x74, 0x7e, 0x02, 0x3f, 0x41, 0x9a, 0x59, 0xbf, 0x83, 0x18, 0x88, 0xbd, +0x23, 0xd8, 0x00, 0x3f, 0xce, 0x8e, 0x5c, 0xbf, 0x3c, 0xbc, 0xe7, 0x3a, 0x40, 0xc1, 0x09, 0x3f, 0xb9, 0xc6, 0x57, 0xbf, 0x6d, 0xe3, 0x4f, 0x3d, 0x21, 0xac, 0x86, 0x3d, 0x82, 0x1d, 0x7f, 0xbf, 0x79, 0x21, 0x9d, 0xbc, 0xbd, 0x37, 0x46, 0x3e, 0x32, 0x1c, 0x7b, 0xbf, 0x3e, 0x3e, 0x31, 0x3e, 0x0b, 0xb5, 0x56, 0x3e, 0x31, 0x5b, 0x76, 0xbf, 0xda, 0x1a, 0xf1, 0x3d, 0xb2, 0x0d, 0xa4, 0x3e, 0x73, 0x9f, 0x70, 0xbf, 0x9d, 0x7f, 0x3b, 0xbb, 0xf9, 0xbd, 0x1d, 0x3e, 0x80, 0xf1, 0x7c, 0xbf, +0xf9, 0x85, 0x97, 0x3d, 0x60, 0x39, 0x42, 0x3d, 0x71, 0x02, 0x7f, 0xbf, 0x39, 0x06, 0x64, 0x3e, 0x25, 0x24, 0x42, 0xbe, 0xb3, 0xce, 0x74, 0xbf, 0xc5, 0x74, 0x11, 0x3e, 0x10, 0xc9, 0x90, 0xbd, 0xca, 0xc1, 0x7c, 0xbf, 0xf0, 0x6a, 0x91, 0x3e, 0x5c, 0x93, 0xae, 0xbd, 0x52, 0x7c, 0x74, 0xbf, 0x91, 0x9b, 0x71, 0x3e, 0x19, 0x1b, 0x7a, 0x3d, 0xd4, 0x47, 0x78, 0xbf, 0x88, 0x63, 0x3d, 0x3e, 0x7a, 0x35, 0x40, 0xbd, 0xe8, 0x4b, 0x7b, 0xbf, 0xf5, 0x80, 0x91, 0x3e, 0xf3, 0xc7, 0xf4, 0xbd, +0xbd, 0x87, 0x73, 0xbf, 0x08, 0x59, 0xa6, 0x3e, 0xb8, 0xac, 0x92, 0xbe, 0xc7, 0xbc, 0x66, 0xbf, 0x8f, 0xa5, 0xa7, 0x3e, 0x40, 0x31, 0x62, 0xbe, 0x55, 0x2f, 0x6b, 0xbf, 0x80, 0x9c, 0xf0, 0x3e, 0x7c, 0x28, 0xa1, 0xbe, 0x71, 0x1d, 0x53, 0xbf, 0xfa, 0x47, 0xdf, 0x3e, 0x3c, 0xbf, 0x80, 0xbe, 0xa5, 0x32, 0x5d, 0xbf, 0xb6, 0x4c, 0xbe, 0x3e, 0x69, 0xab, 0x32, 0xbe, 0xd7, 0x6c, 0x69, 0xbf, 0xd8, 0x7e, 0xf2, 0x3e, 0x63, 0x25, 0x56, 0xbe, 0x8a, 0x04, 0x5b, 0xbf, 0xf0, 0x4b, 0x25, 0x3f, +0xa0, 0x6b, 0x1f, 0xbd, 0x36, 0x3a, 0x43, 0xbf, 0xa7, 0xcd, 0x28, 0x3f, 0xc3, 0x46, 0x99, 0xbd, 0x62, 0x81, 0x3f, 0xbf, 0x08, 0x02, 0x18, 0x3f, 0xaa, 0x9d, 0x61, 0xbe, 0x8a, 0x1c, 0x46, 0xbf, 0x6c, 0xcc, 0x13, 0x3f, 0x5c, 0x05, 0x41, 0xbe, 0x02, 0x61, 0x4b, 0xbf, 0x31, 0x22, 0x05, 0x3f, 0x0d, 0xc6, 0x28, 0xbe, 0x7a, 0x8c, 0x56, 0xbf, 0x3a, 0x20, 0xf9, 0x3e, 0xa5, 0x15, 0x5f, 0xbb, 0x6a, 0xa6, 0x5f, 0xbf, 0xae, 0x4a, 0x22, 0x3f, 0x0a, 0x12, 0x2b, 0x3e, 0x05, 0x4f, 0x41, 0xbf, +0x14, 0x41, 0xe4, 0x3e, 0x99, 0xb9, 0x30, 0x3e, 0x6e, 0xda, 0x60, 0xbf, 0xf8, 0x6c, 0x15, 0x3f, 0xa3, 0x57, 0xb3, 0x3e, 0x6a, 0x87, 0x3b, 0xbf, 0x84, 0x0d, 0xc7, 0x3e, 0x11, 0xe4, 0xa8, 0x3e, 0xde, 0x39, 0x5c, 0xbf, 0x1b, 0xbc, 0x2b, 0x3f, 0x15, 0x37, 0xa6, 0x3e, 0x92, 0xb1, 0x2a, 0xbf, 0x02, 0x2d, 0x31, 0x3f, 0xb0, 0xac, 0xf4, 0x3d, 0xef, 0x3b, 0x36, 0xbf, 0x12, 0x87, 0x04, 0x3f, 0x0f, 0xb5, 0xf5, 0x3e, 0xac, 0x53, 0x35, 0xbf, 0x03, 0x44, 0xa9, 0x3e, 0xfa, 0xb5, 0xdd, 0x3e, +0x32, 0xac, 0x56, 0xbf, 0x23, 0xf4, 0xe3, 0x3e, 0x96, 0xed, 0x13, 0x3f, 0x7a, 0x1b, 0x2f, 0xbf, 0x95, 0x0b, 0x8d, 0x3e, 0x9b, 0xac, 0x01, 0x3f, 0x7c, 0x28, 0x51, 0xbf, 0xe6, 0xe8, 0x09, 0x3f, 0x50, 0xe1, 0x1c, 0x3f, 0x50, 0x01, 0x14, 0xbf, 0xca, 0xdf, 0x1d, 0x3f, 0xab, 0x03, 0xf8, 0x3e, 0x23, 0xda, 0x1e, 0xbf, 0xa8, 0x1c, 0xbb, 0x3e, 0x04, 0x20, 0x2a, 0x3f, 0xfd, 0xda, 0x26, 0xbf, 0x24, 0x27, 0x63, 0x3e, 0xfc, 0xa4, 0x12, 0x3f, 0x9b, 0x01, 0x4a, 0xbf, 0x69, 0x56, 0x8e, 0x3e, +0xf6, 0xb5, 0x3e, 0x3f, 0x36, 0x3e, 0x1b, 0xbf, 0x18, 0x97, 0x3a, 0x3e, 0x4b, 0x04, 0x22, 0x3f, 0x1a, 0xa4, 0x40, 0xbf, 0x93, 0x1b, 0x9d, 0x3e, 0x87, 0x4b, 0x4e, 0x3f, 0xdf, 0xa4, 0x01, 0xbf, 0x53, 0x04, 0xe0, 0x3e, 0x5d, 0x14, 0x39, 0x3f, 0xdb, 0xe0, 0x08, 0xbf, 0x17, 0x2d, 0x00, 0x3e, 0xf3, 0x54, 0x53, 0x3f, 0x09, 0xe2, 0x0c, 0xbf, 0x65, 0x8a, 0xf9, 0x3d, 0x74, 0x43, 0x3b, 0x3f, 0x01, 0xbe, 0x2b, 0xbf, 0xe5, 0xec, 0x9d, 0xbd, 0x41, 0xf0, 0x50, 0x3f, 0x20, 0x99, 0x12, 0xbf, +0x78, 0x96, 0xa0, 0xbc, 0x6d, 0x74, 0x3e, 0x3f, 0x97, 0xfd, 0x2a, 0xbf, 0x9d, 0x9e, 0xf7, 0xbc, 0x03, 0x5f, 0x4d, 0x3f, 0xb5, 0xa3, 0x18, 0xbf, 0x8f, 0x1a, 0x03, 0x3e, 0xdf, 0x6a, 0x59, 0x3f, 0xa3, 0x1d, 0x03, 0xbf, 0xdf, 0xc2, 0x2a, 0xbe, 0x22, 0x1b, 0x2c, 0x3f, 0xa0, 0xa4, 0x38, 0xbf, 0x22, 0x6f, 0x99, 0xbd, 0xea, 0xce, 0x23, 0x3f, 0x0c, 0xcb, 0x43, 0xbf, 0x16, 0xdf, 0xb0, 0xbd, 0xea, 0xb2, 0x28, 0x3f, 0x84, 0x47, 0x3f, 0xbf, 0x55, 0xd9, 0xe7, 0x3e, 0x4d, 0xf3, 0x9e, 0x3e, +0x1f, 0xf7, 0x55, 0xbf, 0x00, 0xe4, 0x0c, 0x3f, 0x0a, 0x84, 0xb5, 0x3e, 0x5e, 0x84, 0x41, 0xbf, 0x4c, 0xaa, 0xd6, 0x3e, 0x69, 0x39, 0xd0, 0x3e, 0x10, 0xca, 0x4f, 0xbf, 0x8d, 0x5d, 0xfa, 0x3e, 0xee, 0x3f, 0xda, 0x3e, 0x63, 0xd3, 0x42, 0xbf, 0xa9, 0x31, 0x21, 0x3f, 0x79, 0xcd, 0x43, 0x3f, 0x3a, 0x5c, 0x0b, 0xbe, 0x88, 0x2f, 0xdb, 0x3e, 0xa2, 0x43, 0x04, 0x3f, 0xe5, 0xd1, 0x3d, 0xbf, 0xd3, 0x6a, 0x4c, 0x3f, 0x39, 0xec, 0x16, 0x3f, 0x38, 0x66, 0xf9, 0xbd, 0x31, 0x08, 0xf4, 0x3e, +0x80, 0xd5, 0x31, 0x3e, 0xbf, 0x9d, 0x5c, 0xbf, 0x29, 0xb2, 0x0a, 0x3f, 0x09, 0x53, 0x54, 0xbd, 0x76, 0xc3, 0x56, 0xbf, 0xa8, 0xc7, 0xf6, 0x3e, 0xfc, 0x8d, 0x26, 0x3e, 0xf5, 0x66, 0x5c, 0xbf, 0x01, 0x68, 0x1c, 0x3f, 0xb4, 0xe5, 0xdc, 0xbc, 0x15, 0x8c, 0x4a, 0xbf, 0xe7, 0xc3, 0x6b, 0x3f, 0x1d, 0xaf, 0x30, 0xbe, 0xac, 0xe1, 0xb2, 0xbe, 0x2c, 0xd6, 0x24, 0x3f, 0x43, 0xe5, 0x9f, 0x3d, 0xe4, 0xd8, 0x42, 0xbf, 0x24, 0x28, 0x46, 0x3f, 0x9b, 0x71, 0xca, 0xbe, 0x17, 0x2c, 0xfd, 0xbe, +0x35, 0x5d, 0xf7, 0x3e, 0x1b, 0x29, 0x2b, 0x3e, 0x86, 0x04, 0x5c, 0xbf, 0x07, 0x23, 0xf6, 0x3e, 0x76, 0x6d, 0x6f, 0x3e, 0x96, 0x59, 0x58, 0xbf, 0x7f, 0xdd, 0x1d, 0x3f, 0xb5, 0xe0, 0x75, 0x3e, 0x52, 0xed, 0x3f, 0xbf, 0x58, 0xc7, 0x69, 0x3f, 0xe8, 0x82, 0xc2, 0x3e, 0x65, 0xfd, 0x16, 0xbe, 0x8c, 0xbd, 0x77, 0x3f, 0xc0, 0x79, 0xf1, 0x3d, 0xa7, 0x04, 0x64, 0xbe, 0xd7, 0xf9, 0xc7, 0x3e, 0x37, 0x51, 0x17, 0x3f, 0x71, 0xab, 0x34, 0xbf, 0x79, 0x03, 0xc4, 0x3e, 0x04, 0xfe, 0x08, 0x3f, +0x7e, 0xc7, 0x40, 0xbf, 0x07, 0x0a, 0xd4, 0x3e, 0xd3, 0xdb, 0x13, 0x3f, 0xeb, 0x17, 0x34, 0xbf, 0xdc, 0x47, 0xae, 0x3e, 0xc3, 0x66, 0x68, 0x3f, 0x2c, 0xd4, 0x7a, 0xbe, 0x45, 0xd5, 0xd7, 0x3e, 0xbb, 0x99, 0x15, 0x3f, 0x77, 0x82, 0x31, 0xbf, 0xd6, 0xe2, 0xf3, 0x3e, 0x31, 0x5d, 0x5c, 0x3f, 0x43, 0x8c, 0x37, 0xbe, 0xed, 0xef, 0xdc, 0x3e, 0x32, 0x75, 0x13, 0x3f, 0x8c, 0xbb, 0x31, 0xbf, 0x6c, 0x92, 0xcf, 0x3e, 0x41, 0x7e, 0x0a, 0x3f, 0x2f, 0xa3, 0x3c, 0xbf, 0xc3, 0xd8, 0xba, 0x3e, +0x20, 0xcd, 0x10, 0x3f, 0xfc, 0x50, 0x3d, 0xbf, 0x5f, 0x24, 0x24, 0x3e, 0xe2, 0xc8, 0x6b, 0x3f, 0x5e, 0xbe, 0xb5, 0xbe, 0x7f, 0xbd, 0x82, 0xbd, 0x03, 0xb0, 0x59, 0x3f, 0x45, 0xb8, 0x05, 0xbf, 0xdf, 0x6a, 0x6d, 0x3e, 0x21, 0x3e, 0x04, 0x3f, 0x60, 0x02, 0x53, 0xbf, 0x24, 0x9a, 0x70, 0xbe, 0xc9, 0xae, 0x2c, 0x3f, 0x2c, 0x29, 0x33, 0xbf, 0x17, 0x0f, 0x87, 0xbe, 0x39, 0x2b, 0xfa, 0x3e, 0x64, 0xe8, 0x54, 0xbf, 0x97, 0xc4, 0xf9, 0x3d, 0x9a, 0x41, 0xdc, 0x3e, 0x87, 0xfb, 0x64, 0xbf, +0x15, 0x36, 0x13, 0x3e, 0xc9, 0xb0, 0xb2, 0x3e, 0x2c, 0x10, 0x6d, 0xbf, 0x87, 0x19, 0x7a, 0x3e, 0x6f, 0x81, 0xbc, 0x3e, 0x9c, 0xa8, 0x65, 0xbf, 0x90, 0xdc, 0x92, 0x3e, 0xc6, 0x6b, 0xee, 0x3e, 0xc2, 0x51, 0x56, 0xbf, 0x2b, 0x18, 0xdd, 0x3e, 0x91, 0x26, 0x9e, 0x3e, 0x52, 0xf0, 0x58, 0xbf, 0x06, 0xbe, 0xb2, 0x3e, 0x15, 0xc8, 0x9c, 0x3e, 0x4d, 0xb9, 0x62, 0xbf, 0xe7, 0xa7, 0x78, 0x3e, 0x6a, 0x88, 0xa2, 0x3e, 0x19, 0xaa, 0x6a, 0xbf, 0xc4, 0xd1, 0x45, 0xbe, 0xda, 0x75, 0xb7, 0x3e, +0x20, 0xd4, 0x69, 0xbf, 0x87, 0xfd, 0xde, 0xbd, 0x27, 0x87, 0x8f, 0x3e, 0x46, 0x26, 0x74, 0xbf, 0x90, 0x13, 0x9e, 0x3e, 0x25, 0x3e, 0xaf, 0x3e, 0x7b, 0x2e, 0x63, 0xbf, 0x9a, 0xeb, 0xcc, 0x3e, 0xa3, 0x92, 0xc2, 0x3e, 0x9a, 0x7a, 0x55, 0xbf, 0xc5, 0xc7, 0xdf, 0x3e, 0x98, 0x88, 0xb7, 0x3e, 0x1b, 0x2d, 0x53, 0xbf, 0xda, 0x1e, 0x9d, 0x3e, 0x1a, 0xc2, 0xb9, 0x3e, 0x25, 0x40, 0x61, 0xbf, 0x12, 0x17, 0x80, 0xbd, 0x51, 0x4c, 0x4e, 0x3e, 0x3e, 0x3d, 0x7a, 0xbf, 0x9e, 0xb0, 0x44, 0xbd, +0xe4, 0xf2, 0x9f, 0x3d, 0xf6, 0xeb, 0x7e, 0xbf, 0x9d, 0xa1, 0x88, 0x3e, 0xde, 0x55, 0xa7, 0x3e, 0xa4, 0x18, 0x68, 0xbf, 0x4a, 0x45, 0xb3, 0x3e, 0x2d, 0x5c, 0x8e, 0x3e, 0x93, 0xfc, 0x64, 0xbf, 0x79, 0xb0, 0xb5, 0x3e, 0x30, 0xd4, 0xb1, 0x3e, 0xd6, 0x35, 0x5e, 0xbf, 0x97, 0xc7, 0x82, 0x3e, 0xc9, 0x39, 0x61, 0x3e, 0xa3, 0x04, 0x71, 0xbf, 0xfc, 0x6c, 0xe4, 0xbb, 0xc7, 0xd6, 0xb3, 0xbd, 0x43, 0x01, 0x7f, 0xbf, 0xeb, 0x18, 0xf7, 0x3d, 0x5d, 0x37, 0x95, 0xbe, 0x63, 0xee, 0x72, 0xbf, +0x33, 0xfd, 0xa2, 0x3e, 0xd8, 0x7c, 0x9c, 0x3d, 0x82, 0xe4, 0x71, 0xbf, 0x14, 0xb0, 0xe5, 0x3e, 0x6a, 0x4f, 0x39, 0x3e, 0x17, 0x0e, 0x60, 0xbf, 0x2f, 0x4e, 0xcc, 0x3e, 0x55, 0x15, 0x5a, 0x3e, 0xef, 0x50, 0x64, 0xbf, 0x24, 0x63, 0xdd, 0x3e, 0xef, 0xc4, 0xac, 0xbc, 0x93, 0xc4, 0x66, 0xbf, 0x8a, 0x74, 0xaf, 0x3e, 0xa4, 0x6f, 0xea, 0xbe, 0xe7, 0xff, 0x51, 0xbf, 0x40, 0x14, 0x14, 0x3f, 0x8b, 0x89, 0xfd, 0xbe, 0x56, 0xf2, 0x25, 0xbf, 0x3b, 0xc4, 0x97, 0x3e, 0x6c, 0x06, 0x38, 0xba, +0xae, 0x7e, 0x74, 0xbf, 0x3b, 0xc4, 0x97, 0x3e, 0x6c, 0x06, 0x38, 0xba, 0xae, 0x7e, 0x74, 0xbf, 0xdf, 0xa9, 0x30, 0x3e, 0x7a, 0xa9, 0x58, 0x3d, 0x29, 0xcc, 0x7b, 0xbf, 0xdf, 0xa9, 0x30, 0x3e, 0x7a, 0xa9, 0x58, 0x3d, 0x29, 0xcc, 0x7b, 0xbf, 0x24, 0x64, 0x20, 0x3d, 0xd0, 0x28, 0xa5, 0x3e, 0x8f, 0x1b, 0x72, 0xbf, 0x24, 0x64, 0x20, 0x3d, 0xd0, 0x28, 0xa5, 0x3e, 0x8f, 0x1b, 0x72, 0xbf, 0x23, 0xa0, 0x42, 0x3d, 0xec, 0xbc, 0xdd, 0x3e, 0x05, 0x6d, 0x66, 0xbf, 0x23, 0xa0, 0x42, 0x3d, +0xec, 0xbc, 0xdd, 0x3e, 0x05, 0x6d, 0x66, 0xbf, 0xa0, 0xdc, 0x96, 0x3d, 0x48, 0xa8, 0xf9, 0x3d, 0xdc, 0x63, 0x7d, 0xbf, 0xa0, 0xdc, 0x96, 0x3d, 0x48, 0xa8, 0xf9, 0x3d, 0xdc, 0x63, 0x7d, 0xbf, 0xed, 0x0e, 0xa9, 0x3c, 0x47, 0x3c, 0x59, 0x3e, 0x0c, 0x1e, 0x7a, 0xbf, 0xed, 0x0e, 0xa9, 0x3c, 0x47, 0x3c, 0x59, 0x3e, 0x0c, 0x1e, 0x7a, 0xbf, 0x9b, 0x1d, 0xd9, 0x3e, 0xb6, 0x81, 0xbb, 0xbd, 0xbd, 0xa7, 0x66, 0xbf, 0x9b, 0x1d, 0xd9, 0x3e, 0xb6, 0x81, 0xbb, 0xbd, 0xbd, 0xa7, 0x66, 0xbf, +0x5b, 0xec, 0xb6, 0x3e, 0x93, 0x18, 0x04, 0xbd, 0x30, 0xf6, 0x6e, 0xbf, 0x5b, 0xec, 0xb6, 0x3e, 0x93, 0x18, 0x04, 0xbd, 0x30, 0xf6, 0x6e, 0xbf, 0xa8, 0x35, 0x4d, 0x3c, 0xec, 0xc1, 0x08, 0x3f, 0xf5, 0x62, 0x58, 0xbf, 0xa8, 0x35, 0x4d, 0x3c, 0xec, 0xc1, 0x08, 0x3f, 0xf5, 0x62, 0x58, 0xbf, 0x54, 0x51, 0x3c, 0xbc, 0x81, 0x04, 0x35, 0x3f, 0x54, 0xff, 0x34, 0xbf, 0x54, 0x51, 0x3c, 0xbc, 0x81, 0x04, 0x35, 0x3f, 0x54, 0xff, 0x34, 0xbf, 0x77, 0xf7, 0x18, 0x3f, 0xae, 0x2b, 0x06, 0xbe, +0xb2, 0x83, 0x4a, 0xbf, 0x77, 0xf7, 0x18, 0x3f, 0xae, 0x2b, 0x06, 0xbe, 0xb2, 0x83, 0x4a, 0xbf, 0xd0, 0x7d, 0x01, 0x3f, 0xdd, 0x24, 0x16, 0xbe, 0x0a, 0x9f, 0x59, 0xbf, 0xd0, 0x7d, 0x01, 0x3f, 0xdd, 0x24, 0x16, 0xbe, 0x0a, 0x9f, 0x59, 0xbf, 0xc0, 0x76, 0x30, 0x3d, 0xc1, 0xc6, 0x55, 0x3f, 0x12, 0x68, 0x0c, 0xbf, 0xc0, 0x76, 0x30, 0x3d, 0xc1, 0xc6, 0x55, 0x3f, 0x12, 0x68, 0x0c, 0xbf, 0x3e, 0x7b, 0x6e, 0x3e, 0x56, 0x80, 0x57, 0x3f, 0x15, 0x53, 0xf9, 0xbe, 0x3e, 0x7b, 0x6e, 0x3e, +0x56, 0x80, 0x57, 0x3f, 0x15, 0x53, 0xf9, 0xbe, 0xd0, 0x43, 0x31, 0x3f, 0x58, 0x1a, 0x58, 0x3e, 0x88, 0x9e, 0x30, 0xbf, 0xd0, 0x43, 0x31, 0x3f, 0x58, 0x1a, 0x58, 0x3e, 0x88, 0x9e, 0x30, 0xbf, 0x59, 0x87, 0x2b, 0x3f, 0x46, 0x5b, 0x15, 0xbb, 0x24, 0x09, 0x3e, 0xbf, 0x59, 0x87, 0x2b, 0x3f, 0x46, 0x5b, 0x15, 0xbb, 0x24, 0x09, 0x3e, 0xbf, 0xd3, 0x83, 0xca, 0x3e, 0x38, 0x2c, 0x49, 0x3f, 0xba, 0x69, 0xf3, 0xbe, 0xd3, 0x83, 0xca, 0x3e, 0x38, 0x2c, 0x49, 0x3f, 0xba, 0x69, 0xf3, 0xbe, +0x18, 0xec, 0x02, 0x3f, 0xc8, 0xcd, 0x30, 0x3f, 0x4f, 0xe7, 0x02, 0xbf, 0x18, 0xec, 0x02, 0x3f, 0xc8, 0xcd, 0x30, 0x3f, 0x4f, 0xe7, 0x02, 0xbf, 0x83, 0xde, 0x1b, 0x3f, 0x19, 0xac, 0x0c, 0x3f, 0x2d, 0x77, 0x12, 0xbf, 0x83, 0xde, 0x1b, 0x3f, 0x19, 0xac, 0x0c, 0x3f, 0x2d, 0x77, 0x12, 0xbf, 0x81, 0x77, 0x2a, 0x3f, 0x88, 0x2f, 0xd3, 0x3e, 0x3e, 0x25, 0x1f, 0xbf, 0x81, 0x77, 0x2a, 0x3f, 0x88, 0x2f, 0xd3, 0x3e, 0x3e, 0x25, 0x1f, 0xbf, 0x55, 0x12, 0x89, 0x3e, 0x37, 0x88, 0x66, 0x3f, +0xb9, 0x6d, 0xaf, 0x3e, 0x55, 0x12, 0x89, 0x3e, 0x37, 0x88, 0x66, 0x3f, 0xb9, 0x6d, 0xaf, 0x3e, 0x9b, 0x75, 0xde, 0x3e, 0xd2, 0x6f, 0x43, 0x3f, 0xe2, 0xb0, 0xf4, 0x3e, 0x9b, 0x75, 0xde, 0x3e, 0xd2, 0x6f, 0x43, 0x3f, 0xe2, 0xb0, 0xf4, 0x3e, 0x8d, 0xb2, 0x5e, 0x3f, 0x3d, 0xee, 0x9b, 0x3d, 0x99, 0x7e, 0xf9, 0x3e, 0x8d, 0xb2, 0x5e, 0x3f, 0x3d, 0xee, 0x9b, 0x3d, 0x99, 0x7e, 0xf9, 0x3e, 0xb6, 0xa1, 0x6e, 0x3f, 0x05, 0x32, 0x6b, 0xbe, 0x90, 0x4c, 0x8f, 0x3e, 0xb6, 0xa1, 0x6e, 0x3f, +0x05, 0x32, 0x6b, 0xbe, 0x90, 0x4c, 0x8f, 0x3e, 0xd2, 0x55, 0x1a, 0x3f, 0x01, 0xdf, 0x09, 0x3f, 0x3e, 0xb1, 0x16, 0x3f, 0xd2, 0x55, 0x1a, 0x3f, 0x01, 0xdf, 0x09, 0x3f, 0x3e, 0xb1, 0x16, 0x3f, 0x5b, 0x95, 0x40, 0x3f, 0x8c, 0x66, 0xa5, 0x3e, 0x5c, 0xff, 0x12, 0x3f, 0x5b, 0x95, 0x40, 0x3f, 0x8c, 0x66, 0xa5, 0x3e, 0x5c, 0xff, 0x12, 0x3f, 0xd5, 0xcc, 0x5a, 0xbe, 0xa6, 0x64, 0x79, 0x3f, 0x64, 0x07, 0x95, 0x3d, 0xd5, 0xcc, 0x5a, 0xbe, 0xa6, 0x64, 0x79, 0x3f, 0x64, 0x07, 0x95, 0x3d, +0x7c, 0xd4, 0x1f, 0x3d, 0x33, 0x1a, 0x79, 0x3f, 0x64, 0xb2, 0x68, 0x3e, 0x7c, 0xd4, 0x1f, 0x3d, 0x33, 0x1a, 0x79, 0x3f, 0x64, 0xb2, 0x68, 0x3e, 0x2e, 0x1d, 0x57, 0x3f, 0xb1, 0x4d, 0x0a, 0xbf, 0x3d, 0x46, 0x39, 0x3d, 0x2e, 0x1d, 0x57, 0x3f, 0xb1, 0x4d, 0x0a, 0xbf, 0x3d, 0x46, 0x39, 0x3d, 0x6d, 0x58, 0x1b, 0x3f, 0x3e, 0x92, 0x46, 0xbf, 0x3a, 0xaf, 0x31, 0xbe, 0x6d, 0x58, 0x1b, 0x3f, 0x3e, 0x92, 0x46, 0xbf, 0x3a, 0xaf, 0x31, 0xbe, 0x8c, 0xd9, 0x12, 0xbf, 0xb7, 0x0a, 0x26, 0x3f, +0x2c, 0x11, 0x00, 0xbf, 0x8c, 0xd9, 0x12, 0xbf, 0xb7, 0x0a, 0x26, 0x3f, 0x2c, 0x11, 0x00, 0xbf, 0xdd, 0x08, 0xeb, 0xbe, 0x8f, 0xab, 0x5d, 0x3f, 0x85, 0x7d, 0x4b, 0xbe, 0xdd, 0x08, 0xeb, 0xbe, 0x8f, 0xab, 0x5d, 0x3f, 0x85, 0x7d, 0x4b, 0xbe, 0x3e, 0x92, 0xb2, 0x3e, 0x2c, 0x66, 0x58, 0xbf, 0x8f, 0x39, 0xcf, 0xbe, 0x3e, 0x92, 0xb2, 0x3e, 0x2c, 0x66, 0x58, 0xbf, 0x8f, 0x39, 0xcf, 0xbe, 0x8b, 0xa9, 0x34, 0x3d, 0x2c, 0x2d, 0x3b, 0xbf, 0xaa, 0x47, 0x2e, 0xbf, 0x8b, 0xa9, 0x34, 0x3d, +0x2c, 0x2d, 0x3b, 0xbf, 0xaa, 0x47, 0x2e, 0xbf, 0x4a, 0xd1, 0x06, 0xbf, 0x8d, 0x97, 0x86, 0x3e, 0x34, 0xf5, 0x4e, 0xbf, 0x4a, 0xd1, 0x06, 0xbf, 0x8d, 0x97, 0x86, 0x3e, 0x34, 0xf5, 0x4e, 0xbf, 0xcd, 0x94, 0x12, 0xbf, 0x6a, 0xc1, 0xe3, 0x3e, 0xe0, 0x4c, 0x30, 0xbf, 0xcd, 0x94, 0x12, 0xbf, 0x6a, 0xc1, 0xe3, 0x3e, 0xe0, 0x4c, 0x30, 0xbf, 0xbf, 0xef, 0x2f, 0xbe, 0x61, 0xc0, 0xfa, 0xbe, 0x03, 0xd2, 0x5a, 0xbf, 0xbf, 0xef, 0x2f, 0xbe, 0x61, 0xc0, 0xfa, 0xbe, 0x03, 0xd2, 0x5a, 0xbf, +0xc4, 0xaf, 0x98, 0xbe, 0xbd, 0xfc, 0x96, 0xbe, 0xa5, 0x65, 0x68, 0xbf, 0xc4, 0xaf, 0x98, 0xbe, 0xbd, 0xfc, 0x96, 0xbe, 0xa5, 0x65, 0x68, 0xbf, 0x0c, 0x93, 0xc1, 0xbe, 0x37, 0xde, 0xbd, 0xbd, 0x96, 0xce, 0x6b, 0xbf, 0x0c, 0x93, 0xc1, 0xbe, 0x37, 0xde, 0xbd, 0xbd, 0x96, 0xce, 0x6b, 0xbf, 0x16, 0xf6, 0xe4, 0xbe, 0xf9, 0x2e, 0xc5, 0x3d, 0x5d, 0xa5, 0x63, 0xbf, 0x16, 0xf6, 0xe4, 0xbe, 0xf9, 0x2e, 0xc5, 0x3d, 0x5d, 0xa5, 0x63, 0xbf, 0x26, 0xc8, 0x1c, 0x3f, 0xfb, 0xca, 0x53, 0x3e, +0x3f, 0x53, 0x43, 0xbf, 0x8a, 0x05, 0xee, 0x3e, 0xe1, 0x5d, 0x7e, 0x3e, 0x15, 0x8d, 0x59, 0xbf, 0xa6, 0x97, 0xd0, 0x3e, 0xd7, 0x33, 0xb4, 0x3e, 0x41, 0xbb, 0x57, 0xbf, 0x3d, 0xf0, 0x25, 0x3f, 0xe0, 0x2a, 0xb7, 0x3e, 0x6e, 0x15, 0x2c, 0xbf, 0x01, 0xf8, 0x2b, 0x3f, 0xf0, 0x15, 0x85, 0x3e, 0x9f, 0x94, 0x31, 0xbf, 0xd3, 0x84, 0x85, 0x3e, 0x3e, 0x7a, 0xe3, 0x3e, 0x1e, 0x6a, 0x5b, 0xbf, 0x3f, 0x56, 0x88, 0x3e, 0x57, 0xd1, 0xb7, 0x3e, 0x71, 0x00, 0x65, 0xbf, 0x55, 0x4c, 0x75, 0x3e, +0x81, 0x94, 0x90, 0x3e, 0x1c, 0xcd, 0x6d, 0xbf, 0xcb, 0x82, 0xe9, 0x3e, 0xd8, 0x0d, 0x0b, 0x3f, 0x68, 0x77, 0x34, 0xbf, 0xa5, 0x4e, 0xf8, 0x3e, 0x18, 0x5a, 0xfd, 0x3e, 0x2d, 0x98, 0x38, 0xbf, 0x93, 0xff, 0x05, 0x3f, 0x8b, 0xc5, 0xe7, 0x3e, 0xbc, 0xcc, 0x38, 0xbf, 0x6c, 0x23, 0x1e, 0x3e, 0x37, 0x8c, 0xca, 0x3e, 0xb1, 0xc4, 0x67, 0xbf, 0x36, 0x1f, 0x37, 0x3e, 0x11, 0x35, 0x01, 0x3f, 0x15, 0x35, 0x58, 0xbf, 0xbb, 0x45, 0x88, 0x3e, 0xd2, 0x56, 0x11, 0x3f, 0x9c, 0x6c, 0x47, 0xbf, +0x45, 0xf2, 0x45, 0x3e, 0xed, 0x9d, 0x99, 0x3e, 0xab, 0x23, 0x6f, 0xbf, 0xbc, 0xe5, 0xda, 0x3e, 0x12, 0xf7, 0xe0, 0x3e, 0xbc, 0x3f, 0x4a, 0xbf, 0x66, 0x86, 0x9d, 0x3e, 0x7b, 0xa0, 0xed, 0x3e, 0xe8, 0xa3, 0x54, 0xbf, 0x83, 0x6b, 0xee, 0x3e, 0x64, 0x91, 0xd6, 0x3e, 0x83, 0x89, 0x47, 0xbf, 0xd1, 0x04, 0x16, 0x3f, 0x19, 0x3a, 0xd6, 0x3e, 0xad, 0xa4, 0x31, 0xbf, 0xfd, 0xdc, 0xc0, 0x3e, 0xaf, 0x0b, 0x13, 0x3f, 0xbf, 0x0c, 0x3a, 0xbf, 0xb8, 0x58, 0x39, 0x3f, 0x51, 0xf5, 0x2b, 0x3e, +0xf1, 0x45, 0x2b, 0xbf, 0x78, 0x7e, 0x1d, 0x3f, 0x16, 0xbd, 0x13, 0x3e, 0x8c, 0x69, 0x46, 0xbf, 0x56, 0xd7, 0x09, 0x3f, 0x2a, 0x1e, 0x47, 0x3e, 0x47, 0xe6, 0x51, 0xbf, 0x1f, 0xda, 0x43, 0x3f, 0x28, 0xee, 0x80, 0x3e, 0x0e, 0xbb, 0x17, 0xbf, 0xf4, 0x88, 0x41, 0x3f, 0xce, 0x8e, 0xb4, 0x3e, 0x5a, 0x2c, 0x0d, 0xbf, 0xd0, 0x9c, 0xd5, 0x3d, 0xf1, 0xf6, 0x80, 0x3e, 0x7f, 0x4d, 0x76, 0xbf, 0x18, 0x3f, 0xad, 0x3d, 0xa1, 0xd7, 0x87, 0x3e, 0x98, 0xdf, 0x75, 0xbf, 0x4e, 0x44, 0xbf, 0x3b, +0x86, 0x59, 0x90, 0x3e, 0x49, 0x9c, 0x75, 0xbf, 0x6d, 0x91, 0x0c, 0x3f, 0x70, 0x40, 0x2f, 0x3f, 0x75, 0x77, 0xf5, 0xbe, 0x1f, 0x9f, 0xe0, 0x3e, 0xfd, 0x82, 0x45, 0x3f, 0x8a, 0xe4, 0xeb, 0xbe, 0xc7, 0x9c, 0x23, 0x3f, 0x99, 0x2d, 0x11, 0x3f, 0x3a, 0x01, 0x05, 0xbf, 0xd2, 0x50, 0x63, 0xbd, 0xd4, 0xb8, 0x37, 0x3f, 0x74, 0xb5, 0x31, 0xbf, 0x40, 0x6d, 0xf4, 0xbd, 0x1f, 0x4c, 0x12, 0x3f, 0x5a, 0xd8, 0x4f, 0xbf, 0x3f, 0x01, 0xb4, 0x3d, 0x0f, 0x0b, 0x4d, 0x3f, 0x4d, 0x9d, 0x17, 0xbf, +0x4f, 0x75, 0xa8, 0xbd, 0x84, 0x9b, 0xc4, 0x3e, 0xf8, 0x6e, 0x6b, 0xbf, 0x4b, 0x74, 0xbe, 0x3e, 0xc3, 0x81, 0x80, 0x3e, 0x19, 0xc7, 0x64, 0xbf, 0x8b, 0x35, 0x2c, 0x3e, 0x56, 0x28, 0x82, 0x3e, 0x67, 0xd1, 0x73, 0xbf, 0x91, 0x0d, 0x04, 0x3f, 0x22, 0xc3, 0x7a, 0x3e, 0x52, 0x29, 0x52, 0xbf, 0xfc, 0x34, 0x36, 0x3f, 0xd4, 0xba, 0xe5, 0x3e, 0x64, 0x5b, 0x0a, 0xbf, 0xa4, 0xab, 0x8c, 0x3e, 0xe7, 0x1b, 0x51, 0x3f, 0xf0, 0xda, 0x01, 0xbf, 0xec, 0x4c, 0x25, 0x3f, 0x4b, 0x57, 0x90, 0x3e, +0xf7, 0xaa, 0x35, 0xbf, 0x52, 0x0e, 0x0a, 0x3f, 0x35, 0xb4, 0x61, 0x3e, 0xa1, 0x11, 0x50, 0xbf, 0xa0, 0xde, 0x44, 0x3f, 0x82, 0xc5, 0xc9, 0x3e, 0xbf, 0xd7, 0x00, 0xbf, 0x39, 0x0c, 0x3a, 0x3f, 0x17, 0x62, 0xad, 0x3e, 0x26, 0xfe, 0x18, 0xbf, 0xc8, 0x22, 0x69, 0x3f, 0x55, 0xd9, 0x07, 0x3e, 0x34, 0x4d, 0xc8, 0x3e, 0xb8, 0xe5, 0x7f, 0x3f, 0xcd, 0xc8, 0xa0, 0x3c, 0x86, 0x56, 0xa7, 0x3c, 0x35, 0x41, 0x74, 0x3f, 0xb2, 0x0e, 0xc7, 0x3c, 0xde, 0xcc, 0x98, 0x3e, 0xd7, 0x33, 0xe4, 0x3e, +0x52, 0x0b, 0x65, 0x3f, 0x9f, 0xae, 0xee, 0xbc, 0x56, 0x46, 0x77, 0x3f, 0x8c, 0x67, 0xd0, 0x3b, 0x07, 0x7e, 0x84, 0xbe, 0x7d, 0x5c, 0x23, 0x3f, 0xa6, 0xf1, 0x3f, 0x3f, 0x01, 0x2f, 0x33, 0xbe, 0x13, 0xb5, 0x74, 0x3f, 0xbf, 0x63, 0x98, 0x3d, 0x1c, 0x7c, 0x91, 0xbe, 0xa1, 0x81, 0x10, 0x3f, 0xc4, 0x0a, 0x4f, 0x3f, 0x9b, 0x1d, 0x29, 0xbe, 0xca, 0x6d, 0x3f, 0x3f, 0x61, 0x8d, 0x23, 0xbf, 0xd2, 0x1c, 0x39, 0xbe, 0x42, 0x41, 0x55, 0x3f, 0x02, 0x0e, 0x0d, 0xbf, 0x2e, 0x91, 0x4b, 0xbd, +0xf8, 0x16, 0xfe, 0x3e, 0x51, 0xbe, 0x5c, 0xbf, 0xec, 0xbf, 0xce, 0xbd, 0x74, 0x7e, 0x8a, 0x3d, 0x75, 0x94, 0x43, 0x3f, 0x35, 0x45, 0x24, 0xbf, 0xb0, 0x55, 0x02, 0x3e, 0xdb, 0x4d, 0x20, 0x3f, 0x25, 0xeb, 0x44, 0xbf, 0x63, 0xec, 0x54, 0xbe, 0x11, 0x1e, 0x59, 0x3f, 0xc7, 0x7f, 0xf9, 0xbe, 0xea, 0x08, 0x60, 0xbe, 0x0c, 0x77, 0x3a, 0x3f, 0xda, 0x38, 0x26, 0xbf, 0xee, 0x3d, 0xf4, 0x3e, 0xbc, 0xcc, 0xd0, 0x3e, 0x87, 0x4e, 0x47, 0xbf, 0xee, 0x3d, 0xf4, 0x3e, 0xbc, 0xcc, 0xd0, 0x3e, +0x87, 0x4e, 0x47, 0xbf, 0x3b, 0x3a, 0xce, 0x3d, 0x6a, 0x17, 0x7b, 0xbf, 0x90, 0xdc, 0x2a, 0xbe, 0x6e, 0x2f, 0x89, 0x3d, 0x02, 0x2a, 0x7c, 0xbf, 0x73, 0xbc, 0x22, 0xbe, 0xef, 0xfd, 0x8d, 0x3c, 0x6a, 0x2e, 0x7b, 0xbf, 0xe5, 0xf1, 0x44, 0xbe, 0x6e, 0x2f, 0x89, 0x3d, 0x02, 0x2a, 0x7c, 0xbf, 0x73, 0xbc, 0x22, 0xbe, 0xd2, 0xc8, 0xe7, 0x3d, 0xbb, 0x43, 0x7a, 0xbf, 0x88, 0xbc, 0x35, 0xbe, 0xd2, 0xc8, 0xe7, 0x3d, 0xbb, 0x43, 0x7a, 0xbf, 0x88, 0xbc, 0x35, 0xbe, 0x7a, 0x72, 0x85, 0x3e, +0x8f, 0xab, 0x15, 0x3f, 0xef, 0xad, 0x44, 0xbf, 0x41, 0x9c, 0x87, 0x3c, 0x33, 0xa2, 0x2c, 0x3f, 0x61, 0xfc, 0x3c, 0xbf, 0x7a, 0x72, 0x85, 0x3e, 0x8f, 0xab, 0x15, 0x3f, 0xef, 0xad, 0x44, 0xbf, 0x52, 0xd4, 0xd9, 0xbd, 0x7a, 0x1a, 0x40, 0x3f, 0x75, 0x01, 0x27, 0xbf, 0x17, 0x9b, 0x56, 0xbd, 0xa7, 0x06, 0x56, 0x3f, 0x57, 0xd1, 0x0b, 0xbf, 0x52, 0xd4, 0xd9, 0xbd, 0x7a, 0x1a, 0x40, 0x3f, 0x75, 0x01, 0x27, 0xbf, 0xba, 0xdb, 0x95, 0x3d, 0xd7, 0x15, 0x53, 0x3f, 0xed, 0x9f, 0x0f, 0xbf, +0xda, 0x38, 0xe2, 0xbd, 0xe7, 0xc3, 0x2f, 0x3f, 0xe4, 0xf6, 0x37, 0xbf, 0x53, 0xb0, 0x56, 0xbe, 0xc9, 0x72, 0x4e, 0x3f, 0xeb, 0x8a, 0x0d, 0xbf, 0x6d, 0xe5, 0x8d, 0xbe, 0x36, 0x93, 0x3f, 0x3f, 0xe1, 0x46, 0x1a, 0xbf, 0xb5, 0xc0, 0x1e, 0xbe, 0x86, 0x3c, 0x3e, 0x3f, 0x72, 0xa5, 0x26, 0xbf, 0x7e, 0x36, 0x82, 0xbe, 0x9e, 0x79, 0x41, 0x3f, 0x4e, 0x7b, 0x1a, 0xbf, 0x10, 0x5a, 0xb7, 0xbe, 0x86, 0x8e, 0xbd, 0x3d, 0x41, 0xd8, 0x6d, 0xbf, 0xfb, 0x78, 0x80, 0xbe, 0x89, 0x60, 0x2c, 0x3f, +0x7d, 0x08, 0x32, 0xbf, 0xfb, 0x74, 0xbc, 0xbd, 0x73, 0xbb, 0xb7, 0x3d, 0x93, 0xe0, 0x7d, 0xbf, 0xdc, 0xbb, 0xe6, 0xbd, 0xf0, 0x69, 0x1a, 0x3f, 0xd1, 0x23, 0x4a, 0xbf, 0x04, 0x56, 0x1e, 0x3e, 0xa4, 0xc3, 0xc3, 0x3e, 0x82, 0x36, 0x69, 0xbf, 0xb0, 0x55, 0x52, 0x3e, 0x6b, 0xd3, 0xd8, 0xbc, 0x1d, 0x73, 0x7a, 0xbf, 0xfb, 0xb2, 0x94, 0xbd, 0xe8, 0xbe, 0xb4, 0xbe, 0xa7, 0xcb, 0x6e, 0xbf, 0x60, 0x59, 0xa1, 0xbe, 0xdd, 0x26, 0x04, 0xbf, 0x09, 0xdf, 0x4b, 0xbf, 0xb5, 0x1b, 0x0d, 0x3e, +0xe0, 0x45, 0x77, 0xbf, 0x2b, 0x6a, 0x60, 0xbe, 0xf8, 0x36, 0x1d, 0x3e, 0x45, 0xd7, 0x5d, 0xbf, 0xb8, 0x20, 0xf3, 0xbe, 0xde, 0x90, 0x16, 0xbe, 0xd5, 0xaf, 0x5c, 0xbf, 0x7e, 0x53, 0xf8, 0xbe, 0xdb, 0x32, 0x00, 0x3e, 0x88, 0xf5, 0x76, 0xbf, 0xf8, 0x51, 0x6d, 0xbe, 0xaa, 0x98, 0x6a, 0x3e, 0x82, 0x55, 0x51, 0xbf, 0xec, 0x2f, 0x07, 0xbf, 0xa9, 0x6c, 0x08, 0x3e, 0x6b, 0x9c, 0x79, 0xbf, 0xc6, 0xdc, 0x35, 0xbe, 0xe6, 0xcd, 0x61, 0x3d, 0xf4, 0x53, 0x7c, 0xbf, 0x54, 0x56, 0x23, 0xbe, +0x6a, 0x13, 0xa7, 0x3d, 0x35, 0x7f, 0x58, 0x3f, 0xaf, 0x03, 0x07, 0xbf, 0xfe, 0x63, 0xa1, 0x3d, 0x30, 0x10, 0x60, 0x3f, 0x43, 0x55, 0xf4, 0xbe, 0xf1, 0x80, 0x12, 0xbe, 0x45, 0x2b, 0x3b, 0x3f, 0x09, 0xc5, 0x2a, 0xbf, 0xbb, 0x2b, 0x0b, 0xbe, 0xee, 0x77, 0x48, 0x3f, 0x14, 0x5d, 0x1b, 0xbf, 0xa4, 0xfa, 0x26, 0x3f, 0x56, 0x7e, 0x09, 0xbe, 0x40, 0xfa, 0x3e, 0xbf, 0xd5, 0x7b, 0x3a, 0x3f, 0xf3, 0x3b, 0xad, 0xbd, 0xfa, 0x0a, 0x2e, 0xbf, 0x95, 0xd7, 0xfa, 0x3e, 0xaf, 0x95, 0xd8, 0xbe, +0x03, 0x23, 0x43, 0xbf, 0xf4, 0x36, 0x4a, 0x3f, 0x64, 0x79, 0x17, 0x3d, 0xd5, 0xb3, 0x1c, 0xbf, 0x0e, 0xdb, 0x02, 0x3f, 0x16, 0xdb, 0x18, 0xbf, 0xee, 0x43, 0x1e, 0xbf, 0xb5, 0xa9, 0x1a, 0x3f, 0x04, 0x74, 0x0f, 0x3e, 0x3d, 0xd2, 0x48, 0xbf, 0xcb, 0xb9, 0xd4, 0x3e, 0x83, 0x8a, 0xe2, 0xbe, 0xc1, 0x73, 0x4b, 0xbf, 0xfc, 0xaa, 0x5c, 0x3d, 0x5a, 0x81, 0x6d, 0xbf, 0x66, 0x12, 0xbd, 0xbe, 0x47, 0xe4, 0x1b, 0x3e, 0xeb, 0xe5, 0x4b, 0xbf, 0x03, 0xcf, 0x15, 0xbf, 0xe4, 0xdc, 0x6a, 0x3f, +0x76, 0xdb, 0x85, 0xbc, 0x33, 0x8c, 0xcb, 0xbe, 0x97, 0x6e, 0x1a, 0x3f, 0x4d, 0xf7, 0x32, 0xbf, 0xd6, 0x8c, 0xc4, 0xbe, 0xd9, 0x7b, 0xf1, 0x3c, 0x71, 0xe3, 0x7a, 0xbf, 0xbc, 0x5b, 0x49, 0xbe, 0xf3, 0xcb, 0x40, 0x3e, 0x65, 0xfb, 0x5c, 0x3f, 0xe1, 0xd4, 0xef, 0xbe, 0xf7, 0x20, 0x3c, 0x3f, 0xf0, 0x19, 0xb9, 0x3e, 0xf3, 0xe4, 0x12, 0xbf, 0x38, 0xbb, 0x35, 0x3c, 0xab, 0xe9, 0x36, 0x3f, 0x51, 0x15, 0x33, 0xbf, 0x92, 0x23, 0x25, 0x3f, 0x26, 0x52, 0x6a, 0x3e, 0x27, 0xa3, 0x3a, 0xbf, +0xb0, 0x3d, 0x07, 0x3f, 0xfc, 0xa5, 0x05, 0x3d, 0x5d, 0x33, 0x59, 0xbf, 0xe8, 0xc1, 0xfd, 0xbd, 0x57, 0xce, 0x06, 0x3f, 0xa9, 0x4e, 0x57, 0xbf, 0xc7, 0x80, 0x0c, 0x3f, 0x2e, 0x1e, 0x2e, 0xbf, 0xfa, 0xd1, 0xf8, 0x3e, 0x8a, 0x56, 0x32, 0x3f, 0x63, 0x41, 0x09, 0xbf, 0xc3, 0x11, 0xf4, 0x3e, 0x62, 0x83, 0x35, 0x3f, 0x44, 0xdb, 0x2d, 0xbf, 0x2a, 0x70, 0x42, 0x3e, 0xdf, 0xe0, 0x6f, 0x3f, 0xa5, 0x87, 0x11, 0x3e, 0x58, 0x59, 0xa3, 0x3e, 0x10, 0x3c, 0x62, 0x3f, 0xb6, 0x2f, 0xc8, 0xbe, +0x96, 0xaf, 0x83, 0x3e, 0x5b, 0x98, 0x45, 0x3f, 0x63, 0x0d, 0x1f, 0x3f, 0x03, 0x3f, 0x0a, 0xbe, 0xb5, 0x6c, 0x4d, 0x3f, 0xf1, 0x11, 0x15, 0xbf, 0xa8, 0x8e, 0x05, 0xbe, 0x8f, 0x8d, 0xb8, 0x3e, 0x64, 0x91, 0x6e, 0x3f, 0x08, 0x05, 0x25, 0x3d, 0x29, 0xb4, 0x7c, 0x3e, 0x28, 0x0e, 0x78, 0x3f, 0xf8, 0xa6, 0x69, 0x3c, 0xc0, 0x73, 0x4f, 0x3e, 0x25, 0x75, 0x7a, 0x3f, 0xbf, 0x2c, 0x2d, 0x3d, 0x6b, 0x44, 0x98, 0x3e, 0x90, 0x6a, 0x74, 0x3f, 0x46, 0x5b, 0x15, 0x3b, 0xdf, 0x31, 0x4c, 0x3e, +0x51, 0xdb, 0x7a, 0x3f, 0x47, 0xaa, 0x6f, 0x3b, 0x65, 0x00, 0x98, 0x3e, 0x7c, 0x0e, 0x74, 0x3f, 0xa9, 0x2e, 0x60, 0xbd, 0x15, 0x38, 0x99, 0xbe, 0xa8, 0x19, 0x36, 0x3f, 0xdd, 0xce, 0x22, 0xbf, 0xe8, 0x83, 0xe5, 0xbe, 0xba, 0x13, 0x40, 0x3f, 0x04, 0xc8, 0xf8, 0xbe, 0x7d, 0x5d, 0xe6, 0xbe, 0xaf, 0x79, 0x29, 0x3f, 0x64, 0x73, 0x19, 0xbf, 0x30, 0xb8, 0x1a, 0xbf, 0x65, 0xe1, 0x33, 0x3f, 0x53, 0x42, 0xc0, 0xbe, 0x6a, 0x2e, 0x0b, 0x3f, 0x7d, 0x78, 0x56, 0xbf, 0x25, 0xaf, 0x4e, 0xbd, +0xdd, 0x24, 0xd6, 0x3e, 0xf0, 0x86, 0x68, 0xbf, 0x91, 0x5e, 0xd4, 0x3b, 0x66, 0x69, 0x03, 0x3f, 0xa1, 0x64, 0x56, 0xbf, 0x89, 0xf0, 0x3f, 0x3e, 0x79, 0x90, 0x06, 0x3f, 0xdb, 0xf8, 0x53, 0xbf, 0xdc, 0xd9, 0x47, 0x3e, 0xea, 0xe7, 0x21, 0x3f, 0x60, 0xaf, 0x30, 0xbf, 0xd4, 0x0d, 0xb4, 0x3e, 0xa4, 0x1c, 0x10, 0x3f, 0x7e, 0x37, 0x39, 0xbf, 0x9b, 0x92, 0xcc, 0x3e, 0xd5, 0xb1, 0x8a, 0x3e, 0x58, 0x58, 0x5c, 0xbf, 0x64, 0xae, 0xdc, 0xbe, 0xfd, 0xa0, 0xee, 0x3e, 0x7e, 0xc5, 0x42, 0xbf, +0xd7, 0x34, 0xe7, 0xbe, 0xa2, 0x96, 0x4e, 0x3f, 0x5a, 0x84, 0xc2, 0x3e, 0xd0, 0x7f, 0xe7, 0xbe, 0x4e, 0x2b, 0x49, 0x3f, 0xc1, 0xc7, 0xf0, 0xbe, 0xe7, 0xa6, 0xcd, 0xbe, 0x07, 0x9a, 0x9f, 0x3e, 0x70, 0xee, 0xcf, 0xbe, 0x25, 0xe8, 0x5b, 0xbf, 0xb6, 0x10, 0xa4, 0x3d, 0x9d, 0xf3, 0xf3, 0xbe, 0xff, 0x22, 0x60, 0xbf, 0x0c, 0x05, 0xfc, 0x3e, 0xb6, 0x84, 0x48, 0xbf, 0xb5, 0x6b, 0xc2, 0x3e, 0x26, 0x6f, 0x10, 0x3f, 0xba, 0x66, 0x42, 0xbf, 0x4a, 0xed, 0xa5, 0x3e, 0x7e, 0x8c, 0x1d, 0x3f, +0x69, 0x55, 0x3f, 0xbf, 0xee, 0x26, 0x80, 0x3e, 0x74, 0x3f, 0xef, 0x3e, 0x5f, 0x7c, 0x61, 0xbf, 0x73, 0x69, 0x9c, 0xbd, 0x45, 0xd8, 0xd8, 0x3e, 0x30, 0xb7, 0x67, 0xbf, 0x96, 0x7a, 0x16, 0xbd, 0xbd, 0xc6, 0xc6, 0x3e, 0x77, 0xd9, 0x6b, 0xbf, 0xfe, 0xd1, 0xb7, 0xbc, 0x8d, 0x5f, 0x24, 0xbf, 0xb2, 0x9d, 0x2b, 0x3f, 0xb1, 0x6c, 0xbe, 0xbe, 0x69, 0xfc, 0x06, 0xbf, 0x4a, 0x97, 0x22, 0x3f, 0xe1, 0x7e, 0x10, 0xbf, 0x1a, 0x6b, 0x23, 0xbf, 0xac, 0xe4, 0x2b, 0x3f, 0xea, 0xb2, 0xc0, 0xbe, +0xc4, 0x03, 0x0a, 0xbf, 0xa6, 0xf1, 0x1b, 0x3f, 0xeb, 0xe4, 0x14, 0xbf, 0x54, 0xab, 0xff, 0xbe, 0xb0, 0x57, 0x2c, 0x3f, 0x6f, 0x9d, 0x0b, 0xbf, 0xe7, 0xe3, 0x1e, 0xbf, 0x18, 0x7c, 0x2e, 0x3f, 0x8a, 0x71, 0xc6, 0xbe, 0x7a, 0x72, 0x39, 0x3f, 0xf5, 0xd9, 0x2d, 0xbf, 0xea, 0xcb, 0xf2, 0xbd, 0xf8, 0xfe, 0x4e, 0x3f, 0xa3, 0x74, 0x11, 0xbf, 0xdb, 0x87, 0x1c, 0xbe, 0x66, 0x13, 0x38, 0x3f, 0x8c, 0xbf, 0x31, 0xbf, 0xf9, 0xd7, 0xf2, 0x3c, 0x46, 0x42, 0x43, 0x3f, 0x89, 0x40, 0x25, 0xbf, +0x8e, 0x5a, 0x21, 0x3d, 0xfb, 0x3e, 0x34, 0x3f, 0x5e, 0xbd, 0x2a, 0xbf, 0x72, 0xa6, 0x79, 0x3e, 0xc4, 0x3d, 0x2e, 0x3f, 0xaf, 0x5f, 0x2c, 0xbf, 0xc3, 0xd3, 0x93, 0x3e, 0x20, 0xec, 0x2c, 0x3f, 0x6c, 0x26, 0x2b, 0xbf, 0x70, 0x44, 0x9f, 0x3e, 0xef, 0x54, 0x30, 0x3f, 0x00, 0xc5, 0x38, 0xbf, 0xd6, 0x53, 0x8b, 0x3d, 0x90, 0xbe, 0x2d, 0x3f, 0x7a, 0xde, 0x39, 0xbf, 0x1b, 0x7f, 0xe2, 0xbd, 0x0c, 0x40, 0x17, 0x3f, 0xa7, 0xcd, 0x28, 0xbf, 0x29, 0x08, 0xee, 0xbe, 0xce, 0x33, 0xa6, 0x3e, +0x1b, 0x9d, 0xab, 0xbe, 0x4c, 0x6c, 0x62, 0xbf, 0x19, 0x71, 0x2d, 0x3f, 0xab, 0xb4, 0x15, 0xbf, 0x9d, 0x67, 0xe4, 0xbe, 0x3e, 0x5b, 0xc7, 0x3e, 0x46, 0x43, 0x46, 0xbe, 0x5d, 0x87, 0x66, 0xbf, 0x66, 0xd9, 0x4f, 0x3f, 0x08, 0xaa, 0xce, 0xbe, 0xe1, 0xef, 0xd7, 0xbe, 0xe5, 0xee, 0x33, 0xbf, 0xa6, 0x97, 0x34, 0x3f, 0x5c, 0x03, 0xbb, 0xbd, 0x30, 0xf6, 0x32, 0xbf, 0x20, 0x7f, 0x31, 0x3f, 0x67, 0x0c, 0x33, 0x3e, 0x71, 0x73, 0x32, 0xbf, 0xb1, 0x32, 0x36, 0x3f, 0x1d, 0x03, 0xb2, 0xbd, +0x10, 0xea, 0x32, 0xbf, 0x3b, 0xe1, 0x31, 0x3f, 0x05, 0xa4, 0x2d, 0x3e, 0x7a, 0x34, 0x21, 0xbf, 0x44, 0xdf, 0x45, 0x3f, 0x69, 0x1b, 0x9f, 0x3d, 0x86, 0x58, 0x21, 0xbf, 0x83, 0xfb, 0x41, 0x3f, 0x7c, 0x2c, 0x2d, 0xbe, 0xe1, 0x5d, 0x2a, 0x3f, 0x69, 0xe4, 0x37, 0xbf, 0x4c, 0xa5, 0x4f, 0x3e, 0xbd, 0x36, 0x23, 0x3f, 0x3a, 0x01, 0x3d, 0xbf, 0x7d, 0x5e, 0x61, 0x3e, 0x7c, 0x80, 0x26, 0x3f, 0x20, 0xeb, 0x3d, 0xbf, 0x56, 0x0c, 0x27, 0x3e, 0x29, 0xb2, 0x1e, 0x3f, 0x0a, 0xf2, 0x47, 0xbf, +0x4f, 0x96, 0x9a, 0xbd, 0x2f, 0x34, 0x1f, 0x3f, 0x8f, 0xa7, 0x45, 0xbf, 0x57, 0x09, 0x06, 0xbe, 0x43, 0x91, 0x1e, 0x3f, 0xf6, 0x7d, 0x44, 0xbf, 0x03, 0xeb, 0x28, 0xbe, 0xa1, 0x67, 0xdb, 0xbe, 0xcf, 0xf8, 0x4e, 0x3f, 0x59, 0x88, 0xce, 0xbe, 0xbb, 0x45, 0xb0, 0xbe, 0x91, 0x28, 0x6c, 0x3f, 0xf4, 0xc1, 0x32, 0xbe, 0x3f, 0xc8, 0x56, 0x3f, 0xc5, 0xe3, 0xea, 0xbe, 0x5f, 0xd1, 0x95, 0xbe, 0x3f, 0xe6, 0x37, 0x3f, 0x72, 0xc0, 0x2e, 0xbf, 0xb4, 0x55, 0x09, 0xbe, 0xbe, 0x83, 0x57, 0x3f, +0x3f, 0xc5, 0xf9, 0xbe, 0x66, 0x68, 0x6c, 0xbe, 0x61, 0x18, 0x40, 0x3f, 0xd8, 0x2a, 0x29, 0xbf, 0xff, 0xe9, 0x86, 0xbc, 0x0c, 0xb0, 0x8f, 0xbb, 0xd4, 0x0a, 0x7b, 0xbf, 0x52, 0x80, 0x48, 0xbe, 0x1a, 0xfa, 0xe7, 0x3d, 0xc8, 0x96, 0x4d, 0xbf, 0xc2, 0xc2, 0x15, 0xbf, 0x0d, 0x70, 0x11, 0xbe, 0x83, 0x6b, 0x7a, 0xbf, 0x19, 0x1e, 0x1b, 0xbe, 0xe1, 0xd4, 0x07, 0x3d, 0x64, 0x40, 0x4a, 0xbf, 0xee, 0xb5, 0x1c, 0xbf, 0x16, 0xda, 0x91, 0x3e, 0xeb, 0xa9, 0x05, 0x3f, 0xab, 0xcb, 0x4d, 0xbf, +0x87, 0x89, 0x76, 0x3e, 0x8d, 0x9b, 0x3a, 0xbe, 0x0b, 0x0d, 0x74, 0xbf, 0xce, 0x35, 0xcc, 0x3e, 0x22, 0x17, 0x00, 0x3f, 0x5e, 0xbb, 0x44, 0xbf, 0xae, 0xf0, 0xa6, 0x3e, 0x0a, 0x86, 0x83, 0xbe, 0x57, 0xe7, 0x68, 0xbf, 0x0e, 0xbe, 0xd0, 0x3d, 0xd6, 0xe0, 0x7d, 0x3f, 0x7a, 0x35, 0xa0, 0xbd, 0x97, 0x58, 0xd9, 0x3d, 0xac, 0x1c, 0x7e, 0x3f, 0x5c, 0x02, 0x70, 0x3d, 0x5c, 0x1c, 0x25, 0x3e, 0x5f, 0xb0, 0x7b, 0x3f, 0x70, 0x24, 0xb0, 0x3d, 0xd8, 0x7f, 0x3d, 0x3e, 0xc1, 0x54, 0x7b, 0x3f, +0x63, 0x5f, 0x32, 0x3d, 0x99, 0x83, 0x50, 0x3e, 0x37, 0xe2, 0x79, 0x3f, 0x0a, 0x48, 0x9b, 0x3d, 0xb6, 0x47, 0x6f, 0xbd, 0xc4, 0x3e, 0x7d, 0xbf, 0xbc, 0x5b, 0x09, 0xbe, 0xcb, 0x9d, 0x39, 0xbe, 0x82, 0xc8, 0x7a, 0xbf, 0xf6, 0x27, 0xb1, 0xbd, 0x55, 0x65, 0x3f, 0x3e, 0x8a, 0x55, 0x7b, 0x3f, 0xe4, 0xf9, 0x0c, 0x3d, 0xba, 0xbd, 0x24, 0x3e, 0x8a, 0x8e, 0x7c, 0x3f, 0x58, 0xe3, 0xec, 0x3c, 0x7c, 0xb4, 0x28, 0xbe, 0xd2, 0x72, 0x78, 0xbf, 0x60, 0x3f, 0x34, 0xbe, 0xaf, 0x93, 0x9a, 0x3d, +0xaf, 0x0a, 0x4c, 0xbf, 0xc7, 0x64, 0x19, 0xbf, 0x9d, 0x2c, 0xa5, 0x3e, 0x40, 0xde, 0x93, 0xbe, 0xf4, 0xc1, 0x66, 0xbf, 0x80, 0xd4, 0xd6, 0x3e, 0x99, 0x28, 0xaa, 0x3e, 0x47, 0x3d, 0x58, 0xbf, 0x3f, 0x1f, 0xad, 0x3e, 0xc8, 0x0c, 0x70, 0x3f, 0x81, 0xcb, 0xa3, 0xbd, 0xa6, 0x64, 0x99, 0x3e, 0x1d, 0x05, 0x74, 0x3f, 0xae, 0x2b, 0x26, 0xbd, 0x29, 0xcc, 0x6b, 0xbe, 0x45, 0x7f, 0x78, 0xbf, 0x33, 0xe0, 0x8c, 0xbd, 0xbf, 0x29, 0x8c, 0x3e, 0xc0, 0xed, 0x75, 0x3f, 0xcb, 0xba, 0x3f, 0xbd, +0x01, 0x33, 0xb7, 0xbe, 0x90, 0x69, 0x6d, 0x3f, 0x3b, 0x8e, 0xdf, 0xbd, 0xe3, 0x89, 0x14, 0xbf, 0x7f, 0xde, 0x48, 0x3f, 0x1d, 0x91, 0x5f, 0xbe, 0x3d, 0x99, 0xbf, 0xbd, 0xaa, 0x61, 0x6f, 0x3f, 0x9e, 0x07, 0xaf, 0xbe, 0x0c, 0x8f, 0xbd, 0xbe, 0xa2, 0xeb, 0x52, 0x3f, 0x75, 0xaf, 0xdb, 0xbe, 0x72, 0x31, 0x0e, 0x3f, 0x75, 0x02, 0x52, 0xbf, 0x37, 0x51, 0x0b, 0xbe, 0x1b, 0xf4, 0x25, 0x3f, 0x88, 0x10, 0x3b, 0xbf, 0x84, 0x2c, 0x5b, 0x3e, 0x39, 0x42, 0x2a, 0x3f, 0x2a, 0x8e, 0x2b, 0xbf, +0xae, 0xb8, 0xa8, 0x3e, 0xed, 0x99, 0x35, 0xbe, 0x7c, 0xf0, 0x82, 0x3e, 0x6b, 0x49, 0x73, 0xbf, 0x60, 0xc7, 0x2f, 0xbe, 0xba, 0xa3, 0x5f, 0x3e, 0xb3, 0xec, 0x75, 0xbf, 0xdb, 0xa7, 0x73, 0x3e, 0xf3, 0xe8, 0xce, 0xbe, 0x61, 0x1a, 0x62, 0xbf, 0x52, 0xd2, 0x43, 0xbe, 0xf6, 0x40, 0x6b, 0x3e, 0xb1, 0x4b, 0x74, 0xbf, 0x11, 0xa8, 0xfe, 0xbe, 0x2e, 0xfe, 0x1e, 0x3f, 0x45, 0x10, 0x1b, 0xbf, 0x0d, 0x6d, 0x1c, 0xbf, 0x18, 0x5f, 0x30, 0x3f, 0xa2, 0x99, 0xc7, 0xbe, 0x4b, 0x1d, 0x14, 0x3f, +0xe2, 0xe7, 0x4f, 0xbf, 0x8a, 0x90, 0x9a, 0xbd, 0x4b, 0x03, 0x23, 0x3f, 0x96, 0xcb, 0x42, 0xbf, 0x6e, 0x31, 0xff, 0x3d, 0x5c, 0x21, 0x2c, 0xbe, 0x7c, 0xf3, 0xc3, 0x3e, 0xda, 0x8f, 0x68, 0xbf, 0x07, 0x5a, 0x81, 0xbc, 0xca, 0xe0, 0x98, 0x3e, 0xcb, 0x49, 0x74, 0xbf, 0xa1, 0x80, 0xb5, 0xbe, 0x46, 0x79, 0xbe, 0x3e, 0x1b, 0x9d, 0x5b, 0xbf, 0xa1, 0x80, 0xb5, 0xbe, 0x46, 0x79, 0xbe, 0x3e, 0x1b, 0x9d, 0x5b, 0xbf, 0xb7, 0xed, 0xfb, 0x3c, 0x85, 0x5d, 0x24, 0xbf, 0x76, 0x1b, 0x44, 0xbf, +0xef, 0xc9, 0x93, 0xbe, 0xf4, 0x4d, 0x66, 0x3f, 0x16, 0xc1, 0xa7, 0xbe, 0xef, 0xc9, 0x93, 0xbe, 0xf4, 0x4d, 0x66, 0x3f, 0x16, 0xc1, 0xa7, 0xbe, 0x43, 0x3b, 0x17, 0xbf, 0x23, 0x31, 0x4d, 0x3f, 0x61, 0x8b, 0xbd, 0x3d, 0x4f, 0xe8, 0x61, 0x3f, 0x54, 0xab, 0x3f, 0xbe, 0x90, 0xf5, 0xdc, 0xbe, 0x6f, 0x7e, 0x37, 0x3f, 0x53, 0xb0, 0x26, 0x3f, 0x27, 0x87, 0x7f, 0xbe, 0x2d, 0x97, 0x21, 0x3f, 0xdd, 0xb1, 0x30, 0x3f, 0x46, 0x25, 0xb5, 0xbe, 0xbb, 0x61, 0x4f, 0x3f, 0xa4, 0x8a, 0xa2, 0x3d, +0xe9, 0xb6, 0x14, 0xbf, 0x6d, 0xad, 0x5f, 0x3e, 0xf7, 0x02, 0x6b, 0x3f, 0xfb, 0x73, 0xa9, 0xbe, 0x12, 0x4d, 0x10, 0x3e, 0xdd, 0xb6, 0x7b, 0x3f, 0x21, 0x93, 0xec, 0xbd, 0x0b, 0xb5, 0x36, 0x3e, 0x20, 0xb3, 0x67, 0x3f, 0x94, 0xa2, 0xc5, 0xbe, 0x28, 0x80, 0xba, 0x3e, 0xc3, 0x2b, 0x51, 0x3f, 0xfb, 0xcd, 0xe4, 0xbe, 0x6b, 0x7d, 0x99, 0x3e, 0x5f, 0x98, 0x70, 0x3f, 0xbb, 0xd1, 0x27, 0xbe, 0x1d, 0xe4, 0xed, 0x3e, 0x47, 0x1e, 0x40, 0xbf, 0x61, 0xa7, 0xf0, 0xbe, 0x56, 0x44, 0x09, 0x3f, +0x46, 0x7b, 0x38, 0x3f, 0x6c, 0x09, 0xe1, 0xbe, 0xd5, 0x42, 0x5d, 0x3f, 0xc9, 0x00, 0x88, 0xbe, 0x6d, 0xae, 0xda, 0xbe, 0x78, 0xed, 0x02, 0xbe, 0x64, 0x24, 0x67, 0x3f, 0x6d, 0x1f, 0xd2, 0xbe, 0x61, 0x16, 0x26, 0x3f, 0xc7, 0x2c, 0x3f, 0xbf, 0xe9, 0xd4, 0x15, 0x3e, 0x67, 0xed, 0x26, 0xbf, 0x96, 0x05, 0x3f, 0x3f, 0xd8, 0x83, 0x09, 0xbe, 0x65, 0xa8, 0x6e, 0x3f, 0xdc, 0x45, 0x38, 0x3e, 0x4e, 0xb3, 0xa0, 0xbe, 0xec, 0xbb, 0x5a, 0x3f, 0x77, 0x66, 0x9a, 0x3e, 0xe8, 0x9f, 0xd8, 0xbe, +0x65, 0xa8, 0x6e, 0x3f, 0xdc, 0x45, 0x38, 0x3e, 0x4e, 0xb3, 0xa0, 0xbe, 0x85, 0x3e, 0x4c, 0x3f, 0xe9, 0x2b, 0x88, 0x3e, 0x30, 0x82, 0x0a, 0xbf, 0x88, 0x84, 0x5f, 0x3f, 0x2e, 0x59, 0x35, 0xbe, 0xd2, 0x8d, 0xe8, 0xbe, 0x88, 0x84, 0x5f, 0x3f, 0x2e, 0x59, 0x35, 0xbe, 0xd2, 0x8d, 0xe8, 0xbe, 0x93, 0xe1, 0x40, 0x3f, 0xc3, 0x62, 0x44, 0x3e, 0x19, 0x01, 0x21, 0xbf, 0xce, 0x37, 0x26, 0x3f, 0x37, 0xe3, 0x94, 0x3d, 0x9e, 0xce, 0x41, 0xbf, 0x67, 0xb3, 0x1a, 0x3f, 0xe0, 0x2d, 0x90, 0xbd, +0x0e, 0x2c, 0x4b, 0xbf, 0x30, 0xda, 0x6b, 0x3f, 0xb1, 0xa6, 0xb2, 0xba, 0x22, 0x18, 0xc7, 0xbe, 0xe3, 0x32, 0x4e, 0x3f, 0x7e, 0x35, 0xc7, 0xbd, 0xdf, 0xa8, 0x15, 0xbf, 0x30, 0xda, 0x6b, 0x3f, 0xb1, 0xa6, 0xb2, 0xba, 0x22, 0x18, 0xc7, 0xbe, 0xb9, 0xfa, 0x35, 0x3f, 0xdb, 0x30, 0x3a, 0xbe, 0xee, 0xee, 0x2d, 0xbf, 0xaa, 0x0b, 0x5c, 0x3f, 0x0f, 0x80, 0x80, 0xbe, 0x96, 0xed, 0xe3, 0xbe, 0xbc, 0x3c, 0x01, 0xbf, 0x3a, 0x3b, 0x81, 0xbe, 0x61, 0x53, 0x53, 0xbf, 0xbc, 0x3c, 0x01, 0xbf, +0x3a, 0x3b, 0x81, 0xbe, 0x61, 0x53, 0x53, 0xbf, 0x58, 0x3c, 0x35, 0xbe, 0x45, 0x99, 0x75, 0xbf, 0x00, 0x03, 0x61, 0xbe, 0x58, 0x3c, 0x35, 0xbe, 0x45, 0x99, 0x75, 0xbf, 0x00, 0x03, 0x61, 0xbe, 0x3f, 0xad, 0x56, 0x3f, 0x83, 0x4f, 0x33, 0xbd, 0xf7, 0x02, 0x0b, 0xbf, 0x56, 0x43, 0x02, 0xbf, 0xaa, 0x0d, 0x32, 0xbf, 0x09, 0xdd, 0x01, 0xbf, 0x56, 0x43, 0x02, 0xbf, 0xaa, 0x0d, 0x32, 0xbf, 0x09, 0xdd, 0x01, 0xbf, 0x8c, 0xf7, 0x57, 0x3f, 0xb8, 0x72, 0xbe, 0xbe, 0x39, 0x42, 0xc6, 0xbe, +0x8c, 0xf7, 0x57, 0x3f, 0xb8, 0x72, 0xbe, 0xbe, 0x39, 0x42, 0xc6, 0xbe, 0x30, 0xd4, 0x65, 0x3f, 0xa3, 0x3d, 0x1e, 0x3e, 0x44, 0x2f, 0xd3, 0xbe, 0x30, 0xd4, 0x65, 0x3f, 0xa3, 0x3d, 0x1e, 0x3e, 0x44, 0x2f, 0xd3, 0xbe, 0xbf, 0x10, 0x62, 0x3f, 0x75, 0x3d, 0x21, 0x3e, 0xac, 0x52, 0xe2, 0xbe, 0xbf, 0x10, 0x62, 0x3f, 0x75, 0x3d, 0x21, 0x3e, 0xac, 0x52, 0xe2, 0xbe, 0x77, 0x4a, 0x37, 0x3f, 0x4a, 0x24, 0x51, 0xbe, 0x43, 0xe6, 0x2a, 0xbf, 0x77, 0x4a, 0x37, 0x3f, 0x4a, 0x24, 0x51, 0xbe, +0x43, 0xe6, 0x2a, 0xbf, 0x51, 0x2c, 0x57, 0x3f, 0x27, 0x9f, 0x0e, 0xbe, 0xd1, 0x08, 0x06, 0xbf, 0x51, 0x2c, 0x57, 0x3f, 0x27, 0x9f, 0x0e, 0xbe, 0xd1, 0x08, 0x06, 0xbf, 0x40, 0xa0, 0x63, 0x3f, 0x6b, 0xba, 0x4e, 0x3e, 0x53, 0x40, 0xd2, 0xbe, 0x40, 0xa0, 0x63, 0x3f, 0x6b, 0xba, 0x4e, 0x3e, 0x53, 0x40, 0xd2, 0xbe, 0x20, 0x42, 0x58, 0x3f, 0x77, 0x30, 0xc2, 0x3d, 0x6f, 0xd4, 0x06, 0xbf, 0x20, 0x42, 0x58, 0x3f, 0x77, 0x30, 0xc2, 0x3d, 0x6f, 0xd4, 0x06, 0xbf, 0xf9, 0x4a, 0x04, 0x3f, +0xcd, 0xe8, 0x0b, 0xbf, 0x70, 0xb3, 0x28, 0xbf, 0xd2, 0xfd, 0x0c, 0x3e, 0x3a, 0xe8, 0x42, 0xbf, 0x01, 0x30, 0x22, 0xbf, 0x2e, 0x92, 0x96, 0xbd, 0x57, 0x0a, 0x45, 0x3f, 0x08, 0x59, 0x22, 0xbf, 0xe5, 0xb8, 0x6f, 0xbf, 0x61, 0x8b, 0x4d, 0xbe, 0xf7, 0x5b, 0x93, 0x3e, 0x20, 0x24, 0x67, 0xbf, 0xe2, 0xc9, 0xa6, 0xbe, 0x5f, 0x99, 0x8f, 0x3e, 0x6a, 0xdc, 0x5b, 0xbf, 0x23, 0x6b, 0xe5, 0xbe, 0xc6, 0x35, 0x7e, 0x3e, 0x30, 0xf0, 0x4c, 0xbf, 0x6e, 0x6a, 0x10, 0xbf, 0x7a, 0x17, 0x4f, 0x3e, +0xbd, 0xa8, 0x3d, 0xbf, 0xae, 0x4a, 0x26, 0xbf, 0xc0, 0xec, 0x2e, 0x3e, 0x4a, 0x5c, 0x77, 0xbf, 0xea, 0x92, 0x81, 0xbe, 0xc2, 0xde, 0x44, 0x3d, 0xbe, 0xf7, 0x23, 0xbf, 0x8b, 0x52, 0x3a, 0xbf, 0x4f, 0xe7, 0x7a, 0x3e, 0xd8, 0x2d, 0x5a, 0xbf, 0xd4, 0x0a, 0xe3, 0xbe, 0x23, 0x15, 0x8e, 0x3e, 0x54, 0xff, 0x48, 0xbf, 0x58, 0xae, 0x0f, 0xbf, 0xe9, 0x0a, 0x86, 0x3e, 0x81, 0x97, 0x35, 0xbf, 0x85, 0x3e, 0x28, 0xbf, 0x0c, 0x73, 0x82, 0x3e, 0x92, 0x24, 0x14, 0x3f, 0x45, 0x81, 0x42, 0xbf, +0xbd, 0xc1, 0x97, 0x3e, 0x28, 0x2c, 0xf1, 0xb8, 0x58, 0xff, 0x7f, 0xbf, 0x52, 0x5f, 0x96, 0xbb, 0x85, 0xb1, 0x05, 0xba, 0x7e, 0xfe, 0x7f, 0xbf, 0xcf, 0x2e, 0xdf, 0xbb, 0x39, 0x9b, 0x0e, 0xb8, 0xac, 0xff, 0x7f, 0xbf, 0x7c, 0xd5, 0x4a, 0xbb, 0x51, 0x49, 0x1d, 0xba, 0xde, 0xff, 0x7f, 0xbf, 0x40, 0x51, 0xd9, 0xba, 0xc0, 0x92, 0xab, 0x3a, 0xde, 0xff, 0x7f, 0xbf, 0x1c, 0xd2, 0xa8, 0x3a, 0x36, 0x76, 0x89, 0xbb, 0xa0, 0xfe, 0x7f, 0xbf, 0xa8, 0x37, 0xa3, 0xbb, 0x0e, 0x15, 0x63, 0xbb, +0x6d, 0xfe, 0x7f, 0xbf, 0x5a, 0x9b, 0xc6, 0xbb, 0x09, 0x54, 0xff, 0xba, 0x4c, 0xfe, 0x7f, 0xbf, 0x0d, 0x15, 0xe3, 0xbb, 0xe9, 0xef, 0x25, 0xba, 0x08, 0xfe, 0x7f, 0xbf, 0xef, 0xe2, 0xfd, 0xbb, 0x9c, 0x53, 0xc9, 0xb6, 0x19, 0xfe, 0x7f, 0xbf, 0xca, 0x6d, 0xfb, 0xbb, 0xd9, 0x03, 0x2d, 0xbb, 0xb0, 0xfe, 0x7f, 0xbf, 0x9f, 0xe8, 0xba, 0xbb, 0x7b, 0x69, 0x8a, 0xb8, 0xd6, 0xfd, 0x7f, 0xbf, 0xc6, 0x8b, 0x05, 0xbc, 0x4b, 0x1f, 0xba, 0xba, 0xbd, 0xff, 0x7f, 0xbf, 0x46, 0x98, 0x22, 0xbb, +0xf4, 0xe0, 0x6e, 0x3b, 0x8b, 0xff, 0x7f, 0xbf, 0x20, 0xf0, 0x40, 0x38, 0x9a, 0x07, 0x30, 0xbb, 0x69, 0xff, 0x7f, 0xbf, 0x6a, 0x17, 0x53, 0x3b, 0x0e, 0x12, 0xa2, 0x3b, 0x8b, 0xfb, 0x7f, 0xbf, 0x21, 0xc9, 0x2c, 0x3c, 0x23, 0x85, 0x32, 0x3b, 0x54, 0xfc, 0x7f, 0xbf, 0xfb, 0x75, 0x27, 0x3c, 0xef, 0xac, 0xdd, 0x3b, 0xc1, 0xfa, 0x7f, 0xbf, 0xb9, 0x1c, 0x2f, 0x3c, 0xa7, 0x91, 0x96, 0x3b, 0xc6, 0xfd, 0x7f, 0xbf, 0x24, 0x61, 0xdf, 0x3b, 0x61, 0x35, 0x96, 0x3a, 0xce, 0xff, 0x7f, 0xbf, +0x0b, 0x9a, 0x16, 0x3b, 0xde, 0x01, 0x9e, 0xbb, 0xd2, 0xfe, 0x7f, 0xbf, 0x3e, 0x25, 0x67, 0x3b, 0xa7, 0x24, 0x6b, 0xbb, 0xa4, 0xfd, 0x7f, 0xbf, 0x2b, 0xa4, 0xfc, 0x3b, 0x1a, 0x4c, 0x43, 0xbb, 0xa9, 0xf8, 0x7f, 0xbf, 0x14, 0x3d, 0x70, 0x3c, 0x29, 0xec, 0xa2, 0xba, 0x05, 0xf7, 0x7f, 0xbf, 0x05, 0x6c, 0x87, 0x3c, 0x97, 0x38, 0xf2, 0x3a, 0x9c, 0xfb, 0x7f, 0xbf, 0xfa, 0x9c, 0x3b, 0x3c, 0xb4, 0xab, 0x90, 0xbb, 0xf4, 0xfe, 0x7f, 0xbf, 0x7e, 0xc7, 0x70, 0x3b, 0xdb, 0x89, 0x92, 0x3a, +0xe8, 0xf9, 0x7f, 0xbf, 0x90, 0xbd, 0x5e, 0x3c, 0x9d, 0xd9, 0xae, 0x3a, 0xef, 0xff, 0x7f, 0xbf, 0x19, 0x3d, 0x37, 0xba, 0xd9, 0x03, 0xad, 0xb9, 0x00, 0x00, 0x80, 0xbf, 0x94, 0x17, 0x99, 0xb9, 0x60, 0x06, 0xbb, 0x3e, 0xd4, 0x45, 0x6e, 0x3f, 0x85, 0xb1, 0x85, 0x3c, 0xa7, 0x75, 0x5b, 0xbd, 0x62, 0x85, 0x7f, 0x3f, 0x6b, 0x47, 0xf1, 0x3c, 0x4a, 0x5c, 0x77, 0xbf, 0xea, 0x92, 0x81, 0xbe, 0xc2, 0xde, 0x44, 0x3d, 0xcd, 0xe9, 0x7e, 0xbf, 0xe8, 0xbb, 0x9b, 0xbd, 0x01, 0x68, 0x54, 0x3d, +0xf4, 0xc5, 0x7e, 0xbf, 0x59, 0x4f, 0xad, 0x3d, 0xef, 0xad, 0x48, 0x3d, 0xd7, 0x81, 0x7b, 0xbf, 0x75, 0xe4, 0x38, 0x3e, 0x68, 0xb2, 0x3f, 0x3d, 0xde, 0xe8, 0x73, 0xbf, 0x4a, 0x62, 0x99, 0x3e, 0x42, 0xe9, 0x4b, 0x3d, 0x65, 0x00, 0x54, 0xbf, 0xbf, 0xd1, 0x0e, 0x3f, 0xf9, 0xdb, 0x5e, 0x3d, 0x01, 0x13, 0x04, 0xbf, 0xa6, 0xee, 0x5a, 0x3f, 0x8b, 0x17, 0x4b, 0x3d, 0xa7, 0x75, 0x5b, 0xbd, 0x62, 0x85, 0x7f, 0x3f, 0x6b, 0x47, 0xf1, 0x3c, 0xf9, 0xda, 0x27, 0x3f, 0x8c, 0x11, 0x41, 0x3f, +0x00, 0x90, 0x13, 0x3d, 0x33, 0xa5, 0x35, 0x3f, 0x75, 0x90, 0x33, 0x3f, 0x57, 0x05, 0x8a, 0x3d, 0x8b, 0xff, 0x03, 0x3f, 0x00, 0xac, 0x5a, 0x3f, 0x59, 0x6e, 0x89, 0x3d, 0x0b, 0xb3, 0xb0, 0xbd, 0xe4, 0x83, 0x2a, 0x3f, 0x2e, 0xaa, 0x3d, 0x3f, 0xfc, 0x34, 0x3e, 0xbe, 0x0e, 0xd8, 0xfd, 0x3e, 0x34, 0x2d, 0x59, 0x3f, 0x48, 0xdc, 0xc3, 0xbd, 0xc8, 0x07, 0x45, 0x3f, 0x74, 0x9a, 0x21, 0x3f, 0x4d, 0x9f, 0x5d, 0xbd, 0xe6, 0x94, 0x3c, 0x3f, 0x68, 0x92, 0x2c, 0x3f, 0xc3, 0xd3, 0x4b, 0xbe, +0x64, 0x3f, 0x9b, 0xbe, 0xff, 0x90, 0x6e, 0x3f, 0x48, 0x8b, 0x83, 0xbe, 0x35, 0xd0, 0xfc, 0xbd, 0x4e, 0x61, 0x75, 0x3f, 0xfa, 0xd1, 0x90, 0xbe, 0xe6, 0x05, 0x58, 0x3c, 0xcf, 0x85, 0x75, 0x3f, 0xd0, 0x99, 0x8c, 0xbe, 0x31, 0x7e, 0x0a, 0x3e, 0x02, 0xb6, 0x73, 0x3f, 0x4a, 0xd3, 0x00, 0xbe, 0xa5, 0x15, 0xe7, 0xbe, 0x30, 0x29, 0x62, 0x3f, 0x61, 0xe2, 0x7f, 0xbe, 0x95, 0x82, 0x96, 0x3e, 0xbe, 0x2d, 0x6c, 0x3f, 0x0d, 0x50, 0x1a, 0xbd, 0x1a, 0xfd, 0x04, 0xbf, 0x9c, 0x88, 0x5a, 0x3f, +0xf4, 0x86, 0x7b, 0x3d, 0xb8, 0x22, 0x09, 0xbf, 0x2d, 0x99, 0x57, 0x3f, 0x95, 0x27, 0x20, 0x3e, 0x6d, 0xaa, 0xfe, 0xbe, 0x86, 0x72, 0x5a, 0x3f, 0xfd, 0x4c, 0x9d, 0xbd, 0xcc, 0x96, 0x50, 0x3f, 0x04, 0x1b, 0x13, 0x3f, 0x4b, 0xe9, 0x19, 0x3d, 0x49, 0xf4, 0x4e, 0x3f, 0xa2, 0x60, 0x16, 0x3f, 0x2e, 0x92, 0x96, 0xbd, 0x57, 0x0a, 0x45, 0x3f, 0x08, 0x59, 0x22, 0xbf, 0x59, 0x15, 0x61, 0xbd, 0xf5, 0x68, 0x3e, 0x3f, 0xf0, 0x88, 0x2a, 0xbf, 0x92, 0x25, 0xd3, 0xbd, 0xfd, 0x2b, 0x2b, 0x3f, +0xf9, 0x84, 0x3c, 0xbf, 0xc1, 0x37, 0x3d, 0xbe, 0xfc, 0x6f, 0xf5, 0x3e, 0xe4, 0xa1, 0x5b, 0xbf, 0x4b, 0xe6, 0x90, 0xbe, 0xb5, 0x8b, 0xe9, 0xbc, 0xf8, 0x6c, 0x75, 0xbf, 0xd2, 0xab, 0x81, 0xbe, 0xd8, 0xf2, 0xea, 0x3d, 0xfb, 0xe7, 0x75, 0xbf, 0x90, 0xbf, 0x74, 0xbe, 0xd1, 0xb1, 0xb3, 0xbe, 0x65, 0xc6, 0x67, 0xbf, 0x59, 0x50, 0x90, 0xbe, 0xe4, 0x85, 0x44, 0xbe, 0x1a, 0xa8, 0x70, 0xbf, 0xa5, 0xda, 0x27, 0xbe, 0x0f, 0xd0, 0xed, 0xbe, 0xcd, 0xca, 0x5e, 0xbf, 0x93, 0xff, 0x69, 0xbe, +0xf1, 0x0c, 0x8a, 0x3e, 0x1c, 0x7a, 0x6f, 0xbf, 0xf1, 0x67, 0x78, 0xbd, 0x04, 0xca, 0x06, 0xbf, 0x55, 0x16, 0x59, 0xbf, 0xd0, 0x99, 0x74, 0x3d, 0xff, 0x91, 0x09, 0xbf, 0x42, 0x5a, 0x57, 0xbf, 0xef, 0xe5, 0x2e, 0x3e, 0x48, 0x32, 0xfb, 0xbe, 0x9c, 0xbe, 0x5a, 0xbf, 0xfc, 0xde, 0x66, 0xbd, 0x8a, 0x21, 0x51, 0x3f, 0x24, 0xf1, 0x12, 0xbf, 0x8b, 0x8c, 0x4e, 0x3d, 0x96, 0x75, 0x53, 0x3f, 0x52, 0xb7, 0x0f, 0xbf + }; + + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Settings.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Settings.xaml new file mode 100644 index 000000000..299f3c4e2 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Settings.xaml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + This app showcases core platform building blocks which power Fluent design and can be used to create more delightful, engaging experiences. The source code to this app is available on the + + Windows App SDK Samples + repo on GitHub. + + + + + + + + + The images used in this application are sourced from a variety of Microsoft employees, but we'd like to specially thank Conroy + for his contribution. + + See more of his content here. + + + + + + + + + THIS CODE AND INFORMATION IS PROVIDED ‘AS IS’ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + + Copyright (c) Microsoft Corporation. All rights reserved. + + + + Microsoft Services Agreement, + Microsoft Privacy Statement + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Settings.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Settings.xaml.cs new file mode 100644 index 000000000..7fc401d18 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Settings.xaml.cs @@ -0,0 +1,14 @@ +using Microsoft.UI.Xaml.Controls; + + +namespace CompositionSampleGallery +{ + + public sealed partial class Settings : Page + { + public Settings() + { + this.InitializeComponent(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/AppTelemetryClient.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/AppTelemetryClient.cs new file mode 100644 index 000000000..9d82653c9 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/AppTelemetryClient.cs @@ -0,0 +1,116 @@ +// TODO: Microsoft.ApplicationInsights +//using Microsoft.ApplicationInsights; +//using Microsoft.ApplicationInsights.Extensibility; + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Windows.System.Profile; + +namespace CompositionSampleGallery +{ + internal static class AppTelemetryClient + { + // TODO: Microsoft.ApplicationInsights + // private static TelemetryClient _telemetryClient = null; + + private static string _sessionId = null; + private static string _machineId = Guid.Empty.ToString(); + private static bool _isInitialized = false; + + private struct AppInsightsEvent + { + public string Name; + public Dictionary Properties; + public Dictionary Metrics; + + public AppInsightsEvent(string eventName, Dictionary eventProperties, Dictionary eventMetrics) + { + Name = eventName; + Properties = eventProperties; + Metrics = eventMetrics; + } + }; + private static Queue _eventQueue = new Queue(); + + static AppTelemetryClient() + { + InitializeAppTelemetryClientAsync(); + } + + private static Task InitializeAppTelemetryClientAsync() + { + Task initializeClient = new Task(() => + { + // TODO: Microsoft.ApplicationInsights + // TelemetryConfiguration.Active.TelemetryChannel.EndpointAddress = "https://vortex.data.microsoft.com/collect/v1"; + // TelemetryConfiguration.Active.InstrumentationKey = "AIF-a6c90b8a-c7f9-4d3f-96f4-d5f9dbd4b4ce"; + + // _telemetryClient = new TelemetryClient(); + + _sessionId = Guid.NewGuid().ToString().ToUpperInvariant(); + + if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.System.Profile.SystemIdentification") + && Windows.Foundation.Metadata.ApiInformation.IsMethodPresent("Windows.System.Profile.SystemIdentification", "GetSystemIdForPublisher")) + { + var systemId = SystemIdentification.GetSystemIdForPublisher(); + if (systemId != null) + { + var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(systemId.Id); + + byte[] bytes = new byte[systemId.Id.Length]; + dataReader.ReadBytes(bytes); + + _machineId = BitConverter.ToString(bytes); + } + } + + _isInitialized = true; + }); + + initializeClient.Start(); + return initializeClient; + } + + public static void TrackEvent(string eventName) + { + _eventQueue.Enqueue(new AppInsightsEvent(eventName, null, null)); + } + + public static void TrackEvent(string eventName, Dictionary properties, Dictionary metrics) + { + _eventQueue.Enqueue(new AppInsightsEvent(eventName, properties, metrics)); + } + + public static void FlushEvents() + { + // TODO: Microsoft.ApplicationInsights + //if (_telemetryClient != null && _isInitialized) + //{ + // for (AppInsightsEvent queuedEvent; _eventQueue.Count > 0;) + // { + // queuedEvent = _eventQueue.Dequeue(); + + // if (queuedEvent.Properties == null) + // { + // queuedEvent.Properties = new Dictionary(StringComparer.OrdinalIgnoreCase); + // queuedEvent.Properties.Add("SessionId", _sessionId); + // queuedEvent.Properties.Add("MachineId", _machineId); + // } + // else + // { + // if (!queuedEvent.Properties.ContainsKey("SessionId")) + // queuedEvent.Properties.Add("SessionId", _sessionId); + // if (!queuedEvent.Properties.ContainsKey("MachineId")) + // queuedEvent.Properties.Add("MachineId", _machineId); + // } + + // queuedEvent.Properties.Add("EventTime", DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss.ffffzzz")); + // _telemetryClient.TrackEvent(queuedEvent.Name, queuedEvent.Properties, queuedEvent.Metrics); + + // _telemetryClient.Flush(); + // } + //} + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/BodyAppList.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/BodyAppList.xaml new file mode 100644 index 000000000..41cc88653 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/BodyAppList.xaml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/BodyAppList.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/BodyAppList.xaml.cs new file mode 100644 index 000000000..dc7a56e73 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/BodyAppList.xaml.cs @@ -0,0 +1,68 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System.Linq; + +using Microsoft.UI.Xaml.Controls; + +namespace CompositionSampleGallery +{ + public sealed partial class BodyAppList : UserControl + { + + public object ItemsSource + { + get + { + return FullSampleList.ItemsSource; + } + set + { + if (value != null) + { + FullSampleList.ItemsSource = value; + } + } + } + + public BodyAppList() + { + this.InitializeComponent(); + } + + private void FullSampleList_ItemClick(object sender, ItemClickEventArgs e) + { + MainNavigationViewModel.NavigateToSample(sender, e); + } + + public void SetHeaderText(string text) + { + HeaderItem.Content = text; + } + + public void SetNoContentTextVisibility(bool isVisible) + { + if (isVisible) + { + NoResultsTextBlock.Visibility = Microsoft.UI.Xaml.Visibility.Visible; + } + else + { + NoResultsTextBlock.Visibility = Microsoft.UI.Xaml.Visibility.Collapsed; + } + } + } +} + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamples.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamples.xaml new file mode 100644 index 000000000..0726bf6bf --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamples.xaml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamples.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamples.xaml.cs new file mode 100644 index 000000000..1ee701c5d --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamples.xaml.cs @@ -0,0 +1,86 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace CompositionSampleGallery +{ + public sealed partial class FeaturedSamples : UserControl + { + + public String Title + { + set + { + if(value != null) + { + Title1TextBlock.Text = value; + } + } + } + + public String Description + { + set + { + if (value != null) + { + DescriptionTextBlock.Text = value; + } + } + } + + public object ItemsSource + { + get + { + return NewSamplesList.ItemsSource; + } + set + { + if (value != null) + { + NewSamplesList.ItemsSource = value; + } + } + } + + + public FeaturedSamples() + { + this.InitializeComponent(); + } + + // We don't want the featured sample list to show if there aren't any samples + // to feature so we'll hide it + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + IEnumerable items = (IEnumerable < CompositionSampleGallery.SampleDefinition > )(this.ItemsSource); + + if(items.Count() == 0) + this.Visibility = Visibility.Collapsed; + } + + // Navigate up to the parent frame and trigger a navigation + private void NewSamplesList_ItemClick(object sender, ItemClickEventArgs e) + { + MainNavigationViewModel.NavigateToSample(sender, e); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamplesHomePage.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamplesHomePage.xaml new file mode 100644 index 000000000..7bac1d789 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamplesHomePage.xaml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Featured Samples + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamplesHomePage.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamplesHomePage.xaml.cs new file mode 100644 index 000000000..fa057e93d --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FeaturedSamplesHomePage.xaml.cs @@ -0,0 +1,39 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System.Collections; + +using Microsoft.UI.Xaml.Controls; + +namespace CompositionSampleGallery +{ + public sealed partial class FeaturedSampleHomePage : UserControl + { + public FeaturedSampleHomePage() + { + this.InitializeComponent(); + } + + public IEnumerable ItemsSource + { + get { return (IEnumerable)FeaturedSampleList.ItemsSource; } + set { FeaturedSampleList.ItemsSource = value; } + } + // Navigate up to the parent frame and trigger a navigation + private void FeaturedSamplesList_ItemClick(object sender, ItemClickEventArgs e) + { + MainNavigationViewModel.NavigateToSample(sender, e); + } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FlipViewIndicator.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FlipViewIndicator.xaml new file mode 100644 index 000000000..4a59a4916 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FlipViewIndicator.xaml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FlipViewIndicator.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FlipViewIndicator.xaml.cs new file mode 100644 index 000000000..6dde3e0da --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/FlipViewIndicator.xaml.cs @@ -0,0 +1,231 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Threading.Tasks; + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI; + +namespace CompositionSampleGallery +{ + public sealed partial class FlipViewIndicator : UserControl + { + private FlipViewModel _model; + private bool _ProgressFlipView = true; + public FlipViewModel Model + { + get { return _model; } + set { if (value != null) _model = value; } + } + + public FlipViewIndicator() + { + this.InitializeComponent(); + + _model = new FlipViewModel(); + + SampleDefinition brushInterop = SampleDefinitions.Definitions.Where(x => x.Type == typeof(BrushInterop)).FirstOrDefault(); + if (brushInterop != null) + { + _model.FlipViewItems.Add(new FeaturedFlipViewSample("Apply custom brushes to XAML content", "", "/Assets/BannerImages/BrushInterop.png", 0, brushInterop)); + } + this.DataContext = _model; + SampleDefinition shyHeader = SampleDefinitions.Definitions.Where(x => x.Type == typeof(ShyHeader)).FirstOrDefault(); + if (shyHeader != null) + { + _model.FlipViewItems.Add(new FeaturedFlipViewSample("Create a shrinking header tied to scroll position", "", "/Assets/BannerImages/ShyHeader.PNG", 1, shyHeader)); + } + SampleDefinition pullToAnimate = SampleDefinitions.Definitions.Where(x => x.Type == typeof(PullToAnimate)).FirstOrDefault(); + if (pullToAnimate != null) + { + _model.FlipViewItems.Add(new FeaturedFlipViewSample("Create depth of field with manipulation-based blur", "", "/Assets/BannerImages/PullToAnimateBanner.PNG", 2, pullToAnimate)); + } + this.DataContext = _model; + SampleDefinition interactions3D = SampleDefinitions.Definitions.Where(x => x.Type == typeof(Interactions3D)).FirstOrDefault(); + if (interactions3D != null) + { + _model.FlipViewItems.Add(new FeaturedFlipViewSample("Create an interactive 3D experience", "", "/Assets/BannerImages/IneractionTrackerBanner.png", 3, interactions3D)); + } + this.DataContext = _model; + + // Automatically have the FlipView progress to the next item + if (Model.FlipViewItems.Count() > 1) + { + Task t = ProgressFlipView(); + } + } + + public async Task ProgressFlipView() + { + while (_ProgressFlipView) + { + await Task.Delay(6000); + if (_ProgressFlipView) + { + BannerFlipView.SelectedIndex = (BannerFlipView.SelectedIndex + 1) % Model.FlipViewItems.Count; + } + } + } + + private void BannerFlipView_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + Model.Selected = (FeaturedFlipViewSample)((FlipView)sender).SelectedItem; + } + + // Navigate to the sample that the user selected + private void Button_Click(object sender, RoutedEventArgs e) + { + FeaturedFlipViewSample SelectedSample = BannerFlipView.SelectedItem as FeaturedFlipViewSample; + MainNavigationViewModel.NavigateToSample(SelectedSample.SampleDefinition); + } + + private void IndicatorClick(object sender, RoutedEventArgs e) + { + // find the index of the clicked item and jump the flip view to that index + FeaturedFlipViewSample clickedFeaturedSample = (sender as Button).DataContext as FeaturedFlipViewSample; + int index = Model.FlipViewItems.IndexOf(clickedFeaturedSample); + if (index >= 0 && index <= Model.FlipViewItems.Count()) + { + _ProgressFlipView = false; + BannerFlipView.SelectedIndex = index; + } + } + } + + public class FlipViewModel + { + private FeaturedFlipViewSample _selected; + private ObservableCollection _flipViewItems = new ObservableCollection(); + + public FlipViewModel() { } + + public ObservableCollection FlipViewItems + { + get + { + return _flipViewItems; + } + } + + public FeaturedFlipViewSample Selected + { + get { return _selected; } + set + { + if (value != null) + { + foreach (var item in _flipViewItems.Where(x => x.Selected)) + { + item.Selected = false; + } + + _selected = value; + _selected.Selected = true; + } + } + } + } + + public class FeaturedFlipViewSample +#if USING_CSWINRT + : System.ComponentModel.INotifyPropertyChanged +#else + : Microsoft.UI.Xaml.Data.INotifyPropertyChanged +#endif + { + private string _title; + private string _Description; + private string _navigationUrl; + private string _backgroundImage; + private int _index; + private SampleDefinition _sampleDefinition; + private bool _selected = default(bool); + +#if USING_CSWINRT + public event PropertyChangedEventHandler PropertyChanged; +#else + public event Microsoft.UI.Xaml.Data.PropertyChangedEventHandler PropertyChanged; +#endif + + public FeaturedFlipViewSample(string title, string description, string backgroundImageUrl, int index, SampleDefinition sampleDefinition = null, string navigationUrl = null) + { + _title = title; + _Description = description; + _navigationUrl = navigationUrl; + _backgroundImage = backgroundImageUrl; + _sampleDefinition = sampleDefinition; + _index = index; + } + + public string Title { get { return _title; } } + public string Description { get { return _Description; } } + public string NavigationUrl { get { return _navigationUrl; } } + public string BackgroundImage { get { return _backgroundImage; } } + public string AccessibilityIndexInfo { get { return "Skip to "+_index+"-"+_title; } } + public SampleDefinition SampleDefinition { get { return _sampleDefinition; } } + public bool Selected + { + get { return _selected; } + set + { + _selected = value; + this.OnPropertyChanged("Selected"); + } + } + + private void OnPropertyChanged(string propertyName) + { + System.ComponentModel.PropertyChangedEventHandler handler = PropertyChanged; + if (handler != null) + { + handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); + } + } + } + + + public class SelectedToSolidColorBrushValueConverter: IValueConverter + { + public object Convert(object value, Type targetType, object parameter, String language) + { + bool selected = (bool)value; + if (selected) + { + return new SolidColorBrush(Microsoft.UI.Colors.White); + } + else + { + return null; + } + } + + public object ConvertBack(object value, Type targetType, object parameter, String language) + { + if(value != null) + { + SolidColorBrush sbc = (SolidColorBrush)value; + if (sbc.Color == Microsoft.UI.Colors.White) + return true; + } + return false; + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/Footer.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/Footer.xaml new file mode 100644 index 000000000..5fac169a0 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/Footer.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/Footer.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/Footer.xaml.cs new file mode 100644 index 000000000..bc6a0bf43 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/Footer.xaml.cs @@ -0,0 +1,33 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using Microsoft.UI.Xaml.Controls; + +// The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236 + +namespace CompositionSampleGallery +{ + public sealed partial class Footer : UserControl + { + public Footer() + { + this.InitializeComponent(); + } + + private void SettingsButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + MainNavigationViewModel.ShowSettings(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/LocalDataSource.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/LocalDataSource.cs new file mode 100644 index 000000000..b23f208bb --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/LocalDataSource.cs @@ -0,0 +1,146 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CompositionSampleGallery.Shared +{ + public class Thumbnail + { + public Thumbnail() + { + + } + + public Thumbnail(string name, string url, string description) + { + Name = name; + ImageUrl = url; + Description = description; + } + + public string Name + { + get; set; + } + + public string ImageUrl + { + get; set; + } + + public string Description + { + get; set; + } + + } + + public class LocalDataSource + { + public LocalDataSource() + { + Landscapes = new ObservableCollection(); + Landscapes.Add(new Thumbnail("Rocky Mountains", PREFIX_URL_LANDSCAPE + "Landscape-1.jpg", "Landscape shot of mountains in rocky terrain")); + Landscapes.Add(new Thumbnail("Sunny Landscape", PREFIX_URL_LANDSCAPE + "Landscape-2.jpg", "Picturesque scene with the sun high in the sky")); + Landscapes.Add(new Thumbnail("Mountain Road", PREFIX_URL_LANDSCAPE + "Landscape-3.jpg", "Winding road through a mountain pass")); + Landscapes.Add(new Thumbnail("Harvest", PREFIX_URL_LANDSCAPE + "Landscape-4.jpg", "Corn stalks on a clear day")); + Landscapes.Add(new Thumbnail("Rock Formation", PREFIX_URL_LANDSCAPE + "Landscape-5.jpg", "Unique rock formation off of a mountain")); + Landscapes.Add(new Thumbnail("At Sea", PREFIX_URL_LANDSCAPE + "Landscape-6.jpg", "Sunset over the water")); + Landscapes.Add(new Thumbnail("Snowy Mountain", PREFIX_URL_LANDSCAPE + "Landscape-7.jpg", "A snowy mountain framed by pine trees")); + Landscapes.Add(new Thumbnail("Sea to Sky", PREFIX_URL_LANDSCAPE + "Landscape-8.jpg", "A lake framed by mountains and pine trees")); + Landscapes.Add(new Thumbnail("On the Beach", PREFIX_URL_LANDSCAPE + "Landscape-9.jpg", "Shot of the beach with greenery")); + Landscapes.Add(new Thumbnail("Lush Mountains", PREFIX_URL_LANDSCAPE + "Landscape-10.jpg", "Landscape shot of mountains in the forrest")); + Landscapes.Add(new Thumbnail("White Dunes", PREFIX_URL_LANDSCAPE + "Landscape-11.jpg", "White sand dunes and a clear sky")); + Landscapes.Add(new Thumbnail("Dunes with Tracks", PREFIX_URL_LANDSCAPE + "Landscape-12.jpg", "Sand dunes after driving on an ATV")); + Landscapes.Add(new Thumbnail("Shadowed Dunes", PREFIX_URL_LANDSCAPE + "Landscape-13.jpg", "Sand dunes casting a shadow")); + + Abstract = new ObservableCollection(); + Abstract.Add(new Thumbnail("Pink Bubbles", PREFIX_URL_ABSTRACT + "Abstract-1.jpg", "A macro shot of bubbles with a pink background")); + Abstract.Add(new Thumbnail("Blue Bubbles", PREFIX_URL_ABSTRACT + "Abstract-2.jpg", "A macro shot of bubbles with a blue background")); + Abstract.Add(new Thumbnail("Orange Bubbles", PREFIX_URL_ABSTRACT + "Abstract-3.jpg", "A portrait macro shot orange bubbles")); + Abstract.Add(new Thumbnail("Green Bubbles", PREFIX_URL_ABSTRACT + "Abstract-4.jpg", "A macro shot of green oil bubbles")); + Abstract.Add(new Thumbnail("Drop", PREFIX_URL_ABSTRACT + "Abstract-5.jpg", "A macro shot of a droplet of water against nature")); + Abstract.Add(new Thumbnail("Petals", PREFIX_URL_ABSTRACT + "Abstract-6.jpg", "A close up shot of flower petals")); + Abstract.Add(new Thumbnail("Up Close", PREFIX_URL_ABSTRACT + "Abstract-7.jpg", "A zoomed in shot of the center of a flower")); + + Nature = new ObservableCollection(); + Nature.Add(new Thumbnail("Cardoon", PREFIX_URL_NATURE + "Nature-1.jpg", "Close up shot of a purple cardoon")); + Nature.Add(new Thumbnail("Meadow", PREFIX_URL_NATURE + "Nature-2.jpg", "Purple flowers in a meadow")); + Nature.Add(new Thumbnail("Pink Flower", PREFIX_URL_NATURE + "Nature-3.jpg", "A close up shot of a unique pink and yellow flower")); + Nature.Add(new Thumbnail("Red Flowers", PREFIX_URL_NATURE + "Nature-4.jpg", "A close up shot of a red flower amid a flower patch")); + Nature.Add(new Thumbnail("Dahlia", PREFIX_URL_NATURE + "Nature-5.jpg", "A pink dahlia on a window sill")); + Nature.Add(new Thumbnail("Petals", PREFIX_URL_NATURE + "Nature-6.jpg", "A shot focused on the petals of a pink flower")); + Nature.Add(new Thumbnail("Cynthia", PREFIX_URL_NATURE + "Nature-7.jpg", "Cynthia butterfly landing on a flower")); + Nature.Add(new Thumbnail("Painted Lady", PREFIX_URL_NATURE + "Nature-8.jpg", "Cynthia butterfly showing its painted lady wings")); + Nature.Add(new Thumbnail("Macro Snail", PREFIX_URL_NATURE + "Nature-9.jpg", "A macro shot of a snail in the grass")); + Nature.Add(new Thumbnail("Snail", PREFIX_URL_NATURE + "Nature-10.jpg", "A curious snail raising his head to take a look around")); + Nature.Add(new Thumbnail("Mushroom", PREFIX_URL_NATURE + "Nature-11.jpg", "A small mushroom coming out for spring")); + Nature.Add(new Thumbnail("Japanese Macaques", PREFIX_URL_NATURE + "Nature-12.jpg", "Two japanese macaque monkeys take care of each other")); + Nature.Add(new Thumbnail("Bird Calls", PREFIX_URL_NATURE + "Nature-13.jpg", "A bird calls out looking for its family")); + } + + public ObservableCollection Landscapes + { + get; set; + } + + public ObservableCollection Abstract + { + get; set; + } + public ObservableCollection Nature + { + get; set; + } + + public ObservableCollection AggregateDataSources(ObservableCollection[] sources) + { + ObservableCollection items = new ObservableCollection(); + foreach(ObservableCollection list in sources) + { + foreach(Thumbnail thumbnail in list) + { + items.Add(thumbnail); + } + } + + return RandomizeDataSource(items); + } + + public static ObservableCollection RandomizeDataSource(ObservableCollection list) + { + Random rng = new Random(); + for (int i = list.Count-1; i > 0; i--) + { + int swapIndex = rng.Next(i + 1); + Thumbnail tmp = list[i]; + list[i] = list[swapIndex]; + list[swapIndex] = tmp; + } + + return list; + } + + private static readonly string PREFIX_URL_LANDSCAPE = "ms-appx:///Assets/Landscapes/"; + private static readonly string PREFIX_URL_NATURE = "ms-appx:///Assets/Nature/"; + private static readonly string PREFIX_URL_ABSTRACT = "ms-appx:///Assets/Abstract/"; + } + +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/MainNavigationViewModel.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/MainNavigationViewModel.cs new file mode 100644 index 000000000..f84a2f5e9 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/MainNavigationViewModel.cs @@ -0,0 +1,146 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Windows.UI.Core; + +namespace CompositionSampleGallery +{ + public class MainNavigationViewModel + { + private static MainNavigationViewModel s_instance; + public SampleGalleryNavViewHost _hostingUI; + private List _mainMenuList; + + // Category description text + public const string CategoryDescription_Light = + @"Light has a way of drawing our attention. It’s warm and inviting; it’s fluid and purposeful. Light creates atmosphere and a sense of place, and it’s a practical tool to illuminate information. These samples show some examples of bringing Light into your UI."; + public const string CategoryDescription_Depth = + @"Think about the frame that contains your information. Now break it apart, and reinvent how things relate to each other within a more layered, physical environment. This is how we’ll keep people in their flow – by giving them more space. These samples show a variety of techniques for bringing the concept of Depth into your UI."; + public const string CategoryDescription_Motion = + @"Think of motion design like a movie. Seamless transitions keep you focused on the story, and bring experiences to life. We can invite that feeling into our designs, leading people from one task to the next with cinematic ease. These samples show different ways in which motion can enhance your UI."; + public const string CategoryDescription_Material = + @"The things that surround us in the real world are sensory and invigorating. They bend, stretch, bounce, shatter, and glide. Those material qualities translate to digital environments, making people want to reach out and touch our designs. These samples show how to bring new Materials in your UI."; + public const string CategoryDescription_Scale = + @"The industry lives and breathes 2D design. Now’s the time to expand our toolkit for more dimensions. We’re scaling our design system to work across devices, inviting innovation across new forms. And we’re looking to you to help us imagine this new world. These samples show some building blocks for making custom UI that is tailored for different devices."; + public const string CategoryDescription_APIReference = + @"In addition to the samples that display the Fluent building blocks in UI, some simple API reference samples are provided to ramp up and learn about basic API capabilities."; + public const string CategoryDescription_Input = + @"The visual layer wouldn't be nearly as useful without allowing users to interact with it. Here are some samples to show off some of the ways in which users can interact with the visual elements on the screen"; // TODO: Update description + + + void AddNavigationItem( + List menu, + String displayName, + SampleCategory cat, + Type pageType, + string categoryDescription="", + bool addEvenIfNoMatchingSamples = false, + string thumbnail="") + { + var samples = from sample in SampleDefinitions.Definitions + where (sample.SampleCategory == cat) + select sample; + + if ((samples.Count() > 0) || addEvenIfNoMatchingSamples) + { + menu.Add(new NavigationItem(displayName, cat, pageType, categoryDescription: categoryDescription, thumbnail:thumbnail)); + } + } + + public MainNavigationViewModel(SampleGalleryNavViewHost hostingUI) + { + _hostingUI = hostingUI; + + // Build a collection used to populate the navigation menu. This is where you can define the display names of + // each menu item and which page they map to. + _mainMenuList = new List(); + AddNavigationItem(_mainMenuList, "Home", SampleCategory.None, typeof(HomePage), addEvenIfNoMatchingSamples: true, thumbnail: "ms-appx:///Assets/CategoryIcons/table_home_icon.png"); + AddNavigationItem(_mainMenuList, "Light", SampleCategory.Light, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Light, addEvenIfNoMatchingSamples: true, thumbnail: "ms-appx:///Assets/CategoryIcons/table_light_icon_bw.png"); + AddNavigationItem(_mainMenuList, "Depth", SampleCategory.Depth, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Depth, thumbnail: "ms-appx:///Assets/CategoryIcons/table_depth_icon_bw.png"); + AddNavigationItem(_mainMenuList, "Motion", SampleCategory.Motion, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Motion, thumbnail: "ms-appx:///Assets/CategoryIcons/table_motion_icon_bw.png"); + AddNavigationItem(_mainMenuList, "Material", SampleCategory.Material, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Material, thumbnail: "ms-appx:///Assets/CategoryIcons/table_material_icon_bw.png"); + AddNavigationItem(_mainMenuList, "Scale", SampleCategory.Scale, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Scale, thumbnail: "ms-appx:///Assets/CategoryIcons/table_scale_icon_bw.png"); + AddNavigationItem(_mainMenuList, "API Reference", SampleCategory.APIReference, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_APIReference, thumbnail: "ms-appx:///Assets/CategoryIcons/table_reference_icon.png"); + AddNavigationItem(_mainMenuList, "Input", SampleCategory.Input, typeof(BaseCategoryPage), categoryDescription: CategoryDescription_Input, thumbnail: "ms-appx:///Assets/CategoryIcons/Mouse.png"); + + s_instance = this; + + // Navigate to the home screen first + NavigationItem navItem = _mainMenuList.First(); + Dictionary properties = new Dictionary(StringComparer.OrdinalIgnoreCase); + properties.Add("TargetView", navItem.Category.ToString()); + CompositionSampleGallery.AppTelemetryClient.TrackEvent("Navigate", properties, null); + _hostingUI.Navigate(navItem.PageType, navItem); + } + + public List MainMenuList => _mainMenuList; + + public static void NavigateToSample(object sender, ItemClickEventArgs e) + { + NavigateToSample((SampleDefinition)e.ClickedItem); + } + + public static void NavigateToSample(SampleDefinition sample) + { + s_instance._hostingUI.Navigate(typeof(SampleHost), sample); + } + + public static void ShowSearchResults(string queryText) + { + s_instance._hostingUI.Navigate(typeof(SearchResultsPage), queryText); + } + + public static void ShowSettings() + { + s_instance._hostingUI.Navigate((typeof(Settings)), null); + } + } + + public class NavigationItem + { + private string _thumbnail; + private string _displayName; + private string _featuredSamplesTitle; + private Type _pageType; + private SampleCategory _cat; + private string _categoryDescription; + + public string DisplayName {get {return _displayName;} set { _displayName = value; }} + public Type PageType { get { return _pageType; } set { _pageType = value; } } + public SampleCategory Category { get { return _cat; } set { _cat = value; } } + public string FeaturedSamplesTitle { get { return _featuredSamplesTitle; } set { _featuredSamplesTitle = value; } } + public string CategoryDescription { get { return _categoryDescription; } } + public string ThumbnailUri { get { return _thumbnail; } } + public NavigationItem( + string displayName, + SampleCategory cat, + Type pageType, + string categoryDescription, + string thumbnail) + { + _displayName = displayName; + _pageType = pageType; + _cat = cat; + _featuredSamplesTitle = ""; + _categoryDescription = categoryDescription; + _thumbnail = thumbnail; + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SampleDefinition.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SampleDefinition.cs new file mode 100644 index 000000000..28ff3d419 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SampleDefinition.cs @@ -0,0 +1,184 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace CompositionSampleGallery +{ + + public enum SampleType + { + Reference, + EndToEnd + }; + + public enum SampleCategory + { + None, + Light, + Depth, + Motion, + Material, + Scale, + APIReference, + Input, + } + + public class SampleDefinition + { + private const string MissingThumbnailAsset = "ms-appx:///Assets/Other/MissingThumbnail.png"; + private string _name; + private Type _pageType; + private SampleType _sampleType; + private SampleCategory _sampleCategory; + private string _imageUrl; + private string _description; + private string[] _tags; + private bool _featured; + private bool _requiresFastEffects; + private bool _requiresEffects; + private DateTime _dateAdded; + + public SampleDefinition + ( + string name, + Type pageType, + SampleType sampleType, + SampleCategory sampleArea, + bool requiresEffects, + bool requiresFastEffects, + string imageUrl = MissingThumbnailAsset, + string description = null, + string[] tags = null, + bool featured = false, + DateTime dateAdded = new DateTime() + ) + { + _name = name; + _pageType = pageType; + _sampleType = sampleType; + _sampleCategory = sampleArea; + _imageUrl = imageUrl; + _description = description; // used when showing more information about a sample, such as for featured samples + _tags = tags; + _featured = featured; + _requiresEffects = requiresEffects; + _requiresFastEffects = requiresFastEffects; + _dateAdded = dateAdded; + } + + public string Name { get { return _name; } } + public Type Type { get { return _pageType; } } + public SampleType SampleType { get { return _sampleType; } } + public SampleCategory SampleCategory { get { return _sampleCategory; } } + public string DisplayName { get { return _name; } } + public string ImageUrl { get { return _imageUrl; } } + public string Description { get { return _description; } } + public string[] Tags { get { return _tags; } } + public bool Featured { get { return _featured; } } + public bool RequiresEffects { get { return _requiresEffects; } } + public bool RequiresFastEffects { get { return _requiresFastEffects; } } + public DateTime DateAdded { get { return _dateAdded; } } + } + + public class SampleDefinitions + { + static SampleDefinitions() + { + RefreshSampleList(); + } + + static public void RefreshSampleList() + { + // Populate the _definitions array only with samples that are supported by the current runtime and hardware + // + // For now always display samples even if effects are slow. In the future, we should put a banner saying that + // this sample is slow on your device, etc. + + var result = from sampleDef in _allDefinitions + where + //(!sampleDef.RequiresFastEffects || MainPage.AreEffectsFast) && + (!sampleDef.RequiresEffects || MainPage.AreEffectsSupported) + select sampleDef; + _definitions = result.ToList(); + } + + // A filtered list of runtime-supported samples + static List _definitions = new List(); + + // Full list of all definitions + static SampleDefinition[] _allDefinitions = + { + // StaticSampleName Class SampleType SampleCategory Effects FastEffects ThumbnailURL StaticSampleDescription Date Added Featured Tags + new SampleDefinition(PropertySets.StaticSampleName, typeof(PropertySets), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/ExpressionsAndPropertySets.PNG", description: PropertySets.StaticSampleDescription, tags: new string[1]{"ExpressionBuilder"}), + new SampleDefinition(PointerEnterEffects.StaticSampleName, typeof(PointerEnterEffects), SampleType.EndToEnd, SampleCategory.Material, true, false, "ms-appx:///Assets/SampleThumbnails/PointerEnterExitEffects.PNG", description: PointerEnterEffects.StaticSampleDescription, tags: new string[1]{"ExpressionBuilder"}), + new SampleDefinition(ParallaxingListItems.StaticSampleName, typeof(ParallaxingListItems), SampleType.EndToEnd, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/ParallaxingListviewItem.PNG", description: ParallaxingListItems.StaticSampleDescription), + new SampleDefinition(Z_OrderScrolling.StaticSampleName, typeof(Z_OrderScrolling), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/Z-OrderScrolling.PNG", description: Z_OrderScrolling.StaticSampleDescription, tags: new string[2]{"ExpressionBuilder", "ZOrder"}), + new SampleDefinition(BasicXamlInterop.StaticSampleName, typeof(BasicXamlInterop), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/BasicXAMLInterop.PNG", description: BasicXamlInterop.StaticSampleDescription), + new SampleDefinition(ZoomWithPerspective.StaticSampleName, typeof(ZoomWithPerspective), SampleType.EndToEnd, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/ZoomWithPerspective.PNG", description: ZoomWithPerspective.StaticSampleDescription), + new SampleDefinition(BasicLayoutAndTransforms.StaticSampleName, typeof(BasicLayoutAndTransforms), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/BasicLayoutAndTransitions.PNG", description: BasicLayoutAndTransforms.StaticSampleDescription), + new SampleDefinition(Perspective.StaticSampleName, typeof(Perspective), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/Perspective.png", description: Perspective.StaticSampleDescription), + new SampleDefinition(ColorBloomTransition.StaticSampleName, typeof(ColorBloomTransition), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/ColorBloom.jpg", description: ColorBloomTransition.StaticSampleDescription), + new SampleDefinition(ColorSlideTransition.StaticSampleName, typeof(ColorSlideTransition), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/ColorSlide.png", description: ColorSlideTransition.StaticSampleDescription), + new SampleDefinition(FlipToReveal.StaticSampleName, typeof(FlipToReveal), SampleType.EndToEnd, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/FlipToReveal.png", description: FlipToReveal.StaticSampleDescription), + new SampleDefinition(ConnectedAnimationShell.StaticSampleName, typeof(ConnectedAnimationShell), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/ContinuityAnimations.jpg", description: ConnectedAnimationShell.StaticSampleDescription, featured: true, tags: new string[1]{"ExpressionBuilder"}), + new SampleDefinition(BackDropSample.StaticSampleName, typeof(BackDropSample), SampleType.Reference, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/BackDropControlSample.PNG", description: BackDropSample.StaticSampleDescription), + new SampleDefinition(Gears.StaticSampleName, typeof(Gears), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/Gears.PNG", description: Gears.StaticSampleDescription), + new SampleDefinition(ImplicitAnimationTransformer.StaticSampleName, typeof(ImplicitAnimationTransformer), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/ImplicitAnimations.PNG", description: ImplicitAnimationTransformer.StaticSampleDescription), + //new SampleDefinition(VideoPlayground.StaticSampleName, typeof(VideoPlayground), SampleType.Reference, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/VideoPlayground.PNG", description: VideoPlayground.StaticSampleDescription, sdkVersion: RuntimeSupportedSDKs.SDKVERSION._14393), + new SampleDefinition(Photos.StaticSampleName, typeof(Photos), SampleType.EndToEnd, SampleCategory.Scale, false, false, "ms-appx:///Assets/SampleThumbnails/LayoutAnimations.PNG", description: Photos.StaticSampleDescription), + new SampleDefinition(TreeEffects.StaticSampleName, typeof(TreeEffects), SampleType.Reference, SampleCategory.Depth, true, true, "ms-appx:///Assets/SampleThumbnails/TreeEffect.PNG", description: TreeEffects.StaticSampleDescription), + new SampleDefinition(LayerVisualAnd3DTransform.StaticSampleName, typeof(LayerVisualAnd3DTransform), SampleType.EndToEnd, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/LayerVisualSample.PNG", description: LayerVisualAnd3DTransform.StaticSampleDescription), + new SampleDefinition(ForegroundFocusEffects.StaticSampleName, typeof(ForegroundFocusEffects), SampleType.EndToEnd, SampleCategory.Depth, true, true, "ms-appx:///Assets/SampleThumbnails/ForegroundFocusEffects.PNG", description: ForegroundFocusEffects.StaticSampleDescription), + new SampleDefinition(PhotoViewer.StaticSampleName, typeof(PhotoViewer), SampleType.EndToEnd, SampleCategory.Motion, true, false, "ms-appx:///Assets/SampleThumbnails/PhotoPopupViewer.PNG", description: PhotoViewer.StaticSampleDescription), + new SampleDefinition(ThumbnailLighting.StaticSampleName, typeof(ThumbnailLighting), SampleType.EndToEnd, SampleCategory.Light, true, true, "ms-appx:///Assets/SampleThumbnails/ThumbnailLighting.jpg", description: ThumbnailLighting.StaticSampleDescription), + new SampleDefinition(Curtain.StaticSampleName, typeof(Curtain), SampleType.Reference, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/Curtain.PNG", description: Curtain.StaticSampleDescription, tags: new string[1]{"ExpressionBuilder"}), + new SampleDefinition(PullToAnimate.StaticSampleName, typeof(PullToAnimate), SampleType.EndToEnd, SampleCategory.Depth, true, true, "ms-appx:///Assets/SampleThumbnails/PullToAnimate.jpg", description: PullToAnimate.StaticSampleDescription, featured: true), + new SampleDefinition(NowPlaying.StaticSampleName, typeof(NowPlaying), SampleType.EndToEnd, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/NowPlaying.PNG", description: NowPlaying.StaticSampleDescription), + new SampleDefinition(ShadowPlayground.StaticSampleName, typeof(ShadowPlayground), SampleType.Reference, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/ShadowPlayground.jpg", description: ShadowPlayground.StaticSampleDescription), + new SampleDefinition(ShadowInterop.StaticSampleName, typeof(ShadowInterop), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/ShadowInterop.PNG", description: ShadowInterop.StaticSampleDescription), + new SampleDefinition(TextShimmer.StaticSampleName, typeof(TextShimmer), SampleType.EndToEnd, SampleCategory.Light, true, true, "ms-appx:///Assets/SampleThumbnails/TextShimmer.png", description: TextShimmer.StaticSampleDescription, featured: true), + new SampleDefinition(NineGridResizing.StaticSampleName, typeof(NineGridResizing), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/NineGridResizing.PNG", description: NineGridResizing.StaticSampleDescription), + new SampleDefinition(LayerDepth.StaticSampleName, typeof(LayerDepth), SampleType.EndToEnd, SampleCategory.Depth, true, true, "ms-appx:///Assets/SampleThumbnails/LayerDepth.PNG", description: LayerDepth.StaticSampleDescription), + new SampleDefinition(LightSphere.StaticSampleName, typeof(LightSphere), SampleType.Reference, SampleCategory.Light, true, true, "ms-appx:///Assets/SampleThumbnails/LightSpheres.PNG", description: LightSphere.StaticSampleDescription), + //new SampleDefinition(SwipeScroller.StaticSampleName, typeof(SwipeScroller), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/SwipeScroller.PNG", description: SwipeScroller.StaticSampleDescription, sdkVersion: RuntimeSupportedSDKs.SDKVERSION._14393, dateAdded: new DateTime(2017,03,05), featured: true), + new SampleDefinition(ShyHeader.StaticSampleName, typeof(ShyHeader), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/ShyHeader.PNG", description: ShyHeader.StaticSampleDescription, dateAdded: new DateTime(2017,04,25), featured: true), + new SampleDefinition(BlurPlayground.StaticSampleName, typeof(BlurPlayground), SampleType.Reference, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/BlurPlayground.PNG", description: BackDropSample.StaticSampleDescription), + new SampleDefinition(Interactions3D.StaticSampleName, typeof(Interactions3D), SampleType.EndToEnd, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/Interaction3D.PNG", description: Interactions3D.StaticSampleDescription, featured: true, tags: new string[2]{"3d", "InteractionTracker"}), + new SampleDefinition(BorderPlayground.StaticSampleName, typeof(BorderPlayground), SampleType.Reference, SampleCategory.APIReference, false, true, "ms-appx:///Assets/SampleThumbnails/BorderEffects.PNG", description: BorderPlayground.StaticSampleDescription, dateAdded: new DateTime(2017,02,08)), + new SampleDefinition(CompCapabilities.StaticSampleName, typeof(CompCapabilities), SampleType.Reference, SampleCategory.Scale, false, false, "ms-appx:///Assets/SampleThumbnails/CompositionCapabilities.PNG", description: CompCapabilities.StaticSampleDescription, dateAdded: new DateTime(2017,02,08), featured: true), + //new SampleDefinition(TransparentWindow.StaticSampleName, typeof(TransparentWindow), SampleType.EndToEnd, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/TransparentWindow.PNG", description: TransparentWindow.StaticSampleDescription, sdkVersion: RuntimeSupportedSDKs.SDKVERSION._15063, dateAdded: new DateTime(2017,02,08), featured: true), + new SampleDefinition(NavigationFlow.StaticSampleName, typeof(NavigationFlow), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/NavigationFlow.PNG", description: NavigationFlow.StaticSampleDescription, dateAdded: new DateTime(2017,02,08), featured: true), + //new SampleDefinition(ShowHideImplicitWebview.StaticSampleName, typeof(ShowHideImplicitWebview), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/ShowHideImplicitWebview.PNG", description: ShowHideImplicitWebview.StaticSampleDescription, sdkVersion: RuntimeSupportedSDKs.SDKVERSION._15063, dateAdded: new DateTime(2017,02,28)), + new SampleDefinition(ShadowsAdvanced.StaticSampleName, typeof(ShadowsAdvanced), SampleType.Reference, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/AdvancedShadows.PNG", description: ShadowsAdvanced.StaticSampleDescription, featured: true), + new SampleDefinition(OffsetStompingFix.StaticSampleName, typeof(OffsetStompingFix), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/OffsetStompingFix.PNG", description: OffsetStompingFix.StaticSampleDescription, dateAdded: new DateTime(2017,04,18), featured: true), + new SampleDefinition(PointerRotate.StaticSampleName, typeof(PointerRotate), SampleType.Reference, SampleCategory.Depth, false, false, "ms-appx:///Assets/SampleThumbnails/PointerRotate.PNG", description: PointerRotate.StaticSampleDescription, dateAdded: new DateTime(2017,04,25), featured: true), + new SampleDefinition(BrushInterop.StaticSampleName, typeof(BrushInterop), SampleType.Reference, SampleCategory.APIReference, true, true, "ms-appx:///Assets/SampleThumbnails/BrushInterop.PNG", description: BrushInterop.StaticSampleDescription, dateAdded: new DateTime(2017,06,21), featured: true), + new SampleDefinition(LightInterop.StaticSampleName, typeof(LightInterop), SampleType.Reference, SampleCategory.Material, true, true, "ms-appx:///Assets/SampleThumbnails/LightInterop.PNG", description: LightInterop.StaticSampleDescription, dateAdded: new DateTime(2017,06,21), featured: true), + new SampleDefinition(PullToRefresh.StaticSampleName, typeof(PullToRefresh), SampleType.EndToEnd, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/PullToRefresh.PNG", description: PullToRefresh.StaticSampleDescription, dateAdded: new DateTime(2017,09,12)), + new SampleDefinition(SpringyImage.StaticSampleName, typeof(SpringyImage), SampleType.Reference, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/SpringyImage.PNG", description: SpringyImage.StaticSampleDescription, dateAdded: new DateTime(2017,08,7), tags: new string[1]{"ExpressionBuilder"}), + new SampleDefinition(LinearGradients.StaticSampleName, typeof(LinearGradients), SampleType.Reference, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/LinearGradients.PNG", description: LinearGradients.StaticSampleDescription, dateAdded: new DateTime(2019,02,27)), + new SampleDefinition(AnimationControl.StaticSampleName, typeof(AnimationControl), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/AnimationController.PNG", description: AnimationControl.StaticSampleDescription, dateAdded: new DateTime(2018,12,3)), + new SampleDefinition(Lottie.StaticSampleName, typeof(Lottie), SampleType.Reference, SampleCategory.Motion, false, false, "ms-appx:///Assets/SampleThumbnails/Lottie.png", description: AnimationControl.StaticSampleDescription, dateAdded: new DateTime(2020,07,29)) + //new SampleDefinition(SceneNodePlayground.StaticSampleName, typeof(SceneNodePlayground), SampleType.Reference, SampleCategory.APIReference, false, false, "ms-appx:///Assets/SampleThumbnails/SceneNodePlayground.PNG", description: SceneNodePlayground.StaticSampleDescription, dateAdded: new DateTime(2020,07,29)), + }; + + public static List Definitions + { + get { return _definitions; } + } + } +} \ No newline at end of file diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SampleHost.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SampleHost.xaml new file mode 100644 index 000000000..5deb34cf5 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SampleHost.xaml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SampleHost.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SampleHost.xaml.cs new file mode 100644 index 000000000..68321498a --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SampleHost.xaml.cs @@ -0,0 +1,59 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; + +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Documents; +using Microsoft.UI.Xaml.Navigation; + +namespace CompositionSampleGallery +{ + public sealed partial class SampleHost : Page + { + private SampleDefinition _sampleDefinition; + + public SampleDefinition SampleDefinition + { + get { return _sampleDefinition; } + set { _sampleDefinition = value; } + } + + public SampleHost() + { + this.InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + SampleDefinition definition = (SampleDefinition)e.Parameter; + SampleDefinition = definition; + ContentFrame.Navigate(definition.Type, this); + } + + public void TagHyperlink_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + var inline = ((Hyperlink)sender).Inlines[0]; + var run = (Run)inline; + var searchString = run.Text; + + if (!String.IsNullOrEmpty(searchString)) + { + MainNavigationViewModel.ShowSearchResults(searchString); + } + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SamplePage.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SamplePage.cs new file mode 100644 index 000000000..fc40d2bbc --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SamplePage.cs @@ -0,0 +1,56 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +using System; + +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Documents; +using Microsoft.UI.Xaml.Navigation; + +namespace CompositionSampleGallery +{ + public abstract class SamplePage : Page + { + public abstract string SampleDescription { get; } + public abstract string SampleName { get; } + public virtual string SampleCodeUri { get { return "https://github.com/microsoft/WindowsAppSDK-Samples/tree/main/Samples/InputAndComposition";} } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + if (e.Parameter is SampleHost host) + { + host.SampleDescription.Text = SampleDescription; + host.SampleName.Text = SampleName; + host.SampleCode.NavigateUri = new Uri(SampleCodeUri); + + // Show sample tags if any exist + if(host.SampleDefinition.Tags != null) + { + host.SampleTagsTextBlock.Visibility = Microsoft.UI.Xaml.Visibility.Visible; + host.SampleTagsTextBlock.Inlines.Add(new Run() { Text = "Tags: " }); + foreach (string t in host.SampleDefinition.Tags) + { + var hyperlink = new Hyperlink(); + hyperlink.Click += host.TagHyperlink_Click; + hyperlink.Inlines.Add(new Run() { Text = t }); + host.SampleTagsTextBlock.Inlines.Add(hyperlink); + host.SampleTagsTextBlock.Inlines.Add(new Run() { Text = " " }); + } + } + } + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SharedResourceDictionaries.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SharedResourceDictionaries.xaml new file mode 100644 index 000000000..324aba360 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SharedResourceDictionaries.xaml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SharedResourceDictionaries.xaml.cs b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SharedResourceDictionaries.xaml.cs new file mode 100644 index 000000000..c59fec422 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/SharedResourceDictionaries.xaml.cs @@ -0,0 +1,24 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* + +namespace CompositionSampleGallery +{ + public partial class SharedResourceDictionaries + { + public SharedResourceDictionaries() + { + this.InitializeComponent(); + } + } +} diff --git a/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/Social.xaml b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/Social.xaml new file mode 100644 index 000000000..4499cdbb5 --- /dev/null +++ b/Samples/Composition/SampleGallery/cs-winui/SampleGallery/Shared/Social.xaml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +